misc: improve internal dependencies

this allows, after merging the api into a single file, the import of Dance without cyclic dependencies
This commit is contained in:
Grégoire Geis 2021-07-20 18:35:37 +02:00
parent 08199c526e
commit 700fdebe11
56 changed files with 1138 additions and 624 deletions

101
.dependency-cruiser.js Normal file
View File

@ -0,0 +1,101 @@
/** @type import("dependency-cruiser").IConfiguration */
module.exports = {
forbidden: [
{
name: "no-circular",
severity: "error",
from: {
pathNot: "^src/api",
},
to: {
circular: true,
},
},
{
name: "api-only-depends-on-api/index-and-utils",
severity: "error",
from: {
path: "^src/api/(?!index)",
},
to: {
pathNot: "^src/(api/index|utils)",
},
},
{
name: "api/index-only-depends-on-api",
severity: "error",
from: {
path: "^src/api/index",
},
to: {
pathNot: "^src/api",
},
},
{
name: "only-api/index-depends-on-api",
severity: "error",
from: {
pathNot: "^src/api/index",
},
to: {
path: "^src/api/(?!index)",
},
},
{
name: "commands-do-not-depend-on-each-other",
severity: "error",
from: {
path: "^src/commands(?!/load-all)",
},
to: {
path: "^src/commands",
},
},
{
name: "utils-only-depends-on-utils",
severity: "error",
from: {
path: "^src/utils",
},
to: {
pathNot: "^src/(utils|state/recorder)", // exception for state/recorder.ts
},
},
{
name: "only-tests-depend-on-tests",
severity: "error",
from: {
pathNot: "^test",
},
to: {
path: "^test",
},
},
{
name: "no-orphans",
severity: "warn",
from: {
orphan: true,
pathNot: [
"(^|/)\\.[^/]+\\.(js|cjs|mjs|ts|json)$", // dot files
"\\.d\\.ts$", // TypeScript declaration files
"(^|/)tsconfig\\.json$", // TypeScript config
"meta\\.ts$|\\.build\\.ts$", // build files
],
},
to: {},
},
],
options: {
exclude : {
path: "\\.build\\.ts$",
},
includeOnly : "^src",
tsConfig: {
fileName: "tsconfig.json",
},
tsPreCompilationDeps: false,
},
};

View File

@ -8,7 +8,7 @@ module.exports = {
ecmaVersion: 2019,
sourceType: "module",
},
ignorePatterns: ["*.js"],
ignorePatterns: ["out/", "*.js"],
overrides: [
{
files: ["commands/index.ts"],

View File

@ -103,7 +103,7 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({
},
scripts: {
"check": "eslint .",
"check": "eslint . && depcruise -v .dependency-cruiser.js src",
"format": "eslint . --fix",
"generate": "ts-node ./meta.ts",
"generate:watch": "ts-node ./meta.ts --watch",
@ -123,6 +123,7 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({
"@typescript-eslint/eslint-plugin": "^4.18.0",
"@typescript-eslint/parser": "^4.18.0",
"chokidar": "^3.5.1",
"dependency-cruiser": "^10.0.5",
"eslint": "^7.22.0",
"glob": "^7.1.6",
"mocha": "^8.1.1",
@ -144,7 +145,7 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({
icon: "assets/dance.png",
activationEvents: ["*"],
extensionKind: ["ui", "workspace"],
extensionKind: ["ui", "web", "workspace"],
// Dance-specific properties.
// ==========================================================================

4
package.json generated
View File

@ -16,7 +16,7 @@
"vscode": "^1.56.0"
},
"scripts": {
"check": "eslint .",
"check": "eslint . && depcruise -v .dependency-cruiser.js src",
"format": "eslint . --fix",
"generate": "ts-node ./meta.ts",
"generate:watch": "ts-node ./meta.ts --watch",
@ -35,6 +35,7 @@
"@typescript-eslint/eslint-plugin": "^4.18.0",
"@typescript-eslint/parser": "^4.18.0",
"chokidar": "^3.5.1",
"dependency-cruiser": "^10.0.5",
"eslint": "^7.22.0",
"glob": "^7.1.6",
"mocha": "^8.1.1",
@ -58,6 +59,7 @@
],
"extensionKind": [
"ui",
"web",
"workspace"
],
"dance.disableArbitraryCodeExecution": false,

View File

@ -1,5 +1,6 @@
import * as vscode from "vscode";
import { Context } from "./context";
import { Context } from ".";
/**
* Copies the given text to the clipboard.

View File

@ -1,11 +1,11 @@
import * as vscode from "vscode";
import { EditNotAppliedError, EditorRequiredError } from "./errors";
import { Selections } from "./selections";
import { CommandDescriptor } from "../commands";
import { PerEditorState } from "../state/editors";
import { Extension } from "../state/extension";
import { Mode, SelectionBehavior } from "../state/modes";
import { SelectionBehavior, Selections } from ".";
import type { CommandDescriptor } from "../commands";
import type { PerEditorState } from "../state/editors";
import type { Extension } from "../state/extension";
import type { Mode } from "../state/modes";
import { EditNotAppliedError, EditorRequiredError } from "../utils/errors";
import { noUndoStops, performDummyEdit } from "../utils/misc";
let currentContext: ContextWithoutActiveEditor | undefined;
@ -17,9 +17,11 @@ const enum ContextFlags {
}
/**
* @see Context.WithoutActiveEditor
* See {@link Context.WithoutActiveEditor} instead.
*
* @internal
*/
class ContextWithoutActiveEditor {
export class ContextWithoutActiveEditor {
/**
* Returns the current execution context, or throws an error if called outside
* of an execution context.

View File

@ -1,9 +1,7 @@
import * as vscode from "vscode";
import { Context, edit, Positions, Selections } from "..";
import { TrackedSelection } from "../../utils/tracked-selection";
import { Context, edit } from "../context";
import { Positions } from "../positions";
import { rotateSelections, Selections } from "../selections";
const enum Constants {
PositionMask = 0b00_11_1,
@ -786,6 +784,6 @@ export namespace rotate {
* ```
*/
export function selectionsOnly(by: number, selections?: readonly vscode.Selection[]) {
Selections.set(rotateSelections(by, selections));
Selections.set(Selections.rotate(by, selections));
}
}

View File

@ -1,6 +1,6 @@
import * as vscode from "vscode";
import { Context, edit } from "../context";
import { Context, edit } from "..";
import { blankCharacters } from "../../utils/charset";
/**

View File

@ -1,24 +1,6 @@
import * as vscode from "vscode";
import { Context } from "./context";
import { PerEditorState } from "../state/editors";
import { Context } from ".";
/**
* Asserts that the given condition is true.
*/
export function assert(condition: boolean): asserts condition {
if (!condition) {
const error = new Error(
"internal assertion failed; please report this error on https://github.com/71/dance/issues. "
+ "its stacktrace is available in the developer console (Command Palette > Open Developer "
+ "Tools).",
);
// Log error to ensure its stacktrace can be found.
console.error(error);
throw error;
}
}
export * from "../utils/errors";
/**
* Throws an exception indicating that the caller is not implemented yet.
@ -32,183 +14,3 @@ export function todo(): never {
throw new Error("function not implemented");
}
/**
* An error thrown when no selections remain.
*/
export class EmptySelectionsError extends Error {
public constructor(message = "no selections remain") {
super(message);
}
/**
* Throws if the given selections are empty.
*/
public static throwIfEmpty(selections: readonly vscode.Selection[]) {
if (selections.length === 0) {
throw new EmptySelectionsError();
}
}
/**
* Throws if the selections of the given register are empty.
*/
public static throwIfRegisterIsEmpty<T>(
selections: readonly T[] | undefined,
registerName: string,
): asserts selections is readonly T[] {
if (selections === undefined || selections.length === 0) {
throw new EmptySelectionsError(`no selections are saved in register "${registerName}"`);
}
}
}
/**
* Error thrown when a given argument is not as expected.
*/
export class ArgumentError extends Error {
public constructor(message: string, public readonly argumentName?: string) {
super(message);
}
public static validate(
argumentName: string,
condition: boolean,
message: string | (() => string),
): asserts condition {
if (!condition) {
if (typeof message === "function") {
message = message();
}
throw new ArgumentError(message, argumentName);
}
}
}
/**
* Error thrown when a user input is not as expected.
*/
export class InputError extends ArgumentError {
public constructor(message: string) {
super(message, "input");
}
public static validateInput(
condition: boolean,
message: string,
): asserts condition {
if (!condition) {
throw new this(message);
}
}
}
/**
* Error thrown when a function that is expected to return a selection returns
* something else.
*/
export class NotASelectionError extends ArgumentError {
public constructor(public readonly value: unknown) {
super("value is not a selection");
}
/**
* Throws if the given value is not a `vscode.Selection`.
*/
public static throwIfNotASelection(value: unknown): asserts value is vscode.Selection {
if (!(value instanceof vscode.Selection)) {
throw new NotASelectionError(value);
}
}
/**
* Throws if the given list contains a value that is not a `vscode.Selection`,
* or if the list is empty.
*/
public static throwIfNotASelectionArray(value: unknown): asserts value is vscode.Selection[] {
if (!Array.isArray(value) || value.length === 0) {
throw new EmptySelectionsError();
}
for (let i = 0, len = value.length; i < len; i++) {
NotASelectionError.throwIfNotASelection(value[i]);
}
}
}
/**
* Error thrown when an action requiring an editor is executed without an
* active `vscode.TextEditor`.
*/
export class EditorRequiredError extends Error {
public constructor() {
super("active editor required");
}
public static throwUnlessAvailable<T extends PerEditorState | vscode.TextEditor>(
editorState: T | undefined,
): asserts editorState is T {
if (editorState === undefined) {
throw new EditorRequiredError();
}
}
}
/**
* Error thrown when a cancellation is requested.
*/
export class CancellationError extends Error {
public constructor(
public readonly reason: CancellationError.Reason,
) {
super(reason);
}
public static throwIfCancellationRequested(token: vscode.CancellationToken) {
if (token.isCancellationRequested) {
throw new CancellationError(CancellationError.Reason.CancellationToken);
}
}
}
export namespace CancellationError {
export const enum Reason {
CancellationToken = "cancellation token was used",
PressedEscape = "user pressed <escape>",
}
}
/**
* Error thrown when two arrays that are expected to have the same length have
* different lengths
*/
export class LengthMismatchError extends Error {
public constructor() {
super("length mismatch");
}
public static throwIfLengthMismatch<A, B>(a: readonly A[], b: readonly B[]) {
if (a.length !== b.length) {
throw new LengthMismatchError();
}
}
}
/**
* An error thrown when a `TextEditor.edit` call returns `false`.
*/
export class EditNotAppliedError extends Error {
public constructor() {
super("TextEditor edit failed");
}
/**
* Throws if the given value is `false`.
*/
public static throwIfNotApplied(editWasApplied: boolean): asserts editWasApplied {
if (!editWasApplied) {
throw new EditNotAppliedError();
}
}
}

View File

@ -1,6 +1,6 @@
import * as vscode from "vscode";
import { Context } from "./context";
import { Context } from ".";
/**
* Un-does the last action.

View File

@ -59,6 +59,20 @@ export const enum Shift {
Extend,
}
/**
* Selection behavior of an operation.
*/
export const enum SelectionBehavior {
/**
* VS Code-like caret selections.
*/
Caret = 1,
/**
* Kakoune-like character selections.
*/
Character = 2,
}
export const Forward = Direction.Forward,
Backward = Direction.Backward,
Jump = Shift.Jump,

View File

@ -1,7 +1,6 @@
import * as vscode from "vscode";
import { Context } from "./context";
import { assert } from "./errors";
import { Context } from ".";
/**
* Returns the 0-based number of the first visible line in the current editor.

View File

@ -1,8 +1,6 @@
import * as vscode from "vscode";
import { Context, prompt } from ".";
import { CancellationError } from "./errors";
import { keypress } from "./prompt";
import { Context, keypress, prompt } from ".";
export interface Menu {
readonly items: Menu.Items;

View File

@ -1,4 +1,4 @@
import { Context } from "./context";
import { Context } from ".";
/**
* Switches to the mode with the given name.

View File

@ -1,7 +1,6 @@
import * as vscode from "vscode";
import { Direction } from ".";
import { Context } from "./context";
import { Context, Direction } from ".";
/**
* Returns the position right after the given position, or `undefined` if

View File

@ -1,7 +1,8 @@
import * as vscode from "vscode";
import { Context } from "../api";
import { CancellationError } from "./errors";
import { Context, Selections } from ".";
import type { Input, SetInput } from "../commands";
import { CancellationError } from "../utils/errors";
const actionEvent = new vscode.EventEmitter<Parameters<typeof prompt.notifyActionRequested>[0]>();
@ -299,6 +300,34 @@ export namespace prompt {
);
}
/**
* @internal
*/
export async function manipulateSelectionsInteractively<I, R>(
_: Context,
input: Input<I>,
setInput: SetInput<R>,
interactive: boolean,
options: prompt.Options,
f: (input: string | I, selections: readonly vscode.Selection[]) => Thenable<R>,
) {
const selections = _.selections;
function execute(input: string | I) {
return _.runAsync(() => f(input, selections));
}
function undo() {
Selections.set(selections);
}
if (input === undefined) {
setInput(await prompt.interactive(execute, undo, options, interactive));
} else {
await execute(input);
}
}
export type ListPair = readonly [string, string];
/**

View File

@ -1,6 +1,7 @@
import * as vscode from "vscode";
import { Register } from "../state/registers";
import { Context } from "./context";
import { Context } from ".";
import type { Register } from "../state/registers";
/**
* Returns the `i`th string in the register with the given name, or `undefined`

View File

@ -1,8 +1,8 @@
import * as vscode from "vscode";
import * as api from ".";
import { CommandDescriptor } from "../commands";
import { Context } from ".";
import type { CommandDescriptor } from "../commands";
import { parseRegExpWithReplacement } from "../utils/regexp";
import { Context } from "./context";
/**
* Runs the given string of JavaScript code.
@ -47,25 +47,33 @@ export function run(strings: string | readonly string[], context: object = {}) {
const cachedParameterNames = [] as string[],
cachedParameters = [] as unknown[];
let globalsObject: Record<string, any> = {};
function ensureCacheIsPopulated() {
if (cachedParameterNames.length > 0) {
return;
}
for (const name in api) {
for (const name in globalsObject) {
cachedParameterNames.push(name);
cachedParameters.push((api as any)[name]);
cachedParameters.push(globalsObject[name]);
}
cachedParameterNames.push("vscode");
cachedParameters.push(vscode);
Object.freeze(cachedParameterNames);
Object.freeze(cachedParameters);
}
export namespace run {
/**
* Sets the globals available within {@link run} expressions.
*/
export function setGlobals(globals: object) {
cachedParameterNames.length = 0;
cachedParameters.length = 0;
globalsObject = globals;
}
/**
* Returns the parameter names given to dynamically run functions.
*/
@ -105,7 +113,7 @@ export namespace run {
async function () {}.constructor as any,
functionCache = new Map<string, CachedFunction>();
type CachedFunction = [function: CompiledFunction, lastAccessTimestamp: number];
type CachedFunction = [funct: CompiledFunction, lastAccessTimestamp: number];
/**
* A few common inputs.

View File

@ -1,8 +1,7 @@
import * as vscode from "vscode";
import * as regexp from "../../utils/regexp";
import { Context, Direction } from "..";
import { Positions } from "../positions";
import { Context, Direction, Positions } from "..";
import { canMatchLineFeed, execLast, matchesStaticStrings } from "../../utils/regexp";
/**
* Searches backward or forward for a pattern starting at the given position.
@ -72,13 +71,13 @@ export namespace search {
}
if (possibleSearchLength > 2_000) {
const staticMatches = regexp.matchesStaticStrings(re);
const staticMatches = matchesStaticStrings(re);
if (staticMatches !== undefined) {
return searchOneOfBackward(re, staticMatches, origin, end, document);
}
if (!regexp.canMatchLineFeed(re)) {
if (!canMatchLineFeed(re)) {
return searchSingleLineRegExpBackward(re, origin, end, document);
}
}
@ -132,13 +131,13 @@ export namespace search {
}
if (possibleSearchLength > 2_000) {
const staticMatches = regexp.matchesStaticStrings(re);
const staticMatches = matchesStaticStrings(re);
if (staticMatches !== undefined) {
return searchOneOfForward(re, staticMatches, origin, end, document);
}
if (!regexp.canMatchLineFeed(re)) {
if (!canMatchLineFeed(re)) {
return searchSingleLineRegExpForward(re, origin, end, document);
}
}
@ -177,7 +176,7 @@ function searchNaiveBackward(
// Find all matches before the origin and take the last one.
const searchRange = new vscode.Range(end, origin),
match = regexp.execLast(re, document.getText(searchRange));
match = execLast(re, document.getText(searchRange));
if (match === null) {
return;
@ -217,7 +216,7 @@ function searchSingleLineRegExpBackward(
// Loop for a match line by line, starting at the current line.
const currentLine = document.lineAt(origin),
match = regexp.execLast(re, currentLine.text.slice(0, origin.character));
match = execLast(re, currentLine.text.slice(0, origin.character));
if (match !== null) {
return [new vscode.Position(origin.line, match.index), match] as search.Result;
@ -227,14 +226,14 @@ function searchSingleLineRegExpBackward(
for (let line = origin.line - 1; line > endLine; line--) {
const textLine = document.lineAt(line),
match = regexp.execLast(re, textLine.text);
match = execLast(re, textLine.text);
if (match !== null) {
return [new vscode.Position(line, match.index), match] as search.Result;
}
}
const endMatch = regexp.execLast(re, document.lineAt(endLine).text.slice(end.character));
const endMatch = execLast(re, document.lineAt(endLine).text.slice(end.character));
if (endMatch !== null) {
const endCharacter = end.character + endMatch.index;

View File

@ -1,8 +1,6 @@
import * as vscode from "vscode";
import { Context } from "../context";
import { Positions } from "../positions";
import { lineByLine } from "./move";
import { Context, lineByLine, Positions } from "..";
/**
* Returns the range of lines matching the given `RegExp` before and after

View File

@ -1,7 +1,6 @@
import * as vscode from "vscode";
import { Context, Direction } from "..";
import { Positions } from "../positions";
import { Context, Direction, Positions } from "..";
/**
* Moves the given position towards the given direction until the given string

View File

@ -1,7 +1,6 @@
import * as vscode from "vscode";
import { Context, Direction } from "..";
import { Positions } from "../positions";
import { Context, Direction, Positions } from "..";
/**
* Moves the given position towards the given direction as long as the given

View File

@ -1,10 +1,8 @@
import * as vscode from "vscode";
import { search } from ".";
import { Direction } from "..";
import { Context, Direction, Positions, search } from "..";
import { ArgumentError } from "../../utils/errors";
import { anyRegExp, escapeForRegExp } from "../../utils/regexp";
import { Context } from "../context";
import { ArgumentError } from "../errors";
import { Positions } from "../positions";
/**
* A pair of opening and closing patterns.

View File

@ -1,12 +1,8 @@
import * as vscode from "vscode";
import { CharCodes } from "../../utils/regexp";
import { Direction } from "..";
import { Context } from "../context";
import { Positions } from "../positions";
import { moveWhile } from "./move";
import { Context, Direction, Lines, moveWhile, Positions } from "..";
import { CharSet, getCharSetFunction } from "../../utils/charset";
import { Lines } from "../lines";
import { CharCodes } from "../../utils/regexp";
export namespace Range {
/**
@ -30,7 +26,7 @@ export namespace Range {
}
/**
* A function that, given a position, returns the range of teh object to which
* A function that, given a position, returns the range of the object to which
* the position belongs.
*/
export interface Seek {

View File

@ -1,9 +1,7 @@
import * as vscode from "vscode";
import { Direction, skipEmptyLines } from "..";
import { SelectionBehavior } from "../../state/modes";
import { Context, Direction, SelectionBehavior, skipEmptyLines } from "..";
import { CharSet, getCharSetFunction } from "../../utils/charset";
import { Context } from "../context";
const enum WordCategory {
Word,

View File

@ -1,12 +1,7 @@
import * as vscode from "vscode";
import { Direction, Shift } from ".";
import { Context } from "./context";
import { NotASelectionError } from "./errors";
import { Positions } from "./positions";
import { Context, Direction, Lines, NotASelectionError, Positions, SelectionBehavior, Shift } from ".";
import { execRange, splitRange } from "../utils/regexp";
import { Lines } from "./lines";
import { SelectionBehavior } from "../state/modes";
/**
* Sets the selections of the given editor.

332
src/commands/README.md generated
View File

@ -21,18 +21,18 @@
<tr><td><a href="#editcopyIndentation"><code>edit.copyIndentation</code></a></td><td>Copy indentation</td><td><code>Shift+Alt+7</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="#editdeindent"><code>edit.deindent</code></a></td><td>Deindent selected lines</td><td><code>Shift+Alt+,</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="#editdeindentwithIncomplete"><code>edit.deindent.withIncomplete</code></a></td><td>Deindent selected lines (including incomplete indent)</td><td><code>Shift+,</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./edit.ts#L45"><code>edit.delete</code></a></td><td>Delete</td><td><code>Alt+D</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./edit.ts#L46"><code>edit.delete-insert</code></a></td><td>Delete and switch to Insert</td><td><code>Alt+C</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./edit.ts#L343"><code>edit.newLine.above.insert</code></a></td><td>Insert new line above and switch to insert</td><td><code>Shift+O</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./edit.ts#L378"><code>edit.newLine.below.insert</code></a></td><td>Insert new line below and switch to insert</td><td><code>O</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./edit.ts#L42"><code>edit.paste.after</code></a></td><td>Paste after</td><td><code>P</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./edit.ts#L44"><code>edit.paste.after.select</code></a></td><td>Paste after and select</td><td><code>Alt+P</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./edit.ts#L41"><code>edit.paste.before</code></a></td><td>Paste before</td><td><code>Shift+P</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./edit.ts#L43"><code>edit.paste.before.select</code></a></td><td>Paste before and select</td><td><code>Shift+Alt+P</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./edit.ts#L40"><code>edit.selectRegister-insert</code></a></td><td>Pick register and replace</td><td><code>Ctrl+R</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Ctrl+R</code> (<code>editorTextFocus && dance.mode == 'insert'</code>)</td></tr>
<tr><td><a href="./edit.ts#L47"><code>edit.yank-delete</code></a></td><td>Copy and delete</td><td><code>D</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./edit.ts#L48"><code>edit.yank-delete-insert</code></a></td><td>Copy, delete and switch to Insert</td><td><code>C</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./edit.ts#L49"><code>edit.yank-replace</code></a></td><td>Copy and replace</td><td><code>Shift+R</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./edit.ts#L33"><code>edit.delete</code></a></td><td>Delete</td><td><code>Alt+D</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./edit.ts#L34"><code>edit.delete-insert</code></a></td><td>Delete and switch to Insert</td><td><code>Alt+C</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./edit.ts#L331"><code>edit.newLine.above.insert</code></a></td><td>Insert new line above and switch to insert</td><td><code>Shift+O</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./edit.ts#L366"><code>edit.newLine.below.insert</code></a></td><td>Insert new line below and switch to insert</td><td><code>O</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./edit.ts#L30"><code>edit.paste.after</code></a></td><td>Paste after</td><td><code>P</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./edit.ts#L32"><code>edit.paste.after.select</code></a></td><td>Paste after and select</td><td><code>Alt+P</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./edit.ts#L29"><code>edit.paste.before</code></a></td><td>Paste before</td><td><code>Shift+P</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./edit.ts#L31"><code>edit.paste.before.select</code></a></td><td>Paste before and select</td><td><code>Shift+Alt+P</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./edit.ts#L28"><code>edit.selectRegister-insert</code></a></td><td>Pick register and replace</td><td><code>Ctrl+R</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Ctrl+R</code> (<code>editorTextFocus && dance.mode == 'insert'</code>)</td></tr>
<tr><td><a href="./edit.ts#L35"><code>edit.yank-delete</code></a></td><td>Copy and delete</td><td><code>D</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./edit.ts#L36"><code>edit.yank-delete-insert</code></a></td><td>Copy, delete and switch to Insert</td><td><code>C</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./edit.ts#L37"><code>edit.yank-replace</code></a></td><td>Copy and replace</td><td><code>Shift+R</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="#editindent"><code>edit.indent</code></a></td><td>Indent selected lines</td><td><code>Shift+.</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="#editindentwithEmpty"><code>edit.indent.withEmpty</code></a></td><td>Indent selected lines (including empty lines)</td><td><code>Shift+Alt+.</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="#editinsert"><code>edit.insert</code></a></td><td>Insert contents of register</td><td><code>Shift+Alt+R</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
@ -41,8 +41,8 @@
<tr><td><a href="#editnewLineabove"><code>edit.newLine.above</code></a></td><td>Insert new line above each selection</td><td><code>Shift+Alt+O</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="#editnewLinebelow"><code>edit.newLine.below</code></a></td><td>Insert new line below each selection</td><td><code>Alt+O</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="#editreplaceCharacters"><code>edit.replaceCharacters</code></a></td><td>Replace characters</td><td><code>R</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td rowspan=11><a href="#history"><code>history</code></a></td><td><a href="./history.ts#L57"><code>history.repeat.seek</code></a></td><td>Repeat last seek</td><td><code>Alt+.</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./history.ts#L56"><code>history.repeat.selection</code></a></td><td>Repeat last selection change</td><td></td></tr>
<tr><td rowspan=11><a href="#history"><code>history</code></a></td><td><a href="./history.ts#L58"><code>history.repeat.seek</code></a></td><td>Repeat last seek</td><td><code>Alt+.</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./history.ts#L57"><code>history.repeat.selection</code></a></td><td>Repeat last selection change</td><td></td></tr>
<tr><td><a href="#historyrecordingplay"><code>history.recording.play</code></a></td><td>Replay recording</td><td><code>Q</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="#historyrecordingstart"><code>history.recording.start</code></a></td><td>Start recording</td><td><code>Shift+Q</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="#historyrecordingstop"><code>history.recording.stop</code></a></td><td>Stop recording</td><td><code>Escape</code> (<code>editorTextFocus && dance.mode == 'normal' && dance.isRecording</code>)</td></tr>
@ -73,48 +73,48 @@
<tr><td><a href="#modessettemporarily"><code>modes.set.temporarily</code></a></td><td>Set Dance mode temporarily</td><td></td></tr>
<tr><td rowspan=10><a href="#search"><code>search</code></a></td><td><a href="#searchnext"><code>search.next</code></a></td><td>Select next match</td><td><code>N</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="#searchsearch"><code>search.search</code></a></td><td>Search</td><td><code>/</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./search.ts#L26"><code>search.backward</code></a></td><td>Search backward</td><td><code>Alt+/</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./search.ts#L27"><code>search.backward.extend</code></a></td><td>Search backward (extend)</td><td><code>Shift+Alt+/</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./search.ts#L25"><code>search.extend</code></a></td><td>Search (extend)</td><td><code>Shift+/</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./search.ts#L162"><code>search.next.add</code></a></td><td>Add next match</td><td><code>Shift+N</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./search.ts#L163"><code>search.previous</code></a></td><td>Select previous match</td><td><code>Alt+N</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./search.ts#L164"><code>search.previous.add</code></a></td><td>Add previous match</td><td><code>Shift+Alt+N</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./search.ts#L94"><code>search.selection.smart</code></a></td><td>Search current selection (smart)</td><td><code>Shift+8</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./search.ts#L24"><code>search.backward</code></a></td><td>Search backward</td><td><code>Alt+/</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./search.ts#L25"><code>search.backward.extend</code></a></td><td>Search backward (extend)</td><td><code>Shift+Alt+/</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./search.ts#L23"><code>search.extend</code></a></td><td>Search (extend)</td><td><code>Shift+/</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./search.ts#L160"><code>search.next.add</code></a></td><td>Add next match</td><td><code>Shift+N</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./search.ts#L161"><code>search.previous</code></a></td><td>Select previous match</td><td><code>Alt+N</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./search.ts#L162"><code>search.previous.add</code></a></td><td>Add previous match</td><td><code>Shift+Alt+N</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./search.ts#L92"><code>search.selection.smart</code></a></td><td>Search current selection (smart)</td><td><code>Shift+8</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="#searchselection"><code>search.selection</code></a></td><td>Search current selection</td><td><code>Shift+Alt+8</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td rowspan=35><a href="#seek"><code>seek</code></a></td><td><a href="#seekenclosing"><code>seek.enclosing</code></a></td><td>Select to next enclosing character</td><td><code>M</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="#seekobject"><code>seek.object</code></a></td><td>Select object</td><td></td></tr>
<tr><td><a href="#seekseek"><code>seek.seek</code></a></td><td>Select to character (excluded)</td><td><code>T</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L255"><code>seek.askObject</code></a></td><td>Select whole object</td><td><code>Alt+A</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Alt+A</code> (<code>editorTextFocus && dance.mode == 'insert'</code>)</td></tr>
<tr><td><a href="./seek.ts#L261"><code>seek.askObject.end</code></a></td><td>Select to whole object end</td><td><code>]</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L262"><code>seek.askObject.end.extend</code></a></td><td>Extend to whole object end</td><td><code>Shift+]</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L256"><code>seek.askObject.inner</code></a></td><td>Select inner object</td><td><code>Alt+I</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Alt+I</code> (<code>editorTextFocus && dance.mode == 'insert'</code>)</td></tr>
<tr><td><a href="./seek.ts#L263"><code>seek.askObject.inner.end</code></a></td><td>Select to inner object end</td><td><code>Alt+]</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L264"><code>seek.askObject.inner.end.extend</code></a></td><td>Extend to inner object end</td><td><code>Shift+Alt+]</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L259"><code>seek.askObject.inner.start</code></a></td><td>Select to inner object start</td><td><code>Alt+[</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L260"><code>seek.askObject.inner.start.extend</code></a></td><td>Extend to inner object start</td><td><code>Shift+Alt+[</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L257"><code>seek.askObject.start</code></a></td><td>Select to whole object start</td><td><code>[</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L258"><code>seek.askObject.start.extend</code></a></td><td>Extend to whole object start</td><td><code>Shift+[</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L26"><code>seek.backward</code></a></td><td>Select to character (excluded, backward)</td><td><code>Alt+T</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L91"><code>seek.enclosing.backward</code></a></td><td>Select to previous enclosing character</td><td><code>Alt+M</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L90"><code>seek.enclosing.extend</code></a></td><td>Extend to next enclosing character</td><td><code>Shift+M</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L92"><code>seek.enclosing.extend.backward</code></a></td><td>Extend to previous enclosing character</td><td><code>Shift+Alt+M</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L25"><code>seek.extend</code></a></td><td>Extend to character (excluded)</td><td><code>Shift+T</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L27"><code>seek.extend.backward</code></a></td><td>Extend to character (excluded, backward)</td><td><code>Shift+Alt+T</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L28"><code>seek.included</code></a></td><td>Select to character (included)</td><td><code>F</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L30"><code>seek.included.backward</code></a></td><td>Select to character (included, backward)</td><td><code>Alt+F</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L29"><code>seek.included.extend</code></a></td><td>Extend to character (included)</td><td><code>Shift+F</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L31"><code>seek.included.extend.backward</code></a></td><td>Extend to character (included, backward)</td><td><code>Shift+Alt+F</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L170"><code>seek.word.backward</code></a></td><td>Select to previous word start</td><td><code>B</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L169"><code>seek.word.extend</code></a></td><td>Extend to next word start</td><td><code>Shift+W</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L171"><code>seek.word.extend.backward</code></a></td><td>Extend to previous word start</td><td><code>Shift+B</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L172"><code>seek.word.ws</code></a></td><td>Select to next non-whitespace word start</td><td><code>Alt+W</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L174"><code>seek.word.ws.backward</code></a></td><td>Select to previous non-whitespace word start</td><td><code>Alt+B</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L173"><code>seek.word.ws.extend</code></a></td><td>Extend to next non-whitespace word start</td><td><code>Shift+Alt+W</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L175"><code>seek.word.ws.extend.backward</code></a></td><td>Extend to previous non-whitespace word start</td><td><code>Shift+Alt+B</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L176"><code>seek.wordEnd</code></a></td><td>Select to next word end</td><td><code>E</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L177"><code>seek.wordEnd.extend</code></a></td><td>Extend to next word end</td><td><code>Shift+E</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L178"><code>seek.wordEnd.ws</code></a></td><td>Select to next non-whitespace word end</td><td><code>Alt+E</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L179"><code>seek.wordEnd.ws.extend</code></a></td><td>Extend to next non-whitespace word end</td><td><code>Shift+Alt+E</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L253"><code>seek.askObject</code></a></td><td>Select whole object</td><td><code>Alt+A</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Alt+A</code> (<code>editorTextFocus && dance.mode == 'insert'</code>)</td></tr>
<tr><td><a href="./seek.ts#L259"><code>seek.askObject.end</code></a></td><td>Select to whole object end</td><td><code>]</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L260"><code>seek.askObject.end.extend</code></a></td><td>Extend to whole object end</td><td><code>Shift+]</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L254"><code>seek.askObject.inner</code></a></td><td>Select inner object</td><td><code>Alt+I</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Alt+I</code> (<code>editorTextFocus && dance.mode == 'insert'</code>)</td></tr>
<tr><td><a href="./seek.ts#L261"><code>seek.askObject.inner.end</code></a></td><td>Select to inner object end</td><td><code>Alt+]</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L262"><code>seek.askObject.inner.end.extend</code></a></td><td>Extend to inner object end</td><td><code>Shift+Alt+]</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L257"><code>seek.askObject.inner.start</code></a></td><td>Select to inner object start</td><td><code>Alt+[</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L258"><code>seek.askObject.inner.start.extend</code></a></td><td>Extend to inner object start</td><td><code>Shift+Alt+[</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L255"><code>seek.askObject.start</code></a></td><td>Select to whole object start</td><td><code>[</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L256"><code>seek.askObject.start.extend</code></a></td><td>Extend to whole object start</td><td><code>Shift+[</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L24"><code>seek.backward</code></a></td><td>Select to character (excluded, backward)</td><td><code>Alt+T</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L89"><code>seek.enclosing.backward</code></a></td><td>Select to previous enclosing character</td><td><code>Alt+M</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L88"><code>seek.enclosing.extend</code></a></td><td>Extend to next enclosing character</td><td><code>Shift+M</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L90"><code>seek.enclosing.extend.backward</code></a></td><td>Extend to previous enclosing character</td><td><code>Shift+Alt+M</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L23"><code>seek.extend</code></a></td><td>Extend to character (excluded)</td><td><code>Shift+T</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L25"><code>seek.extend.backward</code></a></td><td>Extend to character (excluded, backward)</td><td><code>Shift+Alt+T</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L26"><code>seek.included</code></a></td><td>Select to character (included)</td><td><code>F</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L28"><code>seek.included.backward</code></a></td><td>Select to character (included, backward)</td><td><code>Alt+F</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L27"><code>seek.included.extend</code></a></td><td>Extend to character (included)</td><td><code>Shift+F</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L29"><code>seek.included.extend.backward</code></a></td><td>Extend to character (included, backward)</td><td><code>Shift+Alt+F</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L168"><code>seek.word.backward</code></a></td><td>Select to previous word start</td><td><code>B</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L167"><code>seek.word.extend</code></a></td><td>Extend to next word start</td><td><code>Shift+W</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L169"><code>seek.word.extend.backward</code></a></td><td>Extend to previous word start</td><td><code>Shift+B</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L170"><code>seek.word.ws</code></a></td><td>Select to next non-whitespace word start</td><td><code>Alt+W</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L172"><code>seek.word.ws.backward</code></a></td><td>Select to previous non-whitespace word start</td><td><code>Alt+B</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L171"><code>seek.word.ws.extend</code></a></td><td>Extend to next non-whitespace word start</td><td><code>Shift+Alt+W</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L173"><code>seek.word.ws.extend.backward</code></a></td><td>Extend to previous non-whitespace word start</td><td><code>Shift+Alt+B</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L174"><code>seek.wordEnd</code></a></td><td>Select to next word end</td><td><code>E</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L175"><code>seek.wordEnd.extend</code></a></td><td>Extend to next word end</td><td><code>Shift+E</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L176"><code>seek.wordEnd.ws</code></a></td><td>Select to next non-whitespace word end</td><td><code>Alt+E</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./seek.ts#L177"><code>seek.wordEnd.ws.extend</code></a></td><td>Extend to next non-whitespace word end</td><td><code>Shift+Alt+E</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="#seekword"><code>seek.word</code></a></td><td>Select to next word start</td><td><code>W</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td rowspan=41><a href="#select"><code>select</code></a></td><td><a href="#selectbuffer"><code>select.buffer</code></a></td><td>Select whole buffer</td><td><code>Shift+5</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="#selectfirstVisibleLine"><code>select.firstVisibleLine</code></a></td><td>Select to first visible line</td><td></td></tr>
@ -128,33 +128,33 @@
<tr><td><a href="#selectlineEnd"><code>select.lineEnd</code></a></td><td>Select to line end</td><td><code>Alt+L</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>End</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="#selectlineStart"><code>select.lineStart</code></a></td><td>Select to line start</td><td><code>Alt+H</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Home</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="#selectmiddleVisibleLine"><code>select.middleVisibleLine</code></a></td><td>Select to middle visible line</td><td></td></tr>
<tr><td><a href="./select.ts#L515"><code>select.documentEnd.extend</code></a></td><td>Extend to last character</td><td></td></tr>
<tr><td><a href="./select.ts#L514"><code>select.documentEnd.jump</code></a></td><td>Jump to last character</td><td></td></tr>
<tr><td><a href="./select.ts#L44"><code>select.down.extend</code></a></td><td>Extend down</td><td><code>Shift+J</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Shift+Down</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./select.ts#L43"><code>select.down.jump</code></a></td><td>Jump down</td><td><code>J</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Down</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./select.ts#L468"><code>select.firstLine.extend</code></a></td><td>Extend to first line</td><td></td></tr>
<tr><td><a href="./select.ts#L467"><code>select.firstLine.jump</code></a></td><td>Jump to first line</td><td></td></tr>
<tr><td><a href="./select.ts#L580"><code>select.firstVisibleLine.extend</code></a></td><td>Extend to first visible line</td><td></td></tr>
<tr><td><a href="./select.ts#L579"><code>select.firstVisibleLine.jump</code></a></td><td>Jump to first visible line</td><td></td></tr>
<tr><td><a href="./select.ts#L559"><code>select.lastLine.extend</code></a></td><td>Extend to last line</td><td></td></tr>
<tr><td><a href="./select.ts#L558"><code>select.lastLine.jump</code></a></td><td>Jump to last line</td><td></td></tr>
<tr><td><a href="./select.ts#L614"><code>select.lastVisibleLine.extend</code></a></td><td>Extend to last visible line</td><td></td></tr>
<tr><td><a href="./select.ts#L613"><code>select.lastVisibleLine.jump</code></a></td><td>Jump to last visible line</td><td></td></tr>
<tr><td><a href="./select.ts#L232"><code>select.left.extend</code></a></td><td>Extend left</td><td><code>Shift+H</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Shift+Left</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./select.ts#L231"><code>select.left.jump</code></a></td><td>Jump left</td><td><code>H</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Left</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./select.ts#L513"><code>select.lineEnd.extend</code></a></td><td>Extend to line end</td><td><code>Shift+Alt+L</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Shift+End</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./select.ts#L464"><code>select.lineStart.extend</code></a></td><td>Extend to line start</td><td><code>Shift+Alt+H</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Shift+Home</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./select.ts#L463"><code>select.lineStart.jump</code></a></td><td>Jump to line start</td><td></td></tr>
<tr><td><a href="./select.ts#L466"><code>select.lineStart.skipBlank.extend</code></a></td><td>Extend to line start (skip blank)</td><td></td></tr>
<tr><td><a href="./select.ts#L465"><code>select.lineStart.skipBlank.jump</code></a></td><td>Jump to line start (skip blank)</td><td></td></tr>
<tr><td><a href="./select.ts#L597"><code>select.middleVisibleLine.extend</code></a></td><td>Extend to middle visible line</td><td></td></tr>
<tr><td><a href="./select.ts#L596"><code>select.middleVisibleLine.jump</code></a></td><td>Jump to middle visible line</td><td></td></tr>
<tr><td><a href="./select.ts#L230"><code>select.right.extend</code></a></td><td>Extend right</td><td><code>Shift+L</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Shift+Right</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./select.ts#L229"><code>select.right.jump</code></a></td><td>Jump right</td><td><code>L</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Right</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./select.ts#L299"><code>select.to.extend</code></a></td><td>Extend to</td><td><code>Shift+G</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./select.ts#L298"><code>select.to.jump</code></a></td><td>Go to</td><td><code>G</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./select.ts#L46"><code>select.up.extend</code></a></td><td>Extend up</td><td><code>Shift+K</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Shift+Up</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./select.ts#L45"><code>select.up.jump</code></a></td><td>Jump up</td><td><code>K</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Up</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./select.ts#L513"><code>select.documentEnd.extend</code></a></td><td>Extend to last character</td><td></td></tr>
<tr><td><a href="./select.ts#L512"><code>select.documentEnd.jump</code></a></td><td>Jump to last character</td><td></td></tr>
<tr><td><a href="./select.ts#L42"><code>select.down.extend</code></a></td><td>Extend down</td><td><code>Shift+J</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Shift+Down</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./select.ts#L41"><code>select.down.jump</code></a></td><td>Jump down</td><td><code>J</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Down</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./select.ts#L466"><code>select.firstLine.extend</code></a></td><td>Extend to first line</td><td></td></tr>
<tr><td><a href="./select.ts#L465"><code>select.firstLine.jump</code></a></td><td>Jump to first line</td><td></td></tr>
<tr><td><a href="./select.ts#L578"><code>select.firstVisibleLine.extend</code></a></td><td>Extend to first visible line</td><td></td></tr>
<tr><td><a href="./select.ts#L577"><code>select.firstVisibleLine.jump</code></a></td><td>Jump to first visible line</td><td></td></tr>
<tr><td><a href="./select.ts#L557"><code>select.lastLine.extend</code></a></td><td>Extend to last line</td><td></td></tr>
<tr><td><a href="./select.ts#L556"><code>select.lastLine.jump</code></a></td><td>Jump to last line</td><td></td></tr>
<tr><td><a href="./select.ts#L612"><code>select.lastVisibleLine.extend</code></a></td><td>Extend to last visible line</td><td></td></tr>
<tr><td><a href="./select.ts#L611"><code>select.lastVisibleLine.jump</code></a></td><td>Jump to last visible line</td><td></td></tr>
<tr><td><a href="./select.ts#L230"><code>select.left.extend</code></a></td><td>Extend left</td><td><code>Shift+H</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Shift+Left</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./select.ts#L229"><code>select.left.jump</code></a></td><td>Jump left</td><td><code>H</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Left</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./select.ts#L511"><code>select.lineEnd.extend</code></a></td><td>Extend to line end</td><td><code>Shift+Alt+L</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Shift+End</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./select.ts#L462"><code>select.lineStart.extend</code></a></td><td>Extend to line start</td><td><code>Shift+Alt+H</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Shift+Home</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./select.ts#L461"><code>select.lineStart.jump</code></a></td><td>Jump to line start</td><td></td></tr>
<tr><td><a href="./select.ts#L464"><code>select.lineStart.skipBlank.extend</code></a></td><td>Extend to line start (skip blank)</td><td></td></tr>
<tr><td><a href="./select.ts#L463"><code>select.lineStart.skipBlank.jump</code></a></td><td>Jump to line start (skip blank)</td><td></td></tr>
<tr><td><a href="./select.ts#L595"><code>select.middleVisibleLine.extend</code></a></td><td>Extend to middle visible line</td><td></td></tr>
<tr><td><a href="./select.ts#L594"><code>select.middleVisibleLine.jump</code></a></td><td>Jump to middle visible line</td><td></td></tr>
<tr><td><a href="./select.ts#L228"><code>select.right.extend</code></a></td><td>Extend right</td><td><code>Shift+L</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Shift+Right</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./select.ts#L227"><code>select.right.jump</code></a></td><td>Jump right</td><td><code>L</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Right</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./select.ts#L297"><code>select.to.extend</code></a></td><td>Extend to</td><td><code>Shift+G</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./select.ts#L296"><code>select.to.jump</code></a></td><td>Go to</td><td><code>G</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./select.ts#L44"><code>select.up.extend</code></a></td><td>Extend up</td><td><code>Shift+K</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Shift+Up</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./select.ts#L43"><code>select.up.jump</code></a></td><td>Jump up</td><td><code>K</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)<code>Up</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="#selectto"><code>select.to</code></a></td><td>Select to</td><td></td></tr>
<tr><td><a href="#selectvertically"><code>select.vertically</code></a></td><td>Select vertically</td><td></td></tr>
<tr><td rowspan=31><a href="#selections"><code>selections</code></a></td><td><a href="#selectionschangeDirection"><code>selections.changeDirection</code></a></td><td>Change direction of selections</td><td><code>Alt+;</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
@ -170,19 +170,19 @@
<tr><td><a href="#selectionssave"><code>selections.save</code></a></td><td>Save selections</td><td><code>Shift+Z</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="#selectionssaveText"><code>selections.saveText</code></a></td><td>Copy selections text</td><td><code>Y</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="#selectionsselect"><code>selections.select</code></a></td><td>Select within selections</td><td><code>S</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./selections.ts#L318"><code>selections.clear.main</code></a></td><td>Clear main selections</td><td><code>Alt+Space</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./selections.ts#L317"><code>selections.clear.secondary</code></a></td><td>Clear secondary selections</td><td><code>Space</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./selections.ts#L700"><code>selections.copy.above</code></a></td><td>Copy selections above</td><td><code>Shift+Alt+C</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./selections.ts#L664"><code>selections.faceBackward</code></a></td><td>Backward selections</td><td></td></tr>
<tr><td><a href="./selections.ts#L663"><code>selections.faceForward</code></a></td><td>Forward selections</td><td><code>Shift+Alt+;</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./selections.ts#L315"><code>selections.filter.regexp</code></a></td><td>Keep matching selections</td><td><code>Alt+K</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./selections.ts#L316"><code>selections.filter.regexp.inverse</code></a></td><td>Clear matching selections</td><td><code>Shift+Alt+K</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./selections.ts#L780"><code>selections.hideIndices</code></a></td><td>Hide selection indices</td><td></td></tr>
<tr><td><a href="./selections.ts#L253"><code>selections.pipe.append</code></a></td><td>Pipe and append</td><td><code>Shift+1</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./selections.ts#L254"><code>selections.pipe.prepend</code></a></td><td>Pipe and prepend</td><td><code>Shift+Alt+1</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./selections.ts#L252"><code>selections.pipe.replace</code></a></td><td>Pipe and replace</td><td><code>Shift+\</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./selections.ts#L582"><code>selections.reduce.edges</code></a></td><td>Reduce selections to their ends</td><td><code>Shift+Alt+S</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./selections.ts#L779"><code>selections.showIndices</code></a></td><td>Show selection indices</td><td></td></tr>
<tr><td><a href="./selections.ts#L319"><code>selections.clear.main</code></a></td><td>Clear main selections</td><td><code>Alt+Space</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./selections.ts#L318"><code>selections.clear.secondary</code></a></td><td>Clear secondary selections</td><td><code>Space</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./selections.ts#L701"><code>selections.copy.above</code></a></td><td>Copy selections above</td><td><code>Shift+Alt+C</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./selections.ts#L665"><code>selections.faceBackward</code></a></td><td>Backward selections</td><td></td></tr>
<tr><td><a href="./selections.ts#L664"><code>selections.faceForward</code></a></td><td>Forward selections</td><td><code>Shift+Alt+;</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./selections.ts#L316"><code>selections.filter.regexp</code></a></td><td>Keep matching selections</td><td><code>Alt+K</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./selections.ts#L317"><code>selections.filter.regexp.inverse</code></a></td><td>Clear matching selections</td><td><code>Shift+Alt+K</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./selections.ts#L781"><code>selections.hideIndices</code></a></td><td>Hide selection indices</td><td></td></tr>
<tr><td><a href="./selections.ts#L254"><code>selections.pipe.append</code></a></td><td>Pipe and append</td><td><code>Shift+1</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./selections.ts#L255"><code>selections.pipe.prepend</code></a></td><td>Pipe and prepend</td><td><code>Shift+Alt+1</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./selections.ts#L253"><code>selections.pipe.replace</code></a></td><td>Pipe and replace</td><td><code>Shift+\</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./selections.ts#L583"><code>selections.reduce.edges</code></a></td><td>Reduce selections to their ends</td><td><code>Shift+Alt+S</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="./selections.ts#L780"><code>selections.showIndices</code></a></td><td>Show selection indices</td><td></td></tr>
<tr><td><a href="#selectionssplit"><code>selections.split</code></a></td><td>Split selections</td><td><code>Shift+S</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="#selectionssplitLines"><code>selections.splitLines</code></a></td><td>Split selections at line boundaries</td><td><code>Alt+S</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
<tr><td><a href="#selectionstoggleIndices"><code>selections.toggleIndices</code></a></td><td>Toggle selection indices</td><td><code>Enter</code> (<code>editorTextFocus && dance.mode == 'normal'</code>)</td></tr>
@ -204,7 +204,7 @@
Developer utilities for Dance.
### [`dev.setSelectionBehavior`](./dev.ts#L13-L22)
### [`dev.setSelectionBehavior`](./dev.ts#L12-L21)
Set the selection behavior of the specified mode.
@ -212,7 +212,7 @@ This command:
- takes an argument `mode` of type `string`.
- takes an argument `value` of type `"caret" | "character"`.
### [`dev.copyLastErrorMessage`](./dev.ts#L37-L40)
### [`dev.copyLastErrorMessage`](./dev.ts#L36-L39)
Copies the last encountered error message.
@ -225,7 +225,7 @@ Perform changes on the text content of the document.
See https://github.com/mawww/kakoune/blob/master/doc/pages/keys.asciidoc#changes.
### [`edit.insert`](./edit.ts#L27-L61)
### [`edit.insert`](./edit.ts#L15-L49)
Insert contents of register.
@ -257,7 +257,7 @@ This command:
- takes an argument `select` of type `boolean`.
- takes an argument `where` of type `"active" | "anchor" | "start" | "end" | undefined`.
### [`edit.join`](./edit.ts#L120-L125)
### [`edit.join`](./edit.ts#L108-L113)
Join lines.
@ -265,7 +265,7 @@ Join lines.
This command:
- takes an argument `separator` of type `string`.
### [`edit.join.select`](./edit.ts#L129-L134)
### [`edit.join.select`](./edit.ts#L117-L122)
Join lines and select inserted separators.
@ -273,7 +273,7 @@ Join lines and select inserted separators.
This command:
- takes an argument `separator` of type `string`.
### [`edit.indent`](./edit.ts#L138-L143)
### [`edit.indent`](./edit.ts#L126-L131)
Indent selected lines.
@ -281,7 +281,7 @@ Indent selected lines.
This command:
- may be repeated with a given number of repetitions.
### [`edit.indent.withEmpty`](./edit.ts#L147-L152)
### [`edit.indent.withEmpty`](./edit.ts#L135-L140)
Indent selected lines (including empty lines).
@ -289,7 +289,7 @@ Indent selected lines (including empty lines).
This command:
- may be repeated with a given number of repetitions.
### [`edit.deindent`](./edit.ts#L156-L161)
### [`edit.deindent`](./edit.ts#L144-L149)
Deindent selected lines.
@ -297,7 +297,7 @@ Deindent selected lines.
This command:
- may be repeated with a given number of repetitions.
### [`edit.deindent.withIncomplete`](./edit.ts#L165-L170)
### [`edit.deindent.withIncomplete`](./edit.ts#L153-L158)
Deindent selected lines (including incomplete indent).
@ -305,19 +305,19 @@ Deindent selected lines (including incomplete indent).
This command:
- may be repeated with a given number of repetitions.
### [`edit.case.toLower`](./edit.ts#L174-L179)
### [`edit.case.toLower`](./edit.ts#L162-L167)
Transform to lower case.
### [`edit.case.toUpper`](./edit.ts#L183-L188)
### [`edit.case.toUpper`](./edit.ts#L171-L176)
Transform to upper case.
### [`edit.case.swap`](./edit.ts#L192-L197)
### [`edit.case.swap`](./edit.ts#L180-L185)
Swap case.
### [`edit.replaceCharacters`](./edit.ts#L212-L221)
### [`edit.replaceCharacters`](./edit.ts#L200-L209)
Replace characters.
@ -326,7 +326,7 @@ This command:
- may be repeated with a given number of repetitions.
- takes an input of type `string`.
### [`edit.align`](./edit.ts#L264-L277)
### [`edit.align`](./edit.ts#L252-L265)
Align selections.
@ -337,7 +337,7 @@ before the first character of each selection.
This command:
- takes an argument `fill` of type `string`.
### [`edit.copyIndentation`](./edit.ts#L292-L305)
### [`edit.copyIndentation`](./edit.ts#L280-L293)
Copy indentation.
@ -348,7 +348,7 @@ given) to all other ones.
This command:
- may be repeated with a given number of repetitions.
### [`edit.newLine.above`](./edit.ts#L334-L345)
### [`edit.newLine.above`](./edit.ts#L322-L333)
Insert new line above each selection.
@ -362,7 +362,7 @@ Insert new line above each selection.
This command:
- takes an argument `select` of type `boolean`.
### [`edit.newLine.below`](./edit.ts#L369-L380)
### [`edit.newLine.below`](./edit.ts#L357-L368)
Insert new line below each selection.
@ -380,7 +380,7 @@ This command:
Interact with history.
### [`history.undo`](./history.ts#L13-L18)
### [`history.undo`](./history.ts#L14-L19)
Undo.
@ -388,7 +388,7 @@ Undo.
This command:
- does not require an active text editor.
### [`history.redo`](./history.ts#L22-L27)
### [`history.redo`](./history.ts#L23-L28)
Redo.
@ -396,7 +396,7 @@ Redo.
This command:
- does not require an active text editor.
### [`history.undo.selections`](./history.ts#L31-L36)
### [`history.undo.selections`](./history.ts#L32-L37)
Undo a change of selections.
@ -404,7 +404,7 @@ Undo a change of selections.
This command:
- does not require an active text editor.
### [`history.redo.selections`](./history.ts#L40-L45)
### [`history.redo.selections`](./history.ts#L41-L46)
Redo a change of selections.
@ -412,7 +412,7 @@ Redo a change of selections.
This command:
- does not require an active text editor.
### [`history.repeat`](./history.ts#L49-L64)
### [`history.repeat`](./history.ts#L50-L65)
Repeat last change.
@ -426,7 +426,7 @@ This command:
- may be repeated with a given number of repetitions.
- takes an argument `include` of type `string | RegExp`.
### [`history.repeat.edit`](./history.ts#L96-L102)
### [`history.repeat.edit`](./history.ts#L97-L103)
Repeat last edit without a command.
@ -434,7 +434,7 @@ Repeat last edit without a command.
This command:
- may be repeated with a given number of repetitions.
### [`history.recording.play`](./history.ts#L138-L149)
### [`history.recording.play`](./history.ts#L139-L150)
Replay recording.
@ -444,7 +444,7 @@ This command:
- does not require an active text editor.
- may be repeated with a given number of repetitions.
### [`history.recording.start`](./history.ts#L165-L174)
### [`history.recording.start`](./history.ts#L166-L175)
Start recording.
@ -452,7 +452,7 @@ Start recording.
This command:
- accepts a register (by default, it uses `arobase`).
### [`history.recording.stop`](./history.ts#L186-L195)
### [`history.recording.stop`](./history.ts#L187-L196)
Stop recording.
@ -482,7 +482,7 @@ commands:
| -------------- | ----------------------------------- |
| `s-;` (normal) | `["workbench.action.showCommands"]` |
### [`cancel`](./misc.ts#L20-L25)
### [`cancel`](./misc.ts#L19-L24)
Cancel Dance operation.
@ -490,14 +490,14 @@ Cancel Dance operation.
This command:
- does not require an active text editor.
### [`ignore`](./misc.ts#L31-L34)
### [`ignore`](./misc.ts#L30-L33)
Ignore key.
This command:
- does not require an active text editor.
### [`run`](./misc.ts#L40-L141)
### [`run`](./misc.ts#L39-L140)
Run code.
@ -595,9 +595,9 @@ These values can be mixed:
```
This command:
- takes an argument `commands` of type `api.command.Any[]`.
- takes an argument `commands` of type `command.Any[]`.
### [`selectRegister`](./misc.ts#L173-L184)
### [`selectRegister`](./misc.ts#L172-L183)
Select register for next command.
@ -606,7 +606,7 @@ register is selected. If this key is a `space` character, then a new key
press is awaited again and the returned register will be specific to the
current document.
### [`updateRegister`](./misc.ts#L200-L211)
### [`updateRegister`](./misc.ts#L199-L210)
Update the contents of a register.
@ -615,7 +615,7 @@ This command:
- accepts a register (by default, it uses `dquote`).
- takes an input of type `string`.
### [`updateCount`](./misc.ts#L237-L266)
### [`updateCount`](./misc.ts#L236-L265)
Update Dance count.
@ -642,7 +642,7 @@ This command:
- takes an argument `addDigits` of type `number`.
- takes an input of type `number`.
### [`openMenu`](./misc.ts#L294-L316)
### [`openMenu`](./misc.ts#L293-L315)
Open menu.
@ -664,7 +664,7 @@ This command:
- takes an argument `prefix` of type `string`.
- takes an input of type `string`.
### [`changeInput`](./misc.ts#L352-L366)
### [`changeInput`](./misc.ts#L351-L365)
Change current input.
@ -727,7 +727,7 @@ This command:
Search for patterns and replace or add selections.
### [`search.search`](./search.ts#L18-L41)
### [`search.search`](./search.ts#L16-L39)
Search.
@ -745,7 +745,7 @@ This command:
- takes an argument `interactive` of type `boolean`.
- takes an input of type `Input<string | RegExp>`.
### [`search.selection`](./search.ts#L87-L102)
### [`search.selection`](./search.ts#L85-L100)
Search current selection.
@ -758,7 +758,7 @@ This command:
- accepts a register (by default, it uses `slash`).
- takes an argument `smart` of type `boolean`.
### [`search.next`](./search.ts#L155-L174)
### [`search.next`](./search.ts#L153-L172)
Select next match.
@ -778,7 +778,7 @@ This command:
Update selections based on the text surrounding them.
### [`seek.seek`](./seek.ts#L16-L41)
### [`seek.seek`](./seek.ts#L14-L39)
Select to character (excluded).
@ -800,7 +800,7 @@ This command:
- takes an argument `include` of type `boolean`.
- takes an input of type `string`.
### [`seek.enclosing`](./seek.ts#L81-L101)
### [`seek.enclosing`](./seek.ts#L79-L99)
Select to next enclosing character.
@ -817,7 +817,7 @@ This command:
- takes an argument `open` of type `boolean`.
- takes an argument `pairs` of type `readonly string[]`.
### [`seek.word`](./seek.ts#L158-L189)
### [`seek.word`](./seek.ts#L156-L187)
Select to next word start.
@ -845,7 +845,7 @@ This command:
- takes an argument `stopAtEnd` of type `boolean`.
- takes an argument `ws` of type `boolean`.
### [`seek.object`](./seek.ts#L233-L273)
### [`seek.object`](./seek.ts#L231-L271)
Select object.
@ -882,11 +882,11 @@ This command:
Update selections based on their position in the document.
### [`select.buffer`](./select.ts#L15-L20)
### [`select.buffer`](./select.ts#L13-L18)
Select whole buffer.
### [`select.vertically`](./select.ts#L33-L66)
### [`select.vertically`](./select.ts#L31-L64)
Select vertically.
@ -914,7 +914,7 @@ This command:
- takes an argument `avoidEol` of type `boolean`.
- takes an argument `by` of type `"page" | "halfPage"`.
### [`select.horizontally`](./select.ts#L219-L241)
### [`select.horizontally`](./select.ts#L217-L239)
Select horizontally.
@ -932,7 +932,7 @@ This command:
- may be repeated with a given number of repetitions.
- takes an argument `avoidEol` of type `boolean`.
### [`select.to`](./select.ts#L288-L306)
### [`select.to`](./select.ts#L286-L304)
Select to.
@ -950,7 +950,7 @@ This command:
- accepts an argument of type `object`.
- may be repeated with a given number of repetitions.
### [`select.line.below`](./select.ts#L316-L321)
### [`select.line.below`](./select.ts#L314-L319)
Select line below.
@ -958,7 +958,7 @@ Select line below.
This command:
- may be repeated with a given number of repetitions.
### [`select.line.below.extend`](./select.ts#L346-L351)
### [`select.line.below.extend`](./select.ts#L344-L349)
Extend to line below.
@ -966,21 +966,21 @@ Extend to line below.
This command:
- may be repeated with a given number of repetitions.
### [`select.line.above`](./select.ts#L378-L381)
### [`select.line.above`](./select.ts#L376-L379)
Select line above.
This command:
- may be repeated with a given number of repetitions.
### [`select.line.above.extend`](./select.ts#L405-L408)
### [`select.line.above.extend`](./select.ts#L403-L406)
Extend to line above.
This command:
- may be repeated with a given number of repetitions.
### [`select.lineStart`](./select.ts#L454-L476)
### [`select.lineStart`](./select.ts#L452-L474)
Select to line start.
@ -1000,7 +1000,7 @@ This command:
- may be repeated with a given number of repetitions.
- takes an argument `skipBlank` of type `boolean`.
### [`select.lineEnd`](./select.ts#L501-L523)
### [`select.lineEnd`](./select.ts#L499-L521)
Select to line end.
@ -1018,7 +1018,7 @@ This command:
- may be repeated with a given number of repetitions.
- takes an argument `lineBreak` of type `boolean`.
### [`select.lastLine`](./select.ts#L551-L561)
### [`select.lastLine`](./select.ts#L549-L559)
Select to last line.
@ -1029,7 +1029,7 @@ Select to last line.
| Jump to last line | `lastLine.jump` | `[".select.lastLine", { shift: "jump" }]` |
| Extend to last line | `lastLine.extend` | `[".select.lastLine", { shift: "extend" }]` |
### [`select.firstVisibleLine`](./select.ts#L572-L582)
### [`select.firstVisibleLine`](./select.ts#L570-L580)
Select to first visible line.
@ -1040,7 +1040,7 @@ Select to first visible line.
| Jump to first visible line | `firstVisibleLine.jump` | `[".select.firstVisibleLine", { shift: "jump" }]` |
| Extend to first visible line | `firstVisibleLine.extend` | `[".select.firstVisibleLine", { shift: "extend" }]` |
### [`select.middleVisibleLine`](./select.ts#L589-L599)
### [`select.middleVisibleLine`](./select.ts#L587-L597)
Select to middle visible line.
@ -1051,7 +1051,7 @@ Select to middle visible line.
| Jump to middle visible line | `middleVisibleLine.jump` | `[".select.middleVisibleLine", { shift: "jump" }]` |
| Extend to middle visible line | `middleVisibleLine.extend` | `[".select.middleVisibleLine", { shift: "extend" }]` |
### [`select.lastVisibleLine`](./select.ts#L606-L616)
### [`select.lastVisibleLine`](./select.ts#L604-L614)
Select to last visible line.
@ -1066,7 +1066,7 @@ Select to last visible line.
Interacting with selections.
### [`selections.saveText`](./selections.ts#L19-L28)
### [`selections.saveText`](./selections.ts#L20-L29)
Copy selections text.
@ -1074,7 +1074,7 @@ Copy selections text.
This command:
- accepts a register (by default, it uses `dquote`).
### [`selections.save`](./selections.ts#L32-L46)
### [`selections.save`](./selections.ts#L33-L47)
Save selections.
@ -1085,7 +1085,7 @@ This command:
- takes an argument `untilDelay` of type `number`.
- takes an argument `until` of type `AutoDisposable.Event[]`.
### [`selections.restore`](./selections.ts#L93-L101)
### [`selections.restore`](./selections.ts#L94-L102)
Restore selections.
@ -1093,7 +1093,7 @@ Restore selections.
This command:
- accepts a register (by default, it uses `caret`).
### [`selections.restore.withCurrent`](./selections.ts#L112-L131)
### [`selections.restore.withCurrent`](./selections.ts#L113-L132)
Combine register selections with current ones.
@ -1110,7 +1110,7 @@ This command:
- accepts a register (by default, it uses `caret`).
- takes an argument `reverse` of type `boolean`.
### [`selections.pipe`](./selections.ts#L238-L260)
### [`selections.pipe`](./selections.ts#L239-L261)
Pipe selections.
@ -1132,7 +1132,7 @@ This command:
- accepts a register (by default, it uses `pipe`).
- takes an input of type `string`.
### [`selections.filter`](./selections.ts#L306-L328)
### [`selections.filter`](./selections.ts#L307-L329)
Filter selections.
@ -1152,7 +1152,7 @@ This command:
- takes an argument `inverse` of type `boolean`.
- takes an input of type `Input<string>`.
### [`selections.select`](./selections.ts#L357-L368)
### [`selections.select`](./selections.ts#L358-L369)
Select within selections.
@ -1161,7 +1161,7 @@ This command:
- takes an argument `interactive` of type `boolean`.
- takes an input of type `Input<string | RegExp>`.
### [`selections.split`](./selections.ts#L387-L399)
### [`selections.split`](./selections.ts#L388-L400)
Split selections.
@ -1171,7 +1171,7 @@ This command:
- takes an argument `interactive` of type `boolean`.
- takes an input of type `Input<string | RegExp>`.
### [`selections.splitLines`](./selections.ts#L424-L435)
### [`selections.splitLines`](./selections.ts#L425-L436)
Split selections at line boundaries.
@ -1180,25 +1180,25 @@ This command:
- may be repeated with a given number of repetitions.
- takes an argument `excludeEol` of type `boolean`.
### [`selections.expandToLines`](./selections.ts#L478-L485)
### [`selections.expandToLines`](./selections.ts#L479-L486)
Expand to lines.
Expand selections to contain full lines (including end-of-line characters).
### [`selections.trimLines`](./selections.ts#L512-L519)
### [`selections.trimLines`](./selections.ts#L513-L520)
Trim lines.
Trim selections to only contain full lines (from start to line break).
### [`selections.trimWhitespace`](./selections.ts#L544-L551)
### [`selections.trimWhitespace`](./selections.ts#L545-L552)
Trim whitespace.
Trim whitespace at beginning and end of selections.
### [`selections.reduce`](./selections.ts#L570-L589)
### [`selections.reduce`](./selections.ts#L571-L590)
Reduce selections to their cursor.
@ -1214,7 +1214,7 @@ This command:
- takes an argument `empty` of type `boolean`.
- takes an argument `where` of type `"active" | "anchor" | "start" | "end" | "both"`.
### [`selections.changeDirection`](./selections.ts#L651-L666)
### [`selections.changeDirection`](./selections.ts#L652-L667)
Change direction of selections.
@ -1227,7 +1227,7 @@ Change direction of selections.
| Forward selections | `faceForward` | `a-:` (normal) | `[".selections.changeDirection", { direction: 1 }]` |
| Backward selections | `faceBackward` | | `[".selections.changeDirection", { direction: -1 }]` |
### [`selections.copy`](./selections.ts#L691-L709)
### [`selections.copy`](./selections.ts#L692-L710)
Copy selections below.
@ -1241,15 +1241,15 @@ Copy selections below.
This command:
- may be repeated with a given number of repetitions.
### [`selections.merge`](./selections.ts#L743-L748)
### [`selections.merge`](./selections.ts#L744-L749)
Merge contiguous selections.
### [`selections.open`](./selections.ts#L752-L755)
### [`selections.open`](./selections.ts#L753-L756)
Open selected file.
### [`selections.toggleIndices`](./selections.ts#L770-L787)
### [`selections.toggleIndices`](./selections.ts#L771-L788)
Toggle selection indices.

View File

@ -1,9 +1,8 @@
import * as vscode from "vscode";
import { Argument } from ".";
import { Context } from "../api";
import { Extension } from "../state/extension";
import { SelectionBehavior } from "../state/modes";
import type { Argument } from ".";
import { Context, SelectionBehavior } from "../api";
import type { Extension } from "../state/extension";
/**
* Developer utilities for Dance.

View File

@ -1,21 +1,9 @@
import * as vscode from "vscode";
import * as api from "../api";
import {
Context,
deindentLines,
edit,
indentLines,
joinLines,
keypress,
LengthMismatchError,
replace,
Selections,
selectionsLines,
setSelections,
} from "../api";
import { Register } from "../state/registers";
import { Argument, InputOr, RegisterOr } from ".";
import type { Argument, InputOr, RegisterOr } from ".";
import { insert as apiInsert, Context, deindentLines, edit, indentLines, joinLines, keypress, replace, Selections, selectionsLines, setSelections } from "../api";
import type { Register } from "../state/registers";
import { LengthMismatchError } from "../utils/errors";
/**
* Perform changes on the text content of the document.
@ -67,8 +55,8 @@ export async function insert(
if (select) {
const textToInsert = contents.join(""),
insert = handleNewLine ? api.insert.byIndex.withFullLines : api.insert.byIndex,
flags = api.insert.flagsAtEdge(where) | api.insert.Select;
insert = handleNewLine ? apiInsert.byIndex.withFullLines : apiInsert.byIndex,
flags = apiInsert.flagsAtEdge(where) | apiInsert.Select;
const insertedRanges = await insert(flags, () => textToInsert, selections),
allSelections = [] as vscode.Selection[],
@ -108,12 +96,12 @@ export async function insert(
throw new Error(`"where" must be one of "active", "anchor", "start", "end", or undefined`);
}
const flags = api.insert.flagsAtEdge(where) | api.insert.Keep;
const flags = apiInsert.flagsAtEdge(where) | apiInsert.Keep;
Selections.set(
handleNewLine
? await api.insert.byIndex.withFullLines(flags, (i) => contents![i], selections)
: await api.insert.byIndex(flags, (i) => contents![i], selections),
? await apiInsert.byIndex.withFullLines(flags, (i) => contents![i], selections)
: await apiInsert.byIndex(flags, (i) => contents![i], selections),
);
}

View File

@ -1,9 +1,10 @@
import * as vscode from "vscode";
import { Argument, CommandDescriptor, RegisterOr } from ".";
import { ArgumentError, Context } from "../api";
import { Register } from "../state/registers";
import { ActiveRecording, Entry, Recorder, Recording } from "../state/recorder";
import type { Argument, CommandDescriptor, RegisterOr } from ".";
import type { Context } from "../api";
import { ActiveRecording, Entry, Recorder } from "../state/recorder";
import type { Register } from "../state/registers";
import { ArgumentError } from "../utils/errors";
/**
* Interact with history.

View File

@ -1,8 +1,8 @@
import * as vscode from "vscode";
import { Context, EditorRequiredError } from "../api";
import { Extension } from "../state/extension";
import { Register, Registers } from "../state/registers";
import type { Extension } from "../state/extension";
import type { Register, Registers } from "../state/registers";
/**
* Indicates that a register is expected; if no register is given, the

View File

@ -1,8 +1,8 @@
import * as vscode from "vscode";
import { RegisterOr } from ".";
import type { RegisterOr } from ".";
import { Context, prompt, todo } from "../api";
import { Register } from "../state/registers";
import type { Register } from "../state/registers";
/**
* Utilities for setting up keybindings.

View File

@ -1,6 +1,6 @@
import { CommandDescriptor, Commands } from ".";
import { ArgumentError, commands, Context, Direction, EditorRequiredError, Shift } from "../api";
import { Register } from "../state/registers";
import { CommandDescriptor, Commands } from ".";
function getRegister<F extends Register.Flags>(
_: Context.WithoutActiveEditor,

View File

@ -1,9 +1,8 @@
import * as api from "../api";
import { Argument, InputOr, RegisterOr } from ".";
import { ArgumentError, CancellationError, Context, findMenu, InputError, keypress, Menu, prompt, showLockedMenu, showMenu, validateMenu } from "../api";
import { Extension } from "../state/extension";
import { Register } from "../state/registers";
import type { Argument, InputOr, RegisterOr } from ".";
import { commands as apiCommands, run as apiRun, command, Context, findMenu, keypress, Menu, prompt, showLockedMenu, showMenu, validateMenu } from "../api";
import type { Extension } from "../state/extension";
import type { Register } from "../state/registers";
import { ArgumentError, CancellationError, InputError } from "../utils/errors";
/**
* Miscellaneous commands that don't deserve their own category.
@ -137,17 +136,17 @@ export async function run(
_: Context,
inputOr: InputOr<string | readonly string[]>,
commands?: Argument<api.command.Any[]>,
commands?: Argument<command.Any[]>,
) {
if (Array.isArray(commands)) {
return api.commands(...commands);
return apiCommands(...commands);
}
let code = await inputOr(() => prompt({
prompt: "Code to run",
validateInput(value) {
try {
api.run.compileFunction(value);
apiRun.compileFunction(value);
return;
} catch (e) {
@ -167,7 +166,7 @@ export async function run(
return new InputError(`expected code to be a string or an array, but it was ${code}`);
}
return _.run(() => api.run(code as string));
return _.run(() => apiRun(code as string));
}
/**

View File

@ -1,4 +1,4 @@
import { InputOr } from ".";
import type { InputOr } from ".";
import { Context, prompt, toMode } from "../api";
/**

View File

@ -1,12 +1,10 @@
import * as vscode from "vscode";
import * as api from "../api";
import { Argument, Input, RegisterOr, SetInput } from ".";
import { Context, Direction, EmptySelectionsError, Positions, prompt, Selections } from "../api";
import { Register } from "../state/registers";
import { manipulateSelectionsInteractively } from "../utils/misc";
import { escapeForRegExp } from "../utils/regexp";
import type { Argument, Input, RegisterOr, SetInput } from ".";
import { search as apiSearch, Context, Direction, EmptySelectionsError, Positions, prompt, Selections, Shift } from "../api";
import type { Register } from "../state/registers";
import { CharSet, getCharSetFunction } from "../utils/charset";
import { escapeForRegExp } from "../utils/regexp";
/**
* Search for patterns and replace or add selections.
@ -34,12 +32,12 @@ export function search(
add: Argument<boolean> = false,
direction: Direction = Direction.Forward,
interactive: Argument<boolean> = true,
shift: api.Shift = api.Shift.Jump,
shift: Shift = Shift.Jump,
input: Input<string | RegExp>,
setInput: SetInput<RegExp>,
) {
return manipulateSelectionsInteractively(_, input, setInput, interactive, {
return prompt.manipulateSelectionsInteractively(_, input, setInput, interactive, {
...prompt.regexpOpts("mu"),
value: lastSearchInput?.source,
}, (input, selections) => {
@ -59,7 +57,7 @@ export function search(
for (let j = 0; j < repetitions; j++) {
const searchResult = nextImpl(
input as RegExp, direction, newSelection, undefined, undefined, document,
/* allowWrapping= */ shift !== api.Shift.Extend, regexpMatches, regexpMatches.length);
/* allowWrapping= */ shift !== Shift.Extend, regexpMatches, regexpMatches.length);
if (searchResult === undefined) {
return undefined;
@ -68,7 +66,7 @@ export function search(
newSelection = searchResult;
}
if (shift === api.Shift.Jump) {
if (shift === Shift.Jump) {
return newSelection;
}
@ -251,7 +249,7 @@ function nextImpl(
): vscode.Selection | undefined {
searchStart ??= direction === Direction.Backward ? selection.start : selection.end;
const searchResult = api.search(direction, re, searchStart, searchEnd);
const searchResult = apiSearch(direction, re, searchStart, searchEnd);
if (searchResult === undefined) {
if (allowWrapping) {

View File

@ -1,11 +1,9 @@
import * as vscode from "vscode";
import { Argument, InputOr } from ".";
import { ArgumentError, assert, closestSurroundedBy, Context, Direction, keypress, Lines, mapSelections, moveTo, moveWhile, Pair, pair, Positions, prompt, search, Selections, Shift, surroundedBy } from "../api";
import { Range } from "../api/search/range";
import { wordBoundary } from "../api/search/word";
import { SelectionBehavior } from "../state/modes";
import type { Argument, InputOr } from ".";
import { closestSurroundedBy, Context, Direction, keypress, Lines, moveTo, moveWhile, Pair, pair, Positions, prompt, Range, search, SelectionBehavior, Selections, Shift, surroundedBy, wordBoundary } from "../api";
import { CharSet } from "../utils/charset";
import { ArgumentError, assert } from "../utils/errors";
import { execRange } from "../utils/regexp";
/**

View File

@ -1,9 +1,7 @@
import * as vscode from "vscode";
import * as api from "../api";
import { Argument } from ".";
import { column, columns, Context, Direction, Lines, Positions, Selections, Shift, showMenu } from "../api";
import { SelectionBehavior } from "../state/modes";
import type { Argument } from ".";
import { firstVisibleLine as apiFirstVisibleLine, lastVisibleLine as apiLastVisibleLine, middleVisibleLine as apiMiddleVisibleLine, column, columns, Context, Direction, Lines, Positions, SelectionBehavior, Selections, Shift, showMenu } from "../api";
import { PerEditorState } from "../state/editors";
import { unsafeSelections } from "../utils/misc";
@ -581,7 +579,7 @@ export function lastLine(_: Context, document: vscode.TextDocument, shift = Shif
*/
export function firstVisibleLine(_: Context, shift = Shift.Select) {
const selection = _.mainSelection,
toPosition = Positions.lineStart(api.firstVisibleLine(_.editor));
toPosition = Positions.lineStart(apiFirstVisibleLine(_.editor));
Selections.set([Selections.shift(selection, toPosition, shift)]);
}
@ -598,7 +596,7 @@ export function firstVisibleLine(_: Context, shift = Shift.Select) {
*/
export function middleVisibleLine(_: Context, shift = Shift.Select) {
const selection = _.mainSelection,
toPosition = Positions.lineStart(api.middleVisibleLine(_.editor));
toPosition = Positions.lineStart(apiMiddleVisibleLine(_.editor));
Selections.set([Selections.shift(selection, toPosition, shift)]);
}
@ -615,7 +613,7 @@ export function middleVisibleLine(_: Context, shift = Shift.Select) {
*/
export function lastVisibleLine(_: Context, shift = Shift.Select) {
const selection = _.mainSelection,
toPosition = Positions.lineStart(api.lastVisibleLine(_.editor));
toPosition = Positions.lineStart(apiLastVisibleLine(_.editor));
Selections.set([Selections.shift(selection, toPosition, shift)]);
}

View File

@ -1,4 +1,4 @@
import { Argument } from ".";
import type { Argument } from ".";
import { Context, rotate } from "../api";
/**

View File

@ -1,13 +1,14 @@
import * as vscode from "vscode";
import { Argument, Input, InputOr, RegisterOr, SetInput } from ".";
import { ArgumentError, Context, Direction, EmptySelectionsError, moveWhile, Positions, prompt, Selections, switchRun } from "../api";
import type { Argument, Input, InputOr, RegisterOr, SetInput } from ".";
import { Context, Direction, moveWhile, Positions, prompt, SelectionBehavior, Selections, switchRun } from "../api";
import { PerEditorState } from "../state/editors";
import { Mode, SelectionBehavior } from "../state/modes";
import { Register } from "../state/registers";
import { Mode } from "../state/modes";
import type { Register } from "../state/registers";
import { CharSet, getCharacters } from "../utils/charset";
import { AutoDisposable } from "../utils/disposables";
import { manipulateSelectionsInteractively, unsafeSelections } from "../utils/misc";
import { ArgumentError, EmptySelectionsError } from "../utils/errors";
import { unsafeSelections } from "../utils/misc";
import { SettingsValidator } from "../utils/settings-validator";
import { TrackedSelection } from "../utils/tracked-selection";
@ -329,7 +330,7 @@ export function filter(
const document = _.document,
strings = _.selections.map((selection) => document.getText(selection));
return manipulateSelectionsInteractively(_, input, setInput, interactive, {
return prompt.manipulateSelectionsInteractively(_, input, setInput, interactive, {
prompt: "Expression",
validateInput(value) {
try {
@ -366,7 +367,7 @@ export function select(
input: Input<string | RegExp>,
setInput: SetInput<RegExp>,
) {
return manipulateSelectionsInteractively(
return prompt.manipulateSelectionsInteractively(
_,
input,
setInput,
@ -397,7 +398,7 @@ export function split(
input: Input<string | RegExp>,
setInput: SetInput<RegExp>,
) {
return manipulateSelectionsInteractively(
return prompt.manipulateSelectionsInteractively(
_,
input,
setInput,

View File

@ -1,6 +1,6 @@
import * as vscode from "vscode";
import { Argument } from ".";
import type { Argument } from ".";
import { Context, Selections } from "../api";
/**

View File

@ -3,11 +3,7 @@ import * as vscode from "vscode";
import * as api from "./api";
import { loadCommands } from "./commands/load-all";
import { Extension } from "./state/extension";
/**
* Name of the extension, used in commands and settings.
*/
export const extensionName = "dance";
import { extensionId, extensionName } from "./utils/constants";
/**
* Global state of the extension.
@ -22,11 +18,13 @@ let isActivated = false;
export function activate() {
isActivated = true;
const extensionData = vscode.extensions.getExtension(`gregoire.${extensionName}`),
const extensionData = vscode.extensions.getExtension(extensionId),
extensionPackageJSON = extensionData?.packageJSON;
if (extensionPackageJSON?.[`${extensionName}.disableArbitraryCodeExecution`]) {
api.run.disable();
} else {
api.run.setGlobals({ vscode, ...api });
}
if (extensionPackageJSON?.[`${extensionName}.disableArbitraryCommandExecution`]) {

View File

@ -1,9 +1,10 @@
import * as vscode from "vscode";
import { assert, command, commands, Context, Positions, Selections, selectionsLines } from "../api";
import { extensionName } from "../extension";
import { Extension } from "./extension";
import { Mode, SelectionBehavior } from "./modes";
import type { Extension } from "./extension";
import type { Mode } from "./modes";
import { command, commands, Context, Positions, SelectionBehavior, Selections, selectionsLines } from "../api";
import { extensionName } from "../utils/constants";
import { assert } from "../utils/errors";
/**
* Dance-specific state related to a single `vscode.TextEditor`.

View File

@ -1,15 +1,16 @@
import * as vscode from "vscode";
import { extensionName } from "../extension";
import { Register, Registers } from "./registers";
import { assert, CancellationError, Menu, validateMenu } from "../api";
import { Modes } from "./modes";
import { SettingsValidator } from "../utils/settings-validator";
import { Recorder } from "./recorder";
import { Commands } from "../commands";
import { AutoDisposable } from "../utils/disposables";
import { StatusBar } from "./status-bar";
import { Editors } from "./editors";
import { Modes } from "./modes";
import { Recorder } from "./recorder";
import { Register, Registers } from "./registers";
import { StatusBar } from "./status-bar";
import { Menu, validateMenu } from "../api";
import type { Commands } from "../commands";
import { extensionName } from "../utils/constants";
import { AutoDisposable } from "../utils/disposables";
import { assert, CancellationError } from "../utils/errors";
import { SettingsValidator } from "../utils/settings-validator";
// ===============================================================================================
// == EXTENSION ================================================================================

View File

@ -1,15 +1,10 @@
import * as vscode from "vscode";
import { command } from "../api";
import { extensionName } from "../extension";
import { Extension } from "./extension";
import type { Extension } from "./extension";
import { command, SelectionBehavior } from "../api";
import { extensionName } from "../utils/constants";
import { SettingsValidator } from "../utils/settings-validator";
export const enum SelectionBehavior {
Caret = 1,
Character = 2,
}
/**
* An editing mode.
*/

View File

@ -1,15 +1,13 @@
import * as vscode from "vscode";
import type { PerEditorState } from "./editors";
import type { Extension } from "./extension";
import type { Mode } from "./modes";
import type { StatusBar } from "./status-bar";
import { Context, Positions, Selections } from "../api";
import { CommandDescriptor } from "../commands";
import { assert, CancellationError } from "../utils/errors";
import { noUndoStops } from "../utils/misc";
import { StatusBar } from "./status-bar";
import { Context } from "../api/context";
import { assert, CancellationError } from "../api/errors";
import { Positions } from "../api/positions";
import { Selections } from "../api";
import { Extension } from "./extension";
import { PerEditorState } from "./editors";
import { Mode } from "./modes";
type RecordValue = CommandDescriptor | object | vscode.Uri | number | string;
@ -950,7 +948,17 @@ export namespace Entry {
public static readonly id = id;
}
return EntryWithSize;
// We need to wrap `EntryWithSize` into an actual, textually-representable
// type below in order to generate a valid declaration for `define` in a
// `.d.ts` file.
return EntryWithSize as unknown as {
readonly size: number;
readonly id: number;
new(
...args: typeof Base extends abstract new(...args: infer Args) => any ? Args : never
): Base<Readonly<Items>>;
};
}
}

View File

@ -1,10 +1,10 @@
import * as vscode from "vscode";
import { ArgumentError, assert, Context, EditNotAppliedError, EditorRequiredError, prompt, Selections } from "../api";
import { SelectionBehavior } from "./modes";
import type { Recording } from "./recorder";
import { Context, prompt, SelectionBehavior, Selections } from "../api";
import { ArgumentError, assert, EditNotAppliedError, EditorRequiredError } from "../utils/errors";
import { noUndoStops } from "../utils/misc";
import { TrackedSelection } from "../utils/tracked-selection";
import { Recording } from "./recorder";
import type { TrackedSelection } from "../utils/tracked-selection";
/**
* The base class for all registers.

9
src/utils/constants.ts Normal file
View File

@ -0,0 +1,9 @@
/**
* Name of the extension, used in commands and settings.
*/
export const extensionName = "dance";
/**
* Identifier of the extension, used in the VS Code marketplace.
*/
export const extensionId = `gregoire.${extensionName}`;

View File

@ -1,6 +1,6 @@
import * as vscode from "vscode";
import { Context } from "../api";
import type { Context } from "../api";
import { Entry } from "../state/recorder";
export interface NotifyingDisposable extends vscode.Disposable {

201
src/utils/errors.ts Normal file
View File

@ -0,0 +1,201 @@
import * as vscode from "vscode";
import type { PerEditorState } from "../state/editors";
/**
* Asserts that the given condition is true.
*/
export function assert(condition: boolean): asserts condition {
if (!condition) {
const error = new Error(
"internal assertion failed; please report this error on https://github.com/71/dance/issues. "
+ "its stacktrace is available in the developer console (Command Palette > Open Developer "
+ "Tools).",
);
// Log error to ensure its stacktrace can be found.
console.error(error);
throw error;
}
}
/**
* An error thrown when no selections remain.
*/
export class EmptySelectionsError extends Error {
public constructor(message = "no selections remain") {
super(message);
}
/**
* Throws if the given selections are empty.
*/
public static throwIfEmpty(selections: readonly vscode.Selection[]) {
if (selections.length === 0) {
throw new EmptySelectionsError();
}
}
/**
* Throws if the selections of the given register are empty.
*/
public static throwIfRegisterIsEmpty<T>(
selections: readonly T[] | undefined,
registerName: string,
): asserts selections is readonly T[] {
if (selections === undefined || selections.length === 0) {
throw new EmptySelectionsError(`no selections are saved in register "${registerName}"`);
}
}
}
/**
* Error thrown when a given argument is not as expected.
*/
export class ArgumentError extends Error {
public constructor(message: string, public readonly argumentName?: string) {
super(message);
}
public static validate(
argumentName: string,
condition: boolean,
message: string | (() => string),
): asserts condition {
if (!condition) {
if (typeof message === "function") {
message = message();
}
throw new ArgumentError(message, argumentName);
}
}
}
/**
* Error thrown when a user input is not as expected.
*/
export class InputError extends ArgumentError {
public constructor(message: string) {
super(message, "input");
}
public static validateInput(
condition: boolean,
message: string,
): asserts condition {
if (!condition) {
throw new this(message);
}
}
}
/**
* Error thrown when a function that is expected to return a selection returns
* something else.
*/
export class NotASelectionError extends ArgumentError {
public constructor(public readonly value: unknown) {
super("value is not a selection");
}
/**
* Throws if the given value is not a `vscode.Selection`.
*/
public static throwIfNotASelection(value: unknown): asserts value is vscode.Selection {
if (!(value instanceof vscode.Selection)) {
throw new NotASelectionError(value);
}
}
/**
* Throws if the given list contains a value that is not a `vscode.Selection`,
* or if the list is empty.
*/
public static throwIfNotASelectionArray(value: unknown): asserts value is vscode.Selection[] {
if (!Array.isArray(value) || value.length === 0) {
throw new EmptySelectionsError();
}
for (let i = 0, len = value.length; i < len; i++) {
NotASelectionError.throwIfNotASelection(value[i]);
}
}
}
/**
* Error thrown when an action requiring an editor is executed without an
* active `vscode.TextEditor`.
*/
export class EditorRequiredError extends Error {
public constructor() {
super("active editor required");
}
public static throwUnlessAvailable<T extends PerEditorState | vscode.TextEditor>(
editorState: T | undefined,
): asserts editorState is T {
if (editorState === undefined) {
throw new EditorRequiredError();
}
}
}
/**
* Error thrown when a cancellation is requested.
*/
export class CancellationError extends Error {
public constructor(
public readonly reason: CancellationError.Reason,
) {
super(reason);
}
public static throwIfCancellationRequested(token: vscode.CancellationToken) {
if (token.isCancellationRequested) {
throw new CancellationError(CancellationError.Reason.CancellationToken);
}
}
}
export namespace CancellationError {
export const enum Reason {
CancellationToken = "cancellation token was used",
PressedEscape = "user pressed <escape>",
}
}
/**
* Error thrown when two arrays that are expected to have the same length have
* different lengths
*/
export class LengthMismatchError extends Error {
public constructor() {
super("length mismatch");
}
public static throwIfLengthMismatch<A, B>(a: readonly A[], b: readonly B[]) {
if (a.length !== b.length) {
throw new LengthMismatchError();
}
}
}
/**
* An error thrown when a `TextEditor.edit` call returns `false`.
*/
export class EditNotAppliedError extends Error {
public constructor() {
super("TextEditor edit failed");
}
/**
* Throws if the given value is `false`.
*/
public static throwIfNotApplied(editWasApplied: boolean): asserts editWasApplied {
if (!editWasApplied) {
throw new EditNotAppliedError();
}
}
}

View File

@ -1,8 +1,5 @@
import * as vscode from "vscode";
import { Context, prompt, Selections } from "../api";
import { Input, SetInput } from "../commands";
/**
* An object passed to `vscode.TextEditor.edit` to indicate that no undo stops
* should be implicitly inserted.
@ -35,31 +32,6 @@ export function unsafeSelections(editor: vscode.TextEditor) {
return editor.selections;
}
export async function manipulateSelectionsInteractively<I, R>(
_: Context,
input: Input<I>,
setInput: SetInput<R>,
interactive: boolean,
options: prompt.Options,
f: (input: string | I, selections: readonly vscode.Selection[]) => Thenable<R>,
) {
const selections = _.selections;
function execute(input: string | I) {
return _.runAsync(() => f(input, selections));
}
function undo() {
Selections.set(selections);
}
if (input === undefined) {
setInput(await prompt.interactive(execute, undo, options, interactive));
} else {
await execute(input);
}
}
export const workspaceSettingsPropertyNames = [
"workspaceFolderValue",
"workspaceFolderLanguageValue",

View File

@ -1,5 +1,4 @@
import { group } from "console";
import { assert } from "../api/errors";
import { assert } from "./errors";
/**
* Returns whether this `RegExp` may match on a string that contains a `\n`

View File

@ -1,7 +1,7 @@
import * as vscode from "vscode";
import { ArgumentError } from "../api";
import { PerEditorState } from "../state/editors";
import { ArgumentError } from "./errors";
import type { PerEditorState } from "../state/editors";
export namespace TrackedSelection {
/**
@ -246,7 +246,7 @@ export namespace TrackedSelection {
/**
* Updates the tracked selections to reflect a change in their document.
*
* @returns whether the change was applied.
* @return whether the change was applied.
*/
protected updateAfterDocumentChanged(e: vscode.TextDocumentChangeEvent) {
if (e.document !== this.document || e.contentChanges.length === 0) {

View File

@ -3,9 +3,8 @@ import * as assert from "assert";
import * as vscode from "vscode";
import { expect, ExpectedDocument } from "./utils";
import { Context, deindentLines, EmptySelectionsError, filterSelections, indentLines, insert, isPosition, isRange, isSelection, joinLines, mergeOverlappingSelections, moveWhile, NotASelectionError, Positions, replace, rotate, rotateSelections, search, Select, Selections, selectionsLines, setSelections, text, updateSelections } from "../../src/api";
import { Context, deindentLines, EmptySelectionsError, filterSelections, indentLines, insert, isPosition, isRange, isSelection, joinLines, mergeOverlappingSelections, moveWhile, NotASelectionError, Positions, replace, rotate, rotateSelections, search, Select, SelectionBehavior, Selections, selectionsLines, setSelections, text, updateSelections } from "../../src/api";
import { Extension } from "../../src/state/extension";
import { SelectionBehavior } from "../../src/state/modes";
function setSelectionBehavior(selectionBehavior: SelectionBehavior) {
Context.current.mode.update("_selectionBehavior", selectionBehavior);

View File

@ -9,8 +9,7 @@ import * as path from "path";
import * as unexpected from "unexpected";
import * as vscode from "vscode";
import { Context, Selections } from "../../src/api";
import { SelectionBehavior } from "../../src/state/modes";
import { Context, SelectionBehavior, Selections } from "../../src/api";
import type { Extension } from "../../src/state/extension";
interface Expect<T = any> {

459
yarn.lock
View File

@ -177,11 +177,38 @@
resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44"
integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==
acorn-jsx-walk@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/acorn-jsx-walk/-/acorn-jsx-walk-2.0.0.tgz#a5ed648264e68282d7c2aead80216bfdf232573a"
integrity sha512-uuo6iJj4D4ygkdzd6jPtcxs8vZgDX9YFIkqczGImoypX2fQ4dVImmu3UzA4ynixCIMTrEOWW+95M2HuBaCEOVA==
acorn-jsx@5.3.2:
version "5.3.2"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
acorn-jsx@^5.3.1:
version "5.3.1"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b"
integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==
acorn-loose@8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/acorn-loose/-/acorn-loose-8.1.0.tgz#60056c516883e7df2ed6c57ef91a670bb08b8d36"
integrity sha512-+X1zk54qiOWwIRywGBhfz8sLHFJ/adQRuVqn25m4HuD7/+GTXM1c0b3LH0bWerQ0H97lTk2GyuScGbSiQK9M1g==
dependencies:
acorn "^8.2.0"
acorn-walk@8.1.1:
version "8.1.1"
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.1.1.tgz#3ddab7f84e4a7e2313f6c414c5b7dac85f4e3ebc"
integrity sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w==
acorn@8.4.1, acorn@^8.2.0:
version "8.4.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c"
integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==
acorn@^7.4.0:
version "7.4.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
@ -194,6 +221,16 @@ agent-base@6:
dependencies:
debug "4"
ajv@8.6.1:
version "8.6.1"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.1.tgz#ae65764bf1edde8cd861281cda5057852364a295"
integrity sha512-42VLtQUOLefAvKFAQIxIZDaThq6om/PrfP0CYk3/vn+y4BMNkKnbli8ON2QCiHov4KkzOSJ/xSoBJdayiiYvVQ==
dependencies:
fast-deep-equal "^3.1.1"
json-schema-traverse "^1.0.0"
require-from-string "^2.0.2"
uri-js "^4.2.2"
ajv@^6.10.0, ajv@^6.12.4:
version "6.12.6"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
@ -219,6 +256,13 @@ ansi-colors@4.1.1, ansi-colors@^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-escapes@^4.2.1:
version "4.3.2"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
dependencies:
type-fest "^0.21.3"
ansi-regex@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
@ -320,6 +364,11 @@ balanced-match@^1.0.0:
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
base64-js@^1.3.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
big-integer@^1.6.17:
version "1.6.48"
resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e"
@ -338,6 +387,15 @@ binary@~0.3.0:
buffers "~0.1.1"
chainsaw "~0.1.0"
bl@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
dependencies:
buffer "^5.5.0"
inherits "^2.0.4"
readable-stream "^3.4.0"
bluebird@~3.4.1:
version "3.4.7"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3"
@ -383,6 +441,14 @@ buffer-indexof-polyfill@~1.0.0:
resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz#d2732135c5999c64b277fcf9b1abe3498254729c"
integrity sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==
buffer@^5.5.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
dependencies:
base64-js "^1.3.1"
ieee754 "^1.1.13"
buffers@~0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb"
@ -413,6 +479,14 @@ chainsaw@~0.1.0:
dependencies:
traverse ">=0.3.0 <0.4"
chalk@4.1.1, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad"
integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==
dependencies:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
chalk@^2.0.0, chalk@^2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
@ -422,13 +496,10 @@ chalk@^2.0.0, chalk@^2.4.2:
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
chalk@^4.0.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad"
integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==
dependencies:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
chardet@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
cheerio-select@^1.3.0:
version "1.4.0"
@ -468,6 +539,23 @@ chokidar@3.5.1, chokidar@^3.5.1:
optionalDependencies:
fsevents "~2.3.1"
cli-cursor@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
dependencies:
restore-cursor "^3.1.0"
cli-spinners@^2.5.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939"
integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==
cli-width@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6"
integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==
cliui@^7.0.2:
version "7.0.4"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
@ -477,6 +565,11 @@ cliui@^7.0.2:
strip-ansi "^6.0.0"
wrap-ansi "^7.0.0"
clone@^1.0.2:
version "1.0.4"
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
color-convert@^1.9.0:
version "1.9.3"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
@ -506,6 +599,11 @@ color-name@~1.1.4:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
commander@8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-8.0.0.tgz#1da2139548caef59bd23e66d18908dfb54b02258"
integrity sha512-Xvf85aAtu6v22+E5hfVoLHqyul/jyxh91zvqk/ioJTQuJR7Z78n7H558vMPKanPSRgIEeZemT92I2g9Y8LPbSQ==
commander@^6.1.0:
version "6.2.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
@ -568,11 +666,47 @@ deep-is@^0.1.3:
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
defaults@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=
dependencies:
clone "^1.0.2"
denodeify@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631"
integrity sha1-OjYof1A05pnnV3kBBSwubJQlFjE=
dependency-cruiser@^10.0.5:
version "10.0.5"
resolved "https://registry.yarnpkg.com/dependency-cruiser/-/dependency-cruiser-10.0.5.tgz#327e6e0a17393fd5c38ec9fdfc082da04b6164df"
integrity sha512-nMc4Yr3karxJeB4prn7PHIeQzKiCjCnaL5hCqKNHfToB+GaRx0A99JEV78Q7sTRQFG0T+rDCDJK7iEZkcpMaqA==
dependencies:
acorn "8.4.1"
acorn-jsx "5.3.2"
acorn-jsx-walk "2.0.0"
acorn-loose "8.1.0"
acorn-walk "8.1.1"
ajv "8.6.1"
chalk "4.1.1"
commander "8.0.0"
enhanced-resolve "5.8.2"
figures "3.2.0"
get-stream "6.0.1"
glob "7.1.7"
handlebars "4.7.7"
indent-string "4.0.0"
inquirer "8.1.1"
json5 "2.2.0"
lodash "4.17.21"
safe-regex "2.1.1"
semver "7.3.5"
semver-try-require "5.0.0"
teamcity-service-messages "0.1.11"
tsconfig-paths-webpack-plugin "3.5.1"
wrap-ansi "7.0.0"
detect-indent@3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-3.0.1.tgz#9dc5e5ddbceef8325764b9451b02bc6d54084f75"
@ -648,6 +782,14 @@ emoji-regex@^8.0.0:
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
enhanced-resolve@5.8.2, enhanced-resolve@^5.7.0:
version "5.8.2"
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz#15ddc779345cbb73e97c611cd00c01c1e7bf4d8b"
integrity sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==
dependencies:
graceful-fs "^4.2.4"
tapable "^2.2.0"
enquirer@^2.3.5:
version "2.3.6"
resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
@ -791,6 +933,15 @@ esutils@^2.0.2:
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
external-editor@^3.0.3:
version "3.1.0"
resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
dependencies:
chardet "^0.7.0"
iconv-lite "^0.4.24"
tmp "^0.0.33"
fast-deep-equal@^3.1.1:
version "3.1.3"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
@ -832,6 +983,13 @@ fd-slicer@~1.1.0:
dependencies:
pend "~1.2.0"
figures@3.2.0, figures@^3.0.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
dependencies:
escape-string-regexp "^1.0.5"
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"
@ -921,6 +1079,11 @@ get-stdin@^4.0.1:
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=
get-stream@6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
@ -940,6 +1103,18 @@ glob@7.1.6, glob@^7.0.6, glob@^7.1.3, glob@^7.1.6:
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@7.1.7:
version "7.1.7"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
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@^12.1.0:
version "12.4.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8"
@ -966,7 +1141,7 @@ globby@^11.0.1:
merge2 "^1.3.0"
slash "^3.0.0"
graceful-fs@^4.1.2, graceful-fs@^4.2.2:
graceful-fs@^4.1.2, graceful-fs@^4.2.2, graceful-fs@^4.2.4:
version "4.2.6"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
@ -981,6 +1156,18 @@ growl@1.10.5:
resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==
handlebars@4.7.7:
version "4.7.7"
resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1"
integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==
dependencies:
minimist "^1.2.5"
neo-async "^2.6.0"
source-map "^0.6.1"
wordwrap "^1.0.0"
optionalDependencies:
uglify-js "^3.1.4"
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
@ -1035,6 +1222,18 @@ https-proxy-agent@^5.0.0:
agent-base "6"
debug "4"
iconv-lite@^0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
dependencies:
safer-buffer ">= 2.1.2 < 3"
ieee754@^1.1.13:
version "1.2.1"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
ignore@^4.0.6:
version "4.0.6"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
@ -1058,6 +1257,11 @@ imurmurhash@^0.1.4:
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
indent-string@4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
@ -1066,11 +1270,31 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
inherits@2, inherits@~2.0.0, inherits@~2.0.3:
inherits@2, inherits@^2.0.3, inherits@^2.0.4, 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==
inquirer@8.1.1:
version "8.1.1"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.1.1.tgz#7c53d94c6d03011c7bb2a947f0dca3b98246c26a"
integrity sha512-hUDjc3vBkh/uk1gPfMAD/7Z188Q8cvTGl0nxwaCdwSbzFh6ZKkZh+s2ozVxbE5G9ZNRyeY0+lgbAIOUFsFf98w==
dependencies:
ansi-escapes "^4.2.1"
chalk "^4.1.1"
cli-cursor "^3.1.0"
cli-width "^3.0.0"
external-editor "^3.0.3"
figures "^3.0.0"
lodash "^4.17.21"
mute-stream "0.0.8"
ora "^5.3.0"
run-async "^2.4.0"
rxjs "^6.6.6"
string-width "^4.1.0"
strip-ansi "^6.0.0"
through "^2.3.6"
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"
@ -1105,6 +1329,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
dependencies:
is-extglob "^2.1.1"
is-interactive@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e"
integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==
is-number@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
@ -1115,6 +1344,11 @@ is-plain-obj@^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==
is-unicode-supported@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
@ -1160,6 +1394,13 @@ json-stable-stringify-without-jsonify@^1.0.1:
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
json5@2.2.0, json5@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3"
integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==
dependencies:
minimist "^1.2.5"
leven@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
@ -1207,7 +1448,7 @@ lodash.truncate@^4.4.2:
resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=
lodash@^4.17.15, lodash@^4.17.21:
lodash@4.17.21, lodash@^4.17.15, lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@ -1219,6 +1460,14 @@ log-symbols@4.0.0:
dependencies:
chalk "^4.0.0"
log-symbols@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503"
integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
dependencies:
chalk "^4.1.0"
is-unicode-supported "^0.1.0"
lru-cache@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
@ -1273,6 +1522,11 @@ mime@^1.3.4:
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
mimic-fn@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
@ -1280,7 +1534,7 @@ minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4:
dependencies:
brace-expansion "^1.1.7"
minimist@^1.1.0, minimist@^1.2.5:
minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
@ -1333,7 +1587,7 @@ ms@2.1.3:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
mute-stream@~0.0.4:
mute-stream@0.0.8, mute-stream@~0.0.4:
version "0.0.8"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
@ -1348,6 +1602,11 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
neo-async@^2.6.0:
version "2.6.2"
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
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"
@ -1372,6 +1631,13 @@ once@^1.3.0:
dependencies:
wrappy "1"
onetime@^5.1.0:
version "5.1.2"
resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
dependencies:
mimic-fn "^2.1.0"
optionator@^0.9.1:
version "0.9.1"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
@ -1384,12 +1650,27 @@ optionator@^0.9.1:
type-check "^0.4.0"
word-wrap "^1.2.3"
ora@^5.3.0:
version "5.4.1"
resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18"
integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==
dependencies:
bl "^4.1.0"
chalk "^4.1.0"
cli-cursor "^3.1.0"
cli-spinners "^2.5.0"
is-interactive "^1.0.0"
is-unicode-supported "^0.1.0"
log-symbols "^4.1.0"
strip-ansi "^6.0.0"
wcwidth "^1.0.1"
os-homedir@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
os-tmpdir@^1.0.0, os-tmpdir@~1.0.1:
os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
@ -1531,6 +1812,15 @@ readable-stream@^2.0.2, readable-stream@~2.3.6:
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
readable-stream@^3.4.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
dependencies:
inherits "^2.0.3"
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
readdirp@~3.5.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e"
@ -1538,6 +1828,11 @@ readdirp@~3.5.0:
dependencies:
picomatch "^2.2.1"
regexp-tree@~0.1.1:
version "0.1.23"
resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.23.tgz#8a8ce1cc5e971acef62213a7ecdb1f6e18a1f1b2"
integrity sha512-+7HWfb4Bvu8Rs2eQTUIpX9I/PlQkYOuTNbRpKLJlQpSgwSkzFYh+pUj0gtvglnOZLKB6YgnIgRuJ2/IlpL48qw==
regexpp@^3.0.0, regexpp@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2"
@ -1565,6 +1860,14 @@ resolve-from@^4.0.0:
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
restore-cursor@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
dependencies:
onetime "^5.1.0"
signal-exit "^3.0.2"
reusify@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
@ -1584,6 +1887,11 @@ rimraf@^3.0.2:
dependencies:
glob "^7.1.3"
run-async@^2.4.0:
version "2.4.1"
resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
run-parallel@^1.1.9:
version "1.2.0"
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
@ -1591,7 +1899,14 @@ run-parallel@^1.1.9:
dependencies:
queue-microtask "^1.2.2"
safe-buffer@^5.1.0:
rxjs@^6.6.6:
version "6.6.7"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9"
integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==
dependencies:
tslib "^1.9.0"
safe-buffer@^5.1.0, safe-buffer@~5.2.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==
@ -1601,18 +1916,37 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1:
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
semver@^5.1.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
safe-regex@2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2"
integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==
dependencies:
regexp-tree "~0.1.1"
semver@^7.2.1, semver@^7.3.2:
"safer-buffer@>= 2.1.2 < 3":
version "2.1.2"
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
semver-try-require@5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/semver-try-require/-/semver-try-require-5.0.0.tgz#634d9b22376b90ccbbfaf48f0d364ca179d77dc6"
integrity sha512-7CBjNH5C49PLcDkuzQk02jj+jvZ+I1fSFC/eMsX7niuuPo2E2mJRzF6QbqD5K8cuXJO7AfmNlAYehfTPZdvTrw==
dependencies:
semver "7.3.5"
semver@7.3.5, semver@^7.2.1, semver@^7.3.2:
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"
semver@^5.1.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
serialize-javascript@5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4"
@ -1646,6 +1980,11 @@ side-channel@^1.0.4:
get-intrinsic "^1.0.2"
object-inspect "^1.9.0"
signal-exit@^3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
slash@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
@ -1668,7 +2007,7 @@ source-map-support@^0.5.17, source-map-support@^0.5.19:
buffer-from "^1.0.0"
source-map "^0.6.0"
source-map@^0.6.0:
source-map@^0.6.0, source-map@^0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
@ -1695,6 +2034,13 @@ string-width@^4.1.0, string-width@^4.2.0:
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.0"
string_decoder@^1.1.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
dependencies:
safe-buffer "~5.2.0"
string_decoder@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
@ -1716,6 +2062,11 @@ strip-ansi@^6.0.0:
dependencies:
ansi-regex "^5.0.0"
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-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"
@ -1755,11 +2106,26 @@ table@^6.0.4:
string-width "^4.2.0"
strip-ansi "^6.0.0"
tapable@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b"
integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==
teamcity-service-messages@0.1.11:
version "0.1.11"
resolved "https://registry.yarnpkg.com/teamcity-service-messages/-/teamcity-service-messages-0.1.11.tgz#b5510677c2a85e0086de5c251ab3ab2f734425df"
integrity sha512-C1olucTOnOMocG1gcDquHugZC4RHrVNvjPX/ZEZfjbo9DYALqUEBGHpmgigX/KA37E2dSopA9JB6Tfj07QV4YA==
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=
through@^2.3.6:
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
tmp@0.0.29:
version "0.0.29"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0"
@ -1767,6 +2133,13 @@ tmp@0.0.29:
dependencies:
os-tmpdir "~1.0.1"
tmp@^0.0.33:
version "0.0.33"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
dependencies:
os-tmpdir "~1.0.2"
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"
@ -1791,7 +2164,25 @@ ts-node@^9.1.1:
source-map-support "^0.5.17"
yn "3.1.1"
tslib@^1.8.1:
tsconfig-paths-webpack-plugin@3.5.1:
version "3.5.1"
resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.1.tgz#e4dbf492a20dca9caab60086ddacb703afc2b726"
integrity sha512-n5CMlUUj+N5pjBhBACLq4jdr9cPTitySCjIosoQm0zwK99gmrcTGAfY9CwxRFT9+9OleNWXPRUcxsKP4AYExxQ==
dependencies:
chalk "^4.1.0"
enhanced-resolve "^5.7.0"
tsconfig-paths "^3.9.0"
tsconfig-paths@^3.9.0:
version "3.10.1"
resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz#79ae67a68c15289fdf5c51cb74f397522d795ed7"
integrity sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q==
dependencies:
json5 "^2.2.0"
minimist "^1.2.0"
strip-bom "^3.0.0"
tslib@^1.8.1, tslib@^1.9.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
@ -1820,6 +2211,11 @@ type-fest@^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==
type-fest@^0.21.3:
version "0.21.3"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
type-fest@^0.8.1:
version "0.8.1"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
@ -1844,6 +2240,11 @@ uc.micro@^1.0.1, uc.micro@^1.0.5:
resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac"
integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==
uglify-js@^3.1.4:
version "3.13.10"
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.10.tgz#a6bd0d28d38f592c3adb6b180ea6e07e1e540a8d"
integrity sha512-57H3ACYFXeo1IaZ1w02sfA71wI60MGco/IQFjOqK+WtKoprh7Go2/yvd2HPtoJILO2Or84ncLccI4xoHMTSbGg==
ukkonen@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/ukkonen/-/ukkonen-1.4.0.tgz#594629234ceccbf7e44187ad9fedbeb4866a2e5f"
@ -1901,7 +2302,7 @@ url-join@^1.1.0:
resolved "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz#741c6c2f4596c4830d6718460920d0c92202dc78"
integrity sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=
util-deprecate@~1.0.1:
util-deprecate@^1.0.1, 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=
@ -1947,6 +2348,13 @@ vscode-test@^1.5.2:
rimraf "^3.0.2"
unzipper "^0.10.11"
wcwidth@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=
dependencies:
defaults "^1.0.3"
which@2.0.2, which@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
@ -1966,12 +2374,17 @@ word-wrap@^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==
wordwrap@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
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:
wrap-ansi@7.0.0, 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==