From 9834b5064981512cc5cb982f392da7df3eb18c9f Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Thu, 10 Nov 2022 21:09:38 +0100 Subject: [PATCH 01/84] Started working on our own replacement for vscode types --- .eslintrc.json | 2 +- src/actions/CommandAction.ts | 7 +- src/actions/Fold.ts | 4 +- src/actions/Paste.ts | 4 +- src/actions/Scroll.ts | 6 +- src/core/Debug.ts | 2 +- src/core/commandRunner/CommandRunner.ts | 6 +- src/ide/Position.ts | 43 +++++++++++ src/ide/Range.ts | 88 +++++++++++++++++++++++ src/ide/Selection.ts | 49 +++++++++++++ src/ide/vscode/VscodeIDE.ts | 9 +++ src/ide/vscode/VscodeTextDocument.ts | 14 ++++ src/ide/vscode/VscodeTextEditor.ts | 24 +++++++ src/ide/vscode/activeTextEditor.ts | 13 ---- src/libs/common/ide/types/Position.ts | 56 +++++++++++++++ src/libs/common/ide/types/Range.ts | 13 ++++ src/libs/common/ide/types/Selection.ts | 8 +++ src/libs/common/ide/types/TextDocument.ts | 28 ++++++++ src/libs/common/ide/types/TextEditor.ts | 21 ++++++ src/libs/common/ide/types/ide.types.ts | 14 +++- src/testUtil/TestCase.ts | 6 +- src/testUtil/TestCaseRecorder.ts | 6 +- src/util/addDecorationsToEditor.ts | 6 +- src/util/notebookLegacy.ts | 2 +- src/util/setSelectionsAndFocusEditor.ts | 2 +- 25 files changed, 391 insertions(+), 42 deletions(-) create mode 100644 src/ide/Position.ts create mode 100644 src/ide/Range.ts create mode 100644 src/ide/Selection.ts create mode 100644 src/ide/vscode/VscodeTextDocument.ts create mode 100644 src/ide/vscode/VscodeTextEditor.ts delete mode 100644 src/ide/vscode/activeTextEditor.ts create mode 100644 src/libs/common/ide/types/Position.ts create mode 100644 src/libs/common/ide/types/Range.ts create mode 100644 src/libs/common/ide/types/Selection.ts create mode 100644 src/libs/common/ide/types/TextDocument.ts create mode 100644 src/libs/common/ide/types/TextEditor.ts diff --git a/.eslintrc.json b/.eslintrc.json index 53b73aa434..0286bf80cf 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -52,7 +52,7 @@ "no-restricted-properties": [ 2, { - "property": "activeTextEditor" + "property": "activeTextEditor TODO: " } ] }, diff --git a/src/actions/CommandAction.ts b/src/actions/CommandAction.ts index 25458003fc..f41448a785 100644 --- a/src/actions/CommandAction.ts +++ b/src/actions/CommandAction.ts @@ -2,6 +2,8 @@ import { flatten } from "lodash"; import { commands } from "vscode"; import { selectionToThatTarget } from "../core/commandRunner/selectionToThatTarget"; import { callFunctionAndUpdateSelections } from "../core/updateSelections/updateSelections"; +import { getActiveTextEditor } from "../ide/vscode/activeTextEditor"; +import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { @@ -15,7 +17,6 @@ import { runOnTargetsForEachEditor, } from "../util/targetUtils"; import { Action, ActionReturnValue } from "./actions.types"; -import { getActiveTextEditor } from "../ide/vscode/activeTextEditor"; export interface CommandOptions { command?: string; @@ -120,7 +121,7 @@ export default class CommandAction implements Action { ensureSingleTarget(targets); } - const originalEditor = getActiveTextEditor(); + const originalEditor = ide().activeTextEditor; const thatTargets = await this.runCommandAndUpdateSelections( targets, @@ -131,7 +132,7 @@ export default class CommandAction implements Action { if ( actualOptions.restoreSelection && originalEditor != null && - originalEditor !== getActiveTextEditor() + originalEditor !== ide().activeTextEditor ) { // NB: We just do one editor focus at the end, instead of using // setSelectionsAndFocusEditor because the command might operate on diff --git a/src/actions/Fold.ts b/src/actions/Fold.ts index e54032606c..b4048dea34 100644 --- a/src/actions/Fold.ts +++ b/src/actions/Fold.ts @@ -1,10 +1,10 @@ import { commands } from "vscode"; +import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { focusEditor } from "../util/setSelectionsAndFocusEditor"; import { createThatMark, ensureSingleEditor } from "../util/targetUtils"; import { Action, ActionReturnValue } from "./actions.types"; -import { getActiveTextEditor } from "../ide/vscode/activeTextEditor"; class FoldAction implements Action { constructor(private command: string) { @@ -12,7 +12,7 @@ class FoldAction implements Action { } async run([targets]: [Target[], Target[]]): Promise { - const originalEditor = getActiveTextEditor(); + const originalEditor = ide().activeTextEditor; const editor = ensureSingleEditor(targets); if (originalEditor !== editor) { diff --git a/src/actions/Paste.ts b/src/actions/Paste.ts index 4fba022341..f92512c3f8 100644 --- a/src/actions/Paste.ts +++ b/src/actions/Paste.ts @@ -18,7 +18,7 @@ export class Paste { async run([targets]: [Target[]]): Promise { const targetEditor = ensureSingleEditor(targets); - const originalEditor = getActiveTextEditor(); + const originalEditor = ide().activeTextEditor; // First call editNew in order to insert delimiters if necessary and leave // the cursor in the right position. Note that this action will focus the @@ -56,7 +56,7 @@ export class Paste { setSelectionsWithoutFocusingEditor(targetEditor, updatedCursorSelections); // If necessary focus back original editor - if (originalEditor != null && originalEditor !== getActiveTextEditor()) { + if (originalEditor != null && originalEditor !== ide().activeTextEditor) { // NB: We just do one editor focus at the end, instead of using // setSelectionsAndFocusEditor because the command might operate on // multiple editors, so we just do one focus at the end. diff --git a/src/actions/Scroll.ts b/src/actions/Scroll.ts index 8eb447ec0b..8caf472099 100644 --- a/src/actions/Scroll.ts +++ b/src/actions/Scroll.ts @@ -18,11 +18,11 @@ class Scroll implements Action { return { lineNumber: getLineNumber(targets, this.at), editor }; }); - const originalEditor = getActiveTextEditor(); + const originalEditor = ide().activeTextEditor; for (const lineWithEditor of lines) { // For reveal line to the work we have to have the correct editor focused - if (lineWithEditor.editor !== getActiveTextEditor()) { + if (lineWithEditor.editor !== ide().activeTextEditor) { await focusEditor(lineWithEditor.editor); } await commands.executeCommand("revealLine", { @@ -32,7 +32,7 @@ class Scroll implements Action { } // If necessary focus back original editor - if (originalEditor != null && originalEditor !== getActiveTextEditor()) { + if (originalEditor != null && originalEditor !== ide().activeTextEditor) { await focusEditor(originalEditor); } diff --git a/src/core/Debug.ts b/src/core/Debug.ts index 4716f771ae..7d0ff0c1f2 100644 --- a/src/core/Debug.ts +++ b/src/core/Debug.ts @@ -88,7 +88,7 @@ export default class Debug { private logBranchTypes(event: TextEditorSelectionChangeEvent) { const location = new Location( - getActiveTextEditor()!.document.uri, + ide().activeTextEditor!.document.uri, event.selections[0], ); diff --git a/src/core/commandRunner/CommandRunner.ts b/src/core/commandRunner/CommandRunner.ts index 26f62ef8a1..c1898d2982 100644 --- a/src/core/commandRunner/CommandRunner.ts +++ b/src/core/commandRunner/CommandRunner.ts @@ -114,11 +114,11 @@ export default class CommandRunner { actionPrePositionStages, actionFinalStages, currentSelections: - getActiveTextEditor()?.selections.map((selection) => ({ + ide().activeTextEditor?.selections.map((selection) => ({ selection, - editor: getActiveTextEditor()!, + editor: ide().activeTextEditor!, })) ?? [], - currentEditor: getActiveTextEditor(), + currentEditor: ide().activeTextEditor, hatTokenMap: readableHatMap, thatMark: this.thatMark.exists() ? this.thatMark.get() : [], sourceMark: this.sourceMark.exists() ? this.sourceMark.get() : [], diff --git a/src/ide/Position.ts b/src/ide/Position.ts new file mode 100644 index 0000000000..9e63f9be65 --- /dev/null +++ b/src/ide/Position.ts @@ -0,0 +1,43 @@ +import IPosition from "../libs/common/ide/types/Position"; + +export default class Position implements IPosition { + public readonly line: number; + public readonly character: number; + + constructor(line: number, character: number) { + this.line = line; + this.character = character; + } + + public isEqual(other: Position): boolean { + return this.line === other.line && this.character === other.character; + } + + public isBefore(other: IPosition): boolean { + if (this.line < other.line) { + return true; + } + if (this.line > other.line) { + return false; + } + return this.character < other.character; + } + + public isAfter(other: IPosition): boolean { + if (this.line > other.line) { + return true; + } + if (this.line < other.line) { + return false; + } + return this.character > other.character; + } + + public isBeforeOrEqual(other: Position): boolean { + return this.isEqual(other) || this.isBefore(other); + } + + public isAfterOrEqual(other: Position): boolean { + return this.isEqual(other) || this.isAfter(other); + } +} diff --git a/src/ide/Range.ts b/src/ide/Range.ts new file mode 100644 index 0000000000..6eb5f945d3 --- /dev/null +++ b/src/ide/Range.ts @@ -0,0 +1,88 @@ +import type IPosition from "../libs/common/ide/types/Position"; +import type IRange from "../libs/common/ide/types/Range"; +import Position from "./Position"; + +export default class Range implements IRange { + /** + * The start position. It is before or equal to {@link Range.end end}. + */ + readonly start: IPosition; + + /** + * The end position. It is after or equal to {@link Range.start start}. + */ + readonly end: IPosition; + + /** + * Create a new range from two positions. If `start` is not + * before or equal to `end`, the values will be swapped. + * + * @param start A position. + * @param end A position. + */ + constructor(start: IPosition, end: IPosition); + + /** + * Create a new range from number coordinates. It is a shorter equivalent of + * using `new Range(new Position(startLine, startCharacter), new Position(endLine, endCharacter))` + * + * @param startLine A zero-based line value. + * @param startCharacter A zero-based character value. + * @param endLine A zero-based line value. + * @param endCharacter A zero-based character value. + */ + constructor( + startLine: number, + startCharacter: number, + endLine: number, + endCharacter: number, + ); + + constructor( + a: number | Position, + b: number | Position, + c?: number, + d?: number, + ) { + const [start, end] = _getPositionsFromRangeArguments( + // TODO: Sort this mess out + a as number, + b as number, + c!, + d!, + ); + + // Ranges are always non-reversed + if (start.isBefore(end)) { + this.start = start; + this.end = end; + } else { + this.start = end; + this.end = start; + } + } +} + +export function _getPositionsFromRangeArguments( + start: IPosition, + end: IPosition, +): [IPosition, IPosition]; + +export function _getPositionsFromRangeArguments( + startLine: number, + startCharacter: number, + endLine: number, + endCharacter: number, +): [IPosition, IPosition]; + +export function _getPositionsFromRangeArguments( + ...args: any[] +): [IPosition, IPosition] { + // Arguments are two positions + if (args.length === 2) { + return args as [IPosition, IPosition]; + } + + // Arguments are four numbers + return [new Position(args[0], args[1]), new Position(args[2], args[3])]; +} diff --git a/src/ide/Selection.ts b/src/ide/Selection.ts new file mode 100644 index 0000000000..b46c7e24a7 --- /dev/null +++ b/src/ide/Selection.ts @@ -0,0 +1,49 @@ +import type Position from "../libs/common/ide/types/Position"; +import type ISelection from "../libs/common/ide/types/Selection"; +import Range, { _getPositionsFromRangeArguments } from "./Range"; + +export default class Selection extends Range implements ISelection { + readonly isReversed: boolean; + + /** + * Create a selection from two positions. + * + * @param anchor A position. + * @param active A position. + */ + constructor(anchor: Position, active: Position); + + /** + * Create a selection from four coordinates. + * + * @param anchorLine A zero-based line value. + * @param anchorCharacter A zero-based character value. + * @param activeLine A zero-based line value. + * @param activeCharacter A zero-based character value. + */ + constructor( + anchorLine: number, + anchorCharacter: number, + activeLine: number, + activeCharacter: number, + ); + + constructor( + a: number | Position, + b: number | Position, + c?: number, + d?: number, + ) { + const [anchor, active] = _getPositionsFromRangeArguments( + // TODO: Sort this mess out + a as number, + b as number, + c!, + d!, + ); + + super(anchor, active); + + this.isReversed = active.isBefore(anchor); + } +} diff --git a/src/ide/vscode/VscodeIDE.ts b/src/ide/vscode/VscodeIDE.ts index 0768181d39..72e4af2874 100644 --- a/src/ide/vscode/VscodeIDE.ts +++ b/src/ide/vscode/VscodeIDE.ts @@ -2,6 +2,7 @@ import { pull } from "lodash"; import { ExtensionContext, ExtensionMode, + window, workspace, WorkspaceFolder, } from "vscode"; @@ -10,10 +11,12 @@ import { IDE, RunMode, } from "../../libs/common/ide/types/ide.types"; +import type TextEditor from "../../libs/common/ide/types/TextEditor"; import VscodeClipboard from "./VscodeClipboard"; import VscodeConfiguration from "./VscodeConfiguration"; import VscodeGlobalState from "./VscodeGlobalState"; import VscodeMessages from "./VscodeMessages"; +import VscodeTextEditor from "./VscodeTextEditor"; const EXTENSION_MODE_MAP: Record = { [ExtensionMode.Development]: "development", @@ -46,6 +49,12 @@ export default class VscodeIDE implements IDE { return workspace.workspaceFolders; } + get activeTextEditor(): TextEditor | undefined { + return window.activeTextEditor != null + ? new VscodeTextEditor(window.activeTextEditor) + : undefined; + } + disposeOnExit(...disposables: Disposable[]): () => void { this.extensionContext.subscriptions.push(...disposables); diff --git a/src/ide/vscode/VscodeTextDocument.ts b/src/ide/vscode/VscodeTextDocument.ts new file mode 100644 index 0000000000..6164557ff1 --- /dev/null +++ b/src/ide/vscode/VscodeTextDocument.ts @@ -0,0 +1,14 @@ +import * as vscode from "vscode"; +import { URI } from "vscode-uri"; +import Range from "../../libs/common/ide/types/Range"; +import Selection from "../../libs/common/ide/types/Selection"; +import TextDocument from "../../libs/common/ide/types/TextDocument"; + +export default class VscodeTextDocument implements TextDocument { + constructor(private editor: vscode.TextDocument) {} + + uri: URI; + languageId: string; + eol: "LF" | "CRLF"; + range: Range; +} diff --git a/src/ide/vscode/VscodeTextEditor.ts b/src/ide/vscode/VscodeTextEditor.ts new file mode 100644 index 0000000000..d9b2f5a7fe --- /dev/null +++ b/src/ide/vscode/VscodeTextEditor.ts @@ -0,0 +1,24 @@ +import * as vscode from "vscode"; +import type IRange from "../../libs/common/ide/types/Range"; +import type ISelection from "../../libs/common/ide/types/Selection"; +import type TextDocument from "../../libs/common/ide/types/TextDocument"; +import type TextEditor from "../../libs/common/ide/types/TextEditor"; +import Range from "../Range"; +import Selection from "../Selection"; +import VscodeTextDocument from "./VscodeTextDocument"; + +export default class VscodeTextEditor implements TextEditor { + readonly document: TextDocument; + + constructor(private editor: vscode.TextEditor) { + this.document = new VscodeTextDocument(editor.document); + } + + get selections(): ISelection[] { + return this.editor.selections.map((s) => new Selection(s.anchor, s.active)); + } + + get visibleRanges(): IRange[] { + return this.editor.visibleRanges.map((r) => new Range(r.start, r.end)); + } +} diff --git a/src/ide/vscode/activeTextEditor.ts b/src/ide/vscode/activeTextEditor.ts deleted file mode 100644 index 63fa2ba2b6..0000000000 --- a/src/ide/vscode/activeTextEditor.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { TextEditor, window } from "vscode"; - -/** - * Returns the active text editor; should be used rather than reading - * `vscode.window.activeTextEditor` directly. - * - * This exists for ease of overriding in Cursorless Everywhere. - * - * It will eventually be replaced by `ide`'s `Editor` abstraction. - */ -export function getActiveTextEditor(): TextEditor | undefined { - return window.activeTextEditor; // eslint-disable-line no-restricted-properties -} diff --git a/src/libs/common/ide/types/Position.ts b/src/libs/common/ide/types/Position.ts new file mode 100644 index 0000000000..a40f29dab3 --- /dev/null +++ b/src/libs/common/ide/types/Position.ts @@ -0,0 +1,56 @@ +export default interface Position { + /** + * The zero-based line value. + */ + readonly line: number; + + /** + * The zero-based character value. + */ + readonly character: number; + + /** + * Check if this position is equal to `other`. + * + * @param other A position. + * @return `true` if the line and character of the given position are equal to + * the line and character of this position. + */ + isEqual(other: Position): boolean; + + /** + * Check if this position is before `other`. + * + * @param other A position. + * @return `true` if position is on a smaller line + * or on the same line on a smaller character. + */ + isBefore(other: Position): boolean; + + /** + * Check if this position is before or equal to `other`. + * + * @param other A position. + * @return `true` if position is on a smaller line + * or on the same line on a smaller or equal character. + */ + isBeforeOrEqual(other: Position): boolean; + + /** + * Check if this position is after `other`. + * + * @param other A position. + * @return `true` if position is on a greater line + * or on the same line on a greater character. + */ + isAfter(other: Position): boolean; + + /** + * Check if this position is after or equal to `other`. + * + * @param other A position. + * @return `true` if position is on a greater line + * or on the same line on a greater or equal character. + */ + isAfterOrEqual(other: Position): boolean; +} diff --git a/src/libs/common/ide/types/Range.ts b/src/libs/common/ide/types/Range.ts new file mode 100644 index 0000000000..bcf80e7279 --- /dev/null +++ b/src/libs/common/ide/types/Range.ts @@ -0,0 +1,13 @@ +import type Position from "./Position"; + +export default interface Range { + /** + * The start position. It is before or equal to {@link Range.end end}. + */ + readonly start: Position; + + /** + * The end position. It is after or equal to {@link Range.start start}. + */ + readonly end: Position; +} diff --git a/src/libs/common/ide/types/Selection.ts b/src/libs/common/ide/types/Selection.ts new file mode 100644 index 0000000000..971b072f1b --- /dev/null +++ b/src/libs/common/ide/types/Selection.ts @@ -0,0 +1,8 @@ +import type Range from "./Range"; + +export default interface Selection extends Range { + /** + * Is true if active position is before anchor position. + */ + readonly isReversed: boolean; +} diff --git a/src/libs/common/ide/types/TextDocument.ts b/src/libs/common/ide/types/TextDocument.ts new file mode 100644 index 0000000000..652fbb2781 --- /dev/null +++ b/src/libs/common/ide/types/TextDocument.ts @@ -0,0 +1,28 @@ +import type { URI } from "vscode-uri"; +import type Range from "./Range"; + +export default interface TextDocument { + /** + * The associated uri for this document. + * + * *Note* that most documents use the `file`-scheme, which means they are files on disk. However, **not** all documents are + * saved on disk and therefore the `scheme` must be checked before trying to access the underlying file or siblings on disk. + */ + readonly uri: URI; + + /** + * The identifier of the language associated with this document. + */ + readonly languageId: string; + + /** + * The end of line sequence that is predominately + * used in this document. + */ + readonly eol: "LF" | "CRLF"; + + /** + * The range of the text document. + */ + readonly range: Range; +} diff --git a/src/libs/common/ide/types/TextEditor.ts b/src/libs/common/ide/types/TextEditor.ts new file mode 100644 index 0000000000..3f03b22fb0 --- /dev/null +++ b/src/libs/common/ide/types/TextEditor.ts @@ -0,0 +1,21 @@ +import Range from "./Range"; +import Selection from "./Selection"; +import TextDocument from "./TextDocument"; + +export default interface TextEditor { + /** + * The document associated with this text editor. The document will be the same for the entire lifetime of this text editor. + */ + readonly document: TextDocument; + + /** + * The selections in this text editor. The primary selection is always at index 0. + */ + selections: Selection[]; + + /** + * The current visible ranges in the editor (vertically). + * This accounts only for vertical scrolling, and not for horizontal scrolling. + */ + readonly visibleRanges: Range[]; +} diff --git a/src/libs/common/ide/types/ide.types.ts b/src/libs/common/ide/types/ide.types.ts index 3ad5d0f2a1..be7c6ca1aa 100644 --- a/src/libs/common/ide/types/ide.types.ts +++ b/src/libs/common/ide/types/ide.types.ts @@ -3,6 +3,7 @@ import { Clipboard } from "./Clipboard"; import { Configuration } from "./Configuration"; import { Messages } from "./Messages"; import { State } from "./State"; +import type TextEditor from "./TextEditor"; export type RunMode = "production" | "development" | "test"; @@ -24,17 +25,24 @@ export interface IDE { * The root directory of this shipped code. Can be used to access bundled * assets. */ - assetsRoot: string; + readonly assetsRoot: string; /** * Whether we are running in development, test, or production */ - runMode: RunMode; + readonly runMode: RunMode; /** * A list of workspace folders for the currently active workspace */ - workspaceFolders: readonly WorkspaceFolder[] | undefined; + readonly workspaceFolders: readonly WorkspaceFolder[] | undefined; + + /** + * The currently active editor or `undefined`. The active editor is the one + * that currently has focus or, when none has focus, the one that has changed + * input most recently. + */ + readonly activeTextEditor: TextEditor | undefined; } export interface WorkspaceFolder { diff --git a/src/testUtil/TestCase.ts b/src/testUtil/TestCase.ts index feca3cba70..9190b9d093 100644 --- a/src/testUtil/TestCase.ts +++ b/src/testUtil/TestCase.ts @@ -63,7 +63,7 @@ export class TestCase { private captureFinalThatMark: boolean, private extraSnapshotFields?: ExtraSnapshotField[], ) { - const activeEditor = getActiveTextEditor()!; + const activeEditor = ide().activeTextEditor!; this.command = cleanUpTestCaseCommand(command); const { targets } = context; @@ -178,7 +178,7 @@ export class TestCase { this.context.sourceMark, excludeFields, this.extraSnapshotFields, - getActiveTextEditor()!, + ide().activeTextEditor!, ide(), this.getMarks(), { startTimestamp: this.startTimestamp }, @@ -193,7 +193,7 @@ export class TestCase { this.context.sourceMark, excludeFields, this.extraSnapshotFields, - getActiveTextEditor()!, + ide().activeTextEditor!, ide(), this.isHatTokenMapTest ? this.getMarks() : undefined, { startTimestamp: this.startTimestamp }, diff --git a/src/testUtil/TestCaseRecorder.ts b/src/testUtil/TestCaseRecorder.ts index 323d6b65e0..4777e85b2c 100644 --- a/src/testUtil/TestCaseRecorder.ts +++ b/src/testUtil/TestCaseRecorder.ts @@ -186,7 +186,7 @@ export class TestCaseRecorder { undefined, ["clipboard"], this.active ? this.extraSnapshotFields : undefined, - getActiveTextEditor()!, + ide().activeTextEditor!, ide(), marks, this.active ? { startTimestamp: this.startTimestamp } : undefined, @@ -336,7 +336,7 @@ export class TestCaseRecorder { await this.testCase.recordInitialState(); - const editor = getActiveTextEditor()!; + const editor = ide().activeTextEditor!; // NB: We need to copy the editor options rather than storing a reference // because its properties are lazy this.originalTextEditorOptions = { ...editor.options }; @@ -469,7 +469,7 @@ export class TestCaseRecorder { this.spyIde = undefined; this.originalIde = undefined; - const editor = getActiveTextEditor()!; + const editor = ide().activeTextEditor!; editor.options = this.originalTextEditorOptions; } diff --git a/src/util/addDecorationsToEditor.ts b/src/util/addDecorationsToEditor.ts index a536ee2b9b..d954ccddc7 100644 --- a/src/util/addDecorationsToEditor.ts +++ b/src/util/addDecorationsToEditor.ts @@ -20,13 +20,13 @@ export function addDecorationsToEditors( let editors: readonly vscode.TextEditor[]; - if (getActiveTextEditor() == null) { + if (ide().activeTextEditor == null) { editors = vscode.window.visibleTextEditors; } else { editors = [ - getActiveTextEditor()!, + ide().activeTextEditor!, ...vscode.window.visibleTextEditors.filter( - (editor) => editor !== getActiveTextEditor(), + (editor) => editor !== ide().activeTextEditor, ), ]; } diff --git a/src/util/notebookLegacy.ts b/src/util/notebookLegacy.ts index bc7e8f02ba..84a9c64d74 100644 --- a/src/util/notebookLegacy.ts +++ b/src/util/notebookLegacy.ts @@ -16,7 +16,7 @@ export function isVscodeLegacyNotebookVersion() { } export async function focusNotebookCellLegacy(editor: TextEditor) { - const activeTextEditor = getActiveTextEditor(); + const activeTextEditor = ide().activeTextEditor; if (activeTextEditor == null) { return; diff --git a/src/util/setSelectionsAndFocusEditor.ts b/src/util/setSelectionsAndFocusEditor.ts index 34cb15f2d2..0f46aa4e97 100644 --- a/src/util/setSelectionsAndFocusEditor.ts +++ b/src/util/setSelectionsAndFocusEditor.ts @@ -118,7 +118,7 @@ async function focusNotebookCell(editor: TextEditor) { // Issue a command to tell VSCode to focus the cell input editor // NB: We don't issue the command if it's already focused, because it turns // out that this command is actually a toggle, so that causes it to de-focus! - if (getActiveTextEditor() !== editor) { + if (ide().activeTextEditor !== editor) { await commands.executeCommand("notebook.cell.edit"); } } From 516b47c714d5303b285727fd59db67b043ad8e08 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Thu, 10 Nov 2022 21:14:20 +0100 Subject: [PATCH 02/84] remove unused imports --- src/actions/CommandAction.ts | 1 - src/actions/Paste.ts | 2 +- src/actions/Scroll.ts | 2 +- src/core/Debug.ts | 1 - src/core/commandRunner/CommandRunner.ts | 7 +++---- src/testUtil/TestCase.ts | 11 +++++------ src/testUtil/TestCaseRecorder.ts | 7 +++---- src/util/addDecorationsToEditor.ts | 2 +- src/util/notebookLegacy.ts | 4 ++-- src/util/setSelectionsAndFocusEditor.ts | 3 +-- 10 files changed, 17 insertions(+), 23 deletions(-) diff --git a/src/actions/CommandAction.ts b/src/actions/CommandAction.ts index f41448a785..73acfac86d 100644 --- a/src/actions/CommandAction.ts +++ b/src/actions/CommandAction.ts @@ -2,7 +2,6 @@ import { flatten } from "lodash"; import { commands } from "vscode"; import { selectionToThatTarget } from "../core/commandRunner/selectionToThatTarget"; import { callFunctionAndUpdateSelections } from "../core/updateSelections/updateSelections"; -import { getActiveTextEditor } from "../ide/vscode/activeTextEditor"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; diff --git a/src/actions/Paste.ts b/src/actions/Paste.ts index f92512c3f8..0af21a5a6d 100644 --- a/src/actions/Paste.ts +++ b/src/actions/Paste.ts @@ -3,6 +3,7 @@ import { callFunctionAndUpdateSelections, callFunctionAndUpdateSelectionsWithBehavior, } from "../core/updateSelections/updateSelections"; +import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { @@ -11,7 +12,6 @@ import { } from "../util/setSelectionsAndFocusEditor"; import { ensureSingleEditor } from "../util/targetUtils"; import { ActionReturnValue } from "./actions.types"; -import { getActiveTextEditor } from "../ide/vscode/activeTextEditor"; export class Paste { constructor(private graph: Graph) {} diff --git a/src/actions/Scroll.ts b/src/actions/Scroll.ts index 8caf472099..9f8117449e 100644 --- a/src/actions/Scroll.ts +++ b/src/actions/Scroll.ts @@ -1,10 +1,10 @@ import { commands } from "vscode"; +import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { groupBy } from "../util/itertools"; import { focusEditor } from "../util/setSelectionsAndFocusEditor"; import { Action, ActionReturnValue } from "./actions.types"; -import { getActiveTextEditor } from "../ide/vscode/activeTextEditor"; class Scroll implements Action { constructor(private graph: Graph, private at: string) { diff --git a/src/core/Debug.ts b/src/core/Debug.ts index 7d0ff0c1f2..36418cb8ac 100644 --- a/src/core/Debug.ts +++ b/src/core/Debug.ts @@ -8,7 +8,6 @@ import { import { SyntaxNode, TreeCursor } from "web-tree-sitter"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Graph } from "../typings/Types"; -import { getActiveTextEditor } from "../ide/vscode/activeTextEditor"; export default class Debug { private disposableConfiguration?: Disposable; diff --git a/src/core/commandRunner/CommandRunner.ts b/src/core/commandRunner/CommandRunner.ts index c1898d2982..5f81c1316b 100644 --- a/src/core/commandRunner/CommandRunner.ts +++ b/src/core/commandRunner/CommandRunner.ts @@ -1,21 +1,20 @@ import * as vscode from "vscode"; import { ActionType } from "../../actions/actions.types"; -import { CURSORLESS_COMMAND_ID } from "../../libs/common/commandIds"; import { OutdatedExtensionError } from "../../errors"; +import { CURSORLESS_COMMAND_ID } from "../../libs/common/commandIds"; import ide from "../../libs/cursorless-engine/singletons/ide.singleton"; -import { getActiveTextEditor } from "../../ide/vscode/activeTextEditor"; import processTargets from "../../processTargets"; import isTesting from "../../testUtil/isTesting"; import { Target } from "../../typings/target.types"; import { Graph, ProcessedTargetsContext, - SelectionWithEditor, + SelectionWithEditor } from "../../typings/Types"; import { isString } from "../../util/type"; import { canonicalizeAndValidateCommand, - checkForOldInference, + checkForOldInference } from "../commandVersionUpgrades/canonicalizeAndValidateCommand"; import { PartialTargetV0V1 } from "../commandVersionUpgrades/upgradeV1ToV2/commandV1.types"; import inferFullTargets from "../inferFullTargets"; diff --git a/src/testUtil/TestCase.ts b/src/testUtil/TestCase.ts index 9190b9d093..fdff4d0ef9 100644 --- a/src/testUtil/TestCase.ts +++ b/src/testUtil/TestCase.ts @@ -4,14 +4,12 @@ import { TestDecoration } from "../core/editStyles"; import { ReadOnlyHatMap } from "../core/IndividualHatMap"; import { ThatMark } from "../core/ThatMark"; import SpyIDE, { SpyIDERecordedValues } from "../libs/common/ide/spy/SpyIDE"; -import { TargetDescriptor } from "../typings/targetDescriptor.types"; -import { Token } from "../typings/Types"; -import { cleanUpTestCaseCommand } from "./cleanUpTestCaseCommand"; import { extractTargetedMarks, extractTargetKeys, } from "../libs/common/testUtil/extractTargetedMarks"; import serialize from "../libs/common/testUtil/serialize"; +import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { ExtraSnapshotField, takeSnapshot, @@ -22,14 +20,15 @@ import { SerializedMarks, testDecorationsToPlainObject, } from "../libs/vscode-common/toPlainObject"; -import { getActiveTextEditor } from "../ide/vscode/activeTextEditor"; +import { TargetDescriptor } from "../typings/targetDescriptor.types"; +import { Token } from "../typings/Types"; +import { cleanUpTestCaseCommand } from "./cleanUpTestCaseCommand"; import type { PlainTestDecoration, - ThrownError, TestCaseCommand, TestCaseFixture, + ThrownError, } from "./TestCaseFixture"; -import ide from "../libs/cursorless-engine/singletons/ide.singleton"; export type TestCaseContext = { thatMark: ThatMark; diff --git a/src/testUtil/TestCaseRecorder.ts b/src/testUtil/TestCaseRecorder.ts index 4777e85b2c..79e5b1bad9 100644 --- a/src/testUtil/TestCaseRecorder.ts +++ b/src/testUtil/TestCaseRecorder.ts @@ -1,20 +1,19 @@ +import { getKey } from "@cursorless/common"; import * as fs from "fs"; import { readFile } from "fs/promises"; import { invariant } from "immutability-helper"; import { merge } from "lodash"; import * as path from "path"; import * as vscode from "vscode"; -import { getActiveTextEditor } from "../ide/vscode/activeTextEditor"; +import SpyIDE from "../libs/common/ide/spy/SpyIDE"; +import { IDE } from "../libs/common/ide/types/ide.types"; import { extractTargetedMarks } from "../libs/common/testUtil/extractTargetedMarks"; import serialize from "../libs/common/testUtil/serialize"; -import SpyIDE from "../libs/common/ide/spy/SpyIDE"; import sleep from "../libs/common/util/sleep"; -import { getKey } from "@cursorless/common"; import { walkDirsSync } from "../libs/common/util/walkSync"; import ide, { injectIde, } from "../libs/cursorless-engine/singletons/ide.singleton"; -import { IDE } from "../libs/common/ide/types/ide.types"; import { ExtraSnapshotField, takeSnapshot, diff --git a/src/util/addDecorationsToEditor.ts b/src/util/addDecorationsToEditor.ts index d954ccddc7..e0e99696bc 100644 --- a/src/util/addDecorationsToEditor.ts +++ b/src/util/addDecorationsToEditor.ts @@ -3,13 +3,13 @@ import * as vscode from "vscode"; import Decorations from "../core/Decorations"; import { HatStyleName } from "../core/hatStyles"; import { IndividualHatMap } from "../core/IndividualHatMap"; +import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { TokenGraphemeSplitter } from "../libs/cursorless-engine/tokenGraphemeSplitter"; import { getMatcher } from "../libs/cursorless-engine/tokenizer"; import { Token } from "../typings/Types"; import { getDisplayLineMap } from "./getDisplayLineMap"; import { getTokenComparator } from "./getTokenComparator"; import { getTokensInRange } from "./getTokensInRange"; -import { getActiveTextEditor } from "../ide/vscode/activeTextEditor"; export function addDecorationsToEditors( hatTokenMap: IndividualHatMap, diff --git a/src/util/notebookLegacy.ts b/src/util/notebookLegacy.ts index 84a9c64d74..8d97ab5559 100644 --- a/src/util/notebookLegacy.ts +++ b/src/util/notebookLegacy.ts @@ -7,9 +7,9 @@ import { TextEditor, version, } from "vscode"; -import { getNotebookFromCellDocument } from "./notebook"; +import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { getCellIndex } from "../libs/vscode-common/notebook"; -import { getActiveTextEditor } from "../ide/vscode/activeTextEditor"; +import { getNotebookFromCellDocument } from "./notebook"; export function isVscodeLegacyNotebookVersion() { return semver.lt(version, "1.68.0"); diff --git a/src/util/setSelectionsAndFocusEditor.ts b/src/util/setSelectionsAndFocusEditor.ts index 0f46aa4e97..02b23fa02a 100644 --- a/src/util/setSelectionsAndFocusEditor.ts +++ b/src/util/setSelectionsAndFocusEditor.ts @@ -8,14 +8,13 @@ import { ViewColumn, window, } from "vscode"; -import { getNotebookFromCellDocument } from "./notebook"; import { getCellIndex } from "../libs/vscode-common/notebook"; +import { getNotebookFromCellDocument } from "./notebook"; import { focusNotebookCellLegacy, isVscodeLegacyNotebookVersion, } from "./notebookLegacy"; import uniqDeep from "./uniqDeep"; -import { getActiveTextEditor } from "../ide/vscode/activeTextEditor"; const columnFocusCommands = { [ViewColumn.One]: "workbench.action.focusFirstEditorGroup", From 313ac8c28ed721467375a3d3e002c328e00e9f1a Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Fri, 11 Nov 2022 10:51:41 +0100 Subject: [PATCH 03/84] More workl --- src/ide/Position.ts | 43 - src/ide/Range.ts | 88 - src/ide/Selection.ts | 49 - src/ide/vscode/VscodeTextDocument.ts | 48 +- src/ide/vscode/VscodeTextEditor.ts | 15 +- src/ide/vscode/VscodeUtil.ts | 48 + src/libs/common/ide/Location.ts | 33 + src/libs/common/ide/{types => }/Position.ts | 59 +- src/libs/common/ide/Range.ts | 71 + src/libs/common/ide/Selection.ts | 75 + src/libs/common/ide/types/Range.ts | 13 - src/libs/common/ide/types/Selection.ts | 8 - src/libs/common/ide/types/TextDocument.ts | 59 +- src/libs/common/ide/types/TextLine.ts | 41 + src/typings/Types.ts | 36 +- yarn.lock | 3709 ++++++++++--------- 16 files changed, 2293 insertions(+), 2102 deletions(-) delete mode 100644 src/ide/Position.ts delete mode 100644 src/ide/Range.ts delete mode 100644 src/ide/Selection.ts create mode 100644 src/ide/vscode/VscodeUtil.ts create mode 100644 src/libs/common/ide/Location.ts rename src/libs/common/ide/{types => }/Position.ts (51%) create mode 100644 src/libs/common/ide/Range.ts create mode 100644 src/libs/common/ide/Selection.ts delete mode 100644 src/libs/common/ide/types/Range.ts delete mode 100644 src/libs/common/ide/types/Selection.ts create mode 100644 src/libs/common/ide/types/TextLine.ts diff --git a/src/ide/Position.ts b/src/ide/Position.ts deleted file mode 100644 index 9e63f9be65..0000000000 --- a/src/ide/Position.ts +++ /dev/null @@ -1,43 +0,0 @@ -import IPosition from "../libs/common/ide/types/Position"; - -export default class Position implements IPosition { - public readonly line: number; - public readonly character: number; - - constructor(line: number, character: number) { - this.line = line; - this.character = character; - } - - public isEqual(other: Position): boolean { - return this.line === other.line && this.character === other.character; - } - - public isBefore(other: IPosition): boolean { - if (this.line < other.line) { - return true; - } - if (this.line > other.line) { - return false; - } - return this.character < other.character; - } - - public isAfter(other: IPosition): boolean { - if (this.line > other.line) { - return true; - } - if (this.line < other.line) { - return false; - } - return this.character > other.character; - } - - public isBeforeOrEqual(other: Position): boolean { - return this.isEqual(other) || this.isBefore(other); - } - - public isAfterOrEqual(other: Position): boolean { - return this.isEqual(other) || this.isAfter(other); - } -} diff --git a/src/ide/Range.ts b/src/ide/Range.ts deleted file mode 100644 index 6eb5f945d3..0000000000 --- a/src/ide/Range.ts +++ /dev/null @@ -1,88 +0,0 @@ -import type IPosition from "../libs/common/ide/types/Position"; -import type IRange from "../libs/common/ide/types/Range"; -import Position from "./Position"; - -export default class Range implements IRange { - /** - * The start position. It is before or equal to {@link Range.end end}. - */ - readonly start: IPosition; - - /** - * The end position. It is after or equal to {@link Range.start start}. - */ - readonly end: IPosition; - - /** - * Create a new range from two positions. If `start` is not - * before or equal to `end`, the values will be swapped. - * - * @param start A position. - * @param end A position. - */ - constructor(start: IPosition, end: IPosition); - - /** - * Create a new range from number coordinates. It is a shorter equivalent of - * using `new Range(new Position(startLine, startCharacter), new Position(endLine, endCharacter))` - * - * @param startLine A zero-based line value. - * @param startCharacter A zero-based character value. - * @param endLine A zero-based line value. - * @param endCharacter A zero-based character value. - */ - constructor( - startLine: number, - startCharacter: number, - endLine: number, - endCharacter: number, - ); - - constructor( - a: number | Position, - b: number | Position, - c?: number, - d?: number, - ) { - const [start, end] = _getPositionsFromRangeArguments( - // TODO: Sort this mess out - a as number, - b as number, - c!, - d!, - ); - - // Ranges are always non-reversed - if (start.isBefore(end)) { - this.start = start; - this.end = end; - } else { - this.start = end; - this.end = start; - } - } -} - -export function _getPositionsFromRangeArguments( - start: IPosition, - end: IPosition, -): [IPosition, IPosition]; - -export function _getPositionsFromRangeArguments( - startLine: number, - startCharacter: number, - endLine: number, - endCharacter: number, -): [IPosition, IPosition]; - -export function _getPositionsFromRangeArguments( - ...args: any[] -): [IPosition, IPosition] { - // Arguments are two positions - if (args.length === 2) { - return args as [IPosition, IPosition]; - } - - // Arguments are four numbers - return [new Position(args[0], args[1]), new Position(args[2], args[3])]; -} diff --git a/src/ide/Selection.ts b/src/ide/Selection.ts deleted file mode 100644 index b46c7e24a7..0000000000 --- a/src/ide/Selection.ts +++ /dev/null @@ -1,49 +0,0 @@ -import type Position from "../libs/common/ide/types/Position"; -import type ISelection from "../libs/common/ide/types/Selection"; -import Range, { _getPositionsFromRangeArguments } from "./Range"; - -export default class Selection extends Range implements ISelection { - readonly isReversed: boolean; - - /** - * Create a selection from two positions. - * - * @param anchor A position. - * @param active A position. - */ - constructor(anchor: Position, active: Position); - - /** - * Create a selection from four coordinates. - * - * @param anchorLine A zero-based line value. - * @param anchorCharacter A zero-based character value. - * @param activeLine A zero-based line value. - * @param activeCharacter A zero-based character value. - */ - constructor( - anchorLine: number, - anchorCharacter: number, - activeLine: number, - activeCharacter: number, - ); - - constructor( - a: number | Position, - b: number | Position, - c?: number, - d?: number, - ) { - const [anchor, active] = _getPositionsFromRangeArguments( - // TODO: Sort this mess out - a as number, - b as number, - c!, - d!, - ); - - super(anchor, active); - - this.isReversed = active.isBefore(anchor); - } -} diff --git a/src/ide/vscode/VscodeTextDocument.ts b/src/ide/vscode/VscodeTextDocument.ts index 6164557ff1..2899fcd424 100644 --- a/src/ide/vscode/VscodeTextDocument.ts +++ b/src/ide/vscode/VscodeTextDocument.ts @@ -1,14 +1,46 @@ import * as vscode from "vscode"; -import { URI } from "vscode-uri"; -import Range from "../../libs/common/ide/types/Range"; -import Selection from "../../libs/common/ide/types/Selection"; +import type { URI } from "vscode-uri"; +import Position from "../../libs/common/ide/Position"; +import Range from "../../libs/common/ide/Range"; import TextDocument from "../../libs/common/ide/types/TextDocument"; +import TextLine from "../../libs/common/ide/types/TextLine"; +import { toVscodePosition, toVscodeRange } from "./VscodeUtil"; export default class VscodeTextDocument implements TextDocument { - constructor(private editor: vscode.TextDocument) {} + get uri(): URI { + return this.document.uri; + } - uri: URI; - languageId: string; - eol: "LF" | "CRLF"; - range: Range; + get languageId(): string { + return this.document.languageId; + } + + constructor(private document: vscode.TextDocument) {} + + getRange(): Range { + return new Range( + new Position(0, 0), + this.document.lineAt(this.document.lineCount - 1).range.end, + ); + } + + lineAt(lineOrPosition: number | Position): TextLine { + return this.document.lineAt( + typeof lineOrPosition === "number" ? lineOrPosition : lineOrPosition.line, + ); + } + + offsetAt(position: Position): number { + return this.document.offsetAt(toVscodePosition(position)); + } + + positionAt(offset: number): Position { + return this.document.positionAt(offset); + } + + getText(range?: Range | undefined): string { + return this.document.getText( + range != null ? toVscodeRange(range) : undefined, + ); + } } diff --git a/src/ide/vscode/VscodeTextEditor.ts b/src/ide/vscode/VscodeTextEditor.ts index d9b2f5a7fe..bd454bf4b3 100644 --- a/src/ide/vscode/VscodeTextEditor.ts +++ b/src/ide/vscode/VscodeTextEditor.ts @@ -1,11 +1,10 @@ import * as vscode from "vscode"; -import type IRange from "../../libs/common/ide/types/Range"; -import type ISelection from "../../libs/common/ide/types/Selection"; +import Range from "../../libs/common/ide/Range"; +import Selection from "../../libs/common/ide/Selection"; import type TextDocument from "../../libs/common/ide/types/TextDocument"; import type TextEditor from "../../libs/common/ide/types/TextEditor"; -import Range from "../Range"; -import Selection from "../Selection"; import VscodeTextDocument from "./VscodeTextDocument"; +import { fromVscodeRange, fromVscodeSelection } from "./VscodeUtil"; export default class VscodeTextEditor implements TextEditor { readonly document: TextDocument; @@ -14,11 +13,11 @@ export default class VscodeTextEditor implements TextEditor { this.document = new VscodeTextDocument(editor.document); } - get selections(): ISelection[] { - return this.editor.selections.map((s) => new Selection(s.anchor, s.active)); + get selections(): Selection[] { + return this.editor.selections.map(fromVscodeSelection); } - get visibleRanges(): IRange[] { - return this.editor.visibleRanges.map((r) => new Range(r.start, r.end)); + get visibleRanges(): Range[] { + return this.editor.visibleRanges.map(fromVscodeRange); } } diff --git a/src/ide/vscode/VscodeUtil.ts b/src/ide/vscode/VscodeUtil.ts new file mode 100644 index 0000000000..e9c7540afc --- /dev/null +++ b/src/ide/vscode/VscodeUtil.ts @@ -0,0 +1,48 @@ +import * as vscode from "vscode"; +import Position from "../../libs/common/ide/Position"; +import Range from "../../libs/common/ide/Range"; +import Selection from "../../libs/common/ide/Selection"; + +export function toVscodeRange(range: Range): vscode.Range { + return new vscode.Range( + range.start.line, + range.start.character, + range.end.line, + range.end.character, + ); +} + +export function fromVscodeRange(range: vscode.Range): Range { + return new Range( + range.start.line, + range.start.character, + range.end.line, + range.end.character, + ); +} + +export function toVscodeSelection(range: Selection): vscode.Selection { + return new vscode.Selection( + range.start.line, + range.start.character, + range.end.line, + range.end.character, + ); +} + +export function fromVscodeSelection(range: vscode.Selection): Selection { + return new Selection( + range.start.line, + range.start.character, + range.end.line, + range.end.character, + ); +} + +export function toVscodePosition(position: Position): vscode.Position { + return new vscode.Position(position.line, position.character); +} + +export function fromVscodePosition(position: vscode.Position): Position { + return new Position(position.line, position.character); +} diff --git a/src/libs/common/ide/Location.ts b/src/libs/common/ide/Location.ts new file mode 100644 index 0000000000..150594b2c0 --- /dev/null +++ b/src/libs/common/ide/Location.ts @@ -0,0 +1,33 @@ +import { URI } from "vscode-uri"; +import Position from "./Position"; +import Range from "./Range"; + +/** + * Represents a location inside a resource, such as a line + * inside a text file. + */ +export default class Location { + /** + * The resource identifier of this location. + */ + uri: URI; + + /** + * The document range of this location. + */ + range: Range; + + /** + * Creates a new location object. + * + * @param uri The resource identifier. + * @param rangeOrPosition The range or position. Positions will be converted to an empty range. + */ + constructor(uri: URI, rangeOrPosition: Range | Position) { + this.uri = uri; + this.range = + "start" in rangeOrPosition + ? rangeOrPosition + : new Range(rangeOrPosition, rangeOrPosition); + } +} diff --git a/src/libs/common/ide/types/Position.ts b/src/libs/common/ide/Position.ts similarity index 51% rename from src/libs/common/ide/types/Position.ts rename to src/libs/common/ide/Position.ts index a40f29dab3..1a175b7654 100644 --- a/src/libs/common/ide/types/Position.ts +++ b/src/libs/common/ide/Position.ts @@ -1,13 +1,22 @@ -export default interface Position { +export default class Position { /** * The zero-based line value. */ - readonly line: number; + public readonly line: number; /** * The zero-based character value. */ - readonly character: number; + public readonly character: number; + + /** + * @param line A zero-based line value. + * @param character A zero-based character value. + */ + constructor(line: number, character: number) { + this.line = line; + this.character = character; + } /** * Check if this position is equal to `other`. @@ -16,7 +25,9 @@ export default interface Position { * @return `true` if the line and character of the given position are equal to * the line and character of this position. */ - isEqual(other: Position): boolean; + public isEqual(other: Position): boolean { + return this.line === other.line && this.character === other.character; + } /** * Check if this position is before `other`. @@ -25,25 +36,43 @@ export default interface Position { * @return `true` if position is on a smaller line * or on the same line on a smaller character. */ - isBefore(other: Position): boolean; + public isBefore(other: Position): boolean { + if (this.line < other.line) { + return true; + } + if (this.line > other.line) { + return false; + } + return this.character < other.character; + } /** - * Check if this position is before or equal to `other`. + * Check if this position is after `other`. * * @param other A position. - * @return `true` if position is on a smaller line - * or on the same line on a smaller or equal character. + * @return `true` if position is on a greater line + * or on the same line on a greater character. */ - isBeforeOrEqual(other: Position): boolean; + public isAfter(other: Position): boolean { + if (this.line > other.line) { + return true; + } + if (this.line < other.line) { + return false; + } + return this.character > other.character; + } /** - * Check if this position is after `other`. + * Check if this position is before or equal to `other`. * * @param other A position. - * @return `true` if position is on a greater line - * or on the same line on a greater character. + * @return `true` if position is on a smaller line + * or on the same line on a smaller or equal character. */ - isAfter(other: Position): boolean; + public isBeforeOrEqual(other: Position): boolean { + return this.isEqual(other) || this.isBefore(other); + } /** * Check if this position is after or equal to `other`. @@ -52,5 +81,7 @@ export default interface Position { * @return `true` if position is on a greater line * or on the same line on a greater or equal character. */ - isAfterOrEqual(other: Position): boolean; + public isAfterOrEqual(other: Position): boolean { + return this.isEqual(other) || this.isAfter(other); + } } diff --git a/src/libs/common/ide/Range.ts b/src/libs/common/ide/Range.ts new file mode 100644 index 0000000000..1246af2315 --- /dev/null +++ b/src/libs/common/ide/Range.ts @@ -0,0 +1,71 @@ +import Position from "./Position"; + +export default class Range { + /** + * The start position. It is before or equal to {@link Range.end end}. + */ + readonly start: Position; + + /** + * The end position. It is after or equal to {@link Range.start start}. + */ + readonly end: Position; + + /** + * Create a new empty range. + * + * @param position A position. + */ + constructor(position: Position); + + /** + * Create a new range from two positions. If `start` is not + * before or equal to `end`, the values will be swapped. + * + * @param start A position. + * @param end A position. + */ + constructor(start: Position, end: Position); + + /** + * Create a new range from number coordinates. It is a shorter equivalent of + * using `new Range(new Position(startLine, startCharacter), new Position(endLine, endCharacter))` + * + * @param startLine A zero-based line value. + * @param startCharacter A zero-based character value. + * @param endLine A zero-based line value. + * @param endCharacter A zero-based character value. + */ + constructor( + startLine: number, + startCharacter: number, + endLine: number, + endCharacter: number, + ); + + constructor(...args: any[]) { + const [start, end] = (() => { + // Arguments are one positions + if (args.length === 1) { + return [args[0], args[0]]; + } + + // Arguments are two positions + if (args.length === 2) { + return args; + } + + // Arguments are four numbers + return [new Position(args[0], args[1]), new Position(args[2], args[3])]; + })(); + + // Ranges are always non-reversed + if (start.isBefore(end)) { + this.start = start; + this.end = end; + } else { + this.start = end; + this.end = start; + } + } +} diff --git a/src/libs/common/ide/Selection.ts b/src/libs/common/ide/Selection.ts new file mode 100644 index 0000000000..b5a3b4271b --- /dev/null +++ b/src/libs/common/ide/Selection.ts @@ -0,0 +1,75 @@ +import Position from "./Position"; +import Range from "./Range"; + +export default class Selection extends Range { + /** + * The position at which the selection starts. + * This position might be before or after {@link Selection.active active}. + */ + readonly anchor: Position; + + /** + * The position of the cursor. + * This position might be before or after {@link Selection.anchor anchor}. + */ + readonly active: Position; + + /** + * Is true if active position is before anchor position. + */ + get isReversed(): boolean { + return this.active.isBefore(this.anchor); + } + + /** + * Create a new empty selection. + * + * @param position A position. + */ + constructor(position: Position); + + /** + * Create a selection from two positions. + * + * @param anchor A position. + * @param active A position. + */ + constructor(anchor: Position, active: Position); + + /** + * Create a selection from four coordinates. + * + * @param anchorLine A zero-based line value. + * @param anchorCharacter A zero-based character value. + * @param activeLine A zero-based line value. + * @param activeCharacter A zero-based character value. + */ + constructor( + anchorLine: number, + anchorCharacter: number, + activeLine: number, + activeCharacter: number, + ); + + constructor(...args: any[]) { + const [anchor, active] = (() => { + // Arguments are one positions + if (args.length === 1) { + return [args[0], args[0]]; + } + + // Arguments are two positions + if (args.length === 2) { + return args; + } + + // Arguments are four numbers + return [new Position(args[0], args[1]), new Position(args[2], args[3])]; + })(); + + super(anchor, active); + + this.anchor = anchor; + this.active = active; + } +} diff --git a/src/libs/common/ide/types/Range.ts b/src/libs/common/ide/types/Range.ts deleted file mode 100644 index bcf80e7279..0000000000 --- a/src/libs/common/ide/types/Range.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type Position from "./Position"; - -export default interface Range { - /** - * The start position. It is before or equal to {@link Range.end end}. - */ - readonly start: Position; - - /** - * The end position. It is after or equal to {@link Range.start start}. - */ - readonly end: Position; -} diff --git a/src/libs/common/ide/types/Selection.ts b/src/libs/common/ide/types/Selection.ts deleted file mode 100644 index 971b072f1b..0000000000 --- a/src/libs/common/ide/types/Selection.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type Range from "./Range"; - -export default interface Selection extends Range { - /** - * Is true if active position is before anchor position. - */ - readonly isReversed: boolean; -} diff --git a/src/libs/common/ide/types/TextDocument.ts b/src/libs/common/ide/types/TextDocument.ts index 652fbb2781..1428d421df 100644 --- a/src/libs/common/ide/types/TextDocument.ts +++ b/src/libs/common/ide/types/TextDocument.ts @@ -1,5 +1,7 @@ import type { URI } from "vscode-uri"; -import type Range from "./Range"; +import type Position from "../Position"; +import type Range from "../Range"; +import type TextLine from "./TextLine"; export default interface TextDocument { /** @@ -16,13 +18,58 @@ export default interface TextDocument { readonly languageId: string; /** - * The end of line sequence that is predominately - * used in this document. + * The range of the text document. */ - readonly eol: "LF" | "CRLF"; + getRange(): Range; /** - * The range of the text document. + * Returns a text line denoted by the line number. Note + * that the returned object is *not* live and changes to the + * document are not reflected. + * + * @param line A line number in [0, lineCount). + * @return A {@link TextLine line}. + */ + lineAt(line: number): TextLine; + + /** + * Returns a text line denoted by the position. Note + * that the returned object is *not* live and changes to the + * document are not reflected. + * + * The position will be {@link TextDocument.validatePosition adjusted}. + * + * @see {@link TextDocument.lineAt} + * + * @param position A position. + * @return A {@link TextLine line}. + */ + lineAt(position: Position): TextLine; + + /** + * Converts the position to a zero-based offset. + * + * The position will be {@link TextDocument.validatePosition adjusted}. + * + * @param position A position. + * @return A valid zero-based offset. + */ + offsetAt(position: Position): number; + + /** + * Converts a zero-based offset to a position. + * + * @param offset A zero-based offset. + * @return A valid {@link Position}. + */ + positionAt(offset: number): Position; + + /** + * Get the text of this document. A substring can be retrieved by providing + * a range. The range will be {@link TextDocument.validateRange adjusted}. + * + * @param range Include only the text included by the range. + * @return The text inside the provided range or the entire text. */ - readonly range: Range; + getText(range?: Range): string; } diff --git a/src/libs/common/ide/types/TextLine.ts b/src/libs/common/ide/types/TextLine.ts new file mode 100644 index 0000000000..3b230d9f36 --- /dev/null +++ b/src/libs/common/ide/types/TextLine.ts @@ -0,0 +1,41 @@ +import type Range from "../Range"; + +/** + * Represents a line of text, such as a line of source code. + * + * TextLine objects are __immutable__. When a {@link TextDocument document} changes, + * previously retrieved lines will not represent the latest state. + */ +export default interface TextLine { + /** + * The zero-based line number. + */ + readonly lineNumber: number; + + /** + * The text of this line without the line separator characters. + */ + readonly text: string; + + /** + * The range this line covers without the line separator characters. + */ + readonly range: Range; + + /** + * The range this line covers with the line separator characters. + */ + readonly rangeIncludingLineBreak: Range; + + /** + * The offset of the first character which is not a whitespace character as defined + * by `/\s/`. **Note** that if a line is all whitespace the length of the line is returned. + */ + readonly firstNonWhitespaceCharacterIndex: number; + + /** + * Whether this line is whitespace only, shorthand + * for {@link TextLine.firstNonWhitespaceCharacterIndex} === {@link TextLine.text TextLine.text.length}. + */ + readonly isEmptyOrWhitespace: boolean; +} diff --git a/src/typings/Types.ts b/src/typings/Types.ts index 17178b0adc..cdc6f551b0 100644 --- a/src/typings/Types.ts +++ b/src/typings/Types.ts @@ -1,5 +1,4 @@ import * as vscode from "vscode"; -import { Location } from "vscode"; import { SyntaxNode } from "web-tree-sitter"; import { ActionRecord } from "../actions/actions.types"; import Cheatsheet from "../core/Cheatsheet"; @@ -12,6 +11,9 @@ import { ReadOnlyHatMap } from "../core/IndividualHatMap"; import { Snippets } from "../core/Snippets"; import StatusBarItem from "../core/StatusBarItem"; import { RangeUpdater } from "../core/updateSelections/RangeUpdater"; +import Range from "../libs/common/ide/Range"; +import Selection from "../libs/common/ide/Selection"; +import type TextEditor from "../libs/common/ide/types/TextEditor"; import { CommandServerApi } from "../libs/vscode-common/getExtensionApi"; import { ModifierStage } from "../processTargets/PipelineStages.types"; import { TestCaseRecorder } from "../testUtil/TestCaseRecorder"; @@ -22,7 +24,7 @@ import { FullRangeInfo } from "./updateSelections"; * A token within a text editor, including the current display line of the token */ export interface Token extends FullRangeInfo { - editor: vscode.TextEditor; + editor: TextEditor; displayLine: number; } @@ -38,21 +40,21 @@ export interface ProcessedTargetsContext { */ actionFinalStages: ModifierStage[]; currentSelections: SelectionWithEditor[]; - currentEditor: vscode.TextEditor | undefined; + currentEditor: TextEditor | undefined; hatTokenMap: ReadOnlyHatMap; thatMark: Target[]; sourceMark: Target[]; - getNodeAtLocation: (location: Location) => SyntaxNode; + getNodeAtLocation: (location: vscode.Location) => SyntaxNode; } export interface SelectionWithEditor { - selection: vscode.Selection; - editor: vscode.TextEditor; + selection: Selection; + editor: TextEditor; } export interface RangeWithEditor { - range: vscode.Range; - editor: vscode.TextEditor; + range: Range; + editor: TextEditor; } export interface SelectionContext { @@ -61,22 +63,22 @@ export interface SelectionContext { /** * Selection used for removal */ - removalRange?: vscode.Range; + removalRange?: Range; /** * The range used for the interior */ - interiorRange?: vscode.Range; + interiorRange?: Range; /** * The range of the delimiter before the selection */ - leadingDelimiterRange?: vscode.Range; + leadingDelimiterRange?: Range; /** * The range of the delimiter after the selection */ - trailingDelimiterRange?: vscode.Range; + trailingDelimiterRange?: Range; } export type SelectionWithEditorWithContext = { @@ -85,7 +87,7 @@ export type SelectionWithEditorWithContext = { }; export interface SelectionWithContext { - selection: vscode.Selection; + selection: Selection; context: SelectionContext; } @@ -177,18 +179,18 @@ export type NodeMatcher = ( **/ export type NodeFinder = ( node: SyntaxNode, - selection?: vscode.Selection, + selection?: Selection, ) => SyntaxNode | null; /** Returns one or more selections for a given SyntaxNode */ export type SelectionExtractor = ( - editor: vscode.TextEditor, + editor: TextEditor, nodes: SyntaxNode, ) => SelectionWithContext; /** Represent a single edit/change in the document */ export interface Edit { - range: vscode.Range; + range: Range; text: string; /** @@ -209,7 +211,7 @@ export interface EditWithRangeUpdater extends Edit { * after applying the edit, and should return a new range which excludes any * delimiters that were inserted. */ - updateRange: (range: vscode.Range) => vscode.Range; + updateRange: (range: Range) => Range; } export type TextFormatterName = diff --git a/yarn.lock b/yarn.lock index 781dd757fe..9bed5c55c5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,2058 +3,2071 @@ "@babel/runtime@^7.15.4": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.0.tgz#824a9ef325ffde6f78056059db3168c08785e24a" - integrity sha512-NDYdls71fTXoU8TZHfbBWg7DiZfNzClcKui/+kyi6ppD2L1qnWW3VV6CjtaBXSUGGhiTWJ6ereOIkUvenif66Q== + "integrity" "sha512-NDYdls71fTXoU8TZHfbBWg7DiZfNzClcKui/+kyi6ppD2L1qnWW3VV6CjtaBXSUGGhiTWJ6ereOIkUvenif66Q==" + "resolved" "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.0.tgz" + "version" "7.20.0" dependencies: - regenerator-runtime "^0.13.10" + "regenerator-runtime" "^0.13.10" "@eslint/eslintrc@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.1.tgz#8b5e1c49f4077235516bc9ec7d41378c0f69b8c6" - integrity sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.3.1" - globals "^13.9.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" + "integrity" "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==" + "resolved" "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz" + "version" "1.2.1" + dependencies: + "ajv" "^6.12.4" + "debug" "^4.3.2" + "espree" "^9.3.1" + "globals" "^13.9.0" + "ignore" "^5.2.0" + "import-fresh" "^3.2.1" + "js-yaml" "^4.1.0" + "minimatch" "^3.0.4" + "strip-json-comments" "^3.1.1" "@humanwhocodes/config-array@^0.9.2": - version "0.9.5" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" - integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== + "integrity" "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==" + "resolved" "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz" + "version" "0.9.5" dependencies: "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" - minimatch "^3.0.4" + "debug" "^4.1.1" + "minimatch" "^3.0.4" "@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== + "integrity" "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + "resolved" "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + "version" "1.2.1" "@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + "integrity" "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" + "resolved" "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + "version" "2.1.5" dependencies: "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" + "run-parallel" "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + "integrity" "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + "version" "2.0.5" "@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + "integrity" "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==" + "resolved" "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + "version" "1.2.8" dependencies: "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" + "fastq" "^1.6.0" "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.3": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + "integrity" "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==" + "resolved" "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz" + "version" "1.8.3" dependencies: - type-detect "4.0.8" + "type-detect" "4.0.8" -"@sinonjs/fake-timers@>=5": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.1.tgz#7b698e0b9d12d93611f06ee143c30ced848e2840" - integrity sha512-Wp5vwlZ0lOqpSYGKqr53INws9HLkt6JDc/pDZcPf7bchQnrXJMXPns8CXx0hFikMSGSWfvtvvpb2gtMVfkWagA== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@sinonjs/fake-timers@^7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5" - integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg== +"@sinonjs/fake-timers@^7.1.2", "@sinonjs/fake-timers@>=5": + "integrity" "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==" + "resolved" "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz" + "version" "7.1.2" dependencies: "@sinonjs/commons" "^1.7.0" "@sinonjs/samsam@^6.0.2": - version "6.1.1" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-6.1.1.tgz#627f7f4cbdb56e6419fa2c1a3e4751ce4f6a00b1" - integrity sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA== + "integrity" "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==" + "resolved" "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz" + "version" "6.1.1" dependencies: "@sinonjs/commons" "^1.6.0" - lodash.get "^4.4.2" - type-detect "^4.0.8" + "lodash.get" "^4.4.2" + "type-detect" "^4.0.8" "@sinonjs/text-encoding@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" - integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== + "integrity" "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==" + "resolved" "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz" + "version" "0.7.1" "@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + "integrity" "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + "resolved" "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" + "version" "1.1.2" "@types/chai@^4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.3.tgz#3c90752792660c4b562ad73b3fbd68bf3bc7ae07" - integrity sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g== + "integrity" "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==" + "resolved" "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz" + "version" "4.3.3" "@types/glob@^7.1.3": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" - integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + "integrity" "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==" + "resolved" "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz" + "version" "7.2.0" dependencies: "@types/minimatch" "*" "@types/node" "*" "@types/js-yaml@^4.0.2": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.5.tgz#738dd390a6ecc5442f35e7f03fa1431353f7e138" - integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA== + "integrity" "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==" + "resolved" "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz" + "version" "4.0.5" "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + "integrity" "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + "resolved" "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" + "version" "7.0.11" "@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + "integrity" "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + "resolved" "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" + "version" "0.0.29" "@types/lodash@^4.14.168": - version "4.14.181" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.181.tgz#d1d3740c379fda17ab175165ba04e2d03389385d" - integrity sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag== + "integrity" "sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag==" + "resolved" "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.181.tgz" + "version" "4.14.181" "@types/minimatch@*": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" - integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + "integrity" "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" + "resolved" "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz" + "version" "3.0.5" "@types/mocha@^8.0.4": - version "8.2.3" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.3.tgz#bbeb55fbc73f28ea6de601fbfa4613f58d785323" - integrity sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw== + "integrity" "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==" + "resolved" "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz" + "version" "8.2.3" -"@types/node@*": - version "17.0.23" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da" - integrity sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw== - -"@types/node@^16.11.3": - version "16.11.26" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.26.tgz#63d204d136c9916fb4dcd1b50f9740fe86884e47" - integrity sha512-GZ7bu5A6+4DtG7q9GsoHXy3ALcgeIHP4NnL0Vv2wu0uUB/yQex26v0tf6/na1mm0+bS9Uw+0DFex7aaKr2qawQ== +"@types/node@*", "@types/node@^16.11.3": + "integrity" "sha512-GZ7bu5A6+4DtG7q9GsoHXy3ALcgeIHP4NnL0Vv2wu0uUB/yQex26v0tf6/na1mm0+bS9Uw+0DFex7aaKr2qawQ==" + "resolved" "https://registry.npmjs.org/@types/node/-/node-16.11.26.tgz" + "version" "16.11.26" "@types/semver@^7.3.9": - version "7.3.9" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.9.tgz#152c6c20a7688c30b967ec1841d31ace569863fc" - integrity sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ== + "integrity" "sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ==" + "resolved" "https://registry.npmjs.org/@types/semver/-/semver-7.3.9.tgz" + "version" "7.3.9" "@types/sinon@^10.0.2": - version "10.0.11" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.11.tgz#8245827b05d3fc57a6601bd35aee1f7ad330fc42" - integrity sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g== + "integrity" "sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g==" + "resolved" "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.11.tgz" + "version" "10.0.11" dependencies: "@types/sinonjs__fake-timers" "*" "@types/sinonjs__fake-timers@*": - version "8.1.2" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz#bf2e02a3dbd4aecaf95942ecd99b7402e03fad5e" - integrity sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA== + "integrity" "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==" + "resolved" "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz" + "version" "8.1.2" "@types/vscode@~1.61.0": - version "1.61.0" - resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.61.0.tgz#c54335b6f84c19c69b1435b17cc0ce3b2cecfeec" - integrity sha512-9k5Nwq45hkRwdfCFY+eKXeQQSbPoA114mF7U/4uJXRBJeGIO7MuJdhF1PnaDN+lllL9iKGQtd6FFXShBXMNaFg== + "integrity" "sha512-9k5Nwq45hkRwdfCFY+eKXeQQSbPoA114mF7U/4uJXRBJeGIO7MuJdhF1PnaDN+lllL9iKGQtd6FFXShBXMNaFg==" + "resolved" "https://registry.npmjs.org/@types/vscode/-/vscode-1.61.0.tgz" + "version" "1.61.0" "@typescript-eslint/eslint-plugin@^5.20.0": - version "5.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.20.0.tgz#022531a639640ff3faafaf251d1ce00a2ef000a1" - integrity sha512-fapGzoxilCn3sBtC6NtXZX6+P/Hef7VDbyfGqTTpzYydwhlkevB+0vE0EnmHPVTVSy68GUncyJ/2PcrFBeCo5Q== + "integrity" "sha512-fapGzoxilCn3sBtC6NtXZX6+P/Hef7VDbyfGqTTpzYydwhlkevB+0vE0EnmHPVTVSy68GUncyJ/2PcrFBeCo5Q==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.20.0.tgz" + "version" "5.20.0" dependencies: "@typescript-eslint/scope-manager" "5.20.0" "@typescript-eslint/type-utils" "5.20.0" "@typescript-eslint/utils" "5.20.0" - debug "^4.3.2" - functional-red-black-tree "^1.0.1" - ignore "^5.1.8" - regexpp "^3.2.0" - semver "^7.3.5" - tsutils "^3.21.0" - -"@typescript-eslint/parser@^5.20.0": - version "5.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.20.0.tgz#4991c4ee0344315c2afc2a62f156565f689c8d0b" - integrity sha512-UWKibrCZQCYvobmu3/N8TWbEeo/EPQbS41Ux1F9XqPzGuV7pfg6n50ZrFo6hryynD8qOTTfLHtHjjdQtxJ0h/w== + "debug" "^4.3.2" + "functional-red-black-tree" "^1.0.1" + "ignore" "^5.1.8" + "regexpp" "^3.2.0" + "semver" "^7.3.5" + "tsutils" "^3.21.0" + +"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.20.0": + "integrity" "sha512-UWKibrCZQCYvobmu3/N8TWbEeo/EPQbS41Ux1F9XqPzGuV7pfg6n50ZrFo6hryynD8qOTTfLHtHjjdQtxJ0h/w==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.20.0.tgz" + "version" "5.20.0" dependencies: "@typescript-eslint/scope-manager" "5.20.0" "@typescript-eslint/types" "5.20.0" "@typescript-eslint/typescript-estree" "5.20.0" - debug "^4.3.2" + "debug" "^4.3.2" "@typescript-eslint/scope-manager@5.20.0": - version "5.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.20.0.tgz#79c7fb8598d2942e45b3c881ced95319818c7980" - integrity sha512-h9KtuPZ4D/JuX7rpp1iKg3zOH0WNEa+ZIXwpW/KWmEFDxlA/HSfCMhiyF1HS/drTICjIbpA6OqkAhrP/zkCStg== + "integrity" "sha512-h9KtuPZ4D/JuX7rpp1iKg3zOH0WNEa+ZIXwpW/KWmEFDxlA/HSfCMhiyF1HS/drTICjIbpA6OqkAhrP/zkCStg==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.20.0.tgz" + "version" "5.20.0" dependencies: "@typescript-eslint/types" "5.20.0" "@typescript-eslint/visitor-keys" "5.20.0" "@typescript-eslint/type-utils@5.20.0": - version "5.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.20.0.tgz#151c21cbe9a378a34685735036e5ddfc00223be3" - integrity sha512-WxNrCwYB3N/m8ceyoGCgbLmuZwupvzN0rE8NBuwnl7APgjv24ZJIjkNzoFBXPRCGzLNkoU/WfanW0exvp/+3Iw== + "integrity" "sha512-WxNrCwYB3N/m8ceyoGCgbLmuZwupvzN0rE8NBuwnl7APgjv24ZJIjkNzoFBXPRCGzLNkoU/WfanW0exvp/+3Iw==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.20.0.tgz" + "version" "5.20.0" dependencies: "@typescript-eslint/utils" "5.20.0" - debug "^4.3.2" - tsutils "^3.21.0" + "debug" "^4.3.2" + "tsutils" "^3.21.0" "@typescript-eslint/types@5.20.0": - version "5.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.20.0.tgz#fa39c3c2aa786568302318f1cb51fcf64258c20c" - integrity sha512-+d8wprF9GyvPwtoB4CxBAR/s0rpP25XKgnOvMf/gMXYDvlUC3rPFHupdTQ/ow9vn7UDe5rX02ovGYQbv/IUCbg== + "integrity" "sha512-+d8wprF9GyvPwtoB4CxBAR/s0rpP25XKgnOvMf/gMXYDvlUC3rPFHupdTQ/ow9vn7UDe5rX02ovGYQbv/IUCbg==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.20.0.tgz" + "version" "5.20.0" "@typescript-eslint/typescript-estree@5.20.0": - version "5.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.20.0.tgz#ab73686ab18c8781bbf249c9459a55dc9417d6b0" - integrity sha512-36xLjP/+bXusLMrT9fMMYy1KJAGgHhlER2TqpUVDYUQg4w0q/NW/sg4UGAgVwAqb8V4zYg43KMUpM8vV2lve6w== + "integrity" "sha512-36xLjP/+bXusLMrT9fMMYy1KJAGgHhlER2TqpUVDYUQg4w0q/NW/sg4UGAgVwAqb8V4zYg43KMUpM8vV2lve6w==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.20.0.tgz" + "version" "5.20.0" dependencies: "@typescript-eslint/types" "5.20.0" "@typescript-eslint/visitor-keys" "5.20.0" - debug "^4.3.2" - globby "^11.0.4" - is-glob "^4.0.3" - semver "^7.3.5" - tsutils "^3.21.0" + "debug" "^4.3.2" + "globby" "^11.0.4" + "is-glob" "^4.0.3" + "semver" "^7.3.5" + "tsutils" "^3.21.0" "@typescript-eslint/utils@5.20.0": - version "5.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.20.0.tgz#b8e959ed11eca1b2d5414e12417fd94cae3517a5" - integrity sha512-lHONGJL1LIO12Ujyx8L8xKbwWSkoUKFSO+0wDAqGXiudWB2EO7WEUT+YZLtVbmOmSllAjLb9tpoIPwpRe5Tn6w== + "integrity" "sha512-lHONGJL1LIO12Ujyx8L8xKbwWSkoUKFSO+0wDAqGXiudWB2EO7WEUT+YZLtVbmOmSllAjLb9tpoIPwpRe5Tn6w==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.20.0.tgz" + "version" "5.20.0" dependencies: "@types/json-schema" "^7.0.9" "@typescript-eslint/scope-manager" "5.20.0" "@typescript-eslint/types" "5.20.0" "@typescript-eslint/typescript-estree" "5.20.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" + "eslint-scope" "^5.1.1" + "eslint-utils" "^3.0.0" "@typescript-eslint/visitor-keys@5.20.0": - version "5.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.20.0.tgz#70236b5c6b67fbaf8b2f58bf3414b76c1e826c2a" - integrity sha512-1flRpNF+0CAQkMNlTJ6L/Z5jiODG/e5+7mk6XwtPOUS3UrTz3UOiAg9jG2VtKsWI6rZQfy4C6a232QNRZTRGlg== + "integrity" "sha512-1flRpNF+0CAQkMNlTJ6L/Z5jiODG/e5+7mk6XwtPOUS3UrTz3UOiAg9jG2VtKsWI6rZQfy4C6a232QNRZTRGlg==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.20.0.tgz" + "version" "5.20.0" dependencies: "@typescript-eslint/types" "5.20.0" - eslint-visitor-keys "^3.0.0" + "eslint-visitor-keys" "^3.0.0" "@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + "integrity" "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==" + "resolved" "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz" + "version" "1.1.2" "@vscode/test-electron@^2.1.3": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@vscode/test-electron/-/test-electron-2.1.4.tgz#fa1b8915246d0102e81d4fd664bb6c337ca7092f" - integrity sha512-tHHAWNVwl8C7nyezHAHdNPWkksdXWvmae6bt4k1tJ9hvMm6QIIk95Mkutl82XHcD60mdP46EHDGU+xFsAvygOQ== - dependencies: - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - rimraf "^3.0.2" - unzipper "^0.10.11" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -acorn-jsx@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.7.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" - integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -ajv@^6.10.0, 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== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-regex@^0.2.0, ansi-regex@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" - integrity sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= - -ansi-regex@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" - integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" - integrity sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94= - -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.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -asap@^2.0.0: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -async@^2.6.1: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== - dependencies: - lodash "^4.17.14" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -big-integer@^1.6.17: - version "1.6.51" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" - integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -binary@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" - integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= - dependencies: - buffers "~0.1.1" - chainsaw "~0.1.0" - -bluebird@~3.4.1: - version "3.4.7" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" - integrity sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM= - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= - -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== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.2, 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" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -buffer-indexof-polyfill@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz#d2732135c5999c64b277fcf9b1abe3498254729c" - integrity sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A== - -buffers@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" - integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s= - -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== - -camelcase@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -chai@^4.3.6: - version "4.3.6" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" - integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^3.0.1" - get-func-name "^2.0.0" - loupe "^2.3.1" - pathval "^1.1.1" - type-detect "^4.0.5" - -chainsaw@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" - integrity sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= - dependencies: - traverse ">=0.3.0 <0.4" - -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" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@~0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" - integrity sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ= - dependencies: - ansi-styles "^1.1.0" - escape-string-regexp "^1.0.0" - has-ansi "^0.1.0" - strip-ansi "^0.3.0" - supports-color "^0.2.0" - -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== - -chokidar@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" - integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.5.0" + "integrity" "sha512-tHHAWNVwl8C7nyezHAHdNPWkksdXWvmae6bt4k1tJ9hvMm6QIIk95Mkutl82XHcD60mdP46EHDGU+xFsAvygOQ==" + "resolved" "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.1.4.tgz" + "version" "2.1.4" + dependencies: + "http-proxy-agent" "^4.0.1" + "https-proxy-agent" "^5.0.0" + "rimraf" "^3.0.2" + "unzipper" "^0.10.11" + +"abbrev@1": + "integrity" "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "resolved" "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" + "version" "1.1.1" + +"acorn-jsx@^5.3.1": + "integrity" "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" + "resolved" "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + "version" "5.3.2" + +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^8.7.0": + "integrity" "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" + "resolved" "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz" + "version" "8.7.0" + +"agent-base@6": + "integrity" "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==" + "resolved" "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + "version" "6.0.2" + dependencies: + "debug" "4" + +"ajv@^6.10.0", "ajv@^6.12.4": + "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" + "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + "version" "6.12.6" + dependencies: + "fast-deep-equal" "^3.1.1" + "fast-json-stable-stringify" "^2.0.0" + "json-schema-traverse" "^0.4.1" + "uri-js" "^4.2.2" + +"ansi-colors@4.1.1": + "integrity" "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" + "resolved" "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" + "version" "4.1.1" + +"ansi-regex@^0.2.0": + "integrity" "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" + "version" "0.2.1" + +"ansi-regex@^0.2.1": + "integrity" "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" + "version" "0.2.1" + +"ansi-regex@^3.0.0": + "integrity" "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" + "version" "3.0.1" + +"ansi-regex@^5.0.1": + "integrity" "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + "version" "5.0.1" + +"ansi-styles@^1.1.0": + "integrity" "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94= sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz" + "version" "1.1.0" + +"ansi-styles@^3.2.1": + "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + "version" "3.2.1" + dependencies: + "color-convert" "^1.9.0" + +"ansi-styles@^4.0.0", "ansi-styles@^4.1.0": + "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + "version" "4.3.0" + dependencies: + "color-convert" "^2.0.1" + +"anymatch@~3.1.1": + "integrity" "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==" + "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" + "version" "3.1.2" + dependencies: + "normalize-path" "^3.0.0" + "picomatch" "^2.0.4" + +"argparse@^2.0.1": + "integrity" "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "resolved" "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + "version" "2.0.1" + +"array-union@^2.1.0": + "integrity" "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + "resolved" "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + "version" "2.1.0" + +"asap@^2.0.0": + "integrity" "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + "resolved" "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + "version" "2.0.6" + +"assertion-error@^1.1.0": + "integrity" "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + "resolved" "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" + "version" "1.1.0" + +"async@^2.6.1": + "integrity" "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==" + "resolved" "https://registry.npmjs.org/async/-/async-2.6.3.tgz" + "version" "2.6.3" + dependencies: + "lodash" "^4.17.14" + +"balanced-match@^1.0.0": + "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + "version" "1.0.2" + +"big-integer@^1.6.17": + "integrity" "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" + "resolved" "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz" + "version" "1.6.51" + +"binary-extensions@^2.0.0": + "integrity" "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + "version" "2.2.0" + +"binary@~0.3.0": + "integrity" "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==" + "resolved" "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz" + "version" "0.3.0" + dependencies: + "buffers" "~0.1.1" + "chainsaw" "~0.1.0" + +"bluebird@~3.4.1": + "integrity" "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM= sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" + "resolved" "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz" + "version" "3.4.7" + +"boolbase@^1.0.0": + "integrity" "sha1-aN/1++YMUes3cl6p4+0xDcwed24= sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + "resolved" "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + "version" "1.0.0" + +"brace-expansion@^1.1.7": + "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" + "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + "version" "1.1.11" + dependencies: + "balanced-match" "^1.0.0" + "concat-map" "0.0.1" + +"braces@^3.0.2", "braces@~3.0.2": + "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" + "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + "version" "3.0.2" + dependencies: + "fill-range" "^7.0.1" + +"browser-stdout@1.3.1": + "integrity" "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + "resolved" "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" + "version" "1.3.1" + +"buffer-indexof-polyfill@~1.0.0": + "integrity" "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==" + "resolved" "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz" + "version" "1.0.2" + +"buffers@~0.1.1": + "integrity" "sha1-skV5w77U1tOWru5tmorn9Ugqt7s= sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==" + "resolved" "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" + "version" "0.1.1" + +"callsites@^3.0.0": + "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + "version" "3.1.0" + +"camelcase@^6.0.0": + "integrity" "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + "version" "6.3.0" + +"chai@^4.3.6": + "integrity" "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==" + "resolved" "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz" + "version" "4.3.6" + dependencies: + "assertion-error" "^1.1.0" + "check-error" "^1.0.2" + "deep-eql" "^3.0.1" + "get-func-name" "^2.0.0" + "loupe" "^2.3.1" + "pathval" "^1.1.1" + "type-detect" "^4.0.5" + +"chainsaw@~0.1.0": + "integrity" "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==" + "resolved" "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz" + "version" "0.1.0" + dependencies: + "traverse" ">=0.3.0 <0.4" + +"chalk@^2.4.2": + "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" + "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + "version" "2.4.2" + dependencies: + "ansi-styles" "^3.2.1" + "escape-string-regexp" "^1.0.5" + "supports-color" "^5.3.0" + +"chalk@^4.0.0": + "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" + "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + "version" "4.1.2" + dependencies: + "ansi-styles" "^4.1.0" + "supports-color" "^7.1.0" + +"chalk@~0.5.1": + "integrity" "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ= sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==" + "resolved" "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz" + "version" "0.5.1" + dependencies: + "ansi-styles" "^1.1.0" + "escape-string-regexp" "^1.0.0" + "has-ansi" "^0.1.0" + "strip-ansi" "^0.3.0" + "supports-color" "^0.2.0" + +"check-error@^1.0.2": + "integrity" "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==" + "resolved" "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" + "version" "1.0.2" + +"chokidar@3.5.1": + "integrity" "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==" + "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz" + "version" "3.5.1" + dependencies: + "anymatch" "~3.1.1" + "braces" "~3.0.2" + "glob-parent" "~5.1.0" + "is-binary-path" "~2.1.0" + "is-glob" "~4.0.1" + "normalize-path" "~3.0.0" + "readdirp" "~3.5.0" optionalDependencies: - fsevents "~2.3.1" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -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" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - 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 sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -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== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -css-select@^4.2.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" - integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== - dependencies: - boolbase "^1.0.0" - css-what "^6.0.1" - domhandler "^4.3.1" - domutils "^2.8.0" - nth-check "^2.0.1" - -css-what@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -debug@4, debug@^4.1.1, debug@^4.3.2: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - -debuglog@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" - integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - dependencies: - type-detect "^4.0.0" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -dezalgo@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" - integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= - dependencies: - asap "^2.0.0" - wrappy "1" - -diff@5.0.0, diff@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domhandler@^4.2.0, domhandler@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== - dependencies: - domelementtype "^2.2.0" - -domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -duplexer2@~0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= - dependencies: - readable-stream "^2.0.2" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -esbuild@^0.11.12: - version "0.11.23" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.11.23.tgz#c42534f632e165120671d64db67883634333b4b8" - integrity sha512-iaiZZ9vUF5wJV8ob1tl+5aJTrwDczlvGP0JoMmnpC2B0ppiMCu8n8gmy5ZTGl5bcG081XBVn+U+jP+mPFm5T5Q== - -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@4.0.0, 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" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escape-string-regexp@^1.0.0, 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 sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -eslint-config-prettier@^8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" - integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== - -eslint@^8.13.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.13.0.tgz#6fcea43b6811e655410f5626cfcf328016badcd7" - integrity sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ== + "fsevents" "~2.3.1" + +"cliui@^7.0.2": + "integrity" "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==" + "resolved" "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + "version" "7.0.4" + dependencies: + "string-width" "^4.2.0" + "strip-ansi" "^6.0.0" + "wrap-ansi" "^7.0.0" + +"color-convert@^1.9.0": + "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" + "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + "version" "1.9.3" + dependencies: + "color-name" "1.1.3" + +"color-convert@^2.0.1": + "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" + "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "color-name" "~1.1.4" + +"color-name@~1.1.4": + "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + "version" "1.1.4" + +"color-name@1.1.3": + "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + "version" "1.1.3" + +"concat-map@0.0.1": + "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + "version" "0.0.1" + +"core-util-is@~1.0.0": + "integrity" "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "resolved" "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + "version" "1.0.3" + +"cross-spawn@^7.0.2": + "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==" + "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + "version" "7.0.3" + dependencies: + "path-key" "^3.1.0" + "shebang-command" "^2.0.0" + "which" "^2.0.1" + +"css-select@^4.2.1": + "integrity" "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==" + "resolved" "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" + "version" "4.3.0" + dependencies: + "boolbase" "^1.0.0" + "css-what" "^6.0.1" + "domhandler" "^4.3.1" + "domutils" "^2.8.0" + "nth-check" "^2.0.1" + +"css-what@^6.0.1": + "integrity" "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" + "resolved" "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" + "version" "6.1.0" + +"debug@^4.1.1", "debug@^4.3.2", "debug@4": + "integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==" + "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + "version" "4.3.4" + dependencies: + "ms" "2.1.2" + +"debug@4.3.1": + "integrity" "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==" + "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz" + "version" "4.3.1" + dependencies: + "ms" "2.1.2" + +"debuglog@^1.0.1": + "integrity" "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==" + "resolved" "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz" + "version" "1.0.1" + +"decamelize@^4.0.0": + "integrity" "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" + "resolved" "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" + "version" "4.0.0" + +"deep-eql@^3.0.1": + "integrity" "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==" + "resolved" "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "type-detect" "^4.0.0" + +"deep-is@^0.1.3": + "integrity" "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + "resolved" "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + "version" "0.1.4" + +"dezalgo@^1.0.0": + "integrity" "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= sha512-K7i4zNfT2kgQz3GylDw40ot9GAE47sFZ9EXHFSPP6zONLgH6kWXE0KWJchkbQJLBkRazq4APwZ4OwiFFlT95OQ==" + "resolved" "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz" + "version" "1.0.3" + dependencies: + "asap" "^2.0.0" + "wrappy" "1" + +"diff@^5.0.0", "diff@5.0.0": + "integrity" "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" + "resolved" "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" + "version" "5.0.0" + +"dir-glob@^3.0.1": + "integrity" "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==" + "resolved" "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "path-type" "^4.0.0" + +"doctrine@^3.0.0": + "integrity" "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==" + "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "esutils" "^2.0.2" + +"dom-serializer@^1.0.1": + "integrity" "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==" + "resolved" "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" + "version" "1.4.1" + dependencies: + "domelementtype" "^2.0.1" + "domhandler" "^4.2.0" + "entities" "^2.0.0" + +"domelementtype@^2.0.1", "domelementtype@^2.2.0": + "integrity" "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + "resolved" "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" + "version" "2.3.0" + +"domhandler@^4.2.0", "domhandler@^4.3.1": + "integrity" "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==" + "resolved" "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" + "version" "4.3.1" + dependencies: + "domelementtype" "^2.2.0" + +"domutils@^2.8.0": + "integrity" "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==" + "resolved" "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" + "version" "2.8.0" + dependencies: + "dom-serializer" "^1.0.1" + "domelementtype" "^2.2.0" + "domhandler" "^4.2.0" + +"duplexer2@~0.1.4": + "integrity" "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==" + "resolved" "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz" + "version" "0.1.4" + dependencies: + "readable-stream" "^2.0.2" + +"emoji-regex@^8.0.0": + "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + "version" "8.0.0" + +"entities@^2.0.0": + "integrity" "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + "resolved" "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" + "version" "2.2.0" + +"esbuild@^0.11.12": + "integrity" "sha512-iaiZZ9vUF5wJV8ob1tl+5aJTrwDczlvGP0JoMmnpC2B0ppiMCu8n8gmy5ZTGl5bcG081XBVn+U+jP+mPFm5T5Q==" + "resolved" "https://registry.npmjs.org/esbuild/-/esbuild-0.11.23.tgz" + "version" "0.11.23" + +"escalade@^3.1.1": + "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + "version" "3.1.1" + +"escape-string-regexp@^1.0.0": + "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + "version" "1.0.5" + +"escape-string-regexp@^1.0.5": + "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + "version" "1.0.5" + +"escape-string-regexp@^4.0.0", "escape-string-regexp@4.0.0": + "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + "version" "4.0.0" + +"eslint-config-prettier@^8.5.0": + "integrity" "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==" + "resolved" "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz" + "version" "8.5.0" + +"eslint-scope@^5.1.1": + "integrity" "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==" + "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "esrecurse" "^4.3.0" + "estraverse" "^4.1.1" + +"eslint-scope@^7.1.1": + "integrity" "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==" + "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" + "version" "7.1.1" + dependencies: + "esrecurse" "^4.3.0" + "estraverse" "^5.2.0" + +"eslint-utils@^3.0.0": + "integrity" "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==" + "resolved" "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "eslint-visitor-keys" "^2.0.0" + +"eslint-visitor-keys@^2.0.0": + "integrity" "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + "version" "2.1.0" + +"eslint-visitor-keys@^3.0.0", "eslint-visitor-keys@^3.3.0": + "integrity" "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==" + "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" + "version" "3.3.0" + +"eslint@*", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^8.13.0", "eslint@>=5", "eslint@>=7.0.0": + "integrity" "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==" + "resolved" "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz" + "version" "8.13.0" dependencies: "@eslint/eslintrc" "^1.2.1" "@humanwhocodes/config-array" "^0.9.2" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.3.0" - espree "^9.3.1" - esquery "^1.4.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^6.0.1" - globals "^13.6.0" - ignore "^5.2.0" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.0.4" - natural-compare "^1.4.0" - optionator "^0.9.1" - regexpp "^3.2.0" - strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^9.3.1: - version "9.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.1.tgz#8793b4bc27ea4c778c19908e0719e7b8f4115bcd" - integrity sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ== - dependencies: - acorn "^8.7.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^3.3.0" - -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + "ajv" "^6.10.0" + "chalk" "^4.0.0" + "cross-spawn" "^7.0.2" + "debug" "^4.3.2" + "doctrine" "^3.0.0" + "escape-string-regexp" "^4.0.0" + "eslint-scope" "^7.1.1" + "eslint-utils" "^3.0.0" + "eslint-visitor-keys" "^3.3.0" + "espree" "^9.3.1" + "esquery" "^1.4.0" + "esutils" "^2.0.2" + "fast-deep-equal" "^3.1.3" + "file-entry-cache" "^6.0.1" + "functional-red-black-tree" "^1.0.1" + "glob-parent" "^6.0.1" + "globals" "^13.6.0" + "ignore" "^5.2.0" + "import-fresh" "^3.0.0" + "imurmurhash" "^0.1.4" + "is-glob" "^4.0.0" + "js-yaml" "^4.1.0" + "json-stable-stringify-without-jsonify" "^1.0.1" + "levn" "^0.4.1" + "lodash.merge" "^4.6.2" + "minimatch" "^3.0.4" + "natural-compare" "^1.4.0" + "optionator" "^0.9.1" + "regexpp" "^3.2.0" + "strip-ansi" "^6.0.1" + "strip-json-comments" "^3.1.0" + "text-table" "^0.2.0" + "v8-compile-cache" "^2.0.3" + +"espree@^9.3.1": + "integrity" "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==" + "resolved" "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz" + "version" "9.3.1" + dependencies: + "acorn" "^8.7.0" + "acorn-jsx" "^5.3.1" + "eslint-visitor-keys" "^3.3.0" + +"esquery@^1.4.0": + "integrity" "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==" + "resolved" "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "estraverse" "^5.1.0" + +"esrecurse@^4.3.0": + "integrity" "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==" + "resolved" "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + "version" "4.3.0" + dependencies: + "estraverse" "^5.2.0" + +"estraverse@^4.1.1": + "integrity" "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + "version" "4.3.0" + +"estraverse@^5.1.0": + "integrity" "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + "version" "5.3.0" + +"estraverse@^5.2.0": + "integrity" "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + "version" "5.3.0" + +"esutils@^2.0.2": + "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + "resolved" "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + "version" "2.0.3" + +"fast-deep-equal@^3.1.1", "fast-deep-equal@^3.1.3": + "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + "version" "3.1.3" + +"fast-glob@^3.2.9": + "integrity" "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==" + "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" + "version" "3.2.11" 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" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fast-xml-parser@^3.20.0: - version "3.21.1" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz#152a1d51d445380f7046b304672dd55d15c9e736" - integrity sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg== - dependencies: - strnum "^1.0.4" - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - 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== - dependencies: - to-regex-range "^5.0.1" - -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.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== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flatted@^3.1.0: - version "3.2.5" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" - integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -fstream@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" - integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== - -github-url-from-git@^1.3.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.5.0.tgz#f985fedcc0a9aa579dc88d7aff068d55cc6251a0" - integrity sha1-+YX+3MCpqledyI16/waNVcxiUaA= - -github-url-from-username-repo@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/github-url-from-username-repo/-/github-url-from-username-repo-1.0.2.tgz#7dd79330d2abe69c10c2cef79714c97215791dfa" - integrity sha1-fdeTMNKr5pwQws73lxTJchV5Hfo= - -glob-parent@^5.1.2, glob-parent@~5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^5.0.3: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.3, glob@^7.1.7: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^13.6.0, globals@^13.9.0: - version "13.13.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.13.0.tgz#ac32261060d8070e2719dd6998406e27d2b5727b" - integrity sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A== - dependencies: - type-fest "^0.20.2" - -globby@^11.0.4: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" + "glob-parent" "^5.1.2" + "merge2" "^1.3.0" + "micromatch" "^4.0.4" + +"fast-json-stable-stringify@^2.0.0": + "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + "version" "2.1.0" + +"fast-levenshtein@^2.0.6": + "integrity" "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + "resolved" "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + "version" "2.0.6" + +"fast-xml-parser@^3.20.0": + "integrity" "sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg==" + "resolved" "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz" + "version" "3.21.1" + dependencies: + "strnum" "^1.0.4" + +"fastq@^1.6.0": + "integrity" "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==" + "resolved" "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" + "version" "1.13.0" + dependencies: + "reusify" "^1.0.4" + +"file-entry-cache@^6.0.1": + "integrity" "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==" + "resolved" "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + "version" "6.0.1" + dependencies: + "flat-cache" "^3.0.4" + +"fill-range@^7.0.1": + "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" + "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + "version" "7.0.1" + dependencies: + "to-regex-range" "^5.0.1" + +"find-up@5.0.0": + "integrity" "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==" + "resolved" "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + "version" "5.0.0" + dependencies: + "locate-path" "^6.0.0" + "path-exists" "^4.0.0" + +"flat-cache@^3.0.4": + "integrity" "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==" + "resolved" "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + "version" "3.0.4" + dependencies: + "flatted" "^3.1.0" + "rimraf" "^3.0.2" + +"flat@^5.0.2": + "integrity" "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" + "resolved" "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" + "version" "5.0.2" + +"flatted@^3.1.0": + "integrity" "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" + "resolved" "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz" + "version" "3.2.5" + +"fs.realpath@^1.0.0": + "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8= sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + "version" "1.0.0" + +"fstream@^1.0.12": + "integrity" "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==" + "resolved" "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz" + "version" "1.0.12" + dependencies: + "graceful-fs" "^4.1.2" + "inherits" "~2.0.0" + "mkdirp" ">=0.5 0" + "rimraf" "2" + +"functional-red-black-tree@^1.0.1": + "integrity" "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" + "resolved" "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" + "version" "1.0.1" + +"get-caller-file@^2.0.5": + "integrity" "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + "resolved" "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + "version" "2.0.5" + +"get-func-name@^2.0.0": + "integrity" "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==" + "resolved" "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" + "version" "2.0.0" + +"github-url-from-git@^1.3.0": + "integrity" "sha1-+YX+3MCpqledyI16/waNVcxiUaA= sha512-WWOec4aRI7YAykQ9+BHmzjyNlkfJFG8QLXnDTsLz/kZefq7qkzdfo4p6fkYYMIq1aj+gZcQs/1HQhQh3DPPxlQ==" + "resolved" "https://registry.npmjs.org/github-url-from-git/-/github-url-from-git-1.5.0.tgz" + "version" "1.5.0" + +"github-url-from-username-repo@^1.0.0": + "integrity" "sha1-fdeTMNKr5pwQws73lxTJchV5Hfo= sha512-Tj8CQqRoFVTglGdQ8FQmfq8gOOoOYZX7tnOKP8jq8Hdz2OTDhxvtlkLAbrqMYZ7X/YdaYQoUG1IBWxISBfqZ+Q==" + "resolved" "https://registry.npmjs.org/github-url-from-username-repo/-/github-url-from-username-repo-1.0.2.tgz" + "version" "1.0.2" + +"glob-parent@^5.1.2": + "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" + "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + "version" "5.1.2" + dependencies: + "is-glob" "^4.0.1" + +"glob-parent@^6.0.1": + "integrity" "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==" + "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + "version" "6.0.2" + dependencies: + "is-glob" "^4.0.3" + +"glob-parent@~5.1.0": + "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" + "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + "version" "5.1.2" + dependencies: + "is-glob" "^4.0.1" + +"glob@^5.0.3": + "integrity" "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==" + "resolved" "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" + "version" "5.0.15" + dependencies: + "inflight" "^1.0.4" + "inherits" "2" + "minimatch" "2 || 3" + "once" "^1.3.0" + "path-is-absolute" "^1.0.0" + +"glob@^7.1.3", "glob@^7.1.7": + "integrity" "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==" + "resolved" "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" + "version" "7.2.0" + dependencies: + "fs.realpath" "^1.0.0" + "inflight" "^1.0.4" + "inherits" "2" + "minimatch" "^3.0.4" + "once" "^1.3.0" + "path-is-absolute" "^1.0.0" + +"glob@7.1.6": + "integrity" "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==" + "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" + "version" "7.1.6" + dependencies: + "fs.realpath" "^1.0.0" + "inflight" "^1.0.4" + "inherits" "2" + "minimatch" "^3.0.4" + "once" "^1.3.0" + "path-is-absolute" "^1.0.0" + +"globals@^13.6.0", "globals@^13.9.0": + "integrity" "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==" + "resolved" "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz" + "version" "13.13.0" + dependencies: + "type-fest" "^0.20.2" + +"globby@^11.0.4": + "integrity" "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==" + "resolved" "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + "version" "11.1.0" + dependencies: + "array-union" "^2.1.0" + "dir-glob" "^3.0.1" + "fast-glob" "^3.2.9" + "ignore" "^5.2.0" + "merge2" "^1.4.1" + "slash" "^3.0.0" + +"graceful-fs@^4.1.2": + "integrity" "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + "version" "4.2.10" + +"graceful-fs@^4.2.2": + "integrity" "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + "version" "4.2.10" "graceful-fs@2 || 3": - version "3.0.12" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.12.tgz#0034947ce9ed695ec8ab0b854bc919e82b1ffaef" - integrity sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg== + "integrity" "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==" + "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz" + "version" "3.0.12" dependencies: - natives "^1.1.3" - -graceful-fs@^4.1.2, graceful-fs@^4.2.2: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + "natives" "^1.1.3" -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== +"growl@1.10.5": + "integrity" "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" + "resolved" "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" + "version" "1.10.5" -has-ansi@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" - integrity sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4= +"has-ansi@^0.1.0": + "integrity" "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4= sha512-1YsTg1fk2/6JToQhtZkArMkurq8UoWU1Qe0aR3VUHjgij4nOylSWLWAtBXoZ4/dXOmugfLGm1c+QhuD0JyedFA==" + "resolved" "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz" + "version" "0.1.0" dependencies: - ansi-regex "^0.2.0" + "ansi-regex" "^0.2.0" -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= +"has-flag@^3.0.0": + "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0= sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + "version" "3.0.0" -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== +"has-flag@^4.0.0": + "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + "version" "4.0.0" -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +"he@1.2.0": + "integrity" "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + "resolved" "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + "version" "1.2.0" -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== +"http-proxy-agent@^4.0.1": + "integrity" "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==" + "resolved" "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" + "version" "4.0.1" dependencies: "@tootallnate/once" "1" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - -ignore@^5.1.8, ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - -immer@^9.0.15: - version "9.0.15" - resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.15.tgz#0b9169e5b1d22137aba7d43f8a81a495dd1b62dc" - integrity sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ== - -immutability-helper@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/immutability-helper/-/immutability-helper-3.1.1.tgz#2b86b2286ed3b1241c9e23b7b21e0444f52f77b7" - integrity sha512-Q0QaXjPjwIju/28TsugCHNEASwoCcJSyJV3uO1sOIQGI0jKgm9f41Lvz0DZj3n46cNCyAZTsEYoY4C2bVRUzyQ== - -import-fresh@^3.0.0, 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== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@~2.0.0, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -itertools@^1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/itertools/-/itertools-1.7.1.tgz#39fb110782b7f57b9c14782c25fe35bd3997d4fc" - integrity sha512-0sC8t0HYOH0wb/mU5eLmp2g19yfhqho12Q6kCX6MGkNEEJQz97LIXzZ2bbIDyzBnQGcMixmcAtByzKjiaFkw8Q== + "agent-base" "6" + "debug" "4" + +"https-proxy-agent@^5.0.0": + "integrity" "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==" + "resolved" "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz" + "version" "5.0.0" + dependencies: + "agent-base" "6" + "debug" "4" + +"ignore@^5.1.8", "ignore@^5.2.0": + "integrity" "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" + "resolved" "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" + "version" "5.2.0" + +"immer@^9.0.15": + "integrity" "sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ==" + "resolved" "https://registry.npmjs.org/immer/-/immer-9.0.15.tgz" + "version" "9.0.15" + +"immutability-helper@^3.1.1": + "integrity" "sha512-Q0QaXjPjwIju/28TsugCHNEASwoCcJSyJV3uO1sOIQGI0jKgm9f41Lvz0DZj3n46cNCyAZTsEYoY4C2bVRUzyQ==" + "resolved" "https://registry.npmjs.org/immutability-helper/-/immutability-helper-3.1.1.tgz" + "version" "3.1.1" + +"import-fresh@^3.0.0", "import-fresh@^3.2.1": + "integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==" + "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + "version" "3.3.0" + dependencies: + "parent-module" "^1.0.0" + "resolve-from" "^4.0.0" + +"imurmurhash@^0.1.4": + "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o= sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + "version" "0.1.4" + +"inflight@^1.0.4": + "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==" + "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + "version" "1.0.6" + dependencies: + "once" "^1.3.0" + "wrappy" "1" + +"inherits@~2.0.0", "inherits@~2.0.3", "inherits@2": + "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + "version" "2.0.4" + +"is-binary-path@~2.1.0": + "integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" + "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "binary-extensions" "^2.0.0" + +"is-extglob@^2.1.1": + "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + "version" "2.1.1" + +"is-fullwidth-code-point@^2.0.0": + "integrity" "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==" + "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" + "version" "2.0.0" + +"is-fullwidth-code-point@^3.0.0": + "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + "version" "3.0.0" + +"is-glob@^4.0.0", "is-glob@^4.0.1", "is-glob@^4.0.3", "is-glob@~4.0.1": + "integrity" "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" + "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + "version" "4.0.3" + dependencies: + "is-extglob" "^2.1.1" + +"is-number@^7.0.0": + "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + "version" "7.0.0" + +"is-plain-obj@^2.1.0": + "integrity" "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + "resolved" "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" + "version" "2.1.0" + +"isarray@~1.0.0": + "integrity" "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + "version" "1.0.0" + +"isarray@0.0.1": + "integrity" "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "resolved" "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + "version" "0.0.1" + +"isexe@^2.0.0": + "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + "version" "2.0.0" + +"itertools@^1.7.1": + "integrity" "sha512-0sC8t0HYOH0wb/mU5eLmp2g19yfhqho12Q6kCX6MGkNEEJQz97LIXzZ2bbIDyzBnQGcMixmcAtByzKjiaFkw8Q==" + "resolved" "https://registry.npmjs.org/itertools/-/itertools-1.7.1.tgz" + "version" "1.7.1" dependencies: "@babel/runtime" "^7.15.4" -jju@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" - integrity sha1-o6vicYryQaKykE+EpiWXDzia4yo= - -jquery-extend@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/jquery-extend/-/jquery-extend-2.0.3.tgz#6815cdb01a866ddba30e6f4d0fc5fb6679272735" - integrity sha1-aBXNsBqGbdujDm9ND8X7ZnknJzU= - -js-yaml@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" - integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== - dependencies: - argparse "^2.0.1" - -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== - dependencies: - argparse "^2.0.1" - -json-parse-helpfulerror@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz#13f14ce02eed4e981297b64eb9e3b932e2dd13dc" - integrity sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w= +"jju@^1.1.0": + "integrity" "sha1-o6vicYryQaKykE+EpiWXDzia4yo= sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" + "resolved" "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz" + "version" "1.4.0" + +"jquery-extend@~2.0.3": + "integrity" "sha1-aBXNsBqGbdujDm9ND8X7ZnknJzU= sha512-ysLU6/m8VLckIjAudiE+s7YAoYwklZy5Ft9kqO7FPkqaQrd3wUMuZ134G3uniysW8VZME/pGa2LcynsM4TjP5Q==" + "resolved" "https://registry.npmjs.org/jquery-extend/-/jquery-extend-2.0.3.tgz" + "version" "2.0.3" + +"js-yaml@^4.1.0": + "integrity" "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==" + "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + "version" "4.1.0" + dependencies: + "argparse" "^2.0.1" + +"js-yaml@4.0.0": + "integrity" "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==" + "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz" + "version" "4.0.0" dependencies: - jju "^1.1.0" - -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" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + "argparse" "^2.0.1" + +"json-parse-helpfulerror@^1.0.2": + "integrity" "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w= sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==" + "resolved" "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz" + "version" "1.0.3" + dependencies: + "jju" "^1.1.0" + +"json-schema-traverse@^0.4.1": + "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + "version" "0.4.1" + +"json-stable-stringify-without-jsonify@^1.0.1": + "integrity" "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + "resolved" "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + "version" "1.0.1" -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== +"json5@^1.0.1": + "integrity" "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==" + "resolved" "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" + "version" "1.0.1" dependencies: - minimist "^1.2.0" + "minimist" "^1.2.0" -just-extend@^4.0.2: - version "4.2.1" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" - integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== +"just-extend@^4.0.2": + "integrity" "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==" + "resolved" "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz" + "version" "4.2.1" -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== +"levn@^0.4.1": + "integrity" "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==" + "resolved" "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + "version" "0.4.1" dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -"license-checker@git+https://github.com/mwittig/license-checker#d546e3f738e14c62e732346fa355162d46700893": - version "1.0.0" - resolved "git+https://github.com/mwittig/license-checker#d546e3f738e14c62e732346fa355162d46700893" + "prelude-ls" "^1.2.1" + "type-check" "~0.4.0" + +"license-checker@git+https://github.com/mwittig/license-checker.git#d546e3f738e14c62e732346fa355162d46700893": + "integrity" "sha512-CeZEQfhSiqkTkY6wbGFBo3ki7iMSo4+m46xjZ0Ou84CbEu8fhoFaz8H8Nsr/KtPscdQeZNFgdgWWUPKikKDupg==" + "resolved" "git+ssh://git@github.com/mwittig/license-checker.git#d546e3f738e14c62e732346fa355162d46700893" + "version" "1.0.0" dependencies: - chalk "~0.5.1" - mkdirp "^0.3.5" - nopt "^2.2.0" - read-installed "~3.1.3" - treeify "^1.0.1" + "chalk" "~0.5.1" + "mkdirp" "^0.3.5" + "nopt" "^2.2.0" + "read-installed" "~3.1.3" + "treeify" "^1.0.1" -listenercount@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" - integrity sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= +"listenercount@~1.0.1": + "integrity" "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" + "resolved" "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz" + "version" "1.0.1" -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== +"locate-path@^6.0.0": + "integrity" "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==" + "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + "version" "6.0.0" dependencies: - p-locate "^5.0.0" - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + "p-locate" "^5.0.0" -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +"lodash.get@^4.4.2": + "integrity" "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + "resolved" "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" + "version" "4.4.2" -lodash@^4.17.14, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +"lodash.merge@^4.6.2": + "integrity" "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "resolved" "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + "version" "4.6.2" -log-symbols@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" - integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== - dependencies: - chalk "^4.0.0" +"lodash@^4.17.14", "lodash@^4.17.21": + "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + "version" "4.17.21" -loupe@^2.3.1: - version "2.3.4" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" - integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== +"log-symbols@4.0.0": + "integrity" "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==" + "resolved" "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz" + "version" "4.0.0" dependencies: - get-func-name "^2.0.0" - -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== + "chalk" "^4.0.0" + +"loupe@^2.3.1": + "integrity" "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==" + "resolved" "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz" + "version" "2.3.4" dependencies: - yallist "^4.0.0" + "get-func-name" "^2.0.0" -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== +"lru-cache@^6.0.0": + "integrity" "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" + "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + "version" "6.0.0" + dependencies: + "yallist" "^4.0.0" -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== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -"minimatch@2 || 3", minimatch@^3.0.4: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" +"merge2@^1.3.0", "merge2@^1.4.1": + "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + "resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + "version" "1.4.1" + +"micromatch@^4.0.4": + "integrity" "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==" + "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + "version" "4.0.5" + dependencies: + "braces" "^3.0.2" + "picomatch" "^2.3.1" + +"minimatch@^3.0.4", "minimatch@2 || 3": + "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" + "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + "version" "3.1.2" + dependencies: + "brace-expansion" "^1.1.7" -minimatch@3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== +"minimatch@3.0.4": + "integrity" "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==" + "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" + "version" "3.0.4" dependencies: - brace-expansion "^1.1.7" + "brace-expansion" "^1.1.7" -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +"minimist@^1.2.0", "minimist@^1.2.6": + "integrity" "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" + "version" "1.2.6" -"mkdirp@>=0.5 0", mkdirp@^0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" +"mkdirp@^0.3.5": + "integrity" "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc= sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==" + "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" + "version" "0.3.5" -mkdirp@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" - integrity sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc= +"mkdirp@^0.5.1", "mkdirp@>=0.5 0": + "integrity" "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==" + "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + "version" "0.5.6" + dependencies: + "minimist" "^1.2.6" -mocha@^8.1.3: - version "8.4.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff" - integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ== +"mocha@^8.1.3": + "integrity" "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==" + "resolved" "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz" + "version" "8.4.0" dependencies: "@ungap/promise-all-settled" "1.1.2" - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.1" - debug "4.3.1" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.1.6" - growl "1.10.5" - he "1.2.0" - js-yaml "4.0.0" - log-symbols "4.0.0" - minimatch "3.0.4" - ms "2.1.3" - nanoid "3.1.20" - serialize-javascript "5.0.1" - strip-json-comments "3.1.1" - supports-color "8.1.1" - which "2.0.2" - wide-align "1.1.3" - workerpool "6.1.0" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - -module-alias@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/module-alias/-/module-alias-2.2.2.tgz#151cdcecc24e25739ff0aa6e51e1c5716974c0e0" - integrity sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q== - -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== - -nanoid@3.1.20: - version "3.1.20" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" - integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== - -natives@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.6.tgz#a603b4a498ab77173612b9ea1acdec4d980f00bb" - integrity sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -nise@^5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.1.tgz#ac4237e0d785ecfcb83e20f389185975da5c31f3" - integrity sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A== + "ansi-colors" "4.1.1" + "browser-stdout" "1.3.1" + "chokidar" "3.5.1" + "debug" "4.3.1" + "diff" "5.0.0" + "escape-string-regexp" "4.0.0" + "find-up" "5.0.0" + "glob" "7.1.6" + "growl" "1.10.5" + "he" "1.2.0" + "js-yaml" "4.0.0" + "log-symbols" "4.0.0" + "minimatch" "3.0.4" + "ms" "2.1.3" + "nanoid" "3.1.20" + "serialize-javascript" "5.0.1" + "strip-json-comments" "3.1.1" + "supports-color" "8.1.1" + "which" "2.0.2" + "wide-align" "1.1.3" + "workerpool" "6.1.0" + "yargs" "16.2.0" + "yargs-parser" "20.2.4" + "yargs-unparser" "2.0.0" + +"module-alias@^2.2.2": + "integrity" "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==" + "resolved" "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz" + "version" "2.2.2" + +"ms@2.1.2": + "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + "version" "2.1.2" + +"ms@2.1.3": + "integrity" "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + "version" "2.1.3" + +"nanoid@3.1.20": + "integrity" "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==" + "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz" + "version" "3.1.20" + +"natives@^1.1.3": + "integrity" "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==" + "resolved" "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz" + "version" "1.1.6" + +"natural-compare@^1.4.0": + "integrity" "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + "resolved" "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + "version" "1.4.0" + +"nise@^5.1.0": + "integrity" "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==" + "resolved" "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz" + "version" "5.1.1" dependencies: "@sinonjs/commons" "^1.8.3" "@sinonjs/fake-timers" ">=5" "@sinonjs/text-encoding" "^0.7.1" - just-extend "^4.0.2" - path-to-regexp "^1.7.0" - -node-html-parser@^5.3.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-5.3.3.tgz#2845704f3a7331a610e0e551bf5fa02b266341b6" - integrity sha512-ncg1033CaX9UexbyA7e1N0aAoAYRDiV8jkTvzEnfd1GDvzFdrsXLzR4p4ik8mwLgnaKP/jyUFWDy9q3jvRT2Jw== - dependencies: - css-select "^4.2.1" - he "1.2.0" - -nopt-defaults@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/nopt-defaults/-/nopt-defaults-0.0.1.tgz#f150fcc8882309cbfb76187e12e9bcb20694558b" - integrity sha1-8VD8yIgjCcv7dhh+Eum8sgaUVYs= - -nopt-usage@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/nopt-usage/-/nopt-usage-0.1.0.tgz#b18b8c183e181047ca9e63b7cde7cfc702cca579" - integrity sha1-sYuMGD4YEEfKnmO3zefPxwLMpXk= - -nopt@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-2.2.1.tgz#2aa09b7d1768487b3b89a9c5aa52335bff0baea7" - integrity sha1-KqCbfRdoSHs7ianFqlIzW/8Lrqc= - dependencies: - abbrev "1" - -nopt@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= - dependencies: - abbrev "1" - -normalize-package-data@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-1.0.3.tgz#8be955b8907af975f1a4584ea8bb9b41492312f5" - integrity sha1-i+lVuJB6+XXxpFhOqLubQUkjEvU= - dependencies: - github-url-from-git "^1.3.0" - github-url-from-username-repo "^1.0.0" - semver "2 || 3 || 4" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-license-crawler@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/npm-license-crawler/-/npm-license-crawler-0.2.1.tgz#a76a82e0a0407e2032c03dc5b1d518cf9eac9e1d" - integrity sha512-CRchloUjZk/ZSAkb5JbCKNFojLWtbjxwsB7w48kauHXK+5bjby2HXFvGvicVx7uNBY6HBWEPw20qKc/4jlL+1Q== - dependencies: - async "^2.6.1" - chalk "^2.4.2" - jquery-extend "~2.0.3" - license-checker "git+https://github.com/mwittig/license-checker#d546e3f738e14c62e732346fa355162d46700893" - mkdirp "^0.5.1" - nopt "^3.0.6" - nopt-defaults "^0.0.1" - nopt-usage "^0.1.0" - treeify "^1.1.0" - -nth-check@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" - integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== - dependencies: - boolbase "^1.0.0" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - 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.3" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier@2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -read-installed@~3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-3.1.5.tgz#4ae36081afd3e2204dc2e279807aaa52c30c8c0c" - integrity sha1-SuNgga/T4iBNwuJ5gHqqUsMMjAw= - dependencies: - debuglog "^1.0.1" - read-package-json "1" - readdir-scoped-modules "^1.0.0" - semver "2 || 3 || 4" - slide "~1.1.3" - util-extend "^1.0.1" + "just-extend" "^4.0.2" + "path-to-regexp" "^1.7.0" + +"node-html-parser@^5.3.3": + "integrity" "sha512-ncg1033CaX9UexbyA7e1N0aAoAYRDiV8jkTvzEnfd1GDvzFdrsXLzR4p4ik8mwLgnaKP/jyUFWDy9q3jvRT2Jw==" + "resolved" "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.3.3.tgz" + "version" "5.3.3" + dependencies: + "css-select" "^4.2.1" + "he" "1.2.0" + +"nopt-defaults@^0.0.1": + "integrity" "sha1-8VD8yIgjCcv7dhh+Eum8sgaUVYs= sha512-Ri0fmpCibbSQQX4LoYIvt/MmiA/ivo30tDT1ifdN7/Vh4frHHd/SspJHmlDmrpXflVvoFAPMw4u64eW44Ez0lA==" + "resolved" "https://registry.npmjs.org/nopt-defaults/-/nopt-defaults-0.0.1.tgz" + "version" "0.0.1" + +"nopt-usage@^0.1.0": + "integrity" "sha1-sYuMGD4YEEfKnmO3zefPxwLMpXk= sha512-Tg2sISrWBbSsCRqpEMmdxn3KZfacrd0N2NYpZQIq0MHxGHMjwzYlxeB9pVIom/g7CBK28atDUQsTlOfG0wOsNA==" + "resolved" "https://registry.npmjs.org/nopt-usage/-/nopt-usage-0.1.0.tgz" + "version" "0.1.0" + +"nopt@^2.2.0": + "integrity" "sha1-KqCbfRdoSHs7ianFqlIzW/8Lrqc= sha512-gIOTA/uJuhPwFqp+spY7VQ1satbnGlD+iQVZxI18K6hs8Evq4sX81Ml7BB5byP/LsbR2yBVtmvdEmhi7evJ6Aw==" + "resolved" "https://registry.npmjs.org/nopt/-/nopt-2.2.1.tgz" + "version" "2.2.1" + dependencies: + "abbrev" "1" + +"nopt@^3.0.6": + "integrity" "sha1-xkZdvwirzU2zWTF/eaxopkayj/k= sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==" + "resolved" "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" + "version" "3.0.6" + dependencies: + "abbrev" "1" + +"normalize-package-data@^1.0.0": + "integrity" "sha1-i+lVuJB6+XXxpFhOqLubQUkjEvU= sha512-pyPVJAzFiaioifPIsJBEoKJ9YcPHz7UhckZ7wqhBztLLCu6NozkIDrN+frzrCwjXtfunXfaMWIDtcDhnbO8fWA==" + "resolved" "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-1.0.3.tgz" + "version" "1.0.3" + dependencies: + "github-url-from-git" "^1.3.0" + "github-url-from-username-repo" "^1.0.0" + "semver" "2 || 3 || 4" + +"normalize-path@^3.0.0", "normalize-path@~3.0.0": + "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + "version" "3.0.0" + +"npm-license-crawler@^0.2.1": + "integrity" "sha512-CRchloUjZk/ZSAkb5JbCKNFojLWtbjxwsB7w48kauHXK+5bjby2HXFvGvicVx7uNBY6HBWEPw20qKc/4jlL+1Q==" + "resolved" "https://registry.npmjs.org/npm-license-crawler/-/npm-license-crawler-0.2.1.tgz" + "version" "0.2.1" + dependencies: + "async" "^2.6.1" + "chalk" "^2.4.2" + "jquery-extend" "~2.0.3" + "license-checker" "git+https://github.com/mwittig/license-checker.git#d546e3f738e14c62e732346fa355162d46700893" + "mkdirp" "^0.5.1" + "nopt" "^3.0.6" + "nopt-defaults" "^0.0.1" + "nopt-usage" "^0.1.0" + "treeify" "^1.1.0" + +"nth-check@^2.0.1": + "integrity" "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==" + "resolved" "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "boolbase" "^1.0.0" + +"once@^1.3.0": + "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E= sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==" + "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "wrappy" "1" + +"optionator@^0.9.1": + "integrity" "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==" + "resolved" "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + "version" "0.9.1" + dependencies: + "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.3" + +"p-limit@^3.0.2": + "integrity" "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==" + "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "yocto-queue" "^0.1.0" + +"p-locate@^5.0.0": + "integrity" "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==" + "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + "version" "5.0.0" + dependencies: + "p-limit" "^3.0.2" + +"parent-module@^1.0.0": + "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" + "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "callsites" "^3.0.0" + +"path-exists@^4.0.0": + "integrity" "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + "version" "4.0.0" + +"path-is-absolute@^1.0.0": + "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18= sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + "version" "1.0.1" + +"path-key@^3.1.0": + "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + "version" "3.1.1" + +"path-to-regexp@^1.7.0": + "integrity" "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==" + "resolved" "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" + "version" "1.8.0" + dependencies: + "isarray" "0.0.1" + +"path-type@^4.0.0": + "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + "version" "4.0.0" + +"pathval@^1.1.1": + "integrity" "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==" + "resolved" "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" + "version" "1.1.1" + +"picomatch@^2.0.4", "picomatch@^2.2.1", "picomatch@^2.3.1": + "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + "version" "2.3.1" + +"prelude-ls@^1.2.1": + "integrity" "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + "resolved" "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + "version" "1.2.1" + +"prettier@2.7.1": + "integrity" "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==" + "resolved" "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz" + "version" "2.7.1" + +"process-nextick-args@~2.0.0": + "integrity" "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "resolved" "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + "version" "2.0.1" + +"punycode@^2.1.0": + "integrity" "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + "version" "2.1.1" + +"queue-microtask@^1.2.2": + "integrity" "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + "resolved" "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + "version" "1.2.3" + +"randombytes@^2.1.0": + "integrity" "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==" + "resolved" "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "safe-buffer" "^5.1.0" + +"read-installed@~3.1.3": + "integrity" "sha1-SuNgga/T4iBNwuJ5gHqqUsMMjAw= sha512-XxD5VDz32T6rLCFfYElTif8/lkqcs9y51Gs2r30rAfT7LUGzJWaXLrwvn6fXkDsTzGcPr7Pj8CggOxwTxl/ozQ==" + "resolved" "https://registry.npmjs.org/read-installed/-/read-installed-3.1.5.tgz" + "version" "3.1.5" + dependencies: + "debuglog" "^1.0.1" + "read-package-json" "1" + "readdir-scoped-modules" "^1.0.0" + "semver" "2 || 3 || 4" + "slide" "~1.1.3" + "util-extend" "^1.0.1" optionalDependencies: - graceful-fs "2 || 3" + "graceful-fs" "2 || 3" -read-package-json@1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-1.3.3.tgz#ef79dfda46e165376ee8a57efbfedd4d1b029ba4" - integrity sha1-73nf2kbhZTdu6KV++/7dTRsCm6Q= +"read-package-json@1": + "integrity" "sha1-73nf2kbhZTdu6KV++/7dTRsCm6Q= sha512-9bayCl9cbXy3AL0qXhLQ0vliEgpzUVeLegSOrde3ujTHy2W18UsJiMUXEWkjbBB4ZnJzZPVuo2vAW62j4gY7gg==" + "resolved" "https://registry.npmjs.org/read-package-json/-/read-package-json-1.3.3.tgz" + "version" "1.3.3" dependencies: - glob "^5.0.3" - json-parse-helpfulerror "^1.0.2" - normalize-package-data "^1.0.0" + "glob" "^5.0.3" + "json-parse-helpfulerror" "^1.0.2" + "normalize-package-data" "^1.0.0" optionalDependencies: - graceful-fs "2 || 3" - -readable-stream@^2.0.2, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readdir-scoped-modules@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" - integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== - dependencies: - debuglog "^1.0.1" - dezalgo "^1.0.0" - graceful-fs "^4.1.2" - once "^1.3.0" - -readdirp@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" - integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== - dependencies: - picomatch "^2.2.1" - -regenerator-runtime@^0.13.10: - version "0.13.10" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" - integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== - -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - 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== - -rimraf@2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-buffer@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + "graceful-fs" "2 || 3" + +"readable-stream@^2.0.2", "readable-stream@~2.3.6": + "integrity" "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==" + "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" + "version" "2.3.7" + dependencies: + "core-util-is" "~1.0.0" + "inherits" "~2.0.3" + "isarray" "~1.0.0" + "process-nextick-args" "~2.0.0" + "safe-buffer" "~5.1.1" + "string_decoder" "~1.1.1" + "util-deprecate" "~1.0.1" + +"readdir-scoped-modules@^1.0.0": + "integrity" "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==" + "resolved" "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz" + "version" "1.1.0" + dependencies: + "debuglog" "^1.0.1" + "dezalgo" "^1.0.0" + "graceful-fs" "^4.1.2" + "once" "^1.3.0" + +"readdirp@~3.5.0": + "integrity" "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==" + "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz" + "version" "3.5.0" + dependencies: + "picomatch" "^2.2.1" + +"regenerator-runtime@^0.13.10": + "integrity" "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" + "resolved" "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz" + "version" "0.13.10" + +"regexpp@^3.2.0": + "integrity" "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" + "resolved" "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" + "version" "3.2.0" + +"require-directory@^2.1.1": + "integrity" "sha1-jGStX9MNqxyXbiNE/+f3kqam30I= sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + "resolved" "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + "version" "2.1.1" + +"resolve-from@^4.0.0": + "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + "version" "4.0.0" + +"reusify@^1.0.4": + "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + "resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + "version" "1.0.4" + +"rimraf@^3.0.2": + "integrity" "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==" + "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + "version" "3.0.2" + dependencies: + "glob" "^7.1.3" + +"rimraf@2": + "integrity" "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==" + "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + "version" "2.7.1" + dependencies: + "glob" "^7.1.3" + +"run-parallel@^1.1.9": + "integrity" "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==" + "resolved" "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "queue-microtask" "^1.2.2" + +"safe-buffer@^5.1.0": + "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + "version" "5.2.1" + +"safe-buffer@~5.1.0": + "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "version" "5.1.2" + +"safe-buffer@~5.1.1": + "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "version" "5.1.2" + +"semver@^7.3.5", "semver@^7.3.7": + "integrity" "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==" + "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" + "version" "7.3.7" + dependencies: + "lru-cache" "^6.0.0" "semver@2 || 3 || 4": - version "4.3.6" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" - integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= - -semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" + "integrity" "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= sha512-IrpJ+yoG4EOH8DFWuVg+8H1kW1Oaof0Wxe7cPcXW3x9BjkN/eVo54F15LyqemnDIUYskQWr9qvl/RihmSy6+xQ==" + "resolved" "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" + "version" "4.3.6" -semver@^7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== +"serialize-javascript@5.0.1": + "integrity" "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==" + "resolved" "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz" + "version" "5.0.1" dependencies: - lru-cache "^6.0.0" + "randombytes" "^2.1.0" -serialize-javascript@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" - integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== - dependencies: - randombytes "^2.1.0" - -setimmediate@~1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= +"setimmediate@~1.0.4": + "integrity" "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + "resolved" "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + "version" "1.0.5" -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== +"shebang-command@^2.0.0": + "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" + "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + "version" "2.0.0" dependencies: - shebang-regex "^3.0.0" + "shebang-regex" "^3.0.0" -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +"shebang-regex@^3.0.0": + "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + "version" "3.0.0" -sinon@^11.1.1: - version "11.1.2" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-11.1.2.tgz#9e78850c747241d5c59d1614d8f9cbe8840e8674" - integrity sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw== +"sinon@^11.1.1": + "integrity" "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==" + "resolved" "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz" + "version" "11.1.2" dependencies: "@sinonjs/commons" "^1.8.3" "@sinonjs/fake-timers" "^7.1.2" "@sinonjs/samsam" "^6.0.2" - diff "^5.0.0" - nise "^5.1.0" - supports-color "^7.2.0" + "diff" "^5.0.0" + "nise" "^5.1.0" + "supports-color" "^7.2.0" + +"slash@^3.0.0": + "integrity" "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + "resolved" "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + "version" "3.0.0" -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +"slide@~1.1.3": + "integrity" "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==" + "resolved" "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz" + "version" "1.1.6" -slide@~1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= +"string_decoder@~1.1.1": + "integrity" "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==" + "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + "version" "1.1.1" + dependencies: + "safe-buffer" "~5.1.0" "string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + "integrity" "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==" + "resolved" "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" + "version" "2.1.1" dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" + "is-fullwidth-code-point" "^2.0.0" + "strip-ansi" "^4.0.0" -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== +"string-width@^4.1.0": + "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" + "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + "version" "4.2.3" dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" + "emoji-regex" "^8.0.0" + "is-fullwidth-code-point" "^3.0.0" + "strip-ansi" "^6.0.1" -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== +"string-width@^4.2.0": + "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" + "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + "version" "4.2.3" dependencies: - safe-buffer "~5.1.0" + "emoji-regex" "^8.0.0" + "is-fullwidth-code-point" "^3.0.0" + "strip-ansi" "^6.0.1" -strip-ansi@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" - integrity sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA= +"strip-ansi@^0.3.0": + "integrity" "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA= sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==" + "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz" + "version" "0.3.0" dependencies: - ansi-regex "^0.2.1" + "ansi-regex" "^0.2.1" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= +"strip-ansi@^4.0.0": + "integrity" "sha1-qEeQIusaw2iocTibY1JixQXuNo8= sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==" + "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" + "version" "4.0.0" dependencies: - ansi-regex "^3.0.0" + "ansi-regex" "^3.0.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== +"strip-ansi@^6.0.0", "strip-ansi@^6.0.1": + "integrity" "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" + "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + "version" "6.0.1" dependencies: - ansi-regex "^5.0.1" + "ansi-regex" "^5.0.1" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= +"strip-bom@^3.0.0": + "integrity" "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" + "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + "version" "3.0.0" -strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "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== +"strip-json-comments@^3.1.0", "strip-json-comments@^3.1.1", "strip-json-comments@3.1.1": + "integrity" "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + "version" "3.1.1" -strnum@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" - integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== +"strnum@^1.0.4": + "integrity" "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + "resolved" "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz" + "version" "1.0.5" -supports-color@8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" +"supports-color@^0.2.0": + "integrity" "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo= sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" + "version" "0.2.0" -supports-color@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" - integrity sha1-2S3iaU6z9nMjlz1649i1W0wiGQo= +"supports-color@^5.3.0": + "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + "version" "5.5.0" + dependencies: + "has-flag" "^3.0.0" -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== +"supports-color@^7.1.0", "supports-color@^7.2.0": + "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + "version" "7.2.0" dependencies: - has-flag "^3.0.0" + "has-flag" "^4.0.0" -supports-color@^7.1.0, supports-color@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== +"supports-color@8.1.1": + "integrity" "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + "version" "8.1.1" dependencies: - has-flag "^4.0.0" + "has-flag" "^4.0.0" -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +"text-table@^0.2.0": + "integrity" "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + "version" "0.2.0" -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" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== +"to-regex-range@^5.0.1": + "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" + "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + "version" "5.0.1" dependencies: - is-number "^7.0.0" + "is-number" "^7.0.0" "traverse@>=0.3.0 <0.4": - version "0.3.9" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" - integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= + "integrity" "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==" + "resolved" "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz" + "version" "0.3.9" -treeify@^1.0.1, treeify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" - integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== +"treeify@^1.0.1", "treeify@^1.1.0": + "integrity" "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==" + "resolved" "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz" + "version" "1.1.0" -ts-unused-exports@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/ts-unused-exports/-/ts-unused-exports-8.0.0.tgz#6dd15ff26286e0b7e5663cda3b98c77ea6f3ffe7" - integrity sha512-gylHFyJqC80PSb4zy35KTckykEW1vmKjnOHjBeX9iKBo4b/SzqQIcXXbYSuif4YMgNm6ewFF62VM1C9z0bGZPw== +"ts-unused-exports@^8.0.0": + "integrity" "sha512-gylHFyJqC80PSb4zy35KTckykEW1vmKjnOHjBeX9iKBo4b/SzqQIcXXbYSuif4YMgNm6ewFF62VM1C9z0bGZPw==" + "resolved" "https://registry.npmjs.org/ts-unused-exports/-/ts-unused-exports-8.0.0.tgz" + "version" "8.0.0" dependencies: - chalk "^4.0.0" - tsconfig-paths "^3.9.0" + "chalk" "^4.0.0" + "tsconfig-paths" "^3.9.0" -tsconfig-paths@^3.9.0: - version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== +"tsconfig-paths@^3.9.0": + "integrity" "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==" + "resolved" "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz" + "version" "3.14.1" dependencies: "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -typescript@4.6.3: - version "4.6.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" - integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== - -unzipper@^0.10.11: - version "0.10.11" - resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.11.tgz#0b4991446472cbdb92ee7403909f26c2419c782e" - integrity sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw== - dependencies: - big-integer "^1.6.17" - binary "~0.3.0" - bluebird "~3.4.1" - buffer-indexof-polyfill "~1.0.0" - duplexer2 "~0.1.4" - fstream "^1.0.12" - graceful-fs "^4.2.2" - listenercount "~1.0.1" - readable-stream "~2.3.6" - setimmediate "~1.0.4" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util-extend@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" - integrity sha1-p8IW0mdUUWljeztu3GypEZ4v+T8= - -v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - -vscode-uri@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.6.tgz#5e6e2e1a4170543af30151b561a41f71db1d6f91" - integrity sha512-fmL7V1eiDBFRRnu+gfRWTzyPpNIHJTc4mWnFkwBUmO9U3KPgJAmTx7oxi2bl/Rh6HLdU7+4C9wlj0k2E4AdKFQ== - -which@2.0.2, which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -word-wrap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -workerpool@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" - integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -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== - -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-unparser@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + "json5" "^1.0.1" + "minimist" "^1.2.6" + "strip-bom" "^3.0.0" + +"tslib@^1.8.1": + "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + "version" "1.14.1" + +"tsutils@^3.21.0": + "integrity" "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==" + "resolved" "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + "version" "3.21.0" + dependencies: + "tslib" "^1.8.1" + +"type-check@^0.4.0", "type-check@~0.4.0": + "integrity" "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==" + "resolved" "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + "version" "0.4.0" + dependencies: + "prelude-ls" "^1.2.1" + +"type-detect@^4.0.0", "type-detect@^4.0.5", "type-detect@^4.0.8", "type-detect@4.0.8": + "integrity" "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + "resolved" "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + "version" "4.0.8" + +"type-fest@^0.20.2": + "integrity" "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + "version" "0.20.2" + +"typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", "typescript@>=3.8.3", "typescript@4.6.3": + "integrity" "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==" + "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz" + "version" "4.6.3" + +"unzipper@^0.10.11": + "integrity" "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==" + "resolved" "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz" + "version" "0.10.11" + dependencies: + "big-integer" "^1.6.17" + "binary" "~0.3.0" + "bluebird" "~3.4.1" + "buffer-indexof-polyfill" "~1.0.0" + "duplexer2" "~0.1.4" + "fstream" "^1.0.12" + "graceful-fs" "^4.2.2" + "listenercount" "~1.0.1" + "readable-stream" "~2.3.6" + "setimmediate" "~1.0.4" + +"uri-js@^4.2.2": + "integrity" "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==" + "resolved" "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + "version" "4.4.1" + dependencies: + "punycode" "^2.1.0" + +"util-deprecate@~1.0.1": + "integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "version" "1.0.2" + +"util-extend@^1.0.1": + "integrity" "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8= sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA==" + "resolved" "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz" + "version" "1.0.3" + +"v8-compile-cache@^2.0.3": + "integrity" "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + "resolved" "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" + "version" "2.3.0" + +"vscode-uri@^3.0.6": + "integrity" "sha512-fmL7V1eiDBFRRnu+gfRWTzyPpNIHJTc4mWnFkwBUmO9U3KPgJAmTx7oxi2bl/Rh6HLdU7+4C9wlj0k2E4AdKFQ==" + "resolved" "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.6.tgz" + "version" "3.0.6" + +"which@^2.0.1", "which@2.0.2": + "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" + "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + "version" "2.0.2" + dependencies: + "isexe" "^2.0.0" + +"wide-align@1.1.3": + "integrity" "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==" + "resolved" "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz" + "version" "1.1.3" + dependencies: + "string-width" "^1.0.2 || 2" + +"word-wrap@^1.2.3": + "integrity" "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + "resolved" "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + "version" "1.2.3" + +"workerpool@6.1.0": + "integrity" "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==" + "resolved" "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz" + "version" "6.1.0" + +"wrap-ansi@^7.0.0": + "integrity" "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==" + "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + "version" "7.0.0" + dependencies: + "ansi-styles" "^4.0.0" + "string-width" "^4.1.0" + "strip-ansi" "^6.0.0" + +"wrappy@1": + "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + "version" "1.0.2" + +"y18n@^5.0.5": + "integrity" "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + "resolved" "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + "version" "5.0.8" + +"yallist@^4.0.0": + "integrity" "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "resolved" "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + "version" "4.0.0" + +"yargs-parser@^20.2.2", "yargs-parser@20.2.4": + "integrity" "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" + "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" + "version" "20.2.4" + +"yargs-unparser@2.0.0": + "integrity" "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==" + "resolved" "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "camelcase" "^6.0.0" + "decamelize" "^4.0.0" + "flat" "^5.0.2" + "is-plain-obj" "^2.1.0" + +"yargs@16.2.0": + "integrity" "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==" + "resolved" "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + "version" "16.2.0" + dependencies: + "cliui" "^7.0.2" + "escalade" "^3.1.1" + "get-caller-file" "^2.0.5" + "require-directory" "^2.1.1" + "string-width" "^4.2.0" + "y18n" "^5.0.5" + "yargs-parser" "^20.2.2" + +"yocto-queue@^0.1.0": + "integrity" "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + "resolved" "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + "version" "0.1.0" From df9608b9b9c204c50a4e194a7fc783670913024c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 11 Nov 2022 09:52:37 +0000 Subject: [PATCH 04/84] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/core/commandRunner/CommandRunner.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/commandRunner/CommandRunner.ts b/src/core/commandRunner/CommandRunner.ts index 5f81c1316b..dcc82a9dea 100644 --- a/src/core/commandRunner/CommandRunner.ts +++ b/src/core/commandRunner/CommandRunner.ts @@ -9,12 +9,12 @@ import { Target } from "../../typings/target.types"; import { Graph, ProcessedTargetsContext, - SelectionWithEditor + SelectionWithEditor, } from "../../typings/Types"; import { isString } from "../../util/type"; import { canonicalizeAndValidateCommand, - checkForOldInference + checkForOldInference, } from "../commandVersionUpgrades/canonicalizeAndValidateCommand"; import { PartialTargetV0V1 } from "../commandVersionUpgrades/upgradeV1ToV2/commandV1.types"; import inferFullTargets from "../inferFullTargets"; From 66d177ccdcc1b69131b6775e8d12cdfb6d4233c4 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Fri, 11 Nov 2022 14:54:23 +0100 Subject: [PATCH 05/84] more changes --- package.json | 8 +- .../GenerateSnippet/GenerateSnippet.ts | 10 +- src/actions/Wrap.ts | 3 +- src/core/Debug.ts | 2 +- .../commandRunner/selectionToThatTarget.ts | 3 +- src/core/updateSelections/RangeUpdater.ts | 2 +- src/core/updateSelections/updateSelections.ts | 15 +-- .../vscode/VscodeEditableTextEditorImpl.ts | 66 +++++++++++ src/ide/vscode/VscodeFocusEditor.ts | 99 ++++++++++++++++ src/ide/vscode/VscodeIDE.ts | 6 +- ...tDocument.ts => VscodeTextDocumentImpl.ts} | 24 +++- src/ide/vscode/VscodeTextEditor.ts | 23 ---- src/ide/vscode/VscodeTextEditorImpl.ts | 30 +++++ src/ide/vscode/VscodeUtil.ts | 26 +++++ src/languages/getTextFragmentExtractor.ts | 2 +- src/languages/markdown.ts | 20 ++-- src/libs/common/ide/Location.ts | 8 +- src/libs/common/ide/Position.ts | 44 +++++++ src/libs/common/ide/Range.ts | 91 +++++++++++++++ src/libs/common/ide/fake/FakeIDE.ts | 2 + src/libs/common/ide/spy/SpyIDE.ts | 5 + src/libs/common/ide/types/TextDocument.ts | 7 +- src/libs/common/ide/types/TextEditor.ts | 63 ++++++++-- src/libs/common/ide/types/TextEditorEdit.ts | 44 +++++++ src/libs/common/ide/types/ide.types.ts | 7 +- src/processTargets/marks/CursorStage.ts | 3 +- .../modifiers/EveryScopeStage.ts | 2 +- src/processTargets/modifiers/HeadTailStage.ts | 2 +- .../modifiers/ItemStage/getIterationScope.ts | 3 +- .../modifiers/RelativeInclusiveScopeStage.ts | 3 +- .../modifiers/getContainingScope.ts | 3 +- .../modifiers/relativeScopeLegacy.ts | 2 +- .../scopeHandlers/BaseScopeHandler.ts | 4 +- .../scopeHandlers/DocumentScopeHandler.ts | 6 +- .../scopeHandlers/compareTargetScopes.ts | 3 +- .../getScopeRelativeToPosition.ts | 3 +- .../getScopesOverlappingRange.ts | 3 +- .../modifiers/scopeHandlers/scope.types.ts | 3 +- .../scopeHandlers/scopeHandler.types.ts | 3 +- .../scopeHandlers/shouldYieldScope.ts | 2 +- .../ContainingSyntaxScopeStage.ts | 3 +- .../modifiers/scopeTypeStages/RegexStage.ts | 4 +- ...ractSelectionFromSurroundingPairOffsets.ts | 4 +- .../findSurroundingPairParseTreeBased.ts | 4 +- .../findSurroundingPairTextBased.ts | 7 +- .../modifiers/surroundingPair/index.ts | 5 +- .../modifiers/toPositionTarget.ts | 2 +- src/processTargets/processTargets.ts | 2 +- .../targetUtil/createContinuousRange.ts | 3 +- ...limitedSequenceInsertionRemovalBehavior.ts | 2 +- .../TokenInsertionRemovalBehavior.ts | 10 +- .../insertionRemovalBehavior.types.ts | 4 +- src/processTargets/targets/BaseTarget.ts | 7 +- src/processTargets/targets/DocumentTarget.ts | 2 +- src/processTargets/targets/InteriorTarget.ts | 2 +- src/processTargets/targets/LineTarget.ts | 4 +- .../targets/NotebookCellTarget.ts | 2 +- src/processTargets/targets/ParagraphTarget.ts | 6 +- src/processTargets/targets/PositionTarget.ts | 3 +- src/processTargets/targets/ScopeTypeTarget.ts | 2 +- .../targets/SubTokenWordTarget.ts | 2 +- .../targets/SurroundingPairTarget.ts | 2 +- src/processTargets/targets/TokenTarget.ts | 2 +- src/processTargets/targets/UntypedTarget.ts | 2 +- src/testUtil/TestCaseRecorder.ts | 14 ++- src/typings/Types.ts | 8 +- src/typings/target.types.ts | 4 +- src/typings/updateSelections.ts | 4 +- src/util/nodeFinders.ts | 3 +- src/util/nodeSelectors.ts | 5 +- src/util/performDocumentEdits.ts | 2 +- src/util/rangeUtils.ts | 21 +--- src/util/selectionUtils.ts | 21 +--- src/util/setSelectionsAndFocusEditor.ts | 110 ++---------------- src/util/targetUtils.ts | 4 +- src/util/tryConstructTarget.ts | 3 +- yarn.lock | 10 ++ 77 files changed, 667 insertions(+), 283 deletions(-) create mode 100644 src/ide/vscode/VscodeEditableTextEditorImpl.ts create mode 100644 src/ide/vscode/VscodeFocusEditor.ts rename src/ide/vscode/{VscodeTextDocument.ts => VscodeTextDocumentImpl.ts} (70%) delete mode 100644 src/ide/vscode/VscodeTextEditor.ts create mode 100644 src/ide/vscode/VscodeTextEditorImpl.ts create mode 100644 src/libs/common/ide/types/TextEditorEdit.ts diff --git a/package.json b/package.json index 465d9305bc..1e3b032038 100644 --- a/package.json +++ b/package.json @@ -590,18 +590,20 @@ "@types/chai": "^4.3.3", "@types/glob": "^7.1.3", "@types/js-yaml": "^4.0.2", + "@types/lodash": "^4.14.168", "@types/mocha": "^8.0.4", "@types/node": "^16.11.3", "@types/semver": "^7.3.9", "@types/sinon": "^10.0.2", + "@types/uuid": "^8.3.4", "@types/vscode": "~1.61.0", "@typescript-eslint/eslint-plugin": "^5.20.0", "@typescript-eslint/parser": "^5.20.0", "@vscode/test-electron": "^2.1.3", "chai": "^4.3.6", "esbuild": "^0.11.12", - "eslint": "^8.13.0", "eslint-config-prettier": "^8.5.0", + "eslint": "^8.13.0", "fast-xml-parser": "^3.20.0", "glob": "^7.1.7", "js-yaml": "^4.1.0", @@ -615,12 +617,12 @@ "typescript": "4.6.3" }, "dependencies": { - "@types/lodash": "^4.14.168", "immer": "^9.0.15", "immutability-helper": "^3.1.1", "itertools": "^1.7.1", "lodash": "^4.17.21", "node-html-parser": "^5.3.3", + "uuid": "^9.0.0", "vscode-uri": "^3.0.6" } -} +} \ No newline at end of file diff --git a/src/actions/GenerateSnippet/GenerateSnippet.ts b/src/actions/GenerateSnippet/GenerateSnippet.ts index 4b2c9e4584..abb125ceb5 100644 --- a/src/actions/GenerateSnippet/GenerateSnippet.ts +++ b/src/actions/GenerateSnippet/GenerateSnippet.ts @@ -1,17 +1,15 @@ import { ensureSingleTarget } from "../../util/targetUtils"; - -import { commands, Range, window } from "vscode"; +import { commands, window } from "vscode"; import { Offsets } from "../../processTargets/modifiers/surroundingPair/types"; import isTesting from "../../testUtil/isTesting"; import { Target } from "../../typings/target.types"; import { Graph } from "../../typings/Types"; -import { getDocumentRange } from "../../util/rangeUtils"; -import { selectionFromRange } from "../../util/selectionUtils"; import { Action, ActionReturnValue } from "../actions.types"; import { constructSnippetBody } from "./constructSnippetBody"; import { editText } from "./editText"; import { openNewSnippetFile } from "./openNewSnippetFile"; import Substituter from "./Substituter"; +import Range from "../../libs/common/ide/Range"; /** * This action can be used to automatically create a snippet from a target. Any @@ -214,9 +212,7 @@ export default class GenerateSnippet implements Action { if (isTesting()) { // If we're testing, we just overwrite the current document - editor.selections = [ - selectionFromRange(false, getDocumentRange(editor.document)), - ]; + editor.selections = [editor.document.range.toSelection(false)]; } else { // Otherwise, we create and open a new document for the snippet in the // user snippets dir diff --git a/src/actions/Wrap.ts b/src/actions/Wrap.ts index d8551cee06..138014a7a7 100644 --- a/src/actions/Wrap.ts +++ b/src/actions/Wrap.ts @@ -1,8 +1,9 @@ -import { DecorationRangeBehavior, Selection } from "vscode"; +import { DecorationRangeBehavior } from "vscode"; import { getSelectionInfo, performEditsAndUpdateFullSelectionInfos, } from "../core/updateSelections/updateSelections"; +import Selection from "../libs/common/ide/Selection"; import { Target } from "../typings/target.types"; import { Edit, Graph } from "../typings/Types"; import { FullSelectionInfo } from "../typings/updateSelections"; diff --git a/src/core/Debug.ts b/src/core/Debug.ts index 36418cb8ac..5b5ebbecf6 100644 --- a/src/core/Debug.ts +++ b/src/core/Debug.ts @@ -1,11 +1,11 @@ import { Disposable, - Location, TextEditorSelectionChangeEvent, window, workspace, } from "vscode"; import { SyntaxNode, TreeCursor } from "web-tree-sitter"; +import Location from "../libs/common/ide/Location"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Graph } from "../typings/Types"; diff --git a/src/core/commandRunner/selectionToThatTarget.ts b/src/core/commandRunner/selectionToThatTarget.ts index 7c41c01ad0..52e1cccc1d 100644 --- a/src/core/commandRunner/selectionToThatTarget.ts +++ b/src/core/commandRunner/selectionToThatTarget.ts @@ -1,6 +1,5 @@ import { UntypedTarget } from "../../processTargets/targets"; import { SelectionWithEditor } from "../../typings/Types"; -import { isReversed } from "../../util/selectionUtils"; /** * Given a selection with an editor, constructs an appropriate `Target` to use @@ -13,7 +12,7 @@ import { isReversed } from "../../util/selectionUtils"; export const selectionToThatTarget = (selection: SelectionWithEditor) => new UntypedTarget({ editor: selection.editor, - isReversed: isReversed(selection.selection), + isReversed: selection.selection.isReversed, contentRange: selection.selection, hasExplicitRange: !selection.selection.isEmpty, }); diff --git a/src/core/updateSelections/RangeUpdater.ts b/src/core/updateSelections/RangeUpdater.ts index 678ff97844..2fb22c0a52 100644 --- a/src/core/updateSelections/RangeUpdater.ts +++ b/src/core/updateSelections/RangeUpdater.ts @@ -1,11 +1,11 @@ import { pull } from "lodash"; import { workspace, - TextDocument, TextDocumentChangeEvent, Disposable, TextDocumentContentChangeEvent, } from "vscode"; +import TextDocument from "../../libs/common/ide/types/TextDocument"; import { Edit } from "../../typings/Types"; import { ExtendedTextDocumentChangeEvent, diff --git a/src/core/updateSelections/updateSelections.ts b/src/core/updateSelections/updateSelections.ts index 3701f190c5..5827d02844 100644 --- a/src/core/updateSelections/updateSelections.ts +++ b/src/core/updateSelections/updateSelections.ts @@ -1,18 +1,15 @@ import { flatten } from "lodash"; -import { - DecorationRangeBehavior, - Range, - Selection, - TextDocument, - TextEditor, -} from "vscode"; +import { DecorationRangeBehavior } from "vscode"; +import Range from "../../libs/common/ide/Range"; +import Selection from "../../libs/common/ide/Selection"; +import TextDocument from "../../libs/common/ide/types/TextDocument"; +import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import { Edit } from "../../typings/Types"; import { FullSelectionInfo, SelectionInfo, } from "../../typings/updateSelections"; import { performDocumentEdits } from "../../util/performDocumentEdits"; -import { isForward } from "../../util/selectionUtils"; import { RangeUpdater } from "./RangeUpdater"; interface SelectionsWithBehavior { @@ -37,7 +34,7 @@ export function getSelectionInfo( return getSelectionInfoInternal( document, selection, - isForward(selection), + !selection.isReversed, rangeBehavior, ); } diff --git a/src/ide/vscode/VscodeEditableTextEditorImpl.ts b/src/ide/vscode/VscodeEditableTextEditorImpl.ts new file mode 100644 index 0000000000..29dcbd6ea9 --- /dev/null +++ b/src/ide/vscode/VscodeEditableTextEditorImpl.ts @@ -0,0 +1,66 @@ +import * as vscode from "vscode"; +import type Position from "../../libs/common/ide/Position"; +import type Range from "../../libs/common/ide/Range"; +import type Selection from "../../libs/common/ide/Selection"; +import type { EndOfLine } from "../../libs/common/ide/types/ide.types"; +import type { EditableTextEditor } from "../../libs/common/ide/types/TextEditor"; +import type TextEditorEdit from "../../libs/common/ide/types/TextEditorEdit"; +import { focusVscodeEditor } from "./VscodeFocusEditor"; +import VscodeTextEditorImpl from "./VscodeTextEditorImpl"; +import { + toVscodeEndOfLine, + toVscodePosition, + toVscodeRange, + toVscodeSelection, +} from "./VscodeUtil"; + +export default class VscodeEditableTextEditorImpl + extends VscodeTextEditorImpl + implements EditableTextEditor +{ + constructor(editor: vscode.TextEditor) { + super(editor); + } + + set selections(selections: Selection[]) { + this.editor.selections = selections.map(toVscodeSelection); + } + + public revealRange(range: Range): void { + this.editor.revealRange(toVscodeRange(range)); + } + + public focus(): Promise { + return focusVscodeEditor(this.editor, this.id); + } + + public edit( + callback: (editBuilder: TextEditorEdit) => void, + options?: { undoStopBefore: boolean; undoStopAfter: boolean }, + ): Thenable { + return this.editor.edit((editBuilder) => { + callback({ + replace: (location, value) => { + editBuilder.replace(toVscodeRangeOrPosition(location), value); + }, + insert: (location: Position, value: string) => { + editBuilder.insert(toVscodePosition(location), value); + }, + delete: (location: Range | Selection) => { + return editBuilder.delete(toVscodeRange(location)); + }, + setEndOfLine: (endOfLine: EndOfLine) => { + return editBuilder.setEndOfLine(toVscodeEndOfLine(endOfLine)); + }, + }); + }, options); + } +} + +function toVscodeRangeOrPosition( + location: Position | Range, +): vscode.Position | vscode.Range { + return "start" in location + ? toVscodeRange(location) + : toVscodePosition(location); +} diff --git a/src/ide/vscode/VscodeFocusEditor.ts b/src/ide/vscode/VscodeFocusEditor.ts new file mode 100644 index 0000000000..69b9ce0878 --- /dev/null +++ b/src/ide/vscode/VscodeFocusEditor.ts @@ -0,0 +1,99 @@ +import * as semver from "semver"; +import { + commands, + NotebookDocument, + TextEditor, + version, + ViewColumn, + window, +} from "vscode"; +import ide from "../../libs/cursorless-engine/singletons/ide.singleton"; +import { getCellIndex } from "../../libs/vscode-common/notebook"; +import { getNotebookFromCellDocument } from "../../util/notebook"; +import { + focusNotebookCellLegacy, + isVscodeLegacyNotebookVersion, +} from "../../util/notebookLegacy"; + +const columnFocusCommands = { + [ViewColumn.One]: "workbench.action.focusFirstEditorGroup", + [ViewColumn.Two]: "workbench.action.focusSecondEditorGroup", + [ViewColumn.Three]: "workbench.action.focusThirdEditorGroup", + [ViewColumn.Four]: "workbench.action.focusFourthEditorGroup", + [ViewColumn.Five]: "workbench.action.focusFifthEditorGroup", + [ViewColumn.Six]: "workbench.action.focusSixthEditorGroup", + [ViewColumn.Seven]: "workbench.action.focusSeventhEditorGroup", + [ViewColumn.Eight]: "workbench.action.focusEighthEditorGroup", + [ViewColumn.Nine]: "workbench.action.focusNinthEditorGroup", + [ViewColumn.Active]: "", + [ViewColumn.Beside]: "", +}; + +export async function focusVscodeEditor(editor: TextEditor, editorId: string) { + const viewColumn = getViewColumn(editor); + if (viewColumn != null) { + await commands.executeCommand(columnFocusCommands[viewColumn]); + } else { + // If the view column is null we see if it's a notebook and try to see if we + // can just move around in the notebook to focus the correct editor + + if (isVscodeLegacyNotebookVersion()) { + return await focusNotebookCellLegacy(editor); + } + + await focusNotebookCell(editor, editorId); + } +} + +function getViewColumn(editor: TextEditor): ViewColumn | undefined { + if (editor.viewColumn != null) { + return editor.viewColumn; + } + // TODO: tabGroups is not available on older versions of vscode we still support. + // Remove any cast as soon as version is updated. + if (semver.lt(version, "1.67.0")) { + return undefined; + } + const uri = editor.document.uri.toString(); + const tabGroup = (window as any)?.tabGroups?.all?.find((tabGroup: any) => + tabGroup?.tabs.find((tab: any) => tab?.input?.modified?.toString() === uri), + ); + return tabGroup?.viewColumn; +} + +async function focusNotebookCell(editor: TextEditor, editorId: string) { + const desiredNotebookEditor = getNotebookFromCellDocument(editor.document); + if (desiredNotebookEditor == null) { + throw new Error("Couldn't find notebook editor for given document"); + } + + const desiredNotebookDocument: NotebookDocument = + desiredNotebookEditor.notebook; + + await commands.executeCommand( + columnFocusCommands[ + desiredNotebookEditor.viewColumn as keyof typeof columnFocusCommands + ], + ); + + const desiredEditorIndex = getCellIndex( + desiredNotebookDocument, + editor.document, + ); + + const desiredSelections = [ + desiredNotebookEditor.selection.with({ + start: desiredEditorIndex, + end: desiredEditorIndex + 1, + }), + ]; + desiredNotebookEditor.selections = desiredSelections; + desiredNotebookEditor.revealRange(desiredSelections[0]); + + // Issue a command to tell VSCode to focus the cell input editor + // NB: We don't issue the command if it's already focused, because it turns + // out that this command is actually a toggle, so that causes it to de-focus! + if (ide().activeTextEditor?.id !== editorId) { + await commands.executeCommand("notebook.cell.edit"); + } +} diff --git a/src/ide/vscode/VscodeIDE.ts b/src/ide/vscode/VscodeIDE.ts index 72e4af2874..447246c751 100644 --- a/src/ide/vscode/VscodeIDE.ts +++ b/src/ide/vscode/VscodeIDE.ts @@ -11,12 +11,12 @@ import { IDE, RunMode, } from "../../libs/common/ide/types/ide.types"; -import type TextEditor from "../../libs/common/ide/types/TextEditor"; +import type { TextEditor } from "../../libs/common/ide/types/TextEditor"; import VscodeClipboard from "./VscodeClipboard"; import VscodeConfiguration from "./VscodeConfiguration"; import VscodeGlobalState from "./VscodeGlobalState"; import VscodeMessages from "./VscodeMessages"; -import VscodeTextEditor from "./VscodeTextEditor"; +import VscodeTextEditorImpl from "./VscodeTextEditorImpl"; const EXTENSION_MODE_MAP: Record = { [ExtensionMode.Development]: "development", @@ -51,7 +51,7 @@ export default class VscodeIDE implements IDE { get activeTextEditor(): TextEditor | undefined { return window.activeTextEditor != null - ? new VscodeTextEditor(window.activeTextEditor) + ? new VscodeTextEditorImpl(window.activeTextEditor) : undefined; } diff --git a/src/ide/vscode/VscodeTextDocument.ts b/src/ide/vscode/VscodeTextDocumentImpl.ts similarity index 70% rename from src/ide/vscode/VscodeTextDocument.ts rename to src/ide/vscode/VscodeTextDocumentImpl.ts index 2899fcd424..dd8a6b54a8 100644 --- a/src/ide/vscode/VscodeTextDocument.ts +++ b/src/ide/vscode/VscodeTextDocumentImpl.ts @@ -4,9 +4,13 @@ import Position from "../../libs/common/ide/Position"; import Range from "../../libs/common/ide/Range"; import TextDocument from "../../libs/common/ide/types/TextDocument"; import TextLine from "../../libs/common/ide/types/TextLine"; -import { toVscodePosition, toVscodeRange } from "./VscodeUtil"; +import { + fromVscodeTextLine, + toVscodePosition, + toVscodeRange, +} from "./VscodeUtil"; -export default class VscodeTextDocument implements TextDocument { +export default class VscodeTextDocumentImpl implements TextDocument { get uri(): URI { return this.document.uri; } @@ -15,18 +19,26 @@ export default class VscodeTextDocument implements TextDocument { return this.document.languageId; } - constructor(private document: vscode.TextDocument) {} + get lineCount(): number { + return this.document.lineCount; + } - getRange(): Range { + get range(): Range { return new Range( new Position(0, 0), this.document.lineAt(this.document.lineCount - 1).range.end, ); } + constructor(private document: vscode.TextDocument) {} + lineAt(lineOrPosition: number | Position): TextLine { - return this.document.lineAt( - typeof lineOrPosition === "number" ? lineOrPosition : lineOrPosition.line, + return fromVscodeTextLine( + this.document.lineAt( + typeof lineOrPosition === "number" + ? lineOrPosition + : lineOrPosition.line, + ), ); } diff --git a/src/ide/vscode/VscodeTextEditor.ts b/src/ide/vscode/VscodeTextEditor.ts deleted file mode 100644 index bd454bf4b3..0000000000 --- a/src/ide/vscode/VscodeTextEditor.ts +++ /dev/null @@ -1,23 +0,0 @@ -import * as vscode from "vscode"; -import Range from "../../libs/common/ide/Range"; -import Selection from "../../libs/common/ide/Selection"; -import type TextDocument from "../../libs/common/ide/types/TextDocument"; -import type TextEditor from "../../libs/common/ide/types/TextEditor"; -import VscodeTextDocument from "./VscodeTextDocument"; -import { fromVscodeRange, fromVscodeSelection } from "./VscodeUtil"; - -export default class VscodeTextEditor implements TextEditor { - readonly document: TextDocument; - - constructor(private editor: vscode.TextEditor) { - this.document = new VscodeTextDocument(editor.document); - } - - get selections(): Selection[] { - return this.editor.selections.map(fromVscodeSelection); - } - - get visibleRanges(): Range[] { - return this.editor.visibleRanges.map(fromVscodeRange); - } -} diff --git a/src/ide/vscode/VscodeTextEditorImpl.ts b/src/ide/vscode/VscodeTextEditorImpl.ts new file mode 100644 index 0000000000..b2265911b0 --- /dev/null +++ b/src/ide/vscode/VscodeTextEditorImpl.ts @@ -0,0 +1,30 @@ +import { v4 as uuid } from "uuid"; +import * as vscode from "vscode"; +import type Range from "../../libs/common/ide/Range"; +import type Selection from "../../libs/common/ide/Selection"; +import type TextDocument from "../../libs/common/ide/types/TextDocument"; +import type { TextEditor } from "../../libs/common/ide/types/TextEditor"; +import VscodeTextDocumentImpl from "./VscodeTextDocumentImpl"; +import { fromVscodeRange, fromVscodeSelection } from "./VscodeUtil"; + +export default class VscodeTextEditorImpl implements TextEditor { + readonly id: string; + readonly document: TextDocument; + + constructor(protected editor: vscode.TextEditor) { + this.id = uuid(); + this.document = new VscodeTextDocumentImpl(editor.document); + } + + get selections(): Selection[] { + return this.editor.selections.map(fromVscodeSelection); + } + + get visibleRanges(): Range[] { + return this.editor.visibleRanges.map(fromVscodeRange); + } + + public isEqual(other: TextEditor): boolean { + return this.id === other.id; + } +} diff --git a/src/ide/vscode/VscodeUtil.ts b/src/ide/vscode/VscodeUtil.ts index e9c7540afc..481681f950 100644 --- a/src/ide/vscode/VscodeUtil.ts +++ b/src/ide/vscode/VscodeUtil.ts @@ -2,6 +2,8 @@ import * as vscode from "vscode"; import Position from "../../libs/common/ide/Position"; import Range from "../../libs/common/ide/Range"; import Selection from "../../libs/common/ide/Selection"; +import { EndOfLine } from "../../libs/common/ide/types/ide.types"; +import TextLine from "../../libs/common/ide/types/TextLine"; export function toVscodeRange(range: Range): vscode.Range { return new vscode.Range( @@ -46,3 +48,27 @@ export function toVscodePosition(position: Position): vscode.Position { export function fromVscodePosition(position: vscode.Position): Position { return new Position(position.line, position.character); } + +export function toVscodeTextLine(line: TextLine): vscode.TextLine { + return { + ...line, + range: toVscodeRange(line.range), + rangeIncludingLineBreak: toVscodeRange(line.rangeIncludingLineBreak), + }; +} + +export function fromVscodeTextLine(line: vscode.TextLine): TextLine { + return { + ...line, + range: fromVscodeRange(line.range), + rangeIncludingLineBreak: fromVscodeRange(line.rangeIncludingLineBreak), + }; +} + +export function toVscodeEndOfLine(eol: EndOfLine): vscode.EndOfLine { + return eol === "LF" ? vscode.EndOfLine.LF : vscode.EndOfLine.CRLF; +} + +export function fromVscodeAndOfLine(eol: vscode.EndOfLine): EndOfLine { + return eol === vscode.EndOfLine.LF ? "LF" : "CRLF"; +} diff --git a/src/languages/getTextFragmentExtractor.ts b/src/languages/getTextFragmentExtractor.ts index bdcee7c9e0..764f150a4e 100644 --- a/src/languages/getTextFragmentExtractor.ts +++ b/src/languages/getTextFragmentExtractor.ts @@ -7,11 +7,11 @@ import { stringTextFragmentExtractor as rubyStringTextFragmentExtractor } from " import { stringTextFragmentExtractor as typescriptStringTextFragmentExtractor } from "./typescript"; import { stringTextFragmentExtractor as scssStringTextFragmentExtractor } from "./scss"; import { UnsupportedLanguageError } from "../errors"; -import { Range } from "vscode"; import { SupportedLanguageId } from "../libs/cursorless-engine/languages/constants"; import { getNodeInternalRange, getNodeRange } from "../util/nodeSelectors"; import { getNodeMatcher } from "./getNodeMatcher"; import { notSupported } from "../util/nodeMatchers"; +import Range from "../libs/common/ide/Range"; export type TextFragmentExtractor = ( node: SyntaxNode, diff --git a/src/languages/markdown.ts b/src/languages/markdown.ts index b8fcb3cf0c..ea9364514c 100644 --- a/src/languages/markdown.ts +++ b/src/languages/markdown.ts @@ -1,4 +1,3 @@ -import { Range, Selection, TextEditor } from "vscode"; import { SyntaxNode } from "web-tree-sitter"; import { SimpleScopeTypeType } from "../typings/targetDescriptor.types"; import { @@ -14,11 +13,10 @@ import { selectWithLeadingDelimiter, } from "../util/nodeSelectors"; import { getMatchesInRange } from "../apps/cursorless-vscode/getMatchesInRange"; -import { - isReversed, - selectionFromRange, - shrinkRangeToFitContent, -} from "../util/selectionUtils"; +import Selection from "../libs/common/ide/Selection"; +import { TextEditor } from "../libs/common/ide/types/TextEditor"; +import Range from "../libs/common/ide/Range"; +import { shrinkRangeToFitContent } from "../util/selectionUtils"; /** * Given a node representing the text of a section heading (without leading @@ -90,9 +88,8 @@ function sectionExtractor(editor: TextEditor, node: SyntaxNode) { ); return { context, - selection: selectionFromRange( - isReversed(selection), - shrinkRangeToFitContent(editor, selection), + selection: shrinkRangeToFitContent(editor, selection).toSelection( + selection.isReversed, ), }; } @@ -126,9 +123,8 @@ function itemExtractor(editor: TextEditor, node: SyntaxNode) { return { context, - selection: selectionFromRange( - isReversed(selection), - excludeTrailingNewline(editor, selection), + selection: excludeTrailingNewline(editor, selection).toSelection( + selection.isReversed, ), }; } diff --git a/src/libs/common/ide/Location.ts b/src/libs/common/ide/Location.ts index 150594b2c0..e5ddb1ac59 100644 --- a/src/libs/common/ide/Location.ts +++ b/src/libs/common/ide/Location.ts @@ -1,5 +1,5 @@ -import { URI } from "vscode-uri"; -import Position from "./Position"; +import type { URI } from "vscode-uri"; +import type Position from "./Position"; import Range from "./Range"; /** @@ -10,12 +10,12 @@ export default class Location { /** * The resource identifier of this location. */ - uri: URI; + readonly uri: URI; /** * The document range of this location. */ - range: Range; + readonly range: Range; /** * Creates a new location object. diff --git a/src/libs/common/ide/Position.ts b/src/libs/common/ide/Position.ts index 1a175b7654..224ec86e1d 100644 --- a/src/libs/common/ide/Position.ts +++ b/src/libs/common/ide/Position.ts @@ -84,4 +84,48 @@ export default class Position { public isAfterOrEqual(other: Position): boolean { return this.isEqual(other) || this.isAfter(other); } + + /** + * Compare this to `other`. + * + * @param other A position. + * @return A number smaller than zero if this position is before the given position, + * a number greater than zero if this position is after the given position, or zero when + * this and the given position are equal. + */ + public compareTo(other: Position): number { + if (this.isBefore(other)) { + return -1; + } + if (this.isAfter(other)) { + return 1; + } + return 0; + } + + /** + * Create a new position derived from this position. + * + * @param line Value that should be used as line value, default is the {@link Position.line existing value} + * @param character Value that should be used as character value, default is the {@link Position.character existing value} + * @return A position where line and character are replaced by the given values. + */ + public with(line?: number, character?: number): Position { + return new Position(line ?? this.line, character ?? this.character); + } + + /** + * Create a new position relative to this position. + * + * @param lineDelta Delta value for the line value, default is `0`. + * @param characterDelta Delta value for the character value, default is `0`. + * @return A position which line and character is the sum of the current line and + * character and the corresponding deltas. + */ + public translate(lineDelta?: number, characterDelta?: number): Position { + return new Position( + this.line + (lineDelta ?? 0), + this.character + (characterDelta ?? 0), + ); + } } diff --git a/src/libs/common/ide/Range.ts b/src/libs/common/ide/Range.ts index 1246af2315..f32256083d 100644 --- a/src/libs/common/ide/Range.ts +++ b/src/libs/common/ide/Range.ts @@ -1,4 +1,5 @@ import Position from "./Position"; +import Selection from "./Selection"; export default class Range { /** @@ -68,4 +69,94 @@ export default class Range { this.end = start; } } + + /** + * `true` if `start` and `end` are equal. + */ + get isEmpty(): boolean { + return this.start.isEqual(this.end); + } + + /** + * `true` if `start.line` and `end.line` are equal. + */ + get isSingleLine(): boolean { + return this.start.line === this.end.line; + } + + /** + * Check if a position or a range is contained in this range. + * + * @param positionOrRange A position or a range. + * @return `true` if the position or range is inside or equal + * to this range. + */ + public contains(positionOrRange: Position | Range): boolean { + const [start, end] = + "line" in positionOrRange + ? [positionOrRange, positionOrRange] + : [positionOrRange.start, positionOrRange.end]; + return start.isAfterOrEqual(this.start) && end.isBeforeOrEqual(this.end); + } + + /** + * Check if `other` equals this range. + * + * @param other A range. + * @return `true` when start and end are {@link Position.isEqual equal} to + * start and end of this range. + */ + public isEqual(other: Range): boolean { + return this.start.isEqual(other.start) && this.end.isEqual(other.end); + } + + /** + * Intersect `range` with this range and returns a new range or `undefined` + * if the ranges have no overlap. + * + * @param other A range. + * @return A range of the greater start and smaller end positions. Will + * return undefined when there is no overlap. + */ + public intersection(other: Range): Range | undefined { + const start = this.start.isAfter(other.start) ? this.start : other.start; + const end = this.end.isBefore(other.end) ? this.end : other.end; + return start.isBeforeOrEqual(end) ? new Range(start, end) : undefined; + } + + /** + * Compute the union of `other` with this range. + * + * @param other A range. + * @return A range of smaller start position and the greater end position. + */ + public union(other: Range): Range { + return new Range( + this.start.isBefore(other.start) ? this.start : other.start, + this.end.isAfter(other.end) ? this.end : other.end, + ); + } + + /** + * Derived a new range from this range. + * + * @param start A position that should be used as start. The default value is the {@link Range.start current start}. + * @param end A position that should be used as end. The default value is the {@link Range.end current end}. + * @return A range derived from this range with the given start and end position. + * If start and end are not different `this` range will be returned. + */ + public with(start?: Position, end?: Position): Range { + return new Range(start ?? this.start, end ?? this.end); + } + + /** + * Construct a new selection from this range + * @param isReversed If true active is before anchor + * @returns A new selection + */ + public toSelection(isReversed: boolean): Selection { + return isReversed + ? new Selection(this.end, this.start) + : new Selection(this.start, this.end); + } } diff --git a/src/libs/common/ide/fake/FakeIDE.ts b/src/libs/common/ide/fake/FakeIDE.ts index f490552122..5124fdd352 100644 --- a/src/libs/common/ide/fake/FakeIDE.ts +++ b/src/libs/common/ide/fake/FakeIDE.ts @@ -5,6 +5,7 @@ import type { RunMode, WorkspaceFolder, } from "../types/ide.types"; +import { TextEditor } from "../types/TextEditor"; import FakeClipboard from "./FakeClipboard"; import FakeConfiguration from "./FakeConfiguration"; import FakeGlobalState from "./FakeGlobalState"; @@ -40,6 +41,7 @@ export default class FakeIDE implements IDE { runMode: RunMode = "test"; workspaceFolders: readonly WorkspaceFolder[] | undefined = undefined; + activeTextEditor: TextEditor | undefined = undefined; disposeOnExit(...disposables: Disposable[]): () => void { this.disposables.push(...disposables); diff --git a/src/libs/common/ide/spy/SpyIDE.ts b/src/libs/common/ide/spy/SpyIDE.ts index 50536ca664..4a907e4629 100644 --- a/src/libs/common/ide/spy/SpyIDE.ts +++ b/src/libs/common/ide/spy/SpyIDE.ts @@ -9,6 +9,7 @@ import type { Configuration } from "../types/Configuration"; import type { State } from "../types/State"; import SpyMessages, { Message } from "./SpyMessages"; import type { Clipboard } from "../types/Clipboard"; +import { TextEditor } from "../types/TextEditor"; export interface SpyIDERecordedValues { messages?: Message[]; @@ -27,6 +28,10 @@ export default class SpyIDE implements IDE { this.messages = new SpyMessages(original.messages); } + public get activeTextEditor(): TextEditor | undefined { + return this.original.activeTextEditor; + } + public get assetsRoot(): string { return this.original.assetsRoot; } diff --git a/src/libs/common/ide/types/TextDocument.ts b/src/libs/common/ide/types/TextDocument.ts index 1428d421df..7ea2833f70 100644 --- a/src/libs/common/ide/types/TextDocument.ts +++ b/src/libs/common/ide/types/TextDocument.ts @@ -17,10 +17,15 @@ export default interface TextDocument { */ readonly languageId: string; + /** + * The number of lines in this document. + */ + readonly lineCount: number; + /** * The range of the text document. */ - getRange(): Range; + readonly range: Range; /** * Returns a text line denoted by the line number. Note diff --git a/src/libs/common/ide/types/TextEditor.ts b/src/libs/common/ide/types/TextEditor.ts index 3f03b22fb0..9f9a223f92 100644 --- a/src/libs/common/ide/types/TextEditor.ts +++ b/src/libs/common/ide/types/TextEditor.ts @@ -1,21 +1,70 @@ -import Range from "./Range"; -import Selection from "./Selection"; -import TextDocument from "./TextDocument"; +import type Range from "../Range"; +import type Selection from "../Selection"; +import type TextDocument from "./TextDocument"; +import type TextEditorEdit from "./TextEditorEdit"; + +export interface TextEditor { + /** + * Unique identifier for this text editor + */ + readonly id: string; -export default interface TextEditor { /** * The document associated with this text editor. The document will be the same for the entire lifetime of this text editor. */ readonly document: TextDocument; + /** + * The current visible ranges in the editor (vertically). + * This accounts only for vertical scrolling, and not for horizontal scrolling. + */ + readonly visibleRanges: Range[]; + + /** + * The selections in this text editor. The primary selection is always at index 0. + */ + readonly selections: Selection[]; + + /** + * Check if this text editor is equal to `other`. + * + * @param other A text editor. + * @return `true` if the this text editor is equal to `other`. + */ + isEqual(other: TextEditor): boolean; +} + +export interface EditableTextEditor extends TextEditor { /** * The selections in this text editor. The primary selection is always at index 0. */ selections: Selection[]; /** - * The current visible ranges in the editor (vertically). - * This accounts only for vertical scrolling, and not for horizontal scrolling. + * Scroll to reveal the given range. + * + * @param range A range. */ - readonly visibleRanges: Range[]; + revealRange(range: Range): void; + + /** + * Focus the editor. + */ + focus(): Promise; + + /** + * Perform an edit on the document associated with this text editor. + * + * The given callback-function is invoked with an {@link TextEditorEdit edit-builder} which must + * be used to make edits. Note that the edit-builder is only valid while the + * callback executes. + * + * @param callback A function which can create edits using an {@link TextEditorEdit edit-builder}. + * @param options The undo/redo behavior around this edit. By default, undo stops will be created before and after this edit. + * @return A promise that resolves with a value indicating if the edits could be applied. + */ + edit( + callback: (editBuilder: TextEditorEdit) => void, + options?: { undoStopBefore: boolean; undoStopAfter: boolean }, + ): Thenable; } diff --git a/src/libs/common/ide/types/TextEditorEdit.ts b/src/libs/common/ide/types/TextEditorEdit.ts new file mode 100644 index 0000000000..75b016afee --- /dev/null +++ b/src/libs/common/ide/types/TextEditorEdit.ts @@ -0,0 +1,44 @@ +import type Position from "../Position"; +import type Range from "../Range"; +import type Selection from "../Selection"; +import type { EndOfLine } from "./ide.types"; + +/** + * A complex edit that will be applied in one transaction on a TextEditor. + * This holds a description of the edits and if the edits are valid (i.e. no overlapping regions, document was not changed in the meantime, etc.) + * they can be applied on a {@link TextDocument document} associated with a {@link TextEditor text editor}. + */ +export default interface TextEditorEdit { + /** + * Replace a certain text region with a new value. + * You can use \r\n or \n in `value` and they will be normalized to the current {@link TextDocument document}. + * + * @param location The range this operation should remove. + * @param value The new text this operation should insert after removing `location`. + */ + replace(location: Position | Range | Selection, value: string): void; + + /** + * Insert text at a location. + * You can use \r\n or \n in `value` and they will be normalized to the current {@link TextDocument document}. + * Although the equivalent text edit can be made with {@link TextEditorEdit.replace replace}, `insert` will produce a different resulting selection (it will get moved). + * + * @param location The position where the new text should be inserted. + * @param value The new text this operation should insert. + */ + insert(location: Position, value: string): void; + + /** + * Delete a certain text region. + * + * @param location The range this operation should remove. + */ + delete(location: Range | Selection): void; + + /** + * Set the end of line sequence. + * + * @param endOfLine The new end of line for the {@link TextDocument document}. + */ + setEndOfLine(endOfLine: EndOfLine): void; +} diff --git a/src/libs/common/ide/types/ide.types.ts b/src/libs/common/ide/types/ide.types.ts index be7c6ca1aa..af4aab9c17 100644 --- a/src/libs/common/ide/types/ide.types.ts +++ b/src/libs/common/ide/types/ide.types.ts @@ -3,7 +3,7 @@ import { Clipboard } from "./Clipboard"; import { Configuration } from "./Configuration"; import { Messages } from "./Messages"; import { State } from "./State"; -import type TextEditor from "./TextEditor"; +import type { TextEditor } from "./TextEditor"; export type RunMode = "production" | "development" | "test"; @@ -53,3 +53,8 @@ export interface WorkspaceFolder { export interface Disposable { dispose(): void; } + +/** + * Represents an end of line character sequence in a {@link TextDocument document}. + */ +export type EndOfLine = "LF" | "CRLF"; diff --git a/src/processTargets/marks/CursorStage.ts b/src/processTargets/marks/CursorStage.ts index 6664439c06..ebf3049cae 100644 --- a/src/processTargets/marks/CursorStage.ts +++ b/src/processTargets/marks/CursorStage.ts @@ -1,7 +1,6 @@ import type { Target } from "../../typings/target.types"; import type { CursorMark } from "../../typings/targetDescriptor.types"; import type { ProcessedTargetsContext } from "../../typings/Types"; -import { isReversed } from "../../util/selectionUtils"; import type { MarkStage } from "../PipelineStages.types"; import { UntypedTarget } from "../targets"; @@ -13,7 +12,7 @@ export default class CursorStage implements MarkStage { (selection) => new UntypedTarget({ editor: selection.editor, - isReversed: isReversed(selection.selection), + isReversed: selection.selection.isReversed, contentRange: selection.selection, hasExplicitRange: !selection.selection.isEmpty, }), diff --git a/src/processTargets/modifiers/EveryScopeStage.ts b/src/processTargets/modifiers/EveryScopeStage.ts index 3d0a728fa3..7884fc6d2d 100644 --- a/src/processTargets/modifiers/EveryScopeStage.ts +++ b/src/processTargets/modifiers/EveryScopeStage.ts @@ -1,5 +1,5 @@ -import { Range } from "vscode"; import { NoContainingScopeError } from "../../errors"; +import Range from "../../libs/common/ide/Range"; import type { Target } from "../../typings/target.types"; import type { EveryScopeModifier } from "../../typings/targetDescriptor.types"; import type { ProcessedTargetsContext } from "../../typings/Types"; diff --git a/src/processTargets/modifiers/HeadTailStage.ts b/src/processTargets/modifiers/HeadTailStage.ts index 9f91024cf6..fb7f3b4895 100644 --- a/src/processTargets/modifiers/HeadTailStage.ts +++ b/src/processTargets/modifiers/HeadTailStage.ts @@ -1,4 +1,4 @@ -import { Range } from "vscode"; +import Range from "../../libs/common/ide/Range"; import { Target } from "../../typings/target.types"; import { HeadTailModifier, diff --git a/src/processTargets/modifiers/ItemStage/getIterationScope.ts b/src/processTargets/modifiers/ItemStage/getIterationScope.ts index fbe75b5ce0..b2e4c32fa5 100644 --- a/src/processTargets/modifiers/ItemStage/getIterationScope.ts +++ b/src/processTargets/modifiers/ItemStage/getIterationScope.ts @@ -1,4 +1,5 @@ -import { Range, TextEditor } from "vscode"; +import Range from "../../../libs/common/ide/Range"; +import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { Target } from "../../../typings/target.types"; import { ProcessedTargetsContext } from "../../../typings/Types"; import { fitRangeToLineContent } from "../scopeHandlers"; diff --git a/src/processTargets/modifiers/RelativeInclusiveScopeStage.ts b/src/processTargets/modifiers/RelativeInclusiveScopeStage.ts index dc50118b37..642ba2e465 100644 --- a/src/processTargets/modifiers/RelativeInclusiveScopeStage.ts +++ b/src/processTargets/modifiers/RelativeInclusiveScopeStage.ts @@ -1,5 +1,6 @@ -import type { Range, TextEditor } from "vscode"; import { NoContainingScopeError } from "../../errors"; +import Range from "../../libs/common/ide/Range"; +import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import type { Target } from "../../typings/target.types"; import type { Direction, diff --git a/src/processTargets/modifiers/getContainingScope.ts b/src/processTargets/modifiers/getContainingScope.ts index fb42246251..bf1be406fc 100644 --- a/src/processTargets/modifiers/getContainingScope.ts +++ b/src/processTargets/modifiers/getContainingScope.ts @@ -1,5 +1,6 @@ +import Position from "../../libs/common/ide/Position"; +import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import { Direction } from "../../typings/targetDescriptor.types"; -import { TextEditor, Position } from "vscode"; import { ScopeHandler } from "./scopeHandlers/scopeHandler.types"; /** diff --git a/src/processTargets/modifiers/relativeScopeLegacy.ts b/src/processTargets/modifiers/relativeScopeLegacy.ts index 030b79c867..a465ee02f6 100644 --- a/src/processTargets/modifiers/relativeScopeLegacy.ts +++ b/src/processTargets/modifiers/relativeScopeLegacy.ts @@ -1,5 +1,5 @@ import { findLastIndex } from "lodash"; -import { Range } from "vscode"; +import Range from "../../libs/common/ide/Range"; import { Target } from "../../typings/target.types"; import { RelativeScopeModifier } from "../../typings/targetDescriptor.types"; import { ProcessedTargetsContext } from "../../typings/Types"; diff --git a/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.ts b/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.ts index 8402452496..f51da62578 100644 --- a/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.ts +++ b/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.ts @@ -1,5 +1,5 @@ -// eslint-disable-next-line @typescript-eslint/no-unused-vars -import type { Position, Range, TextEditor } from "vscode"; +import Position from "../../../libs/common/ide/Position"; +import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import type { Direction, ScopeType, diff --git a/src/processTargets/modifiers/scopeHandlers/DocumentScopeHandler.ts b/src/processTargets/modifiers/scopeHandlers/DocumentScopeHandler.ts index e3e0f60d90..7523b2bf19 100644 --- a/src/processTargets/modifiers/scopeHandlers/DocumentScopeHandler.ts +++ b/src/processTargets/modifiers/scopeHandlers/DocumentScopeHandler.ts @@ -1,6 +1,6 @@ -import { Position, TextEditor } from "vscode"; +import Position from "../../../libs/common/ide/Position"; +import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { Direction, ScopeType } from "../../../typings/targetDescriptor.types"; -import { getDocumentRange } from "../../../util/rangeUtils"; import { DocumentTarget } from "../../targets"; import BaseScopeHandler from "./BaseScopeHandler"; import { TargetScope } from "./scope.types"; @@ -19,7 +19,7 @@ export default class DocumentScopeHandler extends BaseScopeHandler { _position: Position, _direction: Direction, ): Iterable { - const contentRange = getDocumentRange(editor.document); + const contentRange = editor.document.range; yield { editor, diff --git a/src/processTargets/modifiers/scopeHandlers/compareTargetScopes.ts b/src/processTargets/modifiers/scopeHandlers/compareTargetScopes.ts index bc4df11ad7..912cb92c9f 100644 --- a/src/processTargets/modifiers/scopeHandlers/compareTargetScopes.ts +++ b/src/processTargets/modifiers/scopeHandlers/compareTargetScopes.ts @@ -1,4 +1,5 @@ -import { Position, Range } from "vscode"; +import Position from "../../../libs/common/ide/Position"; +import Range from "../../../libs/common/ide/Range"; import { Direction } from "../../../typings/targetDescriptor.types"; import { TargetScope } from "./scope.types"; diff --git a/src/processTargets/modifiers/scopeHandlers/getScopeRelativeToPosition.ts b/src/processTargets/modifiers/scopeHandlers/getScopeRelativeToPosition.ts index dfd9a6defc..68e5ac2431 100644 --- a/src/processTargets/modifiers/scopeHandlers/getScopeRelativeToPosition.ts +++ b/src/processTargets/modifiers/scopeHandlers/getScopeRelativeToPosition.ts @@ -1,4 +1,5 @@ -import { Position, TextEditor } from "vscode"; +import Position from "../../../libs/common/ide/Position"; +import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { Direction } from "../../../typings/targetDescriptor.types"; import { OutOfRangeError } from "../targetSequenceUtils"; import { TargetScope } from "./scope.types"; diff --git a/src/processTargets/modifiers/scopeHandlers/getScopesOverlappingRange.ts b/src/processTargets/modifiers/scopeHandlers/getScopesOverlappingRange.ts index 2764c3a689..84d280c88e 100644 --- a/src/processTargets/modifiers/scopeHandlers/getScopesOverlappingRange.ts +++ b/src/processTargets/modifiers/scopeHandlers/getScopesOverlappingRange.ts @@ -1,4 +1,5 @@ -import { Range, TextEditor } from "vscode"; +import Range from "../../../libs/common/ide/Range"; +import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { TargetScope } from "./scope.types"; import { ScopeHandler } from "./scopeHandler.types"; diff --git a/src/processTargets/modifiers/scopeHandlers/scope.types.ts b/src/processTargets/modifiers/scopeHandlers/scope.types.ts index 6f6d02e685..d1ff358d1b 100644 --- a/src/processTargets/modifiers/scopeHandlers/scope.types.ts +++ b/src/processTargets/modifiers/scopeHandlers/scope.types.ts @@ -1,4 +1,5 @@ -import type { Range, TextEditor } from "vscode"; +import Range from "../../../libs/common/ide/Range"; +import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import type { Target } from "../../../typings/target.types"; /** diff --git a/src/processTargets/modifiers/scopeHandlers/scopeHandler.types.ts b/src/processTargets/modifiers/scopeHandlers/scopeHandler.types.ts index 2eff08ac6e..3df64b2668 100644 --- a/src/processTargets/modifiers/scopeHandlers/scopeHandler.types.ts +++ b/src/processTargets/modifiers/scopeHandlers/scopeHandler.types.ts @@ -1,4 +1,5 @@ -import type { Position, TextEditor } from "vscode"; +import type Position from "../../../libs/common/ide/Position"; +import type { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import type { Direction, ScopeType, diff --git a/src/processTargets/modifiers/scopeHandlers/shouldYieldScope.ts b/src/processTargets/modifiers/scopeHandlers/shouldYieldScope.ts index 0e4d06797b..56f9d11923 100644 --- a/src/processTargets/modifiers/scopeHandlers/shouldYieldScope.ts +++ b/src/processTargets/modifiers/scopeHandlers/shouldYieldScope.ts @@ -1,4 +1,4 @@ -import { Position } from "vscode"; +import Position from "../../../libs/common/ide/Position"; import { Direction } from "../../../typings/targetDescriptor.types"; import { strictlyContains } from "../../../util/rangeUtils"; import { compareTargetScopes } from "./compareTargetScopes"; diff --git a/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts b/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts index 3c4e13aef4..6c2bd6e93f 100644 --- a/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts +++ b/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts @@ -1,7 +1,8 @@ -import { Location, Selection } from "vscode"; import type { SyntaxNode } from "web-tree-sitter"; import { NoContainingScopeError } from "../../../errors"; import { getNodeMatcher } from "../../../languages/getNodeMatcher"; +import Location from "../../../libs/common/ide/Location"; +import Selection from "../../../libs/common/ide/Selection"; import type { Target } from "../../../typings/target.types"; import type { ContainingScopeModifier, diff --git a/src/processTargets/modifiers/scopeTypeStages/RegexStage.ts b/src/processTargets/modifiers/scopeTypeStages/RegexStage.ts index 7c62be2dbf..e88f1cafb6 100644 --- a/src/processTargets/modifiers/scopeTypeStages/RegexStage.ts +++ b/src/processTargets/modifiers/scopeTypeStages/RegexStage.ts @@ -1,5 +1,7 @@ -import { Position, Range, TextEditor } from "vscode"; import { NoContainingScopeError } from "../../../errors"; +import Position from "../../../libs/common/ide/Position"; +import Range from "../../../libs/common/ide/Range"; +import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { Target } from "../../../typings/target.types"; import { ContainingScopeModifier, diff --git a/src/processTargets/modifiers/surroundingPair/extractSelectionFromSurroundingPairOffsets.ts b/src/processTargets/modifiers/surroundingPair/extractSelectionFromSurroundingPairOffsets.ts index d488ea7e0e..d26873576d 100644 --- a/src/processTargets/modifiers/surroundingPair/extractSelectionFromSurroundingPairOffsets.ts +++ b/src/processTargets/modifiers/surroundingPair/extractSelectionFromSurroundingPairOffsets.ts @@ -1,4 +1,6 @@ -import { Range, Selection, TextDocument } from "vscode"; +import Range from "../../../libs/common/ide/Range"; +import Selection from "../../../libs/common/ide/Selection"; +import TextDocument from "../../../libs/common/ide/types/TextDocument"; import { SurroundingPairOffsets } from "./types"; export interface SurroundingPairInfo { diff --git a/src/processTargets/modifiers/surroundingPair/findSurroundingPairParseTreeBased.ts b/src/processTargets/modifiers/surroundingPair/findSurroundingPairParseTreeBased.ts index 62feee0608..a0e85c658b 100644 --- a/src/processTargets/modifiers/surroundingPair/findSurroundingPairParseTreeBased.ts +++ b/src/processTargets/modifiers/surroundingPair/findSurroundingPairParseTreeBased.ts @@ -1,5 +1,7 @@ -import { Range, TextDocument, TextEditor } from "vscode"; import { SyntaxNode } from "web-tree-sitter"; +import Range from "../../../libs/common/ide/Range"; +import TextDocument from "../../../libs/common/ide/types/TextDocument"; +import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { SimpleSurroundingPairName, SurroundingPairScopeType, diff --git a/src/processTargets/modifiers/surroundingPair/findSurroundingPairTextBased.ts b/src/processTargets/modifiers/surroundingPair/findSurroundingPairTextBased.ts index 70bd746853..353cdc07b6 100644 --- a/src/processTargets/modifiers/surroundingPair/findSurroundingPairTextBased.ts +++ b/src/processTargets/modifiers/surroundingPair/findSurroundingPairTextBased.ts @@ -1,11 +1,9 @@ import { escapeRegExp, findLast, uniq } from "lodash"; -import { Range, TextDocument, TextEditor } from "vscode"; import { SimpleSurroundingPairName, SurroundingPairName, SurroundingPairScopeType, } from "../../../typings/targetDescriptor.types"; -import { getDocumentRange } from "../../../util/rangeUtils"; import { matchAll } from "../../../libs/cursorless-engine/util/regex"; import { extractSelectionFromSurroundingPairOffsets } from "./extractSelectionFromSurroundingPairOffsets"; import { findSurroundingPairCore } from "./findSurroundingPairCore"; @@ -16,6 +14,9 @@ import { PossibleDelimiterOccurrence, SurroundingPairOffsets, } from "./types"; +import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; +import Range from "../../../libs/common/ide/Range"; +import TextDocument from "../../../libs/common/ide/types/TextDocument"; /** * The initial range length that we start by scanning @@ -73,7 +74,7 @@ export function findSurroundingPairTextBased( scopeType: SurroundingPairScopeType, ) { const document: TextDocument = editor.document; - const fullRange = allowableRange ?? getDocumentRange(document); + const fullRange = allowableRange ?? document.range; const individualDelimiters = getIndividualDelimiters(delimiters); diff --git a/src/processTargets/modifiers/surroundingPair/index.ts b/src/processTargets/modifiers/surroundingPair/index.ts index e42e06c2f2..ea57810f84 100644 --- a/src/processTargets/modifiers/surroundingPair/index.ts +++ b/src/processTargets/modifiers/surroundingPair/index.ts @@ -1,8 +1,11 @@ -import { Location, Range, Selection, TextEditor } from "vscode"; import { SyntaxNode } from "web-tree-sitter"; import getTextFragmentExtractor, { TextFragmentExtractor, } from "../../../languages/getTextFragmentExtractor"; +import Location from "../../../libs/common/ide/Location"; +import Range from "../../../libs/common/ide/Range"; +import Selection from "../../../libs/common/ide/Selection"; +import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { ComplexSurroundingPairName, SurroundingPairScopeType, diff --git a/src/processTargets/modifiers/toPositionTarget.ts b/src/processTargets/modifiers/toPositionTarget.ts index 352dd901bc..a27283a4a4 100644 --- a/src/processTargets/modifiers/toPositionTarget.ts +++ b/src/processTargets/modifiers/toPositionTarget.ts @@ -1,4 +1,4 @@ -import { Range } from "vscode"; +import Range from "../../libs/common/ide/Range"; import { Target } from "../../typings/target.types"; import { Position } from "../../typings/targetDescriptor.types"; import { PositionTarget } from "../targets"; diff --git a/src/processTargets/processTargets.ts b/src/processTargets/processTargets.ts index d272148a80..6681145b94 100644 --- a/src/processTargets/processTargets.ts +++ b/src/processTargets/processTargets.ts @@ -1,5 +1,5 @@ import { uniqWith, zip } from "lodash"; -import { Range } from "vscode"; +import Range from "../libs/common/ide/Range"; import { Target } from "../typings/target.types"; import { Modifier, diff --git a/src/processTargets/targetUtil/createContinuousRange.ts b/src/processTargets/targetUtil/createContinuousRange.ts index 8cd0a1cb94..79c9a8f1e2 100644 --- a/src/processTargets/targetUtil/createContinuousRange.ts +++ b/src/processTargets/targetUtil/createContinuousRange.ts @@ -1,4 +1,5 @@ -import { Position, Range } from "vscode"; +import Position from "../../libs/common/ide/Position"; +import Range from "../../libs/common/ide/Range"; import type { Target } from "../../typings/target.types"; import { UntypedTarget } from "../targets"; diff --git a/src/processTargets/targetUtil/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior.ts b/src/processTargets/targetUtil/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior.ts index 639490d093..10c150c569 100644 --- a/src/processTargets/targetUtil/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior.ts +++ b/src/processTargets/targetUtil/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior.ts @@ -1,4 +1,4 @@ -import { Range } from "vscode"; +import Range from "../../../libs/common/ide/Range"; import { Target } from "../../../typings/target.types"; /** diff --git a/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts b/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts index e303596a88..56f4ca2401 100644 --- a/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts +++ b/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts @@ -1,7 +1,9 @@ -import { Range, TextDocument, TextEditor } from "vscode"; +import Range from "../../../libs/common/ide/Range"; +import TextDocument from "../../../libs/common/ide/types/TextDocument"; +import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { tokenize } from "../../../libs/cursorless-engine/tokenizer"; import type { Target } from "../../../typings/target.types"; -import { expandToFullLine, makeEmptyRange } from "../../../util/rangeUtils"; +import { expandToFullLine } from "../../../util/rangeUtils"; import { PlainTarget } from "../../targets"; export function getTokenLeadingDelimiterTarget( @@ -65,10 +67,10 @@ export function getTokenRemovalRange(target: Target): Range { const { start, end } = contentRange; const leadingWhitespaceRange = - target.getLeadingDelimiterTarget()?.contentRange ?? makeEmptyRange(start); + target.getLeadingDelimiterTarget()?.contentRange ?? new Range(start); const trailingWhitespaceRange = - target.getTrailingDelimiterTarget()?.contentRange ?? makeEmptyRange(end); + target.getTrailingDelimiterTarget()?.contentRange ?? new Range(end); const fullLineRange = expandToFullLine(editor, contentRange); diff --git a/src/processTargets/targetUtil/insertionRemovalBehaviors/insertionRemovalBehavior.types.ts b/src/processTargets/targetUtil/insertionRemovalBehaviors/insertionRemovalBehavior.types.ts index 5a4c89d1eb..9a4bf3ee6d 100644 --- a/src/processTargets/targetUtil/insertionRemovalBehaviors/insertionRemovalBehavior.types.ts +++ b/src/processTargets/targetUtil/insertionRemovalBehaviors/insertionRemovalBehavior.types.ts @@ -1,5 +1,5 @@ -import { Range } from "vscode"; -import { Target } from "../../../typings/target.types"; +import type Range from "../../../libs/common/ide/Range"; +import type { Target } from "../../../typings/target.types"; export default interface InsertionRemovalBehavior { getLeadingDelimiterTarget(): Target | undefined; diff --git a/src/processTargets/targets/BaseTarget.ts b/src/processTargets/targets/BaseTarget.ts index 32e4cfceae..18349138d6 100644 --- a/src/processTargets/targets/BaseTarget.ts +++ b/src/processTargets/targets/BaseTarget.ts @@ -1,10 +1,11 @@ import { isEqual } from "lodash"; -import { Range, Selection, TextEditor } from "vscode"; import { NoContainingScopeError } from "../../errors"; +import Range from "../../libs/common/ide/Range"; +import Selection from "../../libs/common/ide/Selection"; +import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import type { EditNewContext, Target } from "../../typings/target.types"; import type { Position } from "../../typings/targetDescriptor.types"; import type { EditWithRangeUpdater } from "../../typings/Types"; -import { selectionFromRange } from "../../util/selectionUtils"; import { isSameType } from "../../util/typeUtils"; import { toPositionTarget } from "../modifiers/toPositionTarget"; import { @@ -60,7 +61,7 @@ export default abstract class BaseTarget implements Target { } get contentSelection(): Selection { - return selectionFromRange(this.isReversed, this.contentRange); + return this.contentRange.toSelection(this.isReversed); } get contentRange(): Range { diff --git a/src/processTargets/targets/DocumentTarget.ts b/src/processTargets/targets/DocumentTarget.ts index 4379e55081..1f42e4bce4 100644 --- a/src/processTargets/targets/DocumentTarget.ts +++ b/src/processTargets/targets/DocumentTarget.ts @@ -1,4 +1,4 @@ -import { Range } from "vscode"; +import Range from "../../libs/common/ide/Range"; import { shrinkRangeToFitContent } from "../../util/selectionUtils"; import BaseTarget, { CommonTargetParameters } from "./BaseTarget"; import PlainTarget from "./PlainTarget"; diff --git a/src/processTargets/targets/InteriorTarget.ts b/src/processTargets/targets/InteriorTarget.ts index 08e2e0a1a9..5c6dd69e5c 100644 --- a/src/processTargets/targets/InteriorTarget.ts +++ b/src/processTargets/targets/InteriorTarget.ts @@ -1,4 +1,4 @@ -import { Range } from "vscode"; +import Range from "../../libs/common/ide/Range"; import { Target } from "../../typings/target.types"; import { shrinkRangeToFitContent } from "../../util/selectionUtils"; import { isSameType } from "../../util/typeUtils"; diff --git a/src/processTargets/targets/LineTarget.ts b/src/processTargets/targets/LineTarget.ts index 1efdb76ee3..4a3551334f 100644 --- a/src/processTargets/targets/LineTarget.ts +++ b/src/processTargets/targets/LineTarget.ts @@ -1,4 +1,6 @@ -import { Position, Range, TextEditor } from "vscode"; +import Position from "../../libs/common/ide/Position"; +import Range from "../../libs/common/ide/Range"; +import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import { Target } from "../../typings/target.types"; import { expandToFullLine } from "../../util/rangeUtils"; import { tryConstructPlainTarget } from "../../util/tryConstructTarget"; diff --git a/src/processTargets/targets/NotebookCellTarget.ts b/src/processTargets/targets/NotebookCellTarget.ts index 4fb3265ab1..e9ba409ed4 100644 --- a/src/processTargets/targets/NotebookCellTarget.ts +++ b/src/processTargets/targets/NotebookCellTarget.ts @@ -1,4 +1,4 @@ -import { TextEditor } from "vscode"; +import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import { Target } from "../../typings/target.types"; import { Position } from "../../typings/targetDescriptor.types"; import { getNotebookFromCellDocument } from "../../util/notebook"; diff --git a/src/processTargets/targets/ParagraphTarget.ts b/src/processTargets/targets/ParagraphTarget.ts index 8e049e4047..7160106663 100644 --- a/src/processTargets/targets/ParagraphTarget.ts +++ b/src/processTargets/targets/ParagraphTarget.ts @@ -1,4 +1,3 @@ -import { Position, Range, TextDocument, TextEditor, TextLine } from "vscode"; import { Target } from "../../typings/target.types"; import { expandToFullLine } from "../../util/rangeUtils"; import { isSameType } from "../../util/typeUtils"; @@ -6,6 +5,11 @@ import { constructLineTarget } from "../../util/tryConstructTarget"; import { createContinuousLineRange } from "../targetUtil/createContinuousRange"; import BaseTarget from "./BaseTarget"; import LineTarget from "./LineTarget"; +import Range from "../../libs/common/ide/Range"; +import { TextEditor } from "../../libs/common/ide/types/TextEditor"; +import Position from "../../libs/common/ide/Position"; +import TextDocument from "../../libs/common/ide/types/TextDocument"; +import TextLine from "../../libs/common/ide/types/TextLine"; export default class ParagraphTarget extends BaseTarget { insertionDelimiter = "\n\n"; diff --git a/src/processTargets/targets/PositionTarget.ts b/src/processTargets/targets/PositionTarget.ts index 091bd1f2cd..38615b230f 100644 --- a/src/processTargets/targets/PositionTarget.ts +++ b/src/processTargets/targets/PositionTarget.ts @@ -1,6 +1,7 @@ -import { Range, TextEditor } from "vscode"; import { BaseTarget, CommonTargetParameters } from "."; import { UnsupportedError } from "../../errors"; +import Range from "../../libs/common/ide/Range"; +import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import { EditNewContext } from "../../typings/target.types"; import { Position } from "../../typings/targetDescriptor.types"; import { EditWithRangeUpdater } from "../../typings/Types"; diff --git a/src/processTargets/targets/ScopeTypeTarget.ts b/src/processTargets/targets/ScopeTypeTarget.ts index 0b488e63c5..ee55e7c0d1 100644 --- a/src/processTargets/targets/ScopeTypeTarget.ts +++ b/src/processTargets/targets/ScopeTypeTarget.ts @@ -1,4 +1,4 @@ -import { Range } from "vscode"; +import Range from "../../libs/common/ide/Range"; import { Target } from "../../typings/target.types"; import { SimpleScopeTypeType } from "../../typings/targetDescriptor.types"; import { isSameType } from "../../util/typeUtils"; diff --git a/src/processTargets/targets/SubTokenWordTarget.ts b/src/processTargets/targets/SubTokenWordTarget.ts index 0cbe46dd9b..b35e64effa 100644 --- a/src/processTargets/targets/SubTokenWordTarget.ts +++ b/src/processTargets/targets/SubTokenWordTarget.ts @@ -1,4 +1,4 @@ -import { Range } from "vscode"; +import Range from "../../libs/common/ide/Range"; import { tryConstructPlainTarget as tryConstructPlainTarget } from "../../util/tryConstructTarget"; import { getDelimitedSequenceRemovalRange } from "../targetUtil/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior"; import BaseTarget, { CommonTargetParameters } from "./BaseTarget"; diff --git a/src/processTargets/targets/SurroundingPairTarget.ts b/src/processTargets/targets/SurroundingPairTarget.ts index 0ca20c9564..362eef60f3 100644 --- a/src/processTargets/targets/SurroundingPairTarget.ts +++ b/src/processTargets/targets/SurroundingPairTarget.ts @@ -1,4 +1,4 @@ -import { Range } from "vscode"; +import Range from "../../libs/common/ide/Range"; import { Target } from "../../typings/target.types"; import { getTokenLeadingDelimiterTarget, diff --git a/src/processTargets/targets/TokenTarget.ts b/src/processTargets/targets/TokenTarget.ts index fab6e3992f..87635e7c62 100644 --- a/src/processTargets/targets/TokenTarget.ts +++ b/src/processTargets/targets/TokenTarget.ts @@ -1,5 +1,5 @@ -import { Range } from "vscode"; import { BaseTarget } from "."; +import Range from "../../libs/common/ide/Range"; import { Target } from "../../typings/target.types"; import { getTokenLeadingDelimiterTarget, diff --git a/src/processTargets/targets/UntypedTarget.ts b/src/processTargets/targets/UntypedTarget.ts index d4a4e1ec6c..f350e98055 100644 --- a/src/processTargets/targets/UntypedTarget.ts +++ b/src/processTargets/targets/UntypedTarget.ts @@ -1,5 +1,5 @@ -import { Range } from "vscode"; import { BaseTarget, CommonTargetParameters } from "."; +import Range from "../../libs/common/ide/Range"; import type { Target } from "../../typings/target.types"; import { createContinuousRangeUntypedTarget } from "../targetUtil/createContinuousRange"; import { diff --git a/src/testUtil/TestCaseRecorder.ts b/src/testUtil/TestCaseRecorder.ts index 79e5b1bad9..0512029181 100644 --- a/src/testUtil/TestCaseRecorder.ts +++ b/src/testUtil/TestCaseRecorder.ts @@ -25,7 +25,6 @@ import { } from "../libs/vscode-common/toPlainObject"; import { DecoratedSymbolMark } from "../typings/targetDescriptor.types"; import { Graph } from "../typings/Types"; -import { getDocumentRange } from "../util/rangeUtils"; import { TestCase, TestCaseContext } from "./TestCase"; import { TestCaseCommand } from "./TestCaseFixture"; @@ -506,3 +505,16 @@ async function readJsonIfExists( return JSON.parse(rawText); } + +/** + * Get a range that corresponds to the entire contents of the given document. + * + * @param document The document to consider + * @returns A range corresponding to the entire document contents + */ +function getDocumentRange(document: vscode.TextDocument) { + return new vscode.Range( + new vscode.Position(0, 0), + document.lineAt(document.lineCount - 1).range.end, + ); +} diff --git a/src/typings/Types.ts b/src/typings/Types.ts index cdc6f551b0..1588d0ef55 100644 --- a/src/typings/Types.ts +++ b/src/typings/Types.ts @@ -1,4 +1,3 @@ -import * as vscode from "vscode"; import { SyntaxNode } from "web-tree-sitter"; import { ActionRecord } from "../actions/actions.types"; import Cheatsheet from "../core/Cheatsheet"; @@ -11,9 +10,10 @@ import { ReadOnlyHatMap } from "../core/IndividualHatMap"; import { Snippets } from "../core/Snippets"; import StatusBarItem from "../core/StatusBarItem"; import { RangeUpdater } from "../core/updateSelections/RangeUpdater"; +import Location from "../libs/common/ide/Location"; import Range from "../libs/common/ide/Range"; import Selection from "../libs/common/ide/Selection"; -import type TextEditor from "../libs/common/ide/types/TextEditor"; +import type { TextEditor } from "../libs/common/ide/types/TextEditor"; import { CommandServerApi } from "../libs/vscode-common/getExtensionApi"; import { ModifierStage } from "../processTargets/PipelineStages.types"; import { TestCaseRecorder } from "../testUtil/TestCaseRecorder"; @@ -44,7 +44,7 @@ export interface ProcessedTargetsContext { hatTokenMap: ReadOnlyHatMap; thatMark: Target[]; sourceMark: Target[]; - getNodeAtLocation: (location: vscode.Location) => SyntaxNode; + getNodeAtLocation: (location: Location) => SyntaxNode; } export interface SelectionWithEditor { @@ -138,7 +138,7 @@ export interface Graph { /** * Function to access nodes in the tree sitter. */ - readonly getNodeAtLocation: (location: vscode.Location) => SyntaxNode; + readonly getNodeAtLocation: (location: Location) => SyntaxNode; /** * Debug logger diff --git a/src/typings/target.types.ts b/src/typings/target.types.ts index 95665006dd..d4005353b5 100644 --- a/src/typings/target.types.ts +++ b/src/typings/target.types.ts @@ -1,4 +1,3 @@ -import type { Range, Selection, TextEditor } from "vscode"; // NB: We import `Target` below just so that @link below resolves. Once one of // the following issues are fixed, we can either remove the above line or // switch to `{import("foo")}` syntax in the `{@link}` tag. @@ -18,6 +17,9 @@ import type { } from "../processTargets/targets"; import type { Position } from "./targetDescriptor.types"; import type { EditWithRangeUpdater } from "./Types"; +import type { TextEditor } from "../libs/common/ide/types/TextEditor"; +import type Range from "../libs/common/ide/Range"; +import type Selection from "../libs/common/ide/Selection"; export interface EditNewCommandContext { type: "command"; diff --git a/src/typings/updateSelections.ts b/src/typings/updateSelections.ts index d5df1afebd..283318b647 100644 --- a/src/typings/updateSelections.ts +++ b/src/typings/updateSelections.ts @@ -1,8 +1,8 @@ -import { - Range, +import type { TextDocumentChangeEvent, TextDocumentContentChangeEvent, } from "vscode"; +import type Range from "../libs/common/ide/Range"; export interface RangeOffsets { start: number; diff --git a/src/util/nodeFinders.ts b/src/util/nodeFinders.ts index 91946f5825..2963569d32 100644 --- a/src/util/nodeFinders.ts +++ b/src/util/nodeFinders.ts @@ -1,5 +1,6 @@ -import { Position, Selection } from "vscode"; import { Point, SyntaxNode } from "web-tree-sitter"; +import Position from "../libs/common/ide/Position"; +import Selection from "../libs/common/ide/Selection"; import { NodeFinder } from "../typings/Types"; export const nodeFinder = ( diff --git a/src/util/nodeSelectors.ts b/src/util/nodeSelectors.ts index bfc3c66fd0..6e63e23434 100644 --- a/src/util/nodeSelectors.ts +++ b/src/util/nodeSelectors.ts @@ -1,6 +1,9 @@ import { identity, maxBy } from "lodash"; -import { Position, Range, Selection, TextEditor } from "vscode"; import { Point, SyntaxNode } from "web-tree-sitter"; +import Position from "../libs/common/ide/Position"; +import Range from "../libs/common/ide/Range"; +import Selection from "../libs/common/ide/Selection"; +import { TextEditor } from "../libs/common/ide/types/TextEditor"; import { NodeFinder, SelectionExtractor, diff --git a/src/util/performDocumentEdits.ts b/src/util/performDocumentEdits.ts index 5477bc93cd..79f25d6c75 100644 --- a/src/util/performDocumentEdits.ts +++ b/src/util/performDocumentEdits.ts @@ -1,6 +1,6 @@ import { Edit } from "../typings/Types"; -import { TextEditor } from "vscode"; import { RangeUpdater } from "../core/updateSelections/RangeUpdater"; +import { TextEditor } from "../libs/common/ide/types/TextEditor"; export async function performDocumentEdits( rangeUpdater: RangeUpdater, diff --git a/src/util/rangeUtils.ts b/src/util/rangeUtils.ts index e3103de981..723f5b4fe3 100644 --- a/src/util/rangeUtils.ts +++ b/src/util/rangeUtils.ts @@ -1,4 +1,6 @@ -import { Position, Range, TextDocument, TextEditor } from "vscode"; +import Position from "../libs/common/ide/Position"; +import Range from "../libs/common/ide/Range"; +import { TextEditor } from "../libs/common/ide/types/TextEditor"; export function isAtEndOfLine(editor: TextEditor, position: Position) { const endLine = editor.document.lineAt(position); @@ -25,10 +27,6 @@ export function expandToFullLine(editor: TextEditor, range: Range) { ); } -export function makeEmptyRange(position: Position) { - return new Range(position, position); -} - export function getRangeLength(editor: TextEditor, range: Range) { return range.isEmpty ? 0 @@ -56,16 +54,3 @@ export function strictlyContains( const end = "end" in rangeOrPosition ? rangeOrPosition.end : rangeOrPosition; return range1.start.isBefore(start) && range1.end.isAfter(end); } - -/** - * Get a range that corresponds to the entire contents of the given document. - * - * @param document The document to consider - * @returns A range corresponding to the entire document contents - */ -export function getDocumentRange(document: TextDocument) { - return new Range( - new Position(0, 0), - document.lineAt(document.lineCount - 1).range.end, - ); -} diff --git a/src/util/selectionUtils.ts b/src/util/selectionUtils.ts index cc18714f82..c0572a115d 100644 --- a/src/util/selectionUtils.ts +++ b/src/util/selectionUtils.ts @@ -1,14 +1,9 @@ -import { Position, Range, Selection, TextEditor } from "vscode"; +import Position from "../libs/common/ide/Position"; +import Range from "../libs/common/ide/Range"; +import Selection from "../libs/common/ide/Selection"; +import { TextEditor } from "../libs/common/ide/types/TextEditor"; import { SelectionWithEditor } from "../typings/Types"; -export function isForward(selection: Selection) { - return selection.active.isAfterOrEqual(selection.anchor); -} - -export function isReversed(selection: Selection) { - return selection.active.isBefore(selection.anchor); -} - export function selectionWithEditorFromRange( selection: SelectionWithEditor, range: Range, @@ -32,17 +27,11 @@ function selectionFromPositions( start: Position, end: Position, ): Selection { - // The built in isReversed is bugged on empty selection. don't use - return isForward(selection) + return !selection.isReversed ? new Selection(start, end) : new Selection(end, start); } -export function selectionFromRange(isReversed: boolean, range: Range) { - const { start, end } = range; - return isReversed ? new Selection(end, start) : new Selection(start, end); -} - /** * Return a copy of {@link range} excluding any leading or trailing whitespace. * If {@link range} contains only whitespace or is empty {@link range} will be returned unchanged. diff --git a/src/util/setSelectionsAndFocusEditor.ts b/src/util/setSelectionsAndFocusEditor.ts index 02b23fa02a..5efe3a4564 100644 --- a/src/util/setSelectionsAndFocusEditor.ts +++ b/src/util/setSelectionsAndFocusEditor.ts @@ -1,123 +1,27 @@ -import * as semver from "semver"; -import { - commands, - NotebookDocument, - Selection, - TextEditor, - version, - ViewColumn, - window, -} from "vscode"; -import { getCellIndex } from "../libs/vscode-common/notebook"; -import { getNotebookFromCellDocument } from "./notebook"; -import { - focusNotebookCellLegacy, - isVscodeLegacyNotebookVersion, -} from "./notebookLegacy"; -import uniqDeep from "./uniqDeep"; +import Selection from "../libs/common/ide/Selection"; +import { EditableTextEditor } from "../libs/common/ide/types/TextEditor"; -const columnFocusCommands = { - [ViewColumn.One]: "workbench.action.focusFirstEditorGroup", - [ViewColumn.Two]: "workbench.action.focusSecondEditorGroup", - [ViewColumn.Three]: "workbench.action.focusThirdEditorGroup", - [ViewColumn.Four]: "workbench.action.focusFourthEditorGroup", - [ViewColumn.Five]: "workbench.action.focusFifthEditorGroup", - [ViewColumn.Six]: "workbench.action.focusSixthEditorGroup", - [ViewColumn.Seven]: "workbench.action.focusSeventhEditorGroup", - [ViewColumn.Eight]: "workbench.action.focusEighthEditorGroup", - [ViewColumn.Nine]: "workbench.action.focusNinthEditorGroup", - [ViewColumn.Active]: "", - [ViewColumn.Beside]: "", -}; +import uniqDeep from "./uniqDeep"; export async function setSelectionsAndFocusEditor( - editor: TextEditor, + editor: EditableTextEditor, selections: Selection[], revealRange: boolean = true, ) { setSelectionsWithoutFocusingEditor(editor, selections); if (revealRange) { - editor.revealRange(editor.selection); + editor.revealRange(editor.selections[0]); } // NB: We focus the editor after setting the selection because otherwise you see // an intermediate state where the old selection persists - await focusEditor(editor); + await editor.focus(); } export function setSelectionsWithoutFocusingEditor( - editor: TextEditor, + editor: EditableTextEditor, selections: Selection[], ) { editor.selections = uniqDeep(selections); } - -export async function focusEditor(editor: TextEditor) { - const viewColumn = getViewColumn(editor); - if (viewColumn != null) { - await commands.executeCommand(columnFocusCommands[viewColumn]); - } else { - // If the view column is null we see if it's a notebook and try to see if we - // can just move around in the notebook to focus the correct editor - - if (isVscodeLegacyNotebookVersion()) { - return await focusNotebookCellLegacy(editor); - } - - await focusNotebookCell(editor); - } -} - -function getViewColumn(editor: TextEditor): ViewColumn | undefined { - if (editor.viewColumn != null) { - return editor.viewColumn; - } - // TODO: tabGroups is not available on older versions of vscode we still support. - // Remove any cast as soon as version is updated. - if (semver.lt(version, "1.67.0")) { - return undefined; - } - const uri = editor.document.uri.toString(); - const tabGroup = (window as any)?.tabGroups?.all?.find((tabGroup: any) => - tabGroup?.tabs.find((tab: any) => tab?.input?.modified?.toString() === uri), - ); - return tabGroup?.viewColumn; -} - -async function focusNotebookCell(editor: TextEditor) { - const desiredNotebookEditor = getNotebookFromCellDocument(editor.document); - if (desiredNotebookEditor == null) { - throw new Error("Couldn't find notebook editor for given document"); - } - - const desiredNotebookDocument: NotebookDocument = - desiredNotebookEditor.notebook; - - await commands.executeCommand( - columnFocusCommands[ - desiredNotebookEditor.viewColumn as keyof typeof columnFocusCommands - ], - ); - - const desiredEditorIndex = getCellIndex( - desiredNotebookDocument, - editor.document, - ); - - const desiredSelections = [ - desiredNotebookEditor.selection.with({ - start: desiredEditorIndex, - end: desiredEditorIndex + 1, - }), - ]; - desiredNotebookEditor.selections = desiredSelections; - desiredNotebookEditor.revealRange(desiredSelections[0]); - - // Issue a command to tell VSCode to focus the cell input editor - // NB: We don't issue the command if it's already focused, because it turns - // out that this command is actually a toggle, so that causes it to de-focus! - if (ide().activeTextEditor !== editor) { - await commands.executeCommand("notebook.cell.edit"); - } -} diff --git a/src/util/targetUtils.ts b/src/util/targetUtils.ts index 48fe5e1a30..85f943b170 100644 --- a/src/util/targetUtils.ts +++ b/src/util/targetUtils.ts @@ -1,5 +1,7 @@ import { zip } from "lodash"; -import { Range, Selection, TextEditor } from "vscode"; +import Range from "../libs/common/ide/Range"; +import Selection from "../libs/common/ide/Selection"; +import { TextEditor } from "../libs/common/ide/types/TextEditor"; import { Target } from "../typings/target.types"; import { SelectionWithEditor } from "../typings/Types"; import { groupBy } from "./itertools"; diff --git a/src/util/tryConstructTarget.ts b/src/util/tryConstructTarget.ts index 99eb8aeb84..e5a722a1fa 100644 --- a/src/util/tryConstructTarget.ts +++ b/src/util/tryConstructTarget.ts @@ -1,4 +1,5 @@ -import { Range, TextEditor } from "vscode"; +import Range from "../libs/common/ide/Range"; +import { TextEditor } from "../libs/common/ide/types/TextEditor"; import { CommonTargetParameters, LineTarget, diff --git a/yarn.lock b/yarn.lock index 9bed5c55c5..1d9821411c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -157,6 +157,11 @@ "resolved" "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz" "version" "8.1.2" +"@types/uuid@^8.3.4": + "integrity" "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + "resolved" "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz" + "version" "8.3.4" + "@types/vscode@~1.61.0": "integrity" "sha512-9k5Nwq45hkRwdfCFY+eKXeQQSbPoA114mF7U/4uJXRBJeGIO7MuJdhF1PnaDN+lllL9iKGQtd6FFXShBXMNaFg==" "resolved" "https://registry.npmjs.org/@types/vscode/-/vscode-1.61.0.tgz" @@ -1981,6 +1986,11 @@ "resolved" "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz" "version" "1.0.3" +"uuid@^9.0.0": + "integrity" "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + "resolved" "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz" + "version" "9.0.0" + "v8-compile-cache@^2.0.3": "integrity" "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" "resolved" "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" From ad3d964744f6e17660383888c9ec75ff957d37ed Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 11 Nov 2022 13:58:43 +0000 Subject: [PATCH 06/84] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1e3b032038..d9c4289825 100644 --- a/package.json +++ b/package.json @@ -625,4 +625,4 @@ "uuid": "^9.0.0", "vscode-uri": "^3.0.6" } -} \ No newline at end of file +} From 5a7a172b8e9966103ecd85dad34e4929e7faf1cb Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Fri, 11 Nov 2022 16:17:47 +0100 Subject: [PATCH 07/84] More stuff --- src/actions/BringMoveSwap.ts | 27 ++++++++++------- src/actions/Call.ts | 6 ++-- src/actions/Clear.ts | 4 +-- src/actions/CommandAction.ts | 11 ++++--- src/actions/CutCopy.ts | 4 +-- src/actions/Deselect.ts | 8 ++--- src/actions/EditNew/EditNew.ts | 9 +++--- src/actions/EditNew/EditNew.types.ts | 4 +-- src/actions/EditNew/runCommandTargets.ts | 5 ++-- src/actions/EditNew/runEditTargets.ts | 16 +++++----- src/actions/ExecuteCommand.ts | 4 +-- src/actions/Find.ts | 4 +-- src/actions/Fold.ts | 14 +++++---- src/actions/FollowLink.ts | 4 +-- src/actions/GetText.ts | 4 +-- src/actions/Highlight.ts | 4 +-- src/actions/InsertCopy.ts | 15 ++++++---- src/actions/InsertEmptyLines.ts | 13 ++++---- src/actions/InsertSnippet.ts | 4 +-- src/actions/MakeshiftActions.ts | 4 +-- src/actions/Paste.ts | 13 ++++---- src/actions/Remove.ts | 4 +-- src/actions/Replace.ts | 4 +-- src/actions/Rewrap.ts | 26 +++++++++------- src/actions/Scroll.ts | 13 ++++---- src/actions/SetSelection.ts | 6 ++-- src/actions/Sort.ts | 4 +-- src/actions/ToggleBreakpoint.ts | 38 ++++++++++++------------ src/actions/Wrap.ts | 4 +-- src/actions/WrapWithSnippet.ts | 4 +-- src/actions/actions.types.ts | 8 ++--- src/core/commandRunner/CommandRunner.ts | 7 ++++- src/core/editStyles.ts | 10 +++---- src/ide/vscode/VscodeIDE.ts | 18 ++++++++++- src/ide/vscode/VscodeTextEditorImpl.ts | 2 +- src/libs/common/ide/fake/FakeIDE.ts | 7 ++++- src/libs/common/ide/spy/SpyIDE.ts | 15 ++++++++-- src/libs/common/ide/types/ide.types.ts | 14 ++++++++- src/typings/target.types.ts | 9 +++++- src/util/targetUtils.ts | 33 +++++++++++++------- src/util/unifyRanges.ts | 2 +- 41 files changed, 242 insertions(+), 163 deletions(-) diff --git a/src/actions/BringMoveSwap.ts b/src/actions/BringMoveSwap.ts index b13c9e5a57..d9e2bed9ba 100644 --- a/src/actions/BringMoveSwap.ts +++ b/src/actions/BringMoveSwap.ts @@ -4,9 +4,8 @@ import { getSelectionInfo, performEditsAndUpdateFullSelectionInfos, } from "../core/updateSelections/updateSelections"; -import { Target } from "../typings/target.types"; +import { EditableTarget, Target } from "../typings/target.types"; import { EditWithRangeUpdater, Graph } from "../typings/Types"; -import { selectionFromRange } from "../util/selectionUtils"; import { setSelectionsWithoutFocusingEditor } from "../util/setSelectionsAndFocusEditor"; import { getContentRange, runForEachEditor } from "../util/targetUtils"; import { unifyRemovalTargets } from "../util/unifyRanges"; @@ -18,14 +17,14 @@ interface ExtendedEdit { edit: EditWithRangeUpdater; editor: TextEditor; isSource: boolean; - originalTarget: Target; + originalTarget: EditableTarget; } interface MarkEntry { editor: TextEditor; selection: Selection; isSource: boolean; - target: Target; + target: EditableTarget; } class BringMoveSwap implements Action { @@ -33,7 +32,10 @@ class BringMoveSwap implements Action { this.run = this.run.bind(this); } - private broadcastSource(sources: Target[], destinations: Target[]) { + private broadcastSource( + sources: EditableTarget[], + destinations: EditableTarget[], + ) { if (sources.length === 1 && this.type !== "swap") { // If there is only one source target, expand it to same length as // destination target @@ -79,8 +81,11 @@ class BringMoveSwap implements Action { ]); } - private getEdits(sources: Target[], destinations: Target[]): ExtendedEdit[] { - const usedSources: Target[] = []; + private getEdits( + sources: EditableTarget[], + destinations: EditableTarget[], + ): ExtendedEdit[] { + const usedSources: EditableTarget[] = []; const results: ExtendedEdit[] = []; const zipSources = sources.length !== destinations.length && @@ -167,7 +172,7 @@ class BringMoveSwap implements Action { ({ edit: { range }, originalTarget }) => getSelectionInfo( editor.document, - selectionFromRange(originalTarget.isReversed, range), + range.toSelection(originalTarget.isReversed), DecorationRangeBehavior.OpenOpen, ), ); @@ -199,7 +204,7 @@ class BringMoveSwap implements Action { const target = edit.originalTarget; return { editor, - selection: selectionFromRange(target.isReversed, range), + selection: range.toSelection(target.isReversed), isSource: edit.isSource, target, }; @@ -246,8 +251,8 @@ class BringMoveSwap implements Action { } async run([sources, destinations]: [ - Target[], - Target[], + EditableTarget[], + EditableTarget[], ]): Promise { sources = this.broadcastSource(sources, destinations); diff --git a/src/actions/Call.ts b/src/actions/Call.ts index 9030dc4792..e84a863c41 100644 --- a/src/actions/Call.ts +++ b/src/actions/Call.ts @@ -1,4 +1,4 @@ -import { Target } from "../typings/target.types"; +import { EditableTarget } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { ensureSingleTarget } from "../util/targetUtils"; import { Action, ActionReturnValue } from "./actions.types"; @@ -9,8 +9,8 @@ export default class Call implements Action { } async run([sources, destinations]: [ - Target[], - Target[], + EditableTarget[], + EditableTarget[], ]): Promise { ensureSingleTarget(sources); diff --git a/src/actions/Clear.ts b/src/actions/Clear.ts index ba55d5ebd5..7110fb31c8 100644 --- a/src/actions/Clear.ts +++ b/src/actions/Clear.ts @@ -1,5 +1,5 @@ import { PlainTarget } from "../processTargets/targets"; -import { Target } from "../typings/target.types"; +import { EditableTarget } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { setSelectionsAndFocusEditor } from "../util/setSelectionsAndFocusEditor"; import { ensureSingleEditor } from "../util/targetUtils"; @@ -10,7 +10,7 @@ export default class Clear implements Action { this.run = this.run.bind(this); } - async run([targets]: [Target[]]): Promise { + async run([targets]: [EditableTarget[]]): Promise { const editor = ensureSingleEditor(targets); // Convert to plain targets so that the remove action just removes the // content range instead of the removal range diff --git a/src/actions/CommandAction.ts b/src/actions/CommandAction.ts index 73acfac86d..e1876c79cb 100644 --- a/src/actions/CommandAction.ts +++ b/src/actions/CommandAction.ts @@ -3,10 +3,9 @@ import { commands } from "vscode"; import { selectionToThatTarget } from "../core/commandRunner/selectionToThatTarget"; import { callFunctionAndUpdateSelections } from "../core/updateSelections/updateSelections"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; -import { Target } from "../typings/target.types"; +import { EditableTarget, Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { - focusEditor, setSelectionsAndFocusEditor, setSelectionsWithoutFocusingEditor, } from "../util/setSelectionsAndFocusEditor"; @@ -40,7 +39,7 @@ export default class CommandAction implements Action { } private async runCommandAndUpdateSelections( - targets: Target[], + targets: EditableTarget[], options: Required, ): Promise { return flatten( @@ -89,7 +88,7 @@ export default class CommandAction implements Action { } async run( - [targets]: [Target[]], + [targets]: [EditableTarget[]], options: CommandOptions = {}, ): Promise { const partialOptions = Object.assign( @@ -120,7 +119,7 @@ export default class CommandAction implements Action { ensureSingleTarget(targets); } - const originalEditor = ide().activeTextEditor; + const originalEditor = ide().activeEditableTextEditor; const thatTargets = await this.runCommandAndUpdateSelections( targets, @@ -136,7 +135,7 @@ export default class CommandAction implements Action { // NB: We just do one editor focus at the end, instead of using // setSelectionsAndFocusEditor because the command might operate on // multiple editors, so we just do one focus at the end. - await focusEditor(originalEditor); + await originalEditor.focus(); } return { thatTargets }; diff --git a/src/actions/CutCopy.ts b/src/actions/CutCopy.ts index 654e5be05c..c2dc4c9810 100644 --- a/src/actions/CutCopy.ts +++ b/src/actions/CutCopy.ts @@ -1,5 +1,5 @@ import { PlainTarget } from "../processTargets/targets"; -import { Target } from "../typings/target.types"; +import { EditableTarget, Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { getOutsideOverflow } from "../util/targetUtils"; import { Action, ActionReturnValue } from "./actions.types"; @@ -10,7 +10,7 @@ export class Cut implements Action { this.run = this.run.bind(this); } - async run([targets]: [Target[]]): Promise { + async run([targets]: [EditableTarget[]]): Promise { const overflowTargets = targets.flatMap((target) => { const range = target.getRemovalHighlightRange(); if (range == null) { diff --git a/src/actions/Deselect.ts b/src/actions/Deselect.ts index e181aa928c..6638665076 100644 --- a/src/actions/Deselect.ts +++ b/src/actions/Deselect.ts @@ -1,5 +1,5 @@ -import { Selection } from "vscode"; -import { Target } from "../typings/target.types"; +import Selection from "../libs/common/ide/Selection"; +import { EditableTarget } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { setSelectionsWithoutFocusingEditor } from "../util/setSelectionsAndFocusEditor"; import { runOnTargetsForEachEditor } from "../util/targetUtils"; @@ -10,7 +10,7 @@ export default class Deselect implements Action { this.run = this.run.bind(this); } - async run([targets]: [Target[]]): Promise { + async run([targets]: [EditableTarget[]]): Promise { await runOnTargetsForEachEditor(targets, async (editor, targets) => { // Remove selections with a non-empty intersection const newSelections = editor.selections.filter( @@ -25,7 +25,7 @@ export default class Deselect implements Action { editor, newSelections.length > 0 ? newSelections - : [new Selection(editor.selection.active, editor.selection.active)], + : [new Selection(editor.selections[0].active)], ); }); diff --git a/src/actions/EditNew/EditNew.ts b/src/actions/EditNew/EditNew.ts index a9a2800475..ac31f249a0 100644 --- a/src/actions/EditNew/EditNew.ts +++ b/src/actions/EditNew/EditNew.ts @@ -1,16 +1,15 @@ import { containingLineIfUntypedStage } from "../../processTargets/modifiers/commonContainingScopeIfUntypedStages"; import PositionStage from "../../processTargets/modifiers/PositionStage"; import { ModifierStage } from "../../processTargets/PipelineStages.types"; -import { Target } from "../../typings/target.types"; +import { EditableTarget } from "../../typings/target.types"; import { Graph } from "../../typings/Types"; -import { selectionFromRange } from "../../util/selectionUtils"; import { setSelectionsAndFocusEditor } from "../../util/setSelectionsAndFocusEditor"; import { createThatMark, ensureSingleEditor } from "../../util/targetUtils"; import { Action, ActionReturnValue } from "../actions.types"; import { State } from "./EditNew.types"; -import { runNotebookCellTargets } from "./runNotebookCellTargets"; import { runCommandTargets } from "./runCommandTargets"; import { runEditTargets } from "./runEditTargets"; +import { runNotebookCellTargets } from "./runNotebookCellTargets"; export class EditNew implements Action { getFinalStages(): ModifierStage[] { @@ -21,7 +20,7 @@ export class EditNew implements Action { this.run = this.run.bind(this); } - async run([targets]: [Target[]]): Promise { + async run([targets]: [EditableTarget[]]): Promise { if (targets.some((target) => target.isNotebookCell)) { // It is not possible to "pour" a notebook cell and something else, // because each notebook cell is its own editor, and you can't have @@ -45,7 +44,7 @@ export class EditNew implements Action { state = await runEditTargets(this.graph, editor, state); const newSelections = state.targets.map((target, index) => - selectionFromRange(target.isReversed, state.cursorRanges[index]!), + state.cursorRanges[index]!.toSelection(target.isReversed), ); await setSelectionsAndFocusEditor(editor, newSelections); diff --git a/src/actions/EditNew/EditNew.types.ts b/src/actions/EditNew/EditNew.types.ts index 55fdbea8f2..a625359027 100644 --- a/src/actions/EditNew/EditNew.types.ts +++ b/src/actions/EditNew/EditNew.types.ts @@ -1,5 +1,5 @@ -import { Range } from "vscode"; -import { Target } from "../../typings/target.types"; +import type Range from "../../libs/common/ide/Range"; +import type { Target } from "../../typings/target.types"; /** * Internal type to be used for storing a reference to a target that will use a diff --git a/src/actions/EditNew/runCommandTargets.ts b/src/actions/EditNew/runCommandTargets.ts index 423645a11a..3aad1ed6ad 100644 --- a/src/actions/EditNew/runCommandTargets.ts +++ b/src/actions/EditNew/runCommandTargets.ts @@ -1,5 +1,6 @@ -import { commands, TextEditor } from "vscode"; +import { commands } from "vscode"; import { callFunctionAndUpdateRanges } from "../../core/updateSelections/updateSelections"; +import { EditableTextEditor } from "../../libs/common/ide/types/TextEditor"; import { Graph } from "../../typings/Types"; import { CommandTarget, State } from "./EditNew.types"; @@ -16,7 +17,7 @@ import { CommandTarget, State } from "./EditNew.types"; */ export async function runCommandTargets( graph: Graph, - editor: TextEditor, + editor: EditableTextEditor, state: State, ): Promise { const commandTargets: CommandTarget[] = state.targets diff --git a/src/actions/EditNew/runEditTargets.ts b/src/actions/EditNew/runEditTargets.ts index b3363405e9..74715fa85c 100644 --- a/src/actions/EditNew/runEditTargets.ts +++ b/src/actions/EditNew/runEditTargets.ts @@ -1,6 +1,8 @@ import { zip } from "lodash"; -import { DecorationRangeBehavior, Range, Selection, TextEditor } from "vscode"; +import { DecorationRangeBehavior } from "vscode"; import { performEditsAndUpdateSelectionsWithBehavior } from "../../core/updateSelections/updateSelections"; +import Selection from "../../libs/common/ide/Selection"; +import { EditableTextEditor } from "../../libs/common/ide/types/TextEditor"; import { Graph } from "../../typings/Types"; import { EditTarget, State } from "./EditNew.types"; @@ -19,7 +21,7 @@ import { EditTarget, State } from "./EditNew.types"; */ export async function runEditTargets( graph: Graph, - editor: TextEditor, + editor: EditableTextEditor, state: State, ): Promise { const editTargets: EditTarget[] = state.targets @@ -43,7 +45,7 @@ export async function runEditTargets( ); const thatSelections = { - selections: state.thatRanges.map(toSelection), + selections: state.thatRanges.map((r) => r.toSelection(false)), }; // We need to remove undefined cursor locations. Note that these undefined @@ -57,11 +59,11 @@ export async function runEditTargets( const cursorIndices = cursorInfos.map(({ index }) => index); const cursorSelections = { - selections: cursorInfos.map(({ range }) => toSelection(range!)), + selections: cursorInfos.map(({ range }) => range!.toSelection(false)), }; const editSelections = { - selections: edits.map((edit) => toSelection(edit.range)), + selections: edits.map((edit) => edit.range.toSelection(false)), rangeBehavior: DecorationRangeBehavior.OpenOpen, }; @@ -96,7 +98,3 @@ export async function runEditTargets( cursorRanges: updatedCursorRanges, }; } - -function toSelection(range: Range) { - return new Selection(range.start, range.end); -} diff --git a/src/actions/ExecuteCommand.ts b/src/actions/ExecuteCommand.ts index ab25c6b24f..1631aab376 100644 --- a/src/actions/ExecuteCommand.ts +++ b/src/actions/ExecuteCommand.ts @@ -1,4 +1,4 @@ -import { Target } from "../typings/target.types"; +import { EditableTarget } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { Action, ActionReturnValue } from "./actions.types"; import CommandAction, { CommandOptions } from "./CommandAction"; @@ -15,7 +15,7 @@ export default class ExecuteCommand implements Action { } async run( - targets: [Target[]], + targets: [EditableTarget[]], command: string, args: CommandOptions = {}, ): Promise { diff --git a/src/actions/Find.ts b/src/actions/Find.ts index 9526504416..41fc737e0e 100644 --- a/src/actions/Find.ts +++ b/src/actions/Find.ts @@ -1,5 +1,5 @@ import { commands } from "vscode"; -import { Target } from "../typings/target.types"; +import { EditableTarget } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { ensureSingleTarget } from "../util/targetUtils"; import { Action, ActionReturnValue } from "./actions.types"; @@ -9,7 +9,7 @@ export class FindInFiles implements Action { this.run = this.run.bind(this); } - async run([targets]: [Target[]]): Promise { + async run([targets]: [EditableTarget[]]): Promise { ensureSingleTarget(targets); const { diff --git a/src/actions/Fold.ts b/src/actions/Fold.ts index b4048dea34..1d1f61d499 100644 --- a/src/actions/Fold.ts +++ b/src/actions/Fold.ts @@ -1,8 +1,7 @@ import { commands } from "vscode"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; -import { Target } from "../typings/target.types"; +import { EditableTarget } from "../typings/target.types"; import { Graph } from "../typings/Types"; -import { focusEditor } from "../util/setSelectionsAndFocusEditor"; import { createThatMark, ensureSingleEditor } from "../util/targetUtils"; import { Action, ActionReturnValue } from "./actions.types"; @@ -11,12 +10,15 @@ class FoldAction implements Action { this.run = this.run.bind(this); } - async run([targets]: [Target[], Target[]]): Promise { - const originalEditor = ide().activeTextEditor; + async run([targets]: [ + EditableTarget[], + EditableTarget[], + ]): Promise { + const originalEditor = ide().activeEditableTextEditor; const editor = ensureSingleEditor(targets); if (originalEditor !== editor) { - await focusEditor(editor); + await editor.focus(); } const singleLineTargets = targets.filter( @@ -42,7 +44,7 @@ class FoldAction implements Action { // If necessary focus back original editor if (originalEditor != null && originalEditor !== editor) { - await focusEditor(originalEditor); + await originalEditor.focus(); } return { diff --git a/src/actions/FollowLink.ts b/src/actions/FollowLink.ts index a10e1be6db..c70c873e8f 100644 --- a/src/actions/FollowLink.ts +++ b/src/actions/FollowLink.ts @@ -1,5 +1,5 @@ import { env, Uri, window } from "vscode"; -import { Target } from "../typings/target.types"; +import { EditableTarget } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { getLinkForTarget } from "../util/getLinks"; import { createThatMark, ensureSingleTarget } from "../util/targetUtils"; @@ -10,7 +10,7 @@ export default class FollowLink implements Action { this.run = this.run.bind(this); } - async run([targets]: [Target[]]): Promise { + async run([targets]: [EditableTarget[]]): Promise { const target = ensureSingleTarget(targets); await this.graph.editStyles.displayPendingEditDecorations( diff --git a/src/actions/GetText.ts b/src/actions/GetText.ts index c702d513e0..ecd81fc633 100644 --- a/src/actions/GetText.ts +++ b/src/actions/GetText.ts @@ -1,4 +1,4 @@ -import { Target } from "../typings/target.types"; +import { EditableTarget } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { ensureSingleTarget } from "../util/targetUtils"; import { Action, ActionReturnValue } from "./actions.types"; @@ -9,7 +9,7 @@ export default class GetText implements Action { } async run( - [targets]: [Target[]], + [targets]: [EditableTarget[]], { showDecorations = true, ensureSingleTarget: doEnsureSingleTarget = false, diff --git a/src/actions/Highlight.ts b/src/actions/Highlight.ts index 0ff5b0f317..57fa8a49f7 100644 --- a/src/actions/Highlight.ts +++ b/src/actions/Highlight.ts @@ -1,5 +1,5 @@ import { EditStyleName } from "../core/editStyles"; -import { Target } from "../typings/target.types"; +import { EditableTarget } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { Action, ActionReturnValue } from "./actions.types"; @@ -9,7 +9,7 @@ export default class Highlight implements Action { } async run( - [targets]: [Target[]], + [targets]: [EditableTarget[]], styleName: EditStyleName = "highlight0", ): Promise { const style = this.graph.editStyles[styleName]; diff --git a/src/actions/InsertCopy.ts b/src/actions/InsertCopy.ts index 4affc78f1c..9b93a00b89 100644 --- a/src/actions/InsertCopy.ts +++ b/src/actions/InsertCopy.ts @@ -1,8 +1,10 @@ import { flatten, zip } from "lodash"; -import { DecorationRangeBehavior, Selection, TextEditor } from "vscode"; +import { DecorationRangeBehavior } from "vscode"; import { performEditsAndUpdateSelectionsWithBehavior } from "../core/updateSelections/updateSelections"; +import Selection from "../libs/common/ide/Selection"; +import { EditableTextEditor } from "../libs/common/ide/types/TextEditor"; import { containingLineIfUntypedStage } from "../processTargets/modifiers/commonContainingScopeIfUntypedStages"; -import { Target } from "../typings/target.types"; +import { EditableTarget } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { setSelectionsWithoutFocusingEditor } from "../util/setSelectionsAndFocusEditor"; import { createThatMark, runOnTargetsForEachEditor } from "../util/targetUtils"; @@ -16,7 +18,7 @@ class InsertCopy implements Action { this.runForEditor = this.runForEditor.bind(this); } - async run([targets]: [Target[]]): Promise { + async run([targets]: [EditableTarget[]]): Promise { const results = flatten( await runOnTargetsForEachEditor(targets, this.runForEditor), ); @@ -38,7 +40,10 @@ class InsertCopy implements Action { }; } - private async runForEditor(editor: TextEditor, targets: Target[]) { + private async runForEditor( + editor: EditableTextEditor, + targets: EditableTarget[], + ) { // isBefore is inverted because we want the selections to stay with what is to the user the "copy" const position = this.isBefore ? "after" : "before"; const edits = targets.flatMap((target) => @@ -72,7 +77,7 @@ class InsertCopy implements Action { ); setSelectionsWithoutFocusingEditor(editor, updatedEditorSelections); - editor.revealRange(editor.selection); + editor.revealRange(editor.selections[0]); return { sourceMark: createThatMark(targets, insertionRanges), diff --git a/src/actions/InsertEmptyLines.ts b/src/actions/InsertEmptyLines.ts index 16acc2274b..653bced5af 100644 --- a/src/actions/InsertEmptyLines.ts +++ b/src/actions/InsertEmptyLines.ts @@ -1,7 +1,8 @@ import { flatten } from "lodash"; -import { Range, Selection } from "vscode"; import { performEditsAndUpdateSelections } from "../core/updateSelections/updateSelections"; -import { Target } from "../typings/target.types"; +import Range from "../libs/common/ide/Range"; +import Selection from "../libs/common/ide/Selection"; +import { EditableTarget } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { setSelectionsWithoutFocusingEditor } from "../util/setSelectionsAndFocusEditor"; import { runOnTargetsForEachEditor } from "../util/targetUtils"; @@ -16,7 +17,7 @@ class InsertEmptyLines implements Action { this.run = this.run.bind(this); } - private getRanges(targets: Target[]) { + private getRanges(targets: EditableTarget[]) { let lines = targets.flatMap((target) => { const lines: number[] = []; if (this.insertAbove) { @@ -40,7 +41,7 @@ class InsertEmptyLines implements Action { })); } - async run([targets]: [Target[]]): Promise { + async run([targets]: [EditableTarget[]]): Promise { const results = flatten( await runOnTargetsForEachEditor(targets, async (editor, targets) => { const ranges = this.getRanges(targets); @@ -70,8 +71,8 @@ class InsertEmptyLines implements Action { range: ranges[index].start.line < editor.document.lineCount - 1 ? new Range( - selection.start.translate({ lineDelta: -1 }), - selection.end.translate({ lineDelta: -1 }), + selection.start.translate(-1, undefined), + selection.end.translate(-1, undefined), ) : selection, })), diff --git a/src/actions/InsertSnippet.ts b/src/actions/InsertSnippet.ts index 3261adcbde..39023425ed 100644 --- a/src/actions/InsertSnippet.ts +++ b/src/actions/InsertSnippet.ts @@ -6,7 +6,7 @@ import { } from "../core/updateSelections/updateSelections"; import ModifyIfUntypedStage from "../processTargets/modifiers/ModifyIfUntypedStage"; import { Snippet, SnippetDefinition } from "../typings/snippet"; -import { Target } from "../typings/target.types"; +import { EditableTarget } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { findMatchingSnippetDefinitionStrict, @@ -49,7 +49,7 @@ export default class InsertSnippet implements Action { } async run( - [targets]: [Target[]], + [targets]: [EditableTarget[]], snippetName: string, substitutions: Record, ): Promise { diff --git a/src/actions/MakeshiftActions.ts b/src/actions/MakeshiftActions.ts index 46ae210605..057ef9501f 100644 --- a/src/actions/MakeshiftActions.ts +++ b/src/actions/MakeshiftActions.ts @@ -1,5 +1,5 @@ -import { Target } from "../typings/target.types"; import sleep from "../libs/common/util/sleep"; +import { EditableTarget } from "../typings/target.types"; import CommandAction from "./CommandAction"; abstract class MakeshiftAction extends CommandAction { @@ -9,7 +9,7 @@ abstract class MakeshiftAction extends CommandAction { ensureSingleTarget?: boolean; postCommandSleepMs?: number; - async run(targets: [Target[]]) { + async run(targets: [EditableTarget[]]) { const returnValue = await super.run(targets, { command: this.command, commandArgs: this.commandArg ? [this.commandArg] : [], diff --git a/src/actions/Paste.ts b/src/actions/Paste.ts index 0af21a5a6d..d14c79a810 100644 --- a/src/actions/Paste.ts +++ b/src/actions/Paste.ts @@ -4,21 +4,18 @@ import { callFunctionAndUpdateSelectionsWithBehavior, } from "../core/updateSelections/updateSelections"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; -import { Target } from "../typings/target.types"; +import { EditableTarget } from "../typings/target.types"; import { Graph } from "../typings/Types"; -import { - focusEditor, - setSelectionsWithoutFocusingEditor, -} from "../util/setSelectionsAndFocusEditor"; +import { setSelectionsWithoutFocusingEditor } from "../util/setSelectionsAndFocusEditor"; import { ensureSingleEditor } from "../util/targetUtils"; import { ActionReturnValue } from "./actions.types"; export class Paste { constructor(private graph: Graph) {} - async run([targets]: [Target[]]): Promise { + async run([targets]: [EditableTarget[]]): Promise { const targetEditor = ensureSingleEditor(targets); - const originalEditor = ide().activeTextEditor; + const originalEditor = ide().activeEditableTextEditor; // First call editNew in order to insert delimiters if necessary and leave // the cursor in the right position. Note that this action will focus the @@ -60,7 +57,7 @@ export class Paste { // NB: We just do one editor focus at the end, instead of using // setSelectionsAndFocusEditor because the command might operate on // multiple editors, so we just do one focus at the end. - await focusEditor(originalEditor); + await originalEditor.focus(); } this.graph.editStyles.displayPendingEditDecorationsForRanges( diff --git a/src/actions/Remove.ts b/src/actions/Remove.ts index 43f5b3c956..03ffb7b986 100644 --- a/src/actions/Remove.ts +++ b/src/actions/Remove.ts @@ -1,6 +1,6 @@ import { flatten } from "lodash"; import { performEditsAndUpdateRanges } from "../core/updateSelections/updateSelections"; -import { Target } from "../typings/target.types"; +import { EditableTarget } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { createThatMark, runOnTargetsForEachEditor } from "../util/targetUtils"; import { unifyRemovalTargets } from "../util/unifyRanges"; @@ -12,7 +12,7 @@ export default class Delete implements Action { } async run( - [targets]: [Target[]], + [targets]: [EditableTarget[]], { showDecorations = true } = {}, ): Promise { // Unify overlapping targets because of overlapping leading and trailing delimiters. diff --git a/src/actions/Replace.ts b/src/actions/Replace.ts index c6a8a60226..9dc384db11 100644 --- a/src/actions/Replace.ts +++ b/src/actions/Replace.ts @@ -1,6 +1,6 @@ import { flatten, zip } from "lodash"; import { performEditsAndUpdateSelections } from "../core/updateSelections/updateSelections"; -import { Target } from "../typings/target.types"; +import { EditableTarget, Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { runForEachEditor } from "../util/targetUtils"; import { Action, ActionReturnValue } from "./actions.types"; @@ -31,7 +31,7 @@ export default class Replace implements Action { } async run( - [targets]: [Target[]], + [targets]: [EditableTarget[]], replaceWith: string[] | RangeGenerator, ): Promise { await this.graph.editStyles.displayPendingEditDecorations( diff --git a/src/actions/Rewrap.ts b/src/actions/Rewrap.ts index 046d4d5d62..adea1fa053 100644 --- a/src/actions/Rewrap.ts +++ b/src/actions/Rewrap.ts @@ -1,8 +1,12 @@ import { performEditsAndUpdateRanges } from "../core/updateSelections/updateSelections"; import { containingSurroundingPairIfUntypedStage } from "../processTargets/modifiers/commonContainingScopeIfUntypedStages"; -import { Target } from "../typings/target.types"; +import { EditableTarget } from "../typings/target.types"; import { Graph } from "../typings/Types"; -import { createThatMark, runOnTargetsForEachEditor } from "../util/targetUtils"; +import { + createThatMark, + runOnTargetsForEachEditor, + toEditableTarget, +} from "../util/targetUtils"; import { Action, ActionReturnValue } from "./actions.types"; export default class Rewrap implements Action { @@ -13,19 +17,21 @@ export default class Rewrap implements Action { } async run( - [targets]: [Target[]], + [targets]: [EditableTarget[]], left: string, right: string, ): Promise { - const boundaryTargets = targets.flatMap((target) => { - const boundary = target.getBoundaryStrict(); + const boundaryTargets = targets + .flatMap((target) => { + const boundary = target.getBoundaryStrict(); - if (boundary.length !== 2) { - throw Error("Target must have an opening and closing delimiter"); - } + if (boundary.length !== 2) { + throw Error("Target must have an opening and closing delimiter"); + } - return boundary; - }); + return boundary; + }) + .map(toEditableTarget); await this.graph.editStyles.displayPendingEditDecorations( boundaryTargets, diff --git a/src/actions/Scroll.ts b/src/actions/Scroll.ts index 9f8117449e..5bc3c824d5 100644 --- a/src/actions/Scroll.ts +++ b/src/actions/Scroll.ts @@ -1,9 +1,8 @@ import { commands } from "vscode"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; -import { Target } from "../typings/target.types"; +import { EditableTarget, Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { groupBy } from "../util/itertools"; -import { focusEditor } from "../util/setSelectionsAndFocusEditor"; import { Action, ActionReturnValue } from "./actions.types"; class Scroll implements Action { @@ -11,19 +10,19 @@ class Scroll implements Action { this.run = this.run.bind(this); } - async run([targets]: [Target[]]): Promise { - const selectionGroups = groupBy(targets, (t: Target) => t.editor); + async run([targets]: [EditableTarget[]]): Promise { + const selectionGroups = groupBy(targets, (t: EditableTarget) => t.editor); const lines = Array.from(selectionGroups, ([editor, targets]) => { return { lineNumber: getLineNumber(targets, this.at), editor }; }); - const originalEditor = ide().activeTextEditor; + const originalEditor = ide().activeEditableTextEditor; for (const lineWithEditor of lines) { // For reveal line to the work we have to have the correct editor focused if (lineWithEditor.editor !== ide().activeTextEditor) { - await focusEditor(lineWithEditor.editor); + await lineWithEditor.editor.focus(); } await commands.executeCommand("revealLine", { lineNumber: lineWithEditor.lineNumber, @@ -33,7 +32,7 @@ class Scroll implements Action { // If necessary focus back original editor if (originalEditor != null && originalEditor !== ide().activeTextEditor) { - await focusEditor(originalEditor); + await originalEditor.focus(); } const decorationTargets = targets.filter((target) => { diff --git a/src/actions/SetSelection.ts b/src/actions/SetSelection.ts index 284a94f858..55a8c38162 100644 --- a/src/actions/SetSelection.ts +++ b/src/actions/SetSelection.ts @@ -1,5 +1,5 @@ -import { Selection } from "vscode"; -import { Target } from "../typings/target.types"; +import Selection from "../libs/common/ide/Selection"; +import { EditableTarget, Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { setSelectionsAndFocusEditor } from "../util/setSelectionsAndFocusEditor"; import { ensureSingleEditor } from "../util/targetUtils"; @@ -14,7 +14,7 @@ export class SetSelection implements Action { return target.contentSelection; } - async run([targets]: [Target[]]): Promise { + async run([targets]: [EditableTarget[]]): Promise { const editor = ensureSingleEditor(targets); const selections = targets.map(this.getSelection); diff --git a/src/actions/Sort.ts b/src/actions/Sort.ts index 7bd8bacfeb..ef1afe7195 100644 --- a/src/actions/Sort.ts +++ b/src/actions/Sort.ts @@ -1,5 +1,5 @@ import { shuffle } from "lodash"; -import { Target } from "../typings/target.types"; +import { EditableTarget } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { Action, ActionReturnValue } from "./actions.types"; @@ -10,7 +10,7 @@ abstract class SortBase implements Action { protected abstract sortTexts(texts: string[]): string[]; - async run(targets: Target[][]): Promise { + async run(targets: EditableTarget[][]): Promise { // First sort target by document order const sortedTargets = targets.map((t) => t diff --git a/src/actions/ToggleBreakpoint.ts b/src/actions/ToggleBreakpoint.ts index 0bf1752639..7a2ad97da2 100644 --- a/src/actions/ToggleBreakpoint.ts +++ b/src/actions/ToggleBreakpoint.ts @@ -1,20 +1,15 @@ -import { - Breakpoint, - debug, - Location, - Range, - SourceBreakpoint, - Uri, -} from "vscode"; +import * as vscode from "vscode"; +import { URI } from "vscode-uri"; +import { toVscodeRange } from "../ide/vscode/VscodeUtil"; import { containingLineIfUntypedStage } from "../processTargets/modifiers/commonContainingScopeIfUntypedStages"; -import { Target } from "../typings/target.types"; +import { EditableTarget } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { Action, ActionReturnValue } from "./actions.types"; -function getBreakpoints(uri: Uri, range: Range) { - return debug.breakpoints.filter( +function getBreakpoints(uri: URI, range: vscode.Range) { + return vscode.debug.breakpoints.filter( (breakpoint) => - breakpoint instanceof SourceBreakpoint && + breakpoint instanceof vscode.SourceBreakpoint && breakpoint.location.uri.toString() === uri.toString() && breakpoint.location.range.intersection(range) != null, ); @@ -27,7 +22,10 @@ export default class ToggleBreakpoint implements Action { this.run = this.run.bind(this); } - async run([targets]: [Target[], Target[]]): Promise { + async run([targets]: [ + EditableTarget[], + EditableTarget[], + ]): Promise { const thatTargets = targets.map(({ thatTarget }) => thatTarget); await this.graph.editStyles.displayPendingEditDecorations( @@ -35,11 +33,11 @@ export default class ToggleBreakpoint implements Action { this.graph.editStyles.referenced, ); - const toAdd: Breakpoint[] = []; - const toRemove: Breakpoint[] = []; + const toAdd: vscode.Breakpoint[] = []; + const toRemove: vscode.Breakpoint[] = []; targets.forEach((target) => { - let range = target.contentRange; + let range = toVscodeRange(target.contentRange); // The action preference give us line content but line breakpoints are registered on character 0 if (target.isLine) { range = range.with(range.start.with(undefined, 0), undefined); @@ -52,12 +50,14 @@ export default class ToggleBreakpoint implements Action { if (target.isLine) { range = range.with(undefined, range.end.with(undefined, 0)); } - toAdd.push(new SourceBreakpoint(new Location(uri, range))); + toAdd.push( + new vscode.SourceBreakpoint(new vscode.Location(uri, range)), + ); } }); - debug.addBreakpoints(toAdd); - debug.removeBreakpoints(toRemove); + vscode.debug.addBreakpoints(toAdd); + vscode.debug.removeBreakpoints(toRemove); return { thatTargets: targets, diff --git a/src/actions/Wrap.ts b/src/actions/Wrap.ts index 138014a7a7..3f83dd4645 100644 --- a/src/actions/Wrap.ts +++ b/src/actions/Wrap.ts @@ -4,7 +4,7 @@ import { performEditsAndUpdateFullSelectionInfos, } from "../core/updateSelections/updateSelections"; import Selection from "../libs/common/ide/Selection"; -import { Target } from "../typings/target.types"; +import { EditableTarget } from "../typings/target.types"; import { Edit, Graph } from "../typings/Types"; import { FullSelectionInfo } from "../typings/updateSelections"; import { setSelectionsWithoutFocusingEditor } from "../util/setSelectionsAndFocusEditor"; @@ -17,7 +17,7 @@ export default class Wrap implements Action { } async run( - [targets]: [Target[]], + [targets]: [EditableTarget[]], left: string, right: string, ): Promise { diff --git a/src/actions/WrapWithSnippet.ts b/src/actions/WrapWithSnippet.ts index 6b06454170..00c3aceadb 100644 --- a/src/actions/WrapWithSnippet.ts +++ b/src/actions/WrapWithSnippet.ts @@ -1,7 +1,7 @@ import { commands } from "vscode"; import { callFunctionAndUpdateSelections } from "../core/updateSelections/updateSelections"; import ModifyIfUntypedStage from "../processTargets/modifiers/ModifyIfUntypedStage"; -import { Target } from "../typings/target.types"; +import { EditableTarget } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { findMatchingSnippetDefinitionStrict, @@ -45,7 +45,7 @@ export default class WrapWithSnippet implements Action { } async run( - [targets]: [Target[]], + [targets]: [EditableTarget[]], snippetLocation: string, ): Promise { const [snippetName, placeholderName] = diff --git a/src/actions/actions.types.ts b/src/actions/actions.types.ts index 01c142e5b1..d66b596cbd 100644 --- a/src/actions/actions.types.ts +++ b/src/actions/actions.types.ts @@ -1,6 +1,6 @@ -import { ModifierStage } from "../processTargets/PipelineStages.types"; -import { Target } from "../typings/target.types"; -import { SelectionWithEditor } from "../typings/Types"; +import type { ModifierStage } from "../processTargets/PipelineStages.types"; +import type { EditableTarget, Target } from "../typings/target.types"; +import type { SelectionWithEditor } from "../typings/Types"; export type ActionType = | "callAsFunction" @@ -94,7 +94,7 @@ export interface ActionReturnValue { } export interface Action { - run(targets: Target[][], ...args: any[]): Promise; + run(targets: EditableTarget[][], ...args: any[]): Promise; /** * Used to define stages that should be run before the final positional stage, if there is one diff --git a/src/core/commandRunner/CommandRunner.ts b/src/core/commandRunner/CommandRunner.ts index dcc82a9dea..f03d33cf0e 100644 --- a/src/core/commandRunner/CommandRunner.ts +++ b/src/core/commandRunner/CommandRunner.ts @@ -11,6 +11,7 @@ import { ProcessedTargetsContext, SelectionWithEditor, } from "../../typings/Types"; +import { toEditableTarget } from "../../util/targetUtils"; import { isString } from "../../util/type"; import { canonicalizeAndValidateCommand, @@ -149,13 +150,17 @@ export default class CommandRunner { targetDescriptors, ); + const editableTargets = targets.map((targets) => + targets.map(toEditableTarget), + ); + const { returnValue, thatSelections: newThatSelections, thatTargets: newThatTargets, sourceSelections: newSourceSelections, sourceTargets: newSourceTargets, - } = await action.run(targets, ...actionArgs); + } = await action.run(editableTargets, ...actionArgs); this.thatMark.set(constructThatTarget(newThatTargets, newThatSelections)); this.sourceMark.set( diff --git a/src/core/editStyles.ts b/src/core/editStyles.ts index b8da397529..2802bcd804 100644 --- a/src/core/editStyles.ts +++ b/src/core/editStyles.ts @@ -1,19 +1,19 @@ import { DecorationRangeBehavior, DecorationRenderOptions, - Position, - Range, - TextEditor, TextEditorDecorationType, ThemeColor, window, workspace, } from "vscode"; +import Position from "../libs/common/ide/Position"; +import Range from "../libs/common/ide/Range"; +import { EditableTextEditor } from "../libs/common/ide/types/TextEditor"; +import sleep from "../libs/common/util/sleep"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import isTesting from "../testUtil/isTesting"; import { Target } from "../typings/target.types"; import { Graph, RangeWithEditor } from "../typings/Types"; -import sleep from "../libs/common/util/sleep"; import { getContentRange, runForEachEditor, @@ -177,7 +177,7 @@ export class EditStyles implements Record { } private setEditorDecorations( - editor: TextEditor, + editor: EditableTextEditor, style: EditStyle, isToken: boolean, ranges: Range[], diff --git a/src/ide/vscode/VscodeIDE.ts b/src/ide/vscode/VscodeIDE.ts index 447246c751..ac703aca1b 100644 --- a/src/ide/vscode/VscodeIDE.ts +++ b/src/ide/vscode/VscodeIDE.ts @@ -11,9 +11,13 @@ import { IDE, RunMode, } from "../../libs/common/ide/types/ide.types"; -import type { TextEditor } from "../../libs/common/ide/types/TextEditor"; +import type { + EditableTextEditor, + TextEditor, +} from "../../libs/common/ide/types/TextEditor"; import VscodeClipboard from "./VscodeClipboard"; import VscodeConfiguration from "./VscodeConfiguration"; +import VscodeEditableTextEditorImpl from "./VscodeEditableTextEditorImpl"; import VscodeGlobalState from "./VscodeGlobalState"; import VscodeMessages from "./VscodeMessages"; import VscodeTextEditorImpl from "./VscodeTextEditorImpl"; @@ -55,6 +59,18 @@ export default class VscodeIDE implements IDE { : undefined; } + get activeEditableTextEditor(): EditableTextEditor | undefined { + return window.activeTextEditor != null + ? new VscodeEditableTextEditorImpl(window.activeTextEditor) + : undefined; + } + + public getEditableTextEditor(editor: TextEditor): EditableTextEditor { + return new VscodeEditableTextEditorImpl( + (editor as VscodeTextEditorImpl).editor, + ); + } + disposeOnExit(...disposables: Disposable[]): () => void { this.extensionContext.subscriptions.push(...disposables); diff --git a/src/ide/vscode/VscodeTextEditorImpl.ts b/src/ide/vscode/VscodeTextEditorImpl.ts index b2265911b0..51733fe96c 100644 --- a/src/ide/vscode/VscodeTextEditorImpl.ts +++ b/src/ide/vscode/VscodeTextEditorImpl.ts @@ -11,7 +11,7 @@ export default class VscodeTextEditorImpl implements TextEditor { readonly id: string; readonly document: TextDocument; - constructor(protected editor: vscode.TextEditor) { + constructor(public editor: vscode.TextEditor) { this.id = uuid(); this.document = new VscodeTextDocumentImpl(editor.document); } diff --git a/src/libs/common/ide/fake/FakeIDE.ts b/src/libs/common/ide/fake/FakeIDE.ts index 5124fdd352..b2a117cca5 100644 --- a/src/libs/common/ide/fake/FakeIDE.ts +++ b/src/libs/common/ide/fake/FakeIDE.ts @@ -5,7 +5,7 @@ import type { RunMode, WorkspaceFolder, } from "../types/ide.types"; -import { TextEditor } from "../types/TextEditor"; +import { EditableTextEditor, TextEditor } from "../types/TextEditor"; import FakeClipboard from "./FakeClipboard"; import FakeConfiguration from "./FakeConfiguration"; import FakeGlobalState from "./FakeGlobalState"; @@ -42,6 +42,11 @@ export default class FakeIDE implements IDE { runMode: RunMode = "test"; workspaceFolders: readonly WorkspaceFolder[] | undefined = undefined; activeTextEditor: TextEditor | undefined = undefined; + activeEditableTextEditor: EditableTextEditor | undefined = undefined; + + public getEditableTextEditor(_editor: TextEditor): EditableTextEditor { + throw Error("Not supported"); + } disposeOnExit(...disposables: Disposable[]): () => void { this.disposables.push(...disposables); diff --git a/src/libs/common/ide/spy/SpyIDE.ts b/src/libs/common/ide/spy/SpyIDE.ts index 4a907e4629..6e86a8ecbc 100644 --- a/src/libs/common/ide/spy/SpyIDE.ts +++ b/src/libs/common/ide/spy/SpyIDE.ts @@ -1,15 +1,16 @@ import { pickBy, values } from "lodash"; +import { EditableTarget, Target } from "../../../../typings/target.types"; +import type { Clipboard } from "../types/Clipboard"; +import type { Configuration } from "../types/Configuration"; import type { Disposable, IDE, RunMode, WorkspaceFolder, } from "../types/ide.types"; -import type { Configuration } from "../types/Configuration"; import type { State } from "../types/State"; +import { EditableTextEditor, TextEditor } from "../types/TextEditor"; import SpyMessages, { Message } from "./SpyMessages"; -import type { Clipboard } from "../types/Clipboard"; -import { TextEditor } from "../types/TextEditor"; export interface SpyIDERecordedValues { messages?: Message[]; @@ -32,6 +33,10 @@ export default class SpyIDE implements IDE { return this.original.activeTextEditor; } + public get activeEditableTextEditor(): EditableTextEditor | undefined { + return this.original.activeEditableTextEditor; + } + public get assetsRoot(): string { return this.original.assetsRoot; } @@ -44,6 +49,10 @@ export default class SpyIDE implements IDE { return this.original.workspaceFolders; } + public getEditableTextEditor(editor: TextEditor): EditableTextEditor { + return this.original.getEditableTextEditor(editor); + } + disposeOnExit(...disposables: Disposable[]): () => void { return this.original.disposeOnExit(...disposables); } diff --git a/src/libs/common/ide/types/ide.types.ts b/src/libs/common/ide/types/ide.types.ts index af4aab9c17..9bfefa3b86 100644 --- a/src/libs/common/ide/types/ide.types.ts +++ b/src/libs/common/ide/types/ide.types.ts @@ -1,9 +1,10 @@ import { URI } from "vscode-uri"; +import { EditableTarget, Target } from "../../../../typings/target.types"; import { Clipboard } from "./Clipboard"; import { Configuration } from "./Configuration"; import { Messages } from "./Messages"; import { State } from "./State"; -import type { TextEditor } from "./TextEditor"; +import type { EditableTextEditor, TextEditor } from "./TextEditor"; export type RunMode = "production" | "development" | "test"; @@ -43,6 +44,17 @@ export interface IDE { * input most recently. */ readonly activeTextEditor: TextEditor | undefined; + + /** + * Same as {@link activeTextEditor} but editable + */ + readonly activeEditableTextEditor: EditableTextEditor | undefined; + + /** + * Get an editable version of the text editor. + * @param editor A editable text editor + */ + getEditableTextEditor(editor: TextEditor): EditableTextEditor; } export interface WorkspaceFolder { diff --git a/src/typings/target.types.ts b/src/typings/target.types.ts index d4005353b5..aedb70820c 100644 --- a/src/typings/target.types.ts +++ b/src/typings/target.types.ts @@ -17,7 +17,10 @@ import type { } from "../processTargets/targets"; import type { Position } from "./targetDescriptor.types"; import type { EditWithRangeUpdater } from "./Types"; -import type { TextEditor } from "../libs/common/ide/types/TextEditor"; +import type { + EditableTextEditor, + TextEditor, +} from "../libs/common/ide/types/TextEditor"; import type Range from "../libs/common/ide/Range"; import type Selection from "../libs/common/ide/Selection"; @@ -145,3 +148,7 @@ export interface Target { */ toPositionTarget(position: Position): Target; } + +export interface EditableTarget extends Omit { + editor: EditableTextEditor; +} diff --git a/src/util/targetUtils.ts b/src/util/targetUtils.ts index 85f943b170..218acf8304 100644 --- a/src/util/targetUtils.ts +++ b/src/util/targetUtils.ts @@ -1,12 +1,18 @@ import { zip } from "lodash"; import Range from "../libs/common/ide/Range"; import Selection from "../libs/common/ide/Selection"; -import { TextEditor } from "../libs/common/ide/types/TextEditor"; -import { Target } from "../typings/target.types"; +import { + EditableTextEditor, + TextEditor, +} from "../libs/common/ide/types/TextEditor"; +import ide from "../libs/cursorless-engine/singletons/ide.singleton"; +import { EditableTarget, Target } from "../typings/target.types"; import { SelectionWithEditor } from "../typings/Types"; import { groupBy } from "./itertools"; -export function ensureSingleEditor(targets: Target[]) { +export function ensureSingleEditor( + targets: EditableTarget[], +): EditableTextEditor { if (targets.length === 0) { throw new Error("Require at least one target with this action"); } @@ -30,8 +36,8 @@ export function ensureSingleTarget(targets: Target[]) { export async function runForEachEditor( targets: T[], - getEditor: (target: T) => TextEditor, - func: (editor: TextEditor, editorTargets: T[]) => Promise, + getEditor: (target: T) => EditableTextEditor, + func: (editor: EditableTextEditor, editorTargets: T[]) => Promise, ): Promise { return Promise.all( groupForEachEditor(targets, getEditor).map(([editor, editorTargets]) => @@ -41,20 +47,20 @@ export async function runForEachEditor( } export async function runOnTargetsForEachEditor( - targets: Target[], - func: (editor: TextEditor, targets: Target[]) => Promise, + targets: EditableTarget[], + func: (editor: EditableTextEditor, targets: EditableTarget[]) => Promise, ): Promise { return runForEachEditor(targets, (target) => target.editor, func); } -export function groupTargetsForEachEditor(targets: Target[]) { +export function groupTargetsForEachEditor(targets: EditableTarget[]) { return groupForEachEditor(targets, (target) => target.editor); } export function groupForEachEditor( targets: T[], - getEditor: (target: T) => TextEditor, -): [TextEditor, T[]][] { + getEditor: (target: T) => EditableTextEditor, +): [EditableTextEditor, T[]][] { // Actually group by document and not editor. If the same document is open in multiple editors we want to perform all actions in one editor or an concurrency error will occur. const getDocument = (target: T) => getEditor(target).document; const editorMap = groupBy(targets, getDocument); @@ -105,3 +111,10 @@ export function createThatMark( })); return thatMark; } + +export function toEditableTarget(target: Target): EditableTarget { + return { + ...target, + editor: ide().getEditableTextEditor(target.editor), + }; +} diff --git a/src/util/unifyRanges.ts b/src/util/unifyRanges.ts index 37f9866479..9bc6885e05 100644 --- a/src/util/unifyRanges.ts +++ b/src/util/unifyRanges.ts @@ -1,6 +1,6 @@ import { Range } from "vscode"; import { targetsToContinuousTarget } from "../processTargets/processTargets"; -import { Target } from "../typings/target.types"; +import { EditableTarget, Target } from "../typings/target.types"; import { groupTargetsForEachEditor } from "./targetUtils"; /** Unifies overlapping/intersecting ranges */ From 11f18b3b6fa08114888a64bf6793dc5332c6538c Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Fri, 11 Nov 2022 17:23:52 +0100 Subject: [PATCH 08/84] Stuff stuff --- src/actions/BringMoveSwap.ts | 32 +++++++++--------- src/actions/Call.ts | 6 ++-- src/actions/Clear.ts | 4 +-- src/actions/CommandAction.ts | 17 +++++++--- src/actions/CutCopy.ts | 4 +-- src/actions/Deselect.ts | 7 ++-- src/actions/EditNew/EditNew.ts | 4 +-- src/actions/ExecuteCommand.ts | 4 +-- src/actions/Find.ts | 4 +-- src/actions/Fold.ts | 7 ++-- src/actions/FollowLink.ts | 4 +-- src/actions/GetText.ts | 4 +-- src/actions/Highlight.ts | 4 +-- src/actions/InsertCopy.ts | 9 ++--- src/actions/InsertEmptyLines.ts | 12 ++++--- src/actions/InsertSnippet.ts | 4 +-- src/actions/MakeshiftActions.ts | 4 +-- src/actions/Paste.ts | 9 +++-- src/actions/Remove.ts | 4 +-- src/actions/Replace.ts | 4 +-- src/actions/Rewrap.ts | 26 ++++++--------- src/actions/Scroll.ts | 8 ++--- src/actions/SetSelection.ts | 10 ++++-- src/actions/Sort.ts | 4 +-- src/actions/ToggleBreakpoint.ts | 7 ++-- src/actions/Wrap.ts | 10 ++++-- src/actions/WrapWithSnippet.ts | 4 +-- src/actions/actions.types.ts | 4 +-- src/core/commandRunner/CommandRunner.ts | 7 +--- src/core/editStyles.ts | 10 +++--- src/core/inferFullTargets.ts | 4 +-- .../vscode/VscodeEditableTextEditorImpl.ts | 8 +++++ src/ide/vscode/VscodeTextDocumentImpl.ts | 4 +++ src/libs/common/ide/spy/SpyIDE.ts | 1 - src/libs/common/ide/types/TextDocument.ts | 6 ++++ src/libs/common/ide/types/TextEditor.ts | 15 +++++++++ .../ide/types/TextEditorDecorationType.ts | 15 +++++++++ src/libs/common/ide/types/ide.types.ts | 1 - src/typings/target.types.ts | 16 +++------ src/util/targetUtils.ts | 33 ++++++------------- src/util/unifyRanges.ts | 2 +- 41 files changed, 186 insertions(+), 156 deletions(-) create mode 100644 src/libs/common/ide/types/TextEditorDecorationType.ts diff --git a/src/actions/BringMoveSwap.ts b/src/actions/BringMoveSwap.ts index d9e2bed9ba..7a26ffdd7c 100644 --- a/src/actions/BringMoveSwap.ts +++ b/src/actions/BringMoveSwap.ts @@ -1,10 +1,13 @@ import { flatten } from "lodash"; -import { DecorationRangeBehavior, Selection, TextEditor } from "vscode"; +import { DecorationRangeBehavior } from "vscode"; import { getSelectionInfo, performEditsAndUpdateFullSelectionInfos, } from "../core/updateSelections/updateSelections"; -import { EditableTarget, Target } from "../typings/target.types"; +import Selection from "../libs/common/ide/Selection"; +import { TextEditor } from "../libs/common/ide/types/TextEditor"; +import ide from "../libs/cursorless-engine/singletons/ide.singleton"; +import { Target } from "../typings/target.types"; import { EditWithRangeUpdater, Graph } from "../typings/Types"; import { setSelectionsWithoutFocusingEditor } from "../util/setSelectionsAndFocusEditor"; import { getContentRange, runForEachEditor } from "../util/targetUtils"; @@ -17,14 +20,14 @@ interface ExtendedEdit { edit: EditWithRangeUpdater; editor: TextEditor; isSource: boolean; - originalTarget: EditableTarget; + originalTarget: Target; } interface MarkEntry { editor: TextEditor; selection: Selection; isSource: boolean; - target: EditableTarget; + target: Target; } class BringMoveSwap implements Action { @@ -32,10 +35,7 @@ class BringMoveSwap implements Action { this.run = this.run.bind(this); } - private broadcastSource( - sources: EditableTarget[], - destinations: EditableTarget[], - ) { + private broadcastSource(sources: Target[], destinations: Target[]) { if (sources.length === 1 && this.type !== "swap") { // If there is only one source target, expand it to same length as // destination target @@ -81,11 +81,8 @@ class BringMoveSwap implements Action { ]); } - private getEdits( - sources: EditableTarget[], - destinations: EditableTarget[], - ): ExtendedEdit[] { - const usedSources: EditableTarget[] = []; + private getEdits(sources: Target[], destinations: Target[]): ExtendedEdit[] { + const usedSources: Target[] = []; const results: ExtendedEdit[] = []; const zipSources = sources.length !== destinations.length && @@ -196,7 +193,10 @@ class BringMoveSwap implements Action { // NB: We set the selections here because we don't trust vscode to // properly move the cursor on a bring. Sometimes it will smear an // empty selection - setSelectionsWithoutFocusingEditor(editor, cursorSelections); + setSelectionsWithoutFocusingEditor( + ide().getEditableTextEditor(editor), + cursorSelections, + ); return edits.map((edit, index): MarkEntry => { const selection = updatedEditSelections[index]; @@ -251,8 +251,8 @@ class BringMoveSwap implements Action { } async run([sources, destinations]: [ - EditableTarget[], - EditableTarget[], + Target[], + Target[], ]): Promise { sources = this.broadcastSource(sources, destinations); diff --git a/src/actions/Call.ts b/src/actions/Call.ts index e84a863c41..9030dc4792 100644 --- a/src/actions/Call.ts +++ b/src/actions/Call.ts @@ -1,4 +1,4 @@ -import { EditableTarget } from "../typings/target.types"; +import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { ensureSingleTarget } from "../util/targetUtils"; import { Action, ActionReturnValue } from "./actions.types"; @@ -9,8 +9,8 @@ export default class Call implements Action { } async run([sources, destinations]: [ - EditableTarget[], - EditableTarget[], + Target[], + Target[], ]): Promise { ensureSingleTarget(sources); diff --git a/src/actions/Clear.ts b/src/actions/Clear.ts index 7110fb31c8..ba55d5ebd5 100644 --- a/src/actions/Clear.ts +++ b/src/actions/Clear.ts @@ -1,5 +1,5 @@ import { PlainTarget } from "../processTargets/targets"; -import { EditableTarget } from "../typings/target.types"; +import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { setSelectionsAndFocusEditor } from "../util/setSelectionsAndFocusEditor"; import { ensureSingleEditor } from "../util/targetUtils"; @@ -10,7 +10,7 @@ export default class Clear implements Action { this.run = this.run.bind(this); } - async run([targets]: [EditableTarget[]]): Promise { + async run([targets]: [Target[]]): Promise { const editor = ensureSingleEditor(targets); // Convert to plain targets so that the remove action just removes the // content range instead of the removal range diff --git a/src/actions/CommandAction.ts b/src/actions/CommandAction.ts index e1876c79cb..3583c4aa29 100644 --- a/src/actions/CommandAction.ts +++ b/src/actions/CommandAction.ts @@ -3,7 +3,7 @@ import { commands } from "vscode"; import { selectionToThatTarget } from "../core/commandRunner/selectionToThatTarget"; import { callFunctionAndUpdateSelections } from "../core/updateSelections/updateSelections"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; -import { EditableTarget, Target } from "../typings/target.types"; +import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { setSelectionsAndFocusEditor, @@ -39,7 +39,7 @@ export default class CommandAction implements Action { } private async runCommandAndUpdateSelections( - targets: EditableTarget[], + targets: Target[], options: Required, ): Promise { return flatten( @@ -52,7 +52,11 @@ export default class CommandAction implements Action { ); // For command to the work we have to have the correct editor focused - await setSelectionsAndFocusEditor(editor, targetSelections, false); + await setSelectionsAndFocusEditor( + ide().getEditableTextEditor(editor), + targetSelections, + false, + ); const [updatedOriginalSelections, updatedTargetSelections] = await callFunctionAndUpdateSelections( @@ -69,7 +73,10 @@ export default class CommandAction implements Action { // very end. This code can run on multiple editors in the course of // one command, so we want to avoid focusing the editor multiple // times. - setSelectionsWithoutFocusingEditor(editor, updatedOriginalSelections); + setSelectionsWithoutFocusingEditor( + ide().getEditableTextEditor(editor), + updatedOriginalSelections, + ); } // If the document hasn't changed then we just return the original targets @@ -88,7 +95,7 @@ export default class CommandAction implements Action { } async run( - [targets]: [EditableTarget[]], + [targets]: [Target[]], options: CommandOptions = {}, ): Promise { const partialOptions = Object.assign( diff --git a/src/actions/CutCopy.ts b/src/actions/CutCopy.ts index c2dc4c9810..654e5be05c 100644 --- a/src/actions/CutCopy.ts +++ b/src/actions/CutCopy.ts @@ -1,5 +1,5 @@ import { PlainTarget } from "../processTargets/targets"; -import { EditableTarget, Target } from "../typings/target.types"; +import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { getOutsideOverflow } from "../util/targetUtils"; import { Action, ActionReturnValue } from "./actions.types"; @@ -10,7 +10,7 @@ export class Cut implements Action { this.run = this.run.bind(this); } - async run([targets]: [EditableTarget[]]): Promise { + async run([targets]: [Target[]]): Promise { const overflowTargets = targets.flatMap((target) => { const range = target.getRemovalHighlightRange(); if (range == null) { diff --git a/src/actions/Deselect.ts b/src/actions/Deselect.ts index 6638665076..183701d201 100644 --- a/src/actions/Deselect.ts +++ b/src/actions/Deselect.ts @@ -1,5 +1,6 @@ import Selection from "../libs/common/ide/Selection"; -import { EditableTarget } from "../typings/target.types"; +import ide from "../libs/cursorless-engine/singletons/ide.singleton"; +import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { setSelectionsWithoutFocusingEditor } from "../util/setSelectionsAndFocusEditor"; import { runOnTargetsForEachEditor } from "../util/targetUtils"; @@ -10,7 +11,7 @@ export default class Deselect implements Action { this.run = this.run.bind(this); } - async run([targets]: [EditableTarget[]]): Promise { + async run([targets]: [Target[]]): Promise { await runOnTargetsForEachEditor(targets, async (editor, targets) => { // Remove selections with a non-empty intersection const newSelections = editor.selections.filter( @@ -22,7 +23,7 @@ export default class Deselect implements Action { ); // The editor requires at least one selection. Keep "primary" selection active setSelectionsWithoutFocusingEditor( - editor, + ide().getEditableTextEditor(editor), newSelections.length > 0 ? newSelections : [new Selection(editor.selections[0].active)], diff --git a/src/actions/EditNew/EditNew.ts b/src/actions/EditNew/EditNew.ts index ac31f249a0..d0e64eb709 100644 --- a/src/actions/EditNew/EditNew.ts +++ b/src/actions/EditNew/EditNew.ts @@ -1,7 +1,7 @@ import { containingLineIfUntypedStage } from "../../processTargets/modifiers/commonContainingScopeIfUntypedStages"; import PositionStage from "../../processTargets/modifiers/PositionStage"; import { ModifierStage } from "../../processTargets/PipelineStages.types"; -import { EditableTarget } from "../../typings/target.types"; +import { Target } from "../../typings/target.types"; import { Graph } from "../../typings/Types"; import { setSelectionsAndFocusEditor } from "../../util/setSelectionsAndFocusEditor"; import { createThatMark, ensureSingleEditor } from "../../util/targetUtils"; @@ -20,7 +20,7 @@ export class EditNew implements Action { this.run = this.run.bind(this); } - async run([targets]: [EditableTarget[]]): Promise { + async run([targets]: [Target[]]): Promise { if (targets.some((target) => target.isNotebookCell)) { // It is not possible to "pour" a notebook cell and something else, // because each notebook cell is its own editor, and you can't have diff --git a/src/actions/ExecuteCommand.ts b/src/actions/ExecuteCommand.ts index 1631aab376..ab25c6b24f 100644 --- a/src/actions/ExecuteCommand.ts +++ b/src/actions/ExecuteCommand.ts @@ -1,4 +1,4 @@ -import { EditableTarget } from "../typings/target.types"; +import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { Action, ActionReturnValue } from "./actions.types"; import CommandAction, { CommandOptions } from "./CommandAction"; @@ -15,7 +15,7 @@ export default class ExecuteCommand implements Action { } async run( - targets: [EditableTarget[]], + targets: [Target[]], command: string, args: CommandOptions = {}, ): Promise { diff --git a/src/actions/Find.ts b/src/actions/Find.ts index 41fc737e0e..9526504416 100644 --- a/src/actions/Find.ts +++ b/src/actions/Find.ts @@ -1,5 +1,5 @@ import { commands } from "vscode"; -import { EditableTarget } from "../typings/target.types"; +import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { ensureSingleTarget } from "../util/targetUtils"; import { Action, ActionReturnValue } from "./actions.types"; @@ -9,7 +9,7 @@ export class FindInFiles implements Action { this.run = this.run.bind(this); } - async run([targets]: [EditableTarget[]]): Promise { + async run([targets]: [Target[]]): Promise { ensureSingleTarget(targets); const { diff --git a/src/actions/Fold.ts b/src/actions/Fold.ts index 1d1f61d499..3510b9e6c6 100644 --- a/src/actions/Fold.ts +++ b/src/actions/Fold.ts @@ -1,6 +1,6 @@ import { commands } from "vscode"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; -import { EditableTarget } from "../typings/target.types"; +import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { createThatMark, ensureSingleEditor } from "../util/targetUtils"; import { Action, ActionReturnValue } from "./actions.types"; @@ -10,10 +10,7 @@ class FoldAction implements Action { this.run = this.run.bind(this); } - async run([targets]: [ - EditableTarget[], - EditableTarget[], - ]): Promise { + async run([targets]: [Target[], Target[]]): Promise { const originalEditor = ide().activeEditableTextEditor; const editor = ensureSingleEditor(targets); diff --git a/src/actions/FollowLink.ts b/src/actions/FollowLink.ts index c70c873e8f..a10e1be6db 100644 --- a/src/actions/FollowLink.ts +++ b/src/actions/FollowLink.ts @@ -1,5 +1,5 @@ import { env, Uri, window } from "vscode"; -import { EditableTarget } from "../typings/target.types"; +import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { getLinkForTarget } from "../util/getLinks"; import { createThatMark, ensureSingleTarget } from "../util/targetUtils"; @@ -10,7 +10,7 @@ export default class FollowLink implements Action { this.run = this.run.bind(this); } - async run([targets]: [EditableTarget[]]): Promise { + async run([targets]: [Target[]]): Promise { const target = ensureSingleTarget(targets); await this.graph.editStyles.displayPendingEditDecorations( diff --git a/src/actions/GetText.ts b/src/actions/GetText.ts index ecd81fc633..c702d513e0 100644 --- a/src/actions/GetText.ts +++ b/src/actions/GetText.ts @@ -1,4 +1,4 @@ -import { EditableTarget } from "../typings/target.types"; +import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { ensureSingleTarget } from "../util/targetUtils"; import { Action, ActionReturnValue } from "./actions.types"; @@ -9,7 +9,7 @@ export default class GetText implements Action { } async run( - [targets]: [EditableTarget[]], + [targets]: [Target[]], { showDecorations = true, ensureSingleTarget: doEnsureSingleTarget = false, diff --git a/src/actions/Highlight.ts b/src/actions/Highlight.ts index 57fa8a49f7..0ff5b0f317 100644 --- a/src/actions/Highlight.ts +++ b/src/actions/Highlight.ts @@ -1,5 +1,5 @@ import { EditStyleName } from "../core/editStyles"; -import { EditableTarget } from "../typings/target.types"; +import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { Action, ActionReturnValue } from "./actions.types"; @@ -9,7 +9,7 @@ export default class Highlight implements Action { } async run( - [targets]: [EditableTarget[]], + [targets]: [Target[]], styleName: EditStyleName = "highlight0", ): Promise { const style = this.graph.editStyles[styleName]; diff --git a/src/actions/InsertCopy.ts b/src/actions/InsertCopy.ts index 9b93a00b89..7a78bcd0fe 100644 --- a/src/actions/InsertCopy.ts +++ b/src/actions/InsertCopy.ts @@ -4,7 +4,7 @@ import { performEditsAndUpdateSelectionsWithBehavior } from "../core/updateSelec import Selection from "../libs/common/ide/Selection"; import { EditableTextEditor } from "../libs/common/ide/types/TextEditor"; import { containingLineIfUntypedStage } from "../processTargets/modifiers/commonContainingScopeIfUntypedStages"; -import { EditableTarget } from "../typings/target.types"; +import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { setSelectionsWithoutFocusingEditor } from "../util/setSelectionsAndFocusEditor"; import { createThatMark, runOnTargetsForEachEditor } from "../util/targetUtils"; @@ -18,7 +18,7 @@ class InsertCopy implements Action { this.runForEditor = this.runForEditor.bind(this); } - async run([targets]: [EditableTarget[]]): Promise { + async run([targets]: [Target[]]): Promise { const results = flatten( await runOnTargetsForEachEditor(targets, this.runForEditor), ); @@ -40,10 +40,7 @@ class InsertCopy implements Action { }; } - private async runForEditor( - editor: EditableTextEditor, - targets: EditableTarget[], - ) { + private async runForEditor(editor: EditableTextEditor, targets: Target[]) { // isBefore is inverted because we want the selections to stay with what is to the user the "copy" const position = this.isBefore ? "after" : "before"; const edits = targets.flatMap((target) => diff --git a/src/actions/InsertEmptyLines.ts b/src/actions/InsertEmptyLines.ts index 653bced5af..e957bb14f2 100644 --- a/src/actions/InsertEmptyLines.ts +++ b/src/actions/InsertEmptyLines.ts @@ -2,7 +2,8 @@ import { flatten } from "lodash"; import { performEditsAndUpdateSelections } from "../core/updateSelections/updateSelections"; import Range from "../libs/common/ide/Range"; import Selection from "../libs/common/ide/Selection"; -import { EditableTarget } from "../typings/target.types"; +import ide from "../libs/cursorless-engine/singletons/ide.singleton"; +import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { setSelectionsWithoutFocusingEditor } from "../util/setSelectionsAndFocusEditor"; import { runOnTargetsForEachEditor } from "../util/targetUtils"; @@ -17,7 +18,7 @@ class InsertEmptyLines implements Action { this.run = this.run.bind(this); } - private getRanges(targets: EditableTarget[]) { + private getRanges(targets: Target[]) { let lines = targets.flatMap((target) => { const lines: number[] = []; if (this.insertAbove) { @@ -41,7 +42,7 @@ class InsertEmptyLines implements Action { })); } - async run([targets]: [EditableTarget[]]): Promise { + async run([targets]: [Target[]]): Promise { const results = flatten( await runOnTargetsForEachEditor(targets, async (editor, targets) => { const ranges = this.getRanges(targets); @@ -59,7 +60,10 @@ class InsertEmptyLines implements Action { ], ); - setSelectionsWithoutFocusingEditor(editor, updatedCursorSelections); + setSelectionsWithoutFocusingEditor( + ide().getEditableTextEditor(editor), + updatedCursorSelections, + ); return { thatMark: updatedThatSelections.map((selection) => ({ diff --git a/src/actions/InsertSnippet.ts b/src/actions/InsertSnippet.ts index 39023425ed..3261adcbde 100644 --- a/src/actions/InsertSnippet.ts +++ b/src/actions/InsertSnippet.ts @@ -6,7 +6,7 @@ import { } from "../core/updateSelections/updateSelections"; import ModifyIfUntypedStage from "../processTargets/modifiers/ModifyIfUntypedStage"; import { Snippet, SnippetDefinition } from "../typings/snippet"; -import { EditableTarget } from "../typings/target.types"; +import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { findMatchingSnippetDefinitionStrict, @@ -49,7 +49,7 @@ export default class InsertSnippet implements Action { } async run( - [targets]: [EditableTarget[]], + [targets]: [Target[]], snippetName: string, substitutions: Record, ): Promise { diff --git a/src/actions/MakeshiftActions.ts b/src/actions/MakeshiftActions.ts index 057ef9501f..f831eb4ab3 100644 --- a/src/actions/MakeshiftActions.ts +++ b/src/actions/MakeshiftActions.ts @@ -1,5 +1,5 @@ import sleep from "../libs/common/util/sleep"; -import { EditableTarget } from "../typings/target.types"; +import { Target } from "../typings/target.types"; import CommandAction from "./CommandAction"; abstract class MakeshiftAction extends CommandAction { @@ -9,7 +9,7 @@ abstract class MakeshiftAction extends CommandAction { ensureSingleTarget?: boolean; postCommandSleepMs?: number; - async run(targets: [EditableTarget[]]) { + async run(targets: [Target[]]) { const returnValue = await super.run(targets, { command: this.command, commandArgs: this.commandArg ? [this.commandArg] : [], diff --git a/src/actions/Paste.ts b/src/actions/Paste.ts index d14c79a810..e7ca5cd2a8 100644 --- a/src/actions/Paste.ts +++ b/src/actions/Paste.ts @@ -4,7 +4,7 @@ import { callFunctionAndUpdateSelectionsWithBehavior, } from "../core/updateSelections/updateSelections"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; -import { EditableTarget } from "../typings/target.types"; +import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { setSelectionsWithoutFocusingEditor } from "../util/setSelectionsAndFocusEditor"; import { ensureSingleEditor } from "../util/targetUtils"; @@ -13,7 +13,7 @@ import { ActionReturnValue } from "./actions.types"; export class Paste { constructor(private graph: Graph) {} - async run([targets]: [EditableTarget[]]): Promise { + async run([targets]: [Target[]]): Promise { const targetEditor = ensureSingleEditor(targets); const originalEditor = ide().activeEditableTextEditor; @@ -50,7 +50,10 @@ export class Paste { // Reset cursors on the editor where the edits took place. // NB: We don't focus the editor here because we want to focus the original // editor, not the one where the edits took place - setSelectionsWithoutFocusingEditor(targetEditor, updatedCursorSelections); + setSelectionsWithoutFocusingEditor( + ide().getEditableTextEditor(targetEditor), + updatedCursorSelections, + ); // If necessary focus back original editor if (originalEditor != null && originalEditor !== ide().activeTextEditor) { diff --git a/src/actions/Remove.ts b/src/actions/Remove.ts index 03ffb7b986..43f5b3c956 100644 --- a/src/actions/Remove.ts +++ b/src/actions/Remove.ts @@ -1,6 +1,6 @@ import { flatten } from "lodash"; import { performEditsAndUpdateRanges } from "../core/updateSelections/updateSelections"; -import { EditableTarget } from "../typings/target.types"; +import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { createThatMark, runOnTargetsForEachEditor } from "../util/targetUtils"; import { unifyRemovalTargets } from "../util/unifyRanges"; @@ -12,7 +12,7 @@ export default class Delete implements Action { } async run( - [targets]: [EditableTarget[]], + [targets]: [Target[]], { showDecorations = true } = {}, ): Promise { // Unify overlapping targets because of overlapping leading and trailing delimiters. diff --git a/src/actions/Replace.ts b/src/actions/Replace.ts index 9dc384db11..c6a8a60226 100644 --- a/src/actions/Replace.ts +++ b/src/actions/Replace.ts @@ -1,6 +1,6 @@ import { flatten, zip } from "lodash"; import { performEditsAndUpdateSelections } from "../core/updateSelections/updateSelections"; -import { EditableTarget, Target } from "../typings/target.types"; +import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { runForEachEditor } from "../util/targetUtils"; import { Action, ActionReturnValue } from "./actions.types"; @@ -31,7 +31,7 @@ export default class Replace implements Action { } async run( - [targets]: [EditableTarget[]], + [targets]: [Target[]], replaceWith: string[] | RangeGenerator, ): Promise { await this.graph.editStyles.displayPendingEditDecorations( diff --git a/src/actions/Rewrap.ts b/src/actions/Rewrap.ts index adea1fa053..046d4d5d62 100644 --- a/src/actions/Rewrap.ts +++ b/src/actions/Rewrap.ts @@ -1,12 +1,8 @@ import { performEditsAndUpdateRanges } from "../core/updateSelections/updateSelections"; import { containingSurroundingPairIfUntypedStage } from "../processTargets/modifiers/commonContainingScopeIfUntypedStages"; -import { EditableTarget } from "../typings/target.types"; +import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; -import { - createThatMark, - runOnTargetsForEachEditor, - toEditableTarget, -} from "../util/targetUtils"; +import { createThatMark, runOnTargetsForEachEditor } from "../util/targetUtils"; import { Action, ActionReturnValue } from "./actions.types"; export default class Rewrap implements Action { @@ -17,21 +13,19 @@ export default class Rewrap implements Action { } async run( - [targets]: [EditableTarget[]], + [targets]: [Target[]], left: string, right: string, ): Promise { - const boundaryTargets = targets - .flatMap((target) => { - const boundary = target.getBoundaryStrict(); + const boundaryTargets = targets.flatMap((target) => { + const boundary = target.getBoundaryStrict(); - if (boundary.length !== 2) { - throw Error("Target must have an opening and closing delimiter"); - } + if (boundary.length !== 2) { + throw Error("Target must have an opening and closing delimiter"); + } - return boundary; - }) - .map(toEditableTarget); + return boundary; + }); await this.graph.editStyles.displayPendingEditDecorations( boundaryTargets, diff --git a/src/actions/Scroll.ts b/src/actions/Scroll.ts index 5bc3c824d5..e7200dd999 100644 --- a/src/actions/Scroll.ts +++ b/src/actions/Scroll.ts @@ -1,6 +1,6 @@ import { commands } from "vscode"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; -import { EditableTarget, Target } from "../typings/target.types"; +import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { groupBy } from "../util/itertools"; import { Action, ActionReturnValue } from "./actions.types"; @@ -10,8 +10,8 @@ class Scroll implements Action { this.run = this.run.bind(this); } - async run([targets]: [EditableTarget[]]): Promise { - const selectionGroups = groupBy(targets, (t: EditableTarget) => t.editor); + async run([targets]: [Target[]]): Promise { + const selectionGroups = groupBy(targets, (t: Target) => t.editor); const lines = Array.from(selectionGroups, ([editor, targets]) => { return { lineNumber: getLineNumber(targets, this.at), editor }; @@ -22,7 +22,7 @@ class Scroll implements Action { for (const lineWithEditor of lines) { // For reveal line to the work we have to have the correct editor focused if (lineWithEditor.editor !== ide().activeTextEditor) { - await lineWithEditor.editor.focus(); + await ide().getEditableTextEditor(lineWithEditor.editor).focus(); } await commands.executeCommand("revealLine", { lineNumber: lineWithEditor.lineNumber, diff --git a/src/actions/SetSelection.ts b/src/actions/SetSelection.ts index 55a8c38162..f43f8eafbc 100644 --- a/src/actions/SetSelection.ts +++ b/src/actions/SetSelection.ts @@ -1,5 +1,6 @@ import Selection from "../libs/common/ide/Selection"; -import { EditableTarget, Target } from "../typings/target.types"; +import ide from "../libs/cursorless-engine/singletons/ide.singleton"; +import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { setSelectionsAndFocusEditor } from "../util/setSelectionsAndFocusEditor"; import { ensureSingleEditor } from "../util/targetUtils"; @@ -14,11 +15,14 @@ export class SetSelection implements Action { return target.contentSelection; } - async run([targets]: [EditableTarget[]]): Promise { + async run([targets]: [Target[]]): Promise { const editor = ensureSingleEditor(targets); const selections = targets.map(this.getSelection); - await setSelectionsAndFocusEditor(editor, selections); + await setSelectionsAndFocusEditor( + ide().getEditableTextEditor(editor), + selections, + ); return { thatTargets: targets, diff --git a/src/actions/Sort.ts b/src/actions/Sort.ts index ef1afe7195..7bd8bacfeb 100644 --- a/src/actions/Sort.ts +++ b/src/actions/Sort.ts @@ -1,5 +1,5 @@ import { shuffle } from "lodash"; -import { EditableTarget } from "../typings/target.types"; +import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { Action, ActionReturnValue } from "./actions.types"; @@ -10,7 +10,7 @@ abstract class SortBase implements Action { protected abstract sortTexts(texts: string[]): string[]; - async run(targets: EditableTarget[][]): Promise { + async run(targets: Target[][]): Promise { // First sort target by document order const sortedTargets = targets.map((t) => t diff --git a/src/actions/ToggleBreakpoint.ts b/src/actions/ToggleBreakpoint.ts index 7a2ad97da2..4a47295904 100644 --- a/src/actions/ToggleBreakpoint.ts +++ b/src/actions/ToggleBreakpoint.ts @@ -2,7 +2,7 @@ import * as vscode from "vscode"; import { URI } from "vscode-uri"; import { toVscodeRange } from "../ide/vscode/VscodeUtil"; import { containingLineIfUntypedStage } from "../processTargets/modifiers/commonContainingScopeIfUntypedStages"; -import { EditableTarget } from "../typings/target.types"; +import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { Action, ActionReturnValue } from "./actions.types"; @@ -22,10 +22,7 @@ export default class ToggleBreakpoint implements Action { this.run = this.run.bind(this); } - async run([targets]: [ - EditableTarget[], - EditableTarget[], - ]): Promise { + async run([targets]: [Target[], Target[]]): Promise { const thatTargets = targets.map(({ thatTarget }) => thatTarget); await this.graph.editStyles.displayPendingEditDecorations( diff --git a/src/actions/Wrap.ts b/src/actions/Wrap.ts index 3f83dd4645..fda455c8f0 100644 --- a/src/actions/Wrap.ts +++ b/src/actions/Wrap.ts @@ -4,7 +4,8 @@ import { performEditsAndUpdateFullSelectionInfos, } from "../core/updateSelections/updateSelections"; import Selection from "../libs/common/ide/Selection"; -import { EditableTarget } from "../typings/target.types"; +import ide from "../libs/cursorless-engine/singletons/ide.singleton"; +import { Target } from "../typings/target.types"; import { Edit, Graph } from "../typings/Types"; import { FullSelectionInfo } from "../typings/updateSelections"; import { setSelectionsWithoutFocusingEditor } from "../util/setSelectionsAndFocusEditor"; @@ -17,7 +18,7 @@ export default class Wrap implements Action { } async run( - [targets]: [EditableTarget[]], + [targets]: [Target[]], left: string, right: string, ): Promise { @@ -103,7 +104,10 @@ export default class Wrap implements Action { ], ); - setSelectionsWithoutFocusingEditor(editor, cursorSelections); + setSelectionsWithoutFocusingEditor( + ide().getEditableTextEditor(editor), + cursorSelections, + ); this.graph.editStyles.displayPendingEditDecorationsForRanges( delimiterSelections.map((selection) => ({ diff --git a/src/actions/WrapWithSnippet.ts b/src/actions/WrapWithSnippet.ts index 00c3aceadb..6b06454170 100644 --- a/src/actions/WrapWithSnippet.ts +++ b/src/actions/WrapWithSnippet.ts @@ -1,7 +1,7 @@ import { commands } from "vscode"; import { callFunctionAndUpdateSelections } from "../core/updateSelections/updateSelections"; import ModifyIfUntypedStage from "../processTargets/modifiers/ModifyIfUntypedStage"; -import { EditableTarget } from "../typings/target.types"; +import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { findMatchingSnippetDefinitionStrict, @@ -45,7 +45,7 @@ export default class WrapWithSnippet implements Action { } async run( - [targets]: [EditableTarget[]], + [targets]: [Target[]], snippetLocation: string, ): Promise { const [snippetName, placeholderName] = diff --git a/src/actions/actions.types.ts b/src/actions/actions.types.ts index d66b596cbd..ac84d64dbb 100644 --- a/src/actions/actions.types.ts +++ b/src/actions/actions.types.ts @@ -1,5 +1,5 @@ import type { ModifierStage } from "../processTargets/PipelineStages.types"; -import type { EditableTarget, Target } from "../typings/target.types"; +import type { Target } from "../typings/target.types"; import type { SelectionWithEditor } from "../typings/Types"; export type ActionType = @@ -94,7 +94,7 @@ export interface ActionReturnValue { } export interface Action { - run(targets: EditableTarget[][], ...args: any[]): Promise; + run(targets: Target[][], ...args: any[]): Promise; /** * Used to define stages that should be run before the final positional stage, if there is one diff --git a/src/core/commandRunner/CommandRunner.ts b/src/core/commandRunner/CommandRunner.ts index f03d33cf0e..dcc82a9dea 100644 --- a/src/core/commandRunner/CommandRunner.ts +++ b/src/core/commandRunner/CommandRunner.ts @@ -11,7 +11,6 @@ import { ProcessedTargetsContext, SelectionWithEditor, } from "../../typings/Types"; -import { toEditableTarget } from "../../util/targetUtils"; import { isString } from "../../util/type"; import { canonicalizeAndValidateCommand, @@ -150,17 +149,13 @@ export default class CommandRunner { targetDescriptors, ); - const editableTargets = targets.map((targets) => - targets.map(toEditableTarget), - ); - const { returnValue, thatSelections: newThatSelections, thatTargets: newThatTargets, sourceSelections: newSourceSelections, sourceTargets: newSourceTargets, - } = await action.run(editableTargets, ...actionArgs); + } = await action.run(targets, ...actionArgs); this.thatMark.set(constructThatTarget(newThatTargets, newThatSelections)); this.sourceMark.set( diff --git a/src/core/editStyles.ts b/src/core/editStyles.ts index 2802bcd804..e88cc70450 100644 --- a/src/core/editStyles.ts +++ b/src/core/editStyles.ts @@ -123,7 +123,7 @@ export class EditStyles implements Record { (range) => range.editor, async (editor, ranges) => { this.setEditorDecorations( - editor, + ide().getEditableTextEditor(editor), style, isToken, ranges.map((range) => range.range), @@ -137,7 +137,9 @@ export class EditStyles implements Record { ranges, (range) => range.editor, async (editor) => { - editor.setDecorations(style.getDecoration(isToken), []); + ide() + .getEditableTextEditor(editor) + .setDecorations(style.getDecoration(isToken), []); }, ); } @@ -149,7 +151,7 @@ export class EditStyles implements Record { ) { return runOnTargetsForEachEditor(targets, async (editor, targets) => { this.setEditorDecorations( - editor, + ide().getEditableTextEditor(editor), style, true, targets @@ -158,7 +160,7 @@ export class EditStyles implements Record { .filter((range): range is Range => !!range), ); this.setEditorDecorations( - editor, + ide().getEditableTextEditor(editor), style, false, targets diff --git a/src/core/inferFullTargets.ts b/src/core/inferFullTargets.ts index 1e064523ca..f94edc9787 100644 --- a/src/core/inferFullTargets.ts +++ b/src/core/inferFullTargets.ts @@ -23,9 +23,7 @@ import { export default function inferFullTargets( targets: PartialTargetDescriptor[], ): TargetDescriptor[] { - return targets.map((target, index) => - inferTarget(target, targets.slice(0, index)), - ); + return targets.map((target, index) => inferTarget(Targets.slice(0, index))); } function inferTarget( diff --git a/src/ide/vscode/VscodeEditableTextEditorImpl.ts b/src/ide/vscode/VscodeEditableTextEditorImpl.ts index 29dcbd6ea9..967ff7d3e6 100644 --- a/src/ide/vscode/VscodeEditableTextEditorImpl.ts +++ b/src/ide/vscode/VscodeEditableTextEditorImpl.ts @@ -4,6 +4,7 @@ import type Range from "../../libs/common/ide/Range"; import type Selection from "../../libs/common/ide/Selection"; import type { EndOfLine } from "../../libs/common/ide/types/ide.types"; import type { EditableTextEditor } from "../../libs/common/ide/types/TextEditor"; +import { TextEditorDecorationType } from "../../libs/common/ide/types/TextEditorDecorationType"; import type TextEditorEdit from "../../libs/common/ide/types/TextEditorEdit"; import { focusVscodeEditor } from "./VscodeFocusEditor"; import VscodeTextEditorImpl from "./VscodeTextEditorImpl"; @@ -34,6 +35,13 @@ export default class VscodeEditableTextEditorImpl return focusVscodeEditor(this.editor, this.id); } + public setDecorations( + decorationType: TextEditorDecorationType, + ranges: readonly Range[], + ): void { + this.editor.setDecorations(decorationType, ranges.map(toVscodeRange)); + } + public edit( callback: (editBuilder: TextEditorEdit) => void, options?: { undoStopBefore: boolean; undoStopAfter: boolean }, diff --git a/src/ide/vscode/VscodeTextDocumentImpl.ts b/src/ide/vscode/VscodeTextDocumentImpl.ts index dd8a6b54a8..b036c081bb 100644 --- a/src/ide/vscode/VscodeTextDocumentImpl.ts +++ b/src/ide/vscode/VscodeTextDocumentImpl.ts @@ -19,6 +19,10 @@ export default class VscodeTextDocumentImpl implements TextDocument { return this.document.languageId; } + get version(): number { + return this.document.version; + } + get lineCount(): number { return this.document.lineCount; } diff --git a/src/libs/common/ide/spy/SpyIDE.ts b/src/libs/common/ide/spy/SpyIDE.ts index 6e86a8ecbc..547e3030f1 100644 --- a/src/libs/common/ide/spy/SpyIDE.ts +++ b/src/libs/common/ide/spy/SpyIDE.ts @@ -1,5 +1,4 @@ import { pickBy, values } from "lodash"; -import { EditableTarget, Target } from "../../../../typings/target.types"; import type { Clipboard } from "../types/Clipboard"; import type { Configuration } from "../types/Configuration"; import type { diff --git a/src/libs/common/ide/types/TextDocument.ts b/src/libs/common/ide/types/TextDocument.ts index 7ea2833f70..79d608a887 100644 --- a/src/libs/common/ide/types/TextDocument.ts +++ b/src/libs/common/ide/types/TextDocument.ts @@ -17,6 +17,12 @@ export default interface TextDocument { */ readonly languageId: string; + /** + * The version number of this document (it will strictly increase after each + * change, including undo/redo). + */ + readonly version: number; + /** * The number of lines in this document. */ diff --git a/src/libs/common/ide/types/TextEditor.ts b/src/libs/common/ide/types/TextEditor.ts index 9f9a223f92..40dbe9de27 100644 --- a/src/libs/common/ide/types/TextEditor.ts +++ b/src/libs/common/ide/types/TextEditor.ts @@ -1,6 +1,7 @@ import type Range from "../Range"; import type Selection from "../Selection"; import type TextDocument from "./TextDocument"; +import { TextEditorDecorationType } from "./TextEditorDecorationType"; import type TextEditorEdit from "./TextEditorEdit"; export interface TextEditor { @@ -52,6 +53,20 @@ export interface EditableTextEditor extends TextEditor { */ focus(): Promise; + /** + * Adds a set of decorations to the text editor. If a set of decorations already exists with + * the given {@link TextEditorDecorationType decoration type}, they will be replaced. If + * `ranges` is empty, the existing decorations with the given {@link TextEditorDecorationType decoration type} + * will be removed. + * + * @param decorationType A decoration type. + * @param ranges {@link Range ranges} + */ + setDecorations( + decorationType: TextEditorDecorationType, + ranges: readonly Range[], + ): void; + /** * Perform an edit on the document associated with this text editor. * diff --git a/src/libs/common/ide/types/TextEditorDecorationType.ts b/src/libs/common/ide/types/TextEditorDecorationType.ts new file mode 100644 index 0000000000..ce135bcc28 --- /dev/null +++ b/src/libs/common/ide/types/TextEditorDecorationType.ts @@ -0,0 +1,15 @@ +/** + * Represents a handle to a set of decorations + * sharing the same {@link DecorationRenderOptions styling options} in a {@link TextEditor text editor}. + */ +export interface TextEditorDecorationType { + /** + * Internal representation of the handle. + */ + readonly key: string; + + /** + * this decoration type and all decorations on all text editors using it. + */ + dispose(): void; +} diff --git a/src/libs/common/ide/types/ide.types.ts b/src/libs/common/ide/types/ide.types.ts index 9bfefa3b86..c8af83338e 100644 --- a/src/libs/common/ide/types/ide.types.ts +++ b/src/libs/common/ide/types/ide.types.ts @@ -1,5 +1,4 @@ import { URI } from "vscode-uri"; -import { EditableTarget, Target } from "../../../../typings/target.types"; import { Clipboard } from "./Clipboard"; import { Configuration } from "./Configuration"; import { Messages } from "./Messages"; diff --git a/src/typings/target.types.ts b/src/typings/target.types.ts index aedb70820c..29adad0885 100644 --- a/src/typings/target.types.ts +++ b/src/typings/target.types.ts @@ -6,7 +6,9 @@ // eslint-disable-next-line @typescript-eslint/no-unused-vars import type ModifyIfUntypedStage from "../processTargets/modifiers/ModifyIfUntypedStage"; // eslint-disable-next-line @typescript-eslint/no-unused-vars -import type { SnippetVariable, Snippet } from "./snippet"; +import type Range from "../libs/common/ide/Range"; +import type Selection from "../libs/common/ide/Selection"; +import type { TextEditor } from "../libs/common/ide/types/TextEditor"; import type { // eslint-disable-next-line @typescript-eslint/no-unused-vars ScopeTypeTarget, @@ -15,14 +17,10 @@ import type { // eslint-disable-next-line @typescript-eslint/no-unused-vars UntypedTarget, } from "../processTargets/targets"; +// eslint-disable-next-line @typescript-eslint/no-unused-vars +import type { Snippet, SnippetVariable } from "./snippet"; import type { Position } from "./targetDescriptor.types"; import type { EditWithRangeUpdater } from "./Types"; -import type { - EditableTextEditor, - TextEditor, -} from "../libs/common/ide/types/TextEditor"; -import type Range from "../libs/common/ide/Range"; -import type Selection from "../libs/common/ide/Selection"; export interface EditNewCommandContext { type: "command"; @@ -148,7 +146,3 @@ export interface Target { */ toPositionTarget(position: Position): Target; } - -export interface EditableTarget extends Omit { - editor: EditableTextEditor; -} diff --git a/src/util/targetUtils.ts b/src/util/targetUtils.ts index 218acf8304..8cb44c6a3d 100644 --- a/src/util/targetUtils.ts +++ b/src/util/targetUtils.ts @@ -1,18 +1,12 @@ import { zip } from "lodash"; import Range from "../libs/common/ide/Range"; import Selection from "../libs/common/ide/Selection"; -import { - EditableTextEditor, - TextEditor, -} from "../libs/common/ide/types/TextEditor"; -import ide from "../libs/cursorless-engine/singletons/ide.singleton"; -import { EditableTarget, Target } from "../typings/target.types"; +import { TextEditor } from "../libs/common/ide/types/TextEditor"; +import { Target } from "../typings/target.types"; import { SelectionWithEditor } from "../typings/Types"; import { groupBy } from "./itertools"; -export function ensureSingleEditor( - targets: EditableTarget[], -): EditableTextEditor { +export function ensureSingleEditor(targets: Target[]): TextEditor { if (targets.length === 0) { throw new Error("Require at least one target with this action"); } @@ -36,8 +30,8 @@ export function ensureSingleTarget(targets: Target[]) { export async function runForEachEditor( targets: T[], - getEditor: (target: T) => EditableTextEditor, - func: (editor: EditableTextEditor, editorTargets: T[]) => Promise, + getEditor: (target: T) => TextEditor, + func: (editor: TextEditor, editorTargets: T[]) => Promise, ): Promise { return Promise.all( groupForEachEditor(targets, getEditor).map(([editor, editorTargets]) => @@ -47,20 +41,20 @@ export async function runForEachEditor( } export async function runOnTargetsForEachEditor( - targets: EditableTarget[], - func: (editor: EditableTextEditor, targets: EditableTarget[]) => Promise, + targets: Target[], + func: (editor: TextEditor, targets: Target[]) => Promise, ): Promise { return runForEachEditor(targets, (target) => target.editor, func); } -export function groupTargetsForEachEditor(targets: EditableTarget[]) { +export function groupTargetsForEachEditor(targets: Target[]) { return groupForEachEditor(targets, (target) => target.editor); } export function groupForEachEditor( targets: T[], - getEditor: (target: T) => EditableTextEditor, -): [EditableTextEditor, T[]][] { + getEditor: (target: T) => TextEditor, +): [TextEditor, T[]][] { // Actually group by document and not editor. If the same document is open in multiple editors we want to perform all actions in one editor or an concurrency error will occur. const getDocument = (target: T) => getEditor(target).document; const editorMap = groupBy(targets, getDocument); @@ -111,10 +105,3 @@ export function createThatMark( })); return thatMark; } - -export function toEditableTarget(target: Target): EditableTarget { - return { - ...target, - editor: ide().getEditableTextEditor(target.editor), - }; -} diff --git a/src/util/unifyRanges.ts b/src/util/unifyRanges.ts index 9bc6885e05..37f9866479 100644 --- a/src/util/unifyRanges.ts +++ b/src/util/unifyRanges.ts @@ -1,6 +1,6 @@ import { Range } from "vscode"; import { targetsToContinuousTarget } from "../processTargets/processTargets"; -import { EditableTarget, Target } from "../typings/target.types"; +import { Target } from "../typings/target.types"; import { groupTargetsForEachEditor } from "./targetUtils"; /** Unifies overlapping/intersecting ranges */ From 680a549f7baa294692982421d991c0dbcf81084e Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Fri, 11 Nov 2022 17:29:56 +0100 Subject: [PATCH 09/84] Some super secret clean up stuff --- src/apps/cursorless-vscode/getMatchesInRange.ts | 3 ++- src/languages/latex.ts | 4 +++- src/languages/php.ts | 3 ++- src/languages/python.ts | 2 +- src/languages/rust.ts | 2 +- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/apps/cursorless-vscode/getMatchesInRange.ts b/src/apps/cursorless-vscode/getMatchesInRange.ts index 4b19c302b5..2d9f81c3ea 100644 --- a/src/apps/cursorless-vscode/getMatchesInRange.ts +++ b/src/apps/cursorless-vscode/getMatchesInRange.ts @@ -1,7 +1,8 @@ import { imap } from "itertools"; -import { Range, TextEditor } from "vscode"; import { Direction } from "../../typings/targetDescriptor.types"; import { matchAll } from "../../libs/cursorless-engine/util/regex"; +import { TextEditor } from "../../libs/common/ide/types/TextEditor"; +import Range from "../../libs/common/ide/Range"; export function getMatchesInRange( regex: RegExp, diff --git a/src/languages/latex.ts b/src/languages/latex.ts index 3b682bb6d8..f125ef8b07 100644 --- a/src/languages/latex.ts +++ b/src/languages/latex.ts @@ -1,5 +1,7 @@ -import { Range, Selection, TextEditor } from "vscode"; import { SyntaxNode } from "web-tree-sitter"; +import Range from "../libs/common/ide/Range"; +import Selection from "../libs/common/ide/Selection"; +import { TextEditor } from "../libs/common/ide/types/TextEditor"; import { SimpleScopeTypeType } from "../typings/targetDescriptor.types"; import { NodeMatcherAlternative, SelectionWithContext } from "../typings/Types"; import { patternFinder } from "../util/nodeFinders"; diff --git a/src/languages/php.ts b/src/languages/php.ts index 63d00a1b1d..d1ca12be21 100644 --- a/src/languages/php.ts +++ b/src/languages/php.ts @@ -1,4 +1,3 @@ -import { Selection, TextEditor } from "vscode"; import { SyntaxNode } from "web-tree-sitter"; import { NodeMatcherAlternative, @@ -16,6 +15,8 @@ import { trailingMatcher, } from "../util/nodeMatchers"; import { getNodeRange } from "../util/nodeSelectors"; +import { TextEditor } from "../libs/common/ide/types/TextEditor"; +import Selection from "../libs/common/ide/Selection"; // Generated by the following command: // > curl https://raw.githubusercontent.com/tree-sitter/tree-sitter-php/0ce134234214427b6aeb2735e93a307881c6cd6f/src/node-types.json \ diff --git a/src/languages/python.ts b/src/languages/python.ts index 281edc608c..4610b29dd5 100644 --- a/src/languages/python.ts +++ b/src/languages/python.ts @@ -1,5 +1,5 @@ -import { Selection } from "vscode"; import { SyntaxNode } from "web-tree-sitter"; +import Selection from "../libs/common/ide/Selection"; import { SimpleScopeTypeType } from "../typings/targetDescriptor.types"; import { NodeFinder, NodeMatcherAlternative } from "../typings/Types"; import { argumentNodeFinder, patternFinder } from "../util/nodeFinders"; diff --git a/src/languages/rust.ts b/src/languages/rust.ts index d28eddc909..db71a950c9 100644 --- a/src/languages/rust.ts +++ b/src/languages/rust.ts @@ -1,5 +1,5 @@ -import { TextEditor } from "vscode"; import { SyntaxNode } from "web-tree-sitter"; +import { TextEditor } from "../libs/common/ide/types/TextEditor"; import { SimpleScopeTypeType } from "../typings/targetDescriptor.types"; import { NodeMatcherAlternative, SelectionWithContext } from "../typings/Types"; import { patternFinder } from "../util/nodeFinders"; From 2463653f0d94d29f5323f0b7f7320304e42df303 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 13 Nov 2022 12:22:48 +0100 Subject: [PATCH 10/84] Additional changes beyond human comprehension --- src/actions/Clear.ts | 3 +- src/actions/EditNew/EditNew.ts | 6 +- src/actions/EditNew/runCommandTargets.ts | 4 +- src/actions/EditNew/runEditTargets.ts | 4 +- src/actions/EditNew/runNotebookCellTargets.ts | 7 +- src/actions/Fold.ts | 2 +- src/actions/FollowLink.ts | 26 +- .../GenerateSnippet/GenerateSnippet.ts | 9 +- src/actions/InsertCopy.ts | 10 +- src/core/IndividualHatMap.ts | 2 +- src/core/inferFullTargets.ts | 4 +- .../vscode/VscodeEditableTextEditorImpl.ts | 16 +- src/ide/vscode/VscodeFocusEditor.ts | 5 +- src/ide/vscode/VscodeOpenLink.ts | 49 ++ src/ide/vscode/VscodeUtil.ts | 8 + src/libs/common/ide/types/TextEditor.ts | 10 +- src/processTargets/marks/LineNumberStage.ts | 4 +- .../modifiers/ContainingScopeStage.ts | 3 +- .../modifiers/ItemStage/ItemStage.ts | 3 +- .../modifiers/ItemStage/tokenizeRange.ts | 3 +- .../scopeHandlers/BaseScopeHandler.ts | 2 + .../scopeHandlers/LineScopeHandler.ts | 4 +- .../scopeHandlers/NestedScopeHandler.ts | 3 +- .../scopeHandlers/OneOfScopeHandler.ts | 3 +- .../scopeHandlers/ParagraphScopeHandler.ts | 6 +- .../SurroundingPairScopeHandler.ts | 3 +- .../scopeHandlers/WordScopeHandler.ts | 3 +- src/testUtil/fromPlainObject.ts | 5 +- src/util/getLinks.ts | 24 - src/util/notebook.ts | 3 +- src/util/performDocumentEdits.ts | 25 +- yarn.lock | 470 +++++++++--------- 32 files changed, 396 insertions(+), 333 deletions(-) create mode 100644 src/ide/vscode/VscodeOpenLink.ts delete mode 100644 src/util/getLinks.ts diff --git a/src/actions/Clear.ts b/src/actions/Clear.ts index ba55d5ebd5..e3bbd509b3 100644 --- a/src/actions/Clear.ts +++ b/src/actions/Clear.ts @@ -1,3 +1,4 @@ +import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { PlainTarget } from "../processTargets/targets"; import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; @@ -29,7 +30,7 @@ export default class Clear implements Action { if (thatMark != null) { await setSelectionsAndFocusEditor( - editor, + ide().getEditableTextEditor(editor), thatMark.map(({ selection }) => selection), ); } diff --git a/src/actions/EditNew/EditNew.ts b/src/actions/EditNew/EditNew.ts index d0e64eb709..e577cc3342 100644 --- a/src/actions/EditNew/EditNew.ts +++ b/src/actions/EditNew/EditNew.ts @@ -1,3 +1,4 @@ +import ide from "../../libs/cursorless-engine/singletons/ide.singleton"; import { containingLineIfUntypedStage } from "../../processTargets/modifiers/commonContainingScopeIfUntypedStages"; import PositionStage from "../../processTargets/modifiers/PositionStage"; import { ModifierStage } from "../../processTargets/PipelineStages.types"; @@ -46,7 +47,10 @@ export class EditNew implements Action { const newSelections = state.targets.map((target, index) => state.cursorRanges[index]!.toSelection(target.isReversed), ); - await setSelectionsAndFocusEditor(editor, newSelections); + await setSelectionsAndFocusEditor( + ide().getEditableTextEditor(editor), + newSelections, + ); return { thatSelections: createThatMark(state.targets, state.thatRanges), diff --git a/src/actions/EditNew/runCommandTargets.ts b/src/actions/EditNew/runCommandTargets.ts index 3aad1ed6ad..32ade7ece8 100644 --- a/src/actions/EditNew/runCommandTargets.ts +++ b/src/actions/EditNew/runCommandTargets.ts @@ -1,6 +1,6 @@ import { commands } from "vscode"; import { callFunctionAndUpdateRanges } from "../../core/updateSelections/updateSelections"; -import { EditableTextEditor } from "../../libs/common/ide/types/TextEditor"; +import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import { Graph } from "../../typings/Types"; import { CommandTarget, State } from "./EditNew.types"; @@ -17,7 +17,7 @@ import { CommandTarget, State } from "./EditNew.types"; */ export async function runCommandTargets( graph: Graph, - editor: EditableTextEditor, + editor: TextEditor, state: State, ): Promise { const commandTargets: CommandTarget[] = state.targets diff --git a/src/actions/EditNew/runEditTargets.ts b/src/actions/EditNew/runEditTargets.ts index 74715fa85c..ec709b0e38 100644 --- a/src/actions/EditNew/runEditTargets.ts +++ b/src/actions/EditNew/runEditTargets.ts @@ -2,7 +2,7 @@ import { zip } from "lodash"; import { DecorationRangeBehavior } from "vscode"; import { performEditsAndUpdateSelectionsWithBehavior } from "../../core/updateSelections/updateSelections"; import Selection from "../../libs/common/ide/Selection"; -import { EditableTextEditor } from "../../libs/common/ide/types/TextEditor"; +import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import { Graph } from "../../typings/Types"; import { EditTarget, State } from "./EditNew.types"; @@ -21,7 +21,7 @@ import { EditTarget, State } from "./EditNew.types"; */ export async function runEditTargets( graph: Graph, - editor: EditableTextEditor, + editor: TextEditor, state: State, ): Promise { const editTargets: EditTarget[] = state.targets diff --git a/src/actions/EditNew/runNotebookCellTargets.ts b/src/actions/EditNew/runNotebookCellTargets.ts index d014fe9ee6..8279229629 100644 --- a/src/actions/EditNew/runNotebookCellTargets.ts +++ b/src/actions/EditNew/runNotebookCellTargets.ts @@ -1,4 +1,5 @@ -import { commands, Selection } from "vscode"; +import { commands } from "vscode"; +import Selection from "../../libs/common/ide/Selection"; import { NotebookCellPositionTarget } from "../../processTargets/targets"; import { Target } from "../../typings/target.types"; import { Graph } from "../../typings/Types"; @@ -20,8 +21,8 @@ export async function runNotebookCellTargets( // Inserting a new jupyter cell above pushes the previous one down two lines if (command === "jupyter.insertCellAbove") { thatMark[0].selection = new Selection( - thatMark[0].selection.anchor.translate({ lineDelta: 2 }), - thatMark[0].selection.active.translate({ lineDelta: 2 }), + thatMark[0].selection.anchor.translate(2, undefined), + thatMark[0].selection.active.translate(2, undefined), ); } diff --git a/src/actions/Fold.ts b/src/actions/Fold.ts index 3510b9e6c6..e5ac7c93c1 100644 --- a/src/actions/Fold.ts +++ b/src/actions/Fold.ts @@ -15,7 +15,7 @@ class FoldAction implements Action { const editor = ensureSingleEditor(targets); if (originalEditor !== editor) { - await editor.focus(); + await ide().getEditableTextEditor(editor).focus(); } const singleLineTargets = targets.filter( diff --git a/src/actions/FollowLink.ts b/src/actions/FollowLink.ts index a10e1be6db..cc19147620 100644 --- a/src/actions/FollowLink.ts +++ b/src/actions/FollowLink.ts @@ -1,7 +1,6 @@ -import { env, Uri, window } from "vscode"; +import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; -import { getLinkForTarget } from "../util/getLinks"; import { createThatMark, ensureSingleTarget } from "../util/targetUtils"; import { Action, ActionReturnValue } from "./actions.types"; @@ -18,10 +17,11 @@ export default class FollowLink implements Action { this.graph.editStyles.referenced, ); - const link = await getLinkForTarget(target); - if (link) { - await this.openUri(link.target!); - } else { + const openedLink = await ide() + .getEditableTextEditor(target.editor) + .openLink(target.contentRange); + + if (!openedLink) { await this.graph.actions.executeCommand.run( [targets], "editor.action.revealDefinition", @@ -33,18 +33,4 @@ export default class FollowLink implements Action { thatSelections: createThatMark(targets), }; } - - private async openUri(uri: Uri) { - switch (uri.scheme) { - case "http": - case "https": - await env.openExternal(uri); - break; - case "file": - await window.showTextDocument(uri); - break; - default: - throw Error(`Unknown uri scheme '${uri.scheme}'`); - } - } } diff --git a/src/actions/GenerateSnippet/GenerateSnippet.ts b/src/actions/GenerateSnippet/GenerateSnippet.ts index abb125ceb5..54b7bf3c63 100644 --- a/src/actions/GenerateSnippet/GenerateSnippet.ts +++ b/src/actions/GenerateSnippet/GenerateSnippet.ts @@ -1,15 +1,16 @@ -import { ensureSingleTarget } from "../../util/targetUtils"; import { commands, window } from "vscode"; +import Range from "../../libs/common/ide/Range"; +import ide from "../../libs/cursorless-engine/singletons/ide.singleton"; import { Offsets } from "../../processTargets/modifiers/surroundingPair/types"; import isTesting from "../../testUtil/isTesting"; import { Target } from "../../typings/target.types"; import { Graph } from "../../typings/Types"; +import { ensureSingleTarget } from "../../util/targetUtils"; import { Action, ActionReturnValue } from "../actions.types"; import { constructSnippetBody } from "./constructSnippetBody"; import { editText } from "./editText"; import { openNewSnippetFile } from "./openNewSnippetFile"; import Substituter from "./Substituter"; -import Range from "../../libs/common/ide/Range"; /** * This action can be used to automatically create a snippet from a target. Any @@ -212,7 +213,9 @@ export default class GenerateSnippet implements Action { if (isTesting()) { // If we're testing, we just overwrite the current document - editor.selections = [editor.document.range.toSelection(false)]; + ide().getEditableTextEditor(editor).selections = [ + editor.document.range.toSelection(false), + ]; } else { // Otherwise, we create and open a new document for the snippet in the // user snippets dir diff --git a/src/actions/InsertCopy.ts b/src/actions/InsertCopy.ts index 7a78bcd0fe..1126f05e20 100644 --- a/src/actions/InsertCopy.ts +++ b/src/actions/InsertCopy.ts @@ -2,7 +2,8 @@ import { flatten, zip } from "lodash"; import { DecorationRangeBehavior } from "vscode"; import { performEditsAndUpdateSelectionsWithBehavior } from "../core/updateSelections/updateSelections"; import Selection from "../libs/common/ide/Selection"; -import { EditableTextEditor } from "../libs/common/ide/types/TextEditor"; +import { TextEditor } from "../libs/common/ide/types/TextEditor"; +import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { containingLineIfUntypedStage } from "../processTargets/modifiers/commonContainingScopeIfUntypedStages"; import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; @@ -40,7 +41,7 @@ class InsertCopy implements Action { }; } - private async runForEditor(editor: EditableTextEditor, targets: Target[]) { + private async runForEditor(editor: TextEditor, targets: Target[]) { // isBefore is inverted because we want the selections to stay with what is to the user the "copy" const position = this.isBefore ? "after" : "before"; const edits = targets.flatMap((target) => @@ -73,8 +74,9 @@ class InsertCopy implements Action { ([edit, selection]) => edit!.updateRange(selection!), ); - setSelectionsWithoutFocusingEditor(editor, updatedEditorSelections); - editor.revealRange(editor.selections[0]); + const editableEditor = ide().getEditableTextEditor(editor); + setSelectionsWithoutFocusingEditor(editableEditor, updatedEditorSelections); + editableEditor.revealRange(editor.selections[0]); return { sourceMark: createThatMark(targets, insertionRanges), diff --git a/src/core/IndividualHatMap.ts b/src/core/IndividualHatMap.ts index 4ab9fe6d7b..3d88ab5a63 100644 --- a/src/core/IndividualHatMap.ts +++ b/src/core/IndividualHatMap.ts @@ -1,5 +1,5 @@ import { getKey } from "@cursorless/common"; -import { TextDocument } from "vscode"; +import TextDocument from "../libs/common/ide/types/TextDocument"; import tokenGraphemeSplitter from "../libs/cursorless-engine/singletons/tokenGraphemeSplitter.singleton"; import { Graph, Token } from "../typings/Types"; import { HatStyleName } from "./hatStyles"; diff --git a/src/core/inferFullTargets.ts b/src/core/inferFullTargets.ts index f94edc9787..1e064523ca 100644 --- a/src/core/inferFullTargets.ts +++ b/src/core/inferFullTargets.ts @@ -23,7 +23,9 @@ import { export default function inferFullTargets( targets: PartialTargetDescriptor[], ): TargetDescriptor[] { - return targets.map((target, index) => inferTarget(Targets.slice(0, index))); + return targets.map((target, index) => + inferTarget(target, targets.slice(0, index)), + ); } function inferTarget( diff --git a/src/ide/vscode/VscodeEditableTextEditorImpl.ts b/src/ide/vscode/VscodeEditableTextEditorImpl.ts index 967ff7d3e6..3e802ae343 100644 --- a/src/ide/vscode/VscodeEditableTextEditorImpl.ts +++ b/src/ide/vscode/VscodeEditableTextEditorImpl.ts @@ -6,12 +6,14 @@ import type { EndOfLine } from "../../libs/common/ide/types/ide.types"; import type { EditableTextEditor } from "../../libs/common/ide/types/TextEditor"; import { TextEditorDecorationType } from "../../libs/common/ide/types/TextEditorDecorationType"; import type TextEditorEdit from "../../libs/common/ide/types/TextEditorEdit"; -import { focusVscodeEditor } from "./VscodeFocusEditor"; +import focusVscodeEditor from "./VscodeFocusEditor"; +import vscodeOpenLink from "./VscodeOpenLink"; import VscodeTextEditorImpl from "./VscodeTextEditorImpl"; import { toVscodeEndOfLine, toVscodePosition, toVscodeRange, + toVscodePositionOrRange, toVscodeSelection, } from "./VscodeUtil"; @@ -49,7 +51,7 @@ export default class VscodeEditableTextEditorImpl return this.editor.edit((editBuilder) => { callback({ replace: (location, value) => { - editBuilder.replace(toVscodeRangeOrPosition(location), value); + editBuilder.replace(toVscodePositionOrRange(location), value); }, insert: (location: Position, value: string) => { editBuilder.insert(toVscodePosition(location), value); @@ -63,12 +65,8 @@ export default class VscodeEditableTextEditorImpl }); }, options); } -} -function toVscodeRangeOrPosition( - location: Position | Range, -): vscode.Position | vscode.Range { - return "start" in location - ? toVscodeRange(location) - : toVscodePosition(location); + public openLink(location: Position | Range): Promise { + return vscodeOpenLink(this.editor, toVscodePositionOrRange(location)); + } } diff --git a/src/ide/vscode/VscodeFocusEditor.ts b/src/ide/vscode/VscodeFocusEditor.ts index 69b9ce0878..ec1bfaf369 100644 --- a/src/ide/vscode/VscodeFocusEditor.ts +++ b/src/ide/vscode/VscodeFocusEditor.ts @@ -29,7 +29,10 @@ const columnFocusCommands = { [ViewColumn.Beside]: "", }; -export async function focusVscodeEditor(editor: TextEditor, editorId: string) { +export default async function focusVscodeEditor( + editor: TextEditor, + editorId: string, +) { const viewColumn = getViewColumn(editor); if (viewColumn != null) { await commands.executeCommand(columnFocusCommands[viewColumn]); diff --git a/src/ide/vscode/VscodeOpenLink.ts b/src/ide/vscode/VscodeOpenLink.ts new file mode 100644 index 0000000000..2c6e6996e2 --- /dev/null +++ b/src/ide/vscode/VscodeOpenLink.ts @@ -0,0 +1,49 @@ +import * as vscode from "vscode"; + +export default async function vscodeOpenLink( + editor: vscode.TextEditor, + location: vscode.Position | vscode.Range, +): Promise { + const links = await getLinksForEditor(editor); + const filteredLinks = links.filter((link) => link.range.contains(location)); + + if (filteredLinks.length > 1) { + throw Error("Multiple links found at location"); + } + + if (filteredLinks.length === 0) { + return false; + } + + await openLink(filteredLinks[0]); + + return true; +} + +function getLinksForEditor(editor: vscode.TextEditor) { + return vscode.commands.executeCommand( + "vscode.executeLinkProvider", + editor.document.uri, + ) as Thenable; +} + +function openLink(link: vscode.DocumentLink) { + if (link.target == null) { + throw Error("Document link is missing uri"); + } + return openUri(link.target); +} + +async function openUri(uri: vscode.Uri) { + switch (uri.scheme) { + case "http": + case "https": + await vscode.env.openExternal(uri); + break; + case "file": + await vscode.window.showTextDocument(uri); + break; + default: + throw Error(`Unknown uri scheme '${uri.scheme}'`); + } +} diff --git a/src/ide/vscode/VscodeUtil.ts b/src/ide/vscode/VscodeUtil.ts index 481681f950..3e342426f4 100644 --- a/src/ide/vscode/VscodeUtil.ts +++ b/src/ide/vscode/VscodeUtil.ts @@ -49,6 +49,14 @@ export function fromVscodePosition(position: vscode.Position): Position { return new Position(position.line, position.character); } +export function toVscodePositionOrRange( + location: Position | Range, +): vscode.Position | vscode.Range { + return "start" in location + ? toVscodeRange(location) + : toVscodePosition(location); +} + export function toVscodeTextLine(line: TextLine): vscode.TextLine { return { ...line, diff --git a/src/libs/common/ide/types/TextEditor.ts b/src/libs/common/ide/types/TextEditor.ts index 40dbe9de27..6e1e4be8f5 100644 --- a/src/libs/common/ide/types/TextEditor.ts +++ b/src/libs/common/ide/types/TextEditor.ts @@ -1,7 +1,8 @@ +import type Position from "../Position"; import type Range from "../Range"; import type Selection from "../Selection"; import type TextDocument from "./TextDocument"; -import { TextEditorDecorationType } from "./TextEditorDecorationType"; +import type { TextEditorDecorationType } from "./TextEditorDecorationType"; import type TextEditorEdit from "./TextEditorEdit"; export interface TextEditor { @@ -82,4 +83,11 @@ export interface EditableTextEditor extends TextEditor { callback: (editBuilder: TextEditorEdit) => void, options?: { undoStopBefore: boolean; undoStopAfter: boolean }, ): Thenable; + + /** + * Open link at location. + * @param location Position or range + * @return True if a link was opened + */ + openLink(location: Position | Range): Promise; } diff --git a/src/processTargets/marks/LineNumberStage.ts b/src/processTargets/marks/LineNumberStage.ts index 6e67da3928..26b34e69ed 100644 --- a/src/processTargets/marks/LineNumberStage.ts +++ b/src/processTargets/marks/LineNumberStage.ts @@ -1,4 +1,4 @@ -import type { TextEditor } from "vscode"; +import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import type { LineNumberMark, LineNumberType, @@ -35,7 +35,7 @@ const getLineNumber = ( case "absolute": return lineNumber; case "relative": - return editor.selection.active.line + lineNumber; + return editor.selections[0].active.line + lineNumber; case "modulo100": { const stepSize = 100; const startLine = editor.visibleRanges[0].start.line; diff --git a/src/processTargets/modifiers/ContainingScopeStage.ts b/src/processTargets/modifiers/ContainingScopeStage.ts index 737d13f63f..0ffc4ac2ad 100644 --- a/src/processTargets/modifiers/ContainingScopeStage.ts +++ b/src/processTargets/modifiers/ContainingScopeStage.ts @@ -10,9 +10,10 @@ import type { ModifierStage } from "../PipelineStages.types"; import { constructScopeRangeTarget } from "./constructScopeRangeTarget"; import getLegacyScopeStage from "./getLegacyScopeStage"; import { TargetScope } from "./scopeHandlers/scope.types"; -import { TextEditor, Position } from "vscode"; import { ScopeHandler } from "./scopeHandlers/scopeHandler.types"; import { getContainingScope } from "./getContainingScope"; +import Position from "../../libs/common/ide/Position"; +import { TextEditor } from "../../libs/common/ide/types/TextEditor"; /** * This modifier stage expands from the input target to the smallest containing diff --git a/src/processTargets/modifiers/ItemStage/ItemStage.ts b/src/processTargets/modifiers/ItemStage/ItemStage.ts index 37cff7fe75..3090c53f55 100644 --- a/src/processTargets/modifiers/ItemStage/ItemStage.ts +++ b/src/processTargets/modifiers/ItemStage/ItemStage.ts @@ -1,5 +1,6 @@ -import { Range, TextEditor } from "vscode"; import { NoContainingScopeError } from "../../../errors"; +import Range from "../../../libs/common/ide/Range"; +import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { Target } from "../../../typings/target.types"; import { ContainingScopeModifier, diff --git a/src/processTargets/modifiers/ItemStage/tokenizeRange.ts b/src/processTargets/modifiers/ItemStage/tokenizeRange.ts index 2101290aca..1b4775a046 100644 --- a/src/processTargets/modifiers/ItemStage/tokenizeRange.ts +++ b/src/processTargets/modifiers/ItemStage/tokenizeRange.ts @@ -1,4 +1,5 @@ -import { Range, TextEditor } from "vscode"; +import Range from "../../../libs/common/ide/Range"; +import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; /** * Given the iteration scope, returns a list of "tokens" within that collection diff --git a/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.ts b/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.ts index f51da62578..68a806e454 100644 --- a/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.ts +++ b/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.ts @@ -1,4 +1,6 @@ import Position from "../../../libs/common/ide/Position"; +// eslint-disable-next-line @typescript-eslint/no-unused-vars +import type Range from "../../../libs/common/ide/Range"; import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import type { Direction, diff --git a/src/processTargets/modifiers/scopeHandlers/LineScopeHandler.ts b/src/processTargets/modifiers/scopeHandlers/LineScopeHandler.ts index c9b88b2921..f7a24a40a0 100644 --- a/src/processTargets/modifiers/scopeHandlers/LineScopeHandler.ts +++ b/src/processTargets/modifiers/scopeHandlers/LineScopeHandler.ts @@ -1,4 +1,6 @@ -import { Position, Range, TextEditor } from "vscode"; +import Position from "../../../libs/common/ide/Position"; +import Range from "../../../libs/common/ide/Range"; +import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { Direction, ScopeType } from "../../../typings/targetDescriptor.types"; import { LineTarget } from "../../targets"; import BaseScopeHandler from "./BaseScopeHandler"; diff --git a/src/processTargets/modifiers/scopeHandlers/NestedScopeHandler.ts b/src/processTargets/modifiers/scopeHandlers/NestedScopeHandler.ts index 595cd7aab1..219cc12468 100644 --- a/src/processTargets/modifiers/scopeHandlers/NestedScopeHandler.ts +++ b/src/processTargets/modifiers/scopeHandlers/NestedScopeHandler.ts @@ -1,6 +1,7 @@ import { flatten, imap } from "itertools"; -import type { Position, TextEditor } from "vscode"; import { getScopeHandler } from "."; +import Position from "../../../libs/common/ide/Position"; +import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import type { Direction, ScopeType, diff --git a/src/processTargets/modifiers/scopeHandlers/OneOfScopeHandler.ts b/src/processTargets/modifiers/scopeHandlers/OneOfScopeHandler.ts index 5652aaa634..283cd45dcf 100644 --- a/src/processTargets/modifiers/scopeHandlers/OneOfScopeHandler.ts +++ b/src/processTargets/modifiers/scopeHandlers/OneOfScopeHandler.ts @@ -1,5 +1,6 @@ -import { Position, TextEditor } from "vscode"; import { getScopeHandler } from "."; +import Position from "../../../libs/common/ide/Position"; +import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { Direction, OneOfScopeType, diff --git a/src/processTargets/modifiers/scopeHandlers/ParagraphScopeHandler.ts b/src/processTargets/modifiers/scopeHandlers/ParagraphScopeHandler.ts index 0452ddc816..774f077b74 100644 --- a/src/processTargets/modifiers/scopeHandlers/ParagraphScopeHandler.ts +++ b/src/processTargets/modifiers/scopeHandlers/ParagraphScopeHandler.ts @@ -1,4 +1,8 @@ -import { Position, Range, TextDocument, TextEditor, TextLine } from "vscode"; +import Position from "../../../libs/common/ide/Position"; +import Range from "../../../libs/common/ide/Range"; +import TextDocument from "../../../libs/common/ide/types/TextDocument"; +import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; +import TextLine from "../../../libs/common/ide/types/TextLine"; import { Direction, ScopeType } from "../../../typings/targetDescriptor.types"; import { ParagraphTarget } from "../../targets"; import BaseScopeHandler from "./BaseScopeHandler"; diff --git a/src/processTargets/modifiers/scopeHandlers/SurroundingPairScopeHandler.ts b/src/processTargets/modifiers/scopeHandlers/SurroundingPairScopeHandler.ts index d3fd41eaf4..91ab9d7003 100644 --- a/src/processTargets/modifiers/scopeHandlers/SurroundingPairScopeHandler.ts +++ b/src/processTargets/modifiers/scopeHandlers/SurroundingPairScopeHandler.ts @@ -1,4 +1,5 @@ -import { Position, TextEditor } from "vscode"; +import Position from "../../../libs/common/ide/Position"; +import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { Direction, SurroundingPairScopeType, diff --git a/src/processTargets/modifiers/scopeHandlers/WordScopeHandler.ts b/src/processTargets/modifiers/scopeHandlers/WordScopeHandler.ts index 8e2d7ae7a6..3f53a29e7f 100644 --- a/src/processTargets/modifiers/scopeHandlers/WordScopeHandler.ts +++ b/src/processTargets/modifiers/scopeHandlers/WordScopeHandler.ts @@ -1,9 +1,10 @@ -import { Range, TextEditor } from "vscode"; import { NestedScopeHandler } from "."; import { Direction } from "../../../typings/targetDescriptor.types"; import { SubTokenWordTarget } from "../../targets"; import type { TargetScope } from "./scope.types"; import WordTokenizer from "../../../libs/cursorless-engine/scopeHandlers/WordScopeHandler/WordTokenizer"; +import Range from "../../../libs/common/ide/Range"; +import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; export default class WordScopeHandler extends NestedScopeHandler { public readonly scopeType = { type: "word" } as const; diff --git a/src/testUtil/fromPlainObject.ts b/src/testUtil/fromPlainObject.ts index 69d0640443..95d12f5065 100644 --- a/src/testUtil/fromPlainObject.ts +++ b/src/testUtil/fromPlainObject.ts @@ -1,4 +1,3 @@ -import { Position, Range, Selection, TextEditor } from "vscode"; import { UntypedTarget } from "../processTargets/targets"; import type { Target } from "../typings/target.types"; import type { @@ -7,6 +6,10 @@ import type { SelectionPlainObject, TargetPlainObject, } from "../libs/vscode-common/toPlainObject"; +import Range from "../libs/common/ide/Range"; +import Selection from "../libs/common/ide/Selection"; +import Position from "../libs/common/ide/Position"; +import { TextEditor } from "../libs/common/ide/types/TextEditor"; /** * Given a plain object describing a target, constructs a `Target` object. diff --git a/src/util/getLinks.ts b/src/util/getLinks.ts deleted file mode 100644 index ab071bfee7..0000000000 --- a/src/util/getLinks.ts +++ /dev/null @@ -1,24 +0,0 @@ -import * as vscode from "vscode"; -import { Target } from "../typings/target.types"; - -export async function getLinksForSelections( - editor: vscode.TextEditor, - selections: vscode.Selection[], -) { - const links = await getLinksForEditor(editor); - return links.filter((link) => - selections.find((selection) => link.range.contains(selection)), - ); -} - -export async function getLinkForTarget(target: Target) { - const links = await getLinksForEditor(target.editor); - return links.find((link) => link.range.contains(target.contentRange)); -} - -function getLinksForEditor(editor: vscode.TextEditor) { - return vscode.commands.executeCommand( - "vscode.executeLinkProvider", - editor.document.uri, - ) as Thenable; -} diff --git a/src/util/notebook.ts b/src/util/notebook.ts index ddb0563682..f6c225b96e 100644 --- a/src/util/notebook.ts +++ b/src/util/notebook.ts @@ -1,4 +1,5 @@ -import { NotebookCell, TextDocument, window } from "vscode"; +import { NotebookCell, window } from "vscode"; +import TextDocument from "../libs/common/ide/types/TextDocument"; import { getNotebookFromCellDocumentLegacy, isVscodeLegacyNotebookVersion, diff --git a/src/util/performDocumentEdits.ts b/src/util/performDocumentEdits.ts index 79f25d6c75..3a097be8ec 100644 --- a/src/util/performDocumentEdits.ts +++ b/src/util/performDocumentEdits.ts @@ -1,6 +1,7 @@ -import { Edit } from "../typings/Types"; import { RangeUpdater } from "../core/updateSelections/RangeUpdater"; import { TextEditor } from "../libs/common/ide/types/TextEditor"; +import ide from "../libs/cursorless-engine/singletons/ide.singleton"; +import { Edit } from "../typings/Types"; export async function performDocumentEdits( rangeUpdater: RangeUpdater, @@ -12,17 +13,19 @@ export async function performDocumentEdits( edits.filter((edit) => edit.isReplace), ); - const wereEditsApplied = await editor.edit((editBuilder) => { - edits.forEach(({ range, text, isReplace }) => { - if (text === "") { - editBuilder.delete(range); - } else if (range.isEmpty && !isReplace) { - editBuilder.insert(range.start, text); - } else { - editBuilder.replace(range, text); - } + const wereEditsApplied = await ide() + .getEditableTextEditor(editor) + .edit((editBuilder) => { + edits.forEach(({ range, text, isReplace }) => { + if (text === "") { + editBuilder.delete(range); + } else if (range.isEmpty && !isReplace) { + editBuilder.insert(range.start, text); + } else { + editBuilder.replace(range, text); + } + }); }); - }); deregister(); diff --git a/yarn.lock b/yarn.lock index 1d9821411c..468503f7db 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,19 +9,19 @@ dependencies: "regenerator-runtime" "^0.13.10" -"@eslint/eslintrc@^1.2.1": - "integrity" "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==" - "resolved" "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz" - "version" "1.2.1" +"@eslint/eslintrc@^1.2.3": + "integrity" "sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA==" + "resolved" "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.3.tgz" + "version" "1.2.3" dependencies: "ajv" "^6.12.4" "debug" "^4.3.2" - "espree" "^9.3.1" + "espree" "^9.3.2" "globals" "^13.9.0" "ignore" "^5.2.0" "import-fresh" "^3.2.1" "js-yaml" "^4.1.0" - "minimatch" "^3.0.4" + "minimatch" "^3.1.2" "strip-json-comments" "^3.1.1" "@humanwhocodes/config-array@^0.9.2": @@ -66,7 +66,7 @@ dependencies: "type-detect" "4.0.8" -"@sinonjs/fake-timers@^7.1.2", "@sinonjs/fake-timers@>=5": +"@sinonjs/fake-timers@^7.1.0", "@sinonjs/fake-timers@>=5": "integrity" "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==" "resolved" "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz" "version" "7.1.2" @@ -98,17 +98,17 @@ "version" "4.3.3" "@types/glob@^7.1.3": - "integrity" "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==" - "resolved" "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz" - "version" "7.2.0" + "integrity" "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==" + "resolved" "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz" + "version" "7.1.3" dependencies: "@types/minimatch" "*" "@types/node" "*" "@types/js-yaml@^4.0.2": - "integrity" "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==" - "resolved" "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz" - "version" "4.0.5" + "integrity" "sha512-KbeHS/Y4R+k+5sWXEYzAZKuB1yQlZtEghuhRxrVRLaqhtoG5+26JwQsa4HyS3AWX8v1Uwukma5HheduUDskasA==" + "resolved" "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.2.tgz" + "version" "4.0.2" "@types/json-schema@^7.0.9": "integrity" "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" @@ -121,9 +121,9 @@ "version" "0.0.29" "@types/lodash@^4.14.168": - "integrity" "sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag==" - "resolved" "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.181.tgz" - "version" "4.14.181" + "integrity" "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==" + "resolved" "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz" + "version" "4.14.168" "@types/minimatch@*": "integrity" "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" @@ -131,14 +131,14 @@ "version" "3.0.5" "@types/mocha@^8.0.4": - "integrity" "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==" - "resolved" "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz" - "version" "8.2.3" + "integrity" "sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ==" + "resolved" "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.0.tgz" + "version" "8.2.0" "@types/node@*", "@types/node@^16.11.3": - "integrity" "sha512-GZ7bu5A6+4DtG7q9GsoHXy3ALcgeIHP4NnL0Vv2wu0uUB/yQex26v0tf6/na1mm0+bS9Uw+0DFex7aaKr2qawQ==" - "resolved" "https://registry.npmjs.org/@types/node/-/node-16.11.26.tgz" - "version" "16.11.26" + "integrity" "sha512-aIYL9Eemcecs1y77XzFGiSc+FdfN58k4J23UEe6+hynf4Wd9g4DzQPwIKL080vSMuubFqy2hWwOzCtJdc6vFKw==" + "resolved" "https://registry.npmjs.org/@types/node/-/node-16.11.3.tgz" + "version" "16.11.3" "@types/semver@^7.3.9": "integrity" "sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ==" @@ -146,16 +146,11 @@ "version" "7.3.9" "@types/sinon@^10.0.2": - "integrity" "sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g==" - "resolved" "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.11.tgz" - "version" "10.0.11" + "integrity" "sha512-BHn8Bpkapj8Wdfxvh2jWIUoaYB/9/XhsL0oOvBfRagJtKlSl9NWPcFOz2lRukI9szwGxFtYZCTejJSqsGDbdmw==" + "resolved" "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.2.tgz" + "version" "10.0.2" dependencies: - "@types/sinonjs__fake-timers" "*" - -"@types/sinonjs__fake-timers@*": - "integrity" "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==" - "resolved" "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz" - "version" "8.1.2" + "@sinonjs/fake-timers" "^7.1.0" "@types/uuid@^8.3.4": "integrity" "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" @@ -168,13 +163,13 @@ "version" "1.61.0" "@typescript-eslint/eslint-plugin@^5.20.0": - "integrity" "sha512-fapGzoxilCn3sBtC6NtXZX6+P/Hef7VDbyfGqTTpzYydwhlkevB+0vE0EnmHPVTVSy68GUncyJ/2PcrFBeCo5Q==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.20.0.tgz" - "version" "5.20.0" + "integrity" "sha512-hEcSmG4XodSLiAp1uxv/OQSGsDY6QN3TcRU32gANp+19wGE1QQZLRS8/GV58VRUoXhnkuJ3ZxNQ3T6Z6zM59DA==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.23.0.tgz" + "version" "5.23.0" dependencies: - "@typescript-eslint/scope-manager" "5.20.0" - "@typescript-eslint/type-utils" "5.20.0" - "@typescript-eslint/utils" "5.20.0" + "@typescript-eslint/scope-manager" "5.23.0" + "@typescript-eslint/type-utils" "5.23.0" + "@typescript-eslint/utils" "5.23.0" "debug" "^4.3.2" "functional-red-black-tree" "^1.0.1" "ignore" "^5.1.8" @@ -183,68 +178,68 @@ "tsutils" "^3.21.0" "@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.20.0": - "integrity" "sha512-UWKibrCZQCYvobmu3/N8TWbEeo/EPQbS41Ux1F9XqPzGuV7pfg6n50ZrFo6hryynD8qOTTfLHtHjjdQtxJ0h/w==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.20.0.tgz" - "version" "5.20.0" + "integrity" "sha512-V06cYUkqcGqpFjb8ttVgzNF53tgbB/KoQT/iB++DOIExKmzI9vBJKjZKt/6FuV9c+zrDsvJKbJ2DOCYwX91cbw==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.23.0.tgz" + "version" "5.23.0" dependencies: - "@typescript-eslint/scope-manager" "5.20.0" - "@typescript-eslint/types" "5.20.0" - "@typescript-eslint/typescript-estree" "5.20.0" + "@typescript-eslint/scope-manager" "5.23.0" + "@typescript-eslint/types" "5.23.0" + "@typescript-eslint/typescript-estree" "5.23.0" "debug" "^4.3.2" -"@typescript-eslint/scope-manager@5.20.0": - "integrity" "sha512-h9KtuPZ4D/JuX7rpp1iKg3zOH0WNEa+ZIXwpW/KWmEFDxlA/HSfCMhiyF1HS/drTICjIbpA6OqkAhrP/zkCStg==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.20.0.tgz" - "version" "5.20.0" +"@typescript-eslint/scope-manager@5.23.0": + "integrity" "sha512-EhjaFELQHCRb5wTwlGsNMvzK9b8Oco4aYNleeDlNuL6qXWDF47ch4EhVNPh8Rdhf9tmqbN4sWDk/8g+Z/J8JVw==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.23.0.tgz" + "version" "5.23.0" dependencies: - "@typescript-eslint/types" "5.20.0" - "@typescript-eslint/visitor-keys" "5.20.0" + "@typescript-eslint/types" "5.23.0" + "@typescript-eslint/visitor-keys" "5.23.0" -"@typescript-eslint/type-utils@5.20.0": - "integrity" "sha512-WxNrCwYB3N/m8ceyoGCgbLmuZwupvzN0rE8NBuwnl7APgjv24ZJIjkNzoFBXPRCGzLNkoU/WfanW0exvp/+3Iw==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.20.0.tgz" - "version" "5.20.0" +"@typescript-eslint/type-utils@5.23.0": + "integrity" "sha512-iuI05JsJl/SUnOTXA9f4oI+/4qS/Zcgk+s2ir+lRmXI+80D8GaGwoUqs4p+X+4AxDolPpEpVUdlEH4ADxFy4gw==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.23.0.tgz" + "version" "5.23.0" dependencies: - "@typescript-eslint/utils" "5.20.0" + "@typescript-eslint/utils" "5.23.0" "debug" "^4.3.2" "tsutils" "^3.21.0" -"@typescript-eslint/types@5.20.0": - "integrity" "sha512-+d8wprF9GyvPwtoB4CxBAR/s0rpP25XKgnOvMf/gMXYDvlUC3rPFHupdTQ/ow9vn7UDe5rX02ovGYQbv/IUCbg==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.20.0.tgz" - "version" "5.20.0" +"@typescript-eslint/types@5.23.0": + "integrity" "sha512-NfBsV/h4dir/8mJwdZz7JFibaKC3E/QdeMEDJhiAE3/eMkoniZ7MjbEMCGXw6MZnZDMN3G9S0mH/6WUIj91dmw==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.23.0.tgz" + "version" "5.23.0" -"@typescript-eslint/typescript-estree@5.20.0": - "integrity" "sha512-36xLjP/+bXusLMrT9fMMYy1KJAGgHhlER2TqpUVDYUQg4w0q/NW/sg4UGAgVwAqb8V4zYg43KMUpM8vV2lve6w==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.20.0.tgz" - "version" "5.20.0" +"@typescript-eslint/typescript-estree@5.23.0": + "integrity" "sha512-xE9e0lrHhI647SlGMl+m+3E3CKPF1wzvvOEWnuE3CCjjT7UiRnDGJxmAcVKJIlFgK6DY9RB98eLr1OPigPEOGg==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.23.0.tgz" + "version" "5.23.0" dependencies: - "@typescript-eslint/types" "5.20.0" - "@typescript-eslint/visitor-keys" "5.20.0" + "@typescript-eslint/types" "5.23.0" + "@typescript-eslint/visitor-keys" "5.23.0" "debug" "^4.3.2" "globby" "^11.0.4" "is-glob" "^4.0.3" "semver" "^7.3.5" "tsutils" "^3.21.0" -"@typescript-eslint/utils@5.20.0": - "integrity" "sha512-lHONGJL1LIO12Ujyx8L8xKbwWSkoUKFSO+0wDAqGXiudWB2EO7WEUT+YZLtVbmOmSllAjLb9tpoIPwpRe5Tn6w==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.20.0.tgz" - "version" "5.20.0" +"@typescript-eslint/utils@5.23.0": + "integrity" "sha512-dbgaKN21drqpkbbedGMNPCtRPZo1IOUr5EI9Jrrh99r5UW5Q0dz46RKXeSBoPV+56R6dFKpbrdhgUNSJsDDRZA==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.23.0.tgz" + "version" "5.23.0" dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.20.0" - "@typescript-eslint/types" "5.20.0" - "@typescript-eslint/typescript-estree" "5.20.0" + "@typescript-eslint/scope-manager" "5.23.0" + "@typescript-eslint/types" "5.23.0" + "@typescript-eslint/typescript-estree" "5.23.0" "eslint-scope" "^5.1.1" "eslint-utils" "^3.0.0" -"@typescript-eslint/visitor-keys@5.20.0": - "integrity" "sha512-1flRpNF+0CAQkMNlTJ6L/Z5jiODG/e5+7mk6XwtPOUS3UrTz3UOiAg9jG2VtKsWI6rZQfy4C6a232QNRZTRGlg==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.20.0.tgz" - "version" "5.20.0" +"@typescript-eslint/visitor-keys@5.23.0": + "integrity" "sha512-Vd4mFNchU62sJB8pX19ZSPog05B0Y0CE2UxAZPT5k4iqhRYjPnqyY3woMxCd0++t9OTqkgjST+1ydLBi7e2Fvg==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.23.0.tgz" + "version" "5.23.0" dependencies: - "@typescript-eslint/types" "5.20.0" + "@typescript-eslint/types" "5.23.0" "eslint-visitor-keys" "^3.0.0" "@ungap/promise-all-settled@1.1.2": @@ -253,9 +248,9 @@ "version" "1.1.2" "@vscode/test-electron@^2.1.3": - "integrity" "sha512-tHHAWNVwl8C7nyezHAHdNPWkksdXWvmae6bt4k1tJ9hvMm6QIIk95Mkutl82XHcD60mdP46EHDGU+xFsAvygOQ==" - "resolved" "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.1.4.tgz" - "version" "2.1.4" + "integrity" "sha512-O/ioqFpV+RvKbRykX2ItYPnbcZ4Hk5V0rY4uhQjQTLhGL9WZUvS7exzuYQCCI+ilSqJpctvxq2llTfGXf9UnnA==" + "resolved" "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.1.5.tgz" + "version" "2.1.5" dependencies: "http-proxy-agent" "^4.0.1" "https-proxy-agent" "^5.0.0" @@ -267,15 +262,15 @@ "resolved" "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" "version" "1.1.1" -"acorn-jsx@^5.3.1": +"acorn-jsx@^5.3.2": "integrity" "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" "resolved" "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" "version" "5.3.2" -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^8.7.0": - "integrity" "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" - "resolved" "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz" - "version" "8.7.0" +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^8.7.1": + "integrity" "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" + "resolved" "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz" + "version" "8.7.1" "agent-base@6": "integrity" "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==" @@ -299,20 +294,15 @@ "resolved" "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" "version" "4.1.1" -"ansi-regex@^0.2.0": - "integrity" "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" - "version" "0.2.1" - -"ansi-regex@^0.2.1": - "integrity" "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==" +"ansi-regex@^0.2.0", "ansi-regex@^0.2.1": + "integrity" "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=" "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" "version" "0.2.1" "ansi-regex@^3.0.0": - "integrity" "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" - "version" "3.0.1" + "integrity" "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz" + "version" "3.0.0" "ansi-regex@^5.0.1": "integrity" "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" @@ -320,7 +310,7 @@ "version" "5.0.1" "ansi-styles@^1.1.0": - "integrity" "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94= sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==" + "integrity" "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=" "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz" "version" "1.1.0" @@ -331,7 +321,14 @@ dependencies: "color-convert" "^1.9.0" -"ansi-styles@^4.0.0", "ansi-styles@^4.1.0": +"ansi-styles@^4.0.0": + "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + "version" "4.3.0" + dependencies: + "color-convert" "^2.0.1" + +"ansi-styles@^4.1.0": "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" "version" "4.3.0" @@ -357,7 +354,7 @@ "version" "2.1.0" "asap@^2.0.0": - "integrity" "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + "integrity" "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" "resolved" "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" "version" "2.0.6" @@ -389,7 +386,7 @@ "version" "2.2.0" "binary@~0.3.0": - "integrity" "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==" + "integrity" "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=" "resolved" "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz" "version" "0.3.0" dependencies: @@ -397,12 +394,12 @@ "chainsaw" "~0.1.0" "bluebird@~3.4.1": - "integrity" "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM= sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" + "integrity" "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" "resolved" "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz" "version" "3.4.7" "boolbase@^1.0.0": - "integrity" "sha1-aN/1++YMUes3cl6p4+0xDcwed24= sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + "integrity" "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" "resolved" "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" "version" "1.0.0" @@ -432,7 +429,7 @@ "version" "1.0.2" "buffers@~0.1.1": - "integrity" "sha1-skV5w77U1tOWru5tmorn9Ugqt7s= sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==" + "integrity" "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" "resolved" "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" "version" "0.1.1" @@ -460,7 +457,7 @@ "type-detect" "^4.0.5" "chainsaw@~0.1.0": - "integrity" "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==" + "integrity" "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=" "resolved" "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz" "version" "0.1.0" dependencies: @@ -484,7 +481,7 @@ "supports-color" "^7.1.0" "chalk@~0.5.1": - "integrity" "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ= sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==" + "integrity" "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=" "resolved" "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz" "version" "0.5.1" dependencies: @@ -543,12 +540,12 @@ "version" "1.1.4" "color-name@1.1.3": - "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" "version" "1.1.3" "concat-map@0.0.1": - "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" "version" "0.0.1" @@ -583,9 +580,9 @@ "version" "6.1.0" "debug@^4.1.1", "debug@^4.3.2", "debug@4": - "integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==" - "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - "version" "4.3.4" + "integrity" "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==" + "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz" + "version" "4.3.3" dependencies: "ms" "2.1.2" @@ -597,7 +594,7 @@ "ms" "2.1.2" "debuglog@^1.0.1": - "integrity" "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==" + "integrity" "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=" "resolved" "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz" "version" "1.0.1" @@ -619,7 +616,7 @@ "version" "0.1.4" "dezalgo@^1.0.0": - "integrity" "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= sha512-K7i4zNfT2kgQz3GylDw40ot9GAE47sFZ9EXHFSPP6zONLgH6kWXE0KWJchkbQJLBkRazq4APwZ4OwiFFlT95OQ==" + "integrity" "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=" "resolved" "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz" "version" "1.0.3" dependencies: @@ -676,7 +673,7 @@ "domhandler" "^4.2.0" "duplexer2@~0.1.4": - "integrity" "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==" + "integrity" "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=" "resolved" "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz" "version" "0.1.4" dependencies: @@ -693,26 +690,26 @@ "version" "2.2.0" "esbuild@^0.11.12": - "integrity" "sha512-iaiZZ9vUF5wJV8ob1tl+5aJTrwDczlvGP0JoMmnpC2B0ppiMCu8n8gmy5ZTGl5bcG081XBVn+U+jP+mPFm5T5Q==" - "resolved" "https://registry.npmjs.org/esbuild/-/esbuild-0.11.23.tgz" - "version" "0.11.23" + "integrity" "sha512-c8cso/1RwVj+fbDvLtUgSG4ZJQ0y9Zdrl6Ot/GAjyy4pdMCHaFnDMts5gqFnWRPLajWtEnI+3hlET4R9fVoZng==" + "resolved" "https://registry.npmjs.org/esbuild/-/esbuild-0.11.12.tgz" + "version" "0.11.12" "escalade@^3.1.1": "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" "version" "3.1.1" -"escape-string-regexp@^1.0.0": - "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" +"escape-string-regexp@^1.0.0", "escape-string-regexp@^1.0.5": + "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" "version" "1.0.5" -"escape-string-regexp@^1.0.5": - "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - "version" "1.0.5" +"escape-string-regexp@^4.0.0": + "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + "version" "4.0.0" -"escape-string-regexp@^4.0.0", "escape-string-regexp@4.0.0": +"escape-string-regexp@4.0.0": "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" "version" "4.0.0" @@ -756,11 +753,11 @@ "version" "3.3.0" "eslint@*", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^8.13.0", "eslint@>=5", "eslint@>=7.0.0": - "integrity" "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==" - "resolved" "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz" - "version" "8.13.0" + "integrity" "sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==" + "resolved" "https://registry.npmjs.org/eslint/-/eslint-8.15.0.tgz" + "version" "8.15.0" dependencies: - "@eslint/eslintrc" "^1.2.1" + "@eslint/eslintrc" "^1.2.3" "@humanwhocodes/config-array" "^0.9.2" "ajv" "^6.10.0" "chalk" "^4.0.0" @@ -771,7 +768,7 @@ "eslint-scope" "^7.1.1" "eslint-utils" "^3.0.0" "eslint-visitor-keys" "^3.3.0" - "espree" "^9.3.1" + "espree" "^9.3.2" "esquery" "^1.4.0" "esutils" "^2.0.2" "fast-deep-equal" "^3.1.3" @@ -787,7 +784,7 @@ "json-stable-stringify-without-jsonify" "^1.0.1" "levn" "^0.4.1" "lodash.merge" "^4.6.2" - "minimatch" "^3.0.4" + "minimatch" "^3.1.2" "natural-compare" "^1.4.0" "optionator" "^0.9.1" "regexpp" "^3.2.0" @@ -796,13 +793,13 @@ "text-table" "^0.2.0" "v8-compile-cache" "^2.0.3" -"espree@^9.3.1": - "integrity" "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==" - "resolved" "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz" - "version" "9.3.1" +"espree@^9.3.2": + "integrity" "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==" + "resolved" "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz" + "version" "9.3.2" dependencies: - "acorn" "^8.7.0" - "acorn-jsx" "^5.3.1" + "acorn" "^8.7.1" + "acorn-jsx" "^5.3.2" "eslint-visitor-keys" "^3.3.0" "esquery@^1.4.0": @@ -861,16 +858,16 @@ "version" "2.1.0" "fast-levenshtein@^2.0.6": - "integrity" "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + "integrity" "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" "resolved" "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" "version" "2.0.6" "fast-xml-parser@^3.20.0": - "integrity" "sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg==" - "resolved" "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz" - "version" "3.21.1" + "integrity" "sha512-cMQwDJYVDjMPU56DviszewgMKuNzuf4NQSBuDf9RgZ6FKm5QEMxW05Za8lvnuL6moxoeZVUWBlL733WmovvV6g==" + "resolved" "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.20.0.tgz" + "version" "3.20.0" dependencies: - "strnum" "^1.0.4" + "strnum" "^1.0.3" "fastq@^1.6.0": "integrity" "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==" @@ -920,7 +917,7 @@ "version" "3.2.5" "fs.realpath@^1.0.0": - "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8= sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" "version" "1.0.0" @@ -935,7 +932,7 @@ "rimraf" "2" "functional-red-black-tree@^1.0.1": - "integrity" "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" + "integrity" "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" "resolved" "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" "version" "1.0.1" @@ -950,16 +947,16 @@ "version" "2.0.0" "github-url-from-git@^1.3.0": - "integrity" "sha1-+YX+3MCpqledyI16/waNVcxiUaA= sha512-WWOec4aRI7YAykQ9+BHmzjyNlkfJFG8QLXnDTsLz/kZefq7qkzdfo4p6fkYYMIq1aj+gZcQs/1HQhQh3DPPxlQ==" + "integrity" "sha1-+YX+3MCpqledyI16/waNVcxiUaA=" "resolved" "https://registry.npmjs.org/github-url-from-git/-/github-url-from-git-1.5.0.tgz" "version" "1.5.0" "github-url-from-username-repo@^1.0.0": - "integrity" "sha1-fdeTMNKr5pwQws73lxTJchV5Hfo= sha512-Tj8CQqRoFVTglGdQ8FQmfq8gOOoOYZX7tnOKP8jq8Hdz2OTDhxvtlkLAbrqMYZ7X/YdaYQoUG1IBWxISBfqZ+Q==" + "integrity" "sha1-fdeTMNKr5pwQws73lxTJchV5Hfo=" "resolved" "https://registry.npmjs.org/github-url-from-username-repo/-/github-url-from-username-repo-1.0.2.tgz" "version" "1.0.2" -"glob-parent@^5.1.2": +"glob-parent@^5.1.2", "glob-parent@~5.1.0": "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" "version" "5.1.2" @@ -973,15 +970,8 @@ dependencies: "is-glob" "^4.0.3" -"glob-parent@~5.1.0": - "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" - "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - "version" "5.1.2" - dependencies: - "is-glob" "^4.0.1" - "glob@^5.0.3": - "integrity" "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==" + "integrity" "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=" "resolved" "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" "version" "5.0.15" dependencies: @@ -992,9 +982,9 @@ "path-is-absolute" "^1.0.0" "glob@^7.1.3", "glob@^7.1.7": - "integrity" "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==" - "resolved" "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" - "version" "7.2.0" + "integrity" "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==" + "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" + "version" "7.1.7" dependencies: "fs.realpath" "^1.0.0" "inflight" "^1.0.4" @@ -1016,9 +1006,9 @@ "path-is-absolute" "^1.0.0" "globals@^13.6.0", "globals@^13.9.0": - "integrity" "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==" - "resolved" "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz" - "version" "13.13.0" + "integrity" "sha512-ERO68sOYwm5UuLvSJTY7w7NP2c8S4UcXs3X1GBX8cwOr+ShOcDBbCY5mH4zxz0jsYCdJ8ve8Mv9n2YGJMB1aeg==" + "resolved" "https://registry.npmjs.org/globals/-/globals-13.14.0.tgz" + "version" "13.14.0" dependencies: "type-fest" "^0.20.2" @@ -1035,14 +1025,14 @@ "slash" "^3.0.0" "graceful-fs@^4.1.2": - "integrity" "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" - "version" "4.2.10" + "integrity" "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz" + "version" "4.2.9" "graceful-fs@^4.2.2": - "integrity" "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" - "version" "4.2.10" + "integrity" "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz" + "version" "4.2.9" "graceful-fs@2 || 3": "integrity" "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==" @@ -1057,14 +1047,14 @@ "version" "1.10.5" "has-ansi@^0.1.0": - "integrity" "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4= sha512-1YsTg1fk2/6JToQhtZkArMkurq8UoWU1Qe0aR3VUHjgij4nOylSWLWAtBXoZ4/dXOmugfLGm1c+QhuD0JyedFA==" + "integrity" "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=" "resolved" "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz" "version" "0.1.0" dependencies: "ansi-regex" "^0.2.0" "has-flag@^3.0.0": - "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0= sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" "version" "3.0.0" @@ -1119,12 +1109,12 @@ "resolve-from" "^4.0.0" "imurmurhash@^0.1.4": - "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o= sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o=" "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" "version" "0.1.4" "inflight@^1.0.4": - "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==" + "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" "version" "1.0.6" dependencies: @@ -1144,12 +1134,12 @@ "binary-extensions" "^2.0.0" "is-extglob@^2.1.1": - "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" "version" "2.1.1" "is-fullwidth-code-point@^2.0.0": - "integrity" "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==" + "integrity" "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" "version" "2.0.0" @@ -1176,17 +1166,17 @@ "version" "2.1.0" "isarray@~1.0.0": - "integrity" "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity" "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" "version" "1.0.0" "isarray@0.0.1": - "integrity" "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "integrity" "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" "resolved" "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" "version" "0.0.1" "isexe@^2.0.0": - "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" "version" "2.0.0" @@ -1198,12 +1188,12 @@ "@babel/runtime" "^7.15.4" "jju@^1.1.0": - "integrity" "sha1-o6vicYryQaKykE+EpiWXDzia4yo= sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" + "integrity" "sha1-o6vicYryQaKykE+EpiWXDzia4yo=" "resolved" "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz" "version" "1.4.0" "jquery-extend@~2.0.3": - "integrity" "sha1-aBXNsBqGbdujDm9ND8X7ZnknJzU= sha512-ysLU6/m8VLckIjAudiE+s7YAoYwklZy5Ft9kqO7FPkqaQrd3wUMuZ134G3uniysW8VZME/pGa2LcynsM4TjP5Q==" + "integrity" "sha1-aBXNsBqGbdujDm9ND8X7ZnknJzU=" "resolved" "https://registry.npmjs.org/jquery-extend/-/jquery-extend-2.0.3.tgz" "version" "2.0.3" @@ -1222,7 +1212,7 @@ "argparse" "^2.0.1" "json-parse-helpfulerror@^1.0.2": - "integrity" "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w= sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==" + "integrity" "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=" "resolved" "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz" "version" "1.0.3" dependencies: @@ -1234,7 +1224,7 @@ "version" "0.4.1" "json-stable-stringify-without-jsonify@^1.0.1": - "integrity" "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + "integrity" "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" "resolved" "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" "version" "1.0.1" @@ -1270,7 +1260,7 @@ "treeify" "^1.0.1" "listenercount@~1.0.1": - "integrity" "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" + "integrity" "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" "resolved" "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz" "version" "1.0.1" @@ -1282,7 +1272,7 @@ "p-locate" "^5.0.0" "lodash.get@^4.4.2": - "integrity" "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + "integrity" "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" "resolved" "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" "version" "4.4.2" @@ -1331,6 +1321,13 @@ "picomatch" "^2.3.1" "minimatch@^3.0.4", "minimatch@2 || 3": + "integrity" "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==" + "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz" + "version" "3.0.5" + dependencies: + "brace-expansion" "^1.1.7" + +"minimatch@^3.1.2": "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" "version" "3.1.2" @@ -1344,27 +1341,32 @@ dependencies: "brace-expansion" "^1.1.7" -"minimist@^1.2.0", "minimist@^1.2.6": +"minimist@^1.2.0", "minimist@^1.2.5": + "integrity" "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" + "version" "1.2.5" + +"minimist@^1.2.6": "integrity" "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" "version" "1.2.6" "mkdirp@^0.3.5": - "integrity" "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc= sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==" + "integrity" "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=" "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" "version" "0.3.5" "mkdirp@^0.5.1", "mkdirp@>=0.5 0": - "integrity" "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==" - "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" - "version" "0.5.6" + "integrity" "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==" + "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" + "version" "0.5.5" dependencies: - "minimist" "^1.2.6" + "minimist" "^1.2.5" "mocha@^8.1.3": - "integrity" "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==" - "resolved" "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz" - "version" "8.4.0" + "integrity" "sha512-TQqyC89V1J/Vxx0DhJIXlq9gbbL9XFNdeLQ1+JsnZsVaSOV1z3tWfw0qZmQJGQRIfkvZcs7snQnZnOCKoldq1Q==" + "resolved" "https://registry.npmjs.org/mocha/-/mocha-8.3.0.tgz" + "version" "8.3.0" dependencies: "@ungap/promise-all-settled" "1.1.2" "ansi-colors" "4.1.1" @@ -1418,7 +1420,7 @@ "version" "1.1.6" "natural-compare@^1.4.0": - "integrity" "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + "integrity" "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" "resolved" "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" "version" "1.4.0" @@ -1434,39 +1436,39 @@ "path-to-regexp" "^1.7.0" "node-html-parser@^5.3.3": - "integrity" "sha512-ncg1033CaX9UexbyA7e1N0aAoAYRDiV8jkTvzEnfd1GDvzFdrsXLzR4p4ik8mwLgnaKP/jyUFWDy9q3jvRT2Jw==" - "resolved" "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.3.3.tgz" - "version" "5.3.3" + "integrity" "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==" + "resolved" "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz" + "version" "5.4.2" dependencies: "css-select" "^4.2.1" "he" "1.2.0" "nopt-defaults@^0.0.1": - "integrity" "sha1-8VD8yIgjCcv7dhh+Eum8sgaUVYs= sha512-Ri0fmpCibbSQQX4LoYIvt/MmiA/ivo30tDT1ifdN7/Vh4frHHd/SspJHmlDmrpXflVvoFAPMw4u64eW44Ez0lA==" + "integrity" "sha1-8VD8yIgjCcv7dhh+Eum8sgaUVYs=" "resolved" "https://registry.npmjs.org/nopt-defaults/-/nopt-defaults-0.0.1.tgz" "version" "0.0.1" "nopt-usage@^0.1.0": - "integrity" "sha1-sYuMGD4YEEfKnmO3zefPxwLMpXk= sha512-Tg2sISrWBbSsCRqpEMmdxn3KZfacrd0N2NYpZQIq0MHxGHMjwzYlxeB9pVIom/g7CBK28atDUQsTlOfG0wOsNA==" + "integrity" "sha1-sYuMGD4YEEfKnmO3zefPxwLMpXk=" "resolved" "https://registry.npmjs.org/nopt-usage/-/nopt-usage-0.1.0.tgz" "version" "0.1.0" "nopt@^2.2.0": - "integrity" "sha1-KqCbfRdoSHs7ianFqlIzW/8Lrqc= sha512-gIOTA/uJuhPwFqp+spY7VQ1satbnGlD+iQVZxI18K6hs8Evq4sX81Ml7BB5byP/LsbR2yBVtmvdEmhi7evJ6Aw==" + "integrity" "sha1-KqCbfRdoSHs7ianFqlIzW/8Lrqc=" "resolved" "https://registry.npmjs.org/nopt/-/nopt-2.2.1.tgz" "version" "2.2.1" dependencies: "abbrev" "1" "nopt@^3.0.6": - "integrity" "sha1-xkZdvwirzU2zWTF/eaxopkayj/k= sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==" + "integrity" "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=" "resolved" "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" "version" "3.0.6" dependencies: "abbrev" "1" "normalize-package-data@^1.0.0": - "integrity" "sha1-i+lVuJB6+XXxpFhOqLubQUkjEvU= sha512-pyPVJAzFiaioifPIsJBEoKJ9YcPHz7UhckZ7wqhBztLLCu6NozkIDrN+frzrCwjXtfunXfaMWIDtcDhnbO8fWA==" + "integrity" "sha1-i+lVuJB6+XXxpFhOqLubQUkjEvU=" "resolved" "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-1.0.3.tgz" "version" "1.0.3" dependencies: @@ -1495,14 +1497,14 @@ "treeify" "^1.1.0" "nth-check@^2.0.1": - "integrity" "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==" - "resolved" "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz" - "version" "2.0.1" + "integrity" "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==" + "resolved" "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" + "version" "2.1.1" dependencies: "boolbase" "^1.0.0" "once@^1.3.0": - "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E= sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==" + "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" "version" "1.4.0" dependencies: @@ -1547,7 +1549,7 @@ "version" "4.0.0" "path-is-absolute@^1.0.0": - "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18= sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" "version" "1.0.1" @@ -1611,7 +1613,7 @@ "safe-buffer" "^5.1.0" "read-installed@~3.1.3": - "integrity" "sha1-SuNgga/T4iBNwuJ5gHqqUsMMjAw= sha512-XxD5VDz32T6rLCFfYElTif8/lkqcs9y51Gs2r30rAfT7LUGzJWaXLrwvn6fXkDsTzGcPr7Pj8CggOxwTxl/ozQ==" + "integrity" "sha1-SuNgga/T4iBNwuJ5gHqqUsMMjAw=" "resolved" "https://registry.npmjs.org/read-installed/-/read-installed-3.1.5.tgz" "version" "3.1.5" dependencies: @@ -1625,7 +1627,7 @@ "graceful-fs" "2 || 3" "read-package-json@1": - "integrity" "sha1-73nf2kbhZTdu6KV++/7dTRsCm6Q= sha512-9bayCl9cbXy3AL0qXhLQ0vliEgpzUVeLegSOrde3ujTHy2W18UsJiMUXEWkjbBB4ZnJzZPVuo2vAW62j4gY7gg==" + "integrity" "sha1-73nf2kbhZTdu6KV++/7dTRsCm6Q=" "resolved" "https://registry.npmjs.org/read-package-json/-/read-package-json-1.3.3.tgz" "version" "1.3.3" dependencies: @@ -1676,7 +1678,7 @@ "version" "3.2.0" "require-directory@^2.1.1": - "integrity" "sha1-jGStX9MNqxyXbiNE/+f3kqam30I= sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + "integrity" "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" "resolved" "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" "version" "2.1.1" @@ -1727,14 +1729,14 @@ "version" "5.1.2" "semver@^7.3.5", "semver@^7.3.7": - "integrity" "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==" - "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" - "version" "7.3.7" + "integrity" "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==" + "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" + "version" "7.3.8" dependencies: "lru-cache" "^6.0.0" "semver@2 || 3 || 4": - "integrity" "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= sha512-IrpJ+yoG4EOH8DFWuVg+8H1kW1Oaof0Wxe7cPcXW3x9BjkN/eVo54F15LyqemnDIUYskQWr9qvl/RihmSy6+xQ==" + "integrity" "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=" "resolved" "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" "version" "4.3.6" @@ -1746,7 +1748,7 @@ "randombytes" "^2.1.0" "setimmediate@~1.0.4": - "integrity" "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + "integrity" "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" "resolved" "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" "version" "1.0.5" @@ -1763,12 +1765,12 @@ "version" "3.0.0" "sinon@^11.1.1": - "integrity" "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==" - "resolved" "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz" - "version" "11.1.2" + "integrity" "sha512-ZSSmlkSyhUWbkF01Z9tEbxZLF/5tRC9eojCdFh33gtQaP7ITQVaMWQHGuFM7Cuf/KEfihuh1tTl3/ABju3AQMg==" + "resolved" "https://registry.npmjs.org/sinon/-/sinon-11.1.1.tgz" + "version" "11.1.1" dependencies: "@sinonjs/commons" "^1.8.3" - "@sinonjs/fake-timers" "^7.1.2" + "@sinonjs/fake-timers" "^7.1.0" "@sinonjs/samsam" "^6.0.2" "diff" "^5.0.0" "nise" "^5.1.0" @@ -1780,7 +1782,7 @@ "version" "3.0.0" "slide@~1.1.3": - "integrity" "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==" + "integrity" "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" "resolved" "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz" "version" "1.1.6" @@ -1799,16 +1801,7 @@ "is-fullwidth-code-point" "^2.0.0" "strip-ansi" "^4.0.0" -"string-width@^4.1.0": - "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" - "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - "version" "4.2.3" - dependencies: - "emoji-regex" "^8.0.0" - "is-fullwidth-code-point" "^3.0.0" - "strip-ansi" "^6.0.1" - -"string-width@^4.2.0": +"string-width@^4.1.0", "string-width@^4.2.0": "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" "version" "4.2.3" @@ -1818,14 +1811,14 @@ "strip-ansi" "^6.0.1" "strip-ansi@^0.3.0": - "integrity" "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA= sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==" + "integrity" "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=" "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz" "version" "0.3.0" dependencies: "ansi-regex" "^0.2.1" "strip-ansi@^4.0.0": - "integrity" "sha1-qEeQIusaw2iocTibY1JixQXuNo8= sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==" + "integrity" "sha1-qEeQIusaw2iocTibY1JixQXuNo8=" "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" "version" "4.0.0" dependencies: @@ -1839,7 +1832,7 @@ "ansi-regex" "^5.0.1" "strip-bom@^3.0.0": - "integrity" "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" + "integrity" "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" "version" "3.0.0" @@ -1848,13 +1841,13 @@ "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" "version" "3.1.1" -"strnum@^1.0.4": +"strnum@^1.0.3": "integrity" "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" "resolved" "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz" "version" "1.0.5" "supports-color@^0.2.0": - "integrity" "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo= sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==" + "integrity" "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=" "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" "version" "0.2.0" @@ -1865,7 +1858,14 @@ dependencies: "has-flag" "^3.0.0" -"supports-color@^7.1.0", "supports-color@^7.2.0": +"supports-color@^7.1.0": + "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + "version" "7.2.0" + dependencies: + "has-flag" "^4.0.0" + +"supports-color@^7.2.0": "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" "version" "7.2.0" @@ -1880,7 +1880,7 @@ "has-flag" "^4.0.0" "text-table@^0.2.0": - "integrity" "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + "integrity" "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" "version" "0.2.0" @@ -1892,7 +1892,7 @@ "is-number" "^7.0.0" "traverse@>=0.3.0 <0.4": - "integrity" "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==" + "integrity" "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" "resolved" "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz" "version" "0.3.9" @@ -1977,12 +1977,12 @@ "punycode" "^2.1.0" "util-deprecate@~1.0.1": - "integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" "version" "1.0.2" "util-extend@^1.0.1": - "integrity" "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8= sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA==" + "integrity" "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=" "resolved" "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz" "version" "1.0.3" @@ -2035,7 +2035,7 @@ "strip-ansi" "^6.0.0" "wrappy@1": - "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" "version" "1.0.2" From 76b06c534464dc22d046684387923ae26c91eac3 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 13 Nov 2022 12:51:34 +0100 Subject: [PATCH 11/84] clean up --- src/ide/vscode/VscodeEditEditor.ts | 31 +++++++++++++++++ .../vscode/VscodeEditableTextEditorImpl.ts | 33 +++++-------------- 2 files changed, 39 insertions(+), 25 deletions(-) create mode 100644 src/ide/vscode/VscodeEditEditor.ts diff --git a/src/ide/vscode/VscodeEditEditor.ts b/src/ide/vscode/VscodeEditEditor.ts new file mode 100644 index 0000000000..09d97cfaf2 --- /dev/null +++ b/src/ide/vscode/VscodeEditEditor.ts @@ -0,0 +1,31 @@ +import * as vscode from "vscode"; +import TextEditorEdit from "../../libs/common/ide/types/TextEditorEdit"; +import { + toVscodeEndOfLine, + toVscodePosition, + toVscodePositionOrRange, + toVscodeRange, +} from "./VscodeUtil"; + +export default function vscodeEditEditor( + editor: vscode.TextEditor, + callback: (editBuilder: TextEditorEdit) => void, + options?: { undoStopBefore: boolean; undoStopAfter: boolean }, +): Thenable { + return editor.edit((editBuilder) => { + callback({ + replace: (location, value) => { + editBuilder.replace(toVscodePositionOrRange(location), value); + }, + insert: (location, value) => { + editBuilder.insert(toVscodePosition(location), value); + }, + delete: (location) => { + return editBuilder.delete(toVscodeRange(location)); + }, + setEndOfLine: (endOfLine) => { + return editBuilder.setEndOfLine(toVscodeEndOfLine(endOfLine)); + }, + }); + }, options); +} diff --git a/src/ide/vscode/VscodeEditableTextEditorImpl.ts b/src/ide/vscode/VscodeEditableTextEditorImpl.ts index 3e802ae343..1cea4cdfd8 100644 --- a/src/ide/vscode/VscodeEditableTextEditorImpl.ts +++ b/src/ide/vscode/VscodeEditableTextEditorImpl.ts @@ -2,18 +2,16 @@ import * as vscode from "vscode"; import type Position from "../../libs/common/ide/Position"; import type Range from "../../libs/common/ide/Range"; import type Selection from "../../libs/common/ide/Selection"; -import type { EndOfLine } from "../../libs/common/ide/types/ide.types"; import type { EditableTextEditor } from "../../libs/common/ide/types/TextEditor"; import { TextEditorDecorationType } from "../../libs/common/ide/types/TextEditorDecorationType"; import type TextEditorEdit from "../../libs/common/ide/types/TextEditorEdit"; -import focusVscodeEditor from "./VscodeFocusEditor"; +import vscodeEditEditor from "./VscodeEditEditor"; +import vscodeFocusEditor from "./VscodeFocusEditor"; import vscodeOpenLink from "./VscodeOpenLink"; import VscodeTextEditorImpl from "./VscodeTextEditorImpl"; import { - toVscodeEndOfLine, - toVscodePosition, - toVscodeRange, toVscodePositionOrRange, + toVscodeRange, toVscodeSelection, } from "./VscodeUtil"; @@ -33,10 +31,6 @@ export default class VscodeEditableTextEditorImpl this.editor.revealRange(toVscodeRange(range)); } - public focus(): Promise { - return focusVscodeEditor(this.editor, this.id); - } - public setDecorations( decorationType: TextEditorDecorationType, ranges: readonly Range[], @@ -48,22 +42,11 @@ export default class VscodeEditableTextEditorImpl callback: (editBuilder: TextEditorEdit) => void, options?: { undoStopBefore: boolean; undoStopAfter: boolean }, ): Thenable { - return this.editor.edit((editBuilder) => { - callback({ - replace: (location, value) => { - editBuilder.replace(toVscodePositionOrRange(location), value); - }, - insert: (location: Position, value: string) => { - editBuilder.insert(toVscodePosition(location), value); - }, - delete: (location: Range | Selection) => { - return editBuilder.delete(toVscodeRange(location)); - }, - setEndOfLine: (endOfLine: EndOfLine) => { - return editBuilder.setEndOfLine(toVscodeEndOfLine(endOfLine)); - }, - }); - }, options); + return vscodeEditEditor(this.editor, callback, options); + } + + public focus(): Promise { + return vscodeFocusEditor(this.editor, this.id); } public openLink(location: Position | Range): Promise { From 806f1e2c19267a066c9e9f8a4ee73f60b714787c Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 13 Nov 2022 13:34:25 +0100 Subject: [PATCH 12/84] Trans dimensional super fixes --- .../suite/groupByDocument.test.ts | 16 +++++++--- .../suite/prePhraseSnapshot.test.ts | 8 +++-- src/core/Debug.ts | 3 +- src/ide/vscode/VscodeIDE.ts | 12 ++++---- src/ide/vscode/VscodeTextEditorImpl.ts | 6 +++- src/ide/vscode/VscodeUtil.ts | 13 +++++++++ src/libs/common/ide/fake/FakeIDE.ts | 1 + src/libs/common/ide/spy/SpyIDE.ts | 4 +++ src/libs/common/ide/types/ide.types.ts | 5 ++++ src/libs/vscode-common/getExtensionApi.ts | 2 +- src/libs/vscode-common/index.ts | 2 +- .../vscode-common/testUtil/takeSnapshot.ts | 4 +-- .../{ => testUtil}/toPlainObject.ts | 10 ++++--- .../targets/NotebookCellTarget.ts | 4 ++- .../upgradeThatMarks.ts | 2 +- src/testUtil/TestCase.ts | 2 +- src/testUtil/TestCaseFixture.ts | 2 +- src/testUtil/TestCaseRecorder.ts | 2 +- src/testUtil/fromPlainObject.ts | 2 +- src/util/addDecorationsToEditor.ts | 29 ++++++++++--------- src/util/getDisplayLineMap.ts | 6 ++-- src/util/getTokensInRange.ts | 11 +++---- src/util/notebook.ts | 3 +- src/util/notebookLegacy.ts | 10 +++---- 24 files changed, 103 insertions(+), 56 deletions(-) rename src/libs/vscode-common/{ => testUtil}/toPlainObject.ts (90%) diff --git a/src/apps/cursorless-vscode-e2e/suite/groupByDocument.test.ts b/src/apps/cursorless-vscode-e2e/suite/groupByDocument.test.ts index e857c84694..e3046668ee 100644 --- a/src/apps/cursorless-vscode-e2e/suite/groupByDocument.test.ts +++ b/src/apps/cursorless-vscode-e2e/suite/groupByDocument.test.ts @@ -1,9 +1,11 @@ +import { splitKey } from "@cursorless/common"; import { getCursorlessApi } from "@cursorless/vscode-common"; import * as assert from "assert"; import * as vscode from "vscode"; -import { splitKey } from "@cursorless/common"; -import { runCursorlessCommand } from "../runCommand"; +// eslint-disable-next-line @typescript-eslint/no-restricted-imports +import { toVscodeEditor } from "../../../ide/vscode/VscodeUtil"; import { endToEndTestSetup } from "../endToEndTestSetup"; +import { runCursorlessCommand } from "../runCommand"; suite("Group by document", async function () { endToEndTestSetup(this); @@ -32,10 +34,16 @@ async function runTest() { const hat1 = hatMap .getEntries() - .find(([, token]) => token.editor === editor1 && token.text === "hello"); + .find( + ([, token]) => + toVscodeEditor(token.editor) === editor1 && token.text === "hello", + ); const hat2 = hatMap .getEntries() - .find(([, token]) => token.editor === editor2 && token.text === "world"); + .find( + ([, token]) => + toVscodeEditor(token.editor) === editor2 && token.text === "world", + ); const { hatStyle: hatStyle1, character: char1 } = splitKey(hat1![0]); const { hatStyle: hatStyle2, character: char2 } = splitKey(hat2![0]); diff --git a/src/apps/cursorless-vscode-e2e/suite/prePhraseSnapshot.test.ts b/src/apps/cursorless-vscode-e2e/suite/prePhraseSnapshot.test.ts index ab2379a147..5f5fa83659 100644 --- a/src/apps/cursorless-vscode-e2e/suite/prePhraseSnapshot.test.ts +++ b/src/apps/cursorless-vscode-e2e/suite/prePhraseSnapshot.test.ts @@ -4,10 +4,12 @@ import { } from "@cursorless/vscode-common"; import * as assert from "assert"; import * as vscode from "vscode"; +// eslint-disable-next-line @typescript-eslint/no-restricted-imports +import { fromVscodeSelection } from "../../../ide/vscode/VscodeUtil"; +import { endToEndTestSetup } from "../endToEndTestSetup"; import { mockPrePhraseGetVersion } from "../mockPrePhraseGetVersion"; import { openNewEditor } from "../openNewEditor"; import { runCursorlessCommand } from "../runCommand"; -import { endToEndTestSetup } from "../endToEndTestSetup"; /** * The selections we expect when the pre-phrase snapshot is used @@ -89,7 +91,7 @@ async function runTest( }); assert.deepStrictEqual( - editor.selections.map(selectionToPlainObject), - expectedSelections.map(selectionToPlainObject), + editor.selections.map(fromVscodeSelection).map(selectionToPlainObject), + expectedSelections.map(fromVscodeSelection).map(selectionToPlainObject), ); } diff --git a/src/core/Debug.ts b/src/core/Debug.ts index 5b5ebbecf6..38a60b3496 100644 --- a/src/core/Debug.ts +++ b/src/core/Debug.ts @@ -5,6 +5,7 @@ import { workspace, } from "vscode"; import { SyntaxNode, TreeCursor } from "web-tree-sitter"; +import { fromVscodeRange } from "../ide/vscode/VscodeUtil"; import Location from "../libs/common/ide/Location"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Graph } from "../typings/Types"; @@ -88,7 +89,7 @@ export default class Debug { private logBranchTypes(event: TextEditorSelectionChangeEvent) { const location = new Location( ide().activeTextEditor!.document.uri, - event.selections[0], + fromVscodeRange(event.selections[0]), ); let node: SyntaxNode; diff --git a/src/ide/vscode/VscodeIDE.ts b/src/ide/vscode/VscodeIDE.ts index ac703aca1b..4de2572ee7 100644 --- a/src/ide/vscode/VscodeIDE.ts +++ b/src/ide/vscode/VscodeIDE.ts @@ -20,7 +20,7 @@ import VscodeConfiguration from "./VscodeConfiguration"; import VscodeEditableTextEditorImpl from "./VscodeEditableTextEditorImpl"; import VscodeGlobalState from "./VscodeGlobalState"; import VscodeMessages from "./VscodeMessages"; -import VscodeTextEditorImpl from "./VscodeTextEditorImpl"; +import { fromVscodeEditor, toVscodeEditor } from "./VscodeUtil"; const EXTENSION_MODE_MAP: Record = { [ExtensionMode.Development]: "development", @@ -55,7 +55,7 @@ export default class VscodeIDE implements IDE { get activeTextEditor(): TextEditor | undefined { return window.activeTextEditor != null - ? new VscodeTextEditorImpl(window.activeTextEditor) + ? fromVscodeEditor(window.activeTextEditor) : undefined; } @@ -65,10 +65,12 @@ export default class VscodeIDE implements IDE { : undefined; } + get visibleTextEditors(): TextEditor[] { + return window.visibleTextEditors.map(fromVscodeEditor); + } + public getEditableTextEditor(editor: TextEditor): EditableTextEditor { - return new VscodeEditableTextEditorImpl( - (editor as VscodeTextEditorImpl).editor, - ); + return new VscodeEditableTextEditorImpl(toVscodeEditor(editor)); } disposeOnExit(...disposables: Disposable[]): () => void { diff --git a/src/ide/vscode/VscodeTextEditorImpl.ts b/src/ide/vscode/VscodeTextEditorImpl.ts index 51733fe96c..68a3bf3f47 100644 --- a/src/ide/vscode/VscodeTextEditorImpl.ts +++ b/src/ide/vscode/VscodeTextEditorImpl.ts @@ -11,11 +11,15 @@ export default class VscodeTextEditorImpl implements TextEditor { readonly id: string; readonly document: TextDocument; - constructor(public editor: vscode.TextEditor) { + constructor(protected editor: vscode.TextEditor) { this.id = uuid(); this.document = new VscodeTextDocumentImpl(editor.document); } + get vscodeEditor(): vscode.TextEditor { + return this.editor; + } + get selections(): Selection[] { return this.editor.selections.map(fromVscodeSelection); } diff --git a/src/ide/vscode/VscodeUtil.ts b/src/ide/vscode/VscodeUtil.ts index 3e342426f4..fe6a6ef504 100644 --- a/src/ide/vscode/VscodeUtil.ts +++ b/src/ide/vscode/VscodeUtil.ts @@ -3,7 +3,9 @@ import Position from "../../libs/common/ide/Position"; import Range from "../../libs/common/ide/Range"; import Selection from "../../libs/common/ide/Selection"; import { EndOfLine } from "../../libs/common/ide/types/ide.types"; +import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import TextLine from "../../libs/common/ide/types/TextLine"; +import VscodeTextEditorImpl from "./VscodeTextEditorImpl"; export function toVscodeRange(range: Range): vscode.Range { return new vscode.Range( @@ -80,3 +82,14 @@ export function toVscodeEndOfLine(eol: EndOfLine): vscode.EndOfLine { export function fromVscodeAndOfLine(eol: vscode.EndOfLine): EndOfLine { return eol === vscode.EndOfLine.LF ? "LF" : "CRLF"; } + +export function fromVscodeEditor(editor: vscode.TextEditor): TextEditor { + return new VscodeTextEditorImpl(editor); +} + +export function toVscodeEditor(editor: TextEditor): vscode.TextEditor { + if ("vscodeEditor" in editor) { + return (editor as VscodeTextEditorImpl).vscodeEditor; + } + throw Error("Can't get vscode editor from non vscode implementation"); +} diff --git a/src/libs/common/ide/fake/FakeIDE.ts b/src/libs/common/ide/fake/FakeIDE.ts index b2a117cca5..eb64caee03 100644 --- a/src/libs/common/ide/fake/FakeIDE.ts +++ b/src/libs/common/ide/fake/FakeIDE.ts @@ -43,6 +43,7 @@ export default class FakeIDE implements IDE { workspaceFolders: readonly WorkspaceFolder[] | undefined = undefined; activeTextEditor: TextEditor | undefined = undefined; activeEditableTextEditor: EditableTextEditor | undefined = undefined; + visibleTextEditors: TextEditor[] = []; public getEditableTextEditor(_editor: TextEditor): EditableTextEditor { throw Error("Not supported"); diff --git a/src/libs/common/ide/spy/SpyIDE.ts b/src/libs/common/ide/spy/SpyIDE.ts index 547e3030f1..8c9ecab980 100644 --- a/src/libs/common/ide/spy/SpyIDE.ts +++ b/src/libs/common/ide/spy/SpyIDE.ts @@ -36,6 +36,10 @@ export default class SpyIDE implements IDE { return this.original.activeEditableTextEditor; } + public get visibleTextEditors(): TextEditor[] { + return this.original.visibleTextEditors; + } + public get assetsRoot(): string { return this.original.assetsRoot; } diff --git a/src/libs/common/ide/types/ide.types.ts b/src/libs/common/ide/types/ide.types.ts index c8af83338e..6e72822798 100644 --- a/src/libs/common/ide/types/ide.types.ts +++ b/src/libs/common/ide/types/ide.types.ts @@ -49,6 +49,11 @@ export interface IDE { */ readonly activeEditableTextEditor: EditableTextEditor | undefined; + /** + * The currently visible editors or an empty array. + */ + readonly visibleTextEditors: TextEditor[]; + /** * Get an editable version of the text editor. * @param editor A editable text editor diff --git a/src/libs/vscode-common/getExtensionApi.ts b/src/libs/vscode-common/getExtensionApi.ts index f774cc3912..602e92ba2a 100644 --- a/src/libs/vscode-common/getExtensionApi.ts +++ b/src/libs/vscode-common/getExtensionApi.ts @@ -6,7 +6,7 @@ import type { Target } from "../../typings/target.types"; import type { Graph } from "../../typings/Types"; import type FakeIDE from "../common/ide/fake/FakeIDE"; import type { IDE } from "../common/ide/types/ide.types"; -import type { TargetPlainObject } from "./toPlainObject"; +import type { TargetPlainObject } from "./testUtil/toPlainObject"; interface TestHelpers { graph: Graph; diff --git a/src/libs/vscode-common/index.ts b/src/libs/vscode-common/index.ts index a88399b58a..f75aae556f 100644 --- a/src/libs/vscode-common/index.ts +++ b/src/libs/vscode-common/index.ts @@ -1,6 +1,6 @@ export * from "./getExtensionApi"; export * from "./notebook"; -export * from "./toPlainObject"; +export * from "./testUtil/toPlainObject"; export * from "./testUtil/testConstants"; export { takeSnapshot, diff --git a/src/libs/vscode-common/testUtil/takeSnapshot.ts b/src/libs/vscode-common/testUtil/takeSnapshot.ts index 7f02284ca2..8354e2a166 100644 --- a/src/libs/vscode-common/testUtil/takeSnapshot.ts +++ b/src/libs/vscode-common/testUtil/takeSnapshot.ts @@ -8,10 +8,10 @@ import { SerializedMarks, TargetPlainObject, targetToPlainObject, -} from "../toPlainObject"; -import { TextEditor } from "vscode"; +} from "./toPlainObject"; import type { IDE } from "../../common/ide/types/ide.types"; import type { Clipboard } from "../../common/ide/types/Clipboard"; +import type { TextEditor } from "../../common/ide/types/TextEditor"; export type ExtraSnapshotField = keyof TestCaseSnapshot; export type ExcludableSnapshotField = keyof TestCaseSnapshot; diff --git a/src/libs/vscode-common/toPlainObject.ts b/src/libs/vscode-common/testUtil/toPlainObject.ts similarity index 90% rename from src/libs/vscode-common/toPlainObject.ts rename to src/libs/vscode-common/testUtil/toPlainObject.ts index 85a72bd393..419240f67f 100644 --- a/src/libs/vscode-common/toPlainObject.ts +++ b/src/libs/vscode-common/testUtil/toPlainObject.ts @@ -1,7 +1,9 @@ -import type { Position, Range, Selection } from "vscode"; -import type { TestDecoration } from "../../core/editStyles"; -import type { Target } from "../../typings/target.types"; -import type { Token } from "../../typings/Types"; +import type { TestDecoration } from "../../../core/editStyles"; +import type { Target } from "../../../typings/target.types"; +import type { Token } from "../../../typings/Types"; +import type Position from "../../common/ide/Position"; +import type Range from "../../common/ide/Range"; +import type Selection from "../../common/ide/Selection"; export type PositionPlainObject = { line: number; diff --git a/src/processTargets/targets/NotebookCellTarget.ts b/src/processTargets/targets/NotebookCellTarget.ts index e9ba409ed4..28365638d8 100644 --- a/src/processTargets/targets/NotebookCellTarget.ts +++ b/src/processTargets/targets/NotebookCellTarget.ts @@ -1,3 +1,4 @@ +import { toVscodeEditor } from "../../ide/vscode/VscodeUtil"; import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import { Target } from "../../typings/target.types"; import { Position } from "../../typings/targetDescriptor.types"; @@ -68,6 +69,7 @@ export class NotebookCellPositionTarget extends BaseTarget { } private isNotebookEditor(editor: TextEditor) { - return getNotebookFromCellDocument(editor.document) != null; + const vscodeEditor = toVscodeEditor(editor); + return getNotebookFromCellDocument(vscodeEditor.document) != null; } } diff --git a/src/scripts/transformRecordedTests/upgradeThatMarks.ts b/src/scripts/transformRecordedTests/upgradeThatMarks.ts index 839cf32682..3c689719a5 100644 --- a/src/scripts/transformRecordedTests/upgradeThatMarks.ts +++ b/src/scripts/transformRecordedTests/upgradeThatMarks.ts @@ -2,7 +2,7 @@ import { TestCaseFixture } from "../../testUtil/TestCaseFixture"; import { SelectionPlainObject, TargetPlainObject, -} from "../../libs/vscode-common/toPlainObject"; +} from "../../libs/vscode-common/testUtil/toPlainObject"; import { FixtureTransformation } from "./types"; // FIXME: Remove this before merging the PR diff --git a/src/testUtil/TestCase.ts b/src/testUtil/TestCase.ts index fdff4d0ef9..b15477b63a 100644 --- a/src/testUtil/TestCase.ts +++ b/src/testUtil/TestCase.ts @@ -19,7 +19,7 @@ import { marksToPlainObject, SerializedMarks, testDecorationsToPlainObject, -} from "../libs/vscode-common/toPlainObject"; +} from "../libs/vscode-common/testUtil/toPlainObject"; import { TargetDescriptor } from "../typings/targetDescriptor.types"; import { Token } from "../typings/Types"; import { cleanUpTestCaseCommand } from "./cleanUpTestCaseCommand"; diff --git a/src/testUtil/TestCaseFixture.ts b/src/testUtil/TestCaseFixture.ts index 623fbf28e8..33cc22ac74 100644 --- a/src/testUtil/TestCaseFixture.ts +++ b/src/testUtil/TestCaseFixture.ts @@ -2,7 +2,7 @@ import type { CommandLatest } from "../core/commandRunner/command.types"; import type { SpyIDERecordedValues } from "../libs/common/ide/spy/SpyIDE"; import type { TargetDescriptor } from "../typings/targetDescriptor.types"; import type { TestCaseSnapshot } from "../libs/vscode-common/testUtil/takeSnapshot"; -import type { PositionPlainObject } from "../libs/vscode-common/toPlainObject"; +import type { PositionPlainObject } from "../libs/vscode-common/testUtil/toPlainObject"; export type TestCaseCommand = CommandLatest; export interface PlainTestDecoration { diff --git a/src/testUtil/TestCaseRecorder.ts b/src/testUtil/TestCaseRecorder.ts index 0512029181..671da1ce1d 100644 --- a/src/testUtil/TestCaseRecorder.ts +++ b/src/testUtil/TestCaseRecorder.ts @@ -22,7 +22,7 @@ import { DEFAULT_TEXT_EDITOR_OPTIONS_FOR_TEST } from "../libs/vscode-common/test import { marksToPlainObject, SerializedMarks, -} from "../libs/vscode-common/toPlainObject"; +} from "../libs/vscode-common/testUtil/toPlainObject"; import { DecoratedSymbolMark } from "../typings/targetDescriptor.types"; import { Graph } from "../typings/Types"; import { TestCase, TestCaseContext } from "./TestCase"; diff --git a/src/testUtil/fromPlainObject.ts b/src/testUtil/fromPlainObject.ts index 95d12f5065..162048df7c 100644 --- a/src/testUtil/fromPlainObject.ts +++ b/src/testUtil/fromPlainObject.ts @@ -5,7 +5,7 @@ import type { RangePlainObject, SelectionPlainObject, TargetPlainObject, -} from "../libs/vscode-common/toPlainObject"; +} from "../libs/vscode-common/testUtil/toPlainObject"; import Range from "../libs/common/ide/Range"; import Selection from "../libs/common/ide/Selection"; import Position from "../libs/common/ide/Position"; diff --git a/src/util/addDecorationsToEditor.ts b/src/util/addDecorationsToEditor.ts index e0e99696bc..90a2b70570 100644 --- a/src/util/addDecorationsToEditor.ts +++ b/src/util/addDecorationsToEditor.ts @@ -1,8 +1,9 @@ import { concat, flatten, maxBy, min } from "lodash"; -import * as vscode from "vscode"; import Decorations from "../core/Decorations"; import { HatStyleName } from "../core/hatStyles"; import { IndividualHatMap } from "../core/IndividualHatMap"; +import Range from "../libs/common/ide/Range"; +import { TextEditor } from "../libs/common/ide/types/TextEditor"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { TokenGraphemeSplitter } from "../libs/cursorless-engine/tokenGraphemeSplitter"; import { getMatcher } from "../libs/cursorless-engine/tokenizer"; @@ -18,14 +19,14 @@ export function addDecorationsToEditors( ) { hatTokenMap.clear(); - let editors: readonly vscode.TextEditor[]; + let editors: readonly TextEditor[]; if (ide().activeTextEditor == null) { - editors = vscode.window.visibleTextEditors; + editors = ide().visibleTextEditors; } else { editors = [ ide().activeTextEditor!, - ...vscode.window.visibleTextEditors.filter( + ...ide().visibleTextEditors.filter( (editor) => editor !== ide().activeTextEditor, ), ]; @@ -58,8 +59,8 @@ export function addDecorationsToEditors( tokens.sort( getTokenComparator( - displayLineMap.get(editor.selection.active.line)!, - editor.selection.active.character, + displayLineMap.get(editor.selections[0].active.line)!, + editor.selections[0].active.character, ), ); @@ -95,9 +96,9 @@ export function addDecorationsToEditors( const graphemeDecorationIndices: { [grapheme: string]: number } = {}; const decorationRanges: Map< - vscode.TextEditor, + TextEditor, { - [decorationName in HatStyleName]?: vscode.Range[]; + [decorationName in HatStyleName]?: Range[]; } > = new Map( editors.map((editor) => [ @@ -156,7 +157,7 @@ export function addDecorationsToEditors( decorationRanges .get(token.editor)! [hatStyleName]!.push( - new vscode.Range( + new Range( token.range.start.translate(undefined, bestGrapheme.tokenStartOffset), token.range.start.translate(undefined, bestGrapheme.tokenEndOffset), ), @@ -169,10 +170,12 @@ export function addDecorationsToEditors( decorationRanges.forEach((ranges, editor) => { decorations.hatStyleNames.forEach((hatStyleName) => { - editor.setDecorations( - decorations.decorationMap[hatStyleName]!, - ranges[hatStyleName]!, - ); + ide() + .getEditableTextEditor(editor) + .setDecorations( + decorations.decorationMap[hatStyleName]!, + ranges[hatStyleName]!, + ); }); }); } diff --git a/src/util/getDisplayLineMap.ts b/src/util/getDisplayLineMap.ts index 923ace75bb..cef274802e 100644 --- a/src/util/getDisplayLineMap.ts +++ b/src/util/getDisplayLineMap.ts @@ -1,5 +1,5 @@ import { concat, flatten, flow, range, uniq } from "lodash"; -import * as vscode from "vscode"; +import { TextEditor } from "../libs/common/ide/types/TextEditor"; /** * Returns a map from line numbers in the file to display lines, which skip @@ -9,14 +9,14 @@ import * as vscode from "vscode"; * * @param editor A visible editor */ -export function getDisplayLineMap(editor: vscode.TextEditor) { +export function getDisplayLineMap(editor: TextEditor) { return new Map( flow( flatten, uniq, )( concat( - [[editor.selection.start.line]], + [[editor.selections[0].start.line]], editor.visibleRanges.map((visibleRange) => range(visibleRange.start.line, visibleRange.end.line + 1), ), diff --git a/src/util/getTokensInRange.ts b/src/util/getTokensInRange.ts index b59f5dd0e8..d43829725a 100644 --- a/src/util/getTokensInRange.ts +++ b/src/util/getTokensInRange.ts @@ -1,16 +1,17 @@ -import * as vscode from "vscode"; +import Range from "../libs/common/ide/Range"; +import { TextEditor } from "../libs/common/ide/types/TextEditor"; import { tokenize } from "../libs/cursorless-engine/tokenizer"; import { RangeOffsets } from "../typings/updateSelections"; export interface PartialToken { text: string; - range: vscode.Range; + range: Range; offsets: RangeOffsets; } export function getTokensInRange( - editor: vscode.TextEditor, - range: vscode.Range, + editor: TextEditor, + range: Range, ): PartialToken[] { const languageId = editor.document.languageId; const text = editor.document.getText(range); @@ -19,7 +20,7 @@ export function getTokensInRange( return tokenize(text, languageId, (match) => { const startOffset = rangeOffset + match.index!; const endOffset = rangeOffset + match.index! + match[0].length; - const range = new vscode.Range( + const range = new Range( editor.document.positionAt(startOffset), editor.document.positionAt(endOffset), ); diff --git a/src/util/notebook.ts b/src/util/notebook.ts index f6c225b96e..ddb0563682 100644 --- a/src/util/notebook.ts +++ b/src/util/notebook.ts @@ -1,5 +1,4 @@ -import { NotebookCell, window } from "vscode"; -import TextDocument from "../libs/common/ide/types/TextDocument"; +import { NotebookCell, TextDocument, window } from "vscode"; import { getNotebookFromCellDocumentLegacy, isVscodeLegacyNotebookVersion, diff --git a/src/util/notebookLegacy.ts b/src/util/notebookLegacy.ts index 8d97ab5559..0c19ac3b96 100644 --- a/src/util/notebookLegacy.ts +++ b/src/util/notebookLegacy.ts @@ -7,6 +7,7 @@ import { TextEditor, version, } from "vscode"; +import { toVscodeEditor } from "../ide/vscode/VscodeUtil"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { getCellIndex } from "../libs/vscode-common/notebook"; import { getNotebookFromCellDocument } from "./notebook"; @@ -22,9 +23,11 @@ export async function focusNotebookCellLegacy(editor: TextEditor) { return; } + const vscodeEditor = toVscodeEditor(activeTextEditor); + const editorNotebook = getNotebookFromCellDocument(editor.document); const activeEditorNotebook = getNotebookFromCellDocument( - activeTextEditor.document, + vscodeEditor.document, ); if ( @@ -36,10 +39,7 @@ export async function focusNotebookCellLegacy(editor: TextEditor) { } const editorIndex = getCellIndex(editorNotebook, editor.document); - const activeEditorIndex = getCellIndex( - editorNotebook, - activeTextEditor.document, - ); + const activeEditorIndex = getCellIndex(editorNotebook, vscodeEditor.document); if (editorIndex === -1 || activeEditorIndex === -1) { throw new Error( From d6c43f5685b3930748f4ec4400041a77391c1e0f Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 13 Nov 2022 13:57:55 +0100 Subject: [PATCH 13/84] Mind boggling changes --- .../suite/recorded.test.ts | 4 +++- src/extension.ts | 12 ++++++++++- .../vscode/VscodeEditableTextEditorImpl.ts | 7 ++++++- src/ide/vscode/VscodeTextEditorImpl.ts | 5 +++++ src/libs/common/ide/types/TextEditor.ts | 11 ++++++++++ .../common/ide/types/TextEditorOptions.ts | 21 +++++++++++++++++++ .../vscode-common/testUtil/testConstants.ts | 4 ++-- src/testUtil/TestCaseRecorder.ts | 6 ++++-- 8 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 src/libs/common/ide/types/TextEditorOptions.ts diff --git a/src/apps/cursorless-vscode-e2e/suite/recorded.test.ts b/src/apps/cursorless-vscode-e2e/suite/recorded.test.ts index c39a627216..12d8373e22 100644 --- a/src/apps/cursorless-vscode-e2e/suite/recorded.test.ts +++ b/src/apps/cursorless-vscode-e2e/suite/recorded.test.ts @@ -29,6 +29,8 @@ import { openNewEditor } from "../openNewEditor"; import { runCursorlessCommand } from "../runCommand"; import shouldUpdateFixtures from "../shouldUpdateFixtures"; import { sleepWithBackoff, endToEndTestSetup } from "../endToEndTestSetup"; +// eslint-disable-next-line @typescript-eslint/no-restricted-imports +import ide from "../../../libs/cursorless-engine/singletons/ide.singleton"; function createPosition(position: PositionPlainObject) { return new vscode.Position(position.line, position.character); @@ -177,7 +179,7 @@ async function runTest(file: string, spyIde: SpyIDE) { cursorlessApi.sourceMark, excludeFields, [], - vscode.window.activeTextEditor!, // eslint-disable-line no-restricted-properties + ide().activeTextEditor!, spyIde, marks, undefined, diff --git a/src/extension.ts b/src/extension.ts index dc163b274a..ce3b590f4f 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -2,6 +2,7 @@ import * as vscode from "vscode"; import CommandRunner from "./core/commandRunner/CommandRunner"; import { ThatMark } from "./core/ThatMark"; import VscodeIDE from "./ide/vscode/VscodeIDE"; +import VscodeTextEditorImpl from "./ide/vscode/VscodeTextEditorImpl"; import FakeIDE from "./libs/common/ide/fake/FakeIDE"; import ide, { injectIde, @@ -11,6 +12,7 @@ import { getCommandServerApi, getParseTreeApi, } from "./libs/vscode-common/getExtensionApi"; +import { TargetPlainObject } from "./libs/vscode-common/testUtil/toPlainObject"; import { plainObjectToTarget } from "./testUtil/fromPlainObject"; import isTesting from "./testUtil/isTesting"; import { Graph } from "./typings/Types"; @@ -73,7 +75,15 @@ export async function activate( // FIXME: Remove this once we have a better way to get this function // accessible from our tests - plainObjectToTarget, + plainObjectToTarget: ( + editor: vscode.TextEditor, + plainObject: TargetPlainObject, + ) => { + return plainObjectToTarget( + new VscodeTextEditorImpl(editor), + plainObject, + ); + }, } : undefined, diff --git a/src/ide/vscode/VscodeEditableTextEditorImpl.ts b/src/ide/vscode/VscodeEditableTextEditorImpl.ts index 1cea4cdfd8..8b22923ac2 100644 --- a/src/ide/vscode/VscodeEditableTextEditorImpl.ts +++ b/src/ide/vscode/VscodeEditableTextEditorImpl.ts @@ -3,8 +3,9 @@ import type Position from "../../libs/common/ide/Position"; import type Range from "../../libs/common/ide/Range"; import type Selection from "../../libs/common/ide/Selection"; import type { EditableTextEditor } from "../../libs/common/ide/types/TextEditor"; -import { TextEditorDecorationType } from "../../libs/common/ide/types/TextEditorDecorationType"; +import type { TextEditorDecorationType } from "../../libs/common/ide/types/TextEditorDecorationType"; import type TextEditorEdit from "../../libs/common/ide/types/TextEditorEdit"; +import type { TextEditorOptions } from "../../libs/common/ide/types/TextEditorOptions"; import vscodeEditEditor from "./VscodeEditEditor"; import vscodeFocusEditor from "./VscodeFocusEditor"; import vscodeOpenLink from "./VscodeOpenLink"; @@ -27,6 +28,10 @@ export default class VscodeEditableTextEditorImpl this.editor.selections = selections.map(toVscodeSelection); } + set options(options: TextEditorOptions) { + this.editor.options = options; + } + public revealRange(range: Range): void { this.editor.revealRange(toVscodeRange(range)); } diff --git a/src/ide/vscode/VscodeTextEditorImpl.ts b/src/ide/vscode/VscodeTextEditorImpl.ts index 68a3bf3f47..d4c8e7b2a9 100644 --- a/src/ide/vscode/VscodeTextEditorImpl.ts +++ b/src/ide/vscode/VscodeTextEditorImpl.ts @@ -4,6 +4,7 @@ import type Range from "../../libs/common/ide/Range"; import type Selection from "../../libs/common/ide/Selection"; import type TextDocument from "../../libs/common/ide/types/TextDocument"; import type { TextEditor } from "../../libs/common/ide/types/TextEditor"; +import type { TextEditorOptions } from "../../libs/common/ide/types/TextEditorOptions"; import VscodeTextDocumentImpl from "./VscodeTextDocumentImpl"; import { fromVscodeRange, fromVscodeSelection } from "./VscodeUtil"; @@ -28,6 +29,10 @@ export default class VscodeTextEditorImpl implements TextEditor { return this.editor.visibleRanges.map(fromVscodeRange); } + get options(): TextEditorOptions { + return this.editor.options; + } + public isEqual(other: TextEditor): boolean { return this.id === other.id; } diff --git a/src/libs/common/ide/types/TextEditor.ts b/src/libs/common/ide/types/TextEditor.ts index 6e1e4be8f5..2b60e034fb 100644 --- a/src/libs/common/ide/types/TextEditor.ts +++ b/src/libs/common/ide/types/TextEditor.ts @@ -4,6 +4,7 @@ import type Selection from "../Selection"; import type TextDocument from "./TextDocument"; import type { TextEditorDecorationType } from "./TextEditorDecorationType"; import type TextEditorEdit from "./TextEditorEdit"; +import { TextEditorOptions } from "./TextEditorOptions"; export interface TextEditor { /** @@ -27,6 +28,11 @@ export interface TextEditor { */ readonly selections: Selection[]; + /** + * Text editor options. + */ + readonly options: TextEditorOptions; + /** * Check if this text editor is equal to `other`. * @@ -42,6 +48,11 @@ export interface EditableTextEditor extends TextEditor { */ selections: Selection[]; + /** + * Text editor options. + */ + options: TextEditorOptions; + /** * Scroll to reveal the given range. * diff --git a/src/libs/common/ide/types/TextEditorOptions.ts b/src/libs/common/ide/types/TextEditorOptions.ts new file mode 100644 index 0000000000..041286b979 --- /dev/null +++ b/src/libs/common/ide/types/TextEditorOptions.ts @@ -0,0 +1,21 @@ +/** + * Represents a {@link TextEditor text editor}'s {@link TextEditor.options options}. + */ +export interface TextEditorOptions { + /** + * The size in spaces a tab takes. This is used for two purposes: + * - the rendering width of a tab character; + * - the number of spaces to insert when {@link TextEditorOptions.insertSpaces insertSpaces} is true. + * + * When getting a text editor's options, this property will always be a number (resolved). + * When setting a text editor's options, this property is optional and it can be a number or `"auto"`. + */ + tabSize?: number | string; + + /** + * When pressing Tab insert {@link TextEditorOptions.tabSize n} spaces. + * When getting a text editor's options, this property will always be a boolean (resolved). + * When setting a text editor's options, this property is optional and it can be a boolean or `"auto"`. + */ + insertSpaces?: boolean | string; +} diff --git a/src/libs/vscode-common/testUtil/testConstants.ts b/src/libs/vscode-common/testUtil/testConstants.ts index 22bc06de80..19e0134e32 100644 --- a/src/libs/vscode-common/testUtil/testConstants.ts +++ b/src/libs/vscode-common/testUtil/testConstants.ts @@ -1,6 +1,6 @@ -import * as vscode from "vscode"; +import type { TextEditorOptions } from "../../common/ide/types/TextEditorOptions"; -export const DEFAULT_TEXT_EDITOR_OPTIONS_FOR_TEST: vscode.TextEditorOptions = { +export const DEFAULT_TEXT_EDITOR_OPTIONS_FOR_TEST: TextEditorOptions = { tabSize: 4, insertSpaces: true, }; diff --git a/src/testUtil/TestCaseRecorder.ts b/src/testUtil/TestCaseRecorder.ts index 671da1ce1d..24cd4fd4c0 100644 --- a/src/testUtil/TestCaseRecorder.ts +++ b/src/testUtil/TestCaseRecorder.ts @@ -338,7 +338,8 @@ export class TestCaseRecorder { // NB: We need to copy the editor options rather than storing a reference // because its properties are lazy this.originalTextEditorOptions = { ...editor.options }; - editor.options = DEFAULT_TEXT_EDITOR_OPTIONS_FOR_TEST; + ide().getEditableTextEditor(editor).options = + DEFAULT_TEXT_EDITOR_OPTIONS_FOR_TEST; } } @@ -468,7 +469,8 @@ export class TestCaseRecorder { this.originalIde = undefined; const editor = ide().activeTextEditor!; - editor.options = this.originalTextEditorOptions; + ide().getEditableTextEditor(editor).options = + this.originalTextEditorOptions; } dispose() { From 8f5cfa58bcd9e778c93f9209f304be42ef61298c Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 13 Nov 2022 14:41:06 +0100 Subject: [PATCH 14/84] Hopefully done with this suffering --- src/core/updateSelections/RangeUpdater.ts | 14 +++---- src/ide/vscode/VscodeEvents.ts | 42 ++++++++++++++++++++ src/ide/vscode/VscodeIDE.ts | 27 ++++++------- src/ide/vscode/VscodeRunMode.ts | 14 +++++++ src/ide/vscode/VscodeTextEditorImpl.ts | 9 +++-- src/ide/vscode/VscodeUtil.ts | 8 ++++ src/libs/common/ide/fake/FakeIDE.ts | 9 ++++- src/libs/common/ide/spy/SpyIDE.ts | 7 ++++ src/libs/common/ide/types/Events.ts | 47 +++++++++++++++++++++++ src/libs/common/ide/types/ide.types.ts | 10 +++++ src/typings/updateSelections.ts | 4 +- 11 files changed, 163 insertions(+), 28 deletions(-) create mode 100644 src/ide/vscode/VscodeEvents.ts create mode 100644 src/ide/vscode/VscodeRunMode.ts create mode 100644 src/libs/common/ide/types/Events.ts diff --git a/src/core/updateSelections/RangeUpdater.ts b/src/core/updateSelections/RangeUpdater.ts index 2fb22c0a52..0d28d6e364 100644 --- a/src/core/updateSelections/RangeUpdater.ts +++ b/src/core/updateSelections/RangeUpdater.ts @@ -1,12 +1,12 @@ import { pull } from "lodash"; -import { - workspace, +import type { TextDocumentChangeEvent, - Disposable, TextDocumentContentChangeEvent, -} from "vscode"; -import TextDocument from "../../libs/common/ide/types/TextDocument"; -import { Edit } from "../../typings/Types"; +} from "../../libs/common/ide/types/Events"; +import type { Disposable } from "../../libs/common/ide/types/ide.types"; +import type TextDocument from "../../libs/common/ide/types/TextDocument"; +import ide from "../../libs/cursorless-engine/singletons/ide.singleton"; +import type { Edit } from "../../typings/Types"; import { ExtendedTextDocumentChangeEvent, FullRangeInfo, @@ -90,7 +90,7 @@ export class RangeUpdater { } private listenForDocumentChanges() { - this.disposable = workspace.onDidChangeTextDocument( + this.disposable = ide().onDidChangeTextDocument( (event: TextDocumentChangeEvent) => { const documentReplaceEditLists = this.getDocumentReplaceEditLists( event.document, diff --git a/src/ide/vscode/VscodeEvents.ts b/src/ide/vscode/VscodeEvents.ts new file mode 100644 index 0000000000..73923575a0 --- /dev/null +++ b/src/ide/vscode/VscodeEvents.ts @@ -0,0 +1,42 @@ +import * as vscode from "vscode"; +import type { + TextDocumentChangeEvent, + TextDocumentChangeReason, + TextDocumentContentChangeEvent, +} from "../../libs/common/ide/types/Events"; +import type { Disposable } from "../../libs/common/ide/types/ide.types"; +import { fromVscodeDocument, fromVscodeRange } from "./VscodeUtil"; + +export function vscodeOnDidChangeTextDocument( + listener: (event: TextDocumentChangeEvent) => void, +): Disposable { + return vscode.workspace.onDidChangeTextDocument((e) => { + listener({ + document: fromVscodeDocument(e.document), + contentChanges: e.contentChanges.map(fromVscodeContentChange), + reason: fromVscodeReason(e.reason), + }); + }); +} + +function fromVscodeContentChange( + change: vscode.TextDocumentContentChangeEvent, +): TextDocumentContentChangeEvent { + return { + ...change, + range: fromVscodeRange(change.range), + }; +} + +function fromVscodeReason( + reason?: vscode.TextDocumentChangeReason, +): TextDocumentChangeReason | undefined { + switch (reason) { + case vscode.TextDocumentChangeReason.Redo: + return "redo"; + case vscode.TextDocumentChangeReason.Undo: + return "undo"; + default: + return undefined; + } +} diff --git a/src/ide/vscode/VscodeIDE.ts b/src/ide/vscode/VscodeIDE.ts index 4de2572ee7..e95967f96c 100644 --- a/src/ide/vscode/VscodeIDE.ts +++ b/src/ide/vscode/VscodeIDE.ts @@ -1,12 +1,7 @@ import { pull } from "lodash"; -import { - ExtensionContext, - ExtensionMode, - window, - workspace, - WorkspaceFolder, -} from "vscode"; -import { +import { ExtensionContext, window, workspace, WorkspaceFolder } from "vscode"; +import type { TextDocumentChangeEvent } from "../../libs/common/ide/types/Events"; +import type { Disposable, IDE, RunMode, @@ -18,16 +13,12 @@ import type { import VscodeClipboard from "./VscodeClipboard"; import VscodeConfiguration from "./VscodeConfiguration"; import VscodeEditableTextEditorImpl from "./VscodeEditableTextEditorImpl"; +import { vscodeOnDidChangeTextDocument } from "./VscodeEvents"; import VscodeGlobalState from "./VscodeGlobalState"; import VscodeMessages from "./VscodeMessages"; +import vscodeRunMode from "./VscodeRunMode"; import { fromVscodeEditor, toVscodeEditor } from "./VscodeUtil"; -const EXTENSION_MODE_MAP: Record = { - [ExtensionMode.Development]: "development", - [ExtensionMode.Production]: "production", - [ExtensionMode.Test]: "test", -}; - export default class VscodeIDE implements IDE { configuration: VscodeConfiguration; globalState: VscodeGlobalState; @@ -46,7 +37,7 @@ export default class VscodeIDE implements IDE { } get runMode(): RunMode { - return EXTENSION_MODE_MAP[this.extensionContext.extensionMode]; + return vscodeRunMode(this.extensionContext); } get workspaceFolders(): readonly WorkspaceFolder[] | undefined { @@ -73,6 +64,12 @@ export default class VscodeIDE implements IDE { return new VscodeEditableTextEditorImpl(toVscodeEditor(editor)); } + onDidChangeTextDocument( + listener: (event: TextDocumentChangeEvent) => void, + ): Disposable { + return vscodeOnDidChangeTextDocument(listener); + } + disposeOnExit(...disposables: Disposable[]): () => void { this.extensionContext.subscriptions.push(...disposables); diff --git a/src/ide/vscode/VscodeRunMode.ts b/src/ide/vscode/VscodeRunMode.ts new file mode 100644 index 0000000000..a279ce1baf --- /dev/null +++ b/src/ide/vscode/VscodeRunMode.ts @@ -0,0 +1,14 @@ +import { ExtensionContext, ExtensionMode } from "vscode"; +import type { RunMode } from "../../libs/common/ide/types/ide.types"; + +const EXTENSION_MODE_MAP: Record = { + [ExtensionMode.Development]: "development", + [ExtensionMode.Production]: "production", + [ExtensionMode.Test]: "test", +}; + +export default function vscodeRunMode( + extensionContext: ExtensionContext, +): RunMode { + return EXTENSION_MODE_MAP[extensionContext.extensionMode]; +} diff --git a/src/ide/vscode/VscodeTextEditorImpl.ts b/src/ide/vscode/VscodeTextEditorImpl.ts index d4c8e7b2a9..3dc374199f 100644 --- a/src/ide/vscode/VscodeTextEditorImpl.ts +++ b/src/ide/vscode/VscodeTextEditorImpl.ts @@ -5,8 +5,11 @@ import type Selection from "../../libs/common/ide/Selection"; import type TextDocument from "../../libs/common/ide/types/TextDocument"; import type { TextEditor } from "../../libs/common/ide/types/TextEditor"; import type { TextEditorOptions } from "../../libs/common/ide/types/TextEditorOptions"; -import VscodeTextDocumentImpl from "./VscodeTextDocumentImpl"; -import { fromVscodeRange, fromVscodeSelection } from "./VscodeUtil"; +import { + fromVscodeDocument, + fromVscodeRange, + fromVscodeSelection, +} from "./VscodeUtil"; export default class VscodeTextEditorImpl implements TextEditor { readonly id: string; @@ -14,7 +17,7 @@ export default class VscodeTextEditorImpl implements TextEditor { constructor(protected editor: vscode.TextEditor) { this.id = uuid(); - this.document = new VscodeTextDocumentImpl(editor.document); + this.document = fromVscodeDocument(editor.document); } get vscodeEditor(): vscode.TextEditor { diff --git a/src/ide/vscode/VscodeUtil.ts b/src/ide/vscode/VscodeUtil.ts index fe6a6ef504..68229bbe63 100644 --- a/src/ide/vscode/VscodeUtil.ts +++ b/src/ide/vscode/VscodeUtil.ts @@ -3,8 +3,10 @@ import Position from "../../libs/common/ide/Position"; import Range from "../../libs/common/ide/Range"; import Selection from "../../libs/common/ide/Selection"; import { EndOfLine } from "../../libs/common/ide/types/ide.types"; +import TextDocument from "../../libs/common/ide/types/TextDocument"; import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import TextLine from "../../libs/common/ide/types/TextLine"; +import VscodeTextDocumentImpl from "./VscodeTextDocumentImpl"; import VscodeTextEditorImpl from "./VscodeTextEditorImpl"; export function toVscodeRange(range: Range): vscode.Range { @@ -93,3 +95,9 @@ export function toVscodeEditor(editor: TextEditor): vscode.TextEditor { } throw Error("Can't get vscode editor from non vscode implementation"); } + +export function fromVscodeDocument( + document: vscode.TextDocument, +): TextDocument { + return new VscodeTextDocumentImpl(document); +} diff --git a/src/libs/common/ide/fake/FakeIDE.ts b/src/libs/common/ide/fake/FakeIDE.ts index eb64caee03..e0fdecaabe 100644 --- a/src/libs/common/ide/fake/FakeIDE.ts +++ b/src/libs/common/ide/fake/FakeIDE.ts @@ -1,11 +1,12 @@ import { pull } from "lodash"; +import type { TextDocumentChangeEvent } from "../types/Events"; import type { Disposable, IDE, RunMode, WorkspaceFolder, } from "../types/ide.types"; -import { EditableTextEditor, TextEditor } from "../types/TextEditor"; +import type { EditableTextEditor, TextEditor } from "../types/TextEditor"; import FakeClipboard from "./FakeClipboard"; import FakeConfiguration from "./FakeConfiguration"; import FakeGlobalState from "./FakeGlobalState"; @@ -45,6 +46,12 @@ export default class FakeIDE implements IDE { activeEditableTextEditor: EditableTextEditor | undefined = undefined; visibleTextEditors: TextEditor[] = []; + onDidChangeTextDocument( + _listener: (event: TextDocumentChangeEvent) => void, + ): Disposable { + throw Error("Not supported"); + } + public getEditableTextEditor(_editor: TextEditor): EditableTextEditor { throw Error("Not supported"); } diff --git a/src/libs/common/ide/spy/SpyIDE.ts b/src/libs/common/ide/spy/SpyIDE.ts index 8c9ecab980..fda59c4347 100644 --- a/src/libs/common/ide/spy/SpyIDE.ts +++ b/src/libs/common/ide/spy/SpyIDE.ts @@ -1,6 +1,7 @@ import { pickBy, values } from "lodash"; import type { Clipboard } from "../types/Clipboard"; import type { Configuration } from "../types/Configuration"; +import type { TextDocumentChangeEvent } from "../types/Events"; import type { Disposable, IDE, @@ -56,6 +57,12 @@ export default class SpyIDE implements IDE { return this.original.getEditableTextEditor(editor); } + onDidChangeTextDocument( + listener: (event: TextDocumentChangeEvent) => void, + ): Disposable { + return this.original.onDidChangeTextDocument(listener); + } + disposeOnExit(...disposables: Disposable[]): () => void { return this.original.disposeOnExit(...disposables); } diff --git a/src/libs/common/ide/types/Events.ts b/src/libs/common/ide/types/Events.ts new file mode 100644 index 0000000000..02ab9dd9e3 --- /dev/null +++ b/src/libs/common/ide/types/Events.ts @@ -0,0 +1,47 @@ +import type Range from "../Range"; +import type TextDocument from "./TextDocument"; + +/** + * An event describing a transactional {@link TextDocument document} change. + */ +export interface TextDocumentChangeEvent { + /** + * The affected document. + */ + readonly document: TextDocument; + + /** + * An array of content changes. + */ + readonly contentChanges: readonly TextDocumentContentChangeEvent[]; + + /** + * The reason why the document was changed. + * Is undefined if the reason is not known. + */ + readonly reason?: TextDocumentChangeReason; +} + +/** + * An event describing an individual change in the text of a {@link TextDocument document}. + */ +export interface TextDocumentContentChangeEvent { + /** + * The range that got replaced. + */ + readonly range: Range; + /** + * The offset of the range that got replaced. + */ + readonly rangeOffset: number; + /** + * The length of the range that got replaced. + */ + readonly rangeLength: number; + /** + * The new text for the range. + */ + readonly text: string; +} + +export type TextDocumentChangeReason = "undo" | "redo"; diff --git a/src/libs/common/ide/types/ide.types.ts b/src/libs/common/ide/types/ide.types.ts index 6e72822798..07c3225f59 100644 --- a/src/libs/common/ide/types/ide.types.ts +++ b/src/libs/common/ide/types/ide.types.ts @@ -1,6 +1,7 @@ import { URI } from "vscode-uri"; import { Clipboard } from "./Clipboard"; import { Configuration } from "./Configuration"; +import { TextDocumentChangeEvent } from "./Events"; import { Messages } from "./Messages"; import { State } from "./State"; import type { EditableTextEditor, TextEditor } from "./TextEditor"; @@ -59,6 +60,15 @@ export interface IDE { * @param editor A editable text editor */ getEditableTextEditor(editor: TextEditor): EditableTextEditor; + + /** + * An event that is emitted when a {@link TextDocument text document} is changed. This usually happens + * when the {@link TextDocument.getText contents} changes but also when other things like the + * {@link TextDocument.isDirty dirty}-state changes. + */ + onDidChangeTextDocument( + listener: (event: TextDocumentChangeEvent) => void, + ): Disposable; } export interface WorkspaceFolder { diff --git a/src/typings/updateSelections.ts b/src/typings/updateSelections.ts index 283318b647..1cc5600f38 100644 --- a/src/typings/updateSelections.ts +++ b/src/typings/updateSelections.ts @@ -1,8 +1,8 @@ +import type Range from "../libs/common/ide/Range"; import type { TextDocumentChangeEvent, TextDocumentContentChangeEvent, -} from "vscode"; -import type Range from "../libs/common/ide/Range"; +} from "../libs/common/ide/types/Events"; export interface RangeOffsets { start: number; From 2c84c0b70bbe28414f82269de005390c0086dbb7 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 13 Nov 2022 15:29:34 +0100 Subject: [PATCH 15/84] Fixed circular dependencies --- src/actions/BringMoveSwap.ts | 2 +- src/actions/Deselect.ts | 2 +- src/actions/EditNew/EditNew.types.ts | 2 +- src/actions/EditNew/runEditTargets.ts | 2 +- src/actions/EditNew/runNotebookCellTargets.ts | 2 +- src/actions/GenerateSnippet/GenerateSnippet.ts | 2 +- src/actions/InsertCopy.ts | 2 +- src/actions/InsertEmptyLines.ts | 4 ++-- src/actions/SetSelection.ts | 2 +- src/actions/Wrap.ts | 2 +- src/apps/cursorless-vscode/getMatchesInRange.ts | 2 +- src/core/editStyles.ts | 2 +- src/core/updateSelections/updateSelections.ts | 4 ++-- src/ide/vscode/VscodeEditableTextEditorImpl.ts | 4 ++-- src/ide/vscode/VscodeTextDocumentImpl.ts | 2 +- src/ide/vscode/VscodeTextEditorImpl.ts | 4 ++-- src/ide/vscode/VscodeUtil.ts | 4 ++-- src/languages/getTextFragmentExtractor.ts | 2 +- src/languages/latex.ts | 4 ++-- src/languages/markdown.ts | 4 ++-- src/languages/php.ts | 2 +- src/languages/python.ts | 2 +- src/libs/common/ide/Location.ts | 2 +- src/libs/common/ide/Range.ts | 3 +-- src/libs/common/ide/Selection.ts | 3 +-- src/libs/common/ide/index.ts | 3 +++ src/libs/common/ide/types/Events.ts | 2 +- src/libs/common/ide/types/TextDocument.ts | 2 +- src/libs/common/ide/types/TextEditor.ts | 4 ++-- src/libs/common/ide/types/TextEditorEdit.ts | 4 ++-- src/libs/common/ide/types/TextLine.ts | 2 +- src/libs/vscode-common/testUtil/toPlainObject.ts | 4 ++-- src/processTargets/modifiers/EveryScopeStage.ts | 2 +- src/processTargets/modifiers/HeadTailStage.ts | 2 +- src/processTargets/modifiers/ItemStage/ItemStage.ts | 2 +- src/processTargets/modifiers/ItemStage/getIterationScope.ts | 2 +- src/processTargets/modifiers/ItemStage/tokenizeRange.ts | 2 +- src/processTargets/modifiers/RelativeInclusiveScopeStage.ts | 2 +- src/processTargets/modifiers/relativeScopeLegacy.ts | 2 +- .../modifiers/scopeHandlers/BaseScopeHandler.ts | 2 +- .../modifiers/scopeHandlers/LineScopeHandler.ts | 2 +- .../modifiers/scopeHandlers/ParagraphScopeHandler.ts | 2 +- .../modifiers/scopeHandlers/WordScopeHandler.ts | 2 +- .../modifiers/scopeHandlers/compareTargetScopes.ts | 2 +- .../modifiers/scopeHandlers/getScopesOverlappingRange.ts | 2 +- src/processTargets/modifiers/scopeHandlers/scope.types.ts | 2 +- .../modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts | 2 +- src/processTargets/modifiers/scopeTypeStages/RegexStage.ts | 2 +- .../extractSelectionFromSurroundingPairOffsets.ts | 4 ++-- .../surroundingPair/findSurroundingPairParseTreeBased.ts | 2 +- .../modifiers/surroundingPair/findSurroundingPairTextBased.ts | 2 +- src/processTargets/modifiers/surroundingPair/index.ts | 4 ++-- src/processTargets/modifiers/toPositionTarget.ts | 2 +- src/processTargets/processTargets.ts | 2 +- src/processTargets/targetUtil/createContinuousRange.ts | 2 +- .../DelimitedSequenceInsertionRemovalBehavior.ts | 2 +- .../TokenInsertionRemovalBehavior.ts | 2 +- .../insertionRemovalBehavior.types.ts | 2 +- src/processTargets/targets/BaseTarget.ts | 4 ++-- src/processTargets/targets/DocumentTarget.ts | 2 +- src/processTargets/targets/InteriorTarget.ts | 2 +- src/processTargets/targets/LineTarget.ts | 2 +- src/processTargets/targets/ParagraphTarget.ts | 2 +- src/processTargets/targets/PositionTarget.ts | 2 +- src/processTargets/targets/ScopeTypeTarget.ts | 2 +- src/processTargets/targets/SubTokenWordTarget.ts | 2 +- src/processTargets/targets/SurroundingPairTarget.ts | 2 +- src/processTargets/targets/TokenTarget.ts | 2 +- src/processTargets/targets/UntypedTarget.ts | 2 +- src/testUtil/fromPlainObject.ts | 4 ++-- src/typings/Types.ts | 4 ++-- src/typings/target.types.ts | 4 ++-- src/typings/updateSelections.ts | 2 +- src/util/addDecorationsToEditor.ts | 2 +- src/util/getTokensInRange.ts | 2 +- src/util/nodeFinders.ts | 2 +- src/util/nodeSelectors.ts | 4 ++-- src/util/rangeUtils.ts | 2 +- src/util/selectionUtils.ts | 4 ++-- src/util/setSelectionsAndFocusEditor.ts | 2 +- src/util/targetUtils.ts | 4 ++-- src/util/tryConstructTarget.ts | 2 +- 82 files changed, 103 insertions(+), 102 deletions(-) create mode 100644 src/libs/common/ide/index.ts diff --git a/src/actions/BringMoveSwap.ts b/src/actions/BringMoveSwap.ts index 7a26ffdd7c..c8fc360ad0 100644 --- a/src/actions/BringMoveSwap.ts +++ b/src/actions/BringMoveSwap.ts @@ -4,7 +4,7 @@ import { getSelectionInfo, performEditsAndUpdateFullSelectionInfos, } from "../core/updateSelections/updateSelections"; -import Selection from "../libs/common/ide/Selection"; +import { Selection } from "../libs/common/ide"; import { TextEditor } from "../libs/common/ide/types/TextEditor"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Target } from "../typings/target.types"; diff --git a/src/actions/Deselect.ts b/src/actions/Deselect.ts index 183701d201..ee4f25348c 100644 --- a/src/actions/Deselect.ts +++ b/src/actions/Deselect.ts @@ -1,4 +1,4 @@ -import Selection from "../libs/common/ide/Selection"; +import { Selection } from "../libs/common/ide"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; diff --git a/src/actions/EditNew/EditNew.types.ts b/src/actions/EditNew/EditNew.types.ts index a625359027..e18f1363c0 100644 --- a/src/actions/EditNew/EditNew.types.ts +++ b/src/actions/EditNew/EditNew.types.ts @@ -1,4 +1,4 @@ -import type Range from "../../libs/common/ide/Range"; +import type { Range } from "../../libs/common/ide"; import type { Target } from "../../typings/target.types"; /** diff --git a/src/actions/EditNew/runEditTargets.ts b/src/actions/EditNew/runEditTargets.ts index ec709b0e38..75a8276928 100644 --- a/src/actions/EditNew/runEditTargets.ts +++ b/src/actions/EditNew/runEditTargets.ts @@ -1,7 +1,7 @@ import { zip } from "lodash"; import { DecorationRangeBehavior } from "vscode"; import { performEditsAndUpdateSelectionsWithBehavior } from "../../core/updateSelections/updateSelections"; -import Selection from "../../libs/common/ide/Selection"; +import { Selection } from "../../libs/common/ide"; import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import { Graph } from "../../typings/Types"; import { EditTarget, State } from "./EditNew.types"; diff --git a/src/actions/EditNew/runNotebookCellTargets.ts b/src/actions/EditNew/runNotebookCellTargets.ts index 8279229629..ab9651190e 100644 --- a/src/actions/EditNew/runNotebookCellTargets.ts +++ b/src/actions/EditNew/runNotebookCellTargets.ts @@ -1,5 +1,5 @@ import { commands } from "vscode"; -import Selection from "../../libs/common/ide/Selection"; +import { Selection } from "../../libs/common/ide"; import { NotebookCellPositionTarget } from "../../processTargets/targets"; import { Target } from "../../typings/target.types"; import { Graph } from "../../typings/Types"; diff --git a/src/actions/GenerateSnippet/GenerateSnippet.ts b/src/actions/GenerateSnippet/GenerateSnippet.ts index 54b7bf3c63..07d8baef62 100644 --- a/src/actions/GenerateSnippet/GenerateSnippet.ts +++ b/src/actions/GenerateSnippet/GenerateSnippet.ts @@ -1,5 +1,5 @@ import { commands, window } from "vscode"; -import Range from "../../libs/common/ide/Range"; +import { Range } from "../../libs/common/ide"; import ide from "../../libs/cursorless-engine/singletons/ide.singleton"; import { Offsets } from "../../processTargets/modifiers/surroundingPair/types"; import isTesting from "../../testUtil/isTesting"; diff --git a/src/actions/InsertCopy.ts b/src/actions/InsertCopy.ts index 1126f05e20..9b4a45955b 100644 --- a/src/actions/InsertCopy.ts +++ b/src/actions/InsertCopy.ts @@ -1,7 +1,7 @@ import { flatten, zip } from "lodash"; import { DecorationRangeBehavior } from "vscode"; import { performEditsAndUpdateSelectionsWithBehavior } from "../core/updateSelections/updateSelections"; -import Selection from "../libs/common/ide/Selection"; +import { Selection } from "../libs/common/ide"; import { TextEditor } from "../libs/common/ide/types/TextEditor"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { containingLineIfUntypedStage } from "../processTargets/modifiers/commonContainingScopeIfUntypedStages"; diff --git a/src/actions/InsertEmptyLines.ts b/src/actions/InsertEmptyLines.ts index e957bb14f2..048e57c6e3 100644 --- a/src/actions/InsertEmptyLines.ts +++ b/src/actions/InsertEmptyLines.ts @@ -1,7 +1,7 @@ import { flatten } from "lodash"; import { performEditsAndUpdateSelections } from "../core/updateSelections/updateSelections"; -import Range from "../libs/common/ide/Range"; -import Selection from "../libs/common/ide/Selection"; +import { Range } from "../libs/common/ide"; +import { Selection } from "../libs/common/ide"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; diff --git a/src/actions/SetSelection.ts b/src/actions/SetSelection.ts index f43f8eafbc..f638db92c3 100644 --- a/src/actions/SetSelection.ts +++ b/src/actions/SetSelection.ts @@ -1,4 +1,4 @@ -import Selection from "../libs/common/ide/Selection"; +import { Selection } from "../libs/common/ide"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; diff --git a/src/actions/Wrap.ts b/src/actions/Wrap.ts index fda455c8f0..10a4387110 100644 --- a/src/actions/Wrap.ts +++ b/src/actions/Wrap.ts @@ -3,7 +3,7 @@ import { getSelectionInfo, performEditsAndUpdateFullSelectionInfos, } from "../core/updateSelections/updateSelections"; -import Selection from "../libs/common/ide/Selection"; +import { Selection } from "../libs/common/ide"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Target } from "../typings/target.types"; import { Edit, Graph } from "../typings/Types"; diff --git a/src/apps/cursorless-vscode/getMatchesInRange.ts b/src/apps/cursorless-vscode/getMatchesInRange.ts index 2d9f81c3ea..e2035c8266 100644 --- a/src/apps/cursorless-vscode/getMatchesInRange.ts +++ b/src/apps/cursorless-vscode/getMatchesInRange.ts @@ -2,7 +2,7 @@ import { imap } from "itertools"; import { Direction } from "../../typings/targetDescriptor.types"; import { matchAll } from "../../libs/cursorless-engine/util/regex"; import { TextEditor } from "../../libs/common/ide/types/TextEditor"; -import Range from "../../libs/common/ide/Range"; +import { Range } from "../../libs/common/ide"; export function getMatchesInRange( regex: RegExp, diff --git a/src/core/editStyles.ts b/src/core/editStyles.ts index e88cc70450..c2d9ca71b2 100644 --- a/src/core/editStyles.ts +++ b/src/core/editStyles.ts @@ -7,7 +7,7 @@ import { workspace, } from "vscode"; import Position from "../libs/common/ide/Position"; -import Range from "../libs/common/ide/Range"; +import { Range } from "../libs/common/ide"; import { EditableTextEditor } from "../libs/common/ide/types/TextEditor"; import sleep from "../libs/common/util/sleep"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; diff --git a/src/core/updateSelections/updateSelections.ts b/src/core/updateSelections/updateSelections.ts index 5827d02844..a63ceaa235 100644 --- a/src/core/updateSelections/updateSelections.ts +++ b/src/core/updateSelections/updateSelections.ts @@ -1,7 +1,7 @@ import { flatten } from "lodash"; import { DecorationRangeBehavior } from "vscode"; -import Range from "../../libs/common/ide/Range"; -import Selection from "../../libs/common/ide/Selection"; +import { Range } from "../../libs/common/ide"; +import { Selection } from "../../libs/common/ide"; import TextDocument from "../../libs/common/ide/types/TextDocument"; import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import { Edit } from "../../typings/Types"; diff --git a/src/ide/vscode/VscodeEditableTextEditorImpl.ts b/src/ide/vscode/VscodeEditableTextEditorImpl.ts index 8b22923ac2..3dfe6a2ad3 100644 --- a/src/ide/vscode/VscodeEditableTextEditorImpl.ts +++ b/src/ide/vscode/VscodeEditableTextEditorImpl.ts @@ -1,7 +1,7 @@ import * as vscode from "vscode"; import type Position from "../../libs/common/ide/Position"; -import type Range from "../../libs/common/ide/Range"; -import type Selection from "../../libs/common/ide/Selection"; +import type { Range } from "../../libs/common/ide"; +import type { Selection } from "../../libs/common/ide"; import type { EditableTextEditor } from "../../libs/common/ide/types/TextEditor"; import type { TextEditorDecorationType } from "../../libs/common/ide/types/TextEditorDecorationType"; import type TextEditorEdit from "../../libs/common/ide/types/TextEditorEdit"; diff --git a/src/ide/vscode/VscodeTextDocumentImpl.ts b/src/ide/vscode/VscodeTextDocumentImpl.ts index b036c081bb..9cf412440b 100644 --- a/src/ide/vscode/VscodeTextDocumentImpl.ts +++ b/src/ide/vscode/VscodeTextDocumentImpl.ts @@ -1,7 +1,7 @@ import * as vscode from "vscode"; import type { URI } from "vscode-uri"; import Position from "../../libs/common/ide/Position"; -import Range from "../../libs/common/ide/Range"; +import { Range } from "../../libs/common/ide"; import TextDocument from "../../libs/common/ide/types/TextDocument"; import TextLine from "../../libs/common/ide/types/TextLine"; import { diff --git a/src/ide/vscode/VscodeTextEditorImpl.ts b/src/ide/vscode/VscodeTextEditorImpl.ts index 3dc374199f..a6d077bc36 100644 --- a/src/ide/vscode/VscodeTextEditorImpl.ts +++ b/src/ide/vscode/VscodeTextEditorImpl.ts @@ -1,7 +1,7 @@ import { v4 as uuid } from "uuid"; import * as vscode from "vscode"; -import type Range from "../../libs/common/ide/Range"; -import type Selection from "../../libs/common/ide/Selection"; +import type { Range } from "../../libs/common/ide"; +import type { Selection } from "../../libs/common/ide"; import type TextDocument from "../../libs/common/ide/types/TextDocument"; import type { TextEditor } from "../../libs/common/ide/types/TextEditor"; import type { TextEditorOptions } from "../../libs/common/ide/types/TextEditorOptions"; diff --git a/src/ide/vscode/VscodeUtil.ts b/src/ide/vscode/VscodeUtil.ts index 68229bbe63..8b5881476d 100644 --- a/src/ide/vscode/VscodeUtil.ts +++ b/src/ide/vscode/VscodeUtil.ts @@ -1,7 +1,7 @@ import * as vscode from "vscode"; import Position from "../../libs/common/ide/Position"; -import Range from "../../libs/common/ide/Range"; -import Selection from "../../libs/common/ide/Selection"; +import { Range } from "../../libs/common/ide"; +import { Selection } from "../../libs/common/ide"; import { EndOfLine } from "../../libs/common/ide/types/ide.types"; import TextDocument from "../../libs/common/ide/types/TextDocument"; import { TextEditor } from "../../libs/common/ide/types/TextEditor"; diff --git a/src/languages/getTextFragmentExtractor.ts b/src/languages/getTextFragmentExtractor.ts index 764f150a4e..16e43fee5a 100644 --- a/src/languages/getTextFragmentExtractor.ts +++ b/src/languages/getTextFragmentExtractor.ts @@ -11,7 +11,7 @@ import { SupportedLanguageId } from "../libs/cursorless-engine/languages/constan import { getNodeInternalRange, getNodeRange } from "../util/nodeSelectors"; import { getNodeMatcher } from "./getNodeMatcher"; import { notSupported } from "../util/nodeMatchers"; -import Range from "../libs/common/ide/Range"; +import { Range } from "../libs/common/ide"; export type TextFragmentExtractor = ( node: SyntaxNode, diff --git a/src/languages/latex.ts b/src/languages/latex.ts index f125ef8b07..c493efd03b 100644 --- a/src/languages/latex.ts +++ b/src/languages/latex.ts @@ -1,6 +1,6 @@ import { SyntaxNode } from "web-tree-sitter"; -import Range from "../libs/common/ide/Range"; -import Selection from "../libs/common/ide/Selection"; +import { Range } from "../libs/common/ide"; +import { Selection } from "../libs/common/ide"; import { TextEditor } from "../libs/common/ide/types/TextEditor"; import { SimpleScopeTypeType } from "../typings/targetDescriptor.types"; import { NodeMatcherAlternative, SelectionWithContext } from "../typings/Types"; diff --git a/src/languages/markdown.ts b/src/languages/markdown.ts index ea9364514c..5050a38112 100644 --- a/src/languages/markdown.ts +++ b/src/languages/markdown.ts @@ -13,9 +13,9 @@ import { selectWithLeadingDelimiter, } from "../util/nodeSelectors"; import { getMatchesInRange } from "../apps/cursorless-vscode/getMatchesInRange"; -import Selection from "../libs/common/ide/Selection"; +import { Selection } from "../libs/common/ide"; import { TextEditor } from "../libs/common/ide/types/TextEditor"; -import Range from "../libs/common/ide/Range"; +import { Range } from "../libs/common/ide"; import { shrinkRangeToFitContent } from "../util/selectionUtils"; /** diff --git a/src/languages/php.ts b/src/languages/php.ts index d1ca12be21..1e404b0eaa 100644 --- a/src/languages/php.ts +++ b/src/languages/php.ts @@ -16,7 +16,7 @@ import { } from "../util/nodeMatchers"; import { getNodeRange } from "../util/nodeSelectors"; import { TextEditor } from "../libs/common/ide/types/TextEditor"; -import Selection from "../libs/common/ide/Selection"; +import { Selection } from "../libs/common/ide"; // Generated by the following command: // > curl https://raw.githubusercontent.com/tree-sitter/tree-sitter-php/0ce134234214427b6aeb2735e93a307881c6cd6f/src/node-types.json \ diff --git a/src/languages/python.ts b/src/languages/python.ts index 4610b29dd5..a7fcaa80ec 100644 --- a/src/languages/python.ts +++ b/src/languages/python.ts @@ -1,5 +1,5 @@ import { SyntaxNode } from "web-tree-sitter"; -import Selection from "../libs/common/ide/Selection"; +import { Selection } from "../libs/common/ide"; import { SimpleScopeTypeType } from "../typings/targetDescriptor.types"; import { NodeFinder, NodeMatcherAlternative } from "../typings/Types"; import { argumentNodeFinder, patternFinder } from "../util/nodeFinders"; diff --git a/src/libs/common/ide/Location.ts b/src/libs/common/ide/Location.ts index e5ddb1ac59..4845d73a28 100644 --- a/src/libs/common/ide/Location.ts +++ b/src/libs/common/ide/Location.ts @@ -1,6 +1,6 @@ import type { URI } from "vscode-uri"; import type Position from "./Position"; -import Range from "./Range"; +import { Range } from "."; /** * Represents a location inside a resource, such as a line diff --git a/src/libs/common/ide/Range.ts b/src/libs/common/ide/Range.ts index f32256083d..a0224b56d1 100644 --- a/src/libs/common/ide/Range.ts +++ b/src/libs/common/ide/Range.ts @@ -1,5 +1,4 @@ -import Position from "./Position"; -import Selection from "./Selection"; +import { Position, Selection } from "."; export default class Range { /** diff --git a/src/libs/common/ide/Selection.ts b/src/libs/common/ide/Selection.ts index b5a3b4271b..776c4c1453 100644 --- a/src/libs/common/ide/Selection.ts +++ b/src/libs/common/ide/Selection.ts @@ -1,5 +1,4 @@ -import Position from "./Position"; -import Range from "./Range"; +import { Position, Range } from "."; export default class Selection extends Range { /** diff --git a/src/libs/common/ide/index.ts b/src/libs/common/ide/index.ts new file mode 100644 index 0000000000..411b5a0aac --- /dev/null +++ b/src/libs/common/ide/index.ts @@ -0,0 +1,3 @@ +export { default as Position } from "./Position"; +export { default as Range } from "./Range"; +export { default as Selection } from "./Selection"; diff --git a/src/libs/common/ide/types/Events.ts b/src/libs/common/ide/types/Events.ts index 02ab9dd9e3..2249c3307f 100644 --- a/src/libs/common/ide/types/Events.ts +++ b/src/libs/common/ide/types/Events.ts @@ -1,4 +1,4 @@ -import type Range from "../Range"; +import type { Range } from ".."; import type TextDocument from "./TextDocument"; /** diff --git a/src/libs/common/ide/types/TextDocument.ts b/src/libs/common/ide/types/TextDocument.ts index 79d608a887..0ce560fb7f 100644 --- a/src/libs/common/ide/types/TextDocument.ts +++ b/src/libs/common/ide/types/TextDocument.ts @@ -1,6 +1,6 @@ import type { URI } from "vscode-uri"; import type Position from "../Position"; -import type Range from "../Range"; +import type { Range } from ".."; import type TextLine from "./TextLine"; export default interface TextDocument { diff --git a/src/libs/common/ide/types/TextEditor.ts b/src/libs/common/ide/types/TextEditor.ts index 2b60e034fb..44c6cef6c5 100644 --- a/src/libs/common/ide/types/TextEditor.ts +++ b/src/libs/common/ide/types/TextEditor.ts @@ -1,6 +1,6 @@ import type Position from "../Position"; -import type Range from "../Range"; -import type Selection from "../Selection"; +import type { Range } from ".."; +import type { Selection } from ".."; import type TextDocument from "./TextDocument"; import type { TextEditorDecorationType } from "./TextEditorDecorationType"; import type TextEditorEdit from "./TextEditorEdit"; diff --git a/src/libs/common/ide/types/TextEditorEdit.ts b/src/libs/common/ide/types/TextEditorEdit.ts index 75b016afee..8e7be1763e 100644 --- a/src/libs/common/ide/types/TextEditorEdit.ts +++ b/src/libs/common/ide/types/TextEditorEdit.ts @@ -1,6 +1,6 @@ import type Position from "../Position"; -import type Range from "../Range"; -import type Selection from "../Selection"; +import type { Range } from ".."; +import type { Selection } from ".."; import type { EndOfLine } from "./ide.types"; /** diff --git a/src/libs/common/ide/types/TextLine.ts b/src/libs/common/ide/types/TextLine.ts index 3b230d9f36..d78969821c 100644 --- a/src/libs/common/ide/types/TextLine.ts +++ b/src/libs/common/ide/types/TextLine.ts @@ -1,4 +1,4 @@ -import type Range from "../Range"; +import type { Range } from ".."; /** * Represents a line of text, such as a line of source code. diff --git a/src/libs/vscode-common/testUtil/toPlainObject.ts b/src/libs/vscode-common/testUtil/toPlainObject.ts index 419240f67f..b3fa62668f 100644 --- a/src/libs/vscode-common/testUtil/toPlainObject.ts +++ b/src/libs/vscode-common/testUtil/toPlainObject.ts @@ -2,8 +2,8 @@ import type { TestDecoration } from "../../../core/editStyles"; import type { Target } from "../../../typings/target.types"; import type { Token } from "../../../typings/Types"; import type Position from "../../common/ide/Position"; -import type Range from "../../common/ide/Range"; -import type Selection from "../../common/ide/Selection"; +import type { Range } from "../../common/ide"; +import type { Selection } from "../../common/ide"; export type PositionPlainObject = { line: number; diff --git a/src/processTargets/modifiers/EveryScopeStage.ts b/src/processTargets/modifiers/EveryScopeStage.ts index 7884fc6d2d..0194d5dd28 100644 --- a/src/processTargets/modifiers/EveryScopeStage.ts +++ b/src/processTargets/modifiers/EveryScopeStage.ts @@ -1,5 +1,5 @@ import { NoContainingScopeError } from "../../errors"; -import Range from "../../libs/common/ide/Range"; +import { Range } from "../../libs/common/ide"; import type { Target } from "../../typings/target.types"; import type { EveryScopeModifier } from "../../typings/targetDescriptor.types"; import type { ProcessedTargetsContext } from "../../typings/Types"; diff --git a/src/processTargets/modifiers/HeadTailStage.ts b/src/processTargets/modifiers/HeadTailStage.ts index fb7f3b4895..5674fbfcb0 100644 --- a/src/processTargets/modifiers/HeadTailStage.ts +++ b/src/processTargets/modifiers/HeadTailStage.ts @@ -1,4 +1,4 @@ -import Range from "../../libs/common/ide/Range"; +import { Range } from "../../libs/common/ide"; import { Target } from "../../typings/target.types"; import { HeadTailModifier, diff --git a/src/processTargets/modifiers/ItemStage/ItemStage.ts b/src/processTargets/modifiers/ItemStage/ItemStage.ts index 3090c53f55..2ac50d04ab 100644 --- a/src/processTargets/modifiers/ItemStage/ItemStage.ts +++ b/src/processTargets/modifiers/ItemStage/ItemStage.ts @@ -1,5 +1,5 @@ import { NoContainingScopeError } from "../../../errors"; -import Range from "../../../libs/common/ide/Range"; +import { Range } from "../../../libs/common/ide"; import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { Target } from "../../../typings/target.types"; import { diff --git a/src/processTargets/modifiers/ItemStage/getIterationScope.ts b/src/processTargets/modifiers/ItemStage/getIterationScope.ts index b2e4c32fa5..4c8b078271 100644 --- a/src/processTargets/modifiers/ItemStage/getIterationScope.ts +++ b/src/processTargets/modifiers/ItemStage/getIterationScope.ts @@ -1,4 +1,4 @@ -import Range from "../../../libs/common/ide/Range"; +import { Range } from "../../../libs/common/ide"; import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { Target } from "../../../typings/target.types"; import { ProcessedTargetsContext } from "../../../typings/Types"; diff --git a/src/processTargets/modifiers/ItemStage/tokenizeRange.ts b/src/processTargets/modifiers/ItemStage/tokenizeRange.ts index 1b4775a046..ed73129229 100644 --- a/src/processTargets/modifiers/ItemStage/tokenizeRange.ts +++ b/src/processTargets/modifiers/ItemStage/tokenizeRange.ts @@ -1,4 +1,4 @@ -import Range from "../../../libs/common/ide/Range"; +import { Range } from "../../../libs/common/ide"; import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; /** diff --git a/src/processTargets/modifiers/RelativeInclusiveScopeStage.ts b/src/processTargets/modifiers/RelativeInclusiveScopeStage.ts index 642ba2e465..66397caa3b 100644 --- a/src/processTargets/modifiers/RelativeInclusiveScopeStage.ts +++ b/src/processTargets/modifiers/RelativeInclusiveScopeStage.ts @@ -1,5 +1,5 @@ import { NoContainingScopeError } from "../../errors"; -import Range from "../../libs/common/ide/Range"; +import { Range } from "../../libs/common/ide"; import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import type { Target } from "../../typings/target.types"; import type { diff --git a/src/processTargets/modifiers/relativeScopeLegacy.ts b/src/processTargets/modifiers/relativeScopeLegacy.ts index a465ee02f6..9874b5e76d 100644 --- a/src/processTargets/modifiers/relativeScopeLegacy.ts +++ b/src/processTargets/modifiers/relativeScopeLegacy.ts @@ -1,5 +1,5 @@ import { findLastIndex } from "lodash"; -import Range from "../../libs/common/ide/Range"; +import { Range } from "../../libs/common/ide"; import { Target } from "../../typings/target.types"; import { RelativeScopeModifier } from "../../typings/targetDescriptor.types"; import { ProcessedTargetsContext } from "../../typings/Types"; diff --git a/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.ts b/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.ts index 68a806e454..3e7e94c810 100644 --- a/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.ts +++ b/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.ts @@ -1,6 +1,6 @@ import Position from "../../../libs/common/ide/Position"; // eslint-disable-next-line @typescript-eslint/no-unused-vars -import type Range from "../../../libs/common/ide/Range"; +import type { Range } from "../../../libs/common/ide"; import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import type { Direction, diff --git a/src/processTargets/modifiers/scopeHandlers/LineScopeHandler.ts b/src/processTargets/modifiers/scopeHandlers/LineScopeHandler.ts index f7a24a40a0..96cf820b5b 100644 --- a/src/processTargets/modifiers/scopeHandlers/LineScopeHandler.ts +++ b/src/processTargets/modifiers/scopeHandlers/LineScopeHandler.ts @@ -1,5 +1,5 @@ import Position from "../../../libs/common/ide/Position"; -import Range from "../../../libs/common/ide/Range"; +import { Range } from "../../../libs/common/ide"; import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { Direction, ScopeType } from "../../../typings/targetDescriptor.types"; import { LineTarget } from "../../targets"; diff --git a/src/processTargets/modifiers/scopeHandlers/ParagraphScopeHandler.ts b/src/processTargets/modifiers/scopeHandlers/ParagraphScopeHandler.ts index 774f077b74..fe5e0cb40c 100644 --- a/src/processTargets/modifiers/scopeHandlers/ParagraphScopeHandler.ts +++ b/src/processTargets/modifiers/scopeHandlers/ParagraphScopeHandler.ts @@ -1,5 +1,5 @@ import Position from "../../../libs/common/ide/Position"; -import Range from "../../../libs/common/ide/Range"; +import { Range } from "../../../libs/common/ide"; import TextDocument from "../../../libs/common/ide/types/TextDocument"; import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import TextLine from "../../../libs/common/ide/types/TextLine"; diff --git a/src/processTargets/modifiers/scopeHandlers/WordScopeHandler.ts b/src/processTargets/modifiers/scopeHandlers/WordScopeHandler.ts index 3f53a29e7f..c403afea03 100644 --- a/src/processTargets/modifiers/scopeHandlers/WordScopeHandler.ts +++ b/src/processTargets/modifiers/scopeHandlers/WordScopeHandler.ts @@ -3,7 +3,7 @@ import { Direction } from "../../../typings/targetDescriptor.types"; import { SubTokenWordTarget } from "../../targets"; import type { TargetScope } from "./scope.types"; import WordTokenizer from "../../../libs/cursorless-engine/scopeHandlers/WordScopeHandler/WordTokenizer"; -import Range from "../../../libs/common/ide/Range"; +import { Range } from "../../../libs/common/ide"; import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; export default class WordScopeHandler extends NestedScopeHandler { diff --git a/src/processTargets/modifiers/scopeHandlers/compareTargetScopes.ts b/src/processTargets/modifiers/scopeHandlers/compareTargetScopes.ts index 912cb92c9f..9929fe95a4 100644 --- a/src/processTargets/modifiers/scopeHandlers/compareTargetScopes.ts +++ b/src/processTargets/modifiers/scopeHandlers/compareTargetScopes.ts @@ -1,5 +1,5 @@ import Position from "../../../libs/common/ide/Position"; -import Range from "../../../libs/common/ide/Range"; +import { Range } from "../../../libs/common/ide"; import { Direction } from "../../../typings/targetDescriptor.types"; import { TargetScope } from "./scope.types"; diff --git a/src/processTargets/modifiers/scopeHandlers/getScopesOverlappingRange.ts b/src/processTargets/modifiers/scopeHandlers/getScopesOverlappingRange.ts index 84d280c88e..b3bb9a2468 100644 --- a/src/processTargets/modifiers/scopeHandlers/getScopesOverlappingRange.ts +++ b/src/processTargets/modifiers/scopeHandlers/getScopesOverlappingRange.ts @@ -1,4 +1,4 @@ -import Range from "../../../libs/common/ide/Range"; +import { Range } from "../../../libs/common/ide"; import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { TargetScope } from "./scope.types"; import { ScopeHandler } from "./scopeHandler.types"; diff --git a/src/processTargets/modifiers/scopeHandlers/scope.types.ts b/src/processTargets/modifiers/scopeHandlers/scope.types.ts index d1ff358d1b..3014e4b8a5 100644 --- a/src/processTargets/modifiers/scopeHandlers/scope.types.ts +++ b/src/processTargets/modifiers/scopeHandlers/scope.types.ts @@ -1,4 +1,4 @@ -import Range from "../../../libs/common/ide/Range"; +import { Range } from "../../../libs/common/ide"; import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import type { Target } from "../../../typings/target.types"; diff --git a/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts b/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts index 6c2bd6e93f..a6137db539 100644 --- a/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts +++ b/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts @@ -2,7 +2,7 @@ import type { SyntaxNode } from "web-tree-sitter"; import { NoContainingScopeError } from "../../../errors"; import { getNodeMatcher } from "../../../languages/getNodeMatcher"; import Location from "../../../libs/common/ide/Location"; -import Selection from "../../../libs/common/ide/Selection"; +import { Selection } from "../../../libs/common/ide"; import type { Target } from "../../../typings/target.types"; import type { ContainingScopeModifier, diff --git a/src/processTargets/modifiers/scopeTypeStages/RegexStage.ts b/src/processTargets/modifiers/scopeTypeStages/RegexStage.ts index e88f1cafb6..5a58205003 100644 --- a/src/processTargets/modifiers/scopeTypeStages/RegexStage.ts +++ b/src/processTargets/modifiers/scopeTypeStages/RegexStage.ts @@ -1,6 +1,6 @@ import { NoContainingScopeError } from "../../../errors"; import Position from "../../../libs/common/ide/Position"; -import Range from "../../../libs/common/ide/Range"; +import { Range } from "../../../libs/common/ide"; import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { Target } from "../../../typings/target.types"; import { diff --git a/src/processTargets/modifiers/surroundingPair/extractSelectionFromSurroundingPairOffsets.ts b/src/processTargets/modifiers/surroundingPair/extractSelectionFromSurroundingPairOffsets.ts index d26873576d..f86c2c1952 100644 --- a/src/processTargets/modifiers/surroundingPair/extractSelectionFromSurroundingPairOffsets.ts +++ b/src/processTargets/modifiers/surroundingPair/extractSelectionFromSurroundingPairOffsets.ts @@ -1,5 +1,5 @@ -import Range from "../../../libs/common/ide/Range"; -import Selection from "../../../libs/common/ide/Selection"; +import { Range } from "../../../libs/common/ide"; +import { Selection } from "../../../libs/common/ide"; import TextDocument from "../../../libs/common/ide/types/TextDocument"; import { SurroundingPairOffsets } from "./types"; diff --git a/src/processTargets/modifiers/surroundingPair/findSurroundingPairParseTreeBased.ts b/src/processTargets/modifiers/surroundingPair/findSurroundingPairParseTreeBased.ts index a0e85c658b..8f62d959ed 100644 --- a/src/processTargets/modifiers/surroundingPair/findSurroundingPairParseTreeBased.ts +++ b/src/processTargets/modifiers/surroundingPair/findSurroundingPairParseTreeBased.ts @@ -1,5 +1,5 @@ import { SyntaxNode } from "web-tree-sitter"; -import Range from "../../../libs/common/ide/Range"; +import { Range } from "../../../libs/common/ide"; import TextDocument from "../../../libs/common/ide/types/TextDocument"; import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { diff --git a/src/processTargets/modifiers/surroundingPair/findSurroundingPairTextBased.ts b/src/processTargets/modifiers/surroundingPair/findSurroundingPairTextBased.ts index 353cdc07b6..82e87bf3d6 100644 --- a/src/processTargets/modifiers/surroundingPair/findSurroundingPairTextBased.ts +++ b/src/processTargets/modifiers/surroundingPair/findSurroundingPairTextBased.ts @@ -15,7 +15,7 @@ import { SurroundingPairOffsets, } from "./types"; import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; -import Range from "../../../libs/common/ide/Range"; +import { Range } from "../../../libs/common/ide"; import TextDocument from "../../../libs/common/ide/types/TextDocument"; /** diff --git a/src/processTargets/modifiers/surroundingPair/index.ts b/src/processTargets/modifiers/surroundingPair/index.ts index ea57810f84..0a61f178a5 100644 --- a/src/processTargets/modifiers/surroundingPair/index.ts +++ b/src/processTargets/modifiers/surroundingPair/index.ts @@ -3,8 +3,8 @@ import getTextFragmentExtractor, { TextFragmentExtractor, } from "../../../languages/getTextFragmentExtractor"; import Location from "../../../libs/common/ide/Location"; -import Range from "../../../libs/common/ide/Range"; -import Selection from "../../../libs/common/ide/Selection"; +import { Range } from "../../../libs/common/ide"; +import { Selection } from "../../../libs/common/ide"; import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { ComplexSurroundingPairName, diff --git a/src/processTargets/modifiers/toPositionTarget.ts b/src/processTargets/modifiers/toPositionTarget.ts index a27283a4a4..90df247792 100644 --- a/src/processTargets/modifiers/toPositionTarget.ts +++ b/src/processTargets/modifiers/toPositionTarget.ts @@ -1,4 +1,4 @@ -import Range from "../../libs/common/ide/Range"; +import { Range } from "../../libs/common/ide"; import { Target } from "../../typings/target.types"; import { Position } from "../../typings/targetDescriptor.types"; import { PositionTarget } from "../targets"; diff --git a/src/processTargets/processTargets.ts b/src/processTargets/processTargets.ts index 6681145b94..584758b100 100644 --- a/src/processTargets/processTargets.ts +++ b/src/processTargets/processTargets.ts @@ -1,5 +1,5 @@ import { uniqWith, zip } from "lodash"; -import Range from "../libs/common/ide/Range"; +import { Range } from "../libs/common/ide"; import { Target } from "../typings/target.types"; import { Modifier, diff --git a/src/processTargets/targetUtil/createContinuousRange.ts b/src/processTargets/targetUtil/createContinuousRange.ts index 79c9a8f1e2..de402b2180 100644 --- a/src/processTargets/targetUtil/createContinuousRange.ts +++ b/src/processTargets/targetUtil/createContinuousRange.ts @@ -1,5 +1,5 @@ import Position from "../../libs/common/ide/Position"; -import Range from "../../libs/common/ide/Range"; +import { Range } from "../../libs/common/ide"; import type { Target } from "../../typings/target.types"; import { UntypedTarget } from "../targets"; diff --git a/src/processTargets/targetUtil/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior.ts b/src/processTargets/targetUtil/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior.ts index 10c150c569..99d37df591 100644 --- a/src/processTargets/targetUtil/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior.ts +++ b/src/processTargets/targetUtil/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior.ts @@ -1,4 +1,4 @@ -import Range from "../../../libs/common/ide/Range"; +import { Range } from "../../../libs/common/ide"; import { Target } from "../../../typings/target.types"; /** diff --git a/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts b/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts index 56f4ca2401..41b494f9a3 100644 --- a/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts +++ b/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts @@ -1,4 +1,4 @@ -import Range from "../../../libs/common/ide/Range"; +import { Range } from "../../../libs/common/ide"; import TextDocument from "../../../libs/common/ide/types/TextDocument"; import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { tokenize } from "../../../libs/cursorless-engine/tokenizer"; diff --git a/src/processTargets/targetUtil/insertionRemovalBehaviors/insertionRemovalBehavior.types.ts b/src/processTargets/targetUtil/insertionRemovalBehaviors/insertionRemovalBehavior.types.ts index 9a4bf3ee6d..0fdb6d50be 100644 --- a/src/processTargets/targetUtil/insertionRemovalBehaviors/insertionRemovalBehavior.types.ts +++ b/src/processTargets/targetUtil/insertionRemovalBehaviors/insertionRemovalBehavior.types.ts @@ -1,4 +1,4 @@ -import type Range from "../../../libs/common/ide/Range"; +import type { Range } from "../../../libs/common/ide"; import type { Target } from "../../../typings/target.types"; export default interface InsertionRemovalBehavior { diff --git a/src/processTargets/targets/BaseTarget.ts b/src/processTargets/targets/BaseTarget.ts index 18349138d6..8416deef98 100644 --- a/src/processTargets/targets/BaseTarget.ts +++ b/src/processTargets/targets/BaseTarget.ts @@ -1,7 +1,7 @@ import { isEqual } from "lodash"; import { NoContainingScopeError } from "../../errors"; -import Range from "../../libs/common/ide/Range"; -import Selection from "../../libs/common/ide/Selection"; +import { Range } from "../../libs/common/ide"; +import { Selection } from "../../libs/common/ide"; import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import type { EditNewContext, Target } from "../../typings/target.types"; import type { Position } from "../../typings/targetDescriptor.types"; diff --git a/src/processTargets/targets/DocumentTarget.ts b/src/processTargets/targets/DocumentTarget.ts index 1f42e4bce4..d2b86a0f24 100644 --- a/src/processTargets/targets/DocumentTarget.ts +++ b/src/processTargets/targets/DocumentTarget.ts @@ -1,4 +1,4 @@ -import Range from "../../libs/common/ide/Range"; +import { Range } from "../../libs/common/ide"; import { shrinkRangeToFitContent } from "../../util/selectionUtils"; import BaseTarget, { CommonTargetParameters } from "./BaseTarget"; import PlainTarget from "./PlainTarget"; diff --git a/src/processTargets/targets/InteriorTarget.ts b/src/processTargets/targets/InteriorTarget.ts index 5c6dd69e5c..d039ab04da 100644 --- a/src/processTargets/targets/InteriorTarget.ts +++ b/src/processTargets/targets/InteriorTarget.ts @@ -1,4 +1,4 @@ -import Range from "../../libs/common/ide/Range"; +import { Range } from "../../libs/common/ide"; import { Target } from "../../typings/target.types"; import { shrinkRangeToFitContent } from "../../util/selectionUtils"; import { isSameType } from "../../util/typeUtils"; diff --git a/src/processTargets/targets/LineTarget.ts b/src/processTargets/targets/LineTarget.ts index 4a3551334f..cca32ce2ec 100644 --- a/src/processTargets/targets/LineTarget.ts +++ b/src/processTargets/targets/LineTarget.ts @@ -1,5 +1,5 @@ import Position from "../../libs/common/ide/Position"; -import Range from "../../libs/common/ide/Range"; +import { Range } from "../../libs/common/ide"; import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import { Target } from "../../typings/target.types"; import { expandToFullLine } from "../../util/rangeUtils"; diff --git a/src/processTargets/targets/ParagraphTarget.ts b/src/processTargets/targets/ParagraphTarget.ts index 7160106663..fb3d5a9652 100644 --- a/src/processTargets/targets/ParagraphTarget.ts +++ b/src/processTargets/targets/ParagraphTarget.ts @@ -5,7 +5,7 @@ import { constructLineTarget } from "../../util/tryConstructTarget"; import { createContinuousLineRange } from "../targetUtil/createContinuousRange"; import BaseTarget from "./BaseTarget"; import LineTarget from "./LineTarget"; -import Range from "../../libs/common/ide/Range"; +import { Range } from "../../libs/common/ide"; import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import Position from "../../libs/common/ide/Position"; import TextDocument from "../../libs/common/ide/types/TextDocument"; diff --git a/src/processTargets/targets/PositionTarget.ts b/src/processTargets/targets/PositionTarget.ts index 38615b230f..835d2afcde 100644 --- a/src/processTargets/targets/PositionTarget.ts +++ b/src/processTargets/targets/PositionTarget.ts @@ -1,6 +1,6 @@ import { BaseTarget, CommonTargetParameters } from "."; import { UnsupportedError } from "../../errors"; -import Range from "../../libs/common/ide/Range"; +import { Range } from "../../libs/common/ide"; import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import { EditNewContext } from "../../typings/target.types"; import { Position } from "../../typings/targetDescriptor.types"; diff --git a/src/processTargets/targets/ScopeTypeTarget.ts b/src/processTargets/targets/ScopeTypeTarget.ts index ee55e7c0d1..0088b77fe4 100644 --- a/src/processTargets/targets/ScopeTypeTarget.ts +++ b/src/processTargets/targets/ScopeTypeTarget.ts @@ -1,4 +1,4 @@ -import Range from "../../libs/common/ide/Range"; +import { Range } from "../../libs/common/ide"; import { Target } from "../../typings/target.types"; import { SimpleScopeTypeType } from "../../typings/targetDescriptor.types"; import { isSameType } from "../../util/typeUtils"; diff --git a/src/processTargets/targets/SubTokenWordTarget.ts b/src/processTargets/targets/SubTokenWordTarget.ts index b35e64effa..6bce889985 100644 --- a/src/processTargets/targets/SubTokenWordTarget.ts +++ b/src/processTargets/targets/SubTokenWordTarget.ts @@ -1,4 +1,4 @@ -import Range from "../../libs/common/ide/Range"; +import { Range } from "../../libs/common/ide"; import { tryConstructPlainTarget as tryConstructPlainTarget } from "../../util/tryConstructTarget"; import { getDelimitedSequenceRemovalRange } from "../targetUtil/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior"; import BaseTarget, { CommonTargetParameters } from "./BaseTarget"; diff --git a/src/processTargets/targets/SurroundingPairTarget.ts b/src/processTargets/targets/SurroundingPairTarget.ts index 362eef60f3..6668d56ea2 100644 --- a/src/processTargets/targets/SurroundingPairTarget.ts +++ b/src/processTargets/targets/SurroundingPairTarget.ts @@ -1,4 +1,4 @@ -import Range from "../../libs/common/ide/Range"; +import { Range } from "../../libs/common/ide"; import { Target } from "../../typings/target.types"; import { getTokenLeadingDelimiterTarget, diff --git a/src/processTargets/targets/TokenTarget.ts b/src/processTargets/targets/TokenTarget.ts index 87635e7c62..3828146141 100644 --- a/src/processTargets/targets/TokenTarget.ts +++ b/src/processTargets/targets/TokenTarget.ts @@ -1,5 +1,5 @@ import { BaseTarget } from "."; -import Range from "../../libs/common/ide/Range"; +import { Range } from "../../libs/common/ide"; import { Target } from "../../typings/target.types"; import { getTokenLeadingDelimiterTarget, diff --git a/src/processTargets/targets/UntypedTarget.ts b/src/processTargets/targets/UntypedTarget.ts index f350e98055..dd8114afbb 100644 --- a/src/processTargets/targets/UntypedTarget.ts +++ b/src/processTargets/targets/UntypedTarget.ts @@ -1,5 +1,5 @@ import { BaseTarget, CommonTargetParameters } from "."; -import Range from "../../libs/common/ide/Range"; +import { Range } from "../../libs/common/ide"; import type { Target } from "../../typings/target.types"; import { createContinuousRangeUntypedTarget } from "../targetUtil/createContinuousRange"; import { diff --git a/src/testUtil/fromPlainObject.ts b/src/testUtil/fromPlainObject.ts index 162048df7c..5ec30b5b2c 100644 --- a/src/testUtil/fromPlainObject.ts +++ b/src/testUtil/fromPlainObject.ts @@ -6,8 +6,8 @@ import type { SelectionPlainObject, TargetPlainObject, } from "../libs/vscode-common/testUtil/toPlainObject"; -import Range from "../libs/common/ide/Range"; -import Selection from "../libs/common/ide/Selection"; +import { Range } from "../libs/common/ide"; +import { Selection } from "../libs/common/ide"; import Position from "../libs/common/ide/Position"; import { TextEditor } from "../libs/common/ide/types/TextEditor"; diff --git a/src/typings/Types.ts b/src/typings/Types.ts index 1588d0ef55..7b6387251b 100644 --- a/src/typings/Types.ts +++ b/src/typings/Types.ts @@ -11,8 +11,8 @@ import { Snippets } from "../core/Snippets"; import StatusBarItem from "../core/StatusBarItem"; import { RangeUpdater } from "../core/updateSelections/RangeUpdater"; import Location from "../libs/common/ide/Location"; -import Range from "../libs/common/ide/Range"; -import Selection from "../libs/common/ide/Selection"; +import { Range } from "../libs/common/ide"; +import { Selection } from "../libs/common/ide"; import type { TextEditor } from "../libs/common/ide/types/TextEditor"; import { CommandServerApi } from "../libs/vscode-common/getExtensionApi"; import { ModifierStage } from "../processTargets/PipelineStages.types"; diff --git a/src/typings/target.types.ts b/src/typings/target.types.ts index 29adad0885..f744ee242c 100644 --- a/src/typings/target.types.ts +++ b/src/typings/target.types.ts @@ -6,8 +6,8 @@ // eslint-disable-next-line @typescript-eslint/no-unused-vars import type ModifyIfUntypedStage from "../processTargets/modifiers/ModifyIfUntypedStage"; // eslint-disable-next-line @typescript-eslint/no-unused-vars -import type Range from "../libs/common/ide/Range"; -import type Selection from "../libs/common/ide/Selection"; +import type { Range } from "../libs/common/ide"; +import type { Selection } from "../libs/common/ide"; import type { TextEditor } from "../libs/common/ide/types/TextEditor"; import type { // eslint-disable-next-line @typescript-eslint/no-unused-vars diff --git a/src/typings/updateSelections.ts b/src/typings/updateSelections.ts index 1cc5600f38..295db23aa6 100644 --- a/src/typings/updateSelections.ts +++ b/src/typings/updateSelections.ts @@ -1,4 +1,4 @@ -import type Range from "../libs/common/ide/Range"; +import type { Range } from "../libs/common/ide"; import type { TextDocumentChangeEvent, TextDocumentContentChangeEvent, diff --git a/src/util/addDecorationsToEditor.ts b/src/util/addDecorationsToEditor.ts index 90a2b70570..304fbb5438 100644 --- a/src/util/addDecorationsToEditor.ts +++ b/src/util/addDecorationsToEditor.ts @@ -2,7 +2,7 @@ import { concat, flatten, maxBy, min } from "lodash"; import Decorations from "../core/Decorations"; import { HatStyleName } from "../core/hatStyles"; import { IndividualHatMap } from "../core/IndividualHatMap"; -import Range from "../libs/common/ide/Range"; +import { Range } from "../libs/common/ide"; import { TextEditor } from "../libs/common/ide/types/TextEditor"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { TokenGraphemeSplitter } from "../libs/cursorless-engine/tokenGraphemeSplitter"; diff --git a/src/util/getTokensInRange.ts b/src/util/getTokensInRange.ts index d43829725a..d5f50b8e42 100644 --- a/src/util/getTokensInRange.ts +++ b/src/util/getTokensInRange.ts @@ -1,4 +1,4 @@ -import Range from "../libs/common/ide/Range"; +import { Range } from "../libs/common/ide"; import { TextEditor } from "../libs/common/ide/types/TextEditor"; import { tokenize } from "../libs/cursorless-engine/tokenizer"; import { RangeOffsets } from "../typings/updateSelections"; diff --git a/src/util/nodeFinders.ts b/src/util/nodeFinders.ts index 2963569d32..ffe8ebd89c 100644 --- a/src/util/nodeFinders.ts +++ b/src/util/nodeFinders.ts @@ -1,6 +1,6 @@ import { Point, SyntaxNode } from "web-tree-sitter"; import Position from "../libs/common/ide/Position"; -import Selection from "../libs/common/ide/Selection"; +import { Selection } from "../libs/common/ide"; import { NodeFinder } from "../typings/Types"; export const nodeFinder = ( diff --git a/src/util/nodeSelectors.ts b/src/util/nodeSelectors.ts index 6e63e23434..9db4007288 100644 --- a/src/util/nodeSelectors.ts +++ b/src/util/nodeSelectors.ts @@ -1,8 +1,8 @@ import { identity, maxBy } from "lodash"; import { Point, SyntaxNode } from "web-tree-sitter"; import Position from "../libs/common/ide/Position"; -import Range from "../libs/common/ide/Range"; -import Selection from "../libs/common/ide/Selection"; +import { Range } from "../libs/common/ide"; +import { Selection } from "../libs/common/ide"; import { TextEditor } from "../libs/common/ide/types/TextEditor"; import { NodeFinder, diff --git a/src/util/rangeUtils.ts b/src/util/rangeUtils.ts index 723f5b4fe3..72bbaf2f65 100644 --- a/src/util/rangeUtils.ts +++ b/src/util/rangeUtils.ts @@ -1,5 +1,5 @@ import Position from "../libs/common/ide/Position"; -import Range from "../libs/common/ide/Range"; +import { Range } from "../libs/common/ide"; import { TextEditor } from "../libs/common/ide/types/TextEditor"; export function isAtEndOfLine(editor: TextEditor, position: Position) { diff --git a/src/util/selectionUtils.ts b/src/util/selectionUtils.ts index c0572a115d..956e88f9f5 100644 --- a/src/util/selectionUtils.ts +++ b/src/util/selectionUtils.ts @@ -1,6 +1,6 @@ import Position from "../libs/common/ide/Position"; -import Range from "../libs/common/ide/Range"; -import Selection from "../libs/common/ide/Selection"; +import { Range } from "../libs/common/ide"; +import { Selection } from "../libs/common/ide"; import { TextEditor } from "../libs/common/ide/types/TextEditor"; import { SelectionWithEditor } from "../typings/Types"; diff --git a/src/util/setSelectionsAndFocusEditor.ts b/src/util/setSelectionsAndFocusEditor.ts index 5efe3a4564..51b1da8252 100644 --- a/src/util/setSelectionsAndFocusEditor.ts +++ b/src/util/setSelectionsAndFocusEditor.ts @@ -1,4 +1,4 @@ -import Selection from "../libs/common/ide/Selection"; +import { Selection } from "../libs/common/ide"; import { EditableTextEditor } from "../libs/common/ide/types/TextEditor"; import uniqDeep from "./uniqDeep"; diff --git a/src/util/targetUtils.ts b/src/util/targetUtils.ts index 8cb44c6a3d..4c57aa5965 100644 --- a/src/util/targetUtils.ts +++ b/src/util/targetUtils.ts @@ -1,6 +1,6 @@ import { zip } from "lodash"; -import Range from "../libs/common/ide/Range"; -import Selection from "../libs/common/ide/Selection"; +import { Range } from "../libs/common/ide"; +import { Selection } from "../libs/common/ide"; import { TextEditor } from "../libs/common/ide/types/TextEditor"; import { Target } from "../typings/target.types"; import { SelectionWithEditor } from "../typings/Types"; diff --git a/src/util/tryConstructTarget.ts b/src/util/tryConstructTarget.ts index e5a722a1fa..b25f2d1015 100644 --- a/src/util/tryConstructTarget.ts +++ b/src/util/tryConstructTarget.ts @@ -1,4 +1,4 @@ -import Range from "../libs/common/ide/Range"; +import { Range } from "../libs/common/ide"; import { TextEditor } from "../libs/common/ide/types/TextEditor"; import { CommonTargetParameters, From 3054983185c4abdc1036d8242afc2fba6d166b49 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 13 Nov 2022 15:40:46 +0100 Subject: [PATCH 16/84] Updated fake ide --- .../suite/breakpoints.test.ts | 2 +- src/extension.ts | 6 ++++-- src/libs/common/ide/fake/FakeIDE.ts | 15 +++++++++------ 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/apps/cursorless-vscode-e2e/suite/breakpoints.test.ts b/src/apps/cursorless-vscode-e2e/suite/breakpoints.test.ts index 0f3d1bbb16..74fa82754b 100644 --- a/src/apps/cursorless-vscode-e2e/suite/breakpoints.test.ts +++ b/src/apps/cursorless-vscode-e2e/suite/breakpoints.test.ts @@ -5,7 +5,7 @@ import { openNewEditor } from "../openNewEditor"; import { runCursorlessCommand } from "../runCommand"; import { endToEndTestSetup } from "../endToEndTestSetup"; -suite("breakpoints", async function () { +suite.only("breakpoints", async function () { endToEndTestSetup(this); setup(() => { diff --git a/src/extension.ts b/src/extension.ts index ce3b590f4f..65d38fd533 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -33,14 +33,16 @@ export async function activate( const { getNodeAtLocation } = await getParseTreeApi(); const commandServerApi = await getCommandServerApi(); + const vscodeIDE = new VscodeIDE(context); + if (isTesting()) { // FIXME: At some point we'll probably want to support partial mocking // rather than mocking away everything that we can - const fake = new FakeIDE(); + const fake = new FakeIDE(vscodeIDE); fake.mockAssetsRoot(context.extensionPath); injectIde(fake); } else { - injectIde(new VscodeIDE(context)); + injectIde(vscodeIDE); } const graph = makeGraph({ diff --git a/src/libs/common/ide/fake/FakeIDE.ts b/src/libs/common/ide/fake/FakeIDE.ts index e0fdecaabe..515408b2b0 100644 --- a/src/libs/common/ide/fake/FakeIDE.ts +++ b/src/libs/common/ide/fake/FakeIDE.ts @@ -19,7 +19,7 @@ export default class FakeIDE implements IDE { clipboard: FakeClipboard; private disposables: Disposable[] = []; - constructor() { + constructor(private original?: IDE) { this.configuration = new FakeConfiguration(); this.messages = new FakeMessages(); this.globalState = new FakeGlobalState(); @@ -44,18 +44,21 @@ export default class FakeIDE implements IDE { workspaceFolders: readonly WorkspaceFolder[] | undefined = undefined; activeTextEditor: TextEditor | undefined = undefined; activeEditableTextEditor: EditableTextEditor | undefined = undefined; - visibleTextEditors: TextEditor[] = []; - onDidChangeTextDocument( - _listener: (event: TextDocumentChangeEvent) => void, - ): Disposable { - throw Error("Not supported"); + get visibleTextEditors(): TextEditor[] { + return this.original?.visibleTextEditors ?? []; } public getEditableTextEditor(_editor: TextEditor): EditableTextEditor { throw Error("Not supported"); } + onDidChangeTextDocument( + _listener: (event: TextDocumentChangeEvent) => void, + ): Disposable { + throw Error("Not supported"); + } + disposeOnExit(...disposables: Disposable[]): () => void { this.disposables.push(...disposables); From 7eed96c3cd6a2c15b48246ecef90e33633e37d3a Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 13 Nov 2022 16:24:52 +0100 Subject: [PATCH 17/84] Added test for position --- .../suite/breakpoints.test.ts | 2 +- src/libs/common/ide/fake/FakeIDE.ts | 24 +++++-- src/libs/common/ide/position.test.ts | 64 +++++++++++++++++++ 3 files changed, 83 insertions(+), 7 deletions(-) create mode 100644 src/libs/common/ide/position.test.ts diff --git a/src/apps/cursorless-vscode-e2e/suite/breakpoints.test.ts b/src/apps/cursorless-vscode-e2e/suite/breakpoints.test.ts index 74fa82754b..0f3d1bbb16 100644 --- a/src/apps/cursorless-vscode-e2e/suite/breakpoints.test.ts +++ b/src/apps/cursorless-vscode-e2e/suite/breakpoints.test.ts @@ -5,7 +5,7 @@ import { openNewEditor } from "../openNewEditor"; import { runCursorlessCommand } from "../runCommand"; import { endToEndTestSetup } from "../endToEndTestSetup"; -suite.only("breakpoints", async function () { +suite("breakpoints", async function () { endToEndTestSetup(this); setup(() => { diff --git a/src/libs/common/ide/fake/FakeIDE.ts b/src/libs/common/ide/fake/FakeIDE.ts index 515408b2b0..4a7af698e7 100644 --- a/src/libs/common/ide/fake/FakeIDE.ts +++ b/src/libs/common/ide/fake/FakeIDE.ts @@ -42,21 +42,33 @@ export default class FakeIDE implements IDE { runMode: RunMode = "test"; workspaceFolders: readonly WorkspaceFolder[] | undefined = undefined; - activeTextEditor: TextEditor | undefined = undefined; - activeEditableTextEditor: EditableTextEditor | undefined = undefined; + + get activeTextEditor(): TextEditor | undefined { + return this.original?.activeTextEditor; + } + + get activeEditableTextEditor(): EditableTextEditor | undefined { + return this.original?.activeEditableTextEditor; + } get visibleTextEditors(): TextEditor[] { return this.original?.visibleTextEditors ?? []; } - public getEditableTextEditor(_editor: TextEditor): EditableTextEditor { - throw Error("Not supported"); + public getEditableTextEditor(editor: TextEditor): EditableTextEditor { + if (this.original == null) { + throw Error("Original ide is missing"); + } + return this.original.getEditableTextEditor(editor); } onDidChangeTextDocument( - _listener: (event: TextDocumentChangeEvent) => void, + listener: (event: TextDocumentChangeEvent) => void, ): Disposable { - throw Error("Not supported"); + if (this.original == null) { + throw Error("Original ide is missing"); + } + return this.original.onDidChangeTextDocument(listener); } disposeOnExit(...disposables: Disposable[]): () => void { diff --git a/src/libs/common/ide/position.test.ts b/src/libs/common/ide/position.test.ts new file mode 100644 index 0000000000..74f136b027 --- /dev/null +++ b/src/libs/common/ide/position.test.ts @@ -0,0 +1,64 @@ +import * as assert from "assert"; +import { Position } from "."; + +suite.only("Position", () => { + test("isEqual", () => { + assert.ok(new Position(0, 0).isEqual(new Position(0, 0))); + assert.ok(new Position(1, 2).isEqual(new Position(1, 2))); + assert.ok(new Position(3, 2).isEqual(new Position(3, 2))); + assert.ok(!new Position(0, 0).isEqual(new Position(0, 1))); + assert.ok(!new Position(0, 0).isEqual(new Position(1, 0))); + }); + + test("isBefore", () => { + assert.ok(new Position(0, 0).isBefore(new Position(1, 0))); + assert.ok(new Position(0, 0).isBefore(new Position(0, 1))); + assert.ok(!new Position(1, 0).isBefore(new Position(0, 0))); + assert.ok(!new Position(0, 1).isBefore(new Position(0, 0))); + }); + + test("isAfter", () => { + assert.ok(new Position(1, 0).isAfter(new Position(0, 0))); + assert.ok(new Position(0, 1).isAfter(new Position(0, 0))); + assert.ok(!new Position(0, 0).isAfter(new Position(1, 0))); + assert.ok(!new Position(0, 0).isAfter(new Position(0, 1))); + }); + + test("isBeforeOrEqual", () => { + assert.ok(new Position(0, 0).isBeforeOrEqual(new Position(0, 0))); + assert.ok(new Position(0, 0).isBeforeOrEqual(new Position(1, 0))); + assert.ok(new Position(0, 0).isBeforeOrEqual(new Position(0, 1))); + }); + + test("isAfterOrEqual", () => { + assert.ok(new Position(0, 0).isAfterOrEqual(new Position(0, 0))); + assert.ok(new Position(1, 0).isAfterOrEqual(new Position(0, 0))); + assert.ok(new Position(0, 1).isAfterOrEqual(new Position(0, 0))); + }); + + test("compareTo", () => { + assert.equal(0, new Position(0, 0).compareTo(new Position(0, 0))); + assert.equal(-1, new Position(0, 0).compareTo(new Position(1, 0))); + assert.equal(-1, new Position(0, 0).compareTo(new Position(0, 1))); + assert.equal(1, new Position(1, 0).compareTo(new Position(0, 0))); + assert.equal(1, new Position(0, 1).compareTo(new Position(0, 0))); + }); + + test("with", () => { + assert.ok( + new Position(1, 1).with(5, undefined).isEqual(new Position(5, 1)), + ); + assert.ok( + new Position(1, 1).with(undefined, 5).isEqual(new Position(1, 5)), + ); + }); + + test("translate", () => { + assert.ok( + new Position(1, 1).translate(5, undefined).isEqual(new Position(6, 1)), + ); + assert.ok( + new Position(1, 1).translate(undefined, 5).isEqual(new Position(1, 6)), + ); + }); +}); From 1e9a3b8e50a51d575a5bf5031895ab631f5d78e5 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 13 Nov 2022 16:50:26 +0100 Subject: [PATCH 18/84] Added range test --- src/libs/common/ide/Range.ts | 22 +++---- src/libs/common/ide/position.test.ts | 17 +++-- src/libs/common/ide/range.test.ts | 93 ++++++++++++++++++++++++++++ 3 files changed, 115 insertions(+), 17 deletions(-) create mode 100644 src/libs/common/ide/range.test.ts diff --git a/src/libs/common/ide/Range.ts b/src/libs/common/ide/Range.ts index a0224b56d1..eaadf59937 100644 --- a/src/libs/common/ide/Range.ts +++ b/src/libs/common/ide/Range.ts @@ -83,6 +83,17 @@ export default class Range { return this.start.line === this.end.line; } + /** + * Check if `other` equals this range. + * + * @param other A range. + * @return `true` when start and end are {@link Position.isEqual equal} to + * start and end of this range. + */ + public isEqual(other: Range): boolean { + return this.start.isEqual(other.start) && this.end.isEqual(other.end); + } + /** * Check if a position or a range is contained in this range. * @@ -98,17 +109,6 @@ export default class Range { return start.isAfterOrEqual(this.start) && end.isBeforeOrEqual(this.end); } - /** - * Check if `other` equals this range. - * - * @param other A range. - * @return `true` when start and end are {@link Position.isEqual equal} to - * start and end of this range. - */ - public isEqual(other: Range): boolean { - return this.start.isEqual(other.start) && this.end.isEqual(other.end); - } - /** * Intersect `range` with this range and returns a new range or `undefined` * if the ranges have no overlap. diff --git a/src/libs/common/ide/position.test.ts b/src/libs/common/ide/position.test.ts index 74f136b027..976df254b2 100644 --- a/src/libs/common/ide/position.test.ts +++ b/src/libs/common/ide/position.test.ts @@ -1,7 +1,12 @@ import * as assert from "assert"; import { Position } from "."; -suite.only("Position", () => { +suite("Position", () => { + test("constructor", () => { + assert.equal(new Position(5, 0).line, 5); + assert.equal(new Position(0, 5).character, 5); + }); + test("isEqual", () => { assert.ok(new Position(0, 0).isEqual(new Position(0, 0))); assert.ok(new Position(1, 2).isEqual(new Position(1, 2))); @@ -37,11 +42,11 @@ suite.only("Position", () => { }); test("compareTo", () => { - assert.equal(0, new Position(0, 0).compareTo(new Position(0, 0))); - assert.equal(-1, new Position(0, 0).compareTo(new Position(1, 0))); - assert.equal(-1, new Position(0, 0).compareTo(new Position(0, 1))); - assert.equal(1, new Position(1, 0).compareTo(new Position(0, 0))); - assert.equal(1, new Position(0, 1).compareTo(new Position(0, 0))); + assert.equal(new Position(0, 0).compareTo(new Position(0, 0)), 0); + assert.equal(new Position(0, 0).compareTo(new Position(1, 0)), -1); + assert.equal(new Position(0, 0).compareTo(new Position(0, 1)), -1); + assert.equal(new Position(1, 0).compareTo(new Position(0, 0)), 1); + assert.equal(new Position(0, 1).compareTo(new Position(0, 0)), 1); }); test("with", () => { diff --git a/src/libs/common/ide/range.test.ts b/src/libs/common/ide/range.test.ts new file mode 100644 index 0000000000..a269e112ef --- /dev/null +++ b/src/libs/common/ide/range.test.ts @@ -0,0 +1,93 @@ +import * as assert from "assert"; +import { Position, Range } from "."; + +suite("Range", () => { + test("constructor", () => { + assert.equal(new Range(5, 0, 10, 0).start.line, 5); + assert.equal(new Range(0, 5, 0, 10).start.character, 5); + assert.equal(new Range(0, 0, 5, 0).end.line, 5); + assert.equal(new Range(0, 0, 0, 5).end.character, 5); + assert.equal(new Range(5, 0, 0, 0).start.line, 0); + assert.equal(new Range(0, 5, 0, 0).start.character, 0); + }); + + test("isEmpty", () => { + assert.ok(new Range(0, 0, 0, 0).isEmpty); + assert.ok(!new Range(1, 0, 0, 0).isEmpty); + assert.ok(!new Range(0, 1, 0, 0).isEmpty); + assert.ok(!new Range(0, 0, 1, 0).isEmpty); + assert.ok(!new Range(0, 0, 0, 1).isEmpty); + }); + + test("isSingleLine", () => { + assert.ok(new Range(0, 0, 0, 0).isSingleLine); + assert.ok(new Range(0, 0, 0, 1).isSingleLine); + assert.ok(new Range(0, 1, 0, 2).isSingleLine); + assert.ok(!new Range(0, 0, 1, 0).isSingleLine); + assert.ok(!new Range(1, 0, 2, 0).isSingleLine); + }); + + test("isEqual", () => { + assert.ok(new Range(0, 0, 0, 0).isEqual(new Range(0, 0, 0, 0))); + assert.ok(new Range(1, 0, 0, 0).isEqual(new Range(1, 0, 0, 0))); + assert.ok(new Range(0, 1, 0, 0).isEqual(new Range(0, 1, 0, 0))); + assert.ok(new Range(0, 0, 1, 0).isEqual(new Range(0, 0, 1, 0))); + assert.ok(new Range(0, 0, 0, 1).isEqual(new Range(0, 0, 0, 1))); + }); + + test("contains", () => { + assert.ok(new Range(0, 0, 0, 0).contains(new Range(0, 0, 0, 0))); + assert.ok(new Range(0, 0, 4, 0).contains(new Range(1, 0, 2, 0))); + assert.ok(new Range(0, 0, 0, 4).contains(new Range(0, 1, 0, 2))); + assert.ok(new Range(0, 0, 0, 1).contains(new Range(0, 0, 0, 0))); + assert.ok(new Range(0, 0, 1, 0).contains(new Range(0, 0, 0, 0))); + assert.ok(!new Range(0, 0, 0, 0).contains(new Range(0, 0, 0, 1))); + assert.ok(!new Range(0, 0, 0, 0).contains(new Range(0, 0, 1, 0))); + }); + + test("intersection", () => { + assert.ok( + new Range(1, 2, 3, 4) + .intersection(new Range(1, 7, 5, 2)) + ?.isEqual(new Range(1, 7, 3, 4)), + ); + assert.ok( + new Range(1, 2, 1, 6).intersection(new Range(1, 6, 5, 2))?.isEmpty, + ); + assert.equal( + new Range(1, 2, 1, 5).intersection(new Range(1, 6, 1, 9)), + undefined, + ); + }); + + test("with", () => { + assert.ok( + new Range(1, 2, 3, 4) + .with(new Position(4, 5), undefined) + .isEqual(new Range(4, 5, 3, 4)), + ); + assert.ok( + new Range(1, 2, 3, 4) + .with(undefined, new Position(4, 5)) + .isEqual(new Range(1, 2, 4, 5)), + ); + }); + + test("union", () => { + assert.ok( + new Range(1, 2, 3, 4) + .union(new Range(4, 2, 6, 1)) + .isEqual(new Range(1, 2, 6, 1)), + ); + assert.ok( + new Range(1, 2, 3, 4) + .union(new Range(0, 1, 0, 1)) + .isEqual(new Range(0, 1, 3, 4)), + ); + }); + + test("toSelection", () => { + assert.ok(new Range(1, 2, 3, 4).toSelection(true).isReversed); + assert.ok(!new Range(1, 2, 3, 4).toSelection(false).isReversed); + }); +}); From 682ab6dc8c278de98ec4cf4377f6408a5129ff33 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 13 Nov 2022 17:24:56 +0100 Subject: [PATCH 19/84] Added getter to vscode editable editor implementation --- src/ide/vscode/VscodeEditableTextEditorImpl.ts | 11 +++++++++-- src/libs/common/ide/range.test.ts | 6 ++++++ src/typings/Types.ts | 6 +++--- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/ide/vscode/VscodeEditableTextEditorImpl.ts b/src/ide/vscode/VscodeEditableTextEditorImpl.ts index 3dfe6a2ad3..7cdd38d320 100644 --- a/src/ide/vscode/VscodeEditableTextEditorImpl.ts +++ b/src/ide/vscode/VscodeEditableTextEditorImpl.ts @@ -1,7 +1,6 @@ import * as vscode from "vscode"; +import type { Range, Selection } from "../../libs/common/ide"; import type Position from "../../libs/common/ide/Position"; -import type { Range } from "../../libs/common/ide"; -import type { Selection } from "../../libs/common/ide"; import type { EditableTextEditor } from "../../libs/common/ide/types/TextEditor"; import type { TextEditorDecorationType } from "../../libs/common/ide/types/TextEditorDecorationType"; import type TextEditorEdit from "../../libs/common/ide/types/TextEditorEdit"; @@ -24,10 +23,18 @@ export default class VscodeEditableTextEditorImpl super(editor); } + get selections(): Selection[] { + return super.selections; + } + set selections(selections: Selection[]) { this.editor.selections = selections.map(toVscodeSelection); } + get options(): TextEditorOptions { + return super.options; + } + set options(options: TextEditorOptions) { this.editor.options = options; } diff --git a/src/libs/common/ide/range.test.ts b/src/libs/common/ide/range.test.ts index a269e112ef..e14b2f27af 100644 --- a/src/libs/common/ide/range.test.ts +++ b/src/libs/common/ide/range.test.ts @@ -9,6 +9,11 @@ suite("Range", () => { assert.equal(new Range(0, 0, 0, 5).end.character, 5); assert.equal(new Range(5, 0, 0, 0).start.line, 0); assert.equal(new Range(0, 5, 0, 0).start.character, 0); + assert.ok( + new Range(new Position(1, 2), new Position(3, 4)).isEqual( + new Range(1, 2, 3, 4), + ), + ); }); test("isEmpty", () => { @@ -43,6 +48,7 @@ suite("Range", () => { assert.ok(new Range(0, 0, 1, 0).contains(new Range(0, 0, 0, 0))); assert.ok(!new Range(0, 0, 0, 0).contains(new Range(0, 0, 0, 1))); assert.ok(!new Range(0, 0, 0, 0).contains(new Range(0, 0, 1, 0))); + assert.ok(new Range(0, 0, 0, 7).contains(new Position(0, 2))); }); test("intersection", () => { diff --git a/src/typings/Types.ts b/src/typings/Types.ts index 7b6387251b..92a7d9f04c 100644 --- a/src/typings/Types.ts +++ b/src/typings/Types.ts @@ -10,9 +10,9 @@ import { ReadOnlyHatMap } from "../core/IndividualHatMap"; import { Snippets } from "../core/Snippets"; import StatusBarItem from "../core/StatusBarItem"; import { RangeUpdater } from "../core/updateSelections/RangeUpdater"; -import Location from "../libs/common/ide/Location"; -import { Range } from "../libs/common/ide"; -import { Selection } from "../libs/common/ide"; +import type Location from "../libs/common/ide/Location"; +import type { Range } from "../libs/common/ide"; +import type { Selection } from "../libs/common/ide"; import type { TextEditor } from "../libs/common/ide/types/TextEditor"; import { CommandServerApi } from "../libs/vscode-common/getExtensionApi"; import { ModifierStage } from "../processTargets/PipelineStages.types"; From f0fb5255b9a2f72fa60928987bdd9b4611f0aed6 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 13 Nov 2022 17:39:34 +0100 Subject: [PATCH 20/84] Convert position --- src/ide/vscode/VscodeTextDocumentImpl.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ide/vscode/VscodeTextDocumentImpl.ts b/src/ide/vscode/VscodeTextDocumentImpl.ts index 9cf412440b..f0fbcb4750 100644 --- a/src/ide/vscode/VscodeTextDocumentImpl.ts +++ b/src/ide/vscode/VscodeTextDocumentImpl.ts @@ -1,10 +1,11 @@ import * as vscode from "vscode"; import type { URI } from "vscode-uri"; -import Position from "../../libs/common/ide/Position"; import { Range } from "../../libs/common/ide"; +import Position from "../../libs/common/ide/Position"; import TextDocument from "../../libs/common/ide/types/TextDocument"; import TextLine from "../../libs/common/ide/types/TextLine"; import { + fromVscodePosition, fromVscodeTextLine, toVscodePosition, toVscodeRange, @@ -51,7 +52,7 @@ export default class VscodeTextDocumentImpl implements TextDocument { } positionAt(offset: number): Position { - return this.document.positionAt(offset); + return fromVscodePosition(this.document.positionAt(offset)); } getText(range?: Range | undefined): string { From b24a2096bff3d01b2249c8f321ce7436fc574254 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 13 Nov 2022 17:55:23 +0100 Subject: [PATCH 21/84] Added text line implementation --- src/ide/vscode/VscodeTextLineImpl.ts | 39 +++++++++++++++++++ src/ide/vscode/VscodeUtil.ts | 7 +--- src/libs/common/ide/types/TextLine.ts | 6 +++ .../scopeHandlers/LineScopeHandler.ts | 5 +-- 4 files changed, 48 insertions(+), 9 deletions(-) create mode 100644 src/ide/vscode/VscodeTextLineImpl.ts diff --git a/src/ide/vscode/VscodeTextLineImpl.ts b/src/ide/vscode/VscodeTextLineImpl.ts new file mode 100644 index 0000000000..bbd19aabbb --- /dev/null +++ b/src/ide/vscode/VscodeTextLineImpl.ts @@ -0,0 +1,39 @@ +import * as vscode from "vscode"; +import { Range } from "../../libs/common/ide"; +import type TextLine from "../../libs/common/ide/types/TextLine"; +import { fromVscodeRange } from "./VscodeUtil"; + +export default class VscodeTextLineImpl implements TextLine { + constructor(private line: vscode.TextLine) {} + + get lineNumber(): number { + return this.line.lineNumber; + } + + get text(): string { + return this.line.text; + } + + get range(): Range { + return fromVscodeRange(this.line.range); + } + + get rangeIncludingLineBreak(): Range { + return fromVscodeRange(this.line.rangeIncludingLineBreak); + } + + get firstNonWhitespaceCharacterIndex(): number { + return this.line.firstNonWhitespaceCharacterIndex; + } + + get lastNonWhitespaceCharacterIndex(): number { + return ( + this.line.range.end.character - + (this.line.text.length - this.line.text.trimEnd().length) + ); + } + + get isEmptyOrWhitespace(): boolean { + return this.line.isEmptyOrWhitespace; + } +} diff --git a/src/ide/vscode/VscodeUtil.ts b/src/ide/vscode/VscodeUtil.ts index 8b5881476d..d607bde8bd 100644 --- a/src/ide/vscode/VscodeUtil.ts +++ b/src/ide/vscode/VscodeUtil.ts @@ -8,6 +8,7 @@ import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import TextLine from "../../libs/common/ide/types/TextLine"; import VscodeTextDocumentImpl from "./VscodeTextDocumentImpl"; import VscodeTextEditorImpl from "./VscodeTextEditorImpl"; +import VscodeTextLineImpl from "./VscodeTextLineImpl"; export function toVscodeRange(range: Range): vscode.Range { return new vscode.Range( @@ -70,11 +71,7 @@ export function toVscodeTextLine(line: TextLine): vscode.TextLine { } export function fromVscodeTextLine(line: vscode.TextLine): TextLine { - return { - ...line, - range: fromVscodeRange(line.range), - rangeIncludingLineBreak: fromVscodeRange(line.rangeIncludingLineBreak), - }; + return new VscodeTextLineImpl(line); } export function toVscodeEndOfLine(eol: EndOfLine): vscode.EndOfLine { diff --git a/src/libs/common/ide/types/TextLine.ts b/src/libs/common/ide/types/TextLine.ts index d78969821c..067210c61d 100644 --- a/src/libs/common/ide/types/TextLine.ts +++ b/src/libs/common/ide/types/TextLine.ts @@ -33,6 +33,12 @@ export default interface TextLine { */ readonly firstNonWhitespaceCharacterIndex: number; + /** + * The offset of the last character which is not a whitespace character as defined + * by `/\s/`. **Note** that if a line is all whitespace the length of the line is returned. + */ + readonly lastNonWhitespaceCharacterIndex: number; + /** * Whether this line is whitespace only, shorthand * for {@link TextLine.firstNonWhitespaceCharacterIndex} === {@link TextLine.text TextLine.text.length}. diff --git a/src/processTargets/modifiers/scopeHandlers/LineScopeHandler.ts b/src/processTargets/modifiers/scopeHandlers/LineScopeHandler.ts index 96cf820b5b..3ccb45aae5 100644 --- a/src/processTargets/modifiers/scopeHandlers/LineScopeHandler.ts +++ b/src/processTargets/modifiers/scopeHandlers/LineScopeHandler.ts @@ -60,14 +60,11 @@ export function createLineTarget( export function fitRangeToLineContent(editor: TextEditor, range: Range) { const startLine = editor.document.lineAt(range.start); const endLine = editor.document.lineAt(range.end); - const endCharacterIndex = - endLine.range.end.character - - (endLine.text.length - endLine.text.trimEnd().length); return new Range( startLine.lineNumber, startLine.firstNonWhitespaceCharacterIndex, endLine.lineNumber, - endCharacterIndex, + endLine.lastNonWhitespaceCharacterIndex, ); } From cdc792c17a247f5a07e0998d3760ff583149817c Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 13 Nov 2022 18:16:25 +0100 Subject: [PATCH 22/84] Better handling of selections --- src/ide/vscode/VscodeEditEditor.ts | 13 +++++++----- src/ide/vscode/VscodeUtil.ts | 32 ++++++++++++++++++++++-------- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/ide/vscode/VscodeEditEditor.ts b/src/ide/vscode/VscodeEditEditor.ts index 09d97cfaf2..f05933c945 100644 --- a/src/ide/vscode/VscodeEditEditor.ts +++ b/src/ide/vscode/VscodeEditEditor.ts @@ -3,8 +3,8 @@ import TextEditorEdit from "../../libs/common/ide/types/TextEditorEdit"; import { toVscodeEndOfLine, toVscodePosition, - toVscodePositionOrRange, - toVscodeRange, + toVscodePositionOrRangeOrSelection, + toVscodeRangeOrSelection, } from "./VscodeUtil"; export default function vscodeEditEditor( @@ -15,16 +15,19 @@ export default function vscodeEditEditor( return editor.edit((editBuilder) => { callback({ replace: (location, value) => { - editBuilder.replace(toVscodePositionOrRange(location), value); + editBuilder.replace( + toVscodePositionOrRangeOrSelection(location), + value, + ); }, insert: (location, value) => { editBuilder.insert(toVscodePosition(location), value); }, delete: (location) => { - return editBuilder.delete(toVscodeRange(location)); + editBuilder.delete(toVscodeRangeOrSelection(location)); }, setEndOfLine: (endOfLine) => { - return editBuilder.setEndOfLine(toVscodeEndOfLine(endOfLine)); + editBuilder.setEndOfLine(toVscodeEndOfLine(endOfLine)); }, }); }, options); diff --git a/src/ide/vscode/VscodeUtil.ts b/src/ide/vscode/VscodeUtil.ts index d607bde8bd..4fcec11ddc 100644 --- a/src/ide/vscode/VscodeUtil.ts +++ b/src/ide/vscode/VscodeUtil.ts @@ -30,19 +30,19 @@ export function fromVscodeRange(range: vscode.Range): Range { export function toVscodeSelection(range: Selection): vscode.Selection { return new vscode.Selection( - range.start.line, - range.start.character, - range.end.line, - range.end.character, + range.anchor.line, + range.anchor.character, + range.active.line, + range.active.character, ); } export function fromVscodeSelection(range: vscode.Selection): Selection { return new Selection( - range.start.line, - range.start.character, - range.end.line, - range.end.character, + range.anchor.line, + range.anchor.character, + range.active.line, + range.active.character, ); } @@ -62,6 +62,22 @@ export function toVscodePositionOrRange( : toVscodePosition(location); } +export function toVscodePositionOrRangeOrSelection( + location: Position | Range | Selection, +): vscode.Position | vscode.Range | vscode.Selection { + return "line" in location + ? toVscodePosition(location) + : toVscodeRangeOrSelection(location); +} + +export function toVscodeRangeOrSelection( + location: Range | Selection, +): vscode.Range | vscode.Selection { + return "anchor" in location + ? toVscodeSelection(location) + : toVscodeRange(location); +} + export function toVscodeTextLine(line: TextLine): vscode.TextLine { return { ...line, From 825491c36ef4fa3b1af3c549392d6a1a2ea15d4f Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 13 Nov 2022 18:31:21 +0100 Subject: [PATCH 23/84] group document by uri --- src/util/targetUtils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/util/targetUtils.ts b/src/util/targetUtils.ts index 4c57aa5965..f393fd617e 100644 --- a/src/util/targetUtils.ts +++ b/src/util/targetUtils.ts @@ -51,12 +51,12 @@ export function groupTargetsForEachEditor(targets: Target[]) { return groupForEachEditor(targets, (target) => target.editor); } -export function groupForEachEditor( +function groupForEachEditor( targets: T[], getEditor: (target: T) => TextEditor, ): [TextEditor, T[]][] { // Actually group by document and not editor. If the same document is open in multiple editors we want to perform all actions in one editor or an concurrency error will occur. - const getDocument = (target: T) => getEditor(target).document; + const getDocument = (target: T) => getEditor(target).document.uri; const editorMap = groupBy(targets, getDocument); return Array.from(editorMap.values(), (editorTargets) => { // Just pick any editor with the given document open; doesn't matter which From 88af316475dd3a5224268ad301efbe8ffe39fea9 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 13 Nov 2022 18:50:17 +0100 Subject: [PATCH 24/84] Remove on use to vscode converter --- src/ide/vscode/VscodeUtil.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/ide/vscode/VscodeUtil.ts b/src/ide/vscode/VscodeUtil.ts index 4fcec11ddc..a988606a13 100644 --- a/src/ide/vscode/VscodeUtil.ts +++ b/src/ide/vscode/VscodeUtil.ts @@ -78,14 +78,6 @@ export function toVscodeRangeOrSelection( : toVscodeRange(location); } -export function toVscodeTextLine(line: TextLine): vscode.TextLine { - return { - ...line, - range: toVscodeRange(line.range), - rangeIncludingLineBreak: toVscodeRange(line.rangeIncludingLineBreak), - }; -} - export function fromVscodeTextLine(line: vscode.TextLine): TextLine { return new VscodeTextLineImpl(line); } From 0a30f19576024d4aeb995cc0ecb2e0e5b0dc141f Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 13 Nov 2022 19:15:43 +0100 Subject: [PATCH 25/84] Clean up tests --- src/apps/cursorless-vscode-e2e/suite/recorded.test.ts | 4 +--- src/ide/vscode/VscodeTextDocumentImpl.ts | 2 +- src/util/nodeSelectors.ts | 6 +++--- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/apps/cursorless-vscode-e2e/suite/recorded.test.ts b/src/apps/cursorless-vscode-e2e/suite/recorded.test.ts index 12d8373e22..63c3ab9b92 100644 --- a/src/apps/cursorless-vscode-e2e/suite/recorded.test.ts +++ b/src/apps/cursorless-vscode-e2e/suite/recorded.test.ts @@ -29,8 +29,6 @@ import { openNewEditor } from "../openNewEditor"; import { runCursorlessCommand } from "../runCommand"; import shouldUpdateFixtures from "../shouldUpdateFixtures"; import { sleepWithBackoff, endToEndTestSetup } from "../endToEndTestSetup"; -// eslint-disable-next-line @typescript-eslint/no-restricted-imports -import ide from "../../../libs/cursorless-engine/singletons/ide.singleton"; function createPosition(position: PositionPlainObject) { return new vscode.Position(position.line, position.character); @@ -179,7 +177,7 @@ async function runTest(file: string, spyIde: SpyIDE) { cursorlessApi.sourceMark, excludeFields, [], - ide().activeTextEditor!, + spyIde.activeTextEditor!, spyIde, marks, undefined, diff --git a/src/ide/vscode/VscodeTextDocumentImpl.ts b/src/ide/vscode/VscodeTextDocumentImpl.ts index f0fbcb4750..c4e85b5fb7 100644 --- a/src/ide/vscode/VscodeTextDocumentImpl.ts +++ b/src/ide/vscode/VscodeTextDocumentImpl.ts @@ -55,7 +55,7 @@ export default class VscodeTextDocumentImpl implements TextDocument { return fromVscodePosition(this.document.positionAt(offset)); } - getText(range?: Range | undefined): string { + getText(range?: Range): string { return this.document.getText( range != null ? toVscodeRange(range) : undefined, ); diff --git a/src/util/nodeSelectors.ts b/src/util/nodeSelectors.ts index 9db4007288..bc32ee7362 100644 --- a/src/util/nodeSelectors.ts +++ b/src/util/nodeSelectors.ts @@ -427,13 +427,13 @@ export function getInsertionDelimiter( trailingDelimiterRange: Range | undefined, defaultDelimiterInsertion: string, ) { - const { getText } = editor.document; + const { document } = editor; const delimiters = [ trailingDelimiterRange != null - ? getText(trailingDelimiterRange) + ? document.getText(trailingDelimiterRange) : defaultDelimiterInsertion, leadingDelimiterRange != null - ? getText(leadingDelimiterRange) + ? document.getText(leadingDelimiterRange) : defaultDelimiterInsertion, ]; From bc8658c33016e70758ff48d324bdc2a417f7844c Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 13 Nov 2022 19:31:39 +0100 Subject: [PATCH 26/84] Make sure functions use arrow format --- .../vscode/VscodeEditableTextEditorImpl.ts | 24 +++++++++---------- src/ide/vscode/VscodeTextDocumentImpl.ts | 16 ++++++------- src/ide/vscode/VscodeTextEditorImpl.ts | 4 ++-- src/util/nodeSelectors.ts | 6 ++--- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/ide/vscode/VscodeEditableTextEditorImpl.ts b/src/ide/vscode/VscodeEditableTextEditorImpl.ts index 7cdd38d320..a4c1235a06 100644 --- a/src/ide/vscode/VscodeEditableTextEditorImpl.ts +++ b/src/ide/vscode/VscodeEditableTextEditorImpl.ts @@ -39,29 +39,29 @@ export default class VscodeEditableTextEditorImpl this.editor.options = options; } - public revealRange(range: Range): void { + public revealRange = (range: Range): void => { this.editor.revealRange(toVscodeRange(range)); - } + }; - public setDecorations( + public setDecorations = ( decorationType: TextEditorDecorationType, ranges: readonly Range[], - ): void { + ): void => { this.editor.setDecorations(decorationType, ranges.map(toVscodeRange)); - } + }; - public edit( + public edit = ( callback: (editBuilder: TextEditorEdit) => void, options?: { undoStopBefore: boolean; undoStopAfter: boolean }, - ): Thenable { + ): Thenable => { return vscodeEditEditor(this.editor, callback, options); - } + }; - public focus(): Promise { + public focus = (): Promise => { return vscodeFocusEditor(this.editor, this.id); - } + }; - public openLink(location: Position | Range): Promise { + public openLink = (location: Position | Range): Promise => { return vscodeOpenLink(this.editor, toVscodePositionOrRange(location)); - } + }; } diff --git a/src/ide/vscode/VscodeTextDocumentImpl.ts b/src/ide/vscode/VscodeTextDocumentImpl.ts index c4e85b5fb7..b3d44d45a4 100644 --- a/src/ide/vscode/VscodeTextDocumentImpl.ts +++ b/src/ide/vscode/VscodeTextDocumentImpl.ts @@ -37,7 +37,7 @@ export default class VscodeTextDocumentImpl implements TextDocument { constructor(private document: vscode.TextDocument) {} - lineAt(lineOrPosition: number | Position): TextLine { + public lineAt = (lineOrPosition: number | Position): TextLine => { return fromVscodeTextLine( this.document.lineAt( typeof lineOrPosition === "number" @@ -45,19 +45,19 @@ export default class VscodeTextDocumentImpl implements TextDocument { : lineOrPosition.line, ), ); - } + }; - offsetAt(position: Position): number { + public offsetAt = (position: Position): number => { return this.document.offsetAt(toVscodePosition(position)); - } + }; - positionAt(offset: number): Position { + public positionAt = (offset: number): Position => { return fromVscodePosition(this.document.positionAt(offset)); - } + }; - getText(range?: Range): string { + public getText = (range?: Range): string => { return this.document.getText( range != null ? toVscodeRange(range) : undefined, ); - } + }; } diff --git a/src/ide/vscode/VscodeTextEditorImpl.ts b/src/ide/vscode/VscodeTextEditorImpl.ts index a6d077bc36..351ce05f8d 100644 --- a/src/ide/vscode/VscodeTextEditorImpl.ts +++ b/src/ide/vscode/VscodeTextEditorImpl.ts @@ -36,7 +36,7 @@ export default class VscodeTextEditorImpl implements TextEditor { return this.editor.options; } - public isEqual(other: TextEditor): boolean { + public isEqual = (other: TextEditor): boolean => { return this.id === other.id; - } + }; } diff --git a/src/util/nodeSelectors.ts b/src/util/nodeSelectors.ts index bc32ee7362..9db4007288 100644 --- a/src/util/nodeSelectors.ts +++ b/src/util/nodeSelectors.ts @@ -427,13 +427,13 @@ export function getInsertionDelimiter( trailingDelimiterRange: Range | undefined, defaultDelimiterInsertion: string, ) { - const { document } = editor; + const { getText } = editor.document; const delimiters = [ trailingDelimiterRange != null - ? document.getText(trailingDelimiterRange) + ? getText(trailingDelimiterRange) : defaultDelimiterInsertion, leadingDelimiterRange != null - ? document.getText(leadingDelimiterRange) + ? getText(leadingDelimiterRange) : defaultDelimiterInsertion, ]; From f4e746003ae589621c1fd726129d69a60bb6416e Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 13 Nov 2022 20:53:28 +0100 Subject: [PATCH 27/84] Use weak map to keep track of text editors --- src/extension.ts | 7 ++----- src/ide/vscode/VscodeUtil.ts | 10 +++++++--- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 65d38fd533..e2f11490e3 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -2,7 +2,7 @@ import * as vscode from "vscode"; import CommandRunner from "./core/commandRunner/CommandRunner"; import { ThatMark } from "./core/ThatMark"; import VscodeIDE from "./ide/vscode/VscodeIDE"; -import VscodeTextEditorImpl from "./ide/vscode/VscodeTextEditorImpl"; +import { fromVscodeEditor } from "./ide/vscode/VscodeUtil"; import FakeIDE from "./libs/common/ide/fake/FakeIDE"; import ide, { injectIde, @@ -81,10 +81,7 @@ export async function activate( editor: vscode.TextEditor, plainObject: TargetPlainObject, ) => { - return plainObjectToTarget( - new VscodeTextEditorImpl(editor), - plainObject, - ); + return plainObjectToTarget(fromVscodeEditor(editor), plainObject); }, } : undefined, diff --git a/src/ide/vscode/VscodeUtil.ts b/src/ide/vscode/VscodeUtil.ts index a988606a13..c7040599f1 100644 --- a/src/ide/vscode/VscodeUtil.ts +++ b/src/ide/vscode/VscodeUtil.ts @@ -1,7 +1,6 @@ import * as vscode from "vscode"; +import { Range, Selection } from "../../libs/common/ide"; import Position from "../../libs/common/ide/Position"; -import { Range } from "../../libs/common/ide"; -import { Selection } from "../../libs/common/ide"; import { EndOfLine } from "../../libs/common/ide/types/ide.types"; import TextDocument from "../../libs/common/ide/types/TextDocument"; import { TextEditor } from "../../libs/common/ide/types/TextEditor"; @@ -10,6 +9,8 @@ import VscodeTextDocumentImpl from "./VscodeTextDocumentImpl"; import VscodeTextEditorImpl from "./VscodeTextEditorImpl"; import VscodeTextLineImpl from "./VscodeTextLineImpl"; +const editorMap = new WeakMap(); + export function toVscodeRange(range: Range): vscode.Range { return new vscode.Range( range.start.line, @@ -91,7 +92,10 @@ export function fromVscodeAndOfLine(eol: vscode.EndOfLine): EndOfLine { } export function fromVscodeEditor(editor: vscode.TextEditor): TextEditor { - return new VscodeTextEditorImpl(editor); + if (!editorMap.has(editor)) { + editorMap.set(editor, new VscodeTextEditorImpl(editor)); + } + return editorMap.get(editor)!; } export function toVscodeEditor(editor: TextEditor): vscode.TextEditor { From 406cb092d2a4d7fd4ec13d913174dece4623ef6f Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 13 Nov 2022 20:55:25 +0100 Subject: [PATCH 28/84] cleanup --- .eslintrc.json | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 0286bf80cf..b928e85a3c 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -48,13 +48,7 @@ } ], "no-throw-literal": "warn", - "semi": "off", - "no-restricted-properties": [ - 2, - { - "property": "activeTextEditor TODO: " - } - ] + "semi": "off" }, "ignorePatterns": ["**/vendor/**/*.ts", "**/vendor/**/*.js"] } From 9fd624fe1043e74f17c016dfea49d925c2b7da1b Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Mon, 14 Nov 2022 08:51:19 +0100 Subject: [PATCH 29/84] empty From a935f5a4459ececfe413128c3e4d4a6ccb7e1bd8 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Mon, 14 Nov 2022 09:22:31 +0100 Subject: [PATCH 30/84] use arrow functions --- src/ide/vscode/VscodeTextDocumentImpl.ts | 6 +- src/libs/common/ide/Position.ts | 35 +- src/libs/common/ide/Range.ts | 24 +- yarn.lock | 470 +++++++++++------------ 4 files changed, 268 insertions(+), 267 deletions(-) diff --git a/src/ide/vscode/VscodeTextDocumentImpl.ts b/src/ide/vscode/VscodeTextDocumentImpl.ts index b3d44d45a4..2abb03aee1 100644 --- a/src/ide/vscode/VscodeTextDocumentImpl.ts +++ b/src/ide/vscode/VscodeTextDocumentImpl.ts @@ -29,10 +29,8 @@ export default class VscodeTextDocumentImpl implements TextDocument { } get range(): Range { - return new Range( - new Position(0, 0), - this.document.lineAt(this.document.lineCount - 1).range.end, - ); + const { end } = this.document.lineAt(this.document.lineCount - 1).range; + return new Range(0, 0, end.line, end.character); } constructor(private document: vscode.TextDocument) {} diff --git a/src/libs/common/ide/Position.ts b/src/libs/common/ide/Position.ts index 224ec86e1d..47315fecde 100644 --- a/src/libs/common/ide/Position.ts +++ b/src/libs/common/ide/Position.ts @@ -25,9 +25,9 @@ export default class Position { * @return `true` if the line and character of the given position are equal to * the line and character of this position. */ - public isEqual(other: Position): boolean { + public isEqual = (other: Position): boolean => { return this.line === other.line && this.character === other.character; - } + }; /** * Check if this position is before `other`. @@ -36,7 +36,7 @@ export default class Position { * @return `true` if position is on a smaller line * or on the same line on a smaller character. */ - public isBefore(other: Position): boolean { + public isBefore = (other: Position): boolean => { if (this.line < other.line) { return true; } @@ -44,7 +44,7 @@ export default class Position { return false; } return this.character < other.character; - } + }; /** * Check if this position is after `other`. @@ -53,7 +53,7 @@ export default class Position { * @return `true` if position is on a greater line * or on the same line on a greater character. */ - public isAfter(other: Position): boolean { + public isAfter = (other: Position): boolean => { if (this.line > other.line) { return true; } @@ -61,7 +61,7 @@ export default class Position { return false; } return this.character > other.character; - } + }; /** * Check if this position is before or equal to `other`. @@ -70,9 +70,9 @@ export default class Position { * @return `true` if position is on a smaller line * or on the same line on a smaller or equal character. */ - public isBeforeOrEqual(other: Position): boolean { + public isBeforeOrEqual = (other: Position): boolean => { return this.isEqual(other) || this.isBefore(other); - } + }; /** * Check if this position is after or equal to `other`. @@ -81,9 +81,9 @@ export default class Position { * @return `true` if position is on a greater line * or on the same line on a greater or equal character. */ - public isAfterOrEqual(other: Position): boolean { + public isAfterOrEqual = (other: Position): boolean => { return this.isEqual(other) || this.isAfter(other); - } + }; /** * Compare this to `other`. @@ -93,7 +93,7 @@ export default class Position { * a number greater than zero if this position is after the given position, or zero when * this and the given position are equal. */ - public compareTo(other: Position): number { + public compareTo = (other: Position): number => { if (this.isBefore(other)) { return -1; } @@ -101,7 +101,7 @@ export default class Position { return 1; } return 0; - } + }; /** * Create a new position derived from this position. @@ -110,9 +110,9 @@ export default class Position { * @param character Value that should be used as character value, default is the {@link Position.character existing value} * @return A position where line and character are replaced by the given values. */ - public with(line?: number, character?: number): Position { + public with = (line?: number, character?: number): Position => { return new Position(line ?? this.line, character ?? this.character); - } + }; /** * Create a new position relative to this position. @@ -122,10 +122,13 @@ export default class Position { * @return A position which line and character is the sum of the current line and * character and the corresponding deltas. */ - public translate(lineDelta?: number, characterDelta?: number): Position { + public translate = ( + lineDelta?: number, + characterDelta?: number, + ): Position => { return new Position( this.line + (lineDelta ?? 0), this.character + (characterDelta ?? 0), ); - } + }; } diff --git a/src/libs/common/ide/Range.ts b/src/libs/common/ide/Range.ts index eaadf59937..0ac9805854 100644 --- a/src/libs/common/ide/Range.ts +++ b/src/libs/common/ide/Range.ts @@ -90,9 +90,9 @@ export default class Range { * @return `true` when start and end are {@link Position.isEqual equal} to * start and end of this range. */ - public isEqual(other: Range): boolean { + public isEqual = (other: Range): boolean => { return this.start.isEqual(other.start) && this.end.isEqual(other.end); - } + }; /** * Check if a position or a range is contained in this range. @@ -101,13 +101,13 @@ export default class Range { * @return `true` if the position or range is inside or equal * to this range. */ - public contains(positionOrRange: Position | Range): boolean { + public contains = (positionOrRange: Position | Range): boolean => { const [start, end] = "line" in positionOrRange ? [positionOrRange, positionOrRange] : [positionOrRange.start, positionOrRange.end]; return start.isAfterOrEqual(this.start) && end.isBeforeOrEqual(this.end); - } + }; /** * Intersect `range` with this range and returns a new range or `undefined` @@ -117,11 +117,11 @@ export default class Range { * @return A range of the greater start and smaller end positions. Will * return undefined when there is no overlap. */ - public intersection(other: Range): Range | undefined { + public intersection = (other: Range): Range | undefined => { const start = this.start.isAfter(other.start) ? this.start : other.start; const end = this.end.isBefore(other.end) ? this.end : other.end; return start.isBeforeOrEqual(end) ? new Range(start, end) : undefined; - } + }; /** * Compute the union of `other` with this range. @@ -129,12 +129,12 @@ export default class Range { * @param other A range. * @return A range of smaller start position and the greater end position. */ - public union(other: Range): Range { + public union = (other: Range): Range => { return new Range( this.start.isBefore(other.start) ? this.start : other.start, this.end.isAfter(other.end) ? this.end : other.end, ); - } + }; /** * Derived a new range from this range. @@ -144,18 +144,18 @@ export default class Range { * @return A range derived from this range with the given start and end position. * If start and end are not different `this` range will be returned. */ - public with(start?: Position, end?: Position): Range { + public with = (start?: Position, end?: Position): Range => { return new Range(start ?? this.start, end ?? this.end); - } + }; /** * Construct a new selection from this range * @param isReversed If true active is before anchor * @returns A new selection */ - public toSelection(isReversed: boolean): Selection { + public toSelection = (isReversed: boolean): Selection => { return isReversed ? new Selection(this.end, this.start) : new Selection(this.start, this.end); - } + }; } diff --git a/yarn.lock b/yarn.lock index 468503f7db..1d9821411c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,19 +9,19 @@ dependencies: "regenerator-runtime" "^0.13.10" -"@eslint/eslintrc@^1.2.3": - "integrity" "sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA==" - "resolved" "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.3.tgz" - "version" "1.2.3" +"@eslint/eslintrc@^1.2.1": + "integrity" "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==" + "resolved" "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz" + "version" "1.2.1" dependencies: "ajv" "^6.12.4" "debug" "^4.3.2" - "espree" "^9.3.2" + "espree" "^9.3.1" "globals" "^13.9.0" "ignore" "^5.2.0" "import-fresh" "^3.2.1" "js-yaml" "^4.1.0" - "minimatch" "^3.1.2" + "minimatch" "^3.0.4" "strip-json-comments" "^3.1.1" "@humanwhocodes/config-array@^0.9.2": @@ -66,7 +66,7 @@ dependencies: "type-detect" "4.0.8" -"@sinonjs/fake-timers@^7.1.0", "@sinonjs/fake-timers@>=5": +"@sinonjs/fake-timers@^7.1.2", "@sinonjs/fake-timers@>=5": "integrity" "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==" "resolved" "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz" "version" "7.1.2" @@ -98,17 +98,17 @@ "version" "4.3.3" "@types/glob@^7.1.3": - "integrity" "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==" - "resolved" "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz" - "version" "7.1.3" + "integrity" "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==" + "resolved" "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz" + "version" "7.2.0" dependencies: "@types/minimatch" "*" "@types/node" "*" "@types/js-yaml@^4.0.2": - "integrity" "sha512-KbeHS/Y4R+k+5sWXEYzAZKuB1yQlZtEghuhRxrVRLaqhtoG5+26JwQsa4HyS3AWX8v1Uwukma5HheduUDskasA==" - "resolved" "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.2.tgz" - "version" "4.0.2" + "integrity" "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==" + "resolved" "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz" + "version" "4.0.5" "@types/json-schema@^7.0.9": "integrity" "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" @@ -121,9 +121,9 @@ "version" "0.0.29" "@types/lodash@^4.14.168": - "integrity" "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==" - "resolved" "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz" - "version" "4.14.168" + "integrity" "sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag==" + "resolved" "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.181.tgz" + "version" "4.14.181" "@types/minimatch@*": "integrity" "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" @@ -131,14 +131,14 @@ "version" "3.0.5" "@types/mocha@^8.0.4": - "integrity" "sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ==" - "resolved" "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.0.tgz" - "version" "8.2.0" + "integrity" "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==" + "resolved" "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz" + "version" "8.2.3" "@types/node@*", "@types/node@^16.11.3": - "integrity" "sha512-aIYL9Eemcecs1y77XzFGiSc+FdfN58k4J23UEe6+hynf4Wd9g4DzQPwIKL080vSMuubFqy2hWwOzCtJdc6vFKw==" - "resolved" "https://registry.npmjs.org/@types/node/-/node-16.11.3.tgz" - "version" "16.11.3" + "integrity" "sha512-GZ7bu5A6+4DtG7q9GsoHXy3ALcgeIHP4NnL0Vv2wu0uUB/yQex26v0tf6/na1mm0+bS9Uw+0DFex7aaKr2qawQ==" + "resolved" "https://registry.npmjs.org/@types/node/-/node-16.11.26.tgz" + "version" "16.11.26" "@types/semver@^7.3.9": "integrity" "sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ==" @@ -146,11 +146,16 @@ "version" "7.3.9" "@types/sinon@^10.0.2": - "integrity" "sha512-BHn8Bpkapj8Wdfxvh2jWIUoaYB/9/XhsL0oOvBfRagJtKlSl9NWPcFOz2lRukI9szwGxFtYZCTejJSqsGDbdmw==" - "resolved" "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.2.tgz" - "version" "10.0.2" + "integrity" "sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g==" + "resolved" "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.11.tgz" + "version" "10.0.11" dependencies: - "@sinonjs/fake-timers" "^7.1.0" + "@types/sinonjs__fake-timers" "*" + +"@types/sinonjs__fake-timers@*": + "integrity" "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==" + "resolved" "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz" + "version" "8.1.2" "@types/uuid@^8.3.4": "integrity" "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" @@ -163,13 +168,13 @@ "version" "1.61.0" "@typescript-eslint/eslint-plugin@^5.20.0": - "integrity" "sha512-hEcSmG4XodSLiAp1uxv/OQSGsDY6QN3TcRU32gANp+19wGE1QQZLRS8/GV58VRUoXhnkuJ3ZxNQ3T6Z6zM59DA==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.23.0.tgz" - "version" "5.23.0" + "integrity" "sha512-fapGzoxilCn3sBtC6NtXZX6+P/Hef7VDbyfGqTTpzYydwhlkevB+0vE0EnmHPVTVSy68GUncyJ/2PcrFBeCo5Q==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.20.0.tgz" + "version" "5.20.0" dependencies: - "@typescript-eslint/scope-manager" "5.23.0" - "@typescript-eslint/type-utils" "5.23.0" - "@typescript-eslint/utils" "5.23.0" + "@typescript-eslint/scope-manager" "5.20.0" + "@typescript-eslint/type-utils" "5.20.0" + "@typescript-eslint/utils" "5.20.0" "debug" "^4.3.2" "functional-red-black-tree" "^1.0.1" "ignore" "^5.1.8" @@ -178,68 +183,68 @@ "tsutils" "^3.21.0" "@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.20.0": - "integrity" "sha512-V06cYUkqcGqpFjb8ttVgzNF53tgbB/KoQT/iB++DOIExKmzI9vBJKjZKt/6FuV9c+zrDsvJKbJ2DOCYwX91cbw==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.23.0.tgz" - "version" "5.23.0" + "integrity" "sha512-UWKibrCZQCYvobmu3/N8TWbEeo/EPQbS41Ux1F9XqPzGuV7pfg6n50ZrFo6hryynD8qOTTfLHtHjjdQtxJ0h/w==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.20.0.tgz" + "version" "5.20.0" dependencies: - "@typescript-eslint/scope-manager" "5.23.0" - "@typescript-eslint/types" "5.23.0" - "@typescript-eslint/typescript-estree" "5.23.0" + "@typescript-eslint/scope-manager" "5.20.0" + "@typescript-eslint/types" "5.20.0" + "@typescript-eslint/typescript-estree" "5.20.0" "debug" "^4.3.2" -"@typescript-eslint/scope-manager@5.23.0": - "integrity" "sha512-EhjaFELQHCRb5wTwlGsNMvzK9b8Oco4aYNleeDlNuL6qXWDF47ch4EhVNPh8Rdhf9tmqbN4sWDk/8g+Z/J8JVw==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.23.0.tgz" - "version" "5.23.0" +"@typescript-eslint/scope-manager@5.20.0": + "integrity" "sha512-h9KtuPZ4D/JuX7rpp1iKg3zOH0WNEa+ZIXwpW/KWmEFDxlA/HSfCMhiyF1HS/drTICjIbpA6OqkAhrP/zkCStg==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.20.0.tgz" + "version" "5.20.0" dependencies: - "@typescript-eslint/types" "5.23.0" - "@typescript-eslint/visitor-keys" "5.23.0" + "@typescript-eslint/types" "5.20.0" + "@typescript-eslint/visitor-keys" "5.20.0" -"@typescript-eslint/type-utils@5.23.0": - "integrity" "sha512-iuI05JsJl/SUnOTXA9f4oI+/4qS/Zcgk+s2ir+lRmXI+80D8GaGwoUqs4p+X+4AxDolPpEpVUdlEH4ADxFy4gw==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.23.0.tgz" - "version" "5.23.0" +"@typescript-eslint/type-utils@5.20.0": + "integrity" "sha512-WxNrCwYB3N/m8ceyoGCgbLmuZwupvzN0rE8NBuwnl7APgjv24ZJIjkNzoFBXPRCGzLNkoU/WfanW0exvp/+3Iw==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.20.0.tgz" + "version" "5.20.0" dependencies: - "@typescript-eslint/utils" "5.23.0" + "@typescript-eslint/utils" "5.20.0" "debug" "^4.3.2" "tsutils" "^3.21.0" -"@typescript-eslint/types@5.23.0": - "integrity" "sha512-NfBsV/h4dir/8mJwdZz7JFibaKC3E/QdeMEDJhiAE3/eMkoniZ7MjbEMCGXw6MZnZDMN3G9S0mH/6WUIj91dmw==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.23.0.tgz" - "version" "5.23.0" +"@typescript-eslint/types@5.20.0": + "integrity" "sha512-+d8wprF9GyvPwtoB4CxBAR/s0rpP25XKgnOvMf/gMXYDvlUC3rPFHupdTQ/ow9vn7UDe5rX02ovGYQbv/IUCbg==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.20.0.tgz" + "version" "5.20.0" -"@typescript-eslint/typescript-estree@5.23.0": - "integrity" "sha512-xE9e0lrHhI647SlGMl+m+3E3CKPF1wzvvOEWnuE3CCjjT7UiRnDGJxmAcVKJIlFgK6DY9RB98eLr1OPigPEOGg==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.23.0.tgz" - "version" "5.23.0" +"@typescript-eslint/typescript-estree@5.20.0": + "integrity" "sha512-36xLjP/+bXusLMrT9fMMYy1KJAGgHhlER2TqpUVDYUQg4w0q/NW/sg4UGAgVwAqb8V4zYg43KMUpM8vV2lve6w==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.20.0.tgz" + "version" "5.20.0" dependencies: - "@typescript-eslint/types" "5.23.0" - "@typescript-eslint/visitor-keys" "5.23.0" + "@typescript-eslint/types" "5.20.0" + "@typescript-eslint/visitor-keys" "5.20.0" "debug" "^4.3.2" "globby" "^11.0.4" "is-glob" "^4.0.3" "semver" "^7.3.5" "tsutils" "^3.21.0" -"@typescript-eslint/utils@5.23.0": - "integrity" "sha512-dbgaKN21drqpkbbedGMNPCtRPZo1IOUr5EI9Jrrh99r5UW5Q0dz46RKXeSBoPV+56R6dFKpbrdhgUNSJsDDRZA==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.23.0.tgz" - "version" "5.23.0" +"@typescript-eslint/utils@5.20.0": + "integrity" "sha512-lHONGJL1LIO12Ujyx8L8xKbwWSkoUKFSO+0wDAqGXiudWB2EO7WEUT+YZLtVbmOmSllAjLb9tpoIPwpRe5Tn6w==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.20.0.tgz" + "version" "5.20.0" dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.23.0" - "@typescript-eslint/types" "5.23.0" - "@typescript-eslint/typescript-estree" "5.23.0" + "@typescript-eslint/scope-manager" "5.20.0" + "@typescript-eslint/types" "5.20.0" + "@typescript-eslint/typescript-estree" "5.20.0" "eslint-scope" "^5.1.1" "eslint-utils" "^3.0.0" -"@typescript-eslint/visitor-keys@5.23.0": - "integrity" "sha512-Vd4mFNchU62sJB8pX19ZSPog05B0Y0CE2UxAZPT5k4iqhRYjPnqyY3woMxCd0++t9OTqkgjST+1ydLBi7e2Fvg==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.23.0.tgz" - "version" "5.23.0" +"@typescript-eslint/visitor-keys@5.20.0": + "integrity" "sha512-1flRpNF+0CAQkMNlTJ6L/Z5jiODG/e5+7mk6XwtPOUS3UrTz3UOiAg9jG2VtKsWI6rZQfy4C6a232QNRZTRGlg==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.20.0.tgz" + "version" "5.20.0" dependencies: - "@typescript-eslint/types" "5.23.0" + "@typescript-eslint/types" "5.20.0" "eslint-visitor-keys" "^3.0.0" "@ungap/promise-all-settled@1.1.2": @@ -248,9 +253,9 @@ "version" "1.1.2" "@vscode/test-electron@^2.1.3": - "integrity" "sha512-O/ioqFpV+RvKbRykX2ItYPnbcZ4Hk5V0rY4uhQjQTLhGL9WZUvS7exzuYQCCI+ilSqJpctvxq2llTfGXf9UnnA==" - "resolved" "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.1.5.tgz" - "version" "2.1.5" + "integrity" "sha512-tHHAWNVwl8C7nyezHAHdNPWkksdXWvmae6bt4k1tJ9hvMm6QIIk95Mkutl82XHcD60mdP46EHDGU+xFsAvygOQ==" + "resolved" "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.1.4.tgz" + "version" "2.1.4" dependencies: "http-proxy-agent" "^4.0.1" "https-proxy-agent" "^5.0.0" @@ -262,15 +267,15 @@ "resolved" "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" "version" "1.1.1" -"acorn-jsx@^5.3.2": +"acorn-jsx@^5.3.1": "integrity" "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" "resolved" "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" "version" "5.3.2" -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^8.7.1": - "integrity" "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" - "resolved" "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz" - "version" "8.7.1" +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^8.7.0": + "integrity" "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" + "resolved" "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz" + "version" "8.7.0" "agent-base@6": "integrity" "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==" @@ -294,15 +299,20 @@ "resolved" "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" "version" "4.1.1" -"ansi-regex@^0.2.0", "ansi-regex@^0.2.1": - "integrity" "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=" +"ansi-regex@^0.2.0": + "integrity" "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" + "version" "0.2.1" + +"ansi-regex@^0.2.1": + "integrity" "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==" "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" "version" "0.2.1" "ansi-regex@^3.0.0": - "integrity" "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz" - "version" "3.0.0" + "integrity" "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" + "version" "3.0.1" "ansi-regex@^5.0.1": "integrity" "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" @@ -310,7 +320,7 @@ "version" "5.0.1" "ansi-styles@^1.1.0": - "integrity" "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=" + "integrity" "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94= sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==" "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz" "version" "1.1.0" @@ -321,14 +331,7 @@ dependencies: "color-convert" "^1.9.0" -"ansi-styles@^4.0.0": - "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - "version" "4.3.0" - dependencies: - "color-convert" "^2.0.1" - -"ansi-styles@^4.1.0": +"ansi-styles@^4.0.0", "ansi-styles@^4.1.0": "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" "version" "4.3.0" @@ -354,7 +357,7 @@ "version" "2.1.0" "asap@^2.0.0": - "integrity" "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + "integrity" "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" "resolved" "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" "version" "2.0.6" @@ -386,7 +389,7 @@ "version" "2.2.0" "binary@~0.3.0": - "integrity" "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=" + "integrity" "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==" "resolved" "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz" "version" "0.3.0" dependencies: @@ -394,12 +397,12 @@ "chainsaw" "~0.1.0" "bluebird@~3.4.1": - "integrity" "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" + "integrity" "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM= sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" "resolved" "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz" "version" "3.4.7" "boolbase@^1.0.0": - "integrity" "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + "integrity" "sha1-aN/1++YMUes3cl6p4+0xDcwed24= sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" "resolved" "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" "version" "1.0.0" @@ -429,7 +432,7 @@ "version" "1.0.2" "buffers@~0.1.1": - "integrity" "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" + "integrity" "sha1-skV5w77U1tOWru5tmorn9Ugqt7s= sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==" "resolved" "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" "version" "0.1.1" @@ -457,7 +460,7 @@ "type-detect" "^4.0.5" "chainsaw@~0.1.0": - "integrity" "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=" + "integrity" "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==" "resolved" "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz" "version" "0.1.0" dependencies: @@ -481,7 +484,7 @@ "supports-color" "^7.1.0" "chalk@~0.5.1": - "integrity" "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=" + "integrity" "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ= sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==" "resolved" "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz" "version" "0.5.1" dependencies: @@ -540,12 +543,12 @@ "version" "1.1.4" "color-name@1.1.3": - "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" "version" "1.1.3" "concat-map@0.0.1": - "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" "version" "0.0.1" @@ -580,9 +583,9 @@ "version" "6.1.0" "debug@^4.1.1", "debug@^4.3.2", "debug@4": - "integrity" "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==" - "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz" - "version" "4.3.3" + "integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==" + "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + "version" "4.3.4" dependencies: "ms" "2.1.2" @@ -594,7 +597,7 @@ "ms" "2.1.2" "debuglog@^1.0.1": - "integrity" "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=" + "integrity" "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==" "resolved" "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz" "version" "1.0.1" @@ -616,7 +619,7 @@ "version" "0.1.4" "dezalgo@^1.0.0": - "integrity" "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=" + "integrity" "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= sha512-K7i4zNfT2kgQz3GylDw40ot9GAE47sFZ9EXHFSPP6zONLgH6kWXE0KWJchkbQJLBkRazq4APwZ4OwiFFlT95OQ==" "resolved" "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz" "version" "1.0.3" dependencies: @@ -673,7 +676,7 @@ "domhandler" "^4.2.0" "duplexer2@~0.1.4": - "integrity" "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=" + "integrity" "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==" "resolved" "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz" "version" "0.1.4" dependencies: @@ -690,26 +693,26 @@ "version" "2.2.0" "esbuild@^0.11.12": - "integrity" "sha512-c8cso/1RwVj+fbDvLtUgSG4ZJQ0y9Zdrl6Ot/GAjyy4pdMCHaFnDMts5gqFnWRPLajWtEnI+3hlET4R9fVoZng==" - "resolved" "https://registry.npmjs.org/esbuild/-/esbuild-0.11.12.tgz" - "version" "0.11.12" + "integrity" "sha512-iaiZZ9vUF5wJV8ob1tl+5aJTrwDczlvGP0JoMmnpC2B0ppiMCu8n8gmy5ZTGl5bcG081XBVn+U+jP+mPFm5T5Q==" + "resolved" "https://registry.npmjs.org/esbuild/-/esbuild-0.11.23.tgz" + "version" "0.11.23" "escalade@^3.1.1": "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" "version" "3.1.1" -"escape-string-regexp@^1.0.0", "escape-string-regexp@^1.0.5": - "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" +"escape-string-regexp@^1.0.0": + "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" "version" "1.0.5" -"escape-string-regexp@^4.0.0": - "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - "version" "4.0.0" +"escape-string-regexp@^1.0.5": + "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + "version" "1.0.5" -"escape-string-regexp@4.0.0": +"escape-string-regexp@^4.0.0", "escape-string-regexp@4.0.0": "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" "version" "4.0.0" @@ -753,11 +756,11 @@ "version" "3.3.0" "eslint@*", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^8.13.0", "eslint@>=5", "eslint@>=7.0.0": - "integrity" "sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==" - "resolved" "https://registry.npmjs.org/eslint/-/eslint-8.15.0.tgz" - "version" "8.15.0" + "integrity" "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==" + "resolved" "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz" + "version" "8.13.0" dependencies: - "@eslint/eslintrc" "^1.2.3" + "@eslint/eslintrc" "^1.2.1" "@humanwhocodes/config-array" "^0.9.2" "ajv" "^6.10.0" "chalk" "^4.0.0" @@ -768,7 +771,7 @@ "eslint-scope" "^7.1.1" "eslint-utils" "^3.0.0" "eslint-visitor-keys" "^3.3.0" - "espree" "^9.3.2" + "espree" "^9.3.1" "esquery" "^1.4.0" "esutils" "^2.0.2" "fast-deep-equal" "^3.1.3" @@ -784,7 +787,7 @@ "json-stable-stringify-without-jsonify" "^1.0.1" "levn" "^0.4.1" "lodash.merge" "^4.6.2" - "minimatch" "^3.1.2" + "minimatch" "^3.0.4" "natural-compare" "^1.4.0" "optionator" "^0.9.1" "regexpp" "^3.2.0" @@ -793,13 +796,13 @@ "text-table" "^0.2.0" "v8-compile-cache" "^2.0.3" -"espree@^9.3.2": - "integrity" "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==" - "resolved" "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz" - "version" "9.3.2" +"espree@^9.3.1": + "integrity" "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==" + "resolved" "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz" + "version" "9.3.1" dependencies: - "acorn" "^8.7.1" - "acorn-jsx" "^5.3.2" + "acorn" "^8.7.0" + "acorn-jsx" "^5.3.1" "eslint-visitor-keys" "^3.3.0" "esquery@^1.4.0": @@ -858,16 +861,16 @@ "version" "2.1.0" "fast-levenshtein@^2.0.6": - "integrity" "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + "integrity" "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" "resolved" "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" "version" "2.0.6" "fast-xml-parser@^3.20.0": - "integrity" "sha512-cMQwDJYVDjMPU56DviszewgMKuNzuf4NQSBuDf9RgZ6FKm5QEMxW05Za8lvnuL6moxoeZVUWBlL733WmovvV6g==" - "resolved" "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.20.0.tgz" - "version" "3.20.0" + "integrity" "sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg==" + "resolved" "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz" + "version" "3.21.1" dependencies: - "strnum" "^1.0.3" + "strnum" "^1.0.4" "fastq@^1.6.0": "integrity" "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==" @@ -917,7 +920,7 @@ "version" "3.2.5" "fs.realpath@^1.0.0": - "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8= sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" "version" "1.0.0" @@ -932,7 +935,7 @@ "rimraf" "2" "functional-red-black-tree@^1.0.1": - "integrity" "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + "integrity" "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" "resolved" "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" "version" "1.0.1" @@ -947,16 +950,16 @@ "version" "2.0.0" "github-url-from-git@^1.3.0": - "integrity" "sha1-+YX+3MCpqledyI16/waNVcxiUaA=" + "integrity" "sha1-+YX+3MCpqledyI16/waNVcxiUaA= sha512-WWOec4aRI7YAykQ9+BHmzjyNlkfJFG8QLXnDTsLz/kZefq7qkzdfo4p6fkYYMIq1aj+gZcQs/1HQhQh3DPPxlQ==" "resolved" "https://registry.npmjs.org/github-url-from-git/-/github-url-from-git-1.5.0.tgz" "version" "1.5.0" "github-url-from-username-repo@^1.0.0": - "integrity" "sha1-fdeTMNKr5pwQws73lxTJchV5Hfo=" + "integrity" "sha1-fdeTMNKr5pwQws73lxTJchV5Hfo= sha512-Tj8CQqRoFVTglGdQ8FQmfq8gOOoOYZX7tnOKP8jq8Hdz2OTDhxvtlkLAbrqMYZ7X/YdaYQoUG1IBWxISBfqZ+Q==" "resolved" "https://registry.npmjs.org/github-url-from-username-repo/-/github-url-from-username-repo-1.0.2.tgz" "version" "1.0.2" -"glob-parent@^5.1.2", "glob-parent@~5.1.0": +"glob-parent@^5.1.2": "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" "version" "5.1.2" @@ -970,8 +973,15 @@ dependencies: "is-glob" "^4.0.3" +"glob-parent@~5.1.0": + "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" + "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + "version" "5.1.2" + dependencies: + "is-glob" "^4.0.1" + "glob@^5.0.3": - "integrity" "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=" + "integrity" "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==" "resolved" "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" "version" "5.0.15" dependencies: @@ -982,9 +992,9 @@ "path-is-absolute" "^1.0.0" "glob@^7.1.3", "glob@^7.1.7": - "integrity" "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==" - "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" - "version" "7.1.7" + "integrity" "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==" + "resolved" "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" + "version" "7.2.0" dependencies: "fs.realpath" "^1.0.0" "inflight" "^1.0.4" @@ -1006,9 +1016,9 @@ "path-is-absolute" "^1.0.0" "globals@^13.6.0", "globals@^13.9.0": - "integrity" "sha512-ERO68sOYwm5UuLvSJTY7w7NP2c8S4UcXs3X1GBX8cwOr+ShOcDBbCY5mH4zxz0jsYCdJ8ve8Mv9n2YGJMB1aeg==" - "resolved" "https://registry.npmjs.org/globals/-/globals-13.14.0.tgz" - "version" "13.14.0" + "integrity" "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==" + "resolved" "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz" + "version" "13.13.0" dependencies: "type-fest" "^0.20.2" @@ -1025,14 +1035,14 @@ "slash" "^3.0.0" "graceful-fs@^4.1.2": - "integrity" "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" - "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz" - "version" "4.2.9" + "integrity" "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + "version" "4.2.10" "graceful-fs@^4.2.2": - "integrity" "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" - "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz" - "version" "4.2.9" + "integrity" "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + "version" "4.2.10" "graceful-fs@2 || 3": "integrity" "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==" @@ -1047,14 +1057,14 @@ "version" "1.10.5" "has-ansi@^0.1.0": - "integrity" "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=" + "integrity" "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4= sha512-1YsTg1fk2/6JToQhtZkArMkurq8UoWU1Qe0aR3VUHjgij4nOylSWLWAtBXoZ4/dXOmugfLGm1c+QhuD0JyedFA==" "resolved" "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz" "version" "0.1.0" dependencies: "ansi-regex" "^0.2.0" "has-flag@^3.0.0": - "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0= sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" "version" "3.0.0" @@ -1109,12 +1119,12 @@ "resolve-from" "^4.0.0" "imurmurhash@^0.1.4": - "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o= sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" "version" "0.1.4" "inflight@^1.0.4": - "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" + "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==" "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" "version" "1.0.6" dependencies: @@ -1134,12 +1144,12 @@ "binary-extensions" "^2.0.0" "is-extglob@^2.1.1": - "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" "version" "2.1.1" "is-fullwidth-code-point@^2.0.0": - "integrity" "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity" "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==" "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" "version" "2.0.0" @@ -1166,17 +1176,17 @@ "version" "2.1.0" "isarray@~1.0.0": - "integrity" "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity" "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" "version" "1.0.0" "isarray@0.0.1": - "integrity" "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "integrity" "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" "resolved" "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" "version" "0.0.1" "isexe@^2.0.0": - "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" "version" "2.0.0" @@ -1188,12 +1198,12 @@ "@babel/runtime" "^7.15.4" "jju@^1.1.0": - "integrity" "sha1-o6vicYryQaKykE+EpiWXDzia4yo=" + "integrity" "sha1-o6vicYryQaKykE+EpiWXDzia4yo= sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" "resolved" "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz" "version" "1.4.0" "jquery-extend@~2.0.3": - "integrity" "sha1-aBXNsBqGbdujDm9ND8X7ZnknJzU=" + "integrity" "sha1-aBXNsBqGbdujDm9ND8X7ZnknJzU= sha512-ysLU6/m8VLckIjAudiE+s7YAoYwklZy5Ft9kqO7FPkqaQrd3wUMuZ134G3uniysW8VZME/pGa2LcynsM4TjP5Q==" "resolved" "https://registry.npmjs.org/jquery-extend/-/jquery-extend-2.0.3.tgz" "version" "2.0.3" @@ -1212,7 +1222,7 @@ "argparse" "^2.0.1" "json-parse-helpfulerror@^1.0.2": - "integrity" "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=" + "integrity" "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w= sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==" "resolved" "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz" "version" "1.0.3" dependencies: @@ -1224,7 +1234,7 @@ "version" "0.4.1" "json-stable-stringify-without-jsonify@^1.0.1": - "integrity" "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + "integrity" "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" "resolved" "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" "version" "1.0.1" @@ -1260,7 +1270,7 @@ "treeify" "^1.0.1" "listenercount@~1.0.1": - "integrity" "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" + "integrity" "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" "resolved" "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz" "version" "1.0.1" @@ -1272,7 +1282,7 @@ "p-locate" "^5.0.0" "lodash.get@^4.4.2": - "integrity" "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + "integrity" "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" "resolved" "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" "version" "4.4.2" @@ -1321,13 +1331,6 @@ "picomatch" "^2.3.1" "minimatch@^3.0.4", "minimatch@2 || 3": - "integrity" "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==" - "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz" - "version" "3.0.5" - dependencies: - "brace-expansion" "^1.1.7" - -"minimatch@^3.1.2": "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" "version" "3.1.2" @@ -1341,32 +1344,27 @@ dependencies: "brace-expansion" "^1.1.7" -"minimist@^1.2.0", "minimist@^1.2.5": - "integrity" "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" - "version" "1.2.5" - -"minimist@^1.2.6": +"minimist@^1.2.0", "minimist@^1.2.6": "integrity" "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" "version" "1.2.6" "mkdirp@^0.3.5": - "integrity" "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=" + "integrity" "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc= sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==" "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" "version" "0.3.5" "mkdirp@^0.5.1", "mkdirp@>=0.5 0": - "integrity" "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==" - "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" - "version" "0.5.5" + "integrity" "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==" + "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + "version" "0.5.6" dependencies: - "minimist" "^1.2.5" + "minimist" "^1.2.6" "mocha@^8.1.3": - "integrity" "sha512-TQqyC89V1J/Vxx0DhJIXlq9gbbL9XFNdeLQ1+JsnZsVaSOV1z3tWfw0qZmQJGQRIfkvZcs7snQnZnOCKoldq1Q==" - "resolved" "https://registry.npmjs.org/mocha/-/mocha-8.3.0.tgz" - "version" "8.3.0" + "integrity" "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==" + "resolved" "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz" + "version" "8.4.0" dependencies: "@ungap/promise-all-settled" "1.1.2" "ansi-colors" "4.1.1" @@ -1420,7 +1418,7 @@ "version" "1.1.6" "natural-compare@^1.4.0": - "integrity" "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + "integrity" "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" "resolved" "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" "version" "1.4.0" @@ -1436,39 +1434,39 @@ "path-to-regexp" "^1.7.0" "node-html-parser@^5.3.3": - "integrity" "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==" - "resolved" "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz" - "version" "5.4.2" + "integrity" "sha512-ncg1033CaX9UexbyA7e1N0aAoAYRDiV8jkTvzEnfd1GDvzFdrsXLzR4p4ik8mwLgnaKP/jyUFWDy9q3jvRT2Jw==" + "resolved" "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.3.3.tgz" + "version" "5.3.3" dependencies: "css-select" "^4.2.1" "he" "1.2.0" "nopt-defaults@^0.0.1": - "integrity" "sha1-8VD8yIgjCcv7dhh+Eum8sgaUVYs=" + "integrity" "sha1-8VD8yIgjCcv7dhh+Eum8sgaUVYs= sha512-Ri0fmpCibbSQQX4LoYIvt/MmiA/ivo30tDT1ifdN7/Vh4frHHd/SspJHmlDmrpXflVvoFAPMw4u64eW44Ez0lA==" "resolved" "https://registry.npmjs.org/nopt-defaults/-/nopt-defaults-0.0.1.tgz" "version" "0.0.1" "nopt-usage@^0.1.0": - "integrity" "sha1-sYuMGD4YEEfKnmO3zefPxwLMpXk=" + "integrity" "sha1-sYuMGD4YEEfKnmO3zefPxwLMpXk= sha512-Tg2sISrWBbSsCRqpEMmdxn3KZfacrd0N2NYpZQIq0MHxGHMjwzYlxeB9pVIom/g7CBK28atDUQsTlOfG0wOsNA==" "resolved" "https://registry.npmjs.org/nopt-usage/-/nopt-usage-0.1.0.tgz" "version" "0.1.0" "nopt@^2.2.0": - "integrity" "sha1-KqCbfRdoSHs7ianFqlIzW/8Lrqc=" + "integrity" "sha1-KqCbfRdoSHs7ianFqlIzW/8Lrqc= sha512-gIOTA/uJuhPwFqp+spY7VQ1satbnGlD+iQVZxI18K6hs8Evq4sX81Ml7BB5byP/LsbR2yBVtmvdEmhi7evJ6Aw==" "resolved" "https://registry.npmjs.org/nopt/-/nopt-2.2.1.tgz" "version" "2.2.1" dependencies: "abbrev" "1" "nopt@^3.0.6": - "integrity" "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=" + "integrity" "sha1-xkZdvwirzU2zWTF/eaxopkayj/k= sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==" "resolved" "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" "version" "3.0.6" dependencies: "abbrev" "1" "normalize-package-data@^1.0.0": - "integrity" "sha1-i+lVuJB6+XXxpFhOqLubQUkjEvU=" + "integrity" "sha1-i+lVuJB6+XXxpFhOqLubQUkjEvU= sha512-pyPVJAzFiaioifPIsJBEoKJ9YcPHz7UhckZ7wqhBztLLCu6NozkIDrN+frzrCwjXtfunXfaMWIDtcDhnbO8fWA==" "resolved" "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-1.0.3.tgz" "version" "1.0.3" dependencies: @@ -1497,14 +1495,14 @@ "treeify" "^1.1.0" "nth-check@^2.0.1": - "integrity" "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==" - "resolved" "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" - "version" "2.1.1" + "integrity" "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==" + "resolved" "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz" + "version" "2.0.1" dependencies: "boolbase" "^1.0.0" "once@^1.3.0": - "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" + "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E= sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==" "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" "version" "1.4.0" dependencies: @@ -1549,7 +1547,7 @@ "version" "4.0.0" "path-is-absolute@^1.0.0": - "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18= sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" "version" "1.0.1" @@ -1613,7 +1611,7 @@ "safe-buffer" "^5.1.0" "read-installed@~3.1.3": - "integrity" "sha1-SuNgga/T4iBNwuJ5gHqqUsMMjAw=" + "integrity" "sha1-SuNgga/T4iBNwuJ5gHqqUsMMjAw= sha512-XxD5VDz32T6rLCFfYElTif8/lkqcs9y51Gs2r30rAfT7LUGzJWaXLrwvn6fXkDsTzGcPr7Pj8CggOxwTxl/ozQ==" "resolved" "https://registry.npmjs.org/read-installed/-/read-installed-3.1.5.tgz" "version" "3.1.5" dependencies: @@ -1627,7 +1625,7 @@ "graceful-fs" "2 || 3" "read-package-json@1": - "integrity" "sha1-73nf2kbhZTdu6KV++/7dTRsCm6Q=" + "integrity" "sha1-73nf2kbhZTdu6KV++/7dTRsCm6Q= sha512-9bayCl9cbXy3AL0qXhLQ0vliEgpzUVeLegSOrde3ujTHy2W18UsJiMUXEWkjbBB4ZnJzZPVuo2vAW62j4gY7gg==" "resolved" "https://registry.npmjs.org/read-package-json/-/read-package-json-1.3.3.tgz" "version" "1.3.3" dependencies: @@ -1678,7 +1676,7 @@ "version" "3.2.0" "require-directory@^2.1.1": - "integrity" "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + "integrity" "sha1-jGStX9MNqxyXbiNE/+f3kqam30I= sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" "resolved" "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" "version" "2.1.1" @@ -1729,14 +1727,14 @@ "version" "5.1.2" "semver@^7.3.5", "semver@^7.3.7": - "integrity" "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==" - "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" - "version" "7.3.8" + "integrity" "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==" + "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" + "version" "7.3.7" dependencies: "lru-cache" "^6.0.0" "semver@2 || 3 || 4": - "integrity" "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=" + "integrity" "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= sha512-IrpJ+yoG4EOH8DFWuVg+8H1kW1Oaof0Wxe7cPcXW3x9BjkN/eVo54F15LyqemnDIUYskQWr9qvl/RihmSy6+xQ==" "resolved" "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" "version" "4.3.6" @@ -1748,7 +1746,7 @@ "randombytes" "^2.1.0" "setimmediate@~1.0.4": - "integrity" "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + "integrity" "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" "resolved" "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" "version" "1.0.5" @@ -1765,12 +1763,12 @@ "version" "3.0.0" "sinon@^11.1.1": - "integrity" "sha512-ZSSmlkSyhUWbkF01Z9tEbxZLF/5tRC9eojCdFh33gtQaP7ITQVaMWQHGuFM7Cuf/KEfihuh1tTl3/ABju3AQMg==" - "resolved" "https://registry.npmjs.org/sinon/-/sinon-11.1.1.tgz" - "version" "11.1.1" + "integrity" "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==" + "resolved" "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz" + "version" "11.1.2" dependencies: "@sinonjs/commons" "^1.8.3" - "@sinonjs/fake-timers" "^7.1.0" + "@sinonjs/fake-timers" "^7.1.2" "@sinonjs/samsam" "^6.0.2" "diff" "^5.0.0" "nise" "^5.1.0" @@ -1782,7 +1780,7 @@ "version" "3.0.0" "slide@~1.1.3": - "integrity" "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" + "integrity" "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==" "resolved" "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz" "version" "1.1.6" @@ -1801,7 +1799,16 @@ "is-fullwidth-code-point" "^2.0.0" "strip-ansi" "^4.0.0" -"string-width@^4.1.0", "string-width@^4.2.0": +"string-width@^4.1.0": + "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" + "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + "version" "4.2.3" + dependencies: + "emoji-regex" "^8.0.0" + "is-fullwidth-code-point" "^3.0.0" + "strip-ansi" "^6.0.1" + +"string-width@^4.2.0": "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" "version" "4.2.3" @@ -1811,14 +1818,14 @@ "strip-ansi" "^6.0.1" "strip-ansi@^0.3.0": - "integrity" "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=" + "integrity" "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA= sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==" "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz" "version" "0.3.0" dependencies: "ansi-regex" "^0.2.1" "strip-ansi@^4.0.0": - "integrity" "sha1-qEeQIusaw2iocTibY1JixQXuNo8=" + "integrity" "sha1-qEeQIusaw2iocTibY1JixQXuNo8= sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==" "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" "version" "4.0.0" dependencies: @@ -1832,7 +1839,7 @@ "ansi-regex" "^5.0.1" "strip-bom@^3.0.0": - "integrity" "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + "integrity" "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" "version" "3.0.0" @@ -1841,13 +1848,13 @@ "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" "version" "3.1.1" -"strnum@^1.0.3": +"strnum@^1.0.4": "integrity" "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" "resolved" "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz" "version" "1.0.5" "supports-color@^0.2.0": - "integrity" "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=" + "integrity" "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo= sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==" "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" "version" "0.2.0" @@ -1858,14 +1865,7 @@ dependencies: "has-flag" "^3.0.0" -"supports-color@^7.1.0": - "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - "version" "7.2.0" - dependencies: - "has-flag" "^4.0.0" - -"supports-color@^7.2.0": +"supports-color@^7.1.0", "supports-color@^7.2.0": "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" "version" "7.2.0" @@ -1880,7 +1880,7 @@ "has-flag" "^4.0.0" "text-table@^0.2.0": - "integrity" "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + "integrity" "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" "version" "0.2.0" @@ -1892,7 +1892,7 @@ "is-number" "^7.0.0" "traverse@>=0.3.0 <0.4": - "integrity" "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" + "integrity" "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==" "resolved" "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz" "version" "0.3.9" @@ -1977,12 +1977,12 @@ "punycode" "^2.1.0" "util-deprecate@~1.0.1": - "integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" "version" "1.0.2" "util-extend@^1.0.1": - "integrity" "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=" + "integrity" "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8= sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA==" "resolved" "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz" "version" "1.0.3" @@ -2035,7 +2035,7 @@ "strip-ansi" "^6.0.0" "wrappy@1": - "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" "version" "1.0.2" From 132cad9952a616202c922ee3b9b4c7c7bd5ea904 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Mon, 14 Nov 2022 09:30:29 +0100 Subject: [PATCH 31/84] updated lock file --- yarn.lock | 3670 ++++++++++++++++++++++++++--------------------------- 1 file changed, 1817 insertions(+), 1853 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1d9821411c..8531069d6f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,2081 +3,2045 @@ "@babel/runtime@^7.15.4": - "integrity" "sha512-NDYdls71fTXoU8TZHfbBWg7DiZfNzClcKui/+kyi6ppD2L1qnWW3VV6CjtaBXSUGGhiTWJ6ereOIkUvenif66Q==" - "resolved" "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.0.tgz" - "version" "7.20.0" + version "7.20.0" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.0.tgz" + integrity sha512-NDYdls71fTXoU8TZHfbBWg7DiZfNzClcKui/+kyi6ppD2L1qnWW3VV6CjtaBXSUGGhiTWJ6ereOIkUvenif66Q== dependencies: - "regenerator-runtime" "^0.13.10" + regenerator-runtime "^0.13.10" "@eslint/eslintrc@^1.2.1": - "integrity" "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==" - "resolved" "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz" - "version" "1.2.1" - dependencies: - "ajv" "^6.12.4" - "debug" "^4.3.2" - "espree" "^9.3.1" - "globals" "^13.9.0" - "ignore" "^5.2.0" - "import-fresh" "^3.2.1" - "js-yaml" "^4.1.0" - "minimatch" "^3.0.4" - "strip-json-comments" "^3.1.1" + version "1.2.1" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz" + integrity sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.3.1" + globals "^13.9.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" "@humanwhocodes/config-array@^0.9.2": - "integrity" "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==" - "resolved" "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz" - "version" "0.9.5" + version "0.9.5" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz" + integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== dependencies: "@humanwhocodes/object-schema" "^1.2.1" - "debug" "^4.1.1" - "minimatch" "^3.0.4" + debug "^4.1.1" + minimatch "^3.0.4" "@humanwhocodes/object-schema@^1.2.1": - "integrity" "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" - "resolved" "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" - "version" "1.2.1" + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== "@nodelib/fs.scandir@2.1.5": - "integrity" "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - "version" "2.1.5" + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" - "run-parallel" "^1.1.9" + run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": - "integrity" "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - "version" "2.0.5" +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": - "integrity" "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - "version" "1.2.8" + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" - "fastq" "^1.6.0" + fastq "^1.6.0" "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.3": - "integrity" "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==" - "resolved" "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz" - "version" "1.8.3" + version "1.8.3" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== dependencies: - "type-detect" "4.0.8" + type-detect "4.0.8" -"@sinonjs/fake-timers@^7.1.2", "@sinonjs/fake-timers@>=5": - "integrity" "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==" - "resolved" "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz" - "version" "7.1.2" +"@sinonjs/fake-timers@>=5", "@sinonjs/fake-timers@^7.1.2": + version "7.1.2" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz" + integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg== dependencies: "@sinonjs/commons" "^1.7.0" "@sinonjs/samsam@^6.0.2": - "integrity" "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==" - "resolved" "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz" - "version" "6.1.1" + version "6.1.1" + resolved "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz" + integrity sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA== dependencies: "@sinonjs/commons" "^1.6.0" - "lodash.get" "^4.4.2" - "type-detect" "^4.0.8" + lodash.get "^4.4.2" + type-detect "^4.0.8" "@sinonjs/text-encoding@^0.7.1": - "integrity" "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==" - "resolved" "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz" - "version" "0.7.1" + version "0.7.1" + resolved "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz" + integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== "@tootallnate/once@1": - "integrity" "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" - "resolved" "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" - "version" "1.1.2" + version "1.1.2" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@types/chai@^4.3.3": - "integrity" "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==" - "resolved" "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz" - "version" "4.3.3" + version "4.3.3" + resolved "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz" + integrity sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g== "@types/glob@^7.1.3": - "integrity" "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==" - "resolved" "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz" - "version" "7.2.0" + version "7.2.0" + resolved "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== dependencies: "@types/minimatch" "*" "@types/node" "*" "@types/js-yaml@^4.0.2": - "integrity" "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==" - "resolved" "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz" - "version" "4.0.5" + version "4.0.5" + resolved "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz" + integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA== "@types/json-schema@^7.0.9": - "integrity" "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" - "resolved" "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" - "version" "7.0.11" + version "7.0.11" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== "@types/json5@^0.0.29": - "integrity" "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" - "resolved" "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" - "version" "0.0.29" + version "0.0.29" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/lodash@^4.14.168": - "integrity" "sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag==" - "resolved" "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.181.tgz" - "version" "4.14.181" + version "4.14.181" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.181.tgz" + integrity sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag== "@types/minimatch@*": - "integrity" "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" - "resolved" "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz" - "version" "3.0.5" + version "3.0.5" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/mocha@^8.0.4": - "integrity" "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==" - "resolved" "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz" - "version" "8.2.3" + version "8.2.3" + resolved "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz" + integrity sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw== "@types/node@*", "@types/node@^16.11.3": - "integrity" "sha512-GZ7bu5A6+4DtG7q9GsoHXy3ALcgeIHP4NnL0Vv2wu0uUB/yQex26v0tf6/na1mm0+bS9Uw+0DFex7aaKr2qawQ==" - "resolved" "https://registry.npmjs.org/@types/node/-/node-16.11.26.tgz" - "version" "16.11.26" + version "16.11.26" + resolved "https://registry.npmjs.org/@types/node/-/node-16.11.26.tgz" + integrity sha512-GZ7bu5A6+4DtG7q9GsoHXy3ALcgeIHP4NnL0Vv2wu0uUB/yQex26v0tf6/na1mm0+bS9Uw+0DFex7aaKr2qawQ== "@types/semver@^7.3.9": - "integrity" "sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ==" - "resolved" "https://registry.npmjs.org/@types/semver/-/semver-7.3.9.tgz" - "version" "7.3.9" + version "7.3.9" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.3.9.tgz" + integrity sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ== "@types/sinon@^10.0.2": - "integrity" "sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g==" - "resolved" "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.11.tgz" - "version" "10.0.11" + version "10.0.11" + resolved "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.11.tgz" + integrity sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g== dependencies: "@types/sinonjs__fake-timers" "*" "@types/sinonjs__fake-timers@*": - "integrity" "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==" - "resolved" "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz" - "version" "8.1.2" + version "8.1.2" + resolved "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz" + integrity sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA== "@types/uuid@^8.3.4": - "integrity" "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" - "resolved" "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz" - "version" "8.3.4" + version "8.3.4" + resolved "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== "@types/vscode@~1.61.0": - "integrity" "sha512-9k5Nwq45hkRwdfCFY+eKXeQQSbPoA114mF7U/4uJXRBJeGIO7MuJdhF1PnaDN+lllL9iKGQtd6FFXShBXMNaFg==" - "resolved" "https://registry.npmjs.org/@types/vscode/-/vscode-1.61.0.tgz" - "version" "1.61.0" + version "1.61.0" + resolved "https://registry.npmjs.org/@types/vscode/-/vscode-1.61.0.tgz" + integrity sha512-9k5Nwq45hkRwdfCFY+eKXeQQSbPoA114mF7U/4uJXRBJeGIO7MuJdhF1PnaDN+lllL9iKGQtd6FFXShBXMNaFg== "@typescript-eslint/eslint-plugin@^5.20.0": - "integrity" "sha512-fapGzoxilCn3sBtC6NtXZX6+P/Hef7VDbyfGqTTpzYydwhlkevB+0vE0EnmHPVTVSy68GUncyJ/2PcrFBeCo5Q==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.20.0.tgz" - "version" "5.20.0" + version "5.20.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.20.0.tgz" + integrity sha512-fapGzoxilCn3sBtC6NtXZX6+P/Hef7VDbyfGqTTpzYydwhlkevB+0vE0EnmHPVTVSy68GUncyJ/2PcrFBeCo5Q== dependencies: "@typescript-eslint/scope-manager" "5.20.0" "@typescript-eslint/type-utils" "5.20.0" "@typescript-eslint/utils" "5.20.0" - "debug" "^4.3.2" - "functional-red-black-tree" "^1.0.1" - "ignore" "^5.1.8" - "regexpp" "^3.2.0" - "semver" "^7.3.5" - "tsutils" "^3.21.0" - -"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.20.0": - "integrity" "sha512-UWKibrCZQCYvobmu3/N8TWbEeo/EPQbS41Ux1F9XqPzGuV7pfg6n50ZrFo6hryynD8qOTTfLHtHjjdQtxJ0h/w==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.20.0.tgz" - "version" "5.20.0" + debug "^4.3.2" + functional-red-black-tree "^1.0.1" + ignore "^5.1.8" + regexpp "^3.2.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.20.0": + version "5.20.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.20.0.tgz" + integrity sha512-UWKibrCZQCYvobmu3/N8TWbEeo/EPQbS41Ux1F9XqPzGuV7pfg6n50ZrFo6hryynD8qOTTfLHtHjjdQtxJ0h/w== dependencies: "@typescript-eslint/scope-manager" "5.20.0" "@typescript-eslint/types" "5.20.0" "@typescript-eslint/typescript-estree" "5.20.0" - "debug" "^4.3.2" + debug "^4.3.2" "@typescript-eslint/scope-manager@5.20.0": - "integrity" "sha512-h9KtuPZ4D/JuX7rpp1iKg3zOH0WNEa+ZIXwpW/KWmEFDxlA/HSfCMhiyF1HS/drTICjIbpA6OqkAhrP/zkCStg==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.20.0.tgz" - "version" "5.20.0" + version "5.20.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.20.0.tgz" + integrity sha512-h9KtuPZ4D/JuX7rpp1iKg3zOH0WNEa+ZIXwpW/KWmEFDxlA/HSfCMhiyF1HS/drTICjIbpA6OqkAhrP/zkCStg== dependencies: "@typescript-eslint/types" "5.20.0" "@typescript-eslint/visitor-keys" "5.20.0" "@typescript-eslint/type-utils@5.20.0": - "integrity" "sha512-WxNrCwYB3N/m8ceyoGCgbLmuZwupvzN0rE8NBuwnl7APgjv24ZJIjkNzoFBXPRCGzLNkoU/WfanW0exvp/+3Iw==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.20.0.tgz" - "version" "5.20.0" + version "5.20.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.20.0.tgz" + integrity sha512-WxNrCwYB3N/m8ceyoGCgbLmuZwupvzN0rE8NBuwnl7APgjv24ZJIjkNzoFBXPRCGzLNkoU/WfanW0exvp/+3Iw== dependencies: "@typescript-eslint/utils" "5.20.0" - "debug" "^4.3.2" - "tsutils" "^3.21.0" + debug "^4.3.2" + tsutils "^3.21.0" "@typescript-eslint/types@5.20.0": - "integrity" "sha512-+d8wprF9GyvPwtoB4CxBAR/s0rpP25XKgnOvMf/gMXYDvlUC3rPFHupdTQ/ow9vn7UDe5rX02ovGYQbv/IUCbg==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.20.0.tgz" - "version" "5.20.0" + version "5.20.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.20.0.tgz" + integrity sha512-+d8wprF9GyvPwtoB4CxBAR/s0rpP25XKgnOvMf/gMXYDvlUC3rPFHupdTQ/ow9vn7UDe5rX02ovGYQbv/IUCbg== "@typescript-eslint/typescript-estree@5.20.0": - "integrity" "sha512-36xLjP/+bXusLMrT9fMMYy1KJAGgHhlER2TqpUVDYUQg4w0q/NW/sg4UGAgVwAqb8V4zYg43KMUpM8vV2lve6w==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.20.0.tgz" - "version" "5.20.0" + version "5.20.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.20.0.tgz" + integrity sha512-36xLjP/+bXusLMrT9fMMYy1KJAGgHhlER2TqpUVDYUQg4w0q/NW/sg4UGAgVwAqb8V4zYg43KMUpM8vV2lve6w== dependencies: "@typescript-eslint/types" "5.20.0" "@typescript-eslint/visitor-keys" "5.20.0" - "debug" "^4.3.2" - "globby" "^11.0.4" - "is-glob" "^4.0.3" - "semver" "^7.3.5" - "tsutils" "^3.21.0" + debug "^4.3.2" + globby "^11.0.4" + is-glob "^4.0.3" + semver "^7.3.5" + tsutils "^3.21.0" "@typescript-eslint/utils@5.20.0": - "integrity" "sha512-lHONGJL1LIO12Ujyx8L8xKbwWSkoUKFSO+0wDAqGXiudWB2EO7WEUT+YZLtVbmOmSllAjLb9tpoIPwpRe5Tn6w==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.20.0.tgz" - "version" "5.20.0" + version "5.20.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.20.0.tgz" + integrity sha512-lHONGJL1LIO12Ujyx8L8xKbwWSkoUKFSO+0wDAqGXiudWB2EO7WEUT+YZLtVbmOmSllAjLb9tpoIPwpRe5Tn6w== dependencies: "@types/json-schema" "^7.0.9" "@typescript-eslint/scope-manager" "5.20.0" "@typescript-eslint/types" "5.20.0" "@typescript-eslint/typescript-estree" "5.20.0" - "eslint-scope" "^5.1.1" - "eslint-utils" "^3.0.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" "@typescript-eslint/visitor-keys@5.20.0": - "integrity" "sha512-1flRpNF+0CAQkMNlTJ6L/Z5jiODG/e5+7mk6XwtPOUS3UrTz3UOiAg9jG2VtKsWI6rZQfy4C6a232QNRZTRGlg==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.20.0.tgz" - "version" "5.20.0" + version "5.20.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.20.0.tgz" + integrity sha512-1flRpNF+0CAQkMNlTJ6L/Z5jiODG/e5+7mk6XwtPOUS3UrTz3UOiAg9jG2VtKsWI6rZQfy4C6a232QNRZTRGlg== dependencies: "@typescript-eslint/types" "5.20.0" - "eslint-visitor-keys" "^3.0.0" + eslint-visitor-keys "^3.0.0" "@ungap/promise-all-settled@1.1.2": - "integrity" "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==" - "resolved" "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz" - "version" "1.1.2" + version "1.1.2" + resolved "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== "@vscode/test-electron@^2.1.3": - "integrity" "sha512-tHHAWNVwl8C7nyezHAHdNPWkksdXWvmae6bt4k1tJ9hvMm6QIIk95Mkutl82XHcD60mdP46EHDGU+xFsAvygOQ==" - "resolved" "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.1.4.tgz" - "version" "2.1.4" - dependencies: - "http-proxy-agent" "^4.0.1" - "https-proxy-agent" "^5.0.0" - "rimraf" "^3.0.2" - "unzipper" "^0.10.11" - -"abbrev@1": - "integrity" "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - "resolved" "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" - "version" "1.1.1" - -"acorn-jsx@^5.3.1": - "integrity" "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" - "resolved" "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" - "version" "5.3.2" - -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^8.7.0": - "integrity" "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" - "resolved" "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz" - "version" "8.7.0" - -"agent-base@6": - "integrity" "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==" - "resolved" "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" - "version" "6.0.2" - dependencies: - "debug" "4" - -"ajv@^6.10.0", "ajv@^6.12.4": - "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" - "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - "version" "6.12.6" - dependencies: - "fast-deep-equal" "^3.1.1" - "fast-json-stable-stringify" "^2.0.0" - "json-schema-traverse" "^0.4.1" - "uri-js" "^4.2.2" - -"ansi-colors@4.1.1": - "integrity" "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" - "resolved" "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" - "version" "4.1.1" - -"ansi-regex@^0.2.0": - "integrity" "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" - "version" "0.2.1" - -"ansi-regex@^0.2.1": - "integrity" "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" - "version" "0.2.1" - -"ansi-regex@^3.0.0": - "integrity" "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" - "version" "3.0.1" - -"ansi-regex@^5.0.1": - "integrity" "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - "version" "5.0.1" - -"ansi-styles@^1.1.0": - "integrity" "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94= sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz" - "version" "1.1.0" - -"ansi-styles@^3.2.1": - "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - "version" "3.2.1" - dependencies: - "color-convert" "^1.9.0" - -"ansi-styles@^4.0.0", "ansi-styles@^4.1.0": - "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - "version" "4.3.0" - dependencies: - "color-convert" "^2.0.1" - -"anymatch@~3.1.1": - "integrity" "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==" - "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" - "version" "3.1.2" - dependencies: - "normalize-path" "^3.0.0" - "picomatch" "^2.0.4" - -"argparse@^2.0.1": - "integrity" "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - "resolved" "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" - "version" "2.0.1" - -"array-union@^2.1.0": - "integrity" "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - "resolved" "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" - "version" "2.1.0" - -"asap@^2.0.0": - "integrity" "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - "resolved" "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" - "version" "2.0.6" - -"assertion-error@^1.1.0": - "integrity" "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" - "resolved" "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" - "version" "1.1.0" - -"async@^2.6.1": - "integrity" "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==" - "resolved" "https://registry.npmjs.org/async/-/async-2.6.3.tgz" - "version" "2.6.3" - dependencies: - "lodash" "^4.17.14" - -"balanced-match@^1.0.0": - "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - "version" "1.0.2" - -"big-integer@^1.6.17": - "integrity" "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" - "resolved" "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz" - "version" "1.6.51" - -"binary-extensions@^2.0.0": - "integrity" "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - "version" "2.2.0" - -"binary@~0.3.0": - "integrity" "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==" - "resolved" "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz" - "version" "0.3.0" - dependencies: - "buffers" "~0.1.1" - "chainsaw" "~0.1.0" - -"bluebird@~3.4.1": - "integrity" "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM= sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" - "resolved" "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz" - "version" "3.4.7" - -"boolbase@^1.0.0": - "integrity" "sha1-aN/1++YMUes3cl6p4+0xDcwed24= sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - "resolved" "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" - "version" "1.0.0" - -"brace-expansion@^1.1.7": - "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" - "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - "version" "1.1.11" - dependencies: - "balanced-match" "^1.0.0" - "concat-map" "0.0.1" - -"braces@^3.0.2", "braces@~3.0.2": - "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" - "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - "version" "3.0.2" - dependencies: - "fill-range" "^7.0.1" - -"browser-stdout@1.3.1": - "integrity" "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" - "resolved" "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" - "version" "1.3.1" - -"buffer-indexof-polyfill@~1.0.0": - "integrity" "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==" - "resolved" "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz" - "version" "1.0.2" - -"buffers@~0.1.1": - "integrity" "sha1-skV5w77U1tOWru5tmorn9Ugqt7s= sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==" - "resolved" "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" - "version" "0.1.1" - -"callsites@^3.0.0": - "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - "version" "3.1.0" - -"camelcase@^6.0.0": - "integrity" "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" - "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" - "version" "6.3.0" - -"chai@^4.3.6": - "integrity" "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==" - "resolved" "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz" - "version" "4.3.6" - dependencies: - "assertion-error" "^1.1.0" - "check-error" "^1.0.2" - "deep-eql" "^3.0.1" - "get-func-name" "^2.0.0" - "loupe" "^2.3.1" - "pathval" "^1.1.1" - "type-detect" "^4.0.5" - -"chainsaw@~0.1.0": - "integrity" "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==" - "resolved" "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz" - "version" "0.1.0" - dependencies: - "traverse" ">=0.3.0 <0.4" - -"chalk@^2.4.2": - "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - "version" "2.4.2" - dependencies: - "ansi-styles" "^3.2.1" - "escape-string-regexp" "^1.0.5" - "supports-color" "^5.3.0" - -"chalk@^4.0.0": - "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - "version" "4.1.2" - dependencies: - "ansi-styles" "^4.1.0" - "supports-color" "^7.1.0" - -"chalk@~0.5.1": - "integrity" "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ= sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz" - "version" "0.5.1" - dependencies: - "ansi-styles" "^1.1.0" - "escape-string-regexp" "^1.0.0" - "has-ansi" "^0.1.0" - "strip-ansi" "^0.3.0" - "supports-color" "^0.2.0" - -"check-error@^1.0.2": - "integrity" "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==" - "resolved" "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" - "version" "1.0.2" - -"chokidar@3.5.1": - "integrity" "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==" - "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz" - "version" "3.5.1" - dependencies: - "anymatch" "~3.1.1" - "braces" "~3.0.2" - "glob-parent" "~5.1.0" - "is-binary-path" "~2.1.0" - "is-glob" "~4.0.1" - "normalize-path" "~3.0.0" - "readdirp" "~3.5.0" + version "2.1.4" + resolved "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.1.4.tgz" + integrity sha512-tHHAWNVwl8C7nyezHAHdNPWkksdXWvmae6bt4k1tJ9hvMm6QIIk95Mkutl82XHcD60mdP46EHDGU+xFsAvygOQ== + dependencies: + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + rimraf "^3.0.2" + unzipper "^0.10.11" + +abbrev@1: + version "1.1.1" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.7.0: + version "8.7.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== + +agent-base@6: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-regex@^0.2.0, ansi-regex@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" + integrity "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==" + +ansi-regex@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz" + integrity "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94= sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==" + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.1: + version "3.1.2" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +asap@^2.0.0: + version "2.0.6" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + integrity "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +async@^2.6.1: + version "2.6.3" + resolved "https://registry.npmjs.org/async/-/async-2.6.3.tgz" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +big-integer@^1.6.17: + version "1.6.51" + resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz" + integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +binary@~0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz" + integrity "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==" + dependencies: + buffers "~0.1.1" + chainsaw "~0.1.0" + +bluebird@~3.4.1: + version "3.4.7" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz" + integrity "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM= sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + integrity "sha1-aN/1++YMUes3cl6p4+0xDcwed24= sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +buffer-indexof-polyfill@~1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz" + integrity sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A== + +buffers@~0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" + integrity "sha1-skV5w77U1tOWru5tmorn9Ugqt7s= sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +chai@^4.3.6: + version "4.3.6" + resolved "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz" + integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + loupe "^2.3.1" + pathval "^1.1.1" + type-detect "^4.0.5" + +chainsaw@~0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz" + integrity "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==" + dependencies: + traverse ">=0.3.0 <0.4" + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + 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.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@~0.5.1: + version "0.5.1" + resolved "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz" + integrity "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ= sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==" + dependencies: + ansi-styles "^1.1.0" + escape-string-regexp "^1.0.0" + has-ansi "^0.1.0" + strip-ansi "^0.3.0" + supports-color "^0.2.0" + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" + integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== + +chokidar@3.5.1: + version "3.5.1" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" optionalDependencies: - "fsevents" "~2.3.1" - -"cliui@^7.0.2": - "integrity" "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==" - "resolved" "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" - "version" "7.0.4" - dependencies: - "string-width" "^4.2.0" - "strip-ansi" "^6.0.0" - "wrap-ansi" "^7.0.0" - -"color-convert@^1.9.0": - "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" - "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - "version" "1.9.3" - dependencies: - "color-name" "1.1.3" - -"color-convert@^2.0.1": - "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" - "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "color-name" "~1.1.4" - -"color-name@~1.1.4": - "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - "version" "1.1.4" - -"color-name@1.1.3": - "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - "version" "1.1.3" - -"concat-map@0.0.1": - "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - "version" "0.0.1" - -"core-util-is@~1.0.0": - "integrity" "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - "resolved" "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" - "version" "1.0.3" - -"cross-spawn@^7.0.2": - "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==" - "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - "version" "7.0.3" - dependencies: - "path-key" "^3.1.0" - "shebang-command" "^2.0.0" - "which" "^2.0.1" - -"css-select@^4.2.1": - "integrity" "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==" - "resolved" "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" - "version" "4.3.0" - dependencies: - "boolbase" "^1.0.0" - "css-what" "^6.0.1" - "domhandler" "^4.3.1" - "domutils" "^2.8.0" - "nth-check" "^2.0.1" - -"css-what@^6.0.1": - "integrity" "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" - "resolved" "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" - "version" "6.1.0" - -"debug@^4.1.1", "debug@^4.3.2", "debug@4": - "integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==" - "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - "version" "4.3.4" - dependencies: - "ms" "2.1.2" - -"debug@4.3.1": - "integrity" "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==" - "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz" - "version" "4.3.1" - dependencies: - "ms" "2.1.2" - -"debuglog@^1.0.1": - "integrity" "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==" - "resolved" "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz" - "version" "1.0.1" - -"decamelize@^4.0.0": - "integrity" "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" - "resolved" "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" - "version" "4.0.0" - -"deep-eql@^3.0.1": - "integrity" "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==" - "resolved" "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz" - "version" "3.0.1" - dependencies: - "type-detect" "^4.0.0" - -"deep-is@^0.1.3": - "integrity" "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - "resolved" "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" - "version" "0.1.4" - -"dezalgo@^1.0.0": - "integrity" "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= sha512-K7i4zNfT2kgQz3GylDw40ot9GAE47sFZ9EXHFSPP6zONLgH6kWXE0KWJchkbQJLBkRazq4APwZ4OwiFFlT95OQ==" - "resolved" "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz" - "version" "1.0.3" - dependencies: - "asap" "^2.0.0" - "wrappy" "1" - -"diff@^5.0.0", "diff@5.0.0": - "integrity" "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" - "resolved" "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" - "version" "5.0.0" - -"dir-glob@^3.0.1": - "integrity" "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==" - "resolved" "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" - "version" "3.0.1" - dependencies: - "path-type" "^4.0.0" - -"doctrine@^3.0.0": - "integrity" "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==" - "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "esutils" "^2.0.2" - -"dom-serializer@^1.0.1": - "integrity" "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==" - "resolved" "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" - "version" "1.4.1" - dependencies: - "domelementtype" "^2.0.1" - "domhandler" "^4.2.0" - "entities" "^2.0.0" - -"domelementtype@^2.0.1", "domelementtype@^2.2.0": - "integrity" "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" - "resolved" "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" - "version" "2.3.0" - -"domhandler@^4.2.0", "domhandler@^4.3.1": - "integrity" "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==" - "resolved" "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" - "version" "4.3.1" - dependencies: - "domelementtype" "^2.2.0" - -"domutils@^2.8.0": - "integrity" "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==" - "resolved" "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" - "version" "2.8.0" - dependencies: - "dom-serializer" "^1.0.1" - "domelementtype" "^2.2.0" - "domhandler" "^4.2.0" - -"duplexer2@~0.1.4": - "integrity" "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==" - "resolved" "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz" - "version" "0.1.4" - dependencies: - "readable-stream" "^2.0.2" - -"emoji-regex@^8.0.0": - "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - "version" "8.0.0" - -"entities@^2.0.0": - "integrity" "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - "resolved" "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" - "version" "2.2.0" - -"esbuild@^0.11.12": - "integrity" "sha512-iaiZZ9vUF5wJV8ob1tl+5aJTrwDczlvGP0JoMmnpC2B0ppiMCu8n8gmy5ZTGl5bcG081XBVn+U+jP+mPFm5T5Q==" - "resolved" "https://registry.npmjs.org/esbuild/-/esbuild-0.11.23.tgz" - "version" "0.11.23" - -"escalade@^3.1.1": - "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - "version" "3.1.1" - -"escape-string-regexp@^1.0.0": - "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - "version" "1.0.5" - -"escape-string-regexp@^1.0.5": - "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - "version" "1.0.5" - -"escape-string-regexp@^4.0.0", "escape-string-regexp@4.0.0": - "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - "version" "4.0.0" - -"eslint-config-prettier@^8.5.0": - "integrity" "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==" - "resolved" "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz" - "version" "8.5.0" - -"eslint-scope@^5.1.1": - "integrity" "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==" - "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" - "version" "5.1.1" - dependencies: - "esrecurse" "^4.3.0" - "estraverse" "^4.1.1" - -"eslint-scope@^7.1.1": - "integrity" "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==" - "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" - "version" "7.1.1" - dependencies: - "esrecurse" "^4.3.0" - "estraverse" "^5.2.0" - -"eslint-utils@^3.0.0": - "integrity" "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==" - "resolved" "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "eslint-visitor-keys" "^2.0.0" - -"eslint-visitor-keys@^2.0.0": - "integrity" "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" - "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" - "version" "2.1.0" - -"eslint-visitor-keys@^3.0.0", "eslint-visitor-keys@^3.3.0": - "integrity" "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==" - "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" - "version" "3.3.0" - -"eslint@*", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^8.13.0", "eslint@>=5", "eslint@>=7.0.0": - "integrity" "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==" - "resolved" "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz" - "version" "8.13.0" + fsevents "~2.3.1" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-select@^4.2.1: + version "4.3.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-what@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +debug@4, debug@^4.1.1, debug@^4.3.2: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@4.3.1: + version "4.3.1" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +debuglog@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz" + integrity "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +dezalgo@^1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz" + integrity "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= sha512-K7i4zNfT2kgQz3GylDw40ot9GAE47sFZ9EXHFSPP6zONLgH6kWXE0KWJchkbQJLBkRazq4APwZ4OwiFFlT95OQ==" + dependencies: + asap "^2.0.0" + wrappy "1" + +diff@5.0.0, diff@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +duplexer2@~0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz" + integrity "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==" + dependencies: + readable-stream "^2.0.2" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +esbuild@^0.11.12: + version "0.11.23" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.11.23.tgz" + integrity sha512-iaiZZ9vUF5wJV8ob1tl+5aJTrwDczlvGP0JoMmnpC2B0ppiMCu8n8gmy5ZTGl5bcG081XBVn+U+jP+mPFm5T5Q== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + +eslint-config-prettier@^8.5.0: + version "8.5.0" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz" + integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@^8.13.0: + version "8.13.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz" + integrity sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ== dependencies: "@eslint/eslintrc" "^1.2.1" "@humanwhocodes/config-array" "^0.9.2" - "ajv" "^6.10.0" - "chalk" "^4.0.0" - "cross-spawn" "^7.0.2" - "debug" "^4.3.2" - "doctrine" "^3.0.0" - "escape-string-regexp" "^4.0.0" - "eslint-scope" "^7.1.1" - "eslint-utils" "^3.0.0" - "eslint-visitor-keys" "^3.3.0" - "espree" "^9.3.1" - "esquery" "^1.4.0" - "esutils" "^2.0.2" - "fast-deep-equal" "^3.1.3" - "file-entry-cache" "^6.0.1" - "functional-red-black-tree" "^1.0.1" - "glob-parent" "^6.0.1" - "globals" "^13.6.0" - "ignore" "^5.2.0" - "import-fresh" "^3.0.0" - "imurmurhash" "^0.1.4" - "is-glob" "^4.0.0" - "js-yaml" "^4.1.0" - "json-stable-stringify-without-jsonify" "^1.0.1" - "levn" "^0.4.1" - "lodash.merge" "^4.6.2" - "minimatch" "^3.0.4" - "natural-compare" "^1.4.0" - "optionator" "^0.9.1" - "regexpp" "^3.2.0" - "strip-ansi" "^6.0.1" - "strip-json-comments" "^3.1.0" - "text-table" "^0.2.0" - "v8-compile-cache" "^2.0.3" - -"espree@^9.3.1": - "integrity" "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==" - "resolved" "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz" - "version" "9.3.1" - dependencies: - "acorn" "^8.7.0" - "acorn-jsx" "^5.3.1" - "eslint-visitor-keys" "^3.3.0" - -"esquery@^1.4.0": - "integrity" "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==" - "resolved" "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" - "version" "1.4.0" - dependencies: - "estraverse" "^5.1.0" - -"esrecurse@^4.3.0": - "integrity" "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==" - "resolved" "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - "version" "4.3.0" - dependencies: - "estraverse" "^5.2.0" - -"estraverse@^4.1.1": - "integrity" "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" - "version" "4.3.0" - -"estraverse@^5.1.0": - "integrity" "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - "version" "5.3.0" - -"estraverse@^5.2.0": - "integrity" "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - "version" "5.3.0" - -"esutils@^2.0.2": - "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - "resolved" "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - "version" "2.0.3" - -"fast-deep-equal@^3.1.1", "fast-deep-equal@^3.1.3": - "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - "version" "3.1.3" - -"fast-glob@^3.2.9": - "integrity" "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==" - "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" - "version" "3.2.11" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^6.0.1" + globals "^13.6.0" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^9.3.1: + version "9.3.1" + resolved "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz" + integrity sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ== + dependencies: + acorn "^8.7.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^3.3.0" + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== 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" - -"fast-json-stable-stringify@^2.0.0": - "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - "version" "2.1.0" - -"fast-levenshtein@^2.0.6": - "integrity" "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - "resolved" "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - "version" "2.0.6" - -"fast-xml-parser@^3.20.0": - "integrity" "sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg==" - "resolved" "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz" - "version" "3.21.1" - dependencies: - "strnum" "^1.0.4" - -"fastq@^1.6.0": - "integrity" "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==" - "resolved" "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" - "version" "1.13.0" - dependencies: - "reusify" "^1.0.4" - -"file-entry-cache@^6.0.1": - "integrity" "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==" - "resolved" "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" - "version" "6.0.1" - dependencies: - "flat-cache" "^3.0.4" - -"fill-range@^7.0.1": - "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" - "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - "version" "7.0.1" - dependencies: - "to-regex-range" "^5.0.1" - -"find-up@5.0.0": - "integrity" "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==" - "resolved" "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - "version" "5.0.0" - dependencies: - "locate-path" "^6.0.0" - "path-exists" "^4.0.0" - -"flat-cache@^3.0.4": - "integrity" "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==" - "resolved" "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" - "version" "3.0.4" - dependencies: - "flatted" "^3.1.0" - "rimraf" "^3.0.2" - -"flat@^5.0.2": - "integrity" "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" - "resolved" "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" - "version" "5.0.2" - -"flatted@^3.1.0": - "integrity" "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" - "resolved" "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz" - "version" "3.2.5" - -"fs.realpath@^1.0.0": - "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8= sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - "version" "1.0.0" - -"fstream@^1.0.12": - "integrity" "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==" - "resolved" "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz" - "version" "1.0.12" - dependencies: - "graceful-fs" "^4.1.2" - "inherits" "~2.0.0" - "mkdirp" ">=0.5 0" - "rimraf" "2" - -"functional-red-black-tree@^1.0.1": - "integrity" "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" - "resolved" "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" - "version" "1.0.1" - -"get-caller-file@^2.0.5": - "integrity" "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - "resolved" "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - "version" "2.0.5" - -"get-func-name@^2.0.0": - "integrity" "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==" - "resolved" "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" - "version" "2.0.0" - -"github-url-from-git@^1.3.0": - "integrity" "sha1-+YX+3MCpqledyI16/waNVcxiUaA= sha512-WWOec4aRI7YAykQ9+BHmzjyNlkfJFG8QLXnDTsLz/kZefq7qkzdfo4p6fkYYMIq1aj+gZcQs/1HQhQh3DPPxlQ==" - "resolved" "https://registry.npmjs.org/github-url-from-git/-/github-url-from-git-1.5.0.tgz" - "version" "1.5.0" - -"github-url-from-username-repo@^1.0.0": - "integrity" "sha1-fdeTMNKr5pwQws73lxTJchV5Hfo= sha512-Tj8CQqRoFVTglGdQ8FQmfq8gOOoOYZX7tnOKP8jq8Hdz2OTDhxvtlkLAbrqMYZ7X/YdaYQoUG1IBWxISBfqZ+Q==" - "resolved" "https://registry.npmjs.org/github-url-from-username-repo/-/github-url-from-username-repo-1.0.2.tgz" - "version" "1.0.2" - -"glob-parent@^5.1.2": - "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" - "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - "version" "5.1.2" - dependencies: - "is-glob" "^4.0.1" - -"glob-parent@^6.0.1": - "integrity" "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==" - "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - "version" "6.0.2" - dependencies: - "is-glob" "^4.0.3" - -"glob-parent@~5.1.0": - "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" - "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - "version" "5.1.2" - dependencies: - "is-glob" "^4.0.1" - -"glob@^5.0.3": - "integrity" "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==" - "resolved" "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" - "version" "5.0.15" - dependencies: - "inflight" "^1.0.4" - "inherits" "2" - "minimatch" "2 || 3" - "once" "^1.3.0" - "path-is-absolute" "^1.0.0" - -"glob@^7.1.3", "glob@^7.1.7": - "integrity" "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==" - "resolved" "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" - "version" "7.2.0" - dependencies: - "fs.realpath" "^1.0.0" - "inflight" "^1.0.4" - "inherits" "2" - "minimatch" "^3.0.4" - "once" "^1.3.0" - "path-is-absolute" "^1.0.0" - -"glob@7.1.6": - "integrity" "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==" - "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" - "version" "7.1.6" - dependencies: - "fs.realpath" "^1.0.0" - "inflight" "^1.0.4" - "inherits" "2" - "minimatch" "^3.0.4" - "once" "^1.3.0" - "path-is-absolute" "^1.0.0" - -"globals@^13.6.0", "globals@^13.9.0": - "integrity" "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==" - "resolved" "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz" - "version" "13.13.0" - dependencies: - "type-fest" "^0.20.2" - -"globby@^11.0.4": - "integrity" "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==" - "resolved" "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" - "version" "11.1.0" - dependencies: - "array-union" "^2.1.0" - "dir-glob" "^3.0.1" - "fast-glob" "^3.2.9" - "ignore" "^5.2.0" - "merge2" "^1.4.1" - "slash" "^3.0.0" - -"graceful-fs@^4.1.2": - "integrity" "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" - "version" "4.2.10" - -"graceful-fs@^4.2.2": - "integrity" "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" - "version" "4.2.10" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + +fast-xml-parser@^3.20.0: + version "3.21.1" + resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz" + integrity sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg== + dependencies: + strnum "^1.0.4" + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.1.0: + version "3.2.5" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz" + integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity "sha1-FQStJSMVjKpA20onh8sBQRmU6k8= sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + +fsevents@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +fstream@^1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" + integrity "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" + integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== + +github-url-from-git@^1.3.0: + version "1.5.0" + resolved "https://registry.npmjs.org/github-url-from-git/-/github-url-from-git-1.5.0.tgz" + integrity "sha1-+YX+3MCpqledyI16/waNVcxiUaA= sha512-WWOec4aRI7YAykQ9+BHmzjyNlkfJFG8QLXnDTsLz/kZefq7qkzdfo4p6fkYYMIq1aj+gZcQs/1HQhQh3DPPxlQ==" + +github-url-from-username-repo@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/github-url-from-username-repo/-/github-url-from-username-repo-1.0.2.tgz" + integrity "sha1-fdeTMNKr5pwQws73lxTJchV5Hfo= sha512-Tj8CQqRoFVTglGdQ8FQmfq8gOOoOYZX7tnOKP8jq8Hdz2OTDhxvtlkLAbrqMYZ7X/YdaYQoUG1IBWxISBfqZ+Q==" + +glob-parent@^5.1.2, glob-parent@~5.1.0: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@7.1.6: + version "7.1.6" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^5.0.3: + version "5.0.15" + resolved "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" + integrity "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3, glob@^7.1.7: + version "7.2.0" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^13.6.0, globals@^13.9.0: + version "13.13.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz" + integrity sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A== + dependencies: + type-fest "^0.20.2" + +globby@^11.0.4: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" "graceful-fs@2 || 3": - "integrity" "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==" - "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz" - "version" "3.0.12" + version "3.0.12" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz" + integrity sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg== dependencies: - "natives" "^1.1.3" + natives "^1.1.3" -"growl@1.10.5": - "integrity" "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" - "resolved" "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" - "version" "1.10.5" +graceful-fs@^4.1.2, graceful-fs@^4.2.2: + version "4.2.10" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -"has-ansi@^0.1.0": - "integrity" "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4= sha512-1YsTg1fk2/6JToQhtZkArMkurq8UoWU1Qe0aR3VUHjgij4nOylSWLWAtBXoZ4/dXOmugfLGm1c+QhuD0JyedFA==" - "resolved" "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz" - "version" "0.1.0" +growl@1.10.5: + version "1.10.5" + resolved "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +has-ansi@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz" + integrity "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4= sha512-1YsTg1fk2/6JToQhtZkArMkurq8UoWU1Qe0aR3VUHjgij4nOylSWLWAtBXoZ4/dXOmugfLGm1c+QhuD0JyedFA==" dependencies: - "ansi-regex" "^0.2.0" + ansi-regex "^0.2.0" -"has-flag@^3.0.0": - "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0= sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - "version" "3.0.0" +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity "sha1-tdRU3CGZriJWmfNGfloH87lVuv0= sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" -"has-flag@^4.0.0": - "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - "version" "4.0.0" +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -"he@1.2.0": - "integrity" "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - "resolved" "https://registry.npmjs.org/he/-/he-1.2.0.tgz" - "version" "1.2.0" +he@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -"http-proxy-agent@^4.0.1": - "integrity" "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==" - "resolved" "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" - "version" "4.0.1" +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== dependencies: "@tootallnate/once" "1" - "agent-base" "6" - "debug" "4" - -"https-proxy-agent@^5.0.0": - "integrity" "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==" - "resolved" "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz" - "version" "5.0.0" - dependencies: - "agent-base" "6" - "debug" "4" - -"ignore@^5.1.8", "ignore@^5.2.0": - "integrity" "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" - "resolved" "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" - "version" "5.2.0" - -"immer@^9.0.15": - "integrity" "sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ==" - "resolved" "https://registry.npmjs.org/immer/-/immer-9.0.15.tgz" - "version" "9.0.15" - -"immutability-helper@^3.1.1": - "integrity" "sha512-Q0QaXjPjwIju/28TsugCHNEASwoCcJSyJV3uO1sOIQGI0jKgm9f41Lvz0DZj3n46cNCyAZTsEYoY4C2bVRUzyQ==" - "resolved" "https://registry.npmjs.org/immutability-helper/-/immutability-helper-3.1.1.tgz" - "version" "3.1.1" - -"import-fresh@^3.0.0", "import-fresh@^3.2.1": - "integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==" - "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" - "version" "3.3.0" - dependencies: - "parent-module" "^1.0.0" - "resolve-from" "^4.0.0" - -"imurmurhash@^0.1.4": - "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o= sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" - "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - "version" "0.1.4" - -"inflight@^1.0.4": - "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==" - "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - "version" "1.0.6" - dependencies: - "once" "^1.3.0" - "wrappy" "1" - -"inherits@~2.0.0", "inherits@~2.0.3", "inherits@2": - "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - "version" "2.0.4" - -"is-binary-path@~2.1.0": - "integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" - "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "binary-extensions" "^2.0.0" - -"is-extglob@^2.1.1": - "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - "version" "2.1.1" - -"is-fullwidth-code-point@^2.0.0": - "integrity" "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==" - "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" - "version" "2.0.0" - -"is-fullwidth-code-point@^3.0.0": - "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - "version" "3.0.0" - -"is-glob@^4.0.0", "is-glob@^4.0.1", "is-glob@^4.0.3", "is-glob@~4.0.1": - "integrity" "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" - "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - "version" "4.0.3" - dependencies: - "is-extglob" "^2.1.1" - -"is-number@^7.0.0": - "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - "version" "7.0.0" - -"is-plain-obj@^2.1.0": - "integrity" "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" - "resolved" "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" - "version" "2.1.0" - -"isarray@~1.0.0": - "integrity" "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - "version" "1.0.0" - -"isarray@0.0.1": - "integrity" "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - "resolved" "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - "version" "0.0.1" - -"isexe@^2.0.0": - "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - "version" "2.0.0" - -"itertools@^1.7.1": - "integrity" "sha512-0sC8t0HYOH0wb/mU5eLmp2g19yfhqho12Q6kCX6MGkNEEJQz97LIXzZ2bbIDyzBnQGcMixmcAtByzKjiaFkw8Q==" - "resolved" "https://registry.npmjs.org/itertools/-/itertools-1.7.1.tgz" - "version" "1.7.1" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +ignore@^5.1.8, ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +immer@^9.0.15: + version "9.0.15" + resolved "https://registry.npmjs.org/immer/-/immer-9.0.15.tgz" + integrity sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ== + +immutability-helper@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/immutability-helper/-/immutability-helper-3.1.1.tgz" + integrity sha512-Q0QaXjPjwIju/28TsugCHNEASwoCcJSyJV3uO1sOIQGI0jKgm9f41Lvz0DZj3n46cNCyAZTsEYoY4C2bVRUzyQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity "sha1-khi5srkoojixPcT7a21XbyMUU+o= sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@~2.0.0, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" + integrity "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + integrity "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + +itertools@^1.7.1: + version "1.7.1" + resolved "https://registry.npmjs.org/itertools/-/itertools-1.7.1.tgz" + integrity sha512-0sC8t0HYOH0wb/mU5eLmp2g19yfhqho12Q6kCX6MGkNEEJQz97LIXzZ2bbIDyzBnQGcMixmcAtByzKjiaFkw8Q== dependencies: "@babel/runtime" "^7.15.4" -"jju@^1.1.0": - "integrity" "sha1-o6vicYryQaKykE+EpiWXDzia4yo= sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" - "resolved" "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz" - "version" "1.4.0" +jju@^1.1.0: + version "1.4.0" + resolved "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz" + integrity "sha1-o6vicYryQaKykE+EpiWXDzia4yo= sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" -"jquery-extend@~2.0.3": - "integrity" "sha1-aBXNsBqGbdujDm9ND8X7ZnknJzU= sha512-ysLU6/m8VLckIjAudiE+s7YAoYwklZy5Ft9kqO7FPkqaQrd3wUMuZ134G3uniysW8VZME/pGa2LcynsM4TjP5Q==" - "resolved" "https://registry.npmjs.org/jquery-extend/-/jquery-extend-2.0.3.tgz" - "version" "2.0.3" +jquery-extend@~2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/jquery-extend/-/jquery-extend-2.0.3.tgz" + integrity "sha1-aBXNsBqGbdujDm9ND8X7ZnknJzU= sha512-ysLU6/m8VLckIjAudiE+s7YAoYwklZy5Ft9kqO7FPkqaQrd3wUMuZ134G3uniysW8VZME/pGa2LcynsM4TjP5Q==" -"js-yaml@^4.1.0": - "integrity" "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==" - "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - "version" "4.1.0" +js-yaml@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz" + integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== dependencies: - "argparse" "^2.0.1" + argparse "^2.0.1" -"js-yaml@4.0.0": - "integrity" "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==" - "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz" - "version" "4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: - "argparse" "^2.0.1" + argparse "^2.0.1" -"json-parse-helpfulerror@^1.0.2": - "integrity" "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w= sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==" - "resolved" "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz" - "version" "1.0.3" +json-parse-helpfulerror@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz" + integrity "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w= sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==" dependencies: - "jju" "^1.1.0" + jju "^1.1.0" -"json-schema-traverse@^0.4.1": - "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - "version" "0.4.1" +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -"json-stable-stringify-without-jsonify@^1.0.1": - "integrity" "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" - "resolved" "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" - "version" "1.0.1" +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" -"json5@^1.0.1": - "integrity" "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==" - "resolved" "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" - "version" "1.0.1" +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== dependencies: - "minimist" "^1.2.0" + minimist "^1.2.0" -"just-extend@^4.0.2": - "integrity" "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==" - "resolved" "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz" - "version" "4.2.1" +just-extend@^4.0.2: + version "4.2.1" + resolved "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz" + integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== -"levn@^0.4.1": - "integrity" "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==" - "resolved" "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" - "version" "0.4.1" +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: - "prelude-ls" "^1.2.1" - "type-check" "~0.4.0" + prelude-ls "^1.2.1" + type-check "~0.4.0" "license-checker@git+https://github.com/mwittig/license-checker.git#d546e3f738e14c62e732346fa355162d46700893": - "integrity" "sha512-CeZEQfhSiqkTkY6wbGFBo3ki7iMSo4+m46xjZ0Ou84CbEu8fhoFaz8H8Nsr/KtPscdQeZNFgdgWWUPKikKDupg==" - "resolved" "git+ssh://git@github.com/mwittig/license-checker.git#d546e3f738e14c62e732346fa355162d46700893" - "version" "1.0.0" - dependencies: - "chalk" "~0.5.1" - "mkdirp" "^0.3.5" - "nopt" "^2.2.0" - "read-installed" "~3.1.3" - "treeify" "^1.0.1" + version "1.0.0" + resolved "git+ssh://git@github.com/mwittig/license-checker.git#d546e3f738e14c62e732346fa355162d46700893" + integrity sha512-CeZEQfhSiqkTkY6wbGFBo3ki7iMSo4+m46xjZ0Ou84CbEu8fhoFaz8H8Nsr/KtPscdQeZNFgdgWWUPKikKDupg== + dependencies: + chalk "~0.5.1" + mkdirp "^0.3.5" + nopt "^2.2.0" + read-installed "~3.1.3" + treeify "^1.0.1" -"listenercount@~1.0.1": - "integrity" "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" - "resolved" "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz" - "version" "1.0.1" +listenercount@~1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz" + integrity "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" -"locate-path@^6.0.0": - "integrity" "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==" - "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - "version" "6.0.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: - "p-locate" "^5.0.0" + p-locate "^5.0.0" -"lodash.get@^4.4.2": - "integrity" "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" - "resolved" "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" - "version" "4.4.2" +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" + integrity "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" -"lodash.merge@^4.6.2": - "integrity" "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - "resolved" "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" - "version" "4.6.2" +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -"lodash@^4.17.14", "lodash@^4.17.21": - "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" - "version" "4.17.21" +lodash@^4.17.14, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -"log-symbols@4.0.0": - "integrity" "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==" - "resolved" "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz" - "version" "4.0.0" +log-symbols@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== dependencies: - "chalk" "^4.0.0" + chalk "^4.0.0" -"loupe@^2.3.1": - "integrity" "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==" - "resolved" "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz" - "version" "2.3.4" +loupe@^2.3.1: + version "2.3.4" + resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz" + integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== dependencies: - "get-func-name" "^2.0.0" + get-func-name "^2.0.0" -"lru-cache@^6.0.0": - "integrity" "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" - "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - "version" "6.0.0" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: - "yallist" "^4.0.0" + yallist "^4.0.0" -"merge2@^1.3.0", "merge2@^1.4.1": - "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - "resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - "version" "1.4.1" +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -"micromatch@^4.0.4": - "integrity" "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==" - "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" - "version" "4.0.5" +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: - "braces" "^3.0.2" - "picomatch" "^2.3.1" + braces "^3.0.2" + picomatch "^2.3.1" -"minimatch@^3.0.4", "minimatch@2 || 3": - "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" - "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - "version" "3.1.2" +"minimatch@2 || 3", minimatch@^3.0.4: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: - "brace-expansion" "^1.1.7" + brace-expansion "^1.1.7" -"minimatch@3.0.4": - "integrity" "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==" - "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" - "version" "3.0.4" +minimatch@3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: - "brace-expansion" "^1.1.7" - -"minimist@^1.2.0", "minimist@^1.2.6": - "integrity" "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" - "version" "1.2.6" + brace-expansion "^1.1.7" -"mkdirp@^0.3.5": - "integrity" "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc= sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==" - "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" - "version" "0.3.5" +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== -"mkdirp@^0.5.1", "mkdirp@>=0.5 0": - "integrity" "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==" - "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" - "version" "0.5.6" +"mkdirp@>=0.5 0", mkdirp@^0.5.1: + version "0.5.6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: - "minimist" "^1.2.6" + minimist "^1.2.6" + +mkdirp@^0.3.5: + version "0.3.5" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" + integrity "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc= sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==" -"mocha@^8.1.3": - "integrity" "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==" - "resolved" "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz" - "version" "8.4.0" +mocha@^8.1.3: + version "8.4.0" + resolved "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz" + integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ== dependencies: "@ungap/promise-all-settled" "1.1.2" - "ansi-colors" "4.1.1" - "browser-stdout" "1.3.1" - "chokidar" "3.5.1" - "debug" "4.3.1" - "diff" "5.0.0" - "escape-string-regexp" "4.0.0" - "find-up" "5.0.0" - "glob" "7.1.6" - "growl" "1.10.5" - "he" "1.2.0" - "js-yaml" "4.0.0" - "log-symbols" "4.0.0" - "minimatch" "3.0.4" - "ms" "2.1.3" - "nanoid" "3.1.20" - "serialize-javascript" "5.0.1" - "strip-json-comments" "3.1.1" - "supports-color" "8.1.1" - "which" "2.0.2" - "wide-align" "1.1.3" - "workerpool" "6.1.0" - "yargs" "16.2.0" - "yargs-parser" "20.2.4" - "yargs-unparser" "2.0.0" - -"module-alias@^2.2.2": - "integrity" "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==" - "resolved" "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz" - "version" "2.2.2" - -"ms@2.1.2": - "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - "version" "2.1.2" - -"ms@2.1.3": - "integrity" "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - "version" "2.1.3" - -"nanoid@3.1.20": - "integrity" "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==" - "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz" - "version" "3.1.20" - -"natives@^1.1.3": - "integrity" "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==" - "resolved" "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz" - "version" "1.1.6" - -"natural-compare@^1.4.0": - "integrity" "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - "resolved" "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - "version" "1.4.0" - -"nise@^5.1.0": - "integrity" "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==" - "resolved" "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz" - "version" "5.1.1" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.1" + debug "4.3.1" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.6" + growl "1.10.5" + he "1.2.0" + js-yaml "4.0.0" + log-symbols "4.0.0" + minimatch "3.0.4" + ms "2.1.3" + nanoid "3.1.20" + serialize-javascript "5.0.1" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + wide-align "1.1.3" + workerpool "6.1.0" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +module-alias@^2.2.2: + version "2.2.2" + resolved "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz" + integrity sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@3.1.20: + version "3.1.20" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz" + integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== + +natives@^1.1.3: + version "1.1.6" + resolved "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz" + integrity sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + +nise@^5.1.0: + version "5.1.1" + resolved "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz" + integrity sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A== dependencies: "@sinonjs/commons" "^1.8.3" "@sinonjs/fake-timers" ">=5" "@sinonjs/text-encoding" "^0.7.1" - "just-extend" "^4.0.2" - "path-to-regexp" "^1.7.0" - -"node-html-parser@^5.3.3": - "integrity" "sha512-ncg1033CaX9UexbyA7e1N0aAoAYRDiV8jkTvzEnfd1GDvzFdrsXLzR4p4ik8mwLgnaKP/jyUFWDy9q3jvRT2Jw==" - "resolved" "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.3.3.tgz" - "version" "5.3.3" - dependencies: - "css-select" "^4.2.1" - "he" "1.2.0" - -"nopt-defaults@^0.0.1": - "integrity" "sha1-8VD8yIgjCcv7dhh+Eum8sgaUVYs= sha512-Ri0fmpCibbSQQX4LoYIvt/MmiA/ivo30tDT1ifdN7/Vh4frHHd/SspJHmlDmrpXflVvoFAPMw4u64eW44Ez0lA==" - "resolved" "https://registry.npmjs.org/nopt-defaults/-/nopt-defaults-0.0.1.tgz" - "version" "0.0.1" - -"nopt-usage@^0.1.0": - "integrity" "sha1-sYuMGD4YEEfKnmO3zefPxwLMpXk= sha512-Tg2sISrWBbSsCRqpEMmdxn3KZfacrd0N2NYpZQIq0MHxGHMjwzYlxeB9pVIom/g7CBK28atDUQsTlOfG0wOsNA==" - "resolved" "https://registry.npmjs.org/nopt-usage/-/nopt-usage-0.1.0.tgz" - "version" "0.1.0" - -"nopt@^2.2.0": - "integrity" "sha1-KqCbfRdoSHs7ianFqlIzW/8Lrqc= sha512-gIOTA/uJuhPwFqp+spY7VQ1satbnGlD+iQVZxI18K6hs8Evq4sX81Ml7BB5byP/LsbR2yBVtmvdEmhi7evJ6Aw==" - "resolved" "https://registry.npmjs.org/nopt/-/nopt-2.2.1.tgz" - "version" "2.2.1" - dependencies: - "abbrev" "1" - -"nopt@^3.0.6": - "integrity" "sha1-xkZdvwirzU2zWTF/eaxopkayj/k= sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==" - "resolved" "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" - "version" "3.0.6" - dependencies: - "abbrev" "1" - -"normalize-package-data@^1.0.0": - "integrity" "sha1-i+lVuJB6+XXxpFhOqLubQUkjEvU= sha512-pyPVJAzFiaioifPIsJBEoKJ9YcPHz7UhckZ7wqhBztLLCu6NozkIDrN+frzrCwjXtfunXfaMWIDtcDhnbO8fWA==" - "resolved" "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-1.0.3.tgz" - "version" "1.0.3" - dependencies: - "github-url-from-git" "^1.3.0" - "github-url-from-username-repo" "^1.0.0" - "semver" "2 || 3 || 4" - -"normalize-path@^3.0.0", "normalize-path@~3.0.0": - "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - "version" "3.0.0" - -"npm-license-crawler@^0.2.1": - "integrity" "sha512-CRchloUjZk/ZSAkb5JbCKNFojLWtbjxwsB7w48kauHXK+5bjby2HXFvGvicVx7uNBY6HBWEPw20qKc/4jlL+1Q==" - "resolved" "https://registry.npmjs.org/npm-license-crawler/-/npm-license-crawler-0.2.1.tgz" - "version" "0.2.1" - dependencies: - "async" "^2.6.1" - "chalk" "^2.4.2" - "jquery-extend" "~2.0.3" - "license-checker" "git+https://github.com/mwittig/license-checker.git#d546e3f738e14c62e732346fa355162d46700893" - "mkdirp" "^0.5.1" - "nopt" "^3.0.6" - "nopt-defaults" "^0.0.1" - "nopt-usage" "^0.1.0" - "treeify" "^1.1.0" - -"nth-check@^2.0.1": - "integrity" "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==" - "resolved" "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "boolbase" "^1.0.0" - -"once@^1.3.0": - "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E= sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==" - "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - "version" "1.4.0" - dependencies: - "wrappy" "1" - -"optionator@^0.9.1": - "integrity" "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==" - "resolved" "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" - "version" "0.9.1" - dependencies: - "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.3" - -"p-limit@^3.0.2": - "integrity" "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==" - "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "yocto-queue" "^0.1.0" - -"p-locate@^5.0.0": - "integrity" "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==" - "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - "version" "5.0.0" - dependencies: - "p-limit" "^3.0.2" - -"parent-module@^1.0.0": - "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" - "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "callsites" "^3.0.0" - -"path-exists@^4.0.0": - "integrity" "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - "version" "4.0.0" - -"path-is-absolute@^1.0.0": - "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18= sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - "version" "1.0.1" - -"path-key@^3.1.0": - "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - "version" "3.1.1" - -"path-to-regexp@^1.7.0": - "integrity" "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==" - "resolved" "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" - "version" "1.8.0" - dependencies: - "isarray" "0.0.1" - -"path-type@^4.0.0": - "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - "version" "4.0.0" - -"pathval@^1.1.1": - "integrity" "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==" - "resolved" "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" - "version" "1.1.1" - -"picomatch@^2.0.4", "picomatch@^2.2.1", "picomatch@^2.3.1": - "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - "version" "2.3.1" - -"prelude-ls@^1.2.1": - "integrity" "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" - "resolved" "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" - "version" "1.2.1" - -"prettier@2.7.1": - "integrity" "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==" - "resolved" "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz" - "version" "2.7.1" - -"process-nextick-args@~2.0.0": - "integrity" "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - "resolved" "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" - "version" "2.0.1" - -"punycode@^2.1.0": - "integrity" "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" - "version" "2.1.1" - -"queue-microtask@^1.2.2": - "integrity" "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - "resolved" "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - "version" "1.2.3" - -"randombytes@^2.1.0": - "integrity" "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==" - "resolved" "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "safe-buffer" "^5.1.0" - -"read-installed@~3.1.3": - "integrity" "sha1-SuNgga/T4iBNwuJ5gHqqUsMMjAw= sha512-XxD5VDz32T6rLCFfYElTif8/lkqcs9y51Gs2r30rAfT7LUGzJWaXLrwvn6fXkDsTzGcPr7Pj8CggOxwTxl/ozQ==" - "resolved" "https://registry.npmjs.org/read-installed/-/read-installed-3.1.5.tgz" - "version" "3.1.5" - dependencies: - "debuglog" "^1.0.1" - "read-package-json" "1" - "readdir-scoped-modules" "^1.0.0" - "semver" "2 || 3 || 4" - "slide" "~1.1.3" - "util-extend" "^1.0.1" + just-extend "^4.0.2" + path-to-regexp "^1.7.0" + +node-html-parser@^5.3.3: + version "5.3.3" + resolved "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.3.3.tgz" + integrity sha512-ncg1033CaX9UexbyA7e1N0aAoAYRDiV8jkTvzEnfd1GDvzFdrsXLzR4p4ik8mwLgnaKP/jyUFWDy9q3jvRT2Jw== + dependencies: + css-select "^4.2.1" + he "1.2.0" + +nopt-defaults@^0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/nopt-defaults/-/nopt-defaults-0.0.1.tgz" + integrity "sha1-8VD8yIgjCcv7dhh+Eum8sgaUVYs= sha512-Ri0fmpCibbSQQX4LoYIvt/MmiA/ivo30tDT1ifdN7/Vh4frHHd/SspJHmlDmrpXflVvoFAPMw4u64eW44Ez0lA==" + +nopt-usage@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/nopt-usage/-/nopt-usage-0.1.0.tgz" + integrity "sha1-sYuMGD4YEEfKnmO3zefPxwLMpXk= sha512-Tg2sISrWBbSsCRqpEMmdxn3KZfacrd0N2NYpZQIq0MHxGHMjwzYlxeB9pVIom/g7CBK28atDUQsTlOfG0wOsNA==" + +nopt@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/nopt/-/nopt-2.2.1.tgz" + integrity "sha1-KqCbfRdoSHs7ianFqlIzW/8Lrqc= sha512-gIOTA/uJuhPwFqp+spY7VQ1satbnGlD+iQVZxI18K6hs8Evq4sX81Ml7BB5byP/LsbR2yBVtmvdEmhi7evJ6Aw==" + dependencies: + abbrev "1" + +nopt@^3.0.6: + version "3.0.6" + resolved "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" + integrity "sha1-xkZdvwirzU2zWTF/eaxopkayj/k= sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==" + dependencies: + abbrev "1" + +normalize-package-data@^1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-1.0.3.tgz" + integrity "sha1-i+lVuJB6+XXxpFhOqLubQUkjEvU= sha512-pyPVJAzFiaioifPIsJBEoKJ9YcPHz7UhckZ7wqhBztLLCu6NozkIDrN+frzrCwjXtfunXfaMWIDtcDhnbO8fWA==" + dependencies: + github-url-from-git "^1.3.0" + github-url-from-username-repo "^1.0.0" + semver "2 || 3 || 4" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-license-crawler@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/npm-license-crawler/-/npm-license-crawler-0.2.1.tgz" + integrity sha512-CRchloUjZk/ZSAkb5JbCKNFojLWtbjxwsB7w48kauHXK+5bjby2HXFvGvicVx7uNBY6HBWEPw20qKc/4jlL+1Q== + dependencies: + async "^2.6.1" + chalk "^2.4.2" + jquery-extend "~2.0.3" + license-checker "git+https://github.com/mwittig/license-checker#d546e3f738e14c62e732346fa355162d46700893" + mkdirp "^0.5.1" + nopt "^3.0.6" + nopt-defaults "^0.0.1" + nopt-usage "^0.1.0" + treeify "^1.1.0" + +nth-check@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz" + integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== + dependencies: + boolbase "^1.0.0" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity "sha1-WDsap3WWHUsROsF9nFC6753Xa9E= sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==" + dependencies: + wrappy "1" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + 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.3" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity "sha1-F0uSaHNVNP+8es5r9TpanhtcX18= sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier@2.7.1: + version "2.7.1" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +read-installed@~3.1.3: + version "3.1.5" + resolved "https://registry.npmjs.org/read-installed/-/read-installed-3.1.5.tgz" + integrity "sha1-SuNgga/T4iBNwuJ5gHqqUsMMjAw= sha512-XxD5VDz32T6rLCFfYElTif8/lkqcs9y51Gs2r30rAfT7LUGzJWaXLrwvn6fXkDsTzGcPr7Pj8CggOxwTxl/ozQ==" + dependencies: + debuglog "^1.0.1" + read-package-json "1" + readdir-scoped-modules "^1.0.0" + semver "2 || 3 || 4" + slide "~1.1.3" + util-extend "^1.0.1" optionalDependencies: - "graceful-fs" "2 || 3" + graceful-fs "2 || 3" -"read-package-json@1": - "integrity" "sha1-73nf2kbhZTdu6KV++/7dTRsCm6Q= sha512-9bayCl9cbXy3AL0qXhLQ0vliEgpzUVeLegSOrde3ujTHy2W18UsJiMUXEWkjbBB4ZnJzZPVuo2vAW62j4gY7gg==" - "resolved" "https://registry.npmjs.org/read-package-json/-/read-package-json-1.3.3.tgz" - "version" "1.3.3" +read-package-json@1: + version "1.3.3" + resolved "https://registry.npmjs.org/read-package-json/-/read-package-json-1.3.3.tgz" + integrity "sha1-73nf2kbhZTdu6KV++/7dTRsCm6Q= sha512-9bayCl9cbXy3AL0qXhLQ0vliEgpzUVeLegSOrde3ujTHy2W18UsJiMUXEWkjbBB4ZnJzZPVuo2vAW62j4gY7gg==" dependencies: - "glob" "^5.0.3" - "json-parse-helpfulerror" "^1.0.2" - "normalize-package-data" "^1.0.0" + glob "^5.0.3" + json-parse-helpfulerror "^1.0.2" + normalize-package-data "^1.0.0" optionalDependencies: - "graceful-fs" "2 || 3" - -"readable-stream@^2.0.2", "readable-stream@~2.3.6": - "integrity" "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==" - "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" - "version" "2.3.7" - dependencies: - "core-util-is" "~1.0.0" - "inherits" "~2.0.3" - "isarray" "~1.0.0" - "process-nextick-args" "~2.0.0" - "safe-buffer" "~5.1.1" - "string_decoder" "~1.1.1" - "util-deprecate" "~1.0.1" - -"readdir-scoped-modules@^1.0.0": - "integrity" "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==" - "resolved" "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz" - "version" "1.1.0" - dependencies: - "debuglog" "^1.0.1" - "dezalgo" "^1.0.0" - "graceful-fs" "^4.1.2" - "once" "^1.3.0" - -"readdirp@~3.5.0": - "integrity" "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==" - "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz" - "version" "3.5.0" - dependencies: - "picomatch" "^2.2.1" - -"regenerator-runtime@^0.13.10": - "integrity" "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" - "resolved" "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz" - "version" "0.13.10" - -"regexpp@^3.2.0": - "integrity" "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" - "resolved" "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" - "version" "3.2.0" - -"require-directory@^2.1.1": - "integrity" "sha1-jGStX9MNqxyXbiNE/+f3kqam30I= sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - "resolved" "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - "version" "2.1.1" - -"resolve-from@^4.0.0": - "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - "version" "4.0.0" - -"reusify@^1.0.4": - "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - "resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - "version" "1.0.4" - -"rimraf@^3.0.2": - "integrity" "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==" - "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - "version" "3.0.2" - dependencies: - "glob" "^7.1.3" - -"rimraf@2": - "integrity" "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==" - "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" - "version" "2.7.1" - dependencies: - "glob" "^7.1.3" - -"run-parallel@^1.1.9": - "integrity" "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==" - "resolved" "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - "version" "1.2.0" - dependencies: - "queue-microtask" "^1.2.2" - -"safe-buffer@^5.1.0": - "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - "version" "5.2.1" - -"safe-buffer@~5.1.0": - "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - "version" "5.1.2" - -"safe-buffer@~5.1.1": - "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - "version" "5.1.2" - -"semver@^7.3.5", "semver@^7.3.7": - "integrity" "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==" - "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" - "version" "7.3.7" - dependencies: - "lru-cache" "^6.0.0" + graceful-fs "2 || 3" + +readable-stream@^2.0.2, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdir-scoped-modules@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz" + integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + graceful-fs "^4.1.2" + once "^1.3.0" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +regenerator-runtime@^0.13.10: + version "0.13.10" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz" + integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== + +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity "sha1-jGStX9MNqxyXbiNE/+f3kqam30I= sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@2: + version "2.7.1" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== "semver@2 || 3 || 4": - "integrity" "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= sha512-IrpJ+yoG4EOH8DFWuVg+8H1kW1Oaof0Wxe7cPcXW3x9BjkN/eVo54F15LyqemnDIUYskQWr9qvl/RihmSy6+xQ==" - "resolved" "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" - "version" "4.3.6" + version "4.3.6" + resolved "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" + integrity "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= sha512-IrpJ+yoG4EOH8DFWuVg+8H1kW1Oaof0Wxe7cPcXW3x9BjkN/eVo54F15LyqemnDIUYskQWr9qvl/RihmSy6+xQ==" + +semver@^7.3.5, semver@^7.3.7: + version "7.3.7" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" -"serialize-javascript@5.0.1": - "integrity" "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==" - "resolved" "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz" - "version" "5.0.1" +serialize-javascript@5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== dependencies: - "randombytes" "^2.1.0" + randombytes "^2.1.0" -"setimmediate@~1.0.4": - "integrity" "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - "resolved" "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" - "version" "1.0.5" +setimmediate@~1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + integrity "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" -"shebang-command@^2.0.0": - "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" - "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - "version" "2.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: - "shebang-regex" "^3.0.0" + shebang-regex "^3.0.0" -"shebang-regex@^3.0.0": - "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - "version" "3.0.0" +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -"sinon@^11.1.1": - "integrity" "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==" - "resolved" "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz" - "version" "11.1.2" +sinon@^11.1.1: + version "11.1.2" + resolved "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz" + integrity sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw== dependencies: "@sinonjs/commons" "^1.8.3" "@sinonjs/fake-timers" "^7.1.2" "@sinonjs/samsam" "^6.0.2" - "diff" "^5.0.0" - "nise" "^5.1.0" - "supports-color" "^7.2.0" + diff "^5.0.0" + nise "^5.1.0" + supports-color "^7.2.0" -"slash@^3.0.0": - "integrity" "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - "resolved" "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" - "version" "3.0.0" +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -"slide@~1.1.3": - "integrity" "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==" - "resolved" "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz" - "version" "1.1.6" - -"string_decoder@~1.1.1": - "integrity" "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==" - "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - "version" "1.1.1" - dependencies: - "safe-buffer" "~5.1.0" +slide@~1.1.3: + version "1.1.6" + resolved "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz" + integrity "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==" "string-width@^1.0.2 || 2": - "integrity" "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==" - "resolved" "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" - "version" "2.1.1" + version "2.1.1" + resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: - "is-fullwidth-code-point" "^2.0.0" - "strip-ansi" "^4.0.0" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" -"string-width@^4.1.0": - "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" - "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - "version" "4.2.3" +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: - "emoji-regex" "^8.0.0" - "is-fullwidth-code-point" "^3.0.0" - "strip-ansi" "^6.0.1" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" -"string-width@^4.2.0": - "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" - "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - "version" "4.2.3" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: - "emoji-regex" "^8.0.0" - "is-fullwidth-code-point" "^3.0.0" - "strip-ansi" "^6.0.1" + safe-buffer "~5.1.0" -"strip-ansi@^0.3.0": - "integrity" "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA= sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==" - "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz" - "version" "0.3.0" +strip-ansi@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz" + integrity "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA= sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==" dependencies: - "ansi-regex" "^0.2.1" + ansi-regex "^0.2.1" -"strip-ansi@^4.0.0": - "integrity" "sha1-qEeQIusaw2iocTibY1JixQXuNo8= sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==" - "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" - "version" "4.0.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" + integrity "sha1-qEeQIusaw2iocTibY1JixQXuNo8= sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==" dependencies: - "ansi-regex" "^3.0.0" + ansi-regex "^3.0.0" -"strip-ansi@^6.0.0", "strip-ansi@^6.0.1": - "integrity" "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" - "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - "version" "6.0.1" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - "ansi-regex" "^5.0.1" + ansi-regex "^5.0.1" -"strip-bom@^3.0.0": - "integrity" "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" - "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" - "version" "3.0.0" +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" -"strip-json-comments@^3.1.0", "strip-json-comments@^3.1.1", "strip-json-comments@3.1.1": - "integrity" "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - "version" "3.1.1" +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -"strnum@^1.0.4": - "integrity" "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" - "resolved" "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz" - "version" "1.0.5" +strnum@^1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== -"supports-color@^0.2.0": - "integrity" "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo= sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" - "version" "0.2.0" - -"supports-color@^5.3.0": - "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - "version" "5.5.0" +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: - "has-flag" "^3.0.0" + has-flag "^4.0.0" + +supports-color@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" + integrity "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo= sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==" -"supports-color@^7.1.0", "supports-color@^7.2.0": - "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - "version" "7.2.0" +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: - "has-flag" "^4.0.0" + has-flag "^3.0.0" -"supports-color@8.1.1": - "integrity" "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - "version" "8.1.1" +supports-color@^7.1.0, supports-color@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: - "has-flag" "^4.0.0" + has-flag "^4.0.0" -"text-table@^0.2.0": - "integrity" "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" - "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - "version" "0.2.0" +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" -"to-regex-range@^5.0.1": - "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" - "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - "version" "5.0.1" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: - "is-number" "^7.0.0" + is-number "^7.0.0" "traverse@>=0.3.0 <0.4": - "integrity" "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==" - "resolved" "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz" - "version" "0.3.9" + version "0.3.9" + resolved "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz" + integrity "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==" -"treeify@^1.0.1", "treeify@^1.1.0": - "integrity" "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==" - "resolved" "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz" - "version" "1.1.0" +treeify@^1.0.1, treeify@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz" + integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== -"ts-unused-exports@^8.0.0": - "integrity" "sha512-gylHFyJqC80PSb4zy35KTckykEW1vmKjnOHjBeX9iKBo4b/SzqQIcXXbYSuif4YMgNm6ewFF62VM1C9z0bGZPw==" - "resolved" "https://registry.npmjs.org/ts-unused-exports/-/ts-unused-exports-8.0.0.tgz" - "version" "8.0.0" +ts-unused-exports@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/ts-unused-exports/-/ts-unused-exports-8.0.0.tgz" + integrity sha512-gylHFyJqC80PSb4zy35KTckykEW1vmKjnOHjBeX9iKBo4b/SzqQIcXXbYSuif4YMgNm6ewFF62VM1C9z0bGZPw== dependencies: - "chalk" "^4.0.0" - "tsconfig-paths" "^3.9.0" + chalk "^4.0.0" + tsconfig-paths "^3.9.0" -"tsconfig-paths@^3.9.0": - "integrity" "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==" - "resolved" "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz" - "version" "3.14.1" +tsconfig-paths@^3.9.0: + version "3.14.1" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== dependencies: "@types/json5" "^0.0.29" - "json5" "^1.0.1" - "minimist" "^1.2.6" - "strip-bom" "^3.0.0" - -"tslib@^1.8.1": - "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - "version" "1.14.1" - -"tsutils@^3.21.0": - "integrity" "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==" - "resolved" "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" - "version" "3.21.0" - dependencies: - "tslib" "^1.8.1" - -"type-check@^0.4.0", "type-check@~0.4.0": - "integrity" "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==" - "resolved" "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" - "version" "0.4.0" - dependencies: - "prelude-ls" "^1.2.1" - -"type-detect@^4.0.0", "type-detect@^4.0.5", "type-detect@^4.0.8", "type-detect@4.0.8": - "integrity" "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" - "resolved" "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" - "version" "4.0.8" - -"type-fest@^0.20.2": - "integrity" "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" - "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" - "version" "0.20.2" - -"typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", "typescript@>=3.8.3", "typescript@4.6.3": - "integrity" "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==" - "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz" - "version" "4.6.3" - -"unzipper@^0.10.11": - "integrity" "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==" - "resolved" "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz" - "version" "0.10.11" - dependencies: - "big-integer" "^1.6.17" - "binary" "~0.3.0" - "bluebird" "~3.4.1" - "buffer-indexof-polyfill" "~1.0.0" - "duplexer2" "~0.1.4" - "fstream" "^1.0.12" - "graceful-fs" "^4.2.2" - "listenercount" "~1.0.1" - "readable-stream" "~2.3.6" - "setimmediate" "~1.0.4" - -"uri-js@^4.2.2": - "integrity" "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==" - "resolved" "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - "version" "4.4.1" - dependencies: - "punycode" "^2.1.0" - -"util-deprecate@~1.0.1": - "integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - "version" "1.0.2" - -"util-extend@^1.0.1": - "integrity" "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8= sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA==" - "resolved" "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz" - "version" "1.0.3" - -"uuid@^9.0.0": - "integrity" "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" - "resolved" "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz" - "version" "9.0.0" - -"v8-compile-cache@^2.0.3": - "integrity" "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" - "resolved" "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" - "version" "2.3.0" - -"vscode-uri@^3.0.6": - "integrity" "sha512-fmL7V1eiDBFRRnu+gfRWTzyPpNIHJTc4mWnFkwBUmO9U3KPgJAmTx7oxi2bl/Rh6HLdU7+4C9wlj0k2E4AdKFQ==" - "resolved" "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.6.tgz" - "version" "3.0.6" - -"which@^2.0.1", "which@2.0.2": - "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" - "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - "version" "2.0.2" - dependencies: - "isexe" "^2.0.0" - -"wide-align@1.1.3": - "integrity" "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==" - "resolved" "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz" - "version" "1.1.3" - dependencies: - "string-width" "^1.0.2 || 2" - -"word-wrap@^1.2.3": - "integrity" "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" - "resolved" "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" - "version" "1.2.3" - -"workerpool@6.1.0": - "integrity" "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==" - "resolved" "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz" - "version" "6.1.0" - -"wrap-ansi@^7.0.0": - "integrity" "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==" - "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - "version" "7.0.0" - dependencies: - "ansi-styles" "^4.0.0" - "string-width" "^4.1.0" - "strip-ansi" "^6.0.0" - -"wrappy@1": - "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - "version" "1.0.2" - -"y18n@^5.0.5": - "integrity" "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - "resolved" "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" - "version" "5.0.8" - -"yallist@^4.0.0": - "integrity" "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - "resolved" "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - "version" "4.0.0" - -"yargs-parser@^20.2.2", "yargs-parser@20.2.4": - "integrity" "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" - "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" - "version" "20.2.4" - -"yargs-unparser@2.0.0": - "integrity" "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==" - "resolved" "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "camelcase" "^6.0.0" - "decamelize" "^4.0.0" - "flat" "^5.0.2" - "is-plain-obj" "^2.1.0" - -"yargs@16.2.0": - "integrity" "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==" - "resolved" "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" - "version" "16.2.0" - dependencies: - "cliui" "^7.0.2" - "escalade" "^3.1.1" - "get-caller-file" "^2.0.5" - "require-directory" "^2.1.1" - "string-width" "^4.2.0" - "y18n" "^5.0.5" - "yargs-parser" "^20.2.2" - -"yocto-queue@^0.1.0": - "integrity" "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" - "resolved" "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - "version" "0.1.0" + json5 "^1.0.1" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typescript@4.6.3: + version "4.6.3" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz" + integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== + +unzipper@^0.10.11: + version "0.10.11" + resolved "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz" + integrity sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw== + dependencies: + big-integer "^1.6.17" + binary "~0.3.0" + bluebird "~3.4.1" + buffer-indexof-polyfill "~1.0.0" + duplexer2 "~0.1.4" + fstream "^1.0.12" + graceful-fs "^4.2.2" + listenercount "~1.0.1" + readable-stream "~2.3.6" + setimmediate "~1.0.4" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + +util-extend@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz" + integrity "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8= sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA==" + +uuid@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +vscode-uri@^3.0.6: + version "3.0.6" + resolved "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.6.tgz" + integrity sha512-fmL7V1eiDBFRRnu+gfRWTzyPpNIHJTc4mWnFkwBUmO9U3KPgJAmTx7oxi2bl/Rh6HLdU7+4C9wlj0k2E4AdKFQ== + +which@2.0.2, which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +workerpool@6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz" + integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@20.2.4, yargs-parser@^20.2.2: + version "20.2.4" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From fd8b41367f495b328dce820332b76d57550d60a9 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Mon, 14 Nov 2022 10:13:28 +0100 Subject: [PATCH 32/84] restore normal methods for position and range --- src/libs/common/ide/Position.ts | 35 +++++++++++++++------------------ src/libs/common/ide/Range.ts | 24 +++++++++++----------- 2 files changed, 28 insertions(+), 31 deletions(-) diff --git a/src/libs/common/ide/Position.ts b/src/libs/common/ide/Position.ts index 47315fecde..224ec86e1d 100644 --- a/src/libs/common/ide/Position.ts +++ b/src/libs/common/ide/Position.ts @@ -25,9 +25,9 @@ export default class Position { * @return `true` if the line and character of the given position are equal to * the line and character of this position. */ - public isEqual = (other: Position): boolean => { + public isEqual(other: Position): boolean { return this.line === other.line && this.character === other.character; - }; + } /** * Check if this position is before `other`. @@ -36,7 +36,7 @@ export default class Position { * @return `true` if position is on a smaller line * or on the same line on a smaller character. */ - public isBefore = (other: Position): boolean => { + public isBefore(other: Position): boolean { if (this.line < other.line) { return true; } @@ -44,7 +44,7 @@ export default class Position { return false; } return this.character < other.character; - }; + } /** * Check if this position is after `other`. @@ -53,7 +53,7 @@ export default class Position { * @return `true` if position is on a greater line * or on the same line on a greater character. */ - public isAfter = (other: Position): boolean => { + public isAfter(other: Position): boolean { if (this.line > other.line) { return true; } @@ -61,7 +61,7 @@ export default class Position { return false; } return this.character > other.character; - }; + } /** * Check if this position is before or equal to `other`. @@ -70,9 +70,9 @@ export default class Position { * @return `true` if position is on a smaller line * or on the same line on a smaller or equal character. */ - public isBeforeOrEqual = (other: Position): boolean => { + public isBeforeOrEqual(other: Position): boolean { return this.isEqual(other) || this.isBefore(other); - }; + } /** * Check if this position is after or equal to `other`. @@ -81,9 +81,9 @@ export default class Position { * @return `true` if position is on a greater line * or on the same line on a greater or equal character. */ - public isAfterOrEqual = (other: Position): boolean => { + public isAfterOrEqual(other: Position): boolean { return this.isEqual(other) || this.isAfter(other); - }; + } /** * Compare this to `other`. @@ -93,7 +93,7 @@ export default class Position { * a number greater than zero if this position is after the given position, or zero when * this and the given position are equal. */ - public compareTo = (other: Position): number => { + public compareTo(other: Position): number { if (this.isBefore(other)) { return -1; } @@ -101,7 +101,7 @@ export default class Position { return 1; } return 0; - }; + } /** * Create a new position derived from this position. @@ -110,9 +110,9 @@ export default class Position { * @param character Value that should be used as character value, default is the {@link Position.character existing value} * @return A position where line and character are replaced by the given values. */ - public with = (line?: number, character?: number): Position => { + public with(line?: number, character?: number): Position { return new Position(line ?? this.line, character ?? this.character); - }; + } /** * Create a new position relative to this position. @@ -122,13 +122,10 @@ export default class Position { * @return A position which line and character is the sum of the current line and * character and the corresponding deltas. */ - public translate = ( - lineDelta?: number, - characterDelta?: number, - ): Position => { + public translate(lineDelta?: number, characterDelta?: number): Position { return new Position( this.line + (lineDelta ?? 0), this.character + (characterDelta ?? 0), ); - }; + } } diff --git a/src/libs/common/ide/Range.ts b/src/libs/common/ide/Range.ts index 0ac9805854..eaadf59937 100644 --- a/src/libs/common/ide/Range.ts +++ b/src/libs/common/ide/Range.ts @@ -90,9 +90,9 @@ export default class Range { * @return `true` when start and end are {@link Position.isEqual equal} to * start and end of this range. */ - public isEqual = (other: Range): boolean => { + public isEqual(other: Range): boolean { return this.start.isEqual(other.start) && this.end.isEqual(other.end); - }; + } /** * Check if a position or a range is contained in this range. @@ -101,13 +101,13 @@ export default class Range { * @return `true` if the position or range is inside or equal * to this range. */ - public contains = (positionOrRange: Position | Range): boolean => { + public contains(positionOrRange: Position | Range): boolean { const [start, end] = "line" in positionOrRange ? [positionOrRange, positionOrRange] : [positionOrRange.start, positionOrRange.end]; return start.isAfterOrEqual(this.start) && end.isBeforeOrEqual(this.end); - }; + } /** * Intersect `range` with this range and returns a new range or `undefined` @@ -117,11 +117,11 @@ export default class Range { * @return A range of the greater start and smaller end positions. Will * return undefined when there is no overlap. */ - public intersection = (other: Range): Range | undefined => { + public intersection(other: Range): Range | undefined { const start = this.start.isAfter(other.start) ? this.start : other.start; const end = this.end.isBefore(other.end) ? this.end : other.end; return start.isBeforeOrEqual(end) ? new Range(start, end) : undefined; - }; + } /** * Compute the union of `other` with this range. @@ -129,12 +129,12 @@ export default class Range { * @param other A range. * @return A range of smaller start position and the greater end position. */ - public union = (other: Range): Range => { + public union(other: Range): Range { return new Range( this.start.isBefore(other.start) ? this.start : other.start, this.end.isAfter(other.end) ? this.end : other.end, ); - }; + } /** * Derived a new range from this range. @@ -144,18 +144,18 @@ export default class Range { * @return A range derived from this range with the given start and end position. * If start and end are not different `this` range will be returned. */ - public with = (start?: Position, end?: Position): Range => { + public with(start?: Position, end?: Position): Range { return new Range(start ?? this.start, end ?? this.end); - }; + } /** * Construct a new selection from this range * @param isReversed If true active is before anchor * @returns A new selection */ - public toSelection = (isReversed: boolean): Selection => { + public toSelection(isReversed: boolean): Selection { return isReversed ? new Selection(this.end, this.start) : new Selection(this.start, this.end); - }; + } } From 9ff9912a932fdb81774e119bb3086bfe29f3cc68 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Mon, 14 Nov 2022 13:19:22 +0100 Subject: [PATCH 33/84] Remove arrow expressions as method --- .../vscode/VscodeEditableTextEditorImpl.ts | 24 +++++++++---------- src/ide/vscode/VscodeIDE.ts | 2 +- src/ide/vscode/VscodeTextDocumentImpl.ts | 16 ++++++------- src/ide/vscode/VscodeTextEditorImpl.ts | 4 ++-- src/processTargets/targets/ParagraphTarget.ts | 14 +++++------ src/util/nodeSelectors.ts | 6 ++--- 6 files changed, 32 insertions(+), 34 deletions(-) diff --git a/src/ide/vscode/VscodeEditableTextEditorImpl.ts b/src/ide/vscode/VscodeEditableTextEditorImpl.ts index a4c1235a06..7cdd38d320 100644 --- a/src/ide/vscode/VscodeEditableTextEditorImpl.ts +++ b/src/ide/vscode/VscodeEditableTextEditorImpl.ts @@ -39,29 +39,29 @@ export default class VscodeEditableTextEditorImpl this.editor.options = options; } - public revealRange = (range: Range): void => { + public revealRange(range: Range): void { this.editor.revealRange(toVscodeRange(range)); - }; + } - public setDecorations = ( + public setDecorations( decorationType: TextEditorDecorationType, ranges: readonly Range[], - ): void => { + ): void { this.editor.setDecorations(decorationType, ranges.map(toVscodeRange)); - }; + } - public edit = ( + public edit( callback: (editBuilder: TextEditorEdit) => void, options?: { undoStopBefore: boolean; undoStopAfter: boolean }, - ): Thenable => { + ): Thenable { return vscodeEditEditor(this.editor, callback, options); - }; + } - public focus = (): Promise => { + public focus(): Promise { return vscodeFocusEditor(this.editor, this.id); - }; + } - public openLink = (location: Position | Range): Promise => { + public openLink(location: Position | Range): Promise { return vscodeOpenLink(this.editor, toVscodePositionOrRange(location)); - }; + } } diff --git a/src/ide/vscode/VscodeIDE.ts b/src/ide/vscode/VscodeIDE.ts index e95967f96c..08f8c9b086 100644 --- a/src/ide/vscode/VscodeIDE.ts +++ b/src/ide/vscode/VscodeIDE.ts @@ -64,7 +64,7 @@ export default class VscodeIDE implements IDE { return new VscodeEditableTextEditorImpl(toVscodeEditor(editor)); } - onDidChangeTextDocument( + public onDidChangeTextDocument( listener: (event: TextDocumentChangeEvent) => void, ): Disposable { return vscodeOnDidChangeTextDocument(listener); diff --git a/src/ide/vscode/VscodeTextDocumentImpl.ts b/src/ide/vscode/VscodeTextDocumentImpl.ts index 2abb03aee1..4fdfeb247a 100644 --- a/src/ide/vscode/VscodeTextDocumentImpl.ts +++ b/src/ide/vscode/VscodeTextDocumentImpl.ts @@ -35,7 +35,7 @@ export default class VscodeTextDocumentImpl implements TextDocument { constructor(private document: vscode.TextDocument) {} - public lineAt = (lineOrPosition: number | Position): TextLine => { + public lineAt(lineOrPosition: number | Position): TextLine { return fromVscodeTextLine( this.document.lineAt( typeof lineOrPosition === "number" @@ -43,19 +43,19 @@ export default class VscodeTextDocumentImpl implements TextDocument { : lineOrPosition.line, ), ); - }; + } - public offsetAt = (position: Position): number => { + public offsetAt(position: Position): number { return this.document.offsetAt(toVscodePosition(position)); - }; + } - public positionAt = (offset: number): Position => { + public positionAt(offset: number): Position { return fromVscodePosition(this.document.positionAt(offset)); - }; + } - public getText = (range?: Range): string => { + public getText(range?: Range): string { return this.document.getText( range != null ? toVscodeRange(range) : undefined, ); - }; + } } diff --git a/src/ide/vscode/VscodeTextEditorImpl.ts b/src/ide/vscode/VscodeTextEditorImpl.ts index 351ce05f8d..a6d077bc36 100644 --- a/src/ide/vscode/VscodeTextEditorImpl.ts +++ b/src/ide/vscode/VscodeTextEditorImpl.ts @@ -36,7 +36,7 @@ export default class VscodeTextEditorImpl implements TextEditor { return this.editor.options; } - public isEqual = (other: TextEditor): boolean => { + public isEqual(other: TextEditor): boolean { return this.id === other.id; - }; + } } diff --git a/src/processTargets/targets/ParagraphTarget.ts b/src/processTargets/targets/ParagraphTarget.ts index fb3d5a9652..737e8a116f 100644 --- a/src/processTargets/targets/ParagraphTarget.ts +++ b/src/processTargets/targets/ParagraphTarget.ts @@ -118,8 +118,7 @@ export default class ParagraphTarget extends BaseTarget { function getLeadingDelimiterRange(editor: TextEditor, contentRange: Range) { const { document } = editor; - const { lineAt } = document; - const startLine = lineAt(contentRange.start); + const startLine = document.lineAt(contentRange.start); const leadingLine = getPreviousNonEmptyLine(document, startLine); // Lines are next to each other so they can be no delimiter range if (leadingLine != null) { @@ -128,14 +127,14 @@ function getLeadingDelimiterRange(editor: TextEditor, contentRange: Range) { } return new Range( new Position(leadingLine.lineNumber + 1, 0), - lineAt(startLine.lineNumber - 1).range.end, + document.lineAt(startLine.lineNumber - 1).range.end, ); } // Leading delimiter to start of file if (startLine.lineNumber > 0) { return new Range( new Position(0, 0), - lineAt(startLine.lineNumber - 1).range.end, + document.lineAt(startLine.lineNumber - 1).range.end, ); } return undefined; @@ -143,8 +142,7 @@ function getLeadingDelimiterRange(editor: TextEditor, contentRange: Range) { function getTrailingDelimiterRange(editor: TextEditor, contentRange: Range) { const { document } = editor; - const { lineAt } = document; - const endLine = lineAt(contentRange.end); + const endLine = document.lineAt(contentRange.end); const trailingLine = getNextNonEmptyLine(document, endLine); if (trailingLine != null) { if (trailingLine.lineNumber - 1 === endLine.lineNumber) { @@ -152,14 +150,14 @@ function getTrailingDelimiterRange(editor: TextEditor, contentRange: Range) { } return new Range( new Position(endLine.lineNumber + 1, 0), - lineAt(trailingLine.lineNumber - 1).range.end, + document.lineAt(trailingLine.lineNumber - 1).range.end, ); } // Trailing delimiter to end of file if (endLine.lineNumber < document.lineCount - 1) { return new Range( new Position(endLine.lineNumber + 1, 0), - lineAt(document.lineCount - 1).range.end, + document.lineAt(document.lineCount - 1).range.end, ); } return undefined; diff --git a/src/util/nodeSelectors.ts b/src/util/nodeSelectors.ts index 9db4007288..bc32ee7362 100644 --- a/src/util/nodeSelectors.ts +++ b/src/util/nodeSelectors.ts @@ -427,13 +427,13 @@ export function getInsertionDelimiter( trailingDelimiterRange: Range | undefined, defaultDelimiterInsertion: string, ) { - const { getText } = editor.document; + const { document } = editor; const delimiters = [ trailingDelimiterRange != null - ? getText(trailingDelimiterRange) + ? document.getText(trailingDelimiterRange) : defaultDelimiterInsertion, leadingDelimiterRange != null - ? getText(leadingDelimiterRange) + ? document.getText(leadingDelimiterRange) : defaultDelimiterInsertion, ]; From 1b8899ea6627902c53d1d7c58d87c8170ef4ecd5 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Mon, 14 Nov 2022 13:32:02 +0100 Subject: [PATCH 34/84] added is active on the text editor --- src/actions/CommandAction.ts | 2 +- src/actions/Paste.ts | 2 +- src/actions/Scroll.ts | 4 ++-- src/ide/vscode/VscodeTextEditorImpl.ts | 7 +++++-- src/libs/common/ide/types/TextEditor.ts | 5 +++++ 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/actions/CommandAction.ts b/src/actions/CommandAction.ts index 3583c4aa29..6c49576df1 100644 --- a/src/actions/CommandAction.ts +++ b/src/actions/CommandAction.ts @@ -137,7 +137,7 @@ export default class CommandAction implements Action { if ( actualOptions.restoreSelection && originalEditor != null && - originalEditor !== ide().activeTextEditor + !originalEditor.isActive ) { // NB: We just do one editor focus at the end, instead of using // setSelectionsAndFocusEditor because the command might operate on diff --git a/src/actions/Paste.ts b/src/actions/Paste.ts index e7ca5cd2a8..822b1576f2 100644 --- a/src/actions/Paste.ts +++ b/src/actions/Paste.ts @@ -56,7 +56,7 @@ export class Paste { ); // If necessary focus back original editor - if (originalEditor != null && originalEditor !== ide().activeTextEditor) { + if (originalEditor != null && !originalEditor.isActive) { // NB: We just do one editor focus at the end, instead of using // setSelectionsAndFocusEditor because the command might operate on // multiple editors, so we just do one focus at the end. diff --git a/src/actions/Scroll.ts b/src/actions/Scroll.ts index e7200dd999..d5cbd7cadb 100644 --- a/src/actions/Scroll.ts +++ b/src/actions/Scroll.ts @@ -21,7 +21,7 @@ class Scroll implements Action { for (const lineWithEditor of lines) { // For reveal line to the work we have to have the correct editor focused - if (lineWithEditor.editor !== ide().activeTextEditor) { + if (!lineWithEditor.editor.isActive) { await ide().getEditableTextEditor(lineWithEditor.editor).focus(); } await commands.executeCommand("revealLine", { @@ -31,7 +31,7 @@ class Scroll implements Action { } // If necessary focus back original editor - if (originalEditor != null && originalEditor !== ide().activeTextEditor) { + if (originalEditor != null && !originalEditor.isActive) { await originalEditor.focus(); } diff --git a/src/ide/vscode/VscodeTextEditorImpl.ts b/src/ide/vscode/VscodeTextEditorImpl.ts index a6d077bc36..e4ead46ce8 100644 --- a/src/ide/vscode/VscodeTextEditorImpl.ts +++ b/src/ide/vscode/VscodeTextEditorImpl.ts @@ -1,7 +1,6 @@ import { v4 as uuid } from "uuid"; import * as vscode from "vscode"; -import type { Range } from "../../libs/common/ide"; -import type { Selection } from "../../libs/common/ide"; +import type { Range, Selection } from "../../libs/common/ide"; import type TextDocument from "../../libs/common/ide/types/TextDocument"; import type { TextEditor } from "../../libs/common/ide/types/TextEditor"; import type { TextEditorOptions } from "../../libs/common/ide/types/TextEditorOptions"; @@ -36,6 +35,10 @@ export default class VscodeTextEditorImpl implements TextEditor { return this.editor.options; } + get isActive(): boolean { + return this.editor === vscode.window.activeTextEditor; + } + public isEqual(other: TextEditor): boolean { return this.id === other.id; } diff --git a/src/libs/common/ide/types/TextEditor.ts b/src/libs/common/ide/types/TextEditor.ts index 44c6cef6c5..d866323535 100644 --- a/src/libs/common/ide/types/TextEditor.ts +++ b/src/libs/common/ide/types/TextEditor.ts @@ -33,6 +33,11 @@ export interface TextEditor { */ readonly options: TextEditorOptions; + /** + * True if this text editor is active. + */ + readonly isActive: boolean; + /** * Check if this text editor is equal to `other`. * From 0ad551dd9d858f120c9aef479c37d4eb0432fb59 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Mon, 14 Nov 2022 13:40:04 +0100 Subject: [PATCH 35/84] Error when trying to deselect all selections --- src/actions/Deselect.ts | 18 +++++++++++++----- .../recorded/actions/giveHarpAndWhale.yml | 19 +------------------ 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/src/actions/Deselect.ts b/src/actions/Deselect.ts index ee4f25348c..f7e4e78524 100644 --- a/src/actions/Deselect.ts +++ b/src/actions/Deselect.ts @@ -1,4 +1,3 @@ -import { Selection } from "../libs/common/ide"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; @@ -21,12 +20,14 @@ export default class Deselect implements Action { return intersection && (!intersection.isEmpty || selection.isEmpty); }), ); - // The editor requires at least one selection. Keep "primary" selection active + + if (newSelections.length === 0) { + throw new SelectionRequiredError(); + } + setSelectionsWithoutFocusingEditor( ide().getEditableTextEditor(editor), - newSelections.length > 0 - ? newSelections - : [new Selection(editor.selections[0].active)], + newSelections, ); }); @@ -35,3 +36,10 @@ export default class Deselect implements Action { }; } } + +class SelectionRequiredError extends Error { + constructor() { + super("Can't deselect every selection. At least one is required"); + this.name = "SelectionRequiredError"; + } +} diff --git a/src/test/suite/fixtures/recorded/actions/giveHarpAndWhale.yml b/src/test/suite/fixtures/recorded/actions/giveHarpAndWhale.yml index dd8d7dff61..6bfb31c2c2 100644 --- a/src/test/suite/fixtures/recorded/actions/giveHarpAndWhale.yml +++ b/src/test/suite/fixtures/recorded/actions/giveHarpAndWhale.yml @@ -24,22 +24,5 @@ initialState: default.w: start: {line: 0, character: 6} end: {line: 0, character: 11} -finalState: - documentContents: hello world - selections: - - anchor: {line: 0, character: 5} - active: {line: 0, character: 5} - thatMark: - - type: UntypedTarget - contentRange: - start: {line: 0, character: 0} - end: {line: 0, character: 5} - isReversed: false - hasExplicitRange: false - - type: UntypedTarget - contentRange: - start: {line: 0, character: 6} - end: {line: 0, character: 11} - isReversed: false - hasExplicitRange: false fullTargets: [{type: list, elements: [{type: primitive, mark: {type: decoratedSymbol, symbolColor: default, character: h}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: identity}}, {type: primitive, mark: {type: decoratedSymbol, symbolColor: default, character: w}, selectionType: token, position: contents, insideOutsideType: inside, modifier: {type: identity}}]}] +thrownError: {name: SelectionRequiredError} From b9934a38d00a8528b9a3e962743a39464d62af36 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Mon, 14 Nov 2022 13:45:28 +0100 Subject: [PATCH 36/84] added types --- src/libs/common/ide/Range.ts | 4 ++-- src/libs/common/ide/Selection.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libs/common/ide/Range.ts b/src/libs/common/ide/Range.ts index eaadf59937..4b4f4669ec 100644 --- a/src/libs/common/ide/Range.ts +++ b/src/libs/common/ide/Range.ts @@ -44,7 +44,7 @@ export default class Range { ); constructor(...args: any[]) { - const [start, end] = (() => { + const [start, end]: [Position, Position] = (() => { // Arguments are one positions if (args.length === 1) { return [args[0], args[0]]; @@ -52,7 +52,7 @@ export default class Range { // Arguments are two positions if (args.length === 2) { - return args; + return args as [Position, Position]; } // Arguments are four numbers diff --git a/src/libs/common/ide/Selection.ts b/src/libs/common/ide/Selection.ts index 776c4c1453..16ececa55b 100644 --- a/src/libs/common/ide/Selection.ts +++ b/src/libs/common/ide/Selection.ts @@ -51,7 +51,7 @@ export default class Selection extends Range { ); constructor(...args: any[]) { - const [anchor, active] = (() => { + const [anchor, active]: [Position, Position] = (() => { // Arguments are one positions if (args.length === 1) { return [args[0], args[0]]; @@ -59,7 +59,7 @@ export default class Selection extends Range { // Arguments are two positions if (args.length === 2) { - return args; + return args as [Position, Position]; } // Arguments are four numbers From 014c6182be60a8d35ba72aca609bfa24ab588c4f Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Mon, 14 Nov 2022 15:28:07 +0100 Subject: [PATCH 37/84] Make use of `@cursorless` imports --- src/actions/BringMoveSwap.ts | 3 +- src/actions/EditNew/EditNew.types.ts | 2 +- src/actions/EditNew/runCommandTargets.ts | 2 +- src/actions/EditNew/runEditTargets.ts | 3 +- src/actions/EditNew/runNotebookCellTargets.ts | 2 +- .../GenerateSnippet/GenerateSnippet.ts | 2 +- src/actions/InsertCopy.ts | 3 +- src/actions/InsertEmptyLines.ts | 3 +- src/actions/SetSelection.ts | 2 +- src/actions/ToggleBreakpoint.ts | 2 +- src/actions/Wrap.ts | 2 +- .../suite/groupByDocument.test.ts | 2 +- .../suite/prePhraseSnapshot.test.ts | 3 +- .../cursorless-vscode/getMatchesInRange.ts | 5 ++- src/core/Debug.ts | 4 +-- src/core/IndividualHatMap.ts | 3 +- src/core/editStyles.ts | 4 +-- src/core/updateSelections/RangeUpdater.ts | 2 +- src/core/updateSelections/updateSelections.ts | 5 +-- src/extension.ts | 2 +- src/ide/vscode/VscodeEditEditor.ts | 6 ++-- .../vscode/VscodeEditableTextEditorImpl.ts | 29 ++++++++------- src/ide/vscode/VscodeEvents.ts | 3 +- src/ide/vscode/VscodeIDE.ts | 12 +++---- src/ide/vscode/VscodeRunMode.ts | 6 ++-- src/ide/vscode/VscodeTextDocumentImpl.ts | 15 ++++---- src/ide/vscode/VscodeTextEditorImpl.ts | 21 ++++++----- src/ide/vscode/VscodeTextLineImpl.ts | 5 ++- src/ide/vscode/fromVscodeEditor.ts | 12 +++++++ src/ide/vscode/vscodeIdeUtil.ts | 22 ++++++++++++ src/languages/getTextFragmentExtractor.ts | 14 ++++---- src/languages/latex.ts | 4 +-- src/languages/markdown.ts | 6 ++-- src/languages/php.ts | 5 ++- src/languages/python.ts | 2 +- src/languages/rust.ts | 2 +- src/libs/common/ide/fake/FakeIDE.ts | 2 +- src/libs/common/ide/index.ts | 3 -- src/libs/common/ide/spy/SpyIDE.ts | 2 +- src/libs/common/ide/types/Events.ts | 3 +- src/libs/common/ide/types/ide.types.ts | 2 +- src/libs/common/index.ts | 10 ++++++ src/libs/common/{ide => types}/Location.ts | 6 ++-- src/libs/common/{ide => types}/Position.ts | 2 +- src/libs/common/{ide => types}/Range.ts | 4 +-- src/libs/common/{ide => types}/Selection.ts | 4 +-- .../common/{ide => }/types/TextDocument.ts | 6 ++-- src/libs/common/{ide => }/types/TextEditor.ts | 16 +++++---- .../types/TextEditorDecorationType.ts | 0 .../common/{ide => }/types/TextEditorEdit.ts | 7 ++-- .../{ide => }/types/TextEditorOptions.ts | 0 src/libs/common/{ide => }/types/TextLine.ts | 4 +-- .../common/{ide => types}/position.test.ts | 2 +- src/libs/common/{ide => types}/range.test.ts | 2 +- .../vscode-common}/VscodeUtil.ts | 36 +------------------ src/libs/vscode-common/index.ts | 1 + .../vscode-common/testUtil/takeSnapshot.ts | 8 ++--- .../vscode-common/testUtil/testConstants.ts | 2 +- .../vscode-common/testUtil/toPlainObject.ts | 4 +-- src/processTargets/marks/LineNumberStage.ts | 2 +- .../modifiers/ContainingScopeStage.ts | 7 ++-- .../modifiers/EveryScopeStage.ts | 2 +- src/processTargets/modifiers/HeadTailStage.ts | 2 +- .../modifiers/ItemStage/ItemStage.ts | 3 +- .../modifiers/ItemStage/getIterationScope.ts | 3 +- .../modifiers/ItemStage/tokenizeRange.ts | 3 +- .../modifiers/RelativeInclusiveScopeStage.ts | 3 +- .../modifiers/getContainingScope.ts | 3 +- .../modifiers/relativeScopeLegacy.ts | 2 +- .../scopeHandlers/BaseScopeHandler.ts | 4 +-- .../scopeHandlers/DocumentScopeHandler.ts | 3 +- .../scopeHandlers/LineScopeHandler.ts | 4 +-- .../scopeHandlers/NestedScopeHandler.ts | 3 +- .../scopeHandlers/OneOfScopeHandler.ts | 3 +- .../scopeHandlers/ParagraphScopeHandler.ts | 12 ++++--- .../SurroundingPairScopeHandler.ts | 3 +- .../scopeHandlers/WordScopeHandler.ts | 5 ++- .../scopeHandlers/compareTargetScopes.ts | 3 +- .../getScopeRelativeToPosition.ts | 3 +- .../getScopesOverlappingRange.ts | 3 +- .../modifiers/scopeHandlers/scope.types.ts | 3 +- .../scopeHandlers/scopeHandler.types.ts | 3 +- .../scopeHandlers/shouldYieldScope.ts | 2 +- .../ContainingSyntaxScopeStage.ts | 7 ++-- .../modifiers/scopeTypeStages/RegexStage.ts | 4 +-- ...ractSelectionFromSurroundingPairOffsets.ts | 4 +-- .../findSurroundingPairParseTreeBased.ts | 8 ++--- .../findSurroundingPairTextBased.ts | 6 ++-- .../modifiers/surroundingPair/index.ts | 5 +-- .../modifiers/toPositionTarget.ts | 2 +- src/processTargets/processTargets.ts | 2 +- .../targetUtil/createContinuousRange.ts | 3 +- ...limitedSequenceInsertionRemovalBehavior.ts | 2 +- .../TokenInsertionRemovalBehavior.ts | 4 +-- .../insertionRemovalBehavior.types.ts | 2 +- src/processTargets/targets/BaseTarget.ts | 4 +-- src/processTargets/targets/DocumentTarget.ts | 2 +- src/processTargets/targets/InteriorTarget.ts | 2 +- src/processTargets/targets/LineTarget.ts | 4 +-- .../targets/NotebookCellTarget.ts | 4 +-- src/processTargets/targets/ParagraphTarget.ts | 14 ++++---- src/processTargets/targets/PositionTarget.ts | 3 +- src/processTargets/targets/ScopeTypeTarget.ts | 2 +- .../targets/SubTokenWordTarget.ts | 4 +-- .../targets/SurroundingPairTarget.ts | 2 +- src/processTargets/targets/TokenTarget.ts | 2 +- src/processTargets/targets/UntypedTarget.ts | 2 +- src/testUtil/fromPlainObject.ts | 9 ++--- src/typings/Types.ts | 10 +++--- src/typings/target.types.ts | 4 +-- src/typings/updateSelections.ts | 2 +- src/util/addDecorationsToEditor.ts | 3 +- src/util/getDisplayLineMap.ts | 2 +- src/util/getTokensInRange.ts | 3 +- src/util/nodeFinders.ts | 3 +- src/util/nodeSelectors.ts | 5 +-- src/util/notebookLegacy.ts | 2 +- src/util/performDocumentEdits.ts | 2 +- src/util/rangeUtils.ts | 4 +-- src/util/selectionUtils.ts | 5 +-- src/util/setSelectionsAndFocusEditor.ts | 3 +- src/util/targetUtils.ts | 4 +-- src/util/tryConstructTarget.ts | 3 +- 123 files changed, 259 insertions(+), 329 deletions(-) create mode 100644 src/ide/vscode/fromVscodeEditor.ts create mode 100644 src/ide/vscode/vscodeIdeUtil.ts delete mode 100644 src/libs/common/ide/index.ts rename src/libs/common/{ide => types}/Location.ts (85%) rename src/libs/common/{ide => types}/Position.ts (99%) rename src/libs/common/{ide => types}/Range.ts (98%) rename src/libs/common/{ide => types}/Selection.ts (94%) rename src/libs/common/{ide => }/types/TextDocument.ts (93%) rename src/libs/common/{ide => }/types/TextEditor.ts (89%) rename src/libs/common/{ide => }/types/TextEditorDecorationType.ts (100%) rename src/libs/common/{ide => }/types/TextEditorEdit.ts (88%) rename src/libs/common/{ide => }/types/TextEditorOptions.ts (100%) rename src/libs/common/{ide => }/types/TextLine.ts (94%) rename src/libs/common/{ide => types}/position.test.ts (98%) rename src/libs/common/{ide => types}/range.test.ts (98%) rename src/{ide/vscode => libs/vscode-common}/VscodeUtil.ts (60%) diff --git a/src/actions/BringMoveSwap.ts b/src/actions/BringMoveSwap.ts index c8fc360ad0..00116b1875 100644 --- a/src/actions/BringMoveSwap.ts +++ b/src/actions/BringMoveSwap.ts @@ -1,11 +1,10 @@ +import { Selection, TextEditor } from "@cursorless/common"; import { flatten } from "lodash"; import { DecorationRangeBehavior } from "vscode"; import { getSelectionInfo, performEditsAndUpdateFullSelectionInfos, } from "../core/updateSelections/updateSelections"; -import { Selection } from "../libs/common/ide"; -import { TextEditor } from "../libs/common/ide/types/TextEditor"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Target } from "../typings/target.types"; import { EditWithRangeUpdater, Graph } from "../typings/Types"; diff --git a/src/actions/EditNew/EditNew.types.ts b/src/actions/EditNew/EditNew.types.ts index e18f1363c0..27ca438d36 100644 --- a/src/actions/EditNew/EditNew.types.ts +++ b/src/actions/EditNew/EditNew.types.ts @@ -1,4 +1,4 @@ -import type { Range } from "../../libs/common/ide"; +import type { Range } from "@cursorless/common"; import type { Target } from "../../typings/target.types"; /** diff --git a/src/actions/EditNew/runCommandTargets.ts b/src/actions/EditNew/runCommandTargets.ts index 32ade7ece8..15b2f298ba 100644 --- a/src/actions/EditNew/runCommandTargets.ts +++ b/src/actions/EditNew/runCommandTargets.ts @@ -1,6 +1,6 @@ +import { TextEditor } from "@cursorless/common"; import { commands } from "vscode"; import { callFunctionAndUpdateRanges } from "../../core/updateSelections/updateSelections"; -import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import { Graph } from "../../typings/Types"; import { CommandTarget, State } from "./EditNew.types"; diff --git a/src/actions/EditNew/runEditTargets.ts b/src/actions/EditNew/runEditTargets.ts index 75a8276928..cb5774fc0c 100644 --- a/src/actions/EditNew/runEditTargets.ts +++ b/src/actions/EditNew/runEditTargets.ts @@ -1,8 +1,7 @@ +import { Selection, TextEditor } from "@cursorless/common"; import { zip } from "lodash"; import { DecorationRangeBehavior } from "vscode"; import { performEditsAndUpdateSelectionsWithBehavior } from "../../core/updateSelections/updateSelections"; -import { Selection } from "../../libs/common/ide"; -import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import { Graph } from "../../typings/Types"; import { EditTarget, State } from "./EditNew.types"; diff --git a/src/actions/EditNew/runNotebookCellTargets.ts b/src/actions/EditNew/runNotebookCellTargets.ts index ab9651190e..5ad65b6888 100644 --- a/src/actions/EditNew/runNotebookCellTargets.ts +++ b/src/actions/EditNew/runNotebookCellTargets.ts @@ -1,5 +1,5 @@ +import { Selection } from "@cursorless/common"; import { commands } from "vscode"; -import { Selection } from "../../libs/common/ide"; import { NotebookCellPositionTarget } from "../../processTargets/targets"; import { Target } from "../../typings/target.types"; import { Graph } from "../../typings/Types"; diff --git a/src/actions/GenerateSnippet/GenerateSnippet.ts b/src/actions/GenerateSnippet/GenerateSnippet.ts index 07d8baef62..f7a9e70dbc 100644 --- a/src/actions/GenerateSnippet/GenerateSnippet.ts +++ b/src/actions/GenerateSnippet/GenerateSnippet.ts @@ -1,5 +1,5 @@ +import { Range } from "@cursorless/common"; import { commands, window } from "vscode"; -import { Range } from "../../libs/common/ide"; import ide from "../../libs/cursorless-engine/singletons/ide.singleton"; import { Offsets } from "../../processTargets/modifiers/surroundingPair/types"; import isTesting from "../../testUtil/isTesting"; diff --git a/src/actions/InsertCopy.ts b/src/actions/InsertCopy.ts index 9b4a45955b..dcb636f9ab 100644 --- a/src/actions/InsertCopy.ts +++ b/src/actions/InsertCopy.ts @@ -1,8 +1,7 @@ +import { Selection, TextEditor } from "@cursorless/common"; import { flatten, zip } from "lodash"; import { DecorationRangeBehavior } from "vscode"; import { performEditsAndUpdateSelectionsWithBehavior } from "../core/updateSelections/updateSelections"; -import { Selection } from "../libs/common/ide"; -import { TextEditor } from "../libs/common/ide/types/TextEditor"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { containingLineIfUntypedStage } from "../processTargets/modifiers/commonContainingScopeIfUntypedStages"; import { Target } from "../typings/target.types"; diff --git a/src/actions/InsertEmptyLines.ts b/src/actions/InsertEmptyLines.ts index 048e57c6e3..ae3bfee7fc 100644 --- a/src/actions/InsertEmptyLines.ts +++ b/src/actions/InsertEmptyLines.ts @@ -1,7 +1,6 @@ +import { Range, Selection } from "@cursorless/common"; import { flatten } from "lodash"; import { performEditsAndUpdateSelections } from "../core/updateSelections/updateSelections"; -import { Range } from "../libs/common/ide"; -import { Selection } from "../libs/common/ide"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; diff --git a/src/actions/SetSelection.ts b/src/actions/SetSelection.ts index f638db92c3..fb7b6b9039 100644 --- a/src/actions/SetSelection.ts +++ b/src/actions/SetSelection.ts @@ -1,4 +1,4 @@ -import { Selection } from "../libs/common/ide"; +import { Selection } from "@cursorless/common"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; diff --git a/src/actions/ToggleBreakpoint.ts b/src/actions/ToggleBreakpoint.ts index 4a47295904..58d66725fd 100644 --- a/src/actions/ToggleBreakpoint.ts +++ b/src/actions/ToggleBreakpoint.ts @@ -1,6 +1,6 @@ +import { toVscodeRange } from "@cursorless/vscode-common"; import * as vscode from "vscode"; import { URI } from "vscode-uri"; -import { toVscodeRange } from "../ide/vscode/VscodeUtil"; import { containingLineIfUntypedStage } from "../processTargets/modifiers/commonContainingScopeIfUntypedStages"; import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; diff --git a/src/actions/Wrap.ts b/src/actions/Wrap.ts index 10a4387110..340ed949f1 100644 --- a/src/actions/Wrap.ts +++ b/src/actions/Wrap.ts @@ -1,9 +1,9 @@ +import { Selection } from "@cursorless/common"; import { DecorationRangeBehavior } from "vscode"; import { getSelectionInfo, performEditsAndUpdateFullSelectionInfos, } from "../core/updateSelections/updateSelections"; -import { Selection } from "../libs/common/ide"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Target } from "../typings/target.types"; import { Edit, Graph } from "../typings/Types"; diff --git a/src/apps/cursorless-vscode-e2e/suite/groupByDocument.test.ts b/src/apps/cursorless-vscode-e2e/suite/groupByDocument.test.ts index e3046668ee..cce8af53c4 100644 --- a/src/apps/cursorless-vscode-e2e/suite/groupByDocument.test.ts +++ b/src/apps/cursorless-vscode-e2e/suite/groupByDocument.test.ts @@ -3,7 +3,7 @@ import { getCursorlessApi } from "@cursorless/vscode-common"; import * as assert from "assert"; import * as vscode from "vscode"; // eslint-disable-next-line @typescript-eslint/no-restricted-imports -import { toVscodeEditor } from "../../../ide/vscode/VscodeUtil"; +import { toVscodeEditor } from "../../../ide/vscode/vscodeIdeUtil"; import { endToEndTestSetup } from "../endToEndTestSetup"; import { runCursorlessCommand } from "../runCommand"; diff --git a/src/apps/cursorless-vscode-e2e/suite/prePhraseSnapshot.test.ts b/src/apps/cursorless-vscode-e2e/suite/prePhraseSnapshot.test.ts index 5f5fa83659..9963a35977 100644 --- a/src/apps/cursorless-vscode-e2e/suite/prePhraseSnapshot.test.ts +++ b/src/apps/cursorless-vscode-e2e/suite/prePhraseSnapshot.test.ts @@ -4,8 +4,7 @@ import { } from "@cursorless/vscode-common"; import * as assert from "assert"; import * as vscode from "vscode"; -// eslint-disable-next-line @typescript-eslint/no-restricted-imports -import { fromVscodeSelection } from "../../../ide/vscode/VscodeUtil"; +import { fromVscodeSelection } from "@cursorless/vscode-common"; import { endToEndTestSetup } from "../endToEndTestSetup"; import { mockPrePhraseGetVersion } from "../mockPrePhraseGetVersion"; import { openNewEditor } from "../openNewEditor"; diff --git a/src/apps/cursorless-vscode/getMatchesInRange.ts b/src/apps/cursorless-vscode/getMatchesInRange.ts index e2035c8266..324e6bedb4 100644 --- a/src/apps/cursorless-vscode/getMatchesInRange.ts +++ b/src/apps/cursorless-vscode/getMatchesInRange.ts @@ -1,8 +1,7 @@ +import { Range, TextEditor } from "@cursorless/common"; import { imap } from "itertools"; -import { Direction } from "../../typings/targetDescriptor.types"; import { matchAll } from "../../libs/cursorless-engine/util/regex"; -import { TextEditor } from "../../libs/common/ide/types/TextEditor"; -import { Range } from "../../libs/common/ide"; +import { Direction } from "../../typings/targetDescriptor.types"; export function getMatchesInRange( regex: RegExp, diff --git a/src/core/Debug.ts b/src/core/Debug.ts index 38a60b3496..9fd447a41f 100644 --- a/src/core/Debug.ts +++ b/src/core/Debug.ts @@ -1,3 +1,5 @@ +import { Location } from "@cursorless/common"; +import { fromVscodeRange } from "@cursorless/vscode-common"; import { Disposable, TextEditorSelectionChangeEvent, @@ -5,8 +7,6 @@ import { workspace, } from "vscode"; import { SyntaxNode, TreeCursor } from "web-tree-sitter"; -import { fromVscodeRange } from "../ide/vscode/VscodeUtil"; -import Location from "../libs/common/ide/Location"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Graph } from "../typings/Types"; diff --git a/src/core/IndividualHatMap.ts b/src/core/IndividualHatMap.ts index 3d88ab5a63..1345515d4d 100644 --- a/src/core/IndividualHatMap.ts +++ b/src/core/IndividualHatMap.ts @@ -1,5 +1,4 @@ -import { getKey } from "@cursorless/common"; -import TextDocument from "../libs/common/ide/types/TextDocument"; +import { getKey, TextDocument } from "@cursorless/common"; import tokenGraphemeSplitter from "../libs/cursorless-engine/singletons/tokenGraphemeSplitter.singleton"; import { Graph, Token } from "../typings/Types"; import { HatStyleName } from "./hatStyles"; diff --git a/src/core/editStyles.ts b/src/core/editStyles.ts index c2d9ca71b2..c3792493b7 100644 --- a/src/core/editStyles.ts +++ b/src/core/editStyles.ts @@ -1,3 +1,4 @@ +import { EditableTextEditor, Position, Range } from "@cursorless/common"; import { DecorationRangeBehavior, DecorationRenderOptions, @@ -6,9 +7,6 @@ import { window, workspace, } from "vscode"; -import Position from "../libs/common/ide/Position"; -import { Range } from "../libs/common/ide"; -import { EditableTextEditor } from "../libs/common/ide/types/TextEditor"; import sleep from "../libs/common/util/sleep"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import isTesting from "../testUtil/isTesting"; diff --git a/src/core/updateSelections/RangeUpdater.ts b/src/core/updateSelections/RangeUpdater.ts index 0d28d6e364..00211fec8d 100644 --- a/src/core/updateSelections/RangeUpdater.ts +++ b/src/core/updateSelections/RangeUpdater.ts @@ -1,10 +1,10 @@ +import type { TextDocument } from "@cursorless/common"; import { pull } from "lodash"; import type { TextDocumentChangeEvent, TextDocumentContentChangeEvent, } from "../../libs/common/ide/types/Events"; import type { Disposable } from "../../libs/common/ide/types/ide.types"; -import type TextDocument from "../../libs/common/ide/types/TextDocument"; import ide from "../../libs/cursorless-engine/singletons/ide.singleton"; import type { Edit } from "../../typings/Types"; import { diff --git a/src/core/updateSelections/updateSelections.ts b/src/core/updateSelections/updateSelections.ts index a63ceaa235..91d186ed45 100644 --- a/src/core/updateSelections/updateSelections.ts +++ b/src/core/updateSelections/updateSelections.ts @@ -1,9 +1,6 @@ +import { Range, Selection, TextDocument, TextEditor } from "@cursorless/common"; import { flatten } from "lodash"; import { DecorationRangeBehavior } from "vscode"; -import { Range } from "../../libs/common/ide"; -import { Selection } from "../../libs/common/ide"; -import TextDocument from "../../libs/common/ide/types/TextDocument"; -import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import { Edit } from "../../typings/Types"; import { FullSelectionInfo, diff --git a/src/extension.ts b/src/extension.ts index e2f11490e3..a9e940851c 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,8 +1,8 @@ import * as vscode from "vscode"; import CommandRunner from "./core/commandRunner/CommandRunner"; import { ThatMark } from "./core/ThatMark"; +import { fromVscodeEditor } from "./ide/vscode/fromVscodeEditor"; import VscodeIDE from "./ide/vscode/VscodeIDE"; -import { fromVscodeEditor } from "./ide/vscode/VscodeUtil"; import FakeIDE from "./libs/common/ide/fake/FakeIDE"; import ide, { injectIde, diff --git a/src/ide/vscode/VscodeEditEditor.ts b/src/ide/vscode/VscodeEditEditor.ts index f05933c945..dab7272c63 100644 --- a/src/ide/vscode/VscodeEditEditor.ts +++ b/src/ide/vscode/VscodeEditEditor.ts @@ -1,11 +1,11 @@ -import * as vscode from "vscode"; -import TextEditorEdit from "../../libs/common/ide/types/TextEditorEdit"; +import { TextEditorEdit } from "@cursorless/common"; import { toVscodeEndOfLine, toVscodePosition, toVscodePositionOrRangeOrSelection, toVscodeRangeOrSelection, -} from "./VscodeUtil"; +} from "@cursorless/vscode-common"; +import * as vscode from "vscode"; export default function vscodeEditEditor( editor: vscode.TextEditor, diff --git a/src/ide/vscode/VscodeEditableTextEditorImpl.ts b/src/ide/vscode/VscodeEditableTextEditorImpl.ts index 7cdd38d320..8c17077d85 100644 --- a/src/ide/vscode/VscodeEditableTextEditorImpl.ts +++ b/src/ide/vscode/VscodeEditableTextEditorImpl.ts @@ -1,21 +1,24 @@ -import * as vscode from "vscode"; -import type { Range, Selection } from "../../libs/common/ide"; -import type Position from "../../libs/common/ide/Position"; -import type { EditableTextEditor } from "../../libs/common/ide/types/TextEditor"; -import type { TextEditorDecorationType } from "../../libs/common/ide/types/TextEditorDecorationType"; -import type TextEditorEdit from "../../libs/common/ide/types/TextEditorEdit"; -import type { TextEditorOptions } from "../../libs/common/ide/types/TextEditorOptions"; -import vscodeEditEditor from "./VscodeEditEditor"; -import vscodeFocusEditor from "./VscodeFocusEditor"; -import vscodeOpenLink from "./VscodeOpenLink"; -import VscodeTextEditorImpl from "./VscodeTextEditorImpl"; +import type { + EditableTextEditor, + Position, + Range, + Selection, + TextEditorDecorationType, + TextEditorEdit, + TextEditorOptions, +} from "@cursorless/common"; import { toVscodePositionOrRange, toVscodeRange, toVscodeSelection, -} from "./VscodeUtil"; +} from "@cursorless/vscode-common"; +import * as vscode from "vscode"; +import vscodeFocusEditor from "../../ide/vscode/VscodeFocusEditor"; +import vscodeEditEditor from "./VscodeEditEditor"; +import vscodeOpenLink from "./VscodeOpenLink"; +import { VscodeTextEditorImpl } from "./VscodeTextEditorImpl"; -export default class VscodeEditableTextEditorImpl +export class VscodeEditableTextEditorImpl extends VscodeTextEditorImpl implements EditableTextEditor { diff --git a/src/ide/vscode/VscodeEvents.ts b/src/ide/vscode/VscodeEvents.ts index 73923575a0..a87e131c0b 100644 --- a/src/ide/vscode/VscodeEvents.ts +++ b/src/ide/vscode/VscodeEvents.ts @@ -1,3 +1,4 @@ +import { fromVscodeRange } from "@cursorless/vscode-common"; import * as vscode from "vscode"; import type { TextDocumentChangeEvent, @@ -5,7 +6,7 @@ import type { TextDocumentContentChangeEvent, } from "../../libs/common/ide/types/Events"; import type { Disposable } from "../../libs/common/ide/types/ide.types"; -import { fromVscodeDocument, fromVscodeRange } from "./VscodeUtil"; +import { fromVscodeDocument } from "./vscodeIdeUtil"; export function vscodeOnDidChangeTextDocument( listener: (event: TextDocumentChangeEvent) => void, diff --git a/src/ide/vscode/VscodeIDE.ts b/src/ide/vscode/VscodeIDE.ts index 08f8c9b086..37e7ed79c8 100644 --- a/src/ide/vscode/VscodeIDE.ts +++ b/src/ide/vscode/VscodeIDE.ts @@ -1,3 +1,4 @@ +import type { EditableTextEditor, TextEditor } from "@cursorless/common"; import { pull } from "lodash"; import { ExtensionContext, window, workspace, WorkspaceFolder } from "vscode"; import type { TextDocumentChangeEvent } from "../../libs/common/ide/types/Events"; @@ -6,18 +7,15 @@ import type { IDE, RunMode, } from "../../libs/common/ide/types/ide.types"; -import type { - EditableTextEditor, - TextEditor, -} from "../../libs/common/ide/types/TextEditor"; +import { fromVscodeEditor } from "./fromVscodeEditor"; import VscodeClipboard from "./VscodeClipboard"; import VscodeConfiguration from "./VscodeConfiguration"; -import VscodeEditableTextEditorImpl from "./VscodeEditableTextEditorImpl"; +import { VscodeEditableTextEditorImpl } from "./VscodeEditableTextEditorImpl"; import { vscodeOnDidChangeTextDocument } from "./VscodeEvents"; import VscodeGlobalState from "./VscodeGlobalState"; import VscodeMessages from "./VscodeMessages"; -import vscodeRunMode from "./VscodeRunMode"; -import { fromVscodeEditor, toVscodeEditor } from "./VscodeUtil"; +import { vscodeRunMode } from "./VscodeRunMode"; +import { toVscodeEditor } from "./vscodeIdeUtil"; export default class VscodeIDE implements IDE { configuration: VscodeConfiguration; diff --git a/src/ide/vscode/VscodeRunMode.ts b/src/ide/vscode/VscodeRunMode.ts index a279ce1baf..c11428d124 100644 --- a/src/ide/vscode/VscodeRunMode.ts +++ b/src/ide/vscode/VscodeRunMode.ts @@ -1,5 +1,5 @@ import { ExtensionContext, ExtensionMode } from "vscode"; -import type { RunMode } from "../../libs/common/ide/types/ide.types"; +import type { RunMode } from "@cursorless/common"; const EXTENSION_MODE_MAP: Record = { [ExtensionMode.Development]: "development", @@ -7,8 +7,6 @@ const EXTENSION_MODE_MAP: Record = { [ExtensionMode.Test]: "test", }; -export default function vscodeRunMode( - extensionContext: ExtensionContext, -): RunMode { +export function vscodeRunMode(extensionContext: ExtensionContext): RunMode { return EXTENSION_MODE_MAP[extensionContext.extensionMode]; } diff --git a/src/ide/vscode/VscodeTextDocumentImpl.ts b/src/ide/vscode/VscodeTextDocumentImpl.ts index 4fdfeb247a..99e3ba365b 100644 --- a/src/ide/vscode/VscodeTextDocumentImpl.ts +++ b/src/ide/vscode/VscodeTextDocumentImpl.ts @@ -1,17 +1,14 @@ -import * as vscode from "vscode"; -import type { URI } from "vscode-uri"; -import { Range } from "../../libs/common/ide"; -import Position from "../../libs/common/ide/Position"; -import TextDocument from "../../libs/common/ide/types/TextDocument"; -import TextLine from "../../libs/common/ide/types/TextLine"; +import { Position, Range, TextDocument, TextLine } from "@cursorless/common"; import { fromVscodePosition, - fromVscodeTextLine, toVscodePosition, toVscodeRange, -} from "./VscodeUtil"; +} from "@cursorless/vscode-common"; +import * as vscode from "vscode"; +import type { URI } from "vscode-uri"; +import { fromVscodeTextLine } from "./vscodeIdeUtil"; -export default class VscodeTextDocumentImpl implements TextDocument { +export class VscodeTextDocumentImpl implements TextDocument { get uri(): URI { return this.document.uri; } diff --git a/src/ide/vscode/VscodeTextEditorImpl.ts b/src/ide/vscode/VscodeTextEditorImpl.ts index e4ead46ce8..85d48785df 100644 --- a/src/ide/vscode/VscodeTextEditorImpl.ts +++ b/src/ide/vscode/VscodeTextEditorImpl.ts @@ -1,16 +1,19 @@ -import { v4 as uuid } from "uuid"; -import * as vscode from "vscode"; -import type { Range, Selection } from "../../libs/common/ide"; -import type TextDocument from "../../libs/common/ide/types/TextDocument"; -import type { TextEditor } from "../../libs/common/ide/types/TextEditor"; -import type { TextEditorOptions } from "../../libs/common/ide/types/TextEditorOptions"; +import type { + Range, + Selection, + TextDocument, + TextEditor, + TextEditorOptions, +} from "@cursorless/common"; import { - fromVscodeDocument, fromVscodeRange, fromVscodeSelection, -} from "./VscodeUtil"; +} from "@cursorless/vscode-common"; +import { v4 as uuid } from "uuid"; +import * as vscode from "vscode"; +import { fromVscodeDocument } from "./vscodeIdeUtil"; -export default class VscodeTextEditorImpl implements TextEditor { +export class VscodeTextEditorImpl implements TextEditor { readonly id: string; readonly document: TextDocument; diff --git a/src/ide/vscode/VscodeTextLineImpl.ts b/src/ide/vscode/VscodeTextLineImpl.ts index bbd19aabbb..2715517adb 100644 --- a/src/ide/vscode/VscodeTextLineImpl.ts +++ b/src/ide/vscode/VscodeTextLineImpl.ts @@ -1,7 +1,6 @@ +import { Range, TextLine } from "@cursorless/common"; +import { fromVscodeRange } from "@cursorless/vscode-common"; import * as vscode from "vscode"; -import { Range } from "../../libs/common/ide"; -import type TextLine from "../../libs/common/ide/types/TextLine"; -import { fromVscodeRange } from "./VscodeUtil"; export default class VscodeTextLineImpl implements TextLine { constructor(private line: vscode.TextLine) {} diff --git a/src/ide/vscode/fromVscodeEditor.ts b/src/ide/vscode/fromVscodeEditor.ts new file mode 100644 index 0000000000..ccdaad5874 --- /dev/null +++ b/src/ide/vscode/fromVscodeEditor.ts @@ -0,0 +1,12 @@ +import type { TextEditor } from "@cursorless/common"; +import type * as vscode from "vscode"; +import { VscodeTextEditorImpl } from "./VscodeTextEditorImpl"; + +const editorMap = new WeakMap(); + +export function fromVscodeEditor(editor: vscode.TextEditor): TextEditor { + if (!editorMap.has(editor)) { + editorMap.set(editor, new VscodeTextEditorImpl(editor)); + } + return editorMap.get(editor)!; +} diff --git a/src/ide/vscode/vscodeIdeUtil.ts b/src/ide/vscode/vscodeIdeUtil.ts new file mode 100644 index 0000000000..c8b9ce13db --- /dev/null +++ b/src/ide/vscode/vscodeIdeUtil.ts @@ -0,0 +1,22 @@ +import { TextDocument, TextEditor, TextLine } from "@cursorless/common"; +import * as vscode from "vscode"; +import { VscodeTextDocumentImpl } from "./VscodeTextDocumentImpl"; +import { VscodeTextEditorImpl } from "./VscodeTextEditorImpl"; +import VscodeTextLineImpl from "./VscodeTextLineImpl"; + +export function toVscodeEditor(editor: TextEditor): vscode.TextEditor { + if ("vscodeEditor" in editor) { + return (editor as VscodeTextEditorImpl).vscodeEditor; + } + throw Error("Can't get vscode editor from non vscode implementation"); +} + +export function fromVscodeDocument( + document: vscode.TextDocument, +): TextDocument { + return new VscodeTextDocumentImpl(document); +} + +export function fromVscodeTextLine(line: vscode.TextLine): TextLine { + return new VscodeTextLineImpl(line); +} diff --git a/src/languages/getTextFragmentExtractor.ts b/src/languages/getTextFragmentExtractor.ts index 16e43fee5a..f157c71a8b 100644 --- a/src/languages/getTextFragmentExtractor.ts +++ b/src/languages/getTextFragmentExtractor.ts @@ -1,17 +1,17 @@ +import { Range } from "@cursorless/common"; import { SyntaxNode } from "web-tree-sitter"; +import { UnsupportedLanguageError } from "../errors"; +import { SupportedLanguageId } from "../libs/cursorless-engine/languages/constants"; import { SelectionWithEditor } from "../typings/Types"; +import { notSupported } from "../util/nodeMatchers"; +import { getNodeInternalRange, getNodeRange } from "../util/nodeSelectors"; +import { getNodeMatcher } from "./getNodeMatcher"; import { stringTextFragmentExtractor as htmlStringTextFragmentExtractor } from "./html"; import { stringTextFragmentExtractor as jsonStringTextFragmentExtractor } from "./json"; import { stringTextFragmentExtractor as phpStringTextFragmentExtractor } from "./php"; import { stringTextFragmentExtractor as rubyStringTextFragmentExtractor } from "./ruby"; -import { stringTextFragmentExtractor as typescriptStringTextFragmentExtractor } from "./typescript"; import { stringTextFragmentExtractor as scssStringTextFragmentExtractor } from "./scss"; -import { UnsupportedLanguageError } from "../errors"; -import { SupportedLanguageId } from "../libs/cursorless-engine/languages/constants"; -import { getNodeInternalRange, getNodeRange } from "../util/nodeSelectors"; -import { getNodeMatcher } from "./getNodeMatcher"; -import { notSupported } from "../util/nodeMatchers"; -import { Range } from "../libs/common/ide"; +import { stringTextFragmentExtractor as typescriptStringTextFragmentExtractor } from "./typescript"; export type TextFragmentExtractor = ( node: SyntaxNode, diff --git a/src/languages/latex.ts b/src/languages/latex.ts index c493efd03b..c3a04c5876 100644 --- a/src/languages/latex.ts +++ b/src/languages/latex.ts @@ -1,7 +1,5 @@ +import { Range, Selection, TextEditor } from "@cursorless/common"; import { SyntaxNode } from "web-tree-sitter"; -import { Range } from "../libs/common/ide"; -import { Selection } from "../libs/common/ide"; -import { TextEditor } from "../libs/common/ide/types/TextEditor"; import { SimpleScopeTypeType } from "../typings/targetDescriptor.types"; import { NodeMatcherAlternative, SelectionWithContext } from "../typings/Types"; import { patternFinder } from "../util/nodeFinders"; diff --git a/src/languages/markdown.ts b/src/languages/markdown.ts index 5050a38112..f591a29a1a 100644 --- a/src/languages/markdown.ts +++ b/src/languages/markdown.ts @@ -1,4 +1,6 @@ +import { Range, Selection, TextEditor } from "@cursorless/common"; import { SyntaxNode } from "web-tree-sitter"; +import { getMatchesInRange } from "../apps/cursorless-vscode/getMatchesInRange"; import { SimpleScopeTypeType } from "../typings/targetDescriptor.types"; import { NodeFinder, @@ -12,10 +14,6 @@ import { getNodeRange, selectWithLeadingDelimiter, } from "../util/nodeSelectors"; -import { getMatchesInRange } from "../apps/cursorless-vscode/getMatchesInRange"; -import { Selection } from "../libs/common/ide"; -import { TextEditor } from "../libs/common/ide/types/TextEditor"; -import { Range } from "../libs/common/ide"; import { shrinkRangeToFitContent } from "../util/selectionUtils"; /** diff --git a/src/languages/php.ts b/src/languages/php.ts index 1e404b0eaa..be5bfa19d5 100644 --- a/src/languages/php.ts +++ b/src/languages/php.ts @@ -1,10 +1,11 @@ +import { Selection, TextEditor } from "@cursorless/common"; import { SyntaxNode } from "web-tree-sitter"; +import { SimpleScopeTypeType } from "../typings/targetDescriptor.types"; import { NodeMatcherAlternative, SelectionWithContext, SelectionWithEditor, } from "../typings/Types"; -import { SimpleScopeTypeType } from "../typings/targetDescriptor.types"; import { patternFinder } from "../util/nodeFinders"; import { argumentMatcher, @@ -15,8 +16,6 @@ import { trailingMatcher, } from "../util/nodeMatchers"; import { getNodeRange } from "../util/nodeSelectors"; -import { TextEditor } from "../libs/common/ide/types/TextEditor"; -import { Selection } from "../libs/common/ide"; // Generated by the following command: // > curl https://raw.githubusercontent.com/tree-sitter/tree-sitter-php/0ce134234214427b6aeb2735e93a307881c6cd6f/src/node-types.json \ diff --git a/src/languages/python.ts b/src/languages/python.ts index a7fcaa80ec..bd1251844f 100644 --- a/src/languages/python.ts +++ b/src/languages/python.ts @@ -1,5 +1,5 @@ +import { Selection } from "@cursorless/common"; import { SyntaxNode } from "web-tree-sitter"; -import { Selection } from "../libs/common/ide"; import { SimpleScopeTypeType } from "../typings/targetDescriptor.types"; import { NodeFinder, NodeMatcherAlternative } from "../typings/Types"; import { argumentNodeFinder, patternFinder } from "../util/nodeFinders"; diff --git a/src/languages/rust.ts b/src/languages/rust.ts index db71a950c9..8976393dec 100644 --- a/src/languages/rust.ts +++ b/src/languages/rust.ts @@ -1,5 +1,5 @@ +import { TextEditor } from "@cursorless/common"; import { SyntaxNode } from "web-tree-sitter"; -import { TextEditor } from "../libs/common/ide/types/TextEditor"; import { SimpleScopeTypeType } from "../typings/targetDescriptor.types"; import { NodeMatcherAlternative, SelectionWithContext } from "../typings/Types"; import { patternFinder } from "../util/nodeFinders"; diff --git a/src/libs/common/ide/fake/FakeIDE.ts b/src/libs/common/ide/fake/FakeIDE.ts index 4a7af698e7..7af41a817c 100644 --- a/src/libs/common/ide/fake/FakeIDE.ts +++ b/src/libs/common/ide/fake/FakeIDE.ts @@ -1,3 +1,4 @@ +import type { EditableTextEditor, TextEditor } from "@cursorless/common"; import { pull } from "lodash"; import type { TextDocumentChangeEvent } from "../types/Events"; import type { @@ -6,7 +7,6 @@ import type { RunMode, WorkspaceFolder, } from "../types/ide.types"; -import type { EditableTextEditor, TextEditor } from "../types/TextEditor"; import FakeClipboard from "./FakeClipboard"; import FakeConfiguration from "./FakeConfiguration"; import FakeGlobalState from "./FakeGlobalState"; diff --git a/src/libs/common/ide/index.ts b/src/libs/common/ide/index.ts deleted file mode 100644 index 411b5a0aac..0000000000 --- a/src/libs/common/ide/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { default as Position } from "./Position"; -export { default as Range } from "./Range"; -export { default as Selection } from "./Selection"; diff --git a/src/libs/common/ide/spy/SpyIDE.ts b/src/libs/common/ide/spy/SpyIDE.ts index fda59c4347..d1b96977f3 100644 --- a/src/libs/common/ide/spy/SpyIDE.ts +++ b/src/libs/common/ide/spy/SpyIDE.ts @@ -1,3 +1,4 @@ +import { EditableTextEditor, TextEditor } from "@cursorless/common"; import { pickBy, values } from "lodash"; import type { Clipboard } from "../types/Clipboard"; import type { Configuration } from "../types/Configuration"; @@ -9,7 +10,6 @@ import type { WorkspaceFolder, } from "../types/ide.types"; import type { State } from "../types/State"; -import { EditableTextEditor, TextEditor } from "../types/TextEditor"; import SpyMessages, { Message } from "./SpyMessages"; export interface SpyIDERecordedValues { diff --git a/src/libs/common/ide/types/Events.ts b/src/libs/common/ide/types/Events.ts index 2249c3307f..6057b03990 100644 --- a/src/libs/common/ide/types/Events.ts +++ b/src/libs/common/ide/types/Events.ts @@ -1,5 +1,4 @@ -import type { Range } from ".."; -import type TextDocument from "./TextDocument"; +import type { TextDocument, Range } from "@cursorless/common"; /** * An event describing a transactional {@link TextDocument document} change. diff --git a/src/libs/common/ide/types/ide.types.ts b/src/libs/common/ide/types/ide.types.ts index 07c3225f59..8ed9ff02b2 100644 --- a/src/libs/common/ide/types/ide.types.ts +++ b/src/libs/common/ide/types/ide.types.ts @@ -1,10 +1,10 @@ +import type { EditableTextEditor, TextEditor } from "@cursorless/common"; import { URI } from "vscode-uri"; import { Clipboard } from "./Clipboard"; import { Configuration } from "./Configuration"; import { TextDocumentChangeEvent } from "./Events"; import { Messages } from "./Messages"; import { State } from "./State"; -import type { EditableTextEditor, TextEditor } from "./TextEditor"; export type RunMode = "production" | "development" | "test"; diff --git a/src/libs/common/index.ts b/src/libs/common/index.ts index 3777a0b357..20cf4673a3 100644 --- a/src/libs/common/index.ts +++ b/src/libs/common/index.ts @@ -17,3 +17,13 @@ export { walkFilesSync } from "./util/walkSync"; export { Listener, Notifier } from "./util/Notifier"; export { TokenHatSplittingMode } from "./ide/types/Configuration"; export * from "./ide/types/ide.types"; +export * from "./types/Location"; +export * from "./types/Position"; +export * from "./types/Range"; +export * from "./types/Selection"; +export * from "./types/TextDocument"; +export * from "./types/TextEditor"; +export * from "./types/TextEditorDecorationType"; +export * from "./types/TextEditorEdit"; +export * from "./types/TextEditorOptions"; +export * from "./types/TextLine"; diff --git a/src/libs/common/ide/Location.ts b/src/libs/common/types/Location.ts similarity index 85% rename from src/libs/common/ide/Location.ts rename to src/libs/common/types/Location.ts index 4845d73a28..ed95ea6047 100644 --- a/src/libs/common/ide/Location.ts +++ b/src/libs/common/types/Location.ts @@ -1,12 +1,12 @@ import type { URI } from "vscode-uri"; -import type Position from "./Position"; -import { Range } from "."; +import type { Position } from "@cursorless/common"; +import { Range } from "@cursorless/common"; /** * Represents a location inside a resource, such as a line * inside a text file. */ -export default class Location { +export class Location { /** * The resource identifier of this location. */ diff --git a/src/libs/common/ide/Position.ts b/src/libs/common/types/Position.ts similarity index 99% rename from src/libs/common/ide/Position.ts rename to src/libs/common/types/Position.ts index 224ec86e1d..a11f960379 100644 --- a/src/libs/common/ide/Position.ts +++ b/src/libs/common/types/Position.ts @@ -1,4 +1,4 @@ -export default class Position { +export class Position { /** * The zero-based line value. */ diff --git a/src/libs/common/ide/Range.ts b/src/libs/common/types/Range.ts similarity index 98% rename from src/libs/common/ide/Range.ts rename to src/libs/common/types/Range.ts index 4b4f4669ec..53fbaadad0 100644 --- a/src/libs/common/ide/Range.ts +++ b/src/libs/common/types/Range.ts @@ -1,6 +1,6 @@ -import { Position, Selection } from "."; +import { Position, Selection } from "@cursorless/common"; -export default class Range { +export class Range { /** * The start position. It is before or equal to {@link Range.end end}. */ diff --git a/src/libs/common/ide/Selection.ts b/src/libs/common/types/Selection.ts similarity index 94% rename from src/libs/common/ide/Selection.ts rename to src/libs/common/types/Selection.ts index 16ececa55b..3154743d72 100644 --- a/src/libs/common/ide/Selection.ts +++ b/src/libs/common/types/Selection.ts @@ -1,6 +1,6 @@ -import { Position, Range } from "."; +import { Position, Range } from "@cursorless/common"; -export default class Selection extends Range { +export class Selection extends Range { /** * The position at which the selection starts. * This position might be before or after {@link Selection.active active}. diff --git a/src/libs/common/ide/types/TextDocument.ts b/src/libs/common/types/TextDocument.ts similarity index 93% rename from src/libs/common/ide/types/TextDocument.ts rename to src/libs/common/types/TextDocument.ts index 0ce560fb7f..6901a2fd0d 100644 --- a/src/libs/common/ide/types/TextDocument.ts +++ b/src/libs/common/types/TextDocument.ts @@ -1,9 +1,7 @@ +import type { Position, Range, TextLine } from "@cursorless/common"; import type { URI } from "vscode-uri"; -import type Position from "../Position"; -import type { Range } from ".."; -import type TextLine from "./TextLine"; -export default interface TextDocument { +export interface TextDocument { /** * The associated uri for this document. * diff --git a/src/libs/common/ide/types/TextEditor.ts b/src/libs/common/types/TextEditor.ts similarity index 89% rename from src/libs/common/ide/types/TextEditor.ts rename to src/libs/common/types/TextEditor.ts index d866323535..f72df42541 100644 --- a/src/libs/common/ide/types/TextEditor.ts +++ b/src/libs/common/types/TextEditor.ts @@ -1,10 +1,12 @@ -import type Position from "../Position"; -import type { Range } from ".."; -import type { Selection } from ".."; -import type TextDocument from "./TextDocument"; -import type { TextEditorDecorationType } from "./TextEditorDecorationType"; -import type TextEditorEdit from "./TextEditorEdit"; -import { TextEditorOptions } from "./TextEditorOptions"; +import type { + Position, + Range, + Selection, + TextDocument, + TextEditorDecorationType, + TextEditorEdit, + TextEditorOptions, +} from "@cursorless/common"; export interface TextEditor { /** diff --git a/src/libs/common/ide/types/TextEditorDecorationType.ts b/src/libs/common/types/TextEditorDecorationType.ts similarity index 100% rename from src/libs/common/ide/types/TextEditorDecorationType.ts rename to src/libs/common/types/TextEditorDecorationType.ts diff --git a/src/libs/common/ide/types/TextEditorEdit.ts b/src/libs/common/types/TextEditorEdit.ts similarity index 88% rename from src/libs/common/ide/types/TextEditorEdit.ts rename to src/libs/common/types/TextEditorEdit.ts index 8e7be1763e..fb2c350fab 100644 --- a/src/libs/common/ide/types/TextEditorEdit.ts +++ b/src/libs/common/types/TextEditorEdit.ts @@ -1,14 +1,11 @@ -import type Position from "../Position"; -import type { Range } from ".."; -import type { Selection } from ".."; -import type { EndOfLine } from "./ide.types"; +import type { Position, Range, Selection, EndOfLine } from "@cursorless/common"; /** * A complex edit that will be applied in one transaction on a TextEditor. * This holds a description of the edits and if the edits are valid (i.e. no overlapping regions, document was not changed in the meantime, etc.) * they can be applied on a {@link TextDocument document} associated with a {@link TextEditor text editor}. */ -export default interface TextEditorEdit { +export interface TextEditorEdit { /** * Replace a certain text region with a new value. * You can use \r\n or \n in `value` and they will be normalized to the current {@link TextDocument document}. diff --git a/src/libs/common/ide/types/TextEditorOptions.ts b/src/libs/common/types/TextEditorOptions.ts similarity index 100% rename from src/libs/common/ide/types/TextEditorOptions.ts rename to src/libs/common/types/TextEditorOptions.ts diff --git a/src/libs/common/ide/types/TextLine.ts b/src/libs/common/types/TextLine.ts similarity index 94% rename from src/libs/common/ide/types/TextLine.ts rename to src/libs/common/types/TextLine.ts index 067210c61d..7accadc77d 100644 --- a/src/libs/common/ide/types/TextLine.ts +++ b/src/libs/common/types/TextLine.ts @@ -1,4 +1,4 @@ -import type { Range } from ".."; +import type { Range } from "@cursorless/common"; /** * Represents a line of text, such as a line of source code. @@ -6,7 +6,7 @@ import type { Range } from ".."; * TextLine objects are __immutable__. When a {@link TextDocument document} changes, * previously retrieved lines will not represent the latest state. */ -export default interface TextLine { +export interface TextLine { /** * The zero-based line number. */ diff --git a/src/libs/common/ide/position.test.ts b/src/libs/common/types/position.test.ts similarity index 98% rename from src/libs/common/ide/position.test.ts rename to src/libs/common/types/position.test.ts index 976df254b2..708a578908 100644 --- a/src/libs/common/ide/position.test.ts +++ b/src/libs/common/types/position.test.ts @@ -1,5 +1,5 @@ import * as assert from "assert"; -import { Position } from "."; +import { Position } from "@cursorless/common"; suite("Position", () => { test("constructor", () => { diff --git a/src/libs/common/ide/range.test.ts b/src/libs/common/types/range.test.ts similarity index 98% rename from src/libs/common/ide/range.test.ts rename to src/libs/common/types/range.test.ts index e14b2f27af..6c3282874e 100644 --- a/src/libs/common/ide/range.test.ts +++ b/src/libs/common/types/range.test.ts @@ -1,5 +1,5 @@ import * as assert from "assert"; -import { Position, Range } from "."; +import { Position, Range } from "@cursorless/common"; suite("Range", () => { test("constructor", () => { diff --git a/src/ide/vscode/VscodeUtil.ts b/src/libs/vscode-common/VscodeUtil.ts similarity index 60% rename from src/ide/vscode/VscodeUtil.ts rename to src/libs/vscode-common/VscodeUtil.ts index c7040599f1..88be108631 100644 --- a/src/ide/vscode/VscodeUtil.ts +++ b/src/libs/vscode-common/VscodeUtil.ts @@ -1,15 +1,5 @@ +import { EndOfLine, Position, Range, Selection } from "@cursorless/common"; import * as vscode from "vscode"; -import { Range, Selection } from "../../libs/common/ide"; -import Position from "../../libs/common/ide/Position"; -import { EndOfLine } from "../../libs/common/ide/types/ide.types"; -import TextDocument from "../../libs/common/ide/types/TextDocument"; -import { TextEditor } from "../../libs/common/ide/types/TextEditor"; -import TextLine from "../../libs/common/ide/types/TextLine"; -import VscodeTextDocumentImpl from "./VscodeTextDocumentImpl"; -import VscodeTextEditorImpl from "./VscodeTextEditorImpl"; -import VscodeTextLineImpl from "./VscodeTextLineImpl"; - -const editorMap = new WeakMap(); export function toVscodeRange(range: Range): vscode.Range { return new vscode.Range( @@ -79,10 +69,6 @@ export function toVscodeRangeOrSelection( : toVscodeRange(location); } -export function fromVscodeTextLine(line: vscode.TextLine): TextLine { - return new VscodeTextLineImpl(line); -} - export function toVscodeEndOfLine(eol: EndOfLine): vscode.EndOfLine { return eol === "LF" ? vscode.EndOfLine.LF : vscode.EndOfLine.CRLF; } @@ -90,23 +76,3 @@ export function toVscodeEndOfLine(eol: EndOfLine): vscode.EndOfLine { export function fromVscodeAndOfLine(eol: vscode.EndOfLine): EndOfLine { return eol === vscode.EndOfLine.LF ? "LF" : "CRLF"; } - -export function fromVscodeEditor(editor: vscode.TextEditor): TextEditor { - if (!editorMap.has(editor)) { - editorMap.set(editor, new VscodeTextEditorImpl(editor)); - } - return editorMap.get(editor)!; -} - -export function toVscodeEditor(editor: TextEditor): vscode.TextEditor { - if ("vscodeEditor" in editor) { - return (editor as VscodeTextEditorImpl).vscodeEditor; - } - throw Error("Can't get vscode editor from non vscode implementation"); -} - -export function fromVscodeDocument( - document: vscode.TextDocument, -): TextDocument { - return new VscodeTextDocumentImpl(document); -} diff --git a/src/libs/vscode-common/index.ts b/src/libs/vscode-common/index.ts index f75aae556f..d26e620724 100644 --- a/src/libs/vscode-common/index.ts +++ b/src/libs/vscode-common/index.ts @@ -2,6 +2,7 @@ export * from "./getExtensionApi"; export * from "./notebook"; export * from "./testUtil/toPlainObject"; export * from "./testUtil/testConstants"; +export * from "./vscodeUtil"; export { takeSnapshot, TestCaseSnapshot, diff --git a/src/libs/vscode-common/testUtil/takeSnapshot.ts b/src/libs/vscode-common/testUtil/takeSnapshot.ts index 8354e2a166..275b17df33 100644 --- a/src/libs/vscode-common/testUtil/takeSnapshot.ts +++ b/src/libs/vscode-common/testUtil/takeSnapshot.ts @@ -1,5 +1,8 @@ -import type { ThatMark } from "../../../core/ThatMark"; +import type { TextEditor } from "@cursorless/common"; import { hrtimeBigintToSeconds } from "@cursorless/common"; +import type { ThatMark } from "../../../core/ThatMark"; +import type { Clipboard } from "../../common/ide/types/Clipboard"; +import type { IDE } from "../../common/ide/types/ide.types"; import { RangePlainObject, rangeToPlainObject, @@ -9,9 +12,6 @@ import { TargetPlainObject, targetToPlainObject, } from "./toPlainObject"; -import type { IDE } from "../../common/ide/types/ide.types"; -import type { Clipboard } from "../../common/ide/types/Clipboard"; -import type { TextEditor } from "../../common/ide/types/TextEditor"; export type ExtraSnapshotField = keyof TestCaseSnapshot; export type ExcludableSnapshotField = keyof TestCaseSnapshot; diff --git a/src/libs/vscode-common/testUtil/testConstants.ts b/src/libs/vscode-common/testUtil/testConstants.ts index 19e0134e32..26c9692115 100644 --- a/src/libs/vscode-common/testUtil/testConstants.ts +++ b/src/libs/vscode-common/testUtil/testConstants.ts @@ -1,4 +1,4 @@ -import type { TextEditorOptions } from "../../common/ide/types/TextEditorOptions"; +import type { TextEditorOptions } from "@cursorless/common"; export const DEFAULT_TEXT_EDITOR_OPTIONS_FOR_TEST: TextEditorOptions = { tabSize: 4, diff --git a/src/libs/vscode-common/testUtil/toPlainObject.ts b/src/libs/vscode-common/testUtil/toPlainObject.ts index b3fa62668f..28ff8c84c8 100644 --- a/src/libs/vscode-common/testUtil/toPlainObject.ts +++ b/src/libs/vscode-common/testUtil/toPlainObject.ts @@ -1,9 +1,7 @@ import type { TestDecoration } from "../../../core/editStyles"; import type { Target } from "../../../typings/target.types"; import type { Token } from "../../../typings/Types"; -import type Position from "../../common/ide/Position"; -import type { Range } from "../../common/ide"; -import type { Selection } from "../../common/ide"; +import type { Range, Selection, Position } from "@cursorless/common"; export type PositionPlainObject = { line: number; diff --git a/src/processTargets/marks/LineNumberStage.ts b/src/processTargets/marks/LineNumberStage.ts index 26b34e69ed..81bc962df9 100644 --- a/src/processTargets/marks/LineNumberStage.ts +++ b/src/processTargets/marks/LineNumberStage.ts @@ -1,4 +1,4 @@ -import { TextEditor } from "../../libs/common/ide/types/TextEditor"; +import { TextEditor } from "@cursorless/common"; import type { LineNumberMark, LineNumberType, diff --git a/src/processTargets/modifiers/ContainingScopeStage.ts b/src/processTargets/modifiers/ContainingScopeStage.ts index 0ffc4ac2ad..4b74ec87da 100644 --- a/src/processTargets/modifiers/ContainingScopeStage.ts +++ b/src/processTargets/modifiers/ContainingScopeStage.ts @@ -1,3 +1,4 @@ +import { Position, TextEditor } from "@cursorless/common"; import { NoContainingScopeError } from "../../errors"; import type { Target } from "../../typings/target.types"; import type { @@ -5,15 +6,13 @@ import type { Direction, } from "../../typings/targetDescriptor.types"; import type { ProcessedTargetsContext } from "../../typings/Types"; -import getScopeHandler from "./scopeHandlers/getScopeHandler"; import type { ModifierStage } from "../PipelineStages.types"; import { constructScopeRangeTarget } from "./constructScopeRangeTarget"; +import { getContainingScope } from "./getContainingScope"; import getLegacyScopeStage from "./getLegacyScopeStage"; +import getScopeHandler from "./scopeHandlers/getScopeHandler"; import { TargetScope } from "./scopeHandlers/scope.types"; import { ScopeHandler } from "./scopeHandlers/scopeHandler.types"; -import { getContainingScope } from "./getContainingScope"; -import Position from "../../libs/common/ide/Position"; -import { TextEditor } from "../../libs/common/ide/types/TextEditor"; /** * This modifier stage expands from the input target to the smallest containing diff --git a/src/processTargets/modifiers/EveryScopeStage.ts b/src/processTargets/modifiers/EveryScopeStage.ts index 0194d5dd28..e859cf816d 100644 --- a/src/processTargets/modifiers/EveryScopeStage.ts +++ b/src/processTargets/modifiers/EveryScopeStage.ts @@ -1,5 +1,5 @@ +import { Range } from "@cursorless/common"; import { NoContainingScopeError } from "../../errors"; -import { Range } from "../../libs/common/ide"; import type { Target } from "../../typings/target.types"; import type { EveryScopeModifier } from "../../typings/targetDescriptor.types"; import type { ProcessedTargetsContext } from "../../typings/Types"; diff --git a/src/processTargets/modifiers/HeadTailStage.ts b/src/processTargets/modifiers/HeadTailStage.ts index 5674fbfcb0..1b46ac2d7f 100644 --- a/src/processTargets/modifiers/HeadTailStage.ts +++ b/src/processTargets/modifiers/HeadTailStage.ts @@ -1,4 +1,4 @@ -import { Range } from "../../libs/common/ide"; +import { Range } from "@cursorless/common"; import { Target } from "../../typings/target.types"; import { HeadTailModifier, diff --git a/src/processTargets/modifiers/ItemStage/ItemStage.ts b/src/processTargets/modifiers/ItemStage/ItemStage.ts index 2ac50d04ab..0f2b3424f8 100644 --- a/src/processTargets/modifiers/ItemStage/ItemStage.ts +++ b/src/processTargets/modifiers/ItemStage/ItemStage.ts @@ -1,6 +1,5 @@ +import { Range, TextEditor } from "@cursorless/common"; import { NoContainingScopeError } from "../../../errors"; -import { Range } from "../../../libs/common/ide"; -import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { Target } from "../../../typings/target.types"; import { ContainingScopeModifier, diff --git a/src/processTargets/modifiers/ItemStage/getIterationScope.ts b/src/processTargets/modifiers/ItemStage/getIterationScope.ts index 4c8b078271..e0d1831fad 100644 --- a/src/processTargets/modifiers/ItemStage/getIterationScope.ts +++ b/src/processTargets/modifiers/ItemStage/getIterationScope.ts @@ -1,5 +1,4 @@ -import { Range } from "../../../libs/common/ide"; -import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; +import { Range, TextEditor } from "@cursorless/common"; import { Target } from "../../../typings/target.types"; import { ProcessedTargetsContext } from "../../../typings/Types"; import { fitRangeToLineContent } from "../scopeHandlers"; diff --git a/src/processTargets/modifiers/ItemStage/tokenizeRange.ts b/src/processTargets/modifiers/ItemStage/tokenizeRange.ts index ed73129229..4bbaf87673 100644 --- a/src/processTargets/modifiers/ItemStage/tokenizeRange.ts +++ b/src/processTargets/modifiers/ItemStage/tokenizeRange.ts @@ -1,5 +1,4 @@ -import { Range } from "../../../libs/common/ide"; -import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; +import { Range, TextEditor } from "@cursorless/common"; /** * Given the iteration scope, returns a list of "tokens" within that collection diff --git a/src/processTargets/modifiers/RelativeInclusiveScopeStage.ts b/src/processTargets/modifiers/RelativeInclusiveScopeStage.ts index 66397caa3b..79bd7f796e 100644 --- a/src/processTargets/modifiers/RelativeInclusiveScopeStage.ts +++ b/src/processTargets/modifiers/RelativeInclusiveScopeStage.ts @@ -1,6 +1,5 @@ +import { Range, TextEditor } from "@cursorless/common"; import { NoContainingScopeError } from "../../errors"; -import { Range } from "../../libs/common/ide"; -import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import type { Target } from "../../typings/target.types"; import type { Direction, diff --git a/src/processTargets/modifiers/getContainingScope.ts b/src/processTargets/modifiers/getContainingScope.ts index bf1be406fc..95539ba8a4 100644 --- a/src/processTargets/modifiers/getContainingScope.ts +++ b/src/processTargets/modifiers/getContainingScope.ts @@ -1,5 +1,4 @@ -import Position from "../../libs/common/ide/Position"; -import { TextEditor } from "../../libs/common/ide/types/TextEditor"; +import { TextEditor, Position } from "@cursorless/common"; import { Direction } from "../../typings/targetDescriptor.types"; import { ScopeHandler } from "./scopeHandlers/scopeHandler.types"; diff --git a/src/processTargets/modifiers/relativeScopeLegacy.ts b/src/processTargets/modifiers/relativeScopeLegacy.ts index 9874b5e76d..0044008c75 100644 --- a/src/processTargets/modifiers/relativeScopeLegacy.ts +++ b/src/processTargets/modifiers/relativeScopeLegacy.ts @@ -1,5 +1,5 @@ +import { Range } from "@cursorless/common"; import { findLastIndex } from "lodash"; -import { Range } from "../../libs/common/ide"; import { Target } from "../../typings/target.types"; import { RelativeScopeModifier } from "../../typings/targetDescriptor.types"; import { ProcessedTargetsContext } from "../../typings/Types"; diff --git a/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.ts b/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.ts index 3e7e94c810..aeaeec31e2 100644 --- a/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.ts +++ b/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.ts @@ -1,7 +1,5 @@ -import Position from "../../../libs/common/ide/Position"; // eslint-disable-next-line @typescript-eslint/no-unused-vars -import type { Range } from "../../../libs/common/ide"; -import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; +import { Position, Range, TextEditor } from "@cursorless/common"; import type { Direction, ScopeType, diff --git a/src/processTargets/modifiers/scopeHandlers/DocumentScopeHandler.ts b/src/processTargets/modifiers/scopeHandlers/DocumentScopeHandler.ts index 7523b2bf19..1cc7e70649 100644 --- a/src/processTargets/modifiers/scopeHandlers/DocumentScopeHandler.ts +++ b/src/processTargets/modifiers/scopeHandlers/DocumentScopeHandler.ts @@ -1,5 +1,4 @@ -import Position from "../../../libs/common/ide/Position"; -import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; +import { TextEditor, Position } from "@cursorless/common"; import { Direction, ScopeType } from "../../../typings/targetDescriptor.types"; import { DocumentTarget } from "../../targets"; import BaseScopeHandler from "./BaseScopeHandler"; diff --git a/src/processTargets/modifiers/scopeHandlers/LineScopeHandler.ts b/src/processTargets/modifiers/scopeHandlers/LineScopeHandler.ts index 3ccb45aae5..03ef92d369 100644 --- a/src/processTargets/modifiers/scopeHandlers/LineScopeHandler.ts +++ b/src/processTargets/modifiers/scopeHandlers/LineScopeHandler.ts @@ -1,6 +1,4 @@ -import Position from "../../../libs/common/ide/Position"; -import { Range } from "../../../libs/common/ide"; -import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; +import { Position, Range, TextEditor } from "@cursorless/common"; import { Direction, ScopeType } from "../../../typings/targetDescriptor.types"; import { LineTarget } from "../../targets"; import BaseScopeHandler from "./BaseScopeHandler"; diff --git a/src/processTargets/modifiers/scopeHandlers/NestedScopeHandler.ts b/src/processTargets/modifiers/scopeHandlers/NestedScopeHandler.ts index 219cc12468..03368fb14e 100644 --- a/src/processTargets/modifiers/scopeHandlers/NestedScopeHandler.ts +++ b/src/processTargets/modifiers/scopeHandlers/NestedScopeHandler.ts @@ -1,7 +1,6 @@ +import { Position, TextEditor } from "@cursorless/common"; import { flatten, imap } from "itertools"; import { getScopeHandler } from "."; -import Position from "../../../libs/common/ide/Position"; -import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import type { Direction, ScopeType, diff --git a/src/processTargets/modifiers/scopeHandlers/OneOfScopeHandler.ts b/src/processTargets/modifiers/scopeHandlers/OneOfScopeHandler.ts index 283cd45dcf..9965ea1c93 100644 --- a/src/processTargets/modifiers/scopeHandlers/OneOfScopeHandler.ts +++ b/src/processTargets/modifiers/scopeHandlers/OneOfScopeHandler.ts @@ -1,6 +1,5 @@ import { getScopeHandler } from "."; -import Position from "../../../libs/common/ide/Position"; -import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; +import { TextEditor, Position } from "@cursorless/common"; import { Direction, OneOfScopeType, diff --git a/src/processTargets/modifiers/scopeHandlers/ParagraphScopeHandler.ts b/src/processTargets/modifiers/scopeHandlers/ParagraphScopeHandler.ts index fe5e0cb40c..072a87d55e 100644 --- a/src/processTargets/modifiers/scopeHandlers/ParagraphScopeHandler.ts +++ b/src/processTargets/modifiers/scopeHandlers/ParagraphScopeHandler.ts @@ -1,8 +1,10 @@ -import Position from "../../../libs/common/ide/Position"; -import { Range } from "../../../libs/common/ide"; -import TextDocument from "../../../libs/common/ide/types/TextDocument"; -import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; -import TextLine from "../../../libs/common/ide/types/TextLine"; +import { + Position, + Range, + TextDocument, + TextEditor, + TextLine, +} from "@cursorless/common"; import { Direction, ScopeType } from "../../../typings/targetDescriptor.types"; import { ParagraphTarget } from "../../targets"; import BaseScopeHandler from "./BaseScopeHandler"; diff --git a/src/processTargets/modifiers/scopeHandlers/SurroundingPairScopeHandler.ts b/src/processTargets/modifiers/scopeHandlers/SurroundingPairScopeHandler.ts index 91ab9d7003..65064aa986 100644 --- a/src/processTargets/modifiers/scopeHandlers/SurroundingPairScopeHandler.ts +++ b/src/processTargets/modifiers/scopeHandlers/SurroundingPairScopeHandler.ts @@ -1,5 +1,4 @@ -import Position from "../../../libs/common/ide/Position"; -import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; +import { Position, TextEditor } from "@cursorless/common"; import { Direction, SurroundingPairScopeType, diff --git a/src/processTargets/modifiers/scopeHandlers/WordScopeHandler.ts b/src/processTargets/modifiers/scopeHandlers/WordScopeHandler.ts index c403afea03..5fb4deb3e8 100644 --- a/src/processTargets/modifiers/scopeHandlers/WordScopeHandler.ts +++ b/src/processTargets/modifiers/scopeHandlers/WordScopeHandler.ts @@ -1,10 +1,9 @@ +import { Range, TextEditor } from "@cursorless/common"; import { NestedScopeHandler } from "."; +import WordTokenizer from "../../../libs/cursorless-engine/scopeHandlers/WordScopeHandler/WordTokenizer"; import { Direction } from "../../../typings/targetDescriptor.types"; import { SubTokenWordTarget } from "../../targets"; import type { TargetScope } from "./scope.types"; -import WordTokenizer from "../../../libs/cursorless-engine/scopeHandlers/WordScopeHandler/WordTokenizer"; -import { Range } from "../../../libs/common/ide"; -import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; export default class WordScopeHandler extends NestedScopeHandler { public readonly scopeType = { type: "word" } as const; diff --git a/src/processTargets/modifiers/scopeHandlers/compareTargetScopes.ts b/src/processTargets/modifiers/scopeHandlers/compareTargetScopes.ts index 9929fe95a4..caa6ea692c 100644 --- a/src/processTargets/modifiers/scopeHandlers/compareTargetScopes.ts +++ b/src/processTargets/modifiers/scopeHandlers/compareTargetScopes.ts @@ -1,5 +1,4 @@ -import Position from "../../../libs/common/ide/Position"; -import { Range } from "../../../libs/common/ide"; +import { Position, Range } from "@cursorless/common"; import { Direction } from "../../../typings/targetDescriptor.types"; import { TargetScope } from "./scope.types"; diff --git a/src/processTargets/modifiers/scopeHandlers/getScopeRelativeToPosition.ts b/src/processTargets/modifiers/scopeHandlers/getScopeRelativeToPosition.ts index 68e5ac2431..36fe466c95 100644 --- a/src/processTargets/modifiers/scopeHandlers/getScopeRelativeToPosition.ts +++ b/src/processTargets/modifiers/scopeHandlers/getScopeRelativeToPosition.ts @@ -1,5 +1,4 @@ -import Position from "../../../libs/common/ide/Position"; -import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; +import { Position, TextEditor } from "@cursorless/common"; import { Direction } from "../../../typings/targetDescriptor.types"; import { OutOfRangeError } from "../targetSequenceUtils"; import { TargetScope } from "./scope.types"; diff --git a/src/processTargets/modifiers/scopeHandlers/getScopesOverlappingRange.ts b/src/processTargets/modifiers/scopeHandlers/getScopesOverlappingRange.ts index b3bb9a2468..d937b26755 100644 --- a/src/processTargets/modifiers/scopeHandlers/getScopesOverlappingRange.ts +++ b/src/processTargets/modifiers/scopeHandlers/getScopesOverlappingRange.ts @@ -1,5 +1,4 @@ -import { Range } from "../../../libs/common/ide"; -import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; +import { Range, TextEditor } from "@cursorless/common"; import { TargetScope } from "./scope.types"; import { ScopeHandler } from "./scopeHandler.types"; diff --git a/src/processTargets/modifiers/scopeHandlers/scope.types.ts b/src/processTargets/modifiers/scopeHandlers/scope.types.ts index 3014e4b8a5..d253547d8a 100644 --- a/src/processTargets/modifiers/scopeHandlers/scope.types.ts +++ b/src/processTargets/modifiers/scopeHandlers/scope.types.ts @@ -1,5 +1,4 @@ -import { Range } from "../../../libs/common/ide"; -import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; +import { Range, TextEditor } from "@cursorless/common"; import type { Target } from "../../../typings/target.types"; /** diff --git a/src/processTargets/modifiers/scopeHandlers/scopeHandler.types.ts b/src/processTargets/modifiers/scopeHandlers/scopeHandler.types.ts index 3df64b2668..490619fb33 100644 --- a/src/processTargets/modifiers/scopeHandlers/scopeHandler.types.ts +++ b/src/processTargets/modifiers/scopeHandlers/scopeHandler.types.ts @@ -1,5 +1,4 @@ -import type Position from "../../../libs/common/ide/Position"; -import type { TextEditor } from "../../../libs/common/ide/types/TextEditor"; +import type { Position, TextEditor } from "@cursorless/common"; import type { Direction, ScopeType, diff --git a/src/processTargets/modifiers/scopeHandlers/shouldYieldScope.ts b/src/processTargets/modifiers/scopeHandlers/shouldYieldScope.ts index 56f9d11923..33585f917a 100644 --- a/src/processTargets/modifiers/scopeHandlers/shouldYieldScope.ts +++ b/src/processTargets/modifiers/scopeHandlers/shouldYieldScope.ts @@ -1,4 +1,4 @@ -import Position from "../../../libs/common/ide/Position"; +import { Position } from "@cursorless/common"; import { Direction } from "../../../typings/targetDescriptor.types"; import { strictlyContains } from "../../../util/rangeUtils"; import { compareTargetScopes } from "./compareTargetScopes"; diff --git a/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts b/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts index a6137db539..8d044b27de 100644 --- a/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts +++ b/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts @@ -1,19 +1,18 @@ +import { Location, Selection } from "@cursorless/common"; import type { SyntaxNode } from "web-tree-sitter"; import { NoContainingScopeError } from "../../../errors"; import { getNodeMatcher } from "../../../languages/getNodeMatcher"; -import Location from "../../../libs/common/ide/Location"; -import { Selection } from "../../../libs/common/ide"; import type { Target } from "../../../typings/target.types"; import type { ContainingScopeModifier, EveryScopeModifier, - SimpleScopeType, + SimpleScopeType } from "../../../typings/targetDescriptor.types"; import type { NodeMatcher, ProcessedTargetsContext, SelectionWithEditor, - SelectionWithEditorWithContext, + SelectionWithEditorWithContext } from "../../../typings/Types"; import { selectionWithEditorFromRange } from "../../../util/selectionUtils"; import type { ModifierStage } from "../../PipelineStages.types"; diff --git a/src/processTargets/modifiers/scopeTypeStages/RegexStage.ts b/src/processTargets/modifiers/scopeTypeStages/RegexStage.ts index 5a58205003..632502cfad 100644 --- a/src/processTargets/modifiers/scopeTypeStages/RegexStage.ts +++ b/src/processTargets/modifiers/scopeTypeStages/RegexStage.ts @@ -1,7 +1,5 @@ +import { Position, Range, TextEditor } from "@cursorless/common"; import { NoContainingScopeError } from "../../../errors"; -import Position from "../../../libs/common/ide/Position"; -import { Range } from "../../../libs/common/ide"; -import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { Target } from "../../../typings/target.types"; import { ContainingScopeModifier, diff --git a/src/processTargets/modifiers/surroundingPair/extractSelectionFromSurroundingPairOffsets.ts b/src/processTargets/modifiers/surroundingPair/extractSelectionFromSurroundingPairOffsets.ts index f86c2c1952..a25fbf334c 100644 --- a/src/processTargets/modifiers/surroundingPair/extractSelectionFromSurroundingPairOffsets.ts +++ b/src/processTargets/modifiers/surroundingPair/extractSelectionFromSurroundingPairOffsets.ts @@ -1,6 +1,4 @@ -import { Range } from "../../../libs/common/ide"; -import { Selection } from "../../../libs/common/ide"; -import TextDocument from "../../../libs/common/ide/types/TextDocument"; +import { Range, Selection, TextDocument } from "@cursorless/common"; import { SurroundingPairOffsets } from "./types"; export interface SurroundingPairInfo { diff --git a/src/processTargets/modifiers/surroundingPair/findSurroundingPairParseTreeBased.ts b/src/processTargets/modifiers/surroundingPair/findSurroundingPairParseTreeBased.ts index 8f62d959ed..cc03569543 100644 --- a/src/processTargets/modifiers/surroundingPair/findSurroundingPairParseTreeBased.ts +++ b/src/processTargets/modifiers/surroundingPair/findSurroundingPairParseTreeBased.ts @@ -1,10 +1,8 @@ +import { Range, TextDocument, TextEditor } from "@cursorless/common"; import { SyntaxNode } from "web-tree-sitter"; -import { Range } from "../../../libs/common/ide"; -import TextDocument from "../../../libs/common/ide/types/TextDocument"; -import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { SimpleSurroundingPairName, - SurroundingPairScopeType, + SurroundingPairScopeType } from "../../../typings/targetDescriptor.types"; import { getNodeRange } from "../../../util/nodeSelectors"; import { isContainedInErrorNode } from "../../../util/treeSitterUtils"; @@ -14,7 +12,7 @@ import { getIndividualDelimiters } from "./getIndividualDelimiters"; import { IndividualDelimiter, Offsets, - PossibleDelimiterOccurrence, + PossibleDelimiterOccurrence } from "./types"; /** diff --git a/src/processTargets/modifiers/surroundingPair/findSurroundingPairTextBased.ts b/src/processTargets/modifiers/surroundingPair/findSurroundingPairTextBased.ts index 82e87bf3d6..a73ca236dc 100644 --- a/src/processTargets/modifiers/surroundingPair/findSurroundingPairTextBased.ts +++ b/src/processTargets/modifiers/surroundingPair/findSurroundingPairTextBased.ts @@ -1,10 +1,11 @@ +import { Range, TextDocument, TextEditor } from "@cursorless/common"; import { escapeRegExp, findLast, uniq } from "lodash"; +import { matchAll } from "../../../libs/cursorless-engine/util/regex"; import { SimpleSurroundingPairName, SurroundingPairName, SurroundingPairScopeType, } from "../../../typings/targetDescriptor.types"; -import { matchAll } from "../../../libs/cursorless-engine/util/regex"; import { extractSelectionFromSurroundingPairOffsets } from "./extractSelectionFromSurroundingPairOffsets"; import { findSurroundingPairCore } from "./findSurroundingPairCore"; import { getIndividualDelimiters } from "./getIndividualDelimiters"; @@ -14,9 +15,6 @@ import { PossibleDelimiterOccurrence, SurroundingPairOffsets, } from "./types"; -import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; -import { Range } from "../../../libs/common/ide"; -import TextDocument from "../../../libs/common/ide/types/TextDocument"; /** * The initial range length that we start by scanning diff --git a/src/processTargets/modifiers/surroundingPair/index.ts b/src/processTargets/modifiers/surroundingPair/index.ts index 0a61f178a5..48986850f8 100644 --- a/src/processTargets/modifiers/surroundingPair/index.ts +++ b/src/processTargets/modifiers/surroundingPair/index.ts @@ -1,11 +1,8 @@ +import { Location, Range, Selection, TextEditor } from "@cursorless/common"; import { SyntaxNode } from "web-tree-sitter"; import getTextFragmentExtractor, { TextFragmentExtractor, } from "../../../languages/getTextFragmentExtractor"; -import Location from "../../../libs/common/ide/Location"; -import { Range } from "../../../libs/common/ide"; -import { Selection } from "../../../libs/common/ide"; -import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; import { ComplexSurroundingPairName, SurroundingPairScopeType, diff --git a/src/processTargets/modifiers/toPositionTarget.ts b/src/processTargets/modifiers/toPositionTarget.ts index 90df247792..fb48c6f6f8 100644 --- a/src/processTargets/modifiers/toPositionTarget.ts +++ b/src/processTargets/modifiers/toPositionTarget.ts @@ -1,4 +1,4 @@ -import { Range } from "../../libs/common/ide"; +import { Range } from "@cursorless/common"; import { Target } from "../../typings/target.types"; import { Position } from "../../typings/targetDescriptor.types"; import { PositionTarget } from "../targets"; diff --git a/src/processTargets/processTargets.ts b/src/processTargets/processTargets.ts index 584758b100..166d421fad 100644 --- a/src/processTargets/processTargets.ts +++ b/src/processTargets/processTargets.ts @@ -1,5 +1,5 @@ +import { Range } from "@cursorless/common"; import { uniqWith, zip } from "lodash"; -import { Range } from "../libs/common/ide"; import { Target } from "../typings/target.types"; import { Modifier, diff --git a/src/processTargets/targetUtil/createContinuousRange.ts b/src/processTargets/targetUtil/createContinuousRange.ts index de402b2180..81bf430b97 100644 --- a/src/processTargets/targetUtil/createContinuousRange.ts +++ b/src/processTargets/targetUtil/createContinuousRange.ts @@ -1,5 +1,4 @@ -import Position from "../../libs/common/ide/Position"; -import { Range } from "../../libs/common/ide"; +import { Position, Range } from "@cursorless/common"; import type { Target } from "../../typings/target.types"; import { UntypedTarget } from "../targets"; diff --git a/src/processTargets/targetUtil/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior.ts b/src/processTargets/targetUtil/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior.ts index 99d37df591..a6f3cb7b40 100644 --- a/src/processTargets/targetUtil/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior.ts +++ b/src/processTargets/targetUtil/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior.ts @@ -1,4 +1,4 @@ -import { Range } from "../../../libs/common/ide"; +import { Range } from "@cursorless/common"; import { Target } from "../../../typings/target.types"; /** diff --git a/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts b/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts index 41b494f9a3..2ca9b06ba5 100644 --- a/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts +++ b/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts @@ -1,6 +1,4 @@ -import { Range } from "../../../libs/common/ide"; -import TextDocument from "../../../libs/common/ide/types/TextDocument"; -import { TextEditor } from "../../../libs/common/ide/types/TextEditor"; +import { Range, TextDocument, TextEditor } from "@cursorless/common"; import { tokenize } from "../../../libs/cursorless-engine/tokenizer"; import type { Target } from "../../../typings/target.types"; import { expandToFullLine } from "../../../util/rangeUtils"; diff --git a/src/processTargets/targetUtil/insertionRemovalBehaviors/insertionRemovalBehavior.types.ts b/src/processTargets/targetUtil/insertionRemovalBehaviors/insertionRemovalBehavior.types.ts index 0fdb6d50be..b81905401d 100644 --- a/src/processTargets/targetUtil/insertionRemovalBehaviors/insertionRemovalBehavior.types.ts +++ b/src/processTargets/targetUtil/insertionRemovalBehaviors/insertionRemovalBehavior.types.ts @@ -1,4 +1,4 @@ -import type { Range } from "../../../libs/common/ide"; +import type { Range } from "@cursorless/common"; import type { Target } from "../../../typings/target.types"; export default interface InsertionRemovalBehavior { diff --git a/src/processTargets/targets/BaseTarget.ts b/src/processTargets/targets/BaseTarget.ts index 8416deef98..e23b4c7a50 100644 --- a/src/processTargets/targets/BaseTarget.ts +++ b/src/processTargets/targets/BaseTarget.ts @@ -1,8 +1,6 @@ +import { Range, Selection, TextEditor } from "@cursorless/common"; import { isEqual } from "lodash"; import { NoContainingScopeError } from "../../errors"; -import { Range } from "../../libs/common/ide"; -import { Selection } from "../../libs/common/ide"; -import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import type { EditNewContext, Target } from "../../typings/target.types"; import type { Position } from "../../typings/targetDescriptor.types"; import type { EditWithRangeUpdater } from "../../typings/Types"; diff --git a/src/processTargets/targets/DocumentTarget.ts b/src/processTargets/targets/DocumentTarget.ts index d2b86a0f24..6a6166ceba 100644 --- a/src/processTargets/targets/DocumentTarget.ts +++ b/src/processTargets/targets/DocumentTarget.ts @@ -1,4 +1,4 @@ -import { Range } from "../../libs/common/ide"; +import { Range } from "@cursorless/common"; import { shrinkRangeToFitContent } from "../../util/selectionUtils"; import BaseTarget, { CommonTargetParameters } from "./BaseTarget"; import PlainTarget from "./PlainTarget"; diff --git a/src/processTargets/targets/InteriorTarget.ts b/src/processTargets/targets/InteriorTarget.ts index d039ab04da..772acd357c 100644 --- a/src/processTargets/targets/InteriorTarget.ts +++ b/src/processTargets/targets/InteriorTarget.ts @@ -1,4 +1,4 @@ -import { Range } from "../../libs/common/ide"; +import { Range } from "@cursorless/common"; import { Target } from "../../typings/target.types"; import { shrinkRangeToFitContent } from "../../util/selectionUtils"; import { isSameType } from "../../util/typeUtils"; diff --git a/src/processTargets/targets/LineTarget.ts b/src/processTargets/targets/LineTarget.ts index cca32ce2ec..b4d39d829c 100644 --- a/src/processTargets/targets/LineTarget.ts +++ b/src/processTargets/targets/LineTarget.ts @@ -1,6 +1,4 @@ -import Position from "../../libs/common/ide/Position"; -import { Range } from "../../libs/common/ide"; -import { TextEditor } from "../../libs/common/ide/types/TextEditor"; +import { Position, Range, TextEditor } from "@cursorless/common"; import { Target } from "../../typings/target.types"; import { expandToFullLine } from "../../util/rangeUtils"; import { tryConstructPlainTarget } from "../../util/tryConstructTarget"; diff --git a/src/processTargets/targets/NotebookCellTarget.ts b/src/processTargets/targets/NotebookCellTarget.ts index 28365638d8..f3dd9ffab6 100644 --- a/src/processTargets/targets/NotebookCellTarget.ts +++ b/src/processTargets/targets/NotebookCellTarget.ts @@ -1,5 +1,5 @@ -import { toVscodeEditor } from "../../ide/vscode/VscodeUtil"; -import { TextEditor } from "../../libs/common/ide/types/TextEditor"; +import { TextEditor } from "@cursorless/common"; +import { toVscodeEditor } from "../../ide/vscode/vscodeIdeUtil"; import { Target } from "../../typings/target.types"; import { Position } from "../../typings/targetDescriptor.types"; import { getNotebookFromCellDocument } from "../../util/notebook"; diff --git a/src/processTargets/targets/ParagraphTarget.ts b/src/processTargets/targets/ParagraphTarget.ts index 737e8a116f..220c928fc7 100644 --- a/src/processTargets/targets/ParagraphTarget.ts +++ b/src/processTargets/targets/ParagraphTarget.ts @@ -1,15 +1,17 @@ +import { + Position, + Range, + TextDocument, + TextEditor, + TextLine, +} from "@cursorless/common"; import { Target } from "../../typings/target.types"; import { expandToFullLine } from "../../util/rangeUtils"; -import { isSameType } from "../../util/typeUtils"; import { constructLineTarget } from "../../util/tryConstructTarget"; +import { isSameType } from "../../util/typeUtils"; import { createContinuousLineRange } from "../targetUtil/createContinuousRange"; import BaseTarget from "./BaseTarget"; import LineTarget from "./LineTarget"; -import { Range } from "../../libs/common/ide"; -import { TextEditor } from "../../libs/common/ide/types/TextEditor"; -import Position from "../../libs/common/ide/Position"; -import TextDocument from "../../libs/common/ide/types/TextDocument"; -import TextLine from "../../libs/common/ide/types/TextLine"; export default class ParagraphTarget extends BaseTarget { insertionDelimiter = "\n\n"; diff --git a/src/processTargets/targets/PositionTarget.ts b/src/processTargets/targets/PositionTarget.ts index 835d2afcde..bd246301a0 100644 --- a/src/processTargets/targets/PositionTarget.ts +++ b/src/processTargets/targets/PositionTarget.ts @@ -1,7 +1,6 @@ +import { Range, TextEditor } from "@cursorless/common"; import { BaseTarget, CommonTargetParameters } from "."; import { UnsupportedError } from "../../errors"; -import { Range } from "../../libs/common/ide"; -import { TextEditor } from "../../libs/common/ide/types/TextEditor"; import { EditNewContext } from "../../typings/target.types"; import { Position } from "../../typings/targetDescriptor.types"; import { EditWithRangeUpdater } from "../../typings/Types"; diff --git a/src/processTargets/targets/ScopeTypeTarget.ts b/src/processTargets/targets/ScopeTypeTarget.ts index 0088b77fe4..499679ef91 100644 --- a/src/processTargets/targets/ScopeTypeTarget.ts +++ b/src/processTargets/targets/ScopeTypeTarget.ts @@ -1,4 +1,4 @@ -import { Range } from "../../libs/common/ide"; +import { Range } from "@cursorless/common"; import { Target } from "../../typings/target.types"; import { SimpleScopeTypeType } from "../../typings/targetDescriptor.types"; import { isSameType } from "../../util/typeUtils"; diff --git a/src/processTargets/targets/SubTokenWordTarget.ts b/src/processTargets/targets/SubTokenWordTarget.ts index 6bce889985..e5482c618e 100644 --- a/src/processTargets/targets/SubTokenWordTarget.ts +++ b/src/processTargets/targets/SubTokenWordTarget.ts @@ -1,5 +1,5 @@ -import { Range } from "../../libs/common/ide"; -import { tryConstructPlainTarget as tryConstructPlainTarget } from "../../util/tryConstructTarget"; +import { Range } from "@cursorless/common"; +import { tryConstructPlainTarget } from "../../util/tryConstructTarget"; import { getDelimitedSequenceRemovalRange } from "../targetUtil/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior"; import BaseTarget, { CommonTargetParameters } from "./BaseTarget"; diff --git a/src/processTargets/targets/SurroundingPairTarget.ts b/src/processTargets/targets/SurroundingPairTarget.ts index 6668d56ea2..c6d706657b 100644 --- a/src/processTargets/targets/SurroundingPairTarget.ts +++ b/src/processTargets/targets/SurroundingPairTarget.ts @@ -1,4 +1,4 @@ -import { Range } from "../../libs/common/ide"; +import { Range } from "@cursorless/common"; import { Target } from "../../typings/target.types"; import { getTokenLeadingDelimiterTarget, diff --git a/src/processTargets/targets/TokenTarget.ts b/src/processTargets/targets/TokenTarget.ts index 3828146141..b2958669a1 100644 --- a/src/processTargets/targets/TokenTarget.ts +++ b/src/processTargets/targets/TokenTarget.ts @@ -1,5 +1,5 @@ +import { Range } from "@cursorless/common"; import { BaseTarget } from "."; -import { Range } from "../../libs/common/ide"; import { Target } from "../../typings/target.types"; import { getTokenLeadingDelimiterTarget, diff --git a/src/processTargets/targets/UntypedTarget.ts b/src/processTargets/targets/UntypedTarget.ts index dd8114afbb..9411ea4b2e 100644 --- a/src/processTargets/targets/UntypedTarget.ts +++ b/src/processTargets/targets/UntypedTarget.ts @@ -1,5 +1,5 @@ +import { Range } from "@cursorless/common"; import { BaseTarget, CommonTargetParameters } from "."; -import { Range } from "../../libs/common/ide"; import type { Target } from "../../typings/target.types"; import { createContinuousRangeUntypedTarget } from "../targetUtil/createContinuousRange"; import { diff --git a/src/testUtil/fromPlainObject.ts b/src/testUtil/fromPlainObject.ts index 5ec30b5b2c..6ff9bca3af 100644 --- a/src/testUtil/fromPlainObject.ts +++ b/src/testUtil/fromPlainObject.ts @@ -1,15 +1,12 @@ -import { UntypedTarget } from "../processTargets/targets"; -import type { Target } from "../typings/target.types"; +import { Position, Range, Selection, TextEditor } from "@cursorless/common"; import type { PositionPlainObject, RangePlainObject, SelectionPlainObject, TargetPlainObject, } from "../libs/vscode-common/testUtil/toPlainObject"; -import { Range } from "../libs/common/ide"; -import { Selection } from "../libs/common/ide"; -import Position from "../libs/common/ide/Position"; -import { TextEditor } from "../libs/common/ide/types/TextEditor"; +import { UntypedTarget } from "../processTargets/targets"; +import type { Target } from "../typings/target.types"; /** * Given a plain object describing a target, constructs a `Target` object. diff --git a/src/typings/Types.ts b/src/typings/Types.ts index 92a7d9f04c..d1ea9514dd 100644 --- a/src/typings/Types.ts +++ b/src/typings/Types.ts @@ -1,3 +1,9 @@ +import type { + Location, + Range, + Selection, + TextEditor, +} from "@cursorless/common"; import { SyntaxNode } from "web-tree-sitter"; import { ActionRecord } from "../actions/actions.types"; import Cheatsheet from "../core/Cheatsheet"; @@ -10,10 +16,6 @@ import { ReadOnlyHatMap } from "../core/IndividualHatMap"; import { Snippets } from "../core/Snippets"; import StatusBarItem from "../core/StatusBarItem"; import { RangeUpdater } from "../core/updateSelections/RangeUpdater"; -import type Location from "../libs/common/ide/Location"; -import type { Range } from "../libs/common/ide"; -import type { Selection } from "../libs/common/ide"; -import type { TextEditor } from "../libs/common/ide/types/TextEditor"; import { CommandServerApi } from "../libs/vscode-common/getExtensionApi"; import { ModifierStage } from "../processTargets/PipelineStages.types"; import { TestCaseRecorder } from "../testUtil/TestCaseRecorder"; diff --git a/src/typings/target.types.ts b/src/typings/target.types.ts index f744ee242c..cb661844f3 100644 --- a/src/typings/target.types.ts +++ b/src/typings/target.types.ts @@ -6,9 +6,7 @@ // eslint-disable-next-line @typescript-eslint/no-unused-vars import type ModifyIfUntypedStage from "../processTargets/modifiers/ModifyIfUntypedStage"; // eslint-disable-next-line @typescript-eslint/no-unused-vars -import type { Range } from "../libs/common/ide"; -import type { Selection } from "../libs/common/ide"; -import type { TextEditor } from "../libs/common/ide/types/TextEditor"; +import type { Range, Selection, TextEditor } from "@cursorless/common"; import type { // eslint-disable-next-line @typescript-eslint/no-unused-vars ScopeTypeTarget, diff --git a/src/typings/updateSelections.ts b/src/typings/updateSelections.ts index 295db23aa6..c31e94e27d 100644 --- a/src/typings/updateSelections.ts +++ b/src/typings/updateSelections.ts @@ -1,4 +1,4 @@ -import type { Range } from "../libs/common/ide"; +import type { Range } from "@cursorless/common"; import type { TextDocumentChangeEvent, TextDocumentContentChangeEvent, diff --git a/src/util/addDecorationsToEditor.ts b/src/util/addDecorationsToEditor.ts index 304fbb5438..468b75a69b 100644 --- a/src/util/addDecorationsToEditor.ts +++ b/src/util/addDecorationsToEditor.ts @@ -1,9 +1,8 @@ +import { Range, TextEditor } from "@cursorless/common"; import { concat, flatten, maxBy, min } from "lodash"; import Decorations from "../core/Decorations"; import { HatStyleName } from "../core/hatStyles"; import { IndividualHatMap } from "../core/IndividualHatMap"; -import { Range } from "../libs/common/ide"; -import { TextEditor } from "../libs/common/ide/types/TextEditor"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { TokenGraphemeSplitter } from "../libs/cursorless-engine/tokenGraphemeSplitter"; import { getMatcher } from "../libs/cursorless-engine/tokenizer"; diff --git a/src/util/getDisplayLineMap.ts b/src/util/getDisplayLineMap.ts index cef274802e..2aa00e95aa 100644 --- a/src/util/getDisplayLineMap.ts +++ b/src/util/getDisplayLineMap.ts @@ -1,5 +1,5 @@ +import { TextEditor } from "@cursorless/common"; import { concat, flatten, flow, range, uniq } from "lodash"; -import { TextEditor } from "../libs/common/ide/types/TextEditor"; /** * Returns a map from line numbers in the file to display lines, which skip diff --git a/src/util/getTokensInRange.ts b/src/util/getTokensInRange.ts index d5f50b8e42..63720865f0 100644 --- a/src/util/getTokensInRange.ts +++ b/src/util/getTokensInRange.ts @@ -1,5 +1,4 @@ -import { Range } from "../libs/common/ide"; -import { TextEditor } from "../libs/common/ide/types/TextEditor"; +import { Range, TextEditor } from "@cursorless/common"; import { tokenize } from "../libs/cursorless-engine/tokenizer"; import { RangeOffsets } from "../typings/updateSelections"; diff --git a/src/util/nodeFinders.ts b/src/util/nodeFinders.ts index ffe8ebd89c..dfa82da566 100644 --- a/src/util/nodeFinders.ts +++ b/src/util/nodeFinders.ts @@ -1,6 +1,5 @@ +import { Position, Selection } from "@cursorless/common"; import { Point, SyntaxNode } from "web-tree-sitter"; -import Position from "../libs/common/ide/Position"; -import { Selection } from "../libs/common/ide"; import { NodeFinder } from "../typings/Types"; export const nodeFinder = ( diff --git a/src/util/nodeSelectors.ts b/src/util/nodeSelectors.ts index bc32ee7362..45ee5c9c1a 100644 --- a/src/util/nodeSelectors.ts +++ b/src/util/nodeSelectors.ts @@ -1,9 +1,6 @@ +import { Position, Range, Selection, TextEditor } from "@cursorless/common"; import { identity, maxBy } from "lodash"; import { Point, SyntaxNode } from "web-tree-sitter"; -import Position from "../libs/common/ide/Position"; -import { Range } from "../libs/common/ide"; -import { Selection } from "../libs/common/ide"; -import { TextEditor } from "../libs/common/ide/types/TextEditor"; import { NodeFinder, SelectionExtractor, diff --git a/src/util/notebookLegacy.ts b/src/util/notebookLegacy.ts index 0c19ac3b96..58573ec1b2 100644 --- a/src/util/notebookLegacy.ts +++ b/src/util/notebookLegacy.ts @@ -7,7 +7,7 @@ import { TextEditor, version, } from "vscode"; -import { toVscodeEditor } from "../ide/vscode/VscodeUtil"; +import { toVscodeEditor } from "../ide/vscode/vscodeIdeUtil"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { getCellIndex } from "../libs/vscode-common/notebook"; import { getNotebookFromCellDocument } from "./notebook"; diff --git a/src/util/performDocumentEdits.ts b/src/util/performDocumentEdits.ts index 3a097be8ec..da25be7a1e 100644 --- a/src/util/performDocumentEdits.ts +++ b/src/util/performDocumentEdits.ts @@ -1,5 +1,5 @@ +import { TextEditor } from "@cursorless/common"; import { RangeUpdater } from "../core/updateSelections/RangeUpdater"; -import { TextEditor } from "../libs/common/ide/types/TextEditor"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Edit } from "../typings/Types"; diff --git a/src/util/rangeUtils.ts b/src/util/rangeUtils.ts index 72bbaf2f65..fca196fc51 100644 --- a/src/util/rangeUtils.ts +++ b/src/util/rangeUtils.ts @@ -1,6 +1,4 @@ -import Position from "../libs/common/ide/Position"; -import { Range } from "../libs/common/ide"; -import { TextEditor } from "../libs/common/ide/types/TextEditor"; +import { Position, Range, TextEditor } from "@cursorless/common"; export function isAtEndOfLine(editor: TextEditor, position: Position) { const endLine = editor.document.lineAt(position); diff --git a/src/util/selectionUtils.ts b/src/util/selectionUtils.ts index 956e88f9f5..e664f67c6b 100644 --- a/src/util/selectionUtils.ts +++ b/src/util/selectionUtils.ts @@ -1,7 +1,4 @@ -import Position from "../libs/common/ide/Position"; -import { Range } from "../libs/common/ide"; -import { Selection } from "../libs/common/ide"; -import { TextEditor } from "../libs/common/ide/types/TextEditor"; +import { Position, Range, Selection, TextEditor } from "@cursorless/common"; import { SelectionWithEditor } from "../typings/Types"; export function selectionWithEditorFromRange( diff --git a/src/util/setSelectionsAndFocusEditor.ts b/src/util/setSelectionsAndFocusEditor.ts index 51b1da8252..bf1dbb457e 100644 --- a/src/util/setSelectionsAndFocusEditor.ts +++ b/src/util/setSelectionsAndFocusEditor.ts @@ -1,5 +1,4 @@ -import { Selection } from "../libs/common/ide"; -import { EditableTextEditor } from "../libs/common/ide/types/TextEditor"; +import { EditableTextEditor, Selection } from "@cursorless/common"; import uniqDeep from "./uniqDeep"; diff --git a/src/util/targetUtils.ts b/src/util/targetUtils.ts index f393fd617e..8d69a8e2fa 100644 --- a/src/util/targetUtils.ts +++ b/src/util/targetUtils.ts @@ -1,7 +1,5 @@ +import { Range, Selection, TextEditor } from "@cursorless/common"; import { zip } from "lodash"; -import { Range } from "../libs/common/ide"; -import { Selection } from "../libs/common/ide"; -import { TextEditor } from "../libs/common/ide/types/TextEditor"; import { Target } from "../typings/target.types"; import { SelectionWithEditor } from "../typings/Types"; import { groupBy } from "./itertools"; diff --git a/src/util/tryConstructTarget.ts b/src/util/tryConstructTarget.ts index b25f2d1015..c9ca286450 100644 --- a/src/util/tryConstructTarget.ts +++ b/src/util/tryConstructTarget.ts @@ -1,5 +1,4 @@ -import { Range } from "../libs/common/ide"; -import { TextEditor } from "../libs/common/ide/types/TextEditor"; +import { Range, TextEditor } from "@cursorless/common"; import { CommonTargetParameters, LineTarget, From 7381718c36733f9af99a548f43e097550b384c9a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 14 Nov 2022 14:30:55 +0000 Subject: [PATCH 38/84] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts | 4 ++-- .../surroundingPair/findSurroundingPairParseTreeBased.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts b/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts index 8d044b27de..698aa3489d 100644 --- a/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts +++ b/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts @@ -6,13 +6,13 @@ import type { Target } from "../../../typings/target.types"; import type { ContainingScopeModifier, EveryScopeModifier, - SimpleScopeType + SimpleScopeType, } from "../../../typings/targetDescriptor.types"; import type { NodeMatcher, ProcessedTargetsContext, SelectionWithEditor, - SelectionWithEditorWithContext + SelectionWithEditorWithContext, } from "../../../typings/Types"; import { selectionWithEditorFromRange } from "../../../util/selectionUtils"; import type { ModifierStage } from "../../PipelineStages.types"; diff --git a/src/processTargets/modifiers/surroundingPair/findSurroundingPairParseTreeBased.ts b/src/processTargets/modifiers/surroundingPair/findSurroundingPairParseTreeBased.ts index cc03569543..090ab61d04 100644 --- a/src/processTargets/modifiers/surroundingPair/findSurroundingPairParseTreeBased.ts +++ b/src/processTargets/modifiers/surroundingPair/findSurroundingPairParseTreeBased.ts @@ -2,7 +2,7 @@ import { Range, TextDocument, TextEditor } from "@cursorless/common"; import { SyntaxNode } from "web-tree-sitter"; import { SimpleSurroundingPairName, - SurroundingPairScopeType + SurroundingPairScopeType, } from "../../../typings/targetDescriptor.types"; import { getNodeRange } from "../../../util/nodeSelectors"; import { isContainedInErrorNode } from "../../../util/treeSitterUtils"; @@ -12,7 +12,7 @@ import { getIndividualDelimiters } from "./getIndividualDelimiters"; import { IndividualDelimiter, Offsets, - PossibleDelimiterOccurrence + PossibleDelimiterOccurrence, } from "./types"; /** From 2ca6f888464842de67ca4e50307ac1d29f5c0528 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Mon, 14 Nov 2022 15:31:49 +0100 Subject: [PATCH 39/84] Moved vscode utilities --- .../suite/groupByDocument.test.ts | 4 +--- src/ide/vscode/vscodeIdeUtil.ts | 10 +--------- src/libs/vscode-common/VscodeUtil.ts | 16 +++++++++++++++- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/apps/cursorless-vscode-e2e/suite/groupByDocument.test.ts b/src/apps/cursorless-vscode-e2e/suite/groupByDocument.test.ts index cce8af53c4..1c34f811dd 100644 --- a/src/apps/cursorless-vscode-e2e/suite/groupByDocument.test.ts +++ b/src/apps/cursorless-vscode-e2e/suite/groupByDocument.test.ts @@ -1,9 +1,7 @@ import { splitKey } from "@cursorless/common"; -import { getCursorlessApi } from "@cursorless/vscode-common"; +import { getCursorlessApi, toVscodeEditor } from "@cursorless/vscode-common"; import * as assert from "assert"; import * as vscode from "vscode"; -// eslint-disable-next-line @typescript-eslint/no-restricted-imports -import { toVscodeEditor } from "../../../ide/vscode/vscodeIdeUtil"; import { endToEndTestSetup } from "../endToEndTestSetup"; import { runCursorlessCommand } from "../runCommand"; diff --git a/src/ide/vscode/vscodeIdeUtil.ts b/src/ide/vscode/vscodeIdeUtil.ts index c8b9ce13db..4885a64274 100644 --- a/src/ide/vscode/vscodeIdeUtil.ts +++ b/src/ide/vscode/vscodeIdeUtil.ts @@ -1,16 +1,8 @@ -import { TextDocument, TextEditor, TextLine } from "@cursorless/common"; +import { TextDocument, TextLine } from "@cursorless/common"; import * as vscode from "vscode"; import { VscodeTextDocumentImpl } from "./VscodeTextDocumentImpl"; -import { VscodeTextEditorImpl } from "./VscodeTextEditorImpl"; import VscodeTextLineImpl from "./VscodeTextLineImpl"; -export function toVscodeEditor(editor: TextEditor): vscode.TextEditor { - if ("vscodeEditor" in editor) { - return (editor as VscodeTextEditorImpl).vscodeEditor; - } - throw Error("Can't get vscode editor from non vscode implementation"); -} - export function fromVscodeDocument( document: vscode.TextDocument, ): TextDocument { diff --git a/src/libs/vscode-common/VscodeUtil.ts b/src/libs/vscode-common/VscodeUtil.ts index 88be108631..9d530499d6 100644 --- a/src/libs/vscode-common/VscodeUtil.ts +++ b/src/libs/vscode-common/VscodeUtil.ts @@ -1,5 +1,12 @@ -import { EndOfLine, Position, Range, Selection } from "@cursorless/common"; +import { + EndOfLine, + Position, + Range, + Selection, + TextEditor, +} from "@cursorless/common"; import * as vscode from "vscode"; +import type { VscodeTextEditorImpl } from "../../ide/vscode/VscodeTextEditorImpl"; export function toVscodeRange(range: Range): vscode.Range { return new vscode.Range( @@ -76,3 +83,10 @@ export function toVscodeEndOfLine(eol: EndOfLine): vscode.EndOfLine { export function fromVscodeAndOfLine(eol: vscode.EndOfLine): EndOfLine { return eol === vscode.EndOfLine.LF ? "LF" : "CRLF"; } + +export function toVscodeEditor(editor: TextEditor): vscode.TextEditor { + if ("vscodeEditor" in editor) { + return (editor as VscodeTextEditorImpl).vscodeEditor; + } + throw Error("Can't get vscode editor from non vscode implementation"); +} From f9f5540051ae016b1db89f331c42c3020dab64f8 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Mon, 14 Nov 2022 15:33:35 +0100 Subject: [PATCH 40/84] update --- src/ide/vscode/fromVscodeEditor.ts | 12 ------------ src/ide/vscode/vscodeIdeUtil.ts | 12 +++++++++++- 2 files changed, 11 insertions(+), 13 deletions(-) delete mode 100644 src/ide/vscode/fromVscodeEditor.ts diff --git a/src/ide/vscode/fromVscodeEditor.ts b/src/ide/vscode/fromVscodeEditor.ts deleted file mode 100644 index ccdaad5874..0000000000 --- a/src/ide/vscode/fromVscodeEditor.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { TextEditor } from "@cursorless/common"; -import type * as vscode from "vscode"; -import { VscodeTextEditorImpl } from "./VscodeTextEditorImpl"; - -const editorMap = new WeakMap(); - -export function fromVscodeEditor(editor: vscode.TextEditor): TextEditor { - if (!editorMap.has(editor)) { - editorMap.set(editor, new VscodeTextEditorImpl(editor)); - } - return editorMap.get(editor)!; -} diff --git a/src/ide/vscode/vscodeIdeUtil.ts b/src/ide/vscode/vscodeIdeUtil.ts index 4885a64274..a1401f26f5 100644 --- a/src/ide/vscode/vscodeIdeUtil.ts +++ b/src/ide/vscode/vscodeIdeUtil.ts @@ -1,8 +1,18 @@ -import { TextDocument, TextLine } from "@cursorless/common"; +import { TextDocument, TextEditor, TextLine } from "@cursorless/common"; import * as vscode from "vscode"; import { VscodeTextDocumentImpl } from "./VscodeTextDocumentImpl"; +import { VscodeTextEditorImpl } from "./VscodeTextEditorImpl"; import VscodeTextLineImpl from "./VscodeTextLineImpl"; +const editorMap = new WeakMap(); + +export function fromVscodeEditor(editor: vscode.TextEditor): TextEditor { + if (!editorMap.has(editor)) { + editorMap.set(editor, new VscodeTextEditorImpl(editor)); + } + return editorMap.get(editor)!; +} + export function fromVscodeDocument( document: vscode.TextDocument, ): TextDocument { From 2572664a99000aa81b0ac9e045795fc97c70e616 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Mon, 14 Nov 2022 15:36:21 +0100 Subject: [PATCH 41/84] Fixed stupid bug --- src/extension.ts | 2 +- src/ide/vscode/VscodeIDE.ts | 4 ++-- src/processTargets/targets/NotebookCellTarget.ts | 2 +- src/util/notebookLegacy.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index a9e940851c..9f4667c0c4 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,8 +1,8 @@ import * as vscode from "vscode"; import CommandRunner from "./core/commandRunner/CommandRunner"; import { ThatMark } from "./core/ThatMark"; -import { fromVscodeEditor } from "./ide/vscode/fromVscodeEditor"; import VscodeIDE from "./ide/vscode/VscodeIDE"; +import { fromVscodeEditor } from "./ide/vscode/vscodeIdeUtil"; import FakeIDE from "./libs/common/ide/fake/FakeIDE"; import ide, { injectIde, diff --git a/src/ide/vscode/VscodeIDE.ts b/src/ide/vscode/VscodeIDE.ts index 37e7ed79c8..905ddab965 100644 --- a/src/ide/vscode/VscodeIDE.ts +++ b/src/ide/vscode/VscodeIDE.ts @@ -7,15 +7,15 @@ import type { IDE, RunMode, } from "../../libs/common/ide/types/ide.types"; -import { fromVscodeEditor } from "./fromVscodeEditor"; +import { toVscodeEditor } from "@cursorless/vscode-common"; import VscodeClipboard from "./VscodeClipboard"; import VscodeConfiguration from "./VscodeConfiguration"; import { VscodeEditableTextEditorImpl } from "./VscodeEditableTextEditorImpl"; import { vscodeOnDidChangeTextDocument } from "./VscodeEvents"; import VscodeGlobalState from "./VscodeGlobalState"; +import { fromVscodeEditor } from "./vscodeIdeUtil"; import VscodeMessages from "./VscodeMessages"; import { vscodeRunMode } from "./VscodeRunMode"; -import { toVscodeEditor } from "./vscodeIdeUtil"; export default class VscodeIDE implements IDE { configuration: VscodeConfiguration; diff --git a/src/processTargets/targets/NotebookCellTarget.ts b/src/processTargets/targets/NotebookCellTarget.ts index f3dd9ffab6..08ccb12144 100644 --- a/src/processTargets/targets/NotebookCellTarget.ts +++ b/src/processTargets/targets/NotebookCellTarget.ts @@ -1,5 +1,5 @@ import { TextEditor } from "@cursorless/common"; -import { toVscodeEditor } from "../../ide/vscode/vscodeIdeUtil"; +import { toVscodeEditor } from "@cursorless/vscode-common"; import { Target } from "../../typings/target.types"; import { Position } from "../../typings/targetDescriptor.types"; import { getNotebookFromCellDocument } from "../../util/notebook"; diff --git a/src/util/notebookLegacy.ts b/src/util/notebookLegacy.ts index 58573ec1b2..35ad40f4bb 100644 --- a/src/util/notebookLegacy.ts +++ b/src/util/notebookLegacy.ts @@ -1,3 +1,4 @@ +import { toVscodeEditor } from "@cursorless/vscode-common"; import { range } from "lodash"; import * as semver from "semver"; import { @@ -7,7 +8,6 @@ import { TextEditor, version, } from "vscode"; -import { toVscodeEditor } from "../ide/vscode/vscodeIdeUtil"; import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { getCellIndex } from "../libs/vscode-common/notebook"; import { getNotebookFromCellDocument } from "./notebook"; From 2794bb597c916e2352e001235c36070a3a699b4f Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Mon, 14 Nov 2022 15:51:38 +0100 Subject: [PATCH 42/84] empty From aa275b63d0872e8dfe20c4059bc886c079c7d8a9 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 15 Nov 2022 08:20:02 +0100 Subject: [PATCH 43/84] stuff --- src/libs/vscode-common/{VscodeUtil.ts => avscodeUtil.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/libs/vscode-common/{VscodeUtil.ts => avscodeUtil.ts} (100%) diff --git a/src/libs/vscode-common/VscodeUtil.ts b/src/libs/vscode-common/avscodeUtil.ts similarity index 100% rename from src/libs/vscode-common/VscodeUtil.ts rename to src/libs/vscode-common/avscodeUtil.ts From 501f7c911642ec5fa4687d7b9a0481612bbcb3da Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 15 Nov 2022 08:20:20 +0100 Subject: [PATCH 44/84] stuff --- src/libs/vscode-common/{avscodeUtil.ts => vscodeUtil.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/libs/vscode-common/{avscodeUtil.ts => vscodeUtil.ts} (100%) diff --git a/src/libs/vscode-common/avscodeUtil.ts b/src/libs/vscode-common/vscodeUtil.ts similarity index 100% rename from src/libs/vscode-common/avscodeUtil.ts rename to src/libs/vscode-common/vscodeUtil.ts From 7bb38a4e05d0343a55047773d394861fd00b0672 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 15 Nov 2022 08:29:51 +0100 Subject: [PATCH 45/84] Added to empty range on position --- src/libs/common/types/Position.ts | 10 ++++++++++ src/libs/common/types/Range.ts | 12 ------------ src/libs/common/types/Selection.ts | 12 ------------ .../TokenInsertionRemovalBehavior.ts | 4 ++-- 4 files changed, 12 insertions(+), 26 deletions(-) diff --git a/src/libs/common/types/Position.ts b/src/libs/common/types/Position.ts index a11f960379..35f5e604df 100644 --- a/src/libs/common/types/Position.ts +++ b/src/libs/common/types/Position.ts @@ -1,3 +1,5 @@ +import { Range } from "@cursorless/common"; + export class Position { /** * The zero-based line value. @@ -128,4 +130,12 @@ export class Position { this.character + (characterDelta ?? 0), ); } + + /** + * Create a new empty range from this position. + * @returns A {@link Range} + */ + public toEmptyRange(): Range { + return new Range(this, this); + } } diff --git a/src/libs/common/types/Range.ts b/src/libs/common/types/Range.ts index 53fbaadad0..cfa09d605c 100644 --- a/src/libs/common/types/Range.ts +++ b/src/libs/common/types/Range.ts @@ -11,13 +11,6 @@ export class Range { */ readonly end: Position; - /** - * Create a new empty range. - * - * @param position A position. - */ - constructor(position: Position); - /** * Create a new range from two positions. If `start` is not * before or equal to `end`, the values will be swapped. @@ -45,11 +38,6 @@ export class Range { constructor(...args: any[]) { const [start, end]: [Position, Position] = (() => { - // Arguments are one positions - if (args.length === 1) { - return [args[0], args[0]]; - } - // Arguments are two positions if (args.length === 2) { return args as [Position, Position]; diff --git a/src/libs/common/types/Selection.ts b/src/libs/common/types/Selection.ts index 3154743d72..a728eaa3f4 100644 --- a/src/libs/common/types/Selection.ts +++ b/src/libs/common/types/Selection.ts @@ -20,13 +20,6 @@ export class Selection extends Range { return this.active.isBefore(this.anchor); } - /** - * Create a new empty selection. - * - * @param position A position. - */ - constructor(position: Position); - /** * Create a selection from two positions. * @@ -52,11 +45,6 @@ export class Selection extends Range { constructor(...args: any[]) { const [anchor, active]: [Position, Position] = (() => { - // Arguments are one positions - if (args.length === 1) { - return [args[0], args[0]]; - } - // Arguments are two positions if (args.length === 2) { return args as [Position, Position]; diff --git a/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts b/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts index 2ca9b06ba5..cb86ae0c23 100644 --- a/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts +++ b/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts @@ -65,10 +65,10 @@ export function getTokenRemovalRange(target: Target): Range { const { start, end } = contentRange; const leadingWhitespaceRange = - target.getLeadingDelimiterTarget()?.contentRange ?? new Range(start); + target.getLeadingDelimiterTarget()?.contentRange ?? start.toEmptyRange(); const trailingWhitespaceRange = - target.getTrailingDelimiterTarget()?.contentRange ?? new Range(end); + target.getTrailingDelimiterTarget()?.contentRange ?? end.toEmptyRange(); const fullLineRange = expandToFullLine(editor, contentRange); From 836092d8ed5d118df3c935bcf8489ef892c9b9cc Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 15 Nov 2022 08:37:09 +0100 Subject: [PATCH 46/84] cleaned up vscode edit --- .../{VscodeEditEditor.ts => VscodeEdit.ts} | 15 ++++++--------- src/ide/vscode/VscodeEditableTextEditorImpl.ts | 4 ++-- src/libs/common/types/TextEditorEdit.ts | 6 +++--- src/libs/vscode-common/vscodeUtil.ts | 16 ---------------- 4 files changed, 11 insertions(+), 30 deletions(-) rename src/ide/vscode/{VscodeEditEditor.ts => VscodeEdit.ts} (68%) diff --git a/src/ide/vscode/VscodeEditEditor.ts b/src/ide/vscode/VscodeEdit.ts similarity index 68% rename from src/ide/vscode/VscodeEditEditor.ts rename to src/ide/vscode/VscodeEdit.ts index dab7272c63..c80184301b 100644 --- a/src/ide/vscode/VscodeEditEditor.ts +++ b/src/ide/vscode/VscodeEdit.ts @@ -2,12 +2,12 @@ import { TextEditorEdit } from "@cursorless/common"; import { toVscodeEndOfLine, toVscodePosition, - toVscodePositionOrRangeOrSelection, - toVscodeRangeOrSelection, + toVscodePositionOrRange, + toVscodeRange, } from "@cursorless/vscode-common"; -import * as vscode from "vscode"; +import type * as vscode from "vscode"; -export default function vscodeEditEditor( +export default function vscodeEdit( editor: vscode.TextEditor, callback: (editBuilder: TextEditorEdit) => void, options?: { undoStopBefore: boolean; undoStopAfter: boolean }, @@ -15,16 +15,13 @@ export default function vscodeEditEditor( return editor.edit((editBuilder) => { callback({ replace: (location, value) => { - editBuilder.replace( - toVscodePositionOrRangeOrSelection(location), - value, - ); + editBuilder.replace(toVscodePositionOrRange(location), value); }, insert: (location, value) => { editBuilder.insert(toVscodePosition(location), value); }, delete: (location) => { - editBuilder.delete(toVscodeRangeOrSelection(location)); + editBuilder.delete(toVscodeRange(location)); }, setEndOfLine: (endOfLine) => { editBuilder.setEndOfLine(toVscodeEndOfLine(endOfLine)); diff --git a/src/ide/vscode/VscodeEditableTextEditorImpl.ts b/src/ide/vscode/VscodeEditableTextEditorImpl.ts index 8c17077d85..c2bdf29156 100644 --- a/src/ide/vscode/VscodeEditableTextEditorImpl.ts +++ b/src/ide/vscode/VscodeEditableTextEditorImpl.ts @@ -14,7 +14,7 @@ import { } from "@cursorless/vscode-common"; import * as vscode from "vscode"; import vscodeFocusEditor from "../../ide/vscode/VscodeFocusEditor"; -import vscodeEditEditor from "./VscodeEditEditor"; +import vscodeEdit from "./VscodeEdit"; import vscodeOpenLink from "./VscodeOpenLink"; import { VscodeTextEditorImpl } from "./VscodeTextEditorImpl"; @@ -57,7 +57,7 @@ export class VscodeEditableTextEditorImpl callback: (editBuilder: TextEditorEdit) => void, options?: { undoStopBefore: boolean; undoStopAfter: boolean }, ): Thenable { - return vscodeEditEditor(this.editor, callback, options); + return vscodeEdit(this.editor, callback, options); } public focus(): Promise { diff --git a/src/libs/common/types/TextEditorEdit.ts b/src/libs/common/types/TextEditorEdit.ts index fb2c350fab..6015c6fb52 100644 --- a/src/libs/common/types/TextEditorEdit.ts +++ b/src/libs/common/types/TextEditorEdit.ts @@ -1,4 +1,4 @@ -import type { Position, Range, Selection, EndOfLine } from "@cursorless/common"; +import type { EndOfLine, Position, Range } from "@cursorless/common"; /** * A complex edit that will be applied in one transaction on a TextEditor. @@ -13,7 +13,7 @@ export interface TextEditorEdit { * @param location The range this operation should remove. * @param value The new text this operation should insert after removing `location`. */ - replace(location: Position | Range | Selection, value: string): void; + replace(location: Position | Range, value: string): void; /** * Insert text at a location. @@ -30,7 +30,7 @@ export interface TextEditorEdit { * * @param location The range this operation should remove. */ - delete(location: Range | Selection): void; + delete(location: Range): void; /** * Set the end of line sequence. diff --git a/src/libs/vscode-common/vscodeUtil.ts b/src/libs/vscode-common/vscodeUtil.ts index 9d530499d6..f573660454 100644 --- a/src/libs/vscode-common/vscodeUtil.ts +++ b/src/libs/vscode-common/vscodeUtil.ts @@ -60,22 +60,6 @@ export function toVscodePositionOrRange( : toVscodePosition(location); } -export function toVscodePositionOrRangeOrSelection( - location: Position | Range | Selection, -): vscode.Position | vscode.Range | vscode.Selection { - return "line" in location - ? toVscodePosition(location) - : toVscodeRangeOrSelection(location); -} - -export function toVscodeRangeOrSelection( - location: Range | Selection, -): vscode.Range | vscode.Selection { - return "anchor" in location - ? toVscodeSelection(location) - : toVscodeRange(location); -} - export function toVscodeEndOfLine(eol: EndOfLine): vscode.EndOfLine { return eol === "LF" ? vscode.EndOfLine.LF : vscode.EndOfLine.CRLF; } From ad779fade4525a9dbf77bd50fa5ca533dbde3c0f Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 15 Nov 2022 08:44:38 +0100 Subject: [PATCH 47/84] clean up --- src/ide/vscode/VscodeTextLineImpl.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/ide/vscode/VscodeTextLineImpl.ts b/src/ide/vscode/VscodeTextLineImpl.ts index 2715517adb..2f19862870 100644 --- a/src/ide/vscode/VscodeTextLineImpl.ts +++ b/src/ide/vscode/VscodeTextLineImpl.ts @@ -26,10 +26,7 @@ export default class VscodeTextLineImpl implements TextLine { } get lastNonWhitespaceCharacterIndex(): number { - return ( - this.line.range.end.character - - (this.line.text.length - this.line.text.trimEnd().length) - ); + return this.line.text.trimEnd().length; } get isEmptyOrWhitespace(): boolean { From 10ea6d221b3499d206efd8051182596f5cc3d709 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 15 Nov 2022 08:51:19 +0100 Subject: [PATCH 48/84] clean up vscode focus editor --- src/ide/vscode/VscodeEditableTextEditorImpl.ts | 2 +- src/ide/vscode/VscodeFocusEditor.ts | 12 ++++-------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/ide/vscode/VscodeEditableTextEditorImpl.ts b/src/ide/vscode/VscodeEditableTextEditorImpl.ts index c2bdf29156..ff375bdbc3 100644 --- a/src/ide/vscode/VscodeEditableTextEditorImpl.ts +++ b/src/ide/vscode/VscodeEditableTextEditorImpl.ts @@ -61,7 +61,7 @@ export class VscodeEditableTextEditorImpl } public focus(): Promise { - return vscodeFocusEditor(this.editor, this.id); + return vscodeFocusEditor(this.editor); } public openLink(location: Position | Range): Promise { diff --git a/src/ide/vscode/VscodeFocusEditor.ts b/src/ide/vscode/VscodeFocusEditor.ts index ec1bfaf369..7f0ca568c5 100644 --- a/src/ide/vscode/VscodeFocusEditor.ts +++ b/src/ide/vscode/VscodeFocusEditor.ts @@ -7,7 +7,6 @@ import { ViewColumn, window, } from "vscode"; -import ide from "../../libs/cursorless-engine/singletons/ide.singleton"; import { getCellIndex } from "../../libs/vscode-common/notebook"; import { getNotebookFromCellDocument } from "../../util/notebook"; import { @@ -29,10 +28,7 @@ const columnFocusCommands = { [ViewColumn.Beside]: "", }; -export default async function focusVscodeEditor( - editor: TextEditor, - editorId: string, -) { +export default async function focusVscodeEditor(editor: TextEditor) { const viewColumn = getViewColumn(editor); if (viewColumn != null) { await commands.executeCommand(columnFocusCommands[viewColumn]); @@ -44,7 +40,7 @@ export default async function focusVscodeEditor( return await focusNotebookCellLegacy(editor); } - await focusNotebookCell(editor, editorId); + await focusNotebookCell(editor); } } @@ -64,7 +60,7 @@ function getViewColumn(editor: TextEditor): ViewColumn | undefined { return tabGroup?.viewColumn; } -async function focusNotebookCell(editor: TextEditor, editorId: string) { +async function focusNotebookCell(editor: TextEditor) { const desiredNotebookEditor = getNotebookFromCellDocument(editor.document); if (desiredNotebookEditor == null) { throw new Error("Couldn't find notebook editor for given document"); @@ -96,7 +92,7 @@ async function focusNotebookCell(editor: TextEditor, editorId: string) { // Issue a command to tell VSCode to focus the cell input editor // NB: We don't issue the command if it's already focused, because it turns // out that this command is actually a toggle, so that causes it to de-focus! - if (ide().activeTextEditor?.id !== editorId) { + if (editor !== window.activeTextEditor) { await commands.executeCommand("notebook.cell.edit"); } } From e7646921aee3f439b63d381cb50c2b998d6e1878 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 15 Nov 2022 08:59:27 +0100 Subject: [PATCH 49/84] move creation of text editors into ide --- src/extension.ts | 6 ++++-- src/ide/vscode/VscodeIDE.ts | 18 ++++++++++++++---- src/ide/vscode/vscodeIdeUtil.ts | 12 +----------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 9f4667c0c4..8c541993f2 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -2,7 +2,6 @@ import * as vscode from "vscode"; import CommandRunner from "./core/commandRunner/CommandRunner"; import { ThatMark } from "./core/ThatMark"; import VscodeIDE from "./ide/vscode/VscodeIDE"; -import { fromVscodeEditor } from "./ide/vscode/vscodeIdeUtil"; import FakeIDE from "./libs/common/ide/fake/FakeIDE"; import ide, { injectIde, @@ -81,7 +80,10 @@ export async function activate( editor: vscode.TextEditor, plainObject: TargetPlainObject, ) => { - return plainObjectToTarget(fromVscodeEditor(editor), plainObject); + return plainObjectToTarget( + vscodeIDE.fromVscodeEditor(editor), + plainObject, + ); }, } : undefined, diff --git a/src/ide/vscode/VscodeIDE.ts b/src/ide/vscode/VscodeIDE.ts index 905ddab965..7831209583 100644 --- a/src/ide/vscode/VscodeIDE.ts +++ b/src/ide/vscode/VscodeIDE.ts @@ -1,5 +1,7 @@ import type { EditableTextEditor, TextEditor } from "@cursorless/common"; +import { toVscodeEditor } from "@cursorless/vscode-common"; import { pull } from "lodash"; +import type * as vscode from "vscode"; import { ExtensionContext, window, workspace, WorkspaceFolder } from "vscode"; import type { TextDocumentChangeEvent } from "../../libs/common/ide/types/Events"; import type { @@ -7,27 +9,28 @@ import type { IDE, RunMode, } from "../../libs/common/ide/types/ide.types"; -import { toVscodeEditor } from "@cursorless/vscode-common"; import VscodeClipboard from "./VscodeClipboard"; import VscodeConfiguration from "./VscodeConfiguration"; import { VscodeEditableTextEditorImpl } from "./VscodeEditableTextEditorImpl"; import { vscodeOnDidChangeTextDocument } from "./VscodeEvents"; import VscodeGlobalState from "./VscodeGlobalState"; -import { fromVscodeEditor } from "./vscodeIdeUtil"; import VscodeMessages from "./VscodeMessages"; import { vscodeRunMode } from "./VscodeRunMode"; +import { VscodeTextEditorImpl } from "./VscodeTextEditorImpl"; export default class VscodeIDE implements IDE { configuration: VscodeConfiguration; globalState: VscodeGlobalState; messages: VscodeMessages; clipboard: VscodeClipboard; + private editorMap; constructor(private extensionContext: ExtensionContext) { this.configuration = new VscodeConfiguration(this); this.globalState = new VscodeGlobalState(extensionContext); this.messages = new VscodeMessages(); this.clipboard = new VscodeClipboard(); + this.editorMap = new WeakMap(); } get assetsRoot(): string { @@ -44,7 +47,7 @@ export default class VscodeIDE implements IDE { get activeTextEditor(): TextEditor | undefined { return window.activeTextEditor != null - ? fromVscodeEditor(window.activeTextEditor) + ? this.fromVscodeEditor(window.activeTextEditor) : undefined; } @@ -55,7 +58,7 @@ export default class VscodeIDE implements IDE { } get visibleTextEditors(): TextEditor[] { - return window.visibleTextEditors.map(fromVscodeEditor); + return window.visibleTextEditors.map((e) => this.fromVscodeEditor(e)); } public getEditableTextEditor(editor: TextEditor): EditableTextEditor { @@ -68,6 +71,13 @@ export default class VscodeIDE implements IDE { return vscodeOnDidChangeTextDocument(listener); } + public fromVscodeEditor(editor: vscode.TextEditor): TextEditor { + if (!this.editorMap.has(editor)) { + this.editorMap.set(editor, new VscodeTextEditorImpl(editor)); + } + return this.editorMap.get(editor)!; + } + disposeOnExit(...disposables: Disposable[]): () => void { this.extensionContext.subscriptions.push(...disposables); diff --git a/src/ide/vscode/vscodeIdeUtil.ts b/src/ide/vscode/vscodeIdeUtil.ts index a1401f26f5..4885a64274 100644 --- a/src/ide/vscode/vscodeIdeUtil.ts +++ b/src/ide/vscode/vscodeIdeUtil.ts @@ -1,18 +1,8 @@ -import { TextDocument, TextEditor, TextLine } from "@cursorless/common"; +import { TextDocument, TextLine } from "@cursorless/common"; import * as vscode from "vscode"; import { VscodeTextDocumentImpl } from "./VscodeTextDocumentImpl"; -import { VscodeTextEditorImpl } from "./VscodeTextEditorImpl"; import VscodeTextLineImpl from "./VscodeTextLineImpl"; -const editorMap = new WeakMap(); - -export function fromVscodeEditor(editor: vscode.TextEditor): TextEditor { - if (!editorMap.has(editor)) { - editorMap.set(editor, new VscodeTextEditorImpl(editor)); - } - return editorMap.get(editor)!; -} - export function fromVscodeDocument( document: vscode.TextDocument, ): TextDocument { From 9b6598b887486b90a2e3e8e04c16b09963d64199 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 15 Nov 2022 09:08:52 +0100 Subject: [PATCH 50/84] cleanup --- src/libs/common/types/TextDocument.ts | 6 +----- src/util/targetUtils.ts | 4 ++-- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/libs/common/types/TextDocument.ts b/src/libs/common/types/TextDocument.ts index 6901a2fd0d..c33bce0ebd 100644 --- a/src/libs/common/types/TextDocument.ts +++ b/src/libs/common/types/TextDocument.ts @@ -46,8 +46,6 @@ export interface TextDocument { * that the returned object is *not* live and changes to the * document are not reflected. * - * The position will be {@link TextDocument.validatePosition adjusted}. - * * @see {@link TextDocument.lineAt} * * @param position A position. @@ -58,8 +56,6 @@ export interface TextDocument { /** * Converts the position to a zero-based offset. * - * The position will be {@link TextDocument.validatePosition adjusted}. - * * @param position A position. * @return A valid zero-based offset. */ @@ -75,7 +71,7 @@ export interface TextDocument { /** * Get the text of this document. A substring can be retrieved by providing - * a range. The range will be {@link TextDocument.validateRange adjusted}. + * a range. * * @param range Include only the text included by the range. * @return The text inside the provided range or the entire text. diff --git a/src/util/targetUtils.ts b/src/util/targetUtils.ts index 8d69a8e2fa..496a5ad6a7 100644 --- a/src/util/targetUtils.ts +++ b/src/util/targetUtils.ts @@ -54,8 +54,8 @@ function groupForEachEditor( getEditor: (target: T) => TextEditor, ): [TextEditor, T[]][] { // Actually group by document and not editor. If the same document is open in multiple editors we want to perform all actions in one editor or an concurrency error will occur. - const getDocument = (target: T) => getEditor(target).document.uri; - const editorMap = groupBy(targets, getDocument); + const getDocumentUri = (target: T) => getEditor(target).document.uri; + const editorMap = groupBy(targets, getDocumentUri); return Array.from(editorMap.values(), (editorTargets) => { // Just pick any editor with the given document open; doesn't matter which const editor = getEditor(editorTargets[0]); From 4c2ec1cfab8662b4f3c2d3c6a77e321eff7f610a Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 15 Nov 2022 09:47:15 +0100 Subject: [PATCH 51/84] moved get node at location into editor --- src/core/Debug.ts | 10 ++---- src/core/commandRunner/CommandRunner.ts | 1 - src/extension.ts | 5 ++- .../vscode/VscodeEditableTextEditorImpl.ts | 5 +-- src/ide/vscode/VscodeIDE.ts | 22 ++++++++++--- src/ide/vscode/VscodeTextEditorImpl.ts | 18 +++++++++- src/libs/common/index.ts | 1 - src/libs/common/types/Location.ts | 33 ------------------- src/libs/common/types/TextEditor.ts | 9 +++++ .../modifiers/ItemStage/getIterationScope.ts | 28 ++++------------ .../modifiers/SurroundingPairStage.ts | 1 - .../BoundedNonWhitespaceStage.ts | 1 - .../ContainingSyntaxScopeStage.ts | 6 ++-- .../modifiers/surroundingPair/index.ts | 6 ++-- src/typings/Types.ts | 13 +------- 15 files changed, 64 insertions(+), 95 deletions(-) delete mode 100644 src/libs/common/types/Location.ts diff --git a/src/core/Debug.ts b/src/core/Debug.ts index 9fd447a41f..036b96f794 100644 --- a/src/core/Debug.ts +++ b/src/core/Debug.ts @@ -1,4 +1,3 @@ -import { Location } from "@cursorless/common"; import { fromVscodeRange } from "@cursorless/vscode-common"; import { Disposable, @@ -87,14 +86,11 @@ export default class Debug { } private logBranchTypes(event: TextEditorSelectionChangeEvent) { - const location = new Location( - ide().activeTextEditor!.document.uri, - fromVscodeRange(event.selections[0]), - ); - let node: SyntaxNode; try { - node = this.graph.getNodeAtLocation(location); + node = ide().activeTextEditor!.getNodeAtLocation( + fromVscodeRange(event.selections[0]), + ); } catch (error) { return; } diff --git a/src/core/commandRunner/CommandRunner.ts b/src/core/commandRunner/CommandRunner.ts index dcc82a9dea..d61adaa8c4 100644 --- a/src/core/commandRunner/CommandRunner.ts +++ b/src/core/commandRunner/CommandRunner.ts @@ -121,7 +121,6 @@ export default class CommandRunner { hatTokenMap: readableHatMap, thatMark: this.thatMark.exists() ? this.thatMark.get() : [], sourceMark: this.sourceMark.exists() ? this.sourceMark.get() : [], - getNodeAtLocation: this.graph.getNodeAtLocation, }; if (this.graph.testCaseRecorder.isActive()) { diff --git a/src/extension.ts b/src/extension.ts index 8c541993f2..d2064f47a6 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -29,10 +29,10 @@ import makeGraph, { FactoryMap } from "./util/makeGraph"; export async function activate( context: vscode.ExtensionContext, ): Promise { - const { getNodeAtLocation } = await getParseTreeApi(); + const parseTreeApi = await getParseTreeApi(); const commandServerApi = await getCommandServerApi(); - const vscodeIDE = new VscodeIDE(context); + const vscodeIDE = new VscodeIDE(context, parseTreeApi); if (isTesting()) { // FIXME: At some point we'll probably want to support partial mocking @@ -48,7 +48,6 @@ export async function activate( ...graphFactories, extensionContext: () => context, commandServerApi: () => commandServerApi, - getNodeAtLocation: () => getNodeAtLocation, } as FactoryMap); graph.debug.init(); graph.snippets.init(); diff --git a/src/ide/vscode/VscodeEditableTextEditorImpl.ts b/src/ide/vscode/VscodeEditableTextEditorImpl.ts index ff375bdbc3..3280475853 100644 --- a/src/ide/vscode/VscodeEditableTextEditorImpl.ts +++ b/src/ide/vscode/VscodeEditableTextEditorImpl.ts @@ -8,6 +8,7 @@ import type { TextEditorOptions, } from "@cursorless/common"; import { + ParseTreeApi, toVscodePositionOrRange, toVscodeRange, toVscodeSelection, @@ -22,8 +23,8 @@ export class VscodeEditableTextEditorImpl extends VscodeTextEditorImpl implements EditableTextEditor { - constructor(editor: vscode.TextEditor) { - super(editor); + constructor(parseTreeApi: ParseTreeApi, editor: vscode.TextEditor) { + super(parseTreeApi, editor); } get selections(): Selection[] { diff --git a/src/ide/vscode/VscodeIDE.ts b/src/ide/vscode/VscodeIDE.ts index 7831209583..16d409a263 100644 --- a/src/ide/vscode/VscodeIDE.ts +++ b/src/ide/vscode/VscodeIDE.ts @@ -1,5 +1,5 @@ import type { EditableTextEditor, TextEditor } from "@cursorless/common"; -import { toVscodeEditor } from "@cursorless/vscode-common"; +import { ParseTreeApi, toVscodeEditor } from "@cursorless/vscode-common"; import { pull } from "lodash"; import type * as vscode from "vscode"; import { ExtensionContext, window, workspace, WorkspaceFolder } from "vscode"; @@ -25,7 +25,10 @@ export default class VscodeIDE implements IDE { clipboard: VscodeClipboard; private editorMap; - constructor(private extensionContext: ExtensionContext) { + constructor( + private extensionContext: ExtensionContext, + private parseTreeApi: ParseTreeApi, + ) { this.configuration = new VscodeConfiguration(this); this.globalState = new VscodeGlobalState(extensionContext); this.messages = new VscodeMessages(); @@ -53,7 +56,10 @@ export default class VscodeIDE implements IDE { get activeEditableTextEditor(): EditableTextEditor | undefined { return window.activeTextEditor != null - ? new VscodeEditableTextEditorImpl(window.activeTextEditor) + ? new VscodeEditableTextEditorImpl( + this.parseTreeApi, + window.activeTextEditor, + ) : undefined; } @@ -62,7 +68,10 @@ export default class VscodeIDE implements IDE { } public getEditableTextEditor(editor: TextEditor): EditableTextEditor { - return new VscodeEditableTextEditorImpl(toVscodeEditor(editor)); + return new VscodeEditableTextEditorImpl( + this.parseTreeApi, + toVscodeEditor(editor), + ); } public onDidChangeTextDocument( @@ -73,7 +82,10 @@ export default class VscodeIDE implements IDE { public fromVscodeEditor(editor: vscode.TextEditor): TextEditor { if (!this.editorMap.has(editor)) { - this.editorMap.set(editor, new VscodeTextEditorImpl(editor)); + this.editorMap.set( + editor, + new VscodeTextEditorImpl(this.parseTreeApi, editor), + ); } return this.editorMap.get(editor)!; } diff --git a/src/ide/vscode/VscodeTextEditorImpl.ts b/src/ide/vscode/VscodeTextEditorImpl.ts index 85d48785df..58118a5cd3 100644 --- a/src/ide/vscode/VscodeTextEditorImpl.ts +++ b/src/ide/vscode/VscodeTextEditorImpl.ts @@ -1,4 +1,5 @@ import type { + Position, Range, Selection, TextDocument, @@ -8,16 +9,22 @@ import type { import { fromVscodeRange, fromVscodeSelection, + ParseTreeApi, + toVscodePositionOrRange, } from "@cursorless/vscode-common"; import { v4 as uuid } from "uuid"; import * as vscode from "vscode"; +import { SyntaxNode } from "web-tree-sitter"; import { fromVscodeDocument } from "./vscodeIdeUtil"; export class VscodeTextEditorImpl implements TextEditor { readonly id: string; readonly document: TextDocument; - constructor(protected editor: vscode.TextEditor) { + constructor( + protected parseTreeApi: ParseTreeApi, + protected editor: vscode.TextEditor, + ) { this.id = uuid(); this.document = fromVscodeDocument(editor.document); } @@ -42,6 +49,15 @@ export class VscodeTextEditorImpl implements TextEditor { return this.editor === vscode.window.activeTextEditor; } + public getNodeAtLocation(positionOrRange: Position | Range): SyntaxNode { + return this.parseTreeApi.getNodeAtLocation( + new vscode.Location( + this.document.uri, + toVscodePositionOrRange(positionOrRange), + ), + ); + } + public isEqual(other: TextEditor): boolean { return this.id === other.id; } diff --git a/src/libs/common/index.ts b/src/libs/common/index.ts index 20cf4673a3..47ad83280b 100644 --- a/src/libs/common/index.ts +++ b/src/libs/common/index.ts @@ -17,7 +17,6 @@ export { walkFilesSync } from "./util/walkSync"; export { Listener, Notifier } from "./util/Notifier"; export { TokenHatSplittingMode } from "./ide/types/Configuration"; export * from "./ide/types/ide.types"; -export * from "./types/Location"; export * from "./types/Position"; export * from "./types/Range"; export * from "./types/Selection"; diff --git a/src/libs/common/types/Location.ts b/src/libs/common/types/Location.ts deleted file mode 100644 index ed95ea6047..0000000000 --- a/src/libs/common/types/Location.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { URI } from "vscode-uri"; -import type { Position } from "@cursorless/common"; -import { Range } from "@cursorless/common"; - -/** - * Represents a location inside a resource, such as a line - * inside a text file. - */ -export class Location { - /** - * The resource identifier of this location. - */ - readonly uri: URI; - - /** - * The document range of this location. - */ - readonly range: Range; - - /** - * Creates a new location object. - * - * @param uri The resource identifier. - * @param rangeOrPosition The range or position. Positions will be converted to an empty range. - */ - constructor(uri: URI, rangeOrPosition: Range | Position) { - this.uri = uri; - this.range = - "start" in rangeOrPosition - ? rangeOrPosition - : new Range(rangeOrPosition, rangeOrPosition); - } -} diff --git a/src/libs/common/types/TextEditor.ts b/src/libs/common/types/TextEditor.ts index f72df42541..0aa4cd8d46 100644 --- a/src/libs/common/types/TextEditor.ts +++ b/src/libs/common/types/TextEditor.ts @@ -7,6 +7,7 @@ import type { TextEditorEdit, TextEditorOptions, } from "@cursorless/common"; +import type { SyntaxNode } from "web-tree-sitter"; export interface TextEditor { /** @@ -47,6 +48,14 @@ export interface TextEditor { * @return `true` if the this text editor is equal to `other`. */ isEqual(other: TextEditor): boolean; + + /** + * Function to access nodes in the tree sitter. + * + * @param positionOrRange The position or range. Positions will be converted to an empty range. + * @returns A {@link SyntaxNode node} + */ + getNodeAtLocation(positionOrRange: Position | Range): SyntaxNode; } export interface EditableTextEditor extends TextEditor { diff --git a/src/processTargets/modifiers/ItemStage/getIterationScope.ts b/src/processTargets/modifiers/ItemStage/getIterationScope.ts index e0d1831fad..462ce3d7c0 100644 --- a/src/processTargets/modifiers/ItemStage/getIterationScope.ts +++ b/src/processTargets/modifiers/ItemStage/getIterationScope.ts @@ -16,16 +16,11 @@ export function getIterationScope( context: ProcessedTargetsContext, target: Target, ): { range: Range; boundary?: [Range, Range] } { - let pairInfo = getSurroundingPair( - context, - target.editor, - target.contentRange, - ); + let pairInfo = getSurroundingPair(target.editor, target.contentRange); // Iteration is necessary in case of nested strings while (pairInfo != null) { const stringPairInfo = getStringSurroundingPair( - context, target.editor, pairInfo.contentRange, ); @@ -43,7 +38,7 @@ export function getIterationScope( }; } - pairInfo = getParentSurroundingPair(context, target.editor, pairInfo); + pairInfo = getParentSurroundingPair(target.editor, pairInfo); } // We have not found a surrounding pair. Use the line. @@ -53,7 +48,6 @@ export function getIterationScope( } function getParentSurroundingPair( - context: ProcessedTargetsContext, editor: TextEditor, pairInfo: SurroundingPairInfo, ) { @@ -64,27 +58,19 @@ function getParentSurroundingPair( } // Step out of this pair and see if we have a parent const position = editor.document.positionAt(startOffset - 1); - return getSurroundingPair(context, editor, new Range(position, position)); + return getSurroundingPair(editor, new Range(position, position)); } -function getSurroundingPair( - context: ProcessedTargetsContext, - editor: TextEditor, - contentRange: Range, -) { - return processSurroundingPair(context, editor, contentRange, { +function getSurroundingPair(editor: TextEditor, contentRange: Range) { + return processSurroundingPair(editor, contentRange, { type: "surroundingPair", delimiter: "collectionBoundary", requireStrongContainment: true, }); } -function getStringSurroundingPair( - context: ProcessedTargetsContext, - editor: TextEditor, - contentRange: Range, -) { - return processSurroundingPair(context, editor, contentRange, { +function getStringSurroundingPair(editor: TextEditor, contentRange: Range) { + return processSurroundingPair(editor, contentRange, { type: "surroundingPair", delimiter: "string", requireStrongContainment: true, diff --git a/src/processTargets/modifiers/SurroundingPairStage.ts b/src/processTargets/modifiers/SurroundingPairStage.ts index 294799db4d..c752aacf15 100644 --- a/src/processTargets/modifiers/SurroundingPairStage.ts +++ b/src/processTargets/modifiers/SurroundingPairStage.ts @@ -42,7 +42,6 @@ function processedSurroundingPairTarget( target: Target, ): SurroundingPairTarget[] { const pairInfo = processSurroundingPair( - context, target.editor, target.contentRange, modifier.scopeType, diff --git a/src/processTargets/modifiers/scopeTypeStages/BoundedNonWhitespaceStage.ts b/src/processTargets/modifiers/scopeTypeStages/BoundedNonWhitespaceStage.ts index 70cd95d1d8..cd3787c15a 100644 --- a/src/processTargets/modifiers/scopeTypeStages/BoundedNonWhitespaceStage.ts +++ b/src/processTargets/modifiers/scopeTypeStages/BoundedNonWhitespaceStage.ts @@ -29,7 +29,6 @@ export default class BoundedNonWhitespaceSequenceStage const paintTargets = paintStage.run(context, target); const pairInfo = processSurroundingPair( - context, target.editor, target.contentRange, { diff --git a/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts b/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts index 698aa3489d..2aabfa64fc 100644 --- a/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts +++ b/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts @@ -1,4 +1,4 @@ -import { Location, Selection } from "@cursorless/common"; +import { Selection } from "@cursorless/common"; import type { SyntaxNode } from "web-tree-sitter"; import { NoContainingScopeError } from "../../../errors"; import { getNodeMatcher } from "../../../languages/getNodeMatcher"; @@ -38,8 +38,8 @@ export default class implements ModifierStage { this.modifier.type === "everyScope", ); - const node: SyntaxNode | null = context.getNodeAtLocation( - new Location(target.editor.document.uri, target.contentRange), + const node: SyntaxNode | null = target.editor.getNodeAtLocation( + target.contentRange, ); const scopeNodes = findNearestContainingAncestorNode(node, nodeMatcher, { diff --git a/src/processTargets/modifiers/surroundingPair/index.ts b/src/processTargets/modifiers/surroundingPair/index.ts index 48986850f8..0beef96f66 100644 --- a/src/processTargets/modifiers/surroundingPair/index.ts +++ b/src/processTargets/modifiers/surroundingPair/index.ts @@ -1,4 +1,4 @@ -import { Location, Range, Selection, TextEditor } from "@cursorless/common"; +import { Range, Selection, TextEditor } from "@cursorless/common"; import { SyntaxNode } from "web-tree-sitter"; import getTextFragmentExtractor, { TextFragmentExtractor, @@ -7,7 +7,6 @@ import { ComplexSurroundingPairName, SurroundingPairScopeType, } from "../../../typings/targetDescriptor.types"; -import { ProcessedTargetsContext } from "../../../typings/Types"; import { complexDelimiterMap } from "./delimiterMaps"; import { SurroundingPairInfo } from "./extractSelectionFromSurroundingPairOffsets"; import { findSurroundingPairParseTreeBased } from "./findSurroundingPairParseTreeBased"; @@ -28,7 +27,6 @@ import { findSurroundingPairTextBased } from "./findSurroundingPairTextBased"; * `null` if none was found */ export function processSurroundingPair( - context: ProcessedTargetsContext, editor: TextEditor, range: Range, scopeType: SurroundingPairScopeType, @@ -42,7 +40,7 @@ export function processSurroundingPair( let textFragmentExtractor: TextFragmentExtractor; try { - node = context.getNodeAtLocation(new Location(document.uri, range)); + node = editor.getNodeAtLocation(range); textFragmentExtractor = getTextFragmentExtractor(document.languageId); } catch (err) { diff --git a/src/typings/Types.ts b/src/typings/Types.ts index d1ea9514dd..3ce37338a9 100644 --- a/src/typings/Types.ts +++ b/src/typings/Types.ts @@ -1,9 +1,4 @@ -import type { - Location, - Range, - Selection, - TextEditor, -} from "@cursorless/common"; +import type { Range, Selection, TextEditor } from "@cursorless/common"; import { SyntaxNode } from "web-tree-sitter"; import { ActionRecord } from "../actions/actions.types"; import Cheatsheet from "../core/Cheatsheet"; @@ -46,7 +41,6 @@ export interface ProcessedTargetsContext { hatTokenMap: ReadOnlyHatMap; thatMark: Target[]; sourceMark: Target[]; - getNodeAtLocation: (location: Location) => SyntaxNode; } export interface SelectionWithEditor { @@ -137,11 +131,6 @@ export interface Graph { */ readonly commandServerApi: CommandServerApi | null; - /** - * Function to access nodes in the tree sitter. - */ - readonly getNodeAtLocation: (location: Location) => SyntaxNode; - /** * Debug logger */ From d829853e59992324cbc4419bdd81a09d96942d03 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 15 Nov 2022 10:21:25 +0100 Subject: [PATCH 52/84] empty From b9b78c78dab9c180373ba1f0a242443945cb7506 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 15 Nov 2022 14:29:44 +0100 Subject: [PATCH 53/84] remove spread --- src/ide/vscode/VscodeEvents.ts | 4 +++- src/libs/common/ide/types/Events.ts | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ide/vscode/VscodeEvents.ts b/src/ide/vscode/VscodeEvents.ts index a87e131c0b..e6ee361ce1 100644 --- a/src/ide/vscode/VscodeEvents.ts +++ b/src/ide/vscode/VscodeEvents.ts @@ -24,8 +24,10 @@ function fromVscodeContentChange( change: vscode.TextDocumentContentChangeEvent, ): TextDocumentContentChangeEvent { return { - ...change, range: fromVscodeRange(change.range), + rangeOffset: change.rangeOffset, + rangeLength: change.rangeLength, + text: change.text, }; } diff --git a/src/libs/common/ide/types/Events.ts b/src/libs/common/ide/types/Events.ts index 6057b03990..4d80d968db 100644 --- a/src/libs/common/ide/types/Events.ts +++ b/src/libs/common/ide/types/Events.ts @@ -29,14 +29,17 @@ export interface TextDocumentContentChangeEvent { * The range that got replaced. */ readonly range: Range; + /** * The offset of the range that got replaced. */ readonly rangeOffset: number; + /** * The length of the range that got replaced. */ readonly rangeLength: number; + /** * The new text for the range. */ From fb2d25b72b51b71291d6e69616b8362f47115f09 Mon Sep 17 00:00:00 2001 From: Pokey Rule <755842+pokey@users.noreply.github.com> Date: Tue, 15 Nov 2022 13:41:37 +0000 Subject: [PATCH 54/84] Add license reference --- src/libs/common/ide/types/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/libs/common/ide/types/README.md diff --git a/src/libs/common/ide/types/README.md b/src/libs/common/ide/types/README.md new file mode 100644 index 0000000000..f22064f35a --- /dev/null +++ b/src/libs/common/ide/types/README.md @@ -0,0 +1,3 @@ +# Core IDE types + +This directory contains the core IDE types use throughout the cursorless code base. Knows that a lot of the types as well as their JSDocs were taken and modified from the core vscode types, which are available under the [MIT license](https://github.com/microsoft/vscode/blob/main/LICENSE.txt). From 3cb92b667bfcc3d0086f16520ce6cd02a29bfc36 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 15 Nov 2022 19:17:57 +0100 Subject: [PATCH 55/84] use full vscode implementation --- src/ide/vscode/VscodeFocusEditor.ts | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/ide/vscode/VscodeFocusEditor.ts b/src/ide/vscode/VscodeFocusEditor.ts index 7f0ca568c5..143741171b 100644 --- a/src/ide/vscode/VscodeFocusEditor.ts +++ b/src/ide/vscode/VscodeFocusEditor.ts @@ -13,6 +13,7 @@ import { focusNotebookCellLegacy, isVscodeLegacyNotebookVersion, } from "../../util/notebookLegacy"; +import { VscodeTextEditorImpl } from "./VscodeTextEditorImpl"; const columnFocusCommands = { [ViewColumn.One]: "workbench.action.focusFirstEditorGroup", @@ -28,8 +29,8 @@ const columnFocusCommands = { [ViewColumn.Beside]: "", }; -export default async function focusVscodeEditor(editor: TextEditor) { - const viewColumn = getViewColumn(editor); +export default async function focusVscodeEditor(editor: VscodeTextEditorImpl) { + const viewColumn = getViewColumn(editor.vscodeEditor); if (viewColumn != null) { await commands.executeCommand(columnFocusCommands[viewColumn]); } else { @@ -37,7 +38,7 @@ export default async function focusVscodeEditor(editor: TextEditor) { // can just move around in the notebook to focus the correct editor if (isVscodeLegacyNotebookVersion()) { - return await focusNotebookCellLegacy(editor); + return await focusNotebookCellLegacy(editor.vscodeEditor); } await focusNotebookCell(editor); @@ -60,8 +61,10 @@ function getViewColumn(editor: TextEditor): ViewColumn | undefined { return tabGroup?.viewColumn; } -async function focusNotebookCell(editor: TextEditor) { - const desiredNotebookEditor = getNotebookFromCellDocument(editor.document); +async function focusNotebookCell(editor: VscodeTextEditorImpl) { + const desiredNotebookEditor = getNotebookFromCellDocument( + editor.vscodeEditor.document, + ); if (desiredNotebookEditor == null) { throw new Error("Couldn't find notebook editor for given document"); } @@ -77,7 +80,7 @@ async function focusNotebookCell(editor: TextEditor) { const desiredEditorIndex = getCellIndex( desiredNotebookDocument, - editor.document, + editor.vscodeEditor.document, ); const desiredSelections = [ @@ -92,7 +95,7 @@ async function focusNotebookCell(editor: TextEditor) { // Issue a command to tell VSCode to focus the cell input editor // NB: We don't issue the command if it's already focused, because it turns // out that this command is actually a toggle, so that causes it to de-focus! - if (editor !== window.activeTextEditor) { + if (!editor.isActive) { await commands.executeCommand("notebook.cell.edit"); } } From 3392546955cb73907b4ef227057ab0466c1eeba4 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 15 Nov 2022 19:32:38 +0100 Subject: [PATCH 56/84] Revert "moved get node at location into editor" This reverts commit 4c2ec1cfab8662b4f3c2d3c6a77e321eff7f610a. --- src/core/Debug.ts | 10 ++++-- src/core/commandRunner/CommandRunner.ts | 1 + src/extension.ts | 5 +-- .../vscode/VscodeEditableTextEditorImpl.ts | 5 ++- src/ide/vscode/VscodeIDE.ts | 22 +++---------- src/ide/vscode/VscodeTextEditorImpl.ts | 18 +--------- src/libs/common/index.ts | 1 + src/libs/common/types/Location.ts | 33 +++++++++++++++++++ src/libs/common/types/TextEditor.ts | 9 ----- .../modifiers/ItemStage/getIterationScope.ts | 28 ++++++++++++---- .../modifiers/SurroundingPairStage.ts | 1 + .../BoundedNonWhitespaceStage.ts | 1 + .../ContainingSyntaxScopeStage.ts | 6 ++-- .../modifiers/surroundingPair/index.ts | 6 ++-- src/typings/Types.ts | 13 +++++++- 15 files changed, 95 insertions(+), 64 deletions(-) create mode 100644 src/libs/common/types/Location.ts diff --git a/src/core/Debug.ts b/src/core/Debug.ts index 036b96f794..9fd447a41f 100644 --- a/src/core/Debug.ts +++ b/src/core/Debug.ts @@ -1,3 +1,4 @@ +import { Location } from "@cursorless/common"; import { fromVscodeRange } from "@cursorless/vscode-common"; import { Disposable, @@ -86,11 +87,14 @@ export default class Debug { } private logBranchTypes(event: TextEditorSelectionChangeEvent) { + const location = new Location( + ide().activeTextEditor!.document.uri, + fromVscodeRange(event.selections[0]), + ); + let node: SyntaxNode; try { - node = ide().activeTextEditor!.getNodeAtLocation( - fromVscodeRange(event.selections[0]), - ); + node = this.graph.getNodeAtLocation(location); } catch (error) { return; } diff --git a/src/core/commandRunner/CommandRunner.ts b/src/core/commandRunner/CommandRunner.ts index d61adaa8c4..dcc82a9dea 100644 --- a/src/core/commandRunner/CommandRunner.ts +++ b/src/core/commandRunner/CommandRunner.ts @@ -121,6 +121,7 @@ export default class CommandRunner { hatTokenMap: readableHatMap, thatMark: this.thatMark.exists() ? this.thatMark.get() : [], sourceMark: this.sourceMark.exists() ? this.sourceMark.get() : [], + getNodeAtLocation: this.graph.getNodeAtLocation, }; if (this.graph.testCaseRecorder.isActive()) { diff --git a/src/extension.ts b/src/extension.ts index d2064f47a6..8c541993f2 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -29,10 +29,10 @@ import makeGraph, { FactoryMap } from "./util/makeGraph"; export async function activate( context: vscode.ExtensionContext, ): Promise { - const parseTreeApi = await getParseTreeApi(); + const { getNodeAtLocation } = await getParseTreeApi(); const commandServerApi = await getCommandServerApi(); - const vscodeIDE = new VscodeIDE(context, parseTreeApi); + const vscodeIDE = new VscodeIDE(context); if (isTesting()) { // FIXME: At some point we'll probably want to support partial mocking @@ -48,6 +48,7 @@ export async function activate( ...graphFactories, extensionContext: () => context, commandServerApi: () => commandServerApi, + getNodeAtLocation: () => getNodeAtLocation, } as FactoryMap); graph.debug.init(); graph.snippets.init(); diff --git a/src/ide/vscode/VscodeEditableTextEditorImpl.ts b/src/ide/vscode/VscodeEditableTextEditorImpl.ts index 3280475853..ff375bdbc3 100644 --- a/src/ide/vscode/VscodeEditableTextEditorImpl.ts +++ b/src/ide/vscode/VscodeEditableTextEditorImpl.ts @@ -8,7 +8,6 @@ import type { TextEditorOptions, } from "@cursorless/common"; import { - ParseTreeApi, toVscodePositionOrRange, toVscodeRange, toVscodeSelection, @@ -23,8 +22,8 @@ export class VscodeEditableTextEditorImpl extends VscodeTextEditorImpl implements EditableTextEditor { - constructor(parseTreeApi: ParseTreeApi, editor: vscode.TextEditor) { - super(parseTreeApi, editor); + constructor(editor: vscode.TextEditor) { + super(editor); } get selections(): Selection[] { diff --git a/src/ide/vscode/VscodeIDE.ts b/src/ide/vscode/VscodeIDE.ts index 16d409a263..7831209583 100644 --- a/src/ide/vscode/VscodeIDE.ts +++ b/src/ide/vscode/VscodeIDE.ts @@ -1,5 +1,5 @@ import type { EditableTextEditor, TextEditor } from "@cursorless/common"; -import { ParseTreeApi, toVscodeEditor } from "@cursorless/vscode-common"; +import { toVscodeEditor } from "@cursorless/vscode-common"; import { pull } from "lodash"; import type * as vscode from "vscode"; import { ExtensionContext, window, workspace, WorkspaceFolder } from "vscode"; @@ -25,10 +25,7 @@ export default class VscodeIDE implements IDE { clipboard: VscodeClipboard; private editorMap; - constructor( - private extensionContext: ExtensionContext, - private parseTreeApi: ParseTreeApi, - ) { + constructor(private extensionContext: ExtensionContext) { this.configuration = new VscodeConfiguration(this); this.globalState = new VscodeGlobalState(extensionContext); this.messages = new VscodeMessages(); @@ -56,10 +53,7 @@ export default class VscodeIDE implements IDE { get activeEditableTextEditor(): EditableTextEditor | undefined { return window.activeTextEditor != null - ? new VscodeEditableTextEditorImpl( - this.parseTreeApi, - window.activeTextEditor, - ) + ? new VscodeEditableTextEditorImpl(window.activeTextEditor) : undefined; } @@ -68,10 +62,7 @@ export default class VscodeIDE implements IDE { } public getEditableTextEditor(editor: TextEditor): EditableTextEditor { - return new VscodeEditableTextEditorImpl( - this.parseTreeApi, - toVscodeEditor(editor), - ); + return new VscodeEditableTextEditorImpl(toVscodeEditor(editor)); } public onDidChangeTextDocument( @@ -82,10 +73,7 @@ export default class VscodeIDE implements IDE { public fromVscodeEditor(editor: vscode.TextEditor): TextEditor { if (!this.editorMap.has(editor)) { - this.editorMap.set( - editor, - new VscodeTextEditorImpl(this.parseTreeApi, editor), - ); + this.editorMap.set(editor, new VscodeTextEditorImpl(editor)); } return this.editorMap.get(editor)!; } diff --git a/src/ide/vscode/VscodeTextEditorImpl.ts b/src/ide/vscode/VscodeTextEditorImpl.ts index 58118a5cd3..85d48785df 100644 --- a/src/ide/vscode/VscodeTextEditorImpl.ts +++ b/src/ide/vscode/VscodeTextEditorImpl.ts @@ -1,5 +1,4 @@ import type { - Position, Range, Selection, TextDocument, @@ -9,22 +8,16 @@ import type { import { fromVscodeRange, fromVscodeSelection, - ParseTreeApi, - toVscodePositionOrRange, } from "@cursorless/vscode-common"; import { v4 as uuid } from "uuid"; import * as vscode from "vscode"; -import { SyntaxNode } from "web-tree-sitter"; import { fromVscodeDocument } from "./vscodeIdeUtil"; export class VscodeTextEditorImpl implements TextEditor { readonly id: string; readonly document: TextDocument; - constructor( - protected parseTreeApi: ParseTreeApi, - protected editor: vscode.TextEditor, - ) { + constructor(protected editor: vscode.TextEditor) { this.id = uuid(); this.document = fromVscodeDocument(editor.document); } @@ -49,15 +42,6 @@ export class VscodeTextEditorImpl implements TextEditor { return this.editor === vscode.window.activeTextEditor; } - public getNodeAtLocation(positionOrRange: Position | Range): SyntaxNode { - return this.parseTreeApi.getNodeAtLocation( - new vscode.Location( - this.document.uri, - toVscodePositionOrRange(positionOrRange), - ), - ); - } - public isEqual(other: TextEditor): boolean { return this.id === other.id; } diff --git a/src/libs/common/index.ts b/src/libs/common/index.ts index 47ad83280b..20cf4673a3 100644 --- a/src/libs/common/index.ts +++ b/src/libs/common/index.ts @@ -17,6 +17,7 @@ export { walkFilesSync } from "./util/walkSync"; export { Listener, Notifier } from "./util/Notifier"; export { TokenHatSplittingMode } from "./ide/types/Configuration"; export * from "./ide/types/ide.types"; +export * from "./types/Location"; export * from "./types/Position"; export * from "./types/Range"; export * from "./types/Selection"; diff --git a/src/libs/common/types/Location.ts b/src/libs/common/types/Location.ts new file mode 100644 index 0000000000..ed95ea6047 --- /dev/null +++ b/src/libs/common/types/Location.ts @@ -0,0 +1,33 @@ +import type { URI } from "vscode-uri"; +import type { Position } from "@cursorless/common"; +import { Range } from "@cursorless/common"; + +/** + * Represents a location inside a resource, such as a line + * inside a text file. + */ +export class Location { + /** + * The resource identifier of this location. + */ + readonly uri: URI; + + /** + * The document range of this location. + */ + readonly range: Range; + + /** + * Creates a new location object. + * + * @param uri The resource identifier. + * @param rangeOrPosition The range or position. Positions will be converted to an empty range. + */ + constructor(uri: URI, rangeOrPosition: Range | Position) { + this.uri = uri; + this.range = + "start" in rangeOrPosition + ? rangeOrPosition + : new Range(rangeOrPosition, rangeOrPosition); + } +} diff --git a/src/libs/common/types/TextEditor.ts b/src/libs/common/types/TextEditor.ts index 0aa4cd8d46..f72df42541 100644 --- a/src/libs/common/types/TextEditor.ts +++ b/src/libs/common/types/TextEditor.ts @@ -7,7 +7,6 @@ import type { TextEditorEdit, TextEditorOptions, } from "@cursorless/common"; -import type { SyntaxNode } from "web-tree-sitter"; export interface TextEditor { /** @@ -48,14 +47,6 @@ export interface TextEditor { * @return `true` if the this text editor is equal to `other`. */ isEqual(other: TextEditor): boolean; - - /** - * Function to access nodes in the tree sitter. - * - * @param positionOrRange The position or range. Positions will be converted to an empty range. - * @returns A {@link SyntaxNode node} - */ - getNodeAtLocation(positionOrRange: Position | Range): SyntaxNode; } export interface EditableTextEditor extends TextEditor { diff --git a/src/processTargets/modifiers/ItemStage/getIterationScope.ts b/src/processTargets/modifiers/ItemStage/getIterationScope.ts index 462ce3d7c0..e0d1831fad 100644 --- a/src/processTargets/modifiers/ItemStage/getIterationScope.ts +++ b/src/processTargets/modifiers/ItemStage/getIterationScope.ts @@ -16,11 +16,16 @@ export function getIterationScope( context: ProcessedTargetsContext, target: Target, ): { range: Range; boundary?: [Range, Range] } { - let pairInfo = getSurroundingPair(target.editor, target.contentRange); + let pairInfo = getSurroundingPair( + context, + target.editor, + target.contentRange, + ); // Iteration is necessary in case of nested strings while (pairInfo != null) { const stringPairInfo = getStringSurroundingPair( + context, target.editor, pairInfo.contentRange, ); @@ -38,7 +43,7 @@ export function getIterationScope( }; } - pairInfo = getParentSurroundingPair(target.editor, pairInfo); + pairInfo = getParentSurroundingPair(context, target.editor, pairInfo); } // We have not found a surrounding pair. Use the line. @@ -48,6 +53,7 @@ export function getIterationScope( } function getParentSurroundingPair( + context: ProcessedTargetsContext, editor: TextEditor, pairInfo: SurroundingPairInfo, ) { @@ -58,19 +64,27 @@ function getParentSurroundingPair( } // Step out of this pair and see if we have a parent const position = editor.document.positionAt(startOffset - 1); - return getSurroundingPair(editor, new Range(position, position)); + return getSurroundingPair(context, editor, new Range(position, position)); } -function getSurroundingPair(editor: TextEditor, contentRange: Range) { - return processSurroundingPair(editor, contentRange, { +function getSurroundingPair( + context: ProcessedTargetsContext, + editor: TextEditor, + contentRange: Range, +) { + return processSurroundingPair(context, editor, contentRange, { type: "surroundingPair", delimiter: "collectionBoundary", requireStrongContainment: true, }); } -function getStringSurroundingPair(editor: TextEditor, contentRange: Range) { - return processSurroundingPair(editor, contentRange, { +function getStringSurroundingPair( + context: ProcessedTargetsContext, + editor: TextEditor, + contentRange: Range, +) { + return processSurroundingPair(context, editor, contentRange, { type: "surroundingPair", delimiter: "string", requireStrongContainment: true, diff --git a/src/processTargets/modifiers/SurroundingPairStage.ts b/src/processTargets/modifiers/SurroundingPairStage.ts index c752aacf15..294799db4d 100644 --- a/src/processTargets/modifiers/SurroundingPairStage.ts +++ b/src/processTargets/modifiers/SurroundingPairStage.ts @@ -42,6 +42,7 @@ function processedSurroundingPairTarget( target: Target, ): SurroundingPairTarget[] { const pairInfo = processSurroundingPair( + context, target.editor, target.contentRange, modifier.scopeType, diff --git a/src/processTargets/modifiers/scopeTypeStages/BoundedNonWhitespaceStage.ts b/src/processTargets/modifiers/scopeTypeStages/BoundedNonWhitespaceStage.ts index cd3787c15a..70cd95d1d8 100644 --- a/src/processTargets/modifiers/scopeTypeStages/BoundedNonWhitespaceStage.ts +++ b/src/processTargets/modifiers/scopeTypeStages/BoundedNonWhitespaceStage.ts @@ -29,6 +29,7 @@ export default class BoundedNonWhitespaceSequenceStage const paintTargets = paintStage.run(context, target); const pairInfo = processSurroundingPair( + context, target.editor, target.contentRange, { diff --git a/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts b/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts index 2aabfa64fc..698aa3489d 100644 --- a/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts +++ b/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts @@ -1,4 +1,4 @@ -import { Selection } from "@cursorless/common"; +import { Location, Selection } from "@cursorless/common"; import type { SyntaxNode } from "web-tree-sitter"; import { NoContainingScopeError } from "../../../errors"; import { getNodeMatcher } from "../../../languages/getNodeMatcher"; @@ -38,8 +38,8 @@ export default class implements ModifierStage { this.modifier.type === "everyScope", ); - const node: SyntaxNode | null = target.editor.getNodeAtLocation( - target.contentRange, + const node: SyntaxNode | null = context.getNodeAtLocation( + new Location(target.editor.document.uri, target.contentRange), ); const scopeNodes = findNearestContainingAncestorNode(node, nodeMatcher, { diff --git a/src/processTargets/modifiers/surroundingPair/index.ts b/src/processTargets/modifiers/surroundingPair/index.ts index 0beef96f66..48986850f8 100644 --- a/src/processTargets/modifiers/surroundingPair/index.ts +++ b/src/processTargets/modifiers/surroundingPair/index.ts @@ -1,4 +1,4 @@ -import { Range, Selection, TextEditor } from "@cursorless/common"; +import { Location, Range, Selection, TextEditor } from "@cursorless/common"; import { SyntaxNode } from "web-tree-sitter"; import getTextFragmentExtractor, { TextFragmentExtractor, @@ -7,6 +7,7 @@ import { ComplexSurroundingPairName, SurroundingPairScopeType, } from "../../../typings/targetDescriptor.types"; +import { ProcessedTargetsContext } from "../../../typings/Types"; import { complexDelimiterMap } from "./delimiterMaps"; import { SurroundingPairInfo } from "./extractSelectionFromSurroundingPairOffsets"; import { findSurroundingPairParseTreeBased } from "./findSurroundingPairParseTreeBased"; @@ -27,6 +28,7 @@ import { findSurroundingPairTextBased } from "./findSurroundingPairTextBased"; * `null` if none was found */ export function processSurroundingPair( + context: ProcessedTargetsContext, editor: TextEditor, range: Range, scopeType: SurroundingPairScopeType, @@ -40,7 +42,7 @@ export function processSurroundingPair( let textFragmentExtractor: TextFragmentExtractor; try { - node = editor.getNodeAtLocation(range); + node = context.getNodeAtLocation(new Location(document.uri, range)); textFragmentExtractor = getTextFragmentExtractor(document.languageId); } catch (err) { diff --git a/src/typings/Types.ts b/src/typings/Types.ts index 3ce37338a9..d1ea9514dd 100644 --- a/src/typings/Types.ts +++ b/src/typings/Types.ts @@ -1,4 +1,9 @@ -import type { Range, Selection, TextEditor } from "@cursorless/common"; +import type { + Location, + Range, + Selection, + TextEditor, +} from "@cursorless/common"; import { SyntaxNode } from "web-tree-sitter"; import { ActionRecord } from "../actions/actions.types"; import Cheatsheet from "../core/Cheatsheet"; @@ -41,6 +46,7 @@ export interface ProcessedTargetsContext { hatTokenMap: ReadOnlyHatMap; thatMark: Target[]; sourceMark: Target[]; + getNodeAtLocation: (location: Location) => SyntaxNode; } export interface SelectionWithEditor { @@ -131,6 +137,11 @@ export interface Graph { */ readonly commandServerApi: CommandServerApi | null; + /** + * Function to access nodes in the tree sitter. + */ + readonly getNodeAtLocation: (location: Location) => SyntaxNode; + /** * Debug logger */ From 9e8d26da76c2cb10a1b6a01c07846d4d5ecdf8b3 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 15 Nov 2022 19:43:23 +0100 Subject: [PATCH 57/84] remove location type --- src/core/Debug.ts | 11 +++---- src/extension.ts | 10 +++++- .../vscode/VscodeEditableTextEditorImpl.ts | 2 +- src/libs/common/index.ts | 1 - src/libs/common/types/Location.ts | 33 ------------------- .../ContainingSyntaxScopeStage.ts | 5 +-- .../modifiers/surroundingPair/index.ts | 4 +-- src/typings/Types.ts | 11 ++----- 8 files changed, 22 insertions(+), 55 deletions(-) delete mode 100644 src/libs/common/types/Location.ts diff --git a/src/core/Debug.ts b/src/core/Debug.ts index 9fd447a41f..de6f55d8fb 100644 --- a/src/core/Debug.ts +++ b/src/core/Debug.ts @@ -1,4 +1,3 @@ -import { Location } from "@cursorless/common"; import { fromVscodeRange } from "@cursorless/vscode-common"; import { Disposable, @@ -87,14 +86,12 @@ export default class Debug { } private logBranchTypes(event: TextEditorSelectionChangeEvent) { - const location = new Location( - ide().activeTextEditor!.document.uri, - fromVscodeRange(event.selections[0]), - ); - let node: SyntaxNode; try { - node = this.graph.getNodeAtLocation(location); + node = this.graph.getNodeAtLocation( + ide().activeTextEditor!, + fromVscodeRange(event.selections[0]), + ); } catch (error) { return; } diff --git a/src/extension.ts b/src/extension.ts index 8c541993f2..a774914387 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,3 +1,5 @@ +import { Range, TextEditor } from "@cursorless/common"; +import { toVscodeRange } from "@cursorless/vscode-common"; import * as vscode from "vscode"; import CommandRunner from "./core/commandRunner/CommandRunner"; import { ThatMark } from "./core/ThatMark"; @@ -29,7 +31,7 @@ import makeGraph, { FactoryMap } from "./util/makeGraph"; export async function activate( context: vscode.ExtensionContext, ): Promise { - const { getNodeAtLocation } = await getParseTreeApi(); + const parseTreeApi = await getParseTreeApi(); const commandServerApi = await getCommandServerApi(); const vscodeIDE = new VscodeIDE(context); @@ -44,6 +46,12 @@ export async function activate( injectIde(vscodeIDE); } + const getNodeAtLocation = (editor: TextEditor, range: Range) => { + return parseTreeApi.getNodeAtLocation( + new vscode.Location(editor.document.uri, toVscodeRange(range)), + ); + }; + const graph = makeGraph({ ...graphFactories, extensionContext: () => context, diff --git a/src/ide/vscode/VscodeEditableTextEditorImpl.ts b/src/ide/vscode/VscodeEditableTextEditorImpl.ts index ff375bdbc3..e2a6a56e97 100644 --- a/src/ide/vscode/VscodeEditableTextEditorImpl.ts +++ b/src/ide/vscode/VscodeEditableTextEditorImpl.ts @@ -61,7 +61,7 @@ export class VscodeEditableTextEditorImpl } public focus(): Promise { - return vscodeFocusEditor(this.editor); + return vscodeFocusEditor(this); } public openLink(location: Position | Range): Promise { diff --git a/src/libs/common/index.ts b/src/libs/common/index.ts index 20cf4673a3..47ad83280b 100644 --- a/src/libs/common/index.ts +++ b/src/libs/common/index.ts @@ -17,7 +17,6 @@ export { walkFilesSync } from "./util/walkSync"; export { Listener, Notifier } from "./util/Notifier"; export { TokenHatSplittingMode } from "./ide/types/Configuration"; export * from "./ide/types/ide.types"; -export * from "./types/Location"; export * from "./types/Position"; export * from "./types/Range"; export * from "./types/Selection"; diff --git a/src/libs/common/types/Location.ts b/src/libs/common/types/Location.ts deleted file mode 100644 index ed95ea6047..0000000000 --- a/src/libs/common/types/Location.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { URI } from "vscode-uri"; -import type { Position } from "@cursorless/common"; -import { Range } from "@cursorless/common"; - -/** - * Represents a location inside a resource, such as a line - * inside a text file. - */ -export class Location { - /** - * The resource identifier of this location. - */ - readonly uri: URI; - - /** - * The document range of this location. - */ - readonly range: Range; - - /** - * Creates a new location object. - * - * @param uri The resource identifier. - * @param rangeOrPosition The range or position. Positions will be converted to an empty range. - */ - constructor(uri: URI, rangeOrPosition: Range | Position) { - this.uri = uri; - this.range = - "start" in rangeOrPosition - ? rangeOrPosition - : new Range(rangeOrPosition, rangeOrPosition); - } -} diff --git a/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts b/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts index 698aa3489d..e8dbbe0335 100644 --- a/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts +++ b/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts @@ -1,4 +1,4 @@ -import { Location, Selection } from "@cursorless/common"; +import { Selection } from "@cursorless/common"; import type { SyntaxNode } from "web-tree-sitter"; import { NoContainingScopeError } from "../../../errors"; import { getNodeMatcher } from "../../../languages/getNodeMatcher"; @@ -39,7 +39,8 @@ export default class implements ModifierStage { ); const node: SyntaxNode | null = context.getNodeAtLocation( - new Location(target.editor.document.uri, target.contentRange), + target.editor, + target.contentRange, ); const scopeNodes = findNearestContainingAncestorNode(node, nodeMatcher, { diff --git a/src/processTargets/modifiers/surroundingPair/index.ts b/src/processTargets/modifiers/surroundingPair/index.ts index 48986850f8..7a351a6444 100644 --- a/src/processTargets/modifiers/surroundingPair/index.ts +++ b/src/processTargets/modifiers/surroundingPair/index.ts @@ -1,4 +1,4 @@ -import { Location, Range, Selection, TextEditor } from "@cursorless/common"; +import { Range, Selection, TextEditor } from "@cursorless/common"; import { SyntaxNode } from "web-tree-sitter"; import getTextFragmentExtractor, { TextFragmentExtractor, @@ -42,7 +42,7 @@ export function processSurroundingPair( let textFragmentExtractor: TextFragmentExtractor; try { - node = context.getNodeAtLocation(new Location(document.uri, range)); + node = context.getNodeAtLocation(editor, range); textFragmentExtractor = getTextFragmentExtractor(document.languageId); } catch (err) { diff --git a/src/typings/Types.ts b/src/typings/Types.ts index d1ea9514dd..7827f33de1 100644 --- a/src/typings/Types.ts +++ b/src/typings/Types.ts @@ -1,9 +1,4 @@ -import type { - Location, - Range, - Selection, - TextEditor, -} from "@cursorless/common"; +import type { Range, Selection, TextEditor } from "@cursorless/common"; import { SyntaxNode } from "web-tree-sitter"; import { ActionRecord } from "../actions/actions.types"; import Cheatsheet from "../core/Cheatsheet"; @@ -46,7 +41,7 @@ export interface ProcessedTargetsContext { hatTokenMap: ReadOnlyHatMap; thatMark: Target[]; sourceMark: Target[]; - getNodeAtLocation: (location: Location) => SyntaxNode; + getNodeAtLocation: (editor: TextEditor, range: Range) => SyntaxNode; } export interface SelectionWithEditor { @@ -140,7 +135,7 @@ export interface Graph { /** * Function to access nodes in the tree sitter. */ - readonly getNodeAtLocation: (location: Location) => SyntaxNode; + readonly getNodeAtLocation: (editor: TextEditor, range: Range) => SyntaxNode; /** * Debug logger From 4c2a848c49c85adfc39b548f0c83cae58944f945 Mon Sep 17 00:00:00 2001 From: Pokey Rule <755842+pokey@users.noreply.github.com> Date: Tue, 15 Nov 2022 19:19:18 +0000 Subject: [PATCH 58/84] Switch `getNodeAtLocation` to use document --- src/core/Debug.ts | 2 +- src/extension.ts | 6 +++--- .../scopeTypeStages/ContainingSyntaxScopeStage.ts | 2 +- .../modifiers/surroundingPair/index.ts | 2 +- src/typings/Types.ts | 14 +++++++++++--- 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/core/Debug.ts b/src/core/Debug.ts index de6f55d8fb..7e0b5db811 100644 --- a/src/core/Debug.ts +++ b/src/core/Debug.ts @@ -89,7 +89,7 @@ export default class Debug { let node: SyntaxNode; try { node = this.graph.getNodeAtLocation( - ide().activeTextEditor!, + ide().activeTextEditor!.document, fromVscodeRange(event.selections[0]), ); } catch (error) { diff --git a/src/extension.ts b/src/extension.ts index a774914387..cc3ecb1166 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,4 +1,4 @@ -import { Range, TextEditor } from "@cursorless/common"; +import { Range, TextDocument } from "@cursorless/common"; import { toVscodeRange } from "@cursorless/vscode-common"; import * as vscode from "vscode"; import CommandRunner from "./core/commandRunner/CommandRunner"; @@ -46,9 +46,9 @@ export async function activate( injectIde(vscodeIDE); } - const getNodeAtLocation = (editor: TextEditor, range: Range) => { + const getNodeAtLocation = (document: TextDocument, range: Range) => { return parseTreeApi.getNodeAtLocation( - new vscode.Location(editor.document.uri, toVscodeRange(range)), + new vscode.Location(document.uri, toVscodeRange(range)), ); }; diff --git a/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts b/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts index e8dbbe0335..da29e7c281 100644 --- a/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts +++ b/src/processTargets/modifiers/scopeTypeStages/ContainingSyntaxScopeStage.ts @@ -39,7 +39,7 @@ export default class implements ModifierStage { ); const node: SyntaxNode | null = context.getNodeAtLocation( - target.editor, + target.editor.document, target.contentRange, ); diff --git a/src/processTargets/modifiers/surroundingPair/index.ts b/src/processTargets/modifiers/surroundingPair/index.ts index 7a351a6444..a0472de3ca 100644 --- a/src/processTargets/modifiers/surroundingPair/index.ts +++ b/src/processTargets/modifiers/surroundingPair/index.ts @@ -42,7 +42,7 @@ export function processSurroundingPair( let textFragmentExtractor: TextFragmentExtractor; try { - node = context.getNodeAtLocation(editor, range); + node = context.getNodeAtLocation(document, range); textFragmentExtractor = getTextFragmentExtractor(document.languageId); } catch (err) { diff --git a/src/typings/Types.ts b/src/typings/Types.ts index 7827f33de1..9520543424 100644 --- a/src/typings/Types.ts +++ b/src/typings/Types.ts @@ -1,4 +1,9 @@ -import type { Range, Selection, TextEditor } from "@cursorless/common"; +import type { + Range, + Selection, + TextEditor, + TextDocument, +} from "@cursorless/common"; import { SyntaxNode } from "web-tree-sitter"; import { ActionRecord } from "../actions/actions.types"; import Cheatsheet from "../core/Cheatsheet"; @@ -41,7 +46,7 @@ export interface ProcessedTargetsContext { hatTokenMap: ReadOnlyHatMap; thatMark: Target[]; sourceMark: Target[]; - getNodeAtLocation: (editor: TextEditor, range: Range) => SyntaxNode; + getNodeAtLocation: (document: TextDocument, range: Range) => SyntaxNode; } export interface SelectionWithEditor { @@ -135,7 +140,10 @@ export interface Graph { /** * Function to access nodes in the tree sitter. */ - readonly getNodeAtLocation: (editor: TextEditor, range: Range) => SyntaxNode; + readonly getNodeAtLocation: ( + document: TextDocument, + range: Range, + ) => SyntaxNode; /** * Debug logger From 9cc4496991f689ed47e7ac43c0fbda2d18adb0ea Mon Sep 17 00:00:00 2001 From: Pokey Rule <755842+pokey@users.noreply.github.com> Date: Tue, 15 Nov 2022 19:33:30 +0000 Subject: [PATCH 59/84] Use editable editor for performing edits --- src/actions/BringMoveSwap.ts | 9 +++---- src/actions/EditNew/EditNew.ts | 13 +++++---- src/actions/EditNew/runCommandTargets.ts | 4 +-- src/actions/EditNew/runEditTargets.ts | 4 +-- src/actions/InsertCopy.ts | 5 ++-- src/actions/InsertEmptyLines.ts | 6 +++-- src/actions/Remove.ts | 3 ++- src/actions/Replace.ts | 3 ++- src/actions/Rewrap.ts | 3 ++- src/actions/Wrap.ts | 9 +++---- src/core/updateSelections/updateSelections.ts | 19 ++++++++----- src/util/performDocumentEdits.ts | 27 +++++++++---------- 12 files changed, 55 insertions(+), 50 deletions(-) diff --git a/src/actions/BringMoveSwap.ts b/src/actions/BringMoveSwap.ts index 00116b1875..b3d8badcc0 100644 --- a/src/actions/BringMoveSwap.ts +++ b/src/actions/BringMoveSwap.ts @@ -181,10 +181,12 @@ class BringMoveSwap implements Action { ), ); + const editableEditor = ide().getEditableTextEditor(editor); + const [updatedEditSelections, cursorSelections]: Selection[][] = await performEditsAndUpdateFullSelectionInfos( this.graph.rangeUpdater, - editor, + editableEditor, filteredEdits.map(({ edit }) => edit), [editSelectionInfos, cursorSelectionInfos], ); @@ -192,10 +194,7 @@ class BringMoveSwap implements Action { // NB: We set the selections here because we don't trust vscode to // properly move the cursor on a bring. Sometimes it will smear an // empty selection - setSelectionsWithoutFocusingEditor( - ide().getEditableTextEditor(editor), - cursorSelections, - ); + setSelectionsWithoutFocusingEditor(editableEditor, cursorSelections); return edits.map((edit, index): MarkEntry => { const selection = updatedEditSelections[index]; diff --git a/src/actions/EditNew/EditNew.ts b/src/actions/EditNew/EditNew.ts index e577cc3342..5658e5f6c9 100644 --- a/src/actions/EditNew/EditNew.ts +++ b/src/actions/EditNew/EditNew.ts @@ -29,7 +29,9 @@ export class EditNew implements Action { return runNotebookCellTargets(this.graph, targets); } - const editor = ensureSingleEditor(targets); + const editableEditor = ide().getEditableTextEditor( + ensureSingleEditor(targets), + ); /** * Keeps track of the desired cursor positions and "that" marks as we @@ -41,16 +43,13 @@ export class EditNew implements Action { cursorRanges: new Array(targets.length).fill(undefined) as undefined[], }; - state = await runCommandTargets(this.graph, editor, state); - state = await runEditTargets(this.graph, editor, state); + state = await runCommandTargets(this.graph, editableEditor, state); + state = await runEditTargets(this.graph, editableEditor, state); const newSelections = state.targets.map((target, index) => state.cursorRanges[index]!.toSelection(target.isReversed), ); - await setSelectionsAndFocusEditor( - ide().getEditableTextEditor(editor), - newSelections, - ); + await setSelectionsAndFocusEditor(editableEditor, newSelections); return { thatSelections: createThatMark(state.targets, state.thatRanges), diff --git a/src/actions/EditNew/runCommandTargets.ts b/src/actions/EditNew/runCommandTargets.ts index 15b2f298ba..437a613615 100644 --- a/src/actions/EditNew/runCommandTargets.ts +++ b/src/actions/EditNew/runCommandTargets.ts @@ -1,4 +1,4 @@ -import { TextEditor } from "@cursorless/common"; +import { EditableTextEditor } from "@cursorless/common"; import { commands } from "vscode"; import { callFunctionAndUpdateRanges } from "../../core/updateSelections/updateSelections"; import { Graph } from "../../typings/Types"; @@ -17,7 +17,7 @@ import { CommandTarget, State } from "./EditNew.types"; */ export async function runCommandTargets( graph: Graph, - editor: TextEditor, + editor: EditableTextEditor, state: State, ): Promise { const commandTargets: CommandTarget[] = state.targets diff --git a/src/actions/EditNew/runEditTargets.ts b/src/actions/EditNew/runEditTargets.ts index cb5774fc0c..5b97ea6153 100644 --- a/src/actions/EditNew/runEditTargets.ts +++ b/src/actions/EditNew/runEditTargets.ts @@ -1,4 +1,4 @@ -import { Selection, TextEditor } from "@cursorless/common"; +import { Selection, EditableTextEditor } from "@cursorless/common"; import { zip } from "lodash"; import { DecorationRangeBehavior } from "vscode"; import { performEditsAndUpdateSelectionsWithBehavior } from "../../core/updateSelections/updateSelections"; @@ -20,7 +20,7 @@ import { EditTarget, State } from "./EditNew.types"; */ export async function runEditTargets( graph: Graph, - editor: TextEditor, + editor: EditableTextEditor, state: State, ): Promise { const editTargets: EditTarget[] = state.targets diff --git a/src/actions/InsertCopy.ts b/src/actions/InsertCopy.ts index dcb636f9ab..81be1f11c4 100644 --- a/src/actions/InsertCopy.ts +++ b/src/actions/InsertCopy.ts @@ -58,13 +58,15 @@ class InsertCopy implements Action { rangeBehavior: DecorationRangeBehavior.OpenOpen, }; + const editableEditor = ide().getEditableTextEditor(editor); + const [ updatedEditorSelections, updatedContentSelections, updatedEditSelections, ]: Selection[][] = await performEditsAndUpdateSelectionsWithBehavior( this.graph.rangeUpdater, - editor, + editableEditor, edits, [cursorSelections, contentSelections, editSelections], ); @@ -73,7 +75,6 @@ class InsertCopy implements Action { ([edit, selection]) => edit!.updateRange(selection!), ); - const editableEditor = ide().getEditableTextEditor(editor); setSelectionsWithoutFocusingEditor(editableEditor, updatedEditorSelections); editableEditor.revealRange(editor.selections[0]); diff --git a/src/actions/InsertEmptyLines.ts b/src/actions/InsertEmptyLines.ts index ae3bfee7fc..c4158a9d1f 100644 --- a/src/actions/InsertEmptyLines.ts +++ b/src/actions/InsertEmptyLines.ts @@ -47,10 +47,12 @@ class InsertEmptyLines implements Action { const ranges = this.getRanges(targets); const edits = this.getEdits(ranges); + const editableEditor = ide().getEditableTextEditor(editor); + const [updatedThatSelections, lineSelections, updatedCursorSelections] = await performEditsAndUpdateSelections( this.graph.rangeUpdater, - editor, + editableEditor, edits, [ targets.map((target) => target.thatTarget.contentSelection), @@ -60,7 +62,7 @@ class InsertEmptyLines implements Action { ); setSelectionsWithoutFocusingEditor( - ide().getEditableTextEditor(editor), + editableEditor, updatedCursorSelections, ); diff --git a/src/actions/Remove.ts b/src/actions/Remove.ts index 43f5b3c956..cad0b984a7 100644 --- a/src/actions/Remove.ts +++ b/src/actions/Remove.ts @@ -1,5 +1,6 @@ import { flatten } from "lodash"; import { performEditsAndUpdateRanges } from "../core/updateSelections/updateSelections"; +import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { createThatMark, runOnTargetsForEachEditor } from "../util/targetUtils"; @@ -33,7 +34,7 @@ export default class Delete implements Action { const [updatedRanges] = await performEditsAndUpdateRanges( this.graph.rangeUpdater, - editor, + ide().getEditableTextEditor(editor), edits, [ranges], ); diff --git a/src/actions/Replace.ts b/src/actions/Replace.ts index c6a8a60226..5311ac3868 100644 --- a/src/actions/Replace.ts +++ b/src/actions/Replace.ts @@ -1,5 +1,6 @@ import { flatten, zip } from "lodash"; import { performEditsAndUpdateSelections } from "../core/updateSelections/updateSelections"; +import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; import { runForEachEditor } from "../util/targetUtils"; @@ -57,7 +58,7 @@ export default class Replace implements Action { async (editor, edits) => { const [updatedSelections] = await performEditsAndUpdateSelections( this.graph.rangeUpdater, - editor, + ide().getEditableTextEditor(editor), edits.map(({ edit }) => edit), [targets.map((target) => target.contentSelection)], ); diff --git a/src/actions/Rewrap.ts b/src/actions/Rewrap.ts index 046d4d5d62..181f1a176c 100644 --- a/src/actions/Rewrap.ts +++ b/src/actions/Rewrap.ts @@ -1,4 +1,5 @@ import { performEditsAndUpdateRanges } from "../core/updateSelections/updateSelections"; +import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { containingSurroundingPairIfUntypedStage } from "../processTargets/modifiers/commonContainingScopeIfUntypedStages"; import { Target } from "../typings/target.types"; import { Graph } from "../typings/Types"; @@ -44,7 +45,7 @@ export default class Rewrap implements Action { const [updatedSourceRanges, updatedThatRanges] = await performEditsAndUpdateRanges( this.graph.rangeUpdater, - editor, + ide().getEditableTextEditor(editor), edits, [ targets.map((target) => target.thatTarget.contentRange), diff --git a/src/actions/Wrap.ts b/src/actions/Wrap.ts index 340ed949f1..f702a07cea 100644 --- a/src/actions/Wrap.ts +++ b/src/actions/Wrap.ts @@ -87,6 +87,8 @@ export default class Wrap implements Action { ), ); + const editableEditor = ide().getEditableTextEditor(editor); + const [ delimiterSelections, cursorSelections, @@ -94,7 +96,7 @@ export default class Wrap implements Action { thatMarkSelections, ] = await performEditsAndUpdateFullSelectionInfos( this.graph.rangeUpdater, - editor, + editableEditor, edits, [ delimiterSelectionInfos, @@ -104,10 +106,7 @@ export default class Wrap implements Action { ], ); - setSelectionsWithoutFocusingEditor( - ide().getEditableTextEditor(editor), - cursorSelections, - ); + setSelectionsWithoutFocusingEditor(editableEditor, cursorSelections); this.graph.editStyles.displayPendingEditDecorationsForRanges( delimiterSelections.map((selection) => ({ diff --git a/src/core/updateSelections/updateSelections.ts b/src/core/updateSelections/updateSelections.ts index 91d186ed45..77d879a319 100644 --- a/src/core/updateSelections/updateSelections.ts +++ b/src/core/updateSelections/updateSelections.ts @@ -1,4 +1,9 @@ -import { Range, Selection, TextDocument, TextEditor } from "@cursorless/common"; +import { + EditableTextEditor, + Range, + Selection, + TextDocument, +} from "@cursorless/common"; import { flatten } from "lodash"; import { DecorationRangeBehavior } from "vscode"; import { Edit } from "../../typings/Types"; @@ -244,7 +249,7 @@ export function callFunctionAndUpdateSelectionsWithBehavior( */ export async function performEditsAndUpdateSelections( rangeUpdater: RangeUpdater, - editor: TextEditor, + editor: EditableTextEditor, edits: Edit[], originalSelections: (readonly Selection[])[], ) { @@ -273,7 +278,7 @@ export async function performEditsAndUpdateSelections( */ export function performEditsAndUpdateSelectionsWithBehavior( rangeUpdater: RangeUpdater, - editor: TextEditor, + editor: EditableTextEditor, edits: Edit[], originalSelections: SelectionsWithBehavior[], ) { @@ -296,7 +301,7 @@ export function performEditsAndUpdateSelectionsWithBehavior( export async function performEditsAndUpdateRanges( rangeUpdater: RangeUpdater, - editor: TextEditor, + editor: EditableTextEditor, edits: Edit[], originalRanges: (readonly Range[])[], ): Promise { @@ -312,7 +317,7 @@ export async function performEditsAndUpdateRanges( async function performEditsAndUpdateInternal( rangeUpdater: RangeUpdater, - editor: TextEditor, + editor: EditableTextEditor, edits: Edit[], selectionInfoMatrix: FullSelectionInfo[][], ) { @@ -328,7 +333,7 @@ async function performEditsAndUpdateInternal( // TODO: Remove this function if we don't end up using it for the next couple use cases, eg `that` mark and cursor history export async function performEditsAndUpdateSelectionInfos( rangeUpdater: RangeUpdater, - editor: TextEditor, + editor: EditableTextEditor, edits: Edit[], originalSelectionInfos: SelectionInfo[][], ): Promise { @@ -353,7 +358,7 @@ export async function performEditsAndUpdateSelectionInfos( */ export async function performEditsAndUpdateFullSelectionInfos( rangeUpdater: RangeUpdater, - editor: TextEditor, + editor: EditableTextEditor, edits: Edit[], originalSelectionInfos: FullSelectionInfo[][], ): Promise { diff --git a/src/util/performDocumentEdits.ts b/src/util/performDocumentEdits.ts index da25be7a1e..de573b87f8 100644 --- a/src/util/performDocumentEdits.ts +++ b/src/util/performDocumentEdits.ts @@ -1,11 +1,10 @@ -import { TextEditor } from "@cursorless/common"; +import { EditableTextEditor } from "@cursorless/common"; import { RangeUpdater } from "../core/updateSelections/RangeUpdater"; -import ide from "../libs/cursorless-engine/singletons/ide.singleton"; import { Edit } from "../typings/Types"; export async function performDocumentEdits( rangeUpdater: RangeUpdater, - editor: TextEditor, + editor: EditableTextEditor, edits: Edit[], ) { const deregister = rangeUpdater.registerReplaceEditList( @@ -13,19 +12,17 @@ export async function performDocumentEdits( edits.filter((edit) => edit.isReplace), ); - const wereEditsApplied = await ide() - .getEditableTextEditor(editor) - .edit((editBuilder) => { - edits.forEach(({ range, text, isReplace }) => { - if (text === "") { - editBuilder.delete(range); - } else if (range.isEmpty && !isReplace) { - editBuilder.insert(range.start, text); - } else { - editBuilder.replace(range, text); - } - }); + const wereEditsApplied = await editor.edit((editBuilder) => { + edits.forEach(({ range, text, isReplace }) => { + if (text === "") { + editBuilder.delete(range); + } else if (range.isEmpty && !isReplace) { + editBuilder.insert(range.start, text); + } else { + editBuilder.replace(range, text); + } }); + }); deregister(); From e3da4a556ff3b299c198fd8d82a667232f86353c Mon Sep 17 00:00:00 2001 From: Pokey Rule <755842+pokey@users.noreply.github.com> Date: Tue, 15 Nov 2022 19:57:31 +0000 Subject: [PATCH 60/84] Add `ide` reference to editable text editor --- .../vscode/VscodeEditableTextEditorImpl.ts | 3 +- src/ide/vscode/VscodeFocusEditor.ts | 7 ++-- src/ide/vscode/VscodeIDE.ts | 4 +-- src/util/notebookLegacy.ts | 34 +++++++++++-------- 4 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/ide/vscode/VscodeEditableTextEditorImpl.ts b/src/ide/vscode/VscodeEditableTextEditorImpl.ts index e2a6a56e97..2bcbafe1ad 100644 --- a/src/ide/vscode/VscodeEditableTextEditorImpl.ts +++ b/src/ide/vscode/VscodeEditableTextEditorImpl.ts @@ -15,6 +15,7 @@ import { import * as vscode from "vscode"; import vscodeFocusEditor from "../../ide/vscode/VscodeFocusEditor"; import vscodeEdit from "./VscodeEdit"; +import type VscodeIDE from "./VscodeIDE"; import vscodeOpenLink from "./VscodeOpenLink"; import { VscodeTextEditorImpl } from "./VscodeTextEditorImpl"; @@ -22,7 +23,7 @@ export class VscodeEditableTextEditorImpl extends VscodeTextEditorImpl implements EditableTextEditor { - constructor(editor: vscode.TextEditor) { + constructor(public ide: VscodeIDE, editor: vscode.TextEditor) { super(editor); } diff --git a/src/ide/vscode/VscodeFocusEditor.ts b/src/ide/vscode/VscodeFocusEditor.ts index 143741171b..fcce7f0d43 100644 --- a/src/ide/vscode/VscodeFocusEditor.ts +++ b/src/ide/vscode/VscodeFocusEditor.ts @@ -13,6 +13,7 @@ import { focusNotebookCellLegacy, isVscodeLegacyNotebookVersion, } from "../../util/notebookLegacy"; +import { VscodeEditableTextEditorImpl } from "./VscodeEditableTextEditorImpl"; import { VscodeTextEditorImpl } from "./VscodeTextEditorImpl"; const columnFocusCommands = { @@ -29,7 +30,9 @@ const columnFocusCommands = { [ViewColumn.Beside]: "", }; -export default async function focusVscodeEditor(editor: VscodeTextEditorImpl) { +export default async function focusVscodeEditor( + editor: VscodeEditableTextEditorImpl, +) { const viewColumn = getViewColumn(editor.vscodeEditor); if (viewColumn != null) { await commands.executeCommand(columnFocusCommands[viewColumn]); @@ -38,7 +41,7 @@ export default async function focusVscodeEditor(editor: VscodeTextEditorImpl) { // can just move around in the notebook to focus the correct editor if (isVscodeLegacyNotebookVersion()) { - return await focusNotebookCellLegacy(editor.vscodeEditor); + return await focusNotebookCellLegacy(editor); } await focusNotebookCell(editor); diff --git a/src/ide/vscode/VscodeIDE.ts b/src/ide/vscode/VscodeIDE.ts index 7831209583..9d9c220410 100644 --- a/src/ide/vscode/VscodeIDE.ts +++ b/src/ide/vscode/VscodeIDE.ts @@ -53,7 +53,7 @@ export default class VscodeIDE implements IDE { get activeEditableTextEditor(): EditableTextEditor | undefined { return window.activeTextEditor != null - ? new VscodeEditableTextEditorImpl(window.activeTextEditor) + ? new VscodeEditableTextEditorImpl(this, window.activeTextEditor) : undefined; } @@ -62,7 +62,7 @@ export default class VscodeIDE implements IDE { } public getEditableTextEditor(editor: TextEditor): EditableTextEditor { - return new VscodeEditableTextEditorImpl(toVscodeEditor(editor)); + return new VscodeEditableTextEditorImpl(this, toVscodeEditor(editor)); } public onDidChangeTextDocument( diff --git a/src/util/notebookLegacy.ts b/src/util/notebookLegacy.ts index 35ad40f4bb..c92c237f53 100644 --- a/src/util/notebookLegacy.ts +++ b/src/util/notebookLegacy.ts @@ -1,14 +1,8 @@ import { toVscodeEditor } from "@cursorless/vscode-common"; import { range } from "lodash"; import * as semver from "semver"; -import { - commands, - NotebookDocument, - TextDocument, - TextEditor, - version, -} from "vscode"; -import ide from "../libs/cursorless-engine/singletons/ide.singleton"; +import { commands, NotebookDocument, TextDocument, version } from "vscode"; +import { VscodeEditableTextEditorImpl } from "../ide/vscode/VscodeEditableTextEditorImpl"; import { getCellIndex } from "../libs/vscode-common/notebook"; import { getNotebookFromCellDocument } from "./notebook"; @@ -16,18 +10,22 @@ export function isVscodeLegacyNotebookVersion() { return semver.lt(version, "1.68.0"); } -export async function focusNotebookCellLegacy(editor: TextEditor) { - const activeTextEditor = ide().activeTextEditor; +export async function focusNotebookCellLegacy( + editor: VscodeEditableTextEditorImpl, +) { + const activeTextEditor = editor.ide.activeTextEditor; if (activeTextEditor == null) { return; } - const vscodeEditor = toVscodeEditor(activeTextEditor); + const vscodeActiveEditor = toVscodeEditor(activeTextEditor); - const editorNotebook = getNotebookFromCellDocument(editor.document); + const editorNotebook = getNotebookFromCellDocument( + editor.vscodeEditor.document, + ); const activeEditorNotebook = getNotebookFromCellDocument( - vscodeEditor.document, + vscodeActiveEditor.document, ); if ( @@ -38,8 +36,14 @@ export async function focusNotebookCellLegacy(editor: TextEditor) { return; } - const editorIndex = getCellIndex(editorNotebook, editor.document); - const activeEditorIndex = getCellIndex(editorNotebook, vscodeEditor.document); + const editorIndex = getCellIndex( + editorNotebook, + editor.vscodeEditor.document, + ); + const activeEditorIndex = getCellIndex( + editorNotebook, + vscodeActiveEditor.document, + ); if (editorIndex === -1 || activeEditorIndex === -1) { throw new Error( From 73cf0e5914f889619ad1e702bc1e522d3760e522 Mon Sep 17 00:00:00 2001 From: Pokey Rule <755842+pokey@users.noreply.github.com> Date: Tue, 15 Nov 2022 20:33:52 +0000 Subject: [PATCH 61/84] docs --- src/libs/common/ide/types/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/common/ide/types/README.md b/src/libs/common/ide/types/README.md index f22064f35a..70255b9477 100644 --- a/src/libs/common/ide/types/README.md +++ b/src/libs/common/ide/types/README.md @@ -1,3 +1,3 @@ # Core IDE types -This directory contains the core IDE types use throughout the cursorless code base. Knows that a lot of the types as well as their JSDocs were taken and modified from the core vscode types, which are available under the [MIT license](https://github.com/microsoft/vscode/blob/main/LICENSE.txt). +This directory contains the core IDE types used throughout the cursorless code base. Note that a lot of the types as well as their JSDocs were taken and modified from the core vscode types, which are available under the [MIT license](https://github.com/microsoft/vscode/blob/main/LICENSE.txt). From c1383453b5ff5ddc025e2166a5247e678f7e3f97 Mon Sep 17 00:00:00 2001 From: Pokey Rule <755842+pokey@users.noreply.github.com> Date: Tue, 15 Nov 2022 20:48:51 +0000 Subject: [PATCH 62/84] Tweak --- src/ide/vscode/VscodeEditableTextEditorImpl.ts | 4 ++-- src/ide/vscode/VscodeFocusEditor.ts | 4 +++- src/util/notebookLegacy.ts | 4 +++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/ide/vscode/VscodeEditableTextEditorImpl.ts b/src/ide/vscode/VscodeEditableTextEditorImpl.ts index 2bcbafe1ad..108263ab34 100644 --- a/src/ide/vscode/VscodeEditableTextEditorImpl.ts +++ b/src/ide/vscode/VscodeEditableTextEditorImpl.ts @@ -23,7 +23,7 @@ export class VscodeEditableTextEditorImpl extends VscodeTextEditorImpl implements EditableTextEditor { - constructor(public ide: VscodeIDE, editor: vscode.TextEditor) { + constructor(private ide: VscodeIDE, editor: vscode.TextEditor) { super(editor); } @@ -62,7 +62,7 @@ export class VscodeEditableTextEditorImpl } public focus(): Promise { - return vscodeFocusEditor(this); + return vscodeFocusEditor(this.ide, this); } public openLink(location: Position | Range): Promise { diff --git a/src/ide/vscode/VscodeFocusEditor.ts b/src/ide/vscode/VscodeFocusEditor.ts index fcce7f0d43..d10f4075bc 100644 --- a/src/ide/vscode/VscodeFocusEditor.ts +++ b/src/ide/vscode/VscodeFocusEditor.ts @@ -14,6 +14,7 @@ import { isVscodeLegacyNotebookVersion, } from "../../util/notebookLegacy"; import { VscodeEditableTextEditorImpl } from "./VscodeEditableTextEditorImpl"; +import type VscodeIDE from "./VscodeIDE"; import { VscodeTextEditorImpl } from "./VscodeTextEditorImpl"; const columnFocusCommands = { @@ -31,6 +32,7 @@ const columnFocusCommands = { }; export default async function focusVscodeEditor( + ide: VscodeIDE, editor: VscodeEditableTextEditorImpl, ) { const viewColumn = getViewColumn(editor.vscodeEditor); @@ -41,7 +43,7 @@ export default async function focusVscodeEditor( // can just move around in the notebook to focus the correct editor if (isVscodeLegacyNotebookVersion()) { - return await focusNotebookCellLegacy(editor); + return await focusNotebookCellLegacy(ide, editor); } await focusNotebookCell(editor); diff --git a/src/util/notebookLegacy.ts b/src/util/notebookLegacy.ts index c92c237f53..c1da00da73 100644 --- a/src/util/notebookLegacy.ts +++ b/src/util/notebookLegacy.ts @@ -3,6 +3,7 @@ import { range } from "lodash"; import * as semver from "semver"; import { commands, NotebookDocument, TextDocument, version } from "vscode"; import { VscodeEditableTextEditorImpl } from "../ide/vscode/VscodeEditableTextEditorImpl"; +import type VscodeIDE from "../ide/vscode/VscodeIDE"; import { getCellIndex } from "../libs/vscode-common/notebook"; import { getNotebookFromCellDocument } from "./notebook"; @@ -11,9 +12,10 @@ export function isVscodeLegacyNotebookVersion() { } export async function focusNotebookCellLegacy( + ide: VscodeIDE, editor: VscodeEditableTextEditorImpl, ) { - const activeTextEditor = editor.ide.activeTextEditor; + const activeTextEditor = ide.activeTextEditor; if (activeTextEditor == null) { return; From ae1e1ffe8aacf18db75df7776e0956716b686a05 Mon Sep 17 00:00:00 2001 From: Pokey Rule <755842+pokey@users.noreply.github.com> Date: Tue, 15 Nov 2022 20:49:25 +0000 Subject: [PATCH 63/84] tweak --- src/util/notebookLegacy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/notebookLegacy.ts b/src/util/notebookLegacy.ts index c1da00da73..90e41af60e 100644 --- a/src/util/notebookLegacy.ts +++ b/src/util/notebookLegacy.ts @@ -15,7 +15,7 @@ export async function focusNotebookCellLegacy( ide: VscodeIDE, editor: VscodeEditableTextEditorImpl, ) { - const activeTextEditor = ide.activeTextEditor; + const { activeTextEditor } = ide; if (activeTextEditor == null) { return; From c12d8b3c948a00d4afe98f51d6baa7d75b48caa0 Mon Sep 17 00:00:00 2001 From: Pokey Rule <755842+pokey@users.noreply.github.com> Date: Tue, 15 Nov 2022 21:06:59 +0000 Subject: [PATCH 64/84] Fix bug with id / editor generation --- .../vscode/VscodeEditableTextEditorImpl.ts | 4 +-- src/ide/vscode/VscodeIDE.ts | 29 ++++++++++++------- src/ide/vscode/VscodeTextEditorImpl.ts | 5 +--- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/ide/vscode/VscodeEditableTextEditorImpl.ts b/src/ide/vscode/VscodeEditableTextEditorImpl.ts index 108263ab34..49b4c948c7 100644 --- a/src/ide/vscode/VscodeEditableTextEditorImpl.ts +++ b/src/ide/vscode/VscodeEditableTextEditorImpl.ts @@ -23,8 +23,8 @@ export class VscodeEditableTextEditorImpl extends VscodeTextEditorImpl implements EditableTextEditor { - constructor(private ide: VscodeIDE, editor: vscode.TextEditor) { - super(editor); + constructor(id: string, private ide: VscodeIDE, editor: vscode.TextEditor) { + super(id, editor); } get selections(): Selection[] { diff --git a/src/ide/vscode/VscodeIDE.ts b/src/ide/vscode/VscodeIDE.ts index 9d9c220410..306a13ffd5 100644 --- a/src/ide/vscode/VscodeIDE.ts +++ b/src/ide/vscode/VscodeIDE.ts @@ -1,5 +1,4 @@ import type { EditableTextEditor, TextEditor } from "@cursorless/common"; -import { toVscodeEditor } from "@cursorless/vscode-common"; import { pull } from "lodash"; import type * as vscode from "vscode"; import { ExtensionContext, window, workspace, WorkspaceFolder } from "vscode"; @@ -16,7 +15,7 @@ import { vscodeOnDidChangeTextDocument } from "./VscodeEvents"; import VscodeGlobalState from "./VscodeGlobalState"; import VscodeMessages from "./VscodeMessages"; import { vscodeRunMode } from "./VscodeRunMode"; -import { VscodeTextEditorImpl } from "./VscodeTextEditorImpl"; +import { v4 as uuid } from "uuid"; export default class VscodeIDE implements IDE { configuration: VscodeConfiguration; @@ -30,7 +29,10 @@ export default class VscodeIDE implements IDE { this.globalState = new VscodeGlobalState(extensionContext); this.messages = new VscodeMessages(); this.clipboard = new VscodeClipboard(); - this.editorMap = new WeakMap(); + this.editorMap = new WeakMap< + vscode.TextEditor, + VscodeEditableTextEditorImpl + >(); } get assetsRoot(): string { @@ -46,14 +48,16 @@ export default class VscodeIDE implements IDE { } get activeTextEditor(): TextEditor | undefined { - return window.activeTextEditor != null - ? this.fromVscodeEditor(window.activeTextEditor) - : undefined; + return this.getActiveTextEditor(); } get activeEditableTextEditor(): EditableTextEditor | undefined { + return this.getActiveTextEditor(); + } + + private getActiveTextEditor() { return window.activeTextEditor != null - ? new VscodeEditableTextEditorImpl(this, window.activeTextEditor) + ? this.fromVscodeEditor(window.activeTextEditor) : undefined; } @@ -62,7 +66,7 @@ export default class VscodeIDE implements IDE { } public getEditableTextEditor(editor: TextEditor): EditableTextEditor { - return new VscodeEditableTextEditorImpl(this, toVscodeEditor(editor)); + return editor as VscodeEditableTextEditorImpl; } public onDidChangeTextDocument( @@ -71,9 +75,14 @@ export default class VscodeIDE implements IDE { return vscodeOnDidChangeTextDocument(listener); } - public fromVscodeEditor(editor: vscode.TextEditor): TextEditor { + public fromVscodeEditor( + editor: vscode.TextEditor, + ): VscodeEditableTextEditorImpl { if (!this.editorMap.has(editor)) { - this.editorMap.set(editor, new VscodeTextEditorImpl(editor)); + this.editorMap.set( + editor, + new VscodeEditableTextEditorImpl(uuid(), this, editor), + ); } return this.editorMap.get(editor)!; } diff --git a/src/ide/vscode/VscodeTextEditorImpl.ts b/src/ide/vscode/VscodeTextEditorImpl.ts index 85d48785df..fb7dec95ae 100644 --- a/src/ide/vscode/VscodeTextEditorImpl.ts +++ b/src/ide/vscode/VscodeTextEditorImpl.ts @@ -9,16 +9,13 @@ import { fromVscodeRange, fromVscodeSelection, } from "@cursorless/vscode-common"; -import { v4 as uuid } from "uuid"; import * as vscode from "vscode"; import { fromVscodeDocument } from "./vscodeIdeUtil"; export class VscodeTextEditorImpl implements TextEditor { - readonly id: string; readonly document: TextDocument; - constructor(protected editor: vscode.TextEditor) { - this.id = uuid(); + constructor(public readonly id: string, protected editor: vscode.TextEditor) { this.document = fromVscodeDocument(editor.document); } From 4aaa19cd357bd927e85e54056a4e0a6187c9af2a Mon Sep 17 00:00:00 2001 From: Pokey Rule <755842+pokey@users.noreply.github.com> Date: Tue, 15 Nov 2022 21:21:29 +0000 Subject: [PATCH 65/84] Remove unnecessary functions --- src/ide/vscode/VscodeEvents.ts | 4 ++-- src/ide/vscode/VscodeTextDocumentImpl.ts | 4 ++-- src/ide/vscode/VscodeTextEditorImpl.ts | 4 ++-- src/ide/vscode/vscodeIdeUtil.ts | 14 -------------- 4 files changed, 6 insertions(+), 20 deletions(-) delete mode 100644 src/ide/vscode/vscodeIdeUtil.ts diff --git a/src/ide/vscode/VscodeEvents.ts b/src/ide/vscode/VscodeEvents.ts index e6ee361ce1..a5346babfb 100644 --- a/src/ide/vscode/VscodeEvents.ts +++ b/src/ide/vscode/VscodeEvents.ts @@ -6,14 +6,14 @@ import type { TextDocumentContentChangeEvent, } from "../../libs/common/ide/types/Events"; import type { Disposable } from "../../libs/common/ide/types/ide.types"; -import { fromVscodeDocument } from "./vscodeIdeUtil"; +import { VscodeTextDocumentImpl } from "./VscodeTextDocumentImpl"; export function vscodeOnDidChangeTextDocument( listener: (event: TextDocumentChangeEvent) => void, ): Disposable { return vscode.workspace.onDidChangeTextDocument((e) => { listener({ - document: fromVscodeDocument(e.document), + document: new VscodeTextDocumentImpl(e.document), contentChanges: e.contentChanges.map(fromVscodeContentChange), reason: fromVscodeReason(e.reason), }); diff --git a/src/ide/vscode/VscodeTextDocumentImpl.ts b/src/ide/vscode/VscodeTextDocumentImpl.ts index 99e3ba365b..6844b6533d 100644 --- a/src/ide/vscode/VscodeTextDocumentImpl.ts +++ b/src/ide/vscode/VscodeTextDocumentImpl.ts @@ -6,7 +6,7 @@ import { } from "@cursorless/vscode-common"; import * as vscode from "vscode"; import type { URI } from "vscode-uri"; -import { fromVscodeTextLine } from "./vscodeIdeUtil"; +import VscodeTextLineImpl from "./VscodeTextLineImpl"; export class VscodeTextDocumentImpl implements TextDocument { get uri(): URI { @@ -33,7 +33,7 @@ export class VscodeTextDocumentImpl implements TextDocument { constructor(private document: vscode.TextDocument) {} public lineAt(lineOrPosition: number | Position): TextLine { - return fromVscodeTextLine( + return new VscodeTextLineImpl( this.document.lineAt( typeof lineOrPosition === "number" ? lineOrPosition diff --git a/src/ide/vscode/VscodeTextEditorImpl.ts b/src/ide/vscode/VscodeTextEditorImpl.ts index fb7dec95ae..2f30ec3b37 100644 --- a/src/ide/vscode/VscodeTextEditorImpl.ts +++ b/src/ide/vscode/VscodeTextEditorImpl.ts @@ -10,13 +10,13 @@ import { fromVscodeSelection, } from "@cursorless/vscode-common"; import * as vscode from "vscode"; -import { fromVscodeDocument } from "./vscodeIdeUtil"; +import { VscodeTextDocumentImpl } from "./VscodeTextDocumentImpl"; export class VscodeTextEditorImpl implements TextEditor { readonly document: TextDocument; constructor(public readonly id: string, protected editor: vscode.TextEditor) { - this.document = fromVscodeDocument(editor.document); + this.document = new VscodeTextDocumentImpl(editor.document); } get vscodeEditor(): vscode.TextEditor { diff --git a/src/ide/vscode/vscodeIdeUtil.ts b/src/ide/vscode/vscodeIdeUtil.ts deleted file mode 100644 index 4885a64274..0000000000 --- a/src/ide/vscode/vscodeIdeUtil.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { TextDocument, TextLine } from "@cursorless/common"; -import * as vscode from "vscode"; -import { VscodeTextDocumentImpl } from "./VscodeTextDocumentImpl"; -import VscodeTextLineImpl from "./VscodeTextLineImpl"; - -export function fromVscodeDocument( - document: vscode.TextDocument, -): TextDocument { - return new VscodeTextDocumentImpl(document); -} - -export function fromVscodeTextLine(line: vscode.TextLine): TextLine { - return new VscodeTextLineImpl(line); -} From 49bf331f7f3617165983b485540942e16af85e57 Mon Sep 17 00:00:00 2001 From: Pokey Rule <755842+pokey@users.noreply.github.com> Date: Tue, 15 Nov 2022 21:33:06 +0000 Subject: [PATCH 66/84] Tweak name --- src/libs/vscode-common/vscodeUtil.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/vscode-common/vscodeUtil.ts b/src/libs/vscode-common/vscodeUtil.ts index f573660454..39a3044b58 100644 --- a/src/libs/vscode-common/vscodeUtil.ts +++ b/src/libs/vscode-common/vscodeUtil.ts @@ -64,7 +64,7 @@ export function toVscodeEndOfLine(eol: EndOfLine): vscode.EndOfLine { return eol === "LF" ? vscode.EndOfLine.LF : vscode.EndOfLine.CRLF; } -export function fromVscodeAndOfLine(eol: vscode.EndOfLine): EndOfLine { +export function fromVscodeEndOfLine(eol: vscode.EndOfLine): EndOfLine { return eol === vscode.EndOfLine.LF ? "LF" : "CRLF"; } From a1066b20367a824baad842b62377a2d9d6884029 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Wed, 16 Nov 2022 13:35:15 +0100 Subject: [PATCH 67/84] merged vscode text editor implementations --- .../vscode/VscodeEditableTextEditorImpl.ts | 71 ------------------- src/ide/vscode/VscodeFocusEditor.ts | 5 +- src/ide/vscode/VscodeIDE.ts | 15 ++-- src/ide/vscode/VscodeTextEditorImpl.ts | 50 ++++++++++++- src/util/notebookLegacy.ts | 4 +- 5 files changed, 58 insertions(+), 87 deletions(-) delete mode 100644 src/ide/vscode/VscodeEditableTextEditorImpl.ts diff --git a/src/ide/vscode/VscodeEditableTextEditorImpl.ts b/src/ide/vscode/VscodeEditableTextEditorImpl.ts deleted file mode 100644 index 49b4c948c7..0000000000 --- a/src/ide/vscode/VscodeEditableTextEditorImpl.ts +++ /dev/null @@ -1,71 +0,0 @@ -import type { - EditableTextEditor, - Position, - Range, - Selection, - TextEditorDecorationType, - TextEditorEdit, - TextEditorOptions, -} from "@cursorless/common"; -import { - toVscodePositionOrRange, - toVscodeRange, - toVscodeSelection, -} from "@cursorless/vscode-common"; -import * as vscode from "vscode"; -import vscodeFocusEditor from "../../ide/vscode/VscodeFocusEditor"; -import vscodeEdit from "./VscodeEdit"; -import type VscodeIDE from "./VscodeIDE"; -import vscodeOpenLink from "./VscodeOpenLink"; -import { VscodeTextEditorImpl } from "./VscodeTextEditorImpl"; - -export class VscodeEditableTextEditorImpl - extends VscodeTextEditorImpl - implements EditableTextEditor -{ - constructor(id: string, private ide: VscodeIDE, editor: vscode.TextEditor) { - super(id, editor); - } - - get selections(): Selection[] { - return super.selections; - } - - set selections(selections: Selection[]) { - this.editor.selections = selections.map(toVscodeSelection); - } - - get options(): TextEditorOptions { - return super.options; - } - - set options(options: TextEditorOptions) { - this.editor.options = options; - } - - public revealRange(range: Range): void { - this.editor.revealRange(toVscodeRange(range)); - } - - public setDecorations( - decorationType: TextEditorDecorationType, - ranges: readonly Range[], - ): void { - this.editor.setDecorations(decorationType, ranges.map(toVscodeRange)); - } - - public edit( - callback: (editBuilder: TextEditorEdit) => void, - options?: { undoStopBefore: boolean; undoStopAfter: boolean }, - ): Thenable { - return vscodeEdit(this.editor, callback, options); - } - - public focus(): Promise { - return vscodeFocusEditor(this.ide, this); - } - - public openLink(location: Position | Range): Promise { - return vscodeOpenLink(this.editor, toVscodePositionOrRange(location)); - } -} diff --git a/src/ide/vscode/VscodeFocusEditor.ts b/src/ide/vscode/VscodeFocusEditor.ts index d10f4075bc..69b26abc56 100644 --- a/src/ide/vscode/VscodeFocusEditor.ts +++ b/src/ide/vscode/VscodeFocusEditor.ts @@ -13,7 +13,6 @@ import { focusNotebookCellLegacy, isVscodeLegacyNotebookVersion, } from "../../util/notebookLegacy"; -import { VscodeEditableTextEditorImpl } from "./VscodeEditableTextEditorImpl"; import type VscodeIDE from "./VscodeIDE"; import { VscodeTextEditorImpl } from "./VscodeTextEditorImpl"; @@ -31,9 +30,9 @@ const columnFocusCommands = { [ViewColumn.Beside]: "", }; -export default async function focusVscodeEditor( +export default async function vscodeFocusEditor( ide: VscodeIDE, - editor: VscodeEditableTextEditorImpl, + editor: VscodeTextEditorImpl, ) { const viewColumn = getViewColumn(editor.vscodeEditor); if (viewColumn != null) { diff --git a/src/ide/vscode/VscodeIDE.ts b/src/ide/vscode/VscodeIDE.ts index 306a13ffd5..e9ac7a668d 100644 --- a/src/ide/vscode/VscodeIDE.ts +++ b/src/ide/vscode/VscodeIDE.ts @@ -10,7 +10,7 @@ import type { } from "../../libs/common/ide/types/ide.types"; import VscodeClipboard from "./VscodeClipboard"; import VscodeConfiguration from "./VscodeConfiguration"; -import { VscodeEditableTextEditorImpl } from "./VscodeEditableTextEditorImpl"; +import { VscodeTextEditorImpl } from "./VscodeTextEditorImpl"; import { vscodeOnDidChangeTextDocument } from "./VscodeEvents"; import VscodeGlobalState from "./VscodeGlobalState"; import VscodeMessages from "./VscodeMessages"; @@ -29,10 +29,7 @@ export default class VscodeIDE implements IDE { this.globalState = new VscodeGlobalState(extensionContext); this.messages = new VscodeMessages(); this.clipboard = new VscodeClipboard(); - this.editorMap = new WeakMap< - vscode.TextEditor, - VscodeEditableTextEditorImpl - >(); + this.editorMap = new WeakMap(); } get assetsRoot(): string { @@ -66,7 +63,7 @@ export default class VscodeIDE implements IDE { } public getEditableTextEditor(editor: TextEditor): EditableTextEditor { - return editor as VscodeEditableTextEditorImpl; + return editor as EditableTextEditor; } public onDidChangeTextDocument( @@ -75,13 +72,11 @@ export default class VscodeIDE implements IDE { return vscodeOnDidChangeTextDocument(listener); } - public fromVscodeEditor( - editor: vscode.TextEditor, - ): VscodeEditableTextEditorImpl { + public fromVscodeEditor(editor: vscode.TextEditor): VscodeTextEditorImpl { if (!this.editorMap.has(editor)) { this.editorMap.set( editor, - new VscodeEditableTextEditorImpl(uuid(), this, editor), + new VscodeTextEditorImpl(uuid(), this, editor), ); } return this.editorMap.get(editor)!; diff --git a/src/ide/vscode/VscodeTextEditorImpl.ts b/src/ide/vscode/VscodeTextEditorImpl.ts index 2f30ec3b37..d569e26f6d 100644 --- a/src/ide/vscode/VscodeTextEditorImpl.ts +++ b/src/ide/vscode/VscodeTextEditorImpl.ts @@ -1,21 +1,35 @@ import type { + Position, Range, Selection, TextDocument, TextEditor, + TextEditorDecorationType, + TextEditorEdit, TextEditorOptions, } from "@cursorless/common"; import { fromVscodeRange, fromVscodeSelection, + toVscodePositionOrRange, + toVscodeRange, + toVscodeSelection, } from "@cursorless/vscode-common"; import * as vscode from "vscode"; +import vscodeEdit from "./VscodeEdit"; +import vscodeFocusEditor from "./VscodeFocusEditor"; +import VscodeIDE from "./VscodeIDE"; +import vscodeOpenLink from "./VscodeOpenLink"; import { VscodeTextDocumentImpl } from "./VscodeTextDocumentImpl"; export class VscodeTextEditorImpl implements TextEditor { readonly document: TextDocument; - constructor(public readonly id: string, protected editor: vscode.TextEditor) { + constructor( + public readonly id: string, + private ide: VscodeIDE, + private editor: vscode.TextEditor, + ) { this.document = new VscodeTextDocumentImpl(editor.document); } @@ -27,6 +41,10 @@ export class VscodeTextEditorImpl implements TextEditor { return this.editor.selections.map(fromVscodeSelection); } + set selections(selections: Selection[]) { + this.editor.selections = selections.map(toVscodeSelection); + } + get visibleRanges(): Range[] { return this.editor.visibleRanges.map(fromVscodeRange); } @@ -35,6 +53,10 @@ export class VscodeTextEditorImpl implements TextEditor { return this.editor.options; } + set options(options: TextEditorOptions) { + this.editor.options = options; + } + get isActive(): boolean { return this.editor === vscode.window.activeTextEditor; } @@ -42,4 +64,30 @@ export class VscodeTextEditorImpl implements TextEditor { public isEqual(other: TextEditor): boolean { return this.id === other.id; } + + public revealRange(range: Range): void { + this.editor.revealRange(toVscodeRange(range)); + } + + public setDecorations( + decorationType: TextEditorDecorationType, + ranges: readonly Range[], + ): void { + this.editor.setDecorations(decorationType, ranges.map(toVscodeRange)); + } + + public edit( + callback: (editBuilder: TextEditorEdit) => void, + options?: { undoStopBefore: boolean; undoStopAfter: boolean }, + ): Thenable { + return vscodeEdit(this.editor, callback, options); + } + + public focus(): Promise { + return vscodeFocusEditor(this.ide, this); + } + + public openLink(location: Position | Range): Promise { + return vscodeOpenLink(this.editor, toVscodePositionOrRange(location)); + } } diff --git a/src/util/notebookLegacy.ts b/src/util/notebookLegacy.ts index 90e41af60e..40cfc3a0fd 100644 --- a/src/util/notebookLegacy.ts +++ b/src/util/notebookLegacy.ts @@ -2,7 +2,7 @@ import { toVscodeEditor } from "@cursorless/vscode-common"; import { range } from "lodash"; import * as semver from "semver"; import { commands, NotebookDocument, TextDocument, version } from "vscode"; -import { VscodeEditableTextEditorImpl } from "../ide/vscode/VscodeEditableTextEditorImpl"; +import type { VscodeTextEditorImpl } from "../ide/vscode/VscodeTextEditorImpl"; import type VscodeIDE from "../ide/vscode/VscodeIDE"; import { getCellIndex } from "../libs/vscode-common/notebook"; import { getNotebookFromCellDocument } from "./notebook"; @@ -13,7 +13,7 @@ export function isVscodeLegacyNotebookVersion() { export async function focusNotebookCellLegacy( ide: VscodeIDE, - editor: VscodeEditableTextEditorImpl, + editor: VscodeTextEditorImpl, ) { const { activeTextEditor } = ide; From 4a456eb23f9a3de68e1d4b78fd0a6c0a1d65607d Mon Sep 17 00:00:00 2001 From: Pokey Rule <755842+pokey@users.noreply.github.com> Date: Wed, 16 Nov 2022 13:36:00 +0000 Subject: [PATCH 68/84] Add back comments about range adjustment --- src/libs/common/types/TextDocument.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/libs/common/types/TextDocument.ts b/src/libs/common/types/TextDocument.ts index c33bce0ebd..6cfe3250bd 100644 --- a/src/libs/common/types/TextDocument.ts +++ b/src/libs/common/types/TextDocument.ts @@ -46,6 +46,8 @@ export interface TextDocument { * that the returned object is *not* live and changes to the * document are not reflected. * + * The position will be adjusted if it is outside {@link range}. + * * @see {@link TextDocument.lineAt} * * @param position A position. @@ -56,6 +58,8 @@ export interface TextDocument { /** * Converts the position to a zero-based offset. * + * The position will be adjusted if it is outside {@link range}. + * * @param position A position. * @return A valid zero-based offset. */ @@ -73,6 +77,8 @@ export interface TextDocument { * Get the text of this document. A substring can be retrieved by providing * a range. * + * The range will be adjusted if it extends outside {@link TextDocument.range}. + * * @param range Include only the text included by the range. * @return The text inside the provided range or the entire text. */ From cfdb2d1d1d055d42791c5e3dbdbb40291ac6976e Mon Sep 17 00:00:00 2001 From: Pokey Rule <755842+pokey@users.noreply.github.com> Date: Wed, 16 Nov 2022 13:40:11 +0000 Subject: [PATCH 69/84] Tweak docstrings --- src/libs/common/types/TextEditor.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/libs/common/types/TextEditor.ts b/src/libs/common/types/TextEditor.ts index f72df42541..79219d9b8a 100644 --- a/src/libs/common/types/TextEditor.ts +++ b/src/libs/common/types/TextEditor.ts @@ -8,6 +8,10 @@ import type { TextEditorOptions, } from "@cursorless/common"; +/** + * Represents a read-only reference to a text editor. If you need to modify the + * editor, use {@link IDE.getEditableTextEditor}. + */ export interface TextEditor { /** * Unique identifier for this text editor @@ -26,7 +30,7 @@ export interface TextEditor { readonly visibleRanges: Range[]; /** - * The selections in this text editor. The primary selection is always at index 0. + * The selections in this text editor. */ readonly selections: Selection[]; @@ -50,14 +54,8 @@ export interface TextEditor { } export interface EditableTextEditor extends TextEditor { - /** - * The selections in this text editor. The primary selection is always at index 0. - */ selections: Selection[]; - /** - * Text editor options. - */ options: TextEditorOptions; /** From 9ba5d2781448ced1ec183a9588bc5d03c7524e17 Mon Sep 17 00:00:00 2001 From: Pokey Rule <755842+pokey@users.noreply.github.com> Date: Wed, 16 Nov 2022 13:43:24 +0000 Subject: [PATCH 70/84] docs --- src/libs/common/types/TextEditorDecorationType.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/common/types/TextEditorDecorationType.ts b/src/libs/common/types/TextEditorDecorationType.ts index ce135bcc28..8d22dd3842 100644 --- a/src/libs/common/types/TextEditorDecorationType.ts +++ b/src/libs/common/types/TextEditorDecorationType.ts @@ -1,6 +1,6 @@ /** - * Represents a handle to a set of decorations - * sharing the same {@link DecorationRenderOptions styling options} in a {@link TextEditor text editor}. + * Represents a handle to a set of decorations sharing the same + * {@link DecorationRenderOptions styling options}. */ export interface TextEditorDecorationType { /** From 14d5f0e70aac28f9599383847210da8e92b55f52 Mon Sep 17 00:00:00 2001 From: Pokey Rule <755842+pokey@users.noreply.github.com> Date: Wed, 16 Nov 2022 13:48:59 +0000 Subject: [PATCH 71/84] add a couple tests --- src/libs/common/types/position.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libs/common/types/position.test.ts b/src/libs/common/types/position.test.ts index 708a578908..ca8a2462f7 100644 --- a/src/libs/common/types/position.test.ts +++ b/src/libs/common/types/position.test.ts @@ -20,6 +20,7 @@ suite("Position", () => { assert.ok(new Position(0, 0).isBefore(new Position(0, 1))); assert.ok(!new Position(1, 0).isBefore(new Position(0, 0))); assert.ok(!new Position(0, 1).isBefore(new Position(0, 0))); + assert.ok(!new Position(0, 0).isBefore(new Position(0, 0))); }); test("isAfter", () => { @@ -27,6 +28,7 @@ suite("Position", () => { assert.ok(new Position(0, 1).isAfter(new Position(0, 0))); assert.ok(!new Position(0, 0).isAfter(new Position(1, 0))); assert.ok(!new Position(0, 0).isAfter(new Position(0, 1))); + assert.ok(!new Position(0, 0).isBefore(new Position(0, 0))); }); test("isBeforeOrEqual", () => { From 10091558ed96cc7dbc8e7e2dd8c7617fe02326dc Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Wed, 16 Nov 2022 14:56:47 +0100 Subject: [PATCH 72/84] Updated line behavior --- src/ide/vscode/VscodeTextLineImpl.ts | 8 ++++++-- src/libs/common/types/TextLine.ts | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/ide/vscode/VscodeTextLineImpl.ts b/src/ide/vscode/VscodeTextLineImpl.ts index 2f19862870..cbc1e684a5 100644 --- a/src/ide/vscode/VscodeTextLineImpl.ts +++ b/src/ide/vscode/VscodeTextLineImpl.ts @@ -22,11 +22,15 @@ export default class VscodeTextLineImpl implements TextLine { } get firstNonWhitespaceCharacterIndex(): number { - return this.line.firstNonWhitespaceCharacterIndex; + return this.isEmptyOrWhitespace + ? 0 + : this.line.firstNonWhitespaceCharacterIndex; } get lastNonWhitespaceCharacterIndex(): number { - return this.line.text.trimEnd().length; + return this.isEmptyOrWhitespace + ? this.line.text.length + : this.line.text.trimEnd().length; } get isEmptyOrWhitespace(): boolean { diff --git a/src/libs/common/types/TextLine.ts b/src/libs/common/types/TextLine.ts index 7accadc77d..4754d725d6 100644 --- a/src/libs/common/types/TextLine.ts +++ b/src/libs/common/types/TextLine.ts @@ -29,7 +29,7 @@ export interface TextLine { /** * The offset of the first character which is not a whitespace character as defined - * by `/\s/`. **Note** that if a line is all whitespace the length of the line is returned. + * by `/\s/`. **Note** that if a line is all whitespace 0 is returned. */ readonly firstNonWhitespaceCharacterIndex: number; From f0ec35d4e857209fb7781de4d7c167cf4d753cda Mon Sep 17 00:00:00 2001 From: Pokey Rule <755842+pokey@users.noreply.github.com> Date: Wed, 16 Nov 2022 14:01:12 +0000 Subject: [PATCH 73/84] Test tweaks --- src/libs/common/types/range.test.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/libs/common/types/range.test.ts b/src/libs/common/types/range.test.ts index 6c3282874e..01597c938c 100644 --- a/src/libs/common/types/range.test.ts +++ b/src/libs/common/types/range.test.ts @@ -38,17 +38,29 @@ suite("Range", () => { assert.ok(new Range(0, 1, 0, 0).isEqual(new Range(0, 1, 0, 0))); assert.ok(new Range(0, 0, 1, 0).isEqual(new Range(0, 0, 1, 0))); assert.ok(new Range(0, 0, 0, 1).isEqual(new Range(0, 0, 0, 1))); + assert.ok(!new Range(0, 0, 0, 0).isEqual(new Range(1, 0, 0, 0))); + assert.ok(!new Range(0, 0, 0, 0).isEqual(new Range(0, 1, 0, 0))); + assert.ok(!new Range(0, 0, 0, 0).isEqual(new Range(0, 0, 1, 0))); + assert.ok(!new Range(0, 0, 0, 0).isEqual(new Range(0, 0, 0, 1))); }); test("contains", () => { assert.ok(new Range(0, 0, 0, 0).contains(new Range(0, 0, 0, 0))); assert.ok(new Range(0, 0, 4, 0).contains(new Range(1, 0, 2, 0))); assert.ok(new Range(0, 0, 0, 4).contains(new Range(0, 1, 0, 2))); + assert.ok(new Range(0, 0, 0, 4).contains(new Range(0, 2, 0, 4))); + assert.ok(new Range(0, 0, 4, 0).contains(new Range(2, 0, 4, 0))); assert.ok(new Range(0, 0, 0, 1).contains(new Range(0, 0, 0, 0))); assert.ok(new Range(0, 0, 1, 0).contains(new Range(0, 0, 0, 0))); + assert.ok(new Range(0, 0, 0, 1).contains(new Range(0, 1, 0, 1))); + assert.ok(new Range(0, 0, 1, 0).contains(new Range(1, 0, 1, 0))); assert.ok(!new Range(0, 0, 0, 0).contains(new Range(0, 0, 0, 1))); assert.ok(!new Range(0, 0, 0, 0).contains(new Range(0, 0, 1, 0))); + assert.ok(!new Range(0, 0, 0, 1).contains(new Range(0, 1, 0, 2))); + assert.ok(!new Range(0, 1, 0, 2).contains(new Range(0, 0, 0, 1))); assert.ok(new Range(0, 0, 0, 7).contains(new Position(0, 2))); + assert.ok(new Range(0, 0, 0, 1).contains(new Position(0, 1))); + assert.ok(!new Range(0, 0, 0, 1).contains(new Position(0, 2))); }); test("intersection", () => { @@ -90,6 +102,11 @@ suite("Range", () => { .union(new Range(0, 1, 0, 1)) .isEqual(new Range(0, 1, 3, 4)), ); + assert.ok( + new Range(1, 2, 3, 4) + .union(new Range(1, 3, 2, 4)) + .isEqual(new Range(1, 2, 3, 4)), + ); }); test("toSelection", () => { From 9d866448dfa2ac890110ebda34be4dbdedd42ac6 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Wed, 16 Nov 2022 15:19:06 +0100 Subject: [PATCH 74/84] updated behavior --- src/ide/vscode/VscodeTextLineImpl.ts | 8 ++------ src/libs/common/types/TextLine.ts | 4 ++-- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/ide/vscode/VscodeTextLineImpl.ts b/src/ide/vscode/VscodeTextLineImpl.ts index cbc1e684a5..2f19862870 100644 --- a/src/ide/vscode/VscodeTextLineImpl.ts +++ b/src/ide/vscode/VscodeTextLineImpl.ts @@ -22,15 +22,11 @@ export default class VscodeTextLineImpl implements TextLine { } get firstNonWhitespaceCharacterIndex(): number { - return this.isEmptyOrWhitespace - ? 0 - : this.line.firstNonWhitespaceCharacterIndex; + return this.line.firstNonWhitespaceCharacterIndex; } get lastNonWhitespaceCharacterIndex(): number { - return this.isEmptyOrWhitespace - ? this.line.text.length - : this.line.text.trimEnd().length; + return this.line.text.trimEnd().length; } get isEmptyOrWhitespace(): boolean { diff --git a/src/libs/common/types/TextLine.ts b/src/libs/common/types/TextLine.ts index 4754d725d6..3ba38b17e9 100644 --- a/src/libs/common/types/TextLine.ts +++ b/src/libs/common/types/TextLine.ts @@ -29,13 +29,13 @@ export interface TextLine { /** * The offset of the first character which is not a whitespace character as defined - * by `/\s/`. **Note** that if a line is all whitespace 0 is returned. + * by `/\s/`. **Note** that if a line is all whitespace the length of the line is returned. */ readonly firstNonWhitespaceCharacterIndex: number; /** * The offset of the last character which is not a whitespace character as defined - * by `/\s/`. **Note** that if a line is all whitespace the length of the line is returned. + * by `/\s/`. **Note** that if a line is all whitespace 0 is returned. */ readonly lastNonWhitespaceCharacterIndex: number; From a2299bb4dd4313f246fb0a9d087e3b434d23d15a Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Wed, 16 Nov 2022 15:21:35 +0100 Subject: [PATCH 75/84] added selection isEqual --- src/libs/common/types/Selection.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/libs/common/types/Selection.ts b/src/libs/common/types/Selection.ts index a728eaa3f4..8a84da2392 100644 --- a/src/libs/common/types/Selection.ts +++ b/src/libs/common/types/Selection.ts @@ -59,4 +59,17 @@ export class Selection extends Range { this.anchor = anchor; this.active = active; } + + /** + * Check if `other` equals this range. + * + * @param other A selection. + * @return `true` when anchor and active are {@link Position.isEqual equal} to + * anchor and active of this range. + */ + public isEqual(other: Selection): boolean { + return ( + this.anchor.isEqual(other.anchor) && this.active.isEqual(other.active) + ); + } } From 6738670cac1ecf127063d97463281cefe5b1d572 Mon Sep 17 00:00:00 2001 From: Pokey Rule <755842+pokey@users.noreply.github.com> Date: Wed, 16 Nov 2022 14:34:15 +0000 Subject: [PATCH 76/84] `isEqual` => `isRangeEqual` --- src/core/updateSelections/RangeUpdater.ts | 2 +- src/libs/common/types/Range.ts | 2 +- src/libs/common/types/range.test.ts | 32 +++++++++---------- .../TokenInsertionRemovalBehavior.ts | 2 +- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/core/updateSelections/RangeUpdater.ts b/src/core/updateSelections/RangeUpdater.ts index 00211fec8d..ddd2e70cd6 100644 --- a/src/core/updateSelections/RangeUpdater.ts +++ b/src/core/updateSelections/RangeUpdater.ts @@ -128,7 +128,7 @@ function isReplace( for (const replaceEditLists of documentReplaceEditLists) { for (const replaceEdit of replaceEditLists) { if ( - replaceEdit.range.isEqual(change.range) && + replaceEdit.range.isRangeEqual(change.range) && replaceEdit.text === change.text ) { return true; diff --git a/src/libs/common/types/Range.ts b/src/libs/common/types/Range.ts index cfa09d605c..165239aa5d 100644 --- a/src/libs/common/types/Range.ts +++ b/src/libs/common/types/Range.ts @@ -78,7 +78,7 @@ export class Range { * @return `true` when start and end are {@link Position.isEqual equal} to * start and end of this range. */ - public isEqual(other: Range): boolean { + public isRangeEqual(other: Range): boolean { return this.start.isEqual(other.start) && this.end.isEqual(other.end); } diff --git a/src/libs/common/types/range.test.ts b/src/libs/common/types/range.test.ts index 01597c938c..315163478c 100644 --- a/src/libs/common/types/range.test.ts +++ b/src/libs/common/types/range.test.ts @@ -10,7 +10,7 @@ suite("Range", () => { assert.equal(new Range(5, 0, 0, 0).start.line, 0); assert.equal(new Range(0, 5, 0, 0).start.character, 0); assert.ok( - new Range(new Position(1, 2), new Position(3, 4)).isEqual( + new Range(new Position(1, 2), new Position(3, 4)).isRangeEqual( new Range(1, 2, 3, 4), ), ); @@ -33,15 +33,15 @@ suite("Range", () => { }); test("isEqual", () => { - assert.ok(new Range(0, 0, 0, 0).isEqual(new Range(0, 0, 0, 0))); - assert.ok(new Range(1, 0, 0, 0).isEqual(new Range(1, 0, 0, 0))); - assert.ok(new Range(0, 1, 0, 0).isEqual(new Range(0, 1, 0, 0))); - assert.ok(new Range(0, 0, 1, 0).isEqual(new Range(0, 0, 1, 0))); - assert.ok(new Range(0, 0, 0, 1).isEqual(new Range(0, 0, 0, 1))); - assert.ok(!new Range(0, 0, 0, 0).isEqual(new Range(1, 0, 0, 0))); - assert.ok(!new Range(0, 0, 0, 0).isEqual(new Range(0, 1, 0, 0))); - assert.ok(!new Range(0, 0, 0, 0).isEqual(new Range(0, 0, 1, 0))); - assert.ok(!new Range(0, 0, 0, 0).isEqual(new Range(0, 0, 0, 1))); + assert.ok(new Range(0, 0, 0, 0).isRangeEqual(new Range(0, 0, 0, 0))); + assert.ok(new Range(1, 0, 0, 0).isRangeEqual(new Range(1, 0, 0, 0))); + assert.ok(new Range(0, 1, 0, 0).isRangeEqual(new Range(0, 1, 0, 0))); + assert.ok(new Range(0, 0, 1, 0).isRangeEqual(new Range(0, 0, 1, 0))); + assert.ok(new Range(0, 0, 0, 1).isRangeEqual(new Range(0, 0, 0, 1))); + assert.ok(!new Range(0, 0, 0, 0).isRangeEqual(new Range(1, 0, 0, 0))); + assert.ok(!new Range(0, 0, 0, 0).isRangeEqual(new Range(0, 1, 0, 0))); + assert.ok(!new Range(0, 0, 0, 0).isRangeEqual(new Range(0, 0, 1, 0))); + assert.ok(!new Range(0, 0, 0, 0).isRangeEqual(new Range(0, 0, 0, 1))); }); test("contains", () => { @@ -67,7 +67,7 @@ suite("Range", () => { assert.ok( new Range(1, 2, 3, 4) .intersection(new Range(1, 7, 5, 2)) - ?.isEqual(new Range(1, 7, 3, 4)), + ?.isRangeEqual(new Range(1, 7, 3, 4)), ); assert.ok( new Range(1, 2, 1, 6).intersection(new Range(1, 6, 5, 2))?.isEmpty, @@ -82,12 +82,12 @@ suite("Range", () => { assert.ok( new Range(1, 2, 3, 4) .with(new Position(4, 5), undefined) - .isEqual(new Range(4, 5, 3, 4)), + .isRangeEqual(new Range(4, 5, 3, 4)), ); assert.ok( new Range(1, 2, 3, 4) .with(undefined, new Position(4, 5)) - .isEqual(new Range(1, 2, 4, 5)), + .isRangeEqual(new Range(1, 2, 4, 5)), ); }); @@ -95,17 +95,17 @@ suite("Range", () => { assert.ok( new Range(1, 2, 3, 4) .union(new Range(4, 2, 6, 1)) - .isEqual(new Range(1, 2, 6, 1)), + .isRangeEqual(new Range(1, 2, 6, 1)), ); assert.ok( new Range(1, 2, 3, 4) .union(new Range(0, 1, 0, 1)) - .isEqual(new Range(0, 1, 3, 4)), + .isRangeEqual(new Range(0, 1, 3, 4)), ); assert.ok( new Range(1, 2, 3, 4) .union(new Range(1, 3, 2, 4)) - .isEqual(new Range(1, 2, 3, 4)), + .isRangeEqual(new Range(1, 2, 3, 4)), ); }); diff --git a/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts b/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts index cb86ae0c23..570b85ca35 100644 --- a/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts +++ b/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts @@ -73,7 +73,7 @@ export function getTokenRemovalRange(target: Target): Range { const fullLineRange = expandToFullLine(editor, contentRange); if ( - leadingWhitespaceRange.union(trailingWhitespaceRange).isEqual(fullLineRange) + leadingWhitespaceRange.union(trailingWhitespaceRange).isRangeEqual(fullLineRange) ) { // If we would just be leaving a line with whitespace on it, we delete the // whitespace From c8a5a72c7da2d9ff010dfe2019c4101d87dc5346 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 16 Nov 2022 14:34:48 +0000 Subject: [PATCH 77/84] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../TokenInsertionRemovalBehavior.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts b/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts index 570b85ca35..174e5f6d25 100644 --- a/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts +++ b/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts @@ -73,7 +73,9 @@ export function getTokenRemovalRange(target: Target): Range { const fullLineRange = expandToFullLine(editor, contentRange); if ( - leadingWhitespaceRange.union(trailingWhitespaceRange).isRangeEqual(fullLineRange) + leadingWhitespaceRange + .union(trailingWhitespaceRange) + .isRangeEqual(fullLineRange) ) { // If we would just be leaving a line with whitespace on it, we delete the // whitespace From cff3b078c3f50ecb73d8fa04b0b644d7fdb22d7f Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Wed, 16 Nov 2022 16:45:43 +0100 Subject: [PATCH 78/84] cleanup --- src/libs/common/types/Range.ts | 2 +- src/libs/vscode-common/vscodeUtil.ts | 6 +++--- src/util/rangeUtils.ts | 7 ++++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/libs/common/types/Range.ts b/src/libs/common/types/Range.ts index 165239aa5d..ea4f4e3ba0 100644 --- a/src/libs/common/types/Range.ts +++ b/src/libs/common/types/Range.ts @@ -91,7 +91,7 @@ export class Range { */ public contains(positionOrRange: Position | Range): boolean { const [start, end] = - "line" in positionOrRange + positionOrRange instanceof Position ? [positionOrRange, positionOrRange] : [positionOrRange.start, positionOrRange.end]; return start.isAfterOrEqual(this.start) && end.isBeforeOrEqual(this.end); diff --git a/src/libs/vscode-common/vscodeUtil.ts b/src/libs/vscode-common/vscodeUtil.ts index 39a3044b58..bf8077363f 100644 --- a/src/libs/vscode-common/vscodeUtil.ts +++ b/src/libs/vscode-common/vscodeUtil.ts @@ -55,9 +55,9 @@ export function fromVscodePosition(position: vscode.Position): Position { export function toVscodePositionOrRange( location: Position | Range, ): vscode.Position | vscode.Range { - return "start" in location - ? toVscodeRange(location) - : toVscodePosition(location); + return location instanceof Position + ? toVscodePosition(location) + : toVscodeRange(location); } export function toVscodeEndOfLine(eol: EndOfLine): vscode.EndOfLine { diff --git a/src/util/rangeUtils.ts b/src/util/rangeUtils.ts index fca196fc51..89bf2aebd3 100644 --- a/src/util/rangeUtils.ts +++ b/src/util/rangeUtils.ts @@ -47,8 +47,9 @@ export function strictlyContains( range1: Range, rangeOrPosition: Range | Position, ): boolean { - const start = - "start" in rangeOrPosition ? rangeOrPosition.start : rangeOrPosition; - const end = "end" in rangeOrPosition ? rangeOrPosition.end : rangeOrPosition; + const [start, end] = + rangeOrPosition instanceof Position + ? [rangeOrPosition, rangeOrPosition] + : [rangeOrPosition.start, rangeOrPosition.end]; return range1.start.isBefore(start) && range1.end.isAfter(end); } From 3209bf48a52ef84807361cb5bdfed6a2fd258058 Mon Sep 17 00:00:00 2001 From: Pokey Rule <755842+pokey@users.noreply.github.com> Date: Wed, 16 Nov 2022 15:44:27 +0000 Subject: [PATCH 79/84] Capture more unit tests in launch config --- src/test/runners/unitTestsOnly.ts | 10 ++++-- src/test/util/runAllTestsInDir.ts | 51 +++++++++++++++++-------------- 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/src/test/runners/unitTestsOnly.ts b/src/test/runners/unitTestsOnly.ts index a07373b839..4dee9867cf 100644 --- a/src/test/runners/unitTestsOnly.ts +++ b/src/test/runners/unitTestsOnly.ts @@ -2,10 +2,14 @@ // package.json are active import "module-alias/register"; import * as path from "path"; -import { runAllTestsInDir } from "../util/runAllTestsInDir"; +import { runAllTestsInDirs } from "../util/runAllTestsInDir"; + +const testDirectories = ["../../libs/cursorless-engine", "../../libs/common"]; export function run(): Promise { - return runAllTestsInDir( - path.resolve(__dirname, "../../libs/cursorless-engine"), + return runAllTestsInDirs( + testDirectories.map((testDirectory) => + path.resolve(__dirname, testDirectory), + ), ); } diff --git a/src/test/util/runAllTestsInDir.ts b/src/test/util/runAllTestsInDir.ts index 238d59fe67..c39a6ab445 100644 --- a/src/test/util/runAllTestsInDir.ts +++ b/src/test/util/runAllTestsInDir.ts @@ -1,9 +1,16 @@ -import * as glob from "glob"; +import * as globRaw from "glob"; import * as Mocha from "mocha"; import * as path from "path"; import { runTestSubset, TEST_SUBSET_GREP_STRING } from "@cursorless/common"; +import { promisify } from "util"; -export function runAllTestsInDir(testsRoot: string): Promise { +const glob = promisify(globRaw); + +export function runAllTestsInDir(testRoot: string) { + return runAllTestsInDirs([testRoot]); +} + +export async function runAllTestsInDirs(testRoots: string[]): Promise { // Create the mocha test const mocha = new Mocha({ ui: "tdd", @@ -11,28 +18,26 @@ export function runAllTestsInDir(testsRoot: string): Promise { grep: runTestSubset() ? TEST_SUBSET_GREP_STRING : undefined, // Only run a subset of tests }); - return new Promise((c, e) => { - glob("**/**.test.js", { cwd: testsRoot }, (err, files) => { - if (err) { - return e(err); - } + for (const testRoot of testRoots) { + const files = await glob("**/**.test.js", { cwd: testRoot }); - // Add files to the test suite - files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f))); + // Add files to the test suite + files.forEach((f) => mocha.addFile(path.resolve(testRoot, f))); + } - try { - // Run the mocha test - mocha.run((failures) => { - if (failures > 0) { - e(new Error(`${failures} tests failed.`)); - } else { - c(); - } - }); - } catch (err) { - console.error(err); - e(err); - } + try { + // Run the mocha test + await new Promise((c, e) => { + mocha.run((failures) => { + if (failures > 0) { + e(new Error(`${failures} tests failed.`)); + } else { + c(); + } + }); }); - }); + } catch (err) { + console.error(err); + throw err; + } } From 07797b5f76702fb91508344b788516f3e7c52137 Mon Sep 17 00:00:00 2001 From: Pokey Rule <755842+pokey@users.noreply.github.com> Date: Wed, 16 Nov 2022 15:50:49 +0000 Subject: [PATCH 80/84] move `openNewEditor` --- .../suite/backwardCompatibility.test.ts | 3 +-- .../suite/breakpoints.test.ts | 5 ++-- .../suite/containingTokenTwice.test.ts | 5 ++-- .../suite/crossCellsSetSelection.test.ts | 8 ++++--- .../suite/editNewCell.test.ts | 9 ++++--- .../cursorless-vscode-e2e/suite/fold.test.ts | 4 ++-- .../suite/followLink.test.ts | 4 ++-- .../suite/intraCellSetSelection.test.ts | 8 ++++--- .../suite/prePhraseSnapshot.test.ts | 4 ++-- .../suite/recorded.test.ts | 24 +++++++++---------- .../suite/scroll.test.ts | 4 ++-- .../suite/toggleDecorations.test.ts | 3 +-- src/libs/vscode-common/index.ts | 1 + .../vscode-common/testUtil}/openNewEditor.ts | 0 14 files changed, 43 insertions(+), 39 deletions(-) rename src/{apps/cursorless-vscode-e2e => libs/vscode-common/testUtil}/openNewEditor.ts (100%) diff --git a/src/apps/cursorless-vscode-e2e/suite/backwardCompatibility.test.ts b/src/apps/cursorless-vscode-e2e/suite/backwardCompatibility.test.ts index 6c79a7bf3c..cc315b63be 100644 --- a/src/apps/cursorless-vscode-e2e/suite/backwardCompatibility.test.ts +++ b/src/apps/cursorless-vscode-e2e/suite/backwardCompatibility.test.ts @@ -1,8 +1,7 @@ import { CURSORLESS_COMMAND_ID } from "@cursorless/common"; -import { getCursorlessApi } from "@cursorless/vscode-common"; +import { getCursorlessApi, openNewEditor } from "@cursorless/vscode-common"; import * as assert from "assert"; import * as vscode from "vscode"; -import { openNewEditor } from "../openNewEditor"; import { endToEndTestSetup } from "../endToEndTestSetup"; suite("Backward compatibility", async function () { diff --git a/src/apps/cursorless-vscode-e2e/suite/breakpoints.test.ts b/src/apps/cursorless-vscode-e2e/suite/breakpoints.test.ts index 0f3d1bbb16..f3424f6794 100644 --- a/src/apps/cursorless-vscode-e2e/suite/breakpoints.test.ts +++ b/src/apps/cursorless-vscode-e2e/suite/breakpoints.test.ts @@ -1,9 +1,8 @@ -import { getCursorlessApi } from "@cursorless/vscode-common"; +import { getCursorlessApi, openNewEditor } from "@cursorless/vscode-common"; import * as assert from "assert"; import * as vscode from "vscode"; -import { openNewEditor } from "../openNewEditor"; -import { runCursorlessCommand } from "../runCommand"; import { endToEndTestSetup } from "../endToEndTestSetup"; +import { runCursorlessCommand } from "../runCommand"; suite("breakpoints", async function () { endToEndTestSetup(this); diff --git a/src/apps/cursorless-vscode-e2e/suite/containingTokenTwice.test.ts b/src/apps/cursorless-vscode-e2e/suite/containingTokenTwice.test.ts index 37852a15ab..2f815e211d 100644 --- a/src/apps/cursorless-vscode-e2e/suite/containingTokenTwice.test.ts +++ b/src/apps/cursorless-vscode-e2e/suite/containingTokenTwice.test.ts @@ -1,9 +1,8 @@ -import { getCursorlessApi } from "@cursorless/vscode-common"; +import { getCursorlessApi, openNewEditor } from "@cursorless/vscode-common"; import { assert } from "chai"; import * as vscode from "vscode"; -import { openNewEditor } from "../openNewEditor"; -import { runCursorlessCommand } from "../runCommand"; import { endToEndTestSetup } from "../endToEndTestSetup"; +import { runCursorlessCommand } from "../runCommand"; // Check that we don't run afoul of stateful regex craziness // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec#finding_successive_matches diff --git a/src/apps/cursorless-vscode-e2e/suite/crossCellsSetSelection.test.ts b/src/apps/cursorless-vscode-e2e/suite/crossCellsSetSelection.test.ts index b6368ee054..ff06d86bb7 100644 --- a/src/apps/cursorless-vscode-e2e/suite/crossCellsSetSelection.test.ts +++ b/src/apps/cursorless-vscode-e2e/suite/crossCellsSetSelection.test.ts @@ -1,9 +1,11 @@ -import { getCursorlessApi } from "@cursorless/vscode-common"; +import { + getCursorlessApi, + openNewNotebookEditor, +} from "@cursorless/vscode-common"; import * as assert from "assert"; import { window } from "vscode"; -import { openNewNotebookEditor } from "../openNewEditor"; +import { endToEndTestSetup, sleepWithBackoff } from "../endToEndTestSetup"; import { runCursorlessCommand } from "../runCommand"; -import { sleepWithBackoff, endToEndTestSetup } from "../endToEndTestSetup"; // Check that setSelection is able to focus the correct cell suite("Cross-cell set selection", async function () { diff --git a/src/apps/cursorless-vscode-e2e/suite/editNewCell.test.ts b/src/apps/cursorless-vscode-e2e/suite/editNewCell.test.ts index 4f69941337..b2d86d9749 100644 --- a/src/apps/cursorless-vscode-e2e/suite/editNewCell.test.ts +++ b/src/apps/cursorless-vscode-e2e/suite/editNewCell.test.ts @@ -1,10 +1,13 @@ -import { getCellIndex, getCursorlessApi } from "@cursorless/vscode-common"; +import { + getCellIndex, + getCursorlessApi, + openNewNotebookEditor, +} from "@cursorless/vscode-common"; import * as assert from "assert"; import { window } from "vscode"; +import { endToEndTestSetup, sleepWithBackoff } from "../endToEndTestSetup"; import { getPlainNotebookContents } from "../notebook"; -import { openNewNotebookEditor } from "../openNewEditor"; import { runCursorlessCommand } from "../runCommand"; -import { sleepWithBackoff, endToEndTestSetup } from "../endToEndTestSetup"; // Check that setSelection is able to focus the correct cell suite("Edit new cell", async function () { diff --git a/src/apps/cursorless-vscode-e2e/suite/fold.test.ts b/src/apps/cursorless-vscode-e2e/suite/fold.test.ts index d352ea0913..b43cc88d4e 100644 --- a/src/apps/cursorless-vscode-e2e/suite/fold.test.ts +++ b/src/apps/cursorless-vscode-e2e/suite/fold.test.ts @@ -1,8 +1,8 @@ import * as assert from "assert"; import * as vscode from "vscode"; -import { openNewEditor } from "../openNewEditor"; -import { runCursorlessCommand } from "../runCommand"; +import { openNewEditor } from "@cursorless/vscode-common"; import { endToEndTestSetup } from "../endToEndTestSetup"; +import { runCursorlessCommand } from "../runCommand"; suite("fold", async function () { endToEndTestSetup(this); diff --git a/src/apps/cursorless-vscode-e2e/suite/followLink.test.ts b/src/apps/cursorless-vscode-e2e/suite/followLink.test.ts index 5910ef50b5..3b02ca822c 100644 --- a/src/apps/cursorless-vscode-e2e/suite/followLink.test.ts +++ b/src/apps/cursorless-vscode-e2e/suite/followLink.test.ts @@ -1,10 +1,10 @@ +import { openNewEditor } from "@cursorless/vscode-common"; import * as assert from "assert"; import * as os from "os"; import * as vscode from "vscode"; +import { endToEndTestSetup } from "../endToEndTestSetup"; import { getFixturePath } from "../getFixturePaths"; -import { openNewEditor } from "../openNewEditor"; import { runCursorlessCommand } from "../runCommand"; -import { endToEndTestSetup } from "../endToEndTestSetup"; suite("followLink", async function () { endToEndTestSetup(this); diff --git a/src/apps/cursorless-vscode-e2e/suite/intraCellSetSelection.test.ts b/src/apps/cursorless-vscode-e2e/suite/intraCellSetSelection.test.ts index 2aca92e2c7..a6c45e5c85 100644 --- a/src/apps/cursorless-vscode-e2e/suite/intraCellSetSelection.test.ts +++ b/src/apps/cursorless-vscode-e2e/suite/intraCellSetSelection.test.ts @@ -1,9 +1,11 @@ -import { getCursorlessApi } from "@cursorless/vscode-common"; +import { + getCursorlessApi, + openNewNotebookEditor, +} from "@cursorless/vscode-common"; import * as assert from "assert"; import { window } from "vscode"; -import { openNewNotebookEditor } from "../openNewEditor"; +import { endToEndTestSetup, sleepWithBackoff } from "../endToEndTestSetup"; import { runCursorlessCommand } from "../runCommand"; -import { sleepWithBackoff, endToEndTestSetup } from "../endToEndTestSetup"; // Check that setSelection is able to focus the correct cell suite("Within cell set selection", async function () { diff --git a/src/apps/cursorless-vscode-e2e/suite/prePhraseSnapshot.test.ts b/src/apps/cursorless-vscode-e2e/suite/prePhraseSnapshot.test.ts index 9963a35977..1a6c466005 100644 --- a/src/apps/cursorless-vscode-e2e/suite/prePhraseSnapshot.test.ts +++ b/src/apps/cursorless-vscode-e2e/suite/prePhraseSnapshot.test.ts @@ -1,13 +1,13 @@ import { + fromVscodeSelection, getCursorlessApi, + openNewEditor, selectionToPlainObject, } from "@cursorless/vscode-common"; import * as assert from "assert"; import * as vscode from "vscode"; -import { fromVscodeSelection } from "@cursorless/vscode-common"; import { endToEndTestSetup } from "../endToEndTestSetup"; import { mockPrePhraseGetVersion } from "../mockPrePhraseGetVersion"; -import { openNewEditor } from "../openNewEditor"; import { runCursorlessCommand } from "../runCommand"; /** diff --git a/src/apps/cursorless-vscode-e2e/suite/recorded.test.ts b/src/apps/cursorless-vscode-e2e/suite/recorded.test.ts index 63c3ab9b92..710ba64ce6 100644 --- a/src/apps/cursorless-vscode-e2e/suite/recorded.test.ts +++ b/src/apps/cursorless-vscode-e2e/suite/recorded.test.ts @@ -1,34 +1,34 @@ +import type { SpyIDE } from "@cursorless/common"; +import { + extractTargetedMarks, + FakeIDE, + serialize, + splitKey, +} from "@cursorless/common"; import { + DEFAULT_TEXT_EDITOR_OPTIONS_FOR_TEST, + ExcludableSnapshotField, getCursorlessApi, marksToPlainObject, + openNewEditor, PositionPlainObject, rangeToPlainObject, SelectionPlainObject, SerializedMarks, - testDecorationsToPlainObject, - DEFAULT_TEXT_EDITOR_OPTIONS_FOR_TEST, - ExcludableSnapshotField, takeSnapshot, + testDecorationsToPlainObject, } from "@cursorless/vscode-common"; -import { - serialize, - splitKey, - extractTargetedMarks, - FakeIDE, -} from "@cursorless/common"; import { assert } from "chai"; import { promises as fsp } from "fs"; import * as yaml from "js-yaml"; import * as vscode from "vscode"; import type { ReadOnlyHatMap } from "../../../core/IndividualHatMap"; -import type { SpyIDE } from "@cursorless/common"; import type { TestCaseFixture } from "../../../testUtil/TestCaseFixture"; import asyncSafety from "../asyncSafety"; +import { endToEndTestSetup, sleepWithBackoff } from "../endToEndTestSetup"; import { getFixturePath, getRecordedTestPaths } from "../getFixturePaths"; -import { openNewEditor } from "../openNewEditor"; import { runCursorlessCommand } from "../runCommand"; import shouldUpdateFixtures from "../shouldUpdateFixtures"; -import { sleepWithBackoff, endToEndTestSetup } from "../endToEndTestSetup"; function createPosition(position: PositionPlainObject) { return new vscode.Position(position.line, position.character); diff --git a/src/apps/cursorless-vscode-e2e/suite/scroll.test.ts b/src/apps/cursorless-vscode-e2e/suite/scroll.test.ts index d24e07dd90..b1d09bb92f 100644 --- a/src/apps/cursorless-vscode-e2e/suite/scroll.test.ts +++ b/src/apps/cursorless-vscode-e2e/suite/scroll.test.ts @@ -1,8 +1,8 @@ +import { openNewEditor } from "@cursorless/vscode-common"; import * as assert from "assert"; import * as vscode from "vscode"; -import { openNewEditor } from "../openNewEditor"; -import { runCursorlessCommand } from "../runCommand"; import { endToEndTestSetup } from "../endToEndTestSetup"; +import { runCursorlessCommand } from "../runCommand"; suite("scroll", async function () { endToEndTestSetup(this); diff --git a/src/apps/cursorless-vscode-e2e/suite/toggleDecorations.test.ts b/src/apps/cursorless-vscode-e2e/suite/toggleDecorations.test.ts index 9b6cd63472..c01a709d6b 100644 --- a/src/apps/cursorless-vscode-e2e/suite/toggleDecorations.test.ts +++ b/src/apps/cursorless-vscode-e2e/suite/toggleDecorations.test.ts @@ -1,7 +1,6 @@ -import { getCursorlessApi } from "@cursorless/vscode-common"; +import { getCursorlessApi, openNewEditor } from "@cursorless/vscode-common"; import * as assert from "assert"; import * as vscode from "vscode"; -import { openNewEditor } from "../openNewEditor"; import { endToEndTestSetup } from "../endToEndTestSetup"; suite("toggle decorations", async function () { diff --git a/src/libs/vscode-common/index.ts b/src/libs/vscode-common/index.ts index d26e620724..e3d331a9df 100644 --- a/src/libs/vscode-common/index.ts +++ b/src/libs/vscode-common/index.ts @@ -2,6 +2,7 @@ export * from "./getExtensionApi"; export * from "./notebook"; export * from "./testUtil/toPlainObject"; export * from "./testUtil/testConstants"; +export * from "./testUtil/openNewEditor"; export * from "./vscodeUtil"; export { takeSnapshot, diff --git a/src/apps/cursorless-vscode-e2e/openNewEditor.ts b/src/libs/vscode-common/testUtil/openNewEditor.ts similarity index 100% rename from src/apps/cursorless-vscode-e2e/openNewEditor.ts rename to src/libs/vscode-common/testUtil/openNewEditor.ts From 4f37f263a210bdd1a310673804ab1ee7cc1e1681 Mon Sep 17 00:00:00 2001 From: Pokey Rule <755842+pokey@users.noreply.github.com> Date: Wed, 16 Nov 2022 15:51:06 +0000 Subject: [PATCH 81/84] Basic `TextLine` test --- src/ide/vscode/textLine.test.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/ide/vscode/textLine.test.ts diff --git a/src/ide/vscode/textLine.test.ts b/src/ide/vscode/textLine.test.ts new file mode 100644 index 0000000000..b1a45dd2bd --- /dev/null +++ b/src/ide/vscode/textLine.test.ts @@ -0,0 +1,13 @@ +import * as assert from "assert"; +import { openNewEditor } from "../../libs/vscode-common/testUtil/openNewEditor"; +import VscodeTextLineImpl from "./VscodeTextLineImpl"; + +suite("TextLine", () => { + test("whitespace line", async () => { + const editor = await openNewEditor(" "); + const line = new VscodeTextLineImpl(editor.document.lineAt(0)); + + assert.equal(line.firstNonWhitespaceCharacterIndex, 3); + assert.equal(line.lastNonWhitespaceCharacterIndex, 0); + }); +}); From 5cdfba5819b4d530e394007eebac44bfe6b29625 Mon Sep 17 00:00:00 2001 From: Pokey Rule <755842+pokey@users.noreply.github.com> Date: Wed, 16 Nov 2022 15:51:17 +0000 Subject: [PATCH 82/84] Selection + more range tests --- src/libs/common/types/range.test.ts | 6 +-- src/libs/common/types/selection.test.ts | 52 +++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 src/libs/common/types/selection.test.ts diff --git a/src/libs/common/types/range.test.ts b/src/libs/common/types/range.test.ts index 315163478c..64e6a84bbd 100644 --- a/src/libs/common/types/range.test.ts +++ b/src/libs/common/types/range.test.ts @@ -9,6 +9,8 @@ suite("Range", () => { assert.equal(new Range(0, 0, 0, 5).end.character, 5); assert.equal(new Range(5, 0, 0, 0).start.line, 0); assert.equal(new Range(0, 5, 0, 0).start.character, 0); + assert.equal(new Range(5, 0, 0, 0).end.line, 5); + assert.equal(new Range(0, 5, 0, 0).end.character, 5); assert.ok( new Range(new Position(1, 2), new Position(3, 4)).isRangeEqual( new Range(1, 2, 3, 4), @@ -18,8 +20,6 @@ suite("Range", () => { test("isEmpty", () => { assert.ok(new Range(0, 0, 0, 0).isEmpty); - assert.ok(!new Range(1, 0, 0, 0).isEmpty); - assert.ok(!new Range(0, 1, 0, 0).isEmpty); assert.ok(!new Range(0, 0, 1, 0).isEmpty); assert.ok(!new Range(0, 0, 0, 1).isEmpty); }); @@ -32,7 +32,7 @@ suite("Range", () => { assert.ok(!new Range(1, 0, 2, 0).isSingleLine); }); - test("isEqual", () => { + test("isRangeEqual", () => { assert.ok(new Range(0, 0, 0, 0).isRangeEqual(new Range(0, 0, 0, 0))); assert.ok(new Range(1, 0, 0, 0).isRangeEqual(new Range(1, 0, 0, 0))); assert.ok(new Range(0, 1, 0, 0).isRangeEqual(new Range(0, 1, 0, 0))); diff --git a/src/libs/common/types/selection.test.ts b/src/libs/common/types/selection.test.ts new file mode 100644 index 0000000000..6d606350e2 --- /dev/null +++ b/src/libs/common/types/selection.test.ts @@ -0,0 +1,52 @@ +import * as assert from "assert"; +import { Position, Selection } from "@cursorless/common"; + +suite("Selection", () => { + test("constructor", () => { + assert.equal(new Selection(5, 0, 10, 0).anchor.line, 5); + assert.equal(new Selection(0, 5, 0, 10).anchor.character, 5); + assert.equal(new Selection(0, 0, 5, 0).active.line, 5); + assert.equal(new Selection(0, 0, 0, 5).active.character, 5); + assert.equal(new Selection(5, 0, 0, 0).active.line, 0); + assert.equal(new Selection(0, 5, 0, 0).active.character, 0); + assert.equal(new Selection(5, 0, 0, 0).anchor.line, 5); + assert.equal(new Selection(0, 5, 0, 0).anchor.character, 5); + assert.ok( + new Selection(new Position(1, 2), new Position(3, 4)).isEqual( + new Selection(1, 2, 3, 4), + ), + ); + }); + + test("isReversed", () => { + assert.ok(!new Selection(0, 0, 0, 0).isReversed); + assert.ok(new Selection(1, 0, 0, 0).isReversed); + assert.ok(new Selection(0, 1, 0, 0).isReversed); + assert.ok(!new Selection(0, 0, 1, 0).isReversed); + assert.ok(!new Selection(0, 0, 0, 1).isReversed); + }); + + test("isEqual", () => { + assert.ok(new Selection(0, 0, 0, 0).isEqual(new Selection(0, 0, 0, 0))); + assert.ok(new Selection(1, 0, 0, 0).isEqual(new Selection(1, 0, 0, 0))); + assert.ok(new Selection(0, 1, 0, 0).isEqual(new Selection(0, 1, 0, 0))); + assert.ok(new Selection(0, 0, 1, 0).isEqual(new Selection(0, 0, 1, 0))); + assert.ok(new Selection(0, 0, 0, 1).isEqual(new Selection(0, 0, 0, 1))); + assert.ok(!new Selection(0, 0, 0, 0).isEqual(new Selection(1, 0, 0, 0))); + assert.ok(!new Selection(0, 0, 0, 0).isEqual(new Selection(0, 1, 0, 0))); + assert.ok(!new Selection(0, 0, 0, 0).isEqual(new Selection(0, 0, 1, 0))); + assert.ok(!new Selection(0, 0, 0, 0).isEqual(new Selection(0, 0, 0, 1))); + assert.ok(!new Selection(0, 0, 0, 1).isEqual(new Selection(0, 1, 0, 0))); + }); + + test("isRangeEqual", () => { + assert.ok( + new Selection(0, 0, 0, 1).isRangeEqual(new Selection(0, 1, 0, 0)), + ); + }); + + test("toSelection", () => { + assert.ok(new Selection(1, 2, 3, 4).toSelection(true).isReversed); + assert.ok(!new Selection(1, 2, 3, 4).toSelection(false).isReversed); + }); +}); From 62328ad0b2674177b5cafd3c2643cc4db31e1cd4 Mon Sep 17 00:00:00 2001 From: Pokey Rule <755842+pokey@users.noreply.github.com> Date: Wed, 16 Nov 2022 15:51:39 +0000 Subject: [PATCH 83/84] yarn.lock tweak --- yarn.lock | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 8531069d6f..92eb651052 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1236,10 +1236,9 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -"license-checker@git+https://github.com/mwittig/license-checker.git#d546e3f738e14c62e732346fa355162d46700893": +"license-checker@git+https://github.com/mwittig/license-checker#d546e3f738e14c62e732346fa355162d46700893": version "1.0.0" - resolved "git+ssh://git@github.com/mwittig/license-checker.git#d546e3f738e14c62e732346fa355162d46700893" - integrity sha512-CeZEQfhSiqkTkY6wbGFBo3ki7iMSo4+m46xjZ0Ou84CbEu8fhoFaz8H8Nsr/KtPscdQeZNFgdgWWUPKikKDupg== + resolved "git+https://github.com/mwittig/license-checker#d546e3f738e14c62e732346fa355162d46700893" dependencies: chalk "~0.5.1" mkdirp "^0.3.5" From dfa7cd27e5edd06d31a0523426df798a7ef839e6 Mon Sep 17 00:00:00 2001 From: Pokey Rule <755842+pokey@users.noreply.github.com> Date: Wed, 16 Nov 2022 16:12:39 +0000 Subject: [PATCH 84/84] more line tests --- src/ide/vscode/textLine.test.ts | 37 +++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/src/ide/vscode/textLine.test.ts b/src/ide/vscode/textLine.test.ts index b1a45dd2bd..713850e157 100644 --- a/src/ide/vscode/textLine.test.ts +++ b/src/ide/vscode/textLine.test.ts @@ -2,12 +2,37 @@ import * as assert from "assert"; import { openNewEditor } from "../../libs/vscode-common/testUtil/openNewEditor"; import VscodeTextLineImpl from "./VscodeTextLineImpl"; +/** + * Each test is of the form: + * + * `[text, firstNonWhitespaceCharacterIndex, lastNonWhitespaceCharacterIndex]` + */ +const whiteSpaceTests: [string, number, number][] = [ + [" ", 3, 0], + ["foo", 0, 3], + [" foo ", 1, 4], +]; + suite("TextLine", () => { - test("whitespace line", async () => { - const editor = await openNewEditor(" "); - const line = new VscodeTextLineImpl(editor.document.lineAt(0)); + whiteSpaceTests.forEach( + ([ + text, + firstNonWhitespaceCharacterIndex, + lastNonWhitespaceCharacterIndex, + ]) => { + test(`whitespace '${text}'`, async () => { + const editor = await openNewEditor(text); + const line = new VscodeTextLineImpl(editor.document.lineAt(0)); - assert.equal(line.firstNonWhitespaceCharacterIndex, 3); - assert.equal(line.lastNonWhitespaceCharacterIndex, 0); - }); + assert.equal( + line.firstNonWhitespaceCharacterIndex, + firstNonWhitespaceCharacterIndex, + ); + assert.equal( + line.lastNonWhitespaceCharacterIndex, + lastNonWhitespaceCharacterIndex, + ); + }); + }, + ); });