From f7587e3e0174af1576d366e55d6eab55ef846676 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Sat, 3 Jul 2021 21:07:29 +0100 Subject: [PATCH 01/40] Very preliminary steps --- package.json | 4 ++++ src/extension.ts | 8 +++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 0ad026d93d..61b7ed4e81 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,10 @@ { "command": "cursorless.recomputeDecorationStyles", "title": "Cursorless: Recompute decoration styles" + }, + { + "command": "cursorless.recordTestCase", + "title": "Cursorless: Record test case" } ], "colors": [ diff --git a/src/extension.ts b/src/extension.ts index 0c9f1d8135..af3bbe0d14 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -82,7 +82,12 @@ export async function activate(context: vscode.ExtensionContext) { const graph = makeGraph(graphConstructors); var thatMark: SelectionWithEditor[] = []; - + const cursorlessRecordTestCaseDisposable = vscode.commands.registerCommand( + "cursorless.recordTestCase", + () => { + console.log("Hello world"); + } + ); const cursorlessCommandDisposable = vscode.commands.registerCommand( "cursorless.command", async ( @@ -200,6 +205,7 @@ export async function activate(context: vscode.ExtensionContext) { context.subscriptions.push( cursorlessCommandDisposable, + cursorlessRecordTestCaseDisposable, toggleDecorationsDisposable, recomputeDecorationStylesDisposable, vscode.workspace.onDidChangeConfiguration(recomputeDecorationStyles), From 815e8290c5757d98b3fa312abeb7c1e2434b48a9 Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Wed, 7 Jul 2021 14:09:21 -0700 Subject: [PATCH 02/40] Write test case info to file --- package.json | 4 +- src/NavigationMap.ts | 11 +- src/TestCase.ts | 86 ++ src/Types.ts | 16 + src/extension.ts | 18 +- yarn.lock | 2815 +++++++++++++++++++++--------------------- 6 files changed, 1532 insertions(+), 1418 deletions(-) create mode 100644 src/TestCase.ts diff --git a/package.json b/package.json index 61b7ed4e81..1ecca4330f 100644 --- a/package.json +++ b/package.json @@ -200,6 +200,7 @@ }, "devDependencies": { "@types/glob": "^7.1.3", + "@types/js-yaml": "^4.0.2", "@types/mocha": "^8.0.4", "@types/node": "^12.11.7", "@types/vscode": "^1.53.0", @@ -208,6 +209,7 @@ "esbuild": "^0.11.12", "eslint": "^7.15.0", "glob": "^7.1.6", + "js-yaml": "^3.14.1", "mocha": "^8.1.3", "typescript": "^4.1.2", "vscode-test": "^1.4.1" @@ -217,4 +219,4 @@ "immutability-helper": "^3.1.1", "lodash": "^4.17.21" } -} \ No newline at end of file +} diff --git a/src/NavigationMap.ts b/src/NavigationMap.ts index b40a733120..1c2e520afc 100644 --- a/src/NavigationMap.ts +++ b/src/NavigationMap.ts @@ -1,6 +1,7 @@ import { TextDocumentChangeEvent } from "vscode"; import { SymbolColor } from "./constants"; -import { Token } from "./Types"; +import { serializeRange } from "./TestCase"; +import { SimpleRange, Token } from "./Types"; /** * Maps from (color, character) pairs to tokens @@ -54,4 +55,12 @@ export default class NavigationMap { public getToken(color: SymbolColor, character: string) { return this.map[this.getKey(color, character)]; } + + public serializeRanges() { + const rangeMap: { [coloredSymbol: string]: SimpleRange } = {}; + Object.entries(this.map).forEach(([key, value]) => { + rangeMap[key] = serializeRange(value.range); + }); + return rangeMap; + } } diff --git a/src/TestCase.ts b/src/TestCase.ts new file mode 100644 index 0000000000..92ca242f10 --- /dev/null +++ b/src/TestCase.ts @@ -0,0 +1,86 @@ +import * as vscode from "vscode"; +import { Position, Range, Selection } from "vscode"; +import NavigationMap from "./NavigationMap"; +import * as yaml from "js-yaml"; +import { + ActionType, + PartialTarget, + SimplePosition, + SimpleRange, +} from "./Types"; +import { writeFileSync } from "fs"; + +export function serializeRange(range: Range): SimpleRange { + const { start, end } = range; + return { start: serializePosition(start), end: serializePosition(end) }; +} + +export function serializeSelection(selection: Selection) { + const { active, anchor } = selection; + return { active, anchor }; +} + +export function serializePosition(position: Position): SimplePosition { + const { line, character } = position; + return { line, character }; +} + +type Command = { + actionName: ActionType; + partialTargets: PartialTarget[]; + extraArgs: any[]; +}; + +type Snapshot = { + fileContent: string; + visibleRanges: SimpleRange[]; + selections: { + active: { line: number; character: number }; + anchor: { line: number; character: number }; + }[]; +}; + +export default class TestCase { + command: Command; + languageId: string; + navigationMap: { [coloredSymbol: string]: SimpleRange } | null; + initial: Snapshot | null = null; + result: Snapshot | null = null; + + constructor(command: Command, navigationMap: NavigationMap | null) { + const activeEditor = vscode.window.activeTextEditor!; + + this.command = command; + this.languageId = activeEditor.document.languageId; + this.navigationMap = navigationMap!.serializeRanges(); + } + + takeSnapshot() { + const activeEditor = vscode.window.activeTextEditor!; + + const snapshot: Snapshot = { + fileContent: activeEditor.document.getText(), + selections: activeEditor.selections.map(serializeSelection), + visibleRanges: activeEditor.visibleRanges.map(serializeRange), + }; + + if (this.initial == null) { + this.initial = snapshot; + } else if (this.result == null) { + this.result = snapshot; + } else { + throw Error("Initial and Result test snapshots already taken"); + } + } + + writeToFile() { + const fixture = yaml.dump({ + command: this.command, + languageId: this.languageId, + navigationMap: this.navigationMap, + initial: this.initial, + result: this.result, + }); + writeFileSync("/home/brock/code/cursorless-vscode/test.yaml", fixture); + } +} diff --git a/src/Types.ts b/src/Types.ts index f6568d1dcb..afb5dac5c1 100644 --- a/src/Types.ts +++ b/src/Types.ts @@ -272,3 +272,19 @@ export type SelectionExtractor = ( editor: vscode.TextEditor, node: SyntaxNode ) => SelectionWithContext | null; + +export interface DecorationColorSetting { + dark: string; + light: string; + highContrast: string; +} + +export type SimplePosition = { + line: number; + character: number; +}; + +export type SimpleRange = { + start: SimplePosition; + end: SimplePosition; +}; diff --git a/src/extension.ts b/src/extension.ts index af3bbe0d14..bb6109bd0a 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -15,6 +15,7 @@ import { } from "./Types"; import makeGraph from "./makeGraph"; import { logBranchTypes } from "./debug"; +import TestCase from "./TestCase"; export async function activate(context: vscode.ExtensionContext) { const fontMeasurements = new FontMeasurements(context); @@ -82,10 +83,12 @@ export async function activate(context: vscode.ExtensionContext) { const graph = makeGraph(graphConstructors); var thatMark: SelectionWithEditor[] = []; + var recordTestCase = true; //todo const cursorlessRecordTestCaseDisposable = vscode.commands.registerCommand( "cursorless.recordTestCase", () => { - console.log("Hello world"); + console.log("Recording test case for next command"); + recordTestCase = true; } ); const cursorlessCommandDisposable = vscode.commands.registerCommand( @@ -102,6 +105,13 @@ export async function activate(context: vscode.ExtensionContext) { console.debug(`extraArgs:`); console.debug(JSON.stringify(extraArgs, null, 3)); + let testCase: TestCase | null = null; + if (recordTestCase) { + const command = { actionName, partialTargets, extraArgs }; + testCase = new TestCase(command, navigationMap); + testCase.takeSnapshot(); + } + const action = graph.actions[actionName]; const selectionContents = @@ -155,6 +165,12 @@ export async function activate(context: vscode.ExtensionContext) { thatMark = newThatMark; + if (testCase != null) { + testCase.takeSnapshot(); + testCase.writeToFile(); + recordTestCase = true; //todo + } + return returnValue; // writeFileSync( diff --git a/yarn.lock b/yarn.lock index ba2f76bd90..c7ad6c0d66 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,1536 +3,1521 @@ "@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + "integrity" "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==" + "resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" + "version" "7.12.11" dependencies: "@babel/highlight" "^7.10.4" "@babel/helper-validator-identifier@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" - integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + "integrity" "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz" + "version" "7.12.11" "@babel/highlight@^7.10.4": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.12.13.tgz#8ab538393e00370b26271b01fa08f7f27f2e795c" - integrity sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww== + "integrity" "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==" + "resolved" "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz" + "version" "7.12.13" dependencies: "@babel/helper-validator-identifier" "^7.12.11" - chalk "^2.0.0" - js-tokens "^4.0.0" + "chalk" "^2.0.0" + "js-tokens" "^4.0.0" "@eslint/eslintrc@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.3.0.tgz#d736d6963d7003b6514e6324bec9c602ac340318" - integrity sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg== - dependencies: - ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.2.1" - js-yaml "^3.13.1" - lodash "^4.17.20" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" + "integrity" "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==" + "resolved" "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz" + "version" "0.3.0" + dependencies: + "ajv" "^6.12.4" + "debug" "^4.1.1" + "espree" "^7.3.0" + "globals" "^12.1.0" + "ignore" "^4.0.6" + "import-fresh" "^3.2.1" + "js-yaml" "^3.13.1" + "lodash" "^4.17.20" + "minimatch" "^3.0.4" + "strip-json-comments" "^3.1.1" "@nodelib/fs.scandir@2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" - integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== + "integrity" "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==" + "resolved" "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz" + "version" "2.1.4" dependencies: "@nodelib/fs.stat" "2.0.4" - run-parallel "^1.1.9" + "run-parallel" "^1.1.9" -"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" - integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.4": + "integrity" "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==" + "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz" + "version" "2.0.4" "@nodelib/fs.walk@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" - integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== + "integrity" "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==" + "resolved" "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz" + "version" "1.2.6" dependencies: "@nodelib/fs.scandir" "2.1.4" - fastq "^1.6.0" + "fastq" "^1.6.0" "@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + "integrity" "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + "resolved" "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" + "version" "1.1.2" "@types/glob@^7.1.3": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" - integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== + "integrity" "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==" + "resolved" "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz" + "version" "7.1.3" dependencies: "@types/minimatch" "*" "@types/node" "*" +"@types/js-yaml@^4.0.2": + "integrity" "sha512-KbeHS/Y4R+k+5sWXEYzAZKuB1yQlZtEghuhRxrVRLaqhtoG5+26JwQsa4HyS3AWX8v1Uwukma5HheduUDskasA==" + "resolved" "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.2.tgz" + "version" "4.0.2" + "@types/json-schema@^7.0.3": - version "7.0.7" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" - integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== + "integrity" "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==" + "resolved" "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz" + "version" "7.0.7" "@types/lodash@^4.14.168": - version "4.14.168" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.168.tgz#fe24632e79b7ade3f132891afff86caa5e5ce008" - integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q== + "integrity" "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==" + "resolved" "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz" + "version" "4.14.168" "@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + "integrity" "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" + "resolved" "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz" + "version" "3.0.3" "@types/mocha@^8.0.4": - version "8.2.0" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.0.tgz#3eb56d13a1de1d347ecb1957c6860c911704bc44" - integrity sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ== - -"@types/node@*": - version "14.14.27" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.27.tgz#c7127f8da0498993e13b1a42faf1303d3110d2f2" - integrity sha512-Ecfmo4YDQPwuqTCl1yBxLV5ihKfRlkBmzUEDcfIRvDxOTGQEeikr317Ln7Gcv0tjA8dVgKI3rniqW2G1OyKDng== + "integrity" "sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ==" + "resolved" "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.0.tgz" + "version" "8.2.0" -"@types/node@^12.11.7": - version "12.20.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.0.tgz#692dfdecd6c97f5380c42dd50f19261f9f604deb" - integrity sha512-0/41wHcurotvSOTHQUFkgL702c3pyWR1mToSrrX3pGPvGfpHTv3Ksx0M4UVuU5VJfjVb62Eyr1eKO1tWNUCg2Q== +"@types/node@*", "@types/node@^12.11.7": + "integrity" "sha512-0/41wHcurotvSOTHQUFkgL702c3pyWR1mToSrrX3pGPvGfpHTv3Ksx0M4UVuU5VJfjVb62Eyr1eKO1tWNUCg2Q==" + "resolved" "https://registry.npmjs.org/@types/node/-/node-12.20.0.tgz" + "version" "12.20.0" "@types/vscode@^1.53.0": - version "1.53.0" - resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.53.0.tgz#47b53717af6562f2ad05171bc9c8500824a3905c" - integrity sha512-XjFWbSPOM0EKIT2XhhYm3D3cx3nn3lshMUcWNy1eqefk+oqRuBq8unVb6BYIZqXy9lQZyeUl7eaBCOZWv+LcXQ== + "integrity" "sha512-XjFWbSPOM0EKIT2XhhYm3D3cx3nn3lshMUcWNy1eqefk+oqRuBq8unVb6BYIZqXy9lQZyeUl7eaBCOZWv+LcXQ==" + "resolved" "https://registry.npmjs.org/@types/vscode/-/vscode-1.53.0.tgz" + "version" "1.53.0" "@typescript-eslint/eslint-plugin@^4.9.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.15.0.tgz#13a5a07cf30d0d5781e43480aa2a8d38d308b084" - integrity sha512-DJgdGZW+8CFUTz5C/dnn4ONcUm2h2T0itWD85Ob5/V27Ndie8hUoX5HKyGssvR8sUMkAIlUc/AMK67Lqa3kBIQ== + "integrity" "sha512-DJgdGZW+8CFUTz5C/dnn4ONcUm2h2T0itWD85Ob5/V27Ndie8hUoX5HKyGssvR8sUMkAIlUc/AMK67Lqa3kBIQ==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.15.0.tgz" + "version" "4.15.0" dependencies: "@typescript-eslint/experimental-utils" "4.15.0" "@typescript-eslint/scope-manager" "4.15.0" - debug "^4.1.1" - functional-red-black-tree "^1.0.1" - lodash "^4.17.15" - regexpp "^3.0.0" - semver "^7.3.2" - tsutils "^3.17.1" + "debug" "^4.1.1" + "functional-red-black-tree" "^1.0.1" + "lodash" "^4.17.15" + "regexpp" "^3.0.0" + "semver" "^7.3.2" + "tsutils" "^3.17.1" "@typescript-eslint/experimental-utils@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.15.0.tgz#b87c36410a9b23f637689427be85007a2ec1a9c6" - integrity sha512-V4vaDWvxA2zgesg4KPgEGiomWEBpJXvY4ZX34Y3qxK8LUm5I87L+qGIOTd9tHZOARXNRt9pLbblSKiYBlGMawg== + "integrity" "sha512-V4vaDWvxA2zgesg4KPgEGiomWEBpJXvY4ZX34Y3qxK8LUm5I87L+qGIOTd9tHZOARXNRt9pLbblSKiYBlGMawg==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.15.0.tgz" + "version" "4.15.0" dependencies: "@types/json-schema" "^7.0.3" "@typescript-eslint/scope-manager" "4.15.0" "@typescript-eslint/types" "4.15.0" "@typescript-eslint/typescript-estree" "4.15.0" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" + "eslint-scope" "^5.0.0" + "eslint-utils" "^2.0.0" -"@typescript-eslint/parser@^4.9.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.15.0.tgz#8df94365b4b7161f9e8514fe28aef19954810b6b" - integrity sha512-L6Dtbq8Bc7g2aZwnIBETpmUa9XDKCMzKVwAArnGp5Mn7PRNFjf3mUzq8UeBjL3K8t311hvevnyqXAMSmxO8Gpg== +"@typescript-eslint/parser@^4.0.0", "@typescript-eslint/parser@^4.9.0": + "integrity" "sha512-L6Dtbq8Bc7g2aZwnIBETpmUa9XDKCMzKVwAArnGp5Mn7PRNFjf3mUzq8UeBjL3K8t311hvevnyqXAMSmxO8Gpg==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.15.0.tgz" + "version" "4.15.0" dependencies: "@typescript-eslint/scope-manager" "4.15.0" "@typescript-eslint/types" "4.15.0" "@typescript-eslint/typescript-estree" "4.15.0" - debug "^4.1.1" + "debug" "^4.1.1" "@typescript-eslint/scope-manager@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.15.0.tgz#c42703558ea6daaaba51a9c3a86f2902dbab9432" - integrity sha512-CSNBZnCC2jEA/a+pR9Ljh8Y+5TY5qgbPz7ICEk9WCpSEgT6Pi7H2RIjxfrrbUXvotd6ta+i27sssKEH8Azm75g== + "integrity" "sha512-CSNBZnCC2jEA/a+pR9Ljh8Y+5TY5qgbPz7ICEk9WCpSEgT6Pi7H2RIjxfrrbUXvotd6ta+i27sssKEH8Azm75g==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.15.0.tgz" + "version" "4.15.0" dependencies: "@typescript-eslint/types" "4.15.0" "@typescript-eslint/visitor-keys" "4.15.0" "@typescript-eslint/types@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.15.0.tgz#3011ae1ac3299bb9a5ac56bdd297cccf679d3662" - integrity sha512-su4RHkJhS+iFwyqyXHcS8EGPlUVoC+XREfy5daivjLur9JP8GhvTmDipuRpcujtGC4M+GYhUOJCPDE3rC5NJrg== + "integrity" "sha512-su4RHkJhS+iFwyqyXHcS8EGPlUVoC+XREfy5daivjLur9JP8GhvTmDipuRpcujtGC4M+GYhUOJCPDE3rC5NJrg==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.15.0.tgz" + "version" "4.15.0" "@typescript-eslint/typescript-estree@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.0.tgz#402c86a7d2111c1f7a2513022f22a38a395b7f93" - integrity sha512-jG6xTmcNbi6xzZq0SdWh7wQ9cMb2pqXaUp6bUZOMsIlu5aOlxGxgE/t6L/gPybybQGvdguajXGkZKSndZJpksA== + "integrity" "sha512-jG6xTmcNbi6xzZq0SdWh7wQ9cMb2pqXaUp6bUZOMsIlu5aOlxGxgE/t6L/gPybybQGvdguajXGkZKSndZJpksA==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.0.tgz" + "version" "4.15.0" dependencies: "@typescript-eslint/types" "4.15.0" "@typescript-eslint/visitor-keys" "4.15.0" - debug "^4.1.1" - globby "^11.0.1" - is-glob "^4.0.1" - semver "^7.3.2" - tsutils "^3.17.1" + "debug" "^4.1.1" + "globby" "^11.0.1" + "is-glob" "^4.0.1" + "semver" "^7.3.2" + "tsutils" "^3.17.1" "@typescript-eslint/visitor-keys@4.15.0": - version "4.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.15.0.tgz#2a07768df30c8a5673f1bce406338a07fdec38ca" - integrity sha512-RnDtJwOwFucWFAMjG3ghCG/ikImFJFEg20DI7mn4pHEx3vC48lIAoyjhffvfHmErRDboUPC7p9Z2il4CLb7qxA== + "integrity" "sha512-RnDtJwOwFucWFAMjG3ghCG/ikImFJFEg20DI7mn4pHEx3vC48lIAoyjhffvfHmErRDboUPC7p9Z2il4CLb7qxA==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.15.0.tgz" + "version" "4.15.0" dependencies: "@typescript-eslint/types" "4.15.0" - eslint-visitor-keys "^2.0.0" + "eslint-visitor-keys" "^2.0.0" "@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - -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@^7.4.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -ajv@^6.10.0, ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^7.0.2: - version "7.1.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.1.0.tgz#f982ea7933dc7f1012eae9eec5a86687d805421b" - integrity sha512-svS9uILze/cXbH0z2myCK2Brqprx/+JJYK5pHicT/GQiBfzzhUVAIT6MwqJg8y4xV/zoGsUeuPuwtoiKSGE15g== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-colors@4.1.1, ansi-colors@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -big-integer@^1.6.17: - version "1.6.48" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" - integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -binary@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" - integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= - dependencies: - buffers "~0.1.1" - chainsaw "~0.1.0" - -bluebird@~3.4.1: - version "3.4.7" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" - integrity sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM= - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.1, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -buffer-indexof-polyfill@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz#d2732135c5999c64b277fcf9b1abe3498254729c" - integrity sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A== - -buffers@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" - integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s= - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== - -chainsaw@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" - integrity sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= - dependencies: - traverse ">=0.3.0 <0.4" - -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chokidar@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" - integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.5.0" + "integrity" "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==" + "resolved" "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz" + "version" "1.1.2" + +"acorn-jsx@^5.3.1": + "integrity" "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==" + "resolved" "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz" + "version" "5.3.1" + +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^7.4.0": + "integrity" "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + "resolved" "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" + "version" "7.4.1" + +"agent-base@6": + "integrity" "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==" + "resolved" "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + "version" "6.0.2" + dependencies: + "debug" "4" + +"ajv@^6.10.0", "ajv@^6.12.4": + "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" + "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + "version" "6.12.6" + dependencies: + "fast-deep-equal" "^3.1.1" + "fast-json-stable-stringify" "^2.0.0" + "json-schema-traverse" "^0.4.1" + "uri-js" "^4.2.2" + +"ajv@^7.0.2": + "integrity" "sha512-svS9uILze/cXbH0z2myCK2Brqprx/+JJYK5pHicT/GQiBfzzhUVAIT6MwqJg8y4xV/zoGsUeuPuwtoiKSGE15g==" + "resolved" "https://registry.npmjs.org/ajv/-/ajv-7.1.0.tgz" + "version" "7.1.0" + dependencies: + "fast-deep-equal" "^3.1.1" + "json-schema-traverse" "^1.0.0" + "require-from-string" "^2.0.2" + "uri-js" "^4.2.2" + +"ansi-colors@^4.1.1", "ansi-colors@4.1.1": + "integrity" "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" + "resolved" "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" + "version" "4.1.1" + +"ansi-regex@^3.0.0": + "integrity" "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz" + "version" "3.0.0" + +"ansi-regex@^5.0.0": + "integrity" "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz" + "version" "5.0.0" + +"ansi-styles@^3.2.1": + "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + "version" "3.2.1" + dependencies: + "color-convert" "^1.9.0" + +"ansi-styles@^4.0.0", "ansi-styles@^4.1.0": + "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + "version" "4.3.0" + dependencies: + "color-convert" "^2.0.1" + +"anymatch@~3.1.1": + "integrity" "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==" + "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz" + "version" "3.1.1" + dependencies: + "normalize-path" "^3.0.0" + "picomatch" "^2.0.4" + +"argparse@^1.0.7": + "integrity" "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==" + "resolved" "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + "version" "1.0.10" + dependencies: + "sprintf-js" "~1.0.2" + +"argparse@^2.0.1": + "integrity" "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "resolved" "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + "version" "2.0.1" + +"array-union@^2.1.0": + "integrity" "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + "resolved" "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + "version" "2.1.0" + +"astral-regex@^2.0.0": + "integrity" "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" + "resolved" "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" + "version" "2.0.0" + +"balanced-match@^1.0.0": + "integrity" "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" + "version" "1.0.0" + +"big-integer@^1.6.17": + "integrity" "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==" + "resolved" "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz" + "version" "1.6.48" + +"binary-extensions@^2.0.0": + "integrity" "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + "version" "2.2.0" + +"binary@~0.3.0": + "integrity" "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=" + "resolved" "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz" + "version" "0.3.0" + dependencies: + "buffers" "~0.1.1" + "chainsaw" "~0.1.0" + +"bluebird@~3.4.1": + "integrity" "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" + "resolved" "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz" + "version" "3.4.7" + +"brace-expansion@^1.1.7": + "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" + "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + "version" "1.1.11" + dependencies: + "balanced-match" "^1.0.0" + "concat-map" "0.0.1" + +"braces@^3.0.1", "braces@~3.0.2": + "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" + "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + "version" "3.0.2" + dependencies: + "fill-range" "^7.0.1" + +"browser-stdout@1.3.1": + "integrity" "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + "resolved" "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" + "version" "1.3.1" + +"buffer-indexof-polyfill@~1.0.0": + "integrity" "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==" + "resolved" "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz" + "version" "1.0.2" + +"buffers@~0.1.1": + "integrity" "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" + "resolved" "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" + "version" "0.1.1" + +"callsites@^3.0.0": + "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + "version" "3.1.0" + +"camelcase@^6.0.0": + "integrity" "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz" + "version" "6.2.0" + +"chainsaw@~0.1.0": + "integrity" "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=" + "resolved" "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz" + "version" "0.1.0" + dependencies: + "traverse" ">=0.3.0 <0.4" + +"chalk@^2.0.0": + "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" + "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + "version" "2.4.2" + dependencies: + "ansi-styles" "^3.2.1" + "escape-string-regexp" "^1.0.5" + "supports-color" "^5.3.0" + +"chalk@^4.0.0": + "integrity" "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==" + "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz" + "version" "4.1.0" + dependencies: + "ansi-styles" "^4.1.0" + "supports-color" "^7.1.0" + +"chokidar@3.5.1": + "integrity" "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==" + "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz" + "version" "3.5.1" + dependencies: + "anymatch" "~3.1.1" + "braces" "~3.0.2" + "glob-parent" "~5.1.0" + "is-binary-path" "~2.1.0" + "is-glob" "~4.0.1" + "normalize-path" "~3.0.0" + "readdirp" "~3.5.0" optionalDependencies: - fsevents "~2.3.1" + "fsevents" "~2.3.1" -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== +"cliui@^7.0.2": + "integrity" "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==" + "resolved" "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + "version" "7.0.4" dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" + "string-width" "^4.2.0" + "strip-ansi" "^6.0.0" + "wrap-ansi" "^7.0.0" -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -debug@4, debug@4.3.1, debug@^4.0.1, debug@^4.1.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -deep-is@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - -diff@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -duplexer2@~0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= - dependencies: - readable-stream "^2.0.2" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -enquirer@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - -esbuild@^0.11.12: - version "0.11.12" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.11.12.tgz#8cbe15bcb44212624c3e77c896a835f74dc71c3c" - integrity sha512-c8cso/1RwVj+fbDvLtUgSG4ZJQ0y9Zdrl6Ot/GAjyy4pdMCHaFnDMts5gqFnWRPLajWtEnI+3hlET4R9fVoZng== - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -eslint-scope@^5.0.0, eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-utils@^2.0.0, eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== +"color-convert@^1.9.0": + "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" + "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + "version" "1.9.3" + dependencies: + "color-name" "1.1.3" + +"color-convert@^2.0.1": + "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" + "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "color-name" "~1.1.4" + +"color-name@~1.1.4": + "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + "version" "1.1.4" + +"color-name@1.1.3": + "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + "version" "1.1.3" + +"concat-map@0.0.1": + "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + "version" "0.0.1" + +"core-util-is@~1.0.0": + "integrity" "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "resolved" "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + "version" "1.0.2" + +"cross-spawn@^7.0.2": + "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==" + "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + "version" "7.0.3" + dependencies: + "path-key" "^3.1.0" + "shebang-command" "^2.0.0" + "which" "^2.0.1" + +"debug@^4.0.1", "debug@^4.1.1", "debug@4", "debug@4.3.1": + "integrity" "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==" + "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz" + "version" "4.3.1" + dependencies: + "ms" "2.1.2" + +"decamelize@^4.0.0": + "integrity" "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" + "resolved" "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" + "version" "4.0.0" + +"deep-is@^0.1.3": + "integrity" "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + "resolved" "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz" + "version" "0.1.3" + +"diff@5.0.0": + "integrity" "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" + "resolved" "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" + "version" "5.0.0" + +"dir-glob@^3.0.1": + "integrity" "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==" + "resolved" "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "path-type" "^4.0.0" + +"doctrine@^3.0.0": + "integrity" "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==" + "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "esutils" "^2.0.2" + +"duplexer2@~0.1.4": + "integrity" "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=" + "resolved" "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz" + "version" "0.1.4" + dependencies: + "readable-stream" "^2.0.2" + +"emoji-regex@^8.0.0": + "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + "version" "8.0.0" + +"enquirer@^2.3.5": + "integrity" "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==" + "resolved" "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" + "version" "2.3.6" + dependencies: + "ansi-colors" "^4.1.1" + +"esbuild@^0.11.12": + "integrity" "sha512-c8cso/1RwVj+fbDvLtUgSG4ZJQ0y9Zdrl6Ot/GAjyy4pdMCHaFnDMts5gqFnWRPLajWtEnI+3hlET4R9fVoZng==" + "resolved" "https://registry.npmjs.org/esbuild/-/esbuild-0.11.12.tgz" + "version" "0.11.12" + +"escalade@^3.1.1": + "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + "version" "3.1.1" + +"escape-string-regexp@^1.0.5": + "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + "version" "1.0.5" + +"escape-string-regexp@4.0.0": + "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + "version" "4.0.0" + +"eslint-scope@^5.0.0", "eslint-scope@^5.1.1": + "integrity" "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==" + "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "esrecurse" "^4.3.0" + "estraverse" "^4.1.1" + +"eslint-utils@^2.0.0", "eslint-utils@^2.1.0": + "integrity" "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==" + "resolved" "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "eslint-visitor-keys" "^1.1.0" + +"eslint-visitor-keys@^1.1.0", "eslint-visitor-keys@^1.3.0": + "integrity" "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" + "version" "1.3.0" -eslint-visitor-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" - integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== +"eslint-visitor-keys@^2.0.0": + "integrity" "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==" + "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz" + "version" "2.0.0" -eslint@^7.15.0: - version "7.20.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.20.0.tgz#db07c4ca4eda2e2316e7aa57ac7fc91ec550bdc7" - integrity sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw== +"eslint@*", "eslint@^5.0.0 || ^6.0.0 || ^7.0.0", "eslint@^7.15.0": + "integrity" "sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw==" + "resolved" "https://registry.npmjs.org/eslint/-/eslint-7.20.0.tgz" + "version" "7.20.0" dependencies: "@babel/code-frame" "7.12.11" "@eslint/eslintrc" "^0.3.0" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.0.1" - doctrine "^3.0.0" - enquirer "^2.3.5" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" - esquery "^1.4.0" - esutils "^2.0.2" - file-entry-cache "^6.0.0" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash "^4.17.20" - minimatch "^3.0.4" - natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^6.0.4" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== - dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.1.1: - version "3.2.5" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" - integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== + "ajv" "^6.10.0" + "chalk" "^4.0.0" + "cross-spawn" "^7.0.2" + "debug" "^4.0.1" + "doctrine" "^3.0.0" + "enquirer" "^2.3.5" + "eslint-scope" "^5.1.1" + "eslint-utils" "^2.1.0" + "eslint-visitor-keys" "^2.0.0" + "espree" "^7.3.1" + "esquery" "^1.4.0" + "esutils" "^2.0.2" + "file-entry-cache" "^6.0.0" + "functional-red-black-tree" "^1.0.1" + "glob-parent" "^5.0.0" + "globals" "^12.1.0" + "ignore" "^4.0.6" + "import-fresh" "^3.0.0" + "imurmurhash" "^0.1.4" + "is-glob" "^4.0.0" + "js-yaml" "^3.13.1" + "json-stable-stringify-without-jsonify" "^1.0.1" + "levn" "^0.4.1" + "lodash" "^4.17.20" + "minimatch" "^3.0.4" + "natural-compare" "^1.4.0" + "optionator" "^0.9.1" + "progress" "^2.0.0" + "regexpp" "^3.1.0" + "semver" "^7.2.1" + "strip-ansi" "^6.0.0" + "strip-json-comments" "^3.1.0" + "table" "^6.0.4" + "text-table" "^0.2.0" + "v8-compile-cache" "^2.0.3" + +"espree@^7.3.0", "espree@^7.3.1": + "integrity" "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==" + "resolved" "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz" + "version" "7.3.1" + dependencies: + "acorn" "^7.4.0" + "acorn-jsx" "^5.3.1" + "eslint-visitor-keys" "^1.3.0" + +"esprima@^4.0.0": + "integrity" "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "resolved" "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + "version" "4.0.1" + +"esquery@^1.4.0": + "integrity" "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==" + "resolved" "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "estraverse" "^5.1.0" + +"esrecurse@^4.3.0": + "integrity" "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==" + "resolved" "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + "version" "4.3.0" + dependencies: + "estraverse" "^5.2.0" + +"estraverse@^4.1.1": + "integrity" "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + "version" "4.3.0" + +"estraverse@^5.1.0", "estraverse@^5.2.0": + "integrity" "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz" + "version" "5.2.0" + +"esutils@^2.0.2": + "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + "resolved" "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + "version" "2.0.3" + +"fast-deep-equal@^3.1.1": + "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + "version" "3.1.3" + +"fast-glob@^3.1.1": + "integrity" "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==" + "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz" + "version" "3.2.5" dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.0" - merge2 "^1.3.0" - micromatch "^4.0.2" - picomatch "^2.2.1" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fastq@^1.6.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.1.tgz#8b8f2ac8bf3632d67afcd65dac248d5fdc45385e" - integrity sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA== - dependencies: - reusify "^1.0.4" - -file-entry-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a" - integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flatted@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" - integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -fstream@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" - integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== - dependencies: - is-glob "^4.0.1" - -glob@7.1.6, glob@^7.1.3, glob@^7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== - dependencies: - type-fest "^0.8.1" - -globby@^11.0.1: - version "11.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.2.tgz#1af538b766a3b540ebfb58a32b2e2d5897321d83" - integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" - -graceful-fs@^4.1.2, graceful-fs@^4.2.2: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + "glob-parent" "^5.1.0" + "merge2" "^1.3.0" + "micromatch" "^4.0.2" + "picomatch" "^2.2.1" + +"fast-json-stable-stringify@^2.0.0": + "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + "version" "2.1.0" + +"fast-levenshtein@^2.0.6": + "integrity" "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + "resolved" "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + "version" "2.0.6" + +"fastq@^1.6.0": + "integrity" "sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA==" + "resolved" "https://registry.npmjs.org/fastq/-/fastq-1.10.1.tgz" + "version" "1.10.1" + dependencies: + "reusify" "^1.0.4" + +"file-entry-cache@^6.0.0": + "integrity" "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==" + "resolved" "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz" + "version" "6.0.0" + dependencies: + "flat-cache" "^3.0.4" + +"fill-range@^7.0.1": + "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" + "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + "version" "7.0.1" + dependencies: + "to-regex-range" "^5.0.1" + +"find-up@5.0.0": + "integrity" "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==" + "resolved" "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + "version" "5.0.0" + dependencies: + "locate-path" "^6.0.0" + "path-exists" "^4.0.0" + +"flat-cache@^3.0.4": + "integrity" "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==" + "resolved" "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + "version" "3.0.4" + dependencies: + "flatted" "^3.1.0" + "rimraf" "^3.0.2" + +"flat@^5.0.2": + "integrity" "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" + "resolved" "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" + "version" "5.0.2" + +"flatted@^3.1.0": + "integrity" "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==" + "resolved" "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz" + "version" "3.1.1" + +"fs.realpath@^1.0.0": + "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + "version" "1.0.0" + +"fstream@^1.0.12": + "integrity" "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==" + "resolved" "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz" + "version" "1.0.12" + dependencies: + "graceful-fs" "^4.1.2" + "inherits" "~2.0.0" + "mkdirp" ">=0.5 0" + "rimraf" "2" + +"functional-red-black-tree@^1.0.1": + "integrity" "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + "resolved" "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" + "version" "1.0.1" + +"get-caller-file@^2.0.5": + "integrity" "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + "resolved" "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + "version" "2.0.5" + +"glob-parent@^5.0.0", "glob-parent@^5.1.0", "glob-parent@~5.1.0": + "integrity" "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==" + "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "is-glob" "^4.0.1" + +"glob@^7.1.3", "glob@^7.1.6", "glob@7.1.6": + "integrity" "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==" + "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" + "version" "7.1.6" + dependencies: + "fs.realpath" "^1.0.0" + "inflight" "^1.0.4" + "inherits" "2" + "minimatch" "^3.0.4" + "once" "^1.3.0" + "path-is-absolute" "^1.0.0" + +"globals@^12.1.0": + "integrity" "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==" + "resolved" "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz" + "version" "12.4.0" + dependencies: + "type-fest" "^0.8.1" + +"globby@^11.0.1": + "integrity" "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==" + "resolved" "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz" + "version" "11.0.2" + dependencies: + "array-union" "^2.1.0" + "dir-glob" "^3.0.1" + "fast-glob" "^3.1.1" + "ignore" "^5.1.4" + "merge2" "^1.3.0" + "slash" "^3.0.0" + +"graceful-fs@^4.1.2", "graceful-fs@^4.2.2": + "integrity" "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz" + "version" "4.2.6" + +"growl@1.10.5": + "integrity" "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" + "resolved" "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" + "version" "1.10.5" + +"has-flag@^3.0.0": + "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + "version" "3.0.0" + +"has-flag@^4.0.0": + "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + "version" "4.0.0" + +"he@1.2.0": + "integrity" "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + "resolved" "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + "version" "1.2.0" + +"http-proxy-agent@^4.0.1": + "integrity" "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==" + "resolved" "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" + "version" "4.0.1" dependencies: "@tootallnate/once" "1" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.1.4: - version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== - -immutability-helper@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/immutability-helper/-/immutability-helper-3.1.1.tgz#2b86b2286ed3b1241c9e23b7b21e0444f52f77b7" - integrity sha512-Q0QaXjPjwIju/28TsugCHNEASwoCcJSyJV3uO1sOIQGI0jKgm9f41Lvz0DZj3n46cNCyAZTsEYoY4C2bVRUzyQ== - -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@~2.0.0, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" - integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== - dependencies: - argparse "^2.0.1" - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -listenercount@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" - integrity sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash@^4.17.15, lodash@^4.17.20: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" - integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== - dependencies: - chalk "^4.0.0" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== - dependencies: - braces "^3.0.1" - picomatch "^2.0.5" - -minimatch@3.0.4, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" + "agent-base" "6" + "debug" "4" + +"https-proxy-agent@^5.0.0": + "integrity" "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==" + "resolved" "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz" + "version" "5.0.0" + dependencies: + "agent-base" "6" + "debug" "4" + +"ignore@^4.0.6": + "integrity" "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + "resolved" "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" + "version" "4.0.6" + +"ignore@^5.1.4": + "integrity" "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + "resolved" "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz" + "version" "5.1.8" + +"immutability-helper@^3.1.1": + "integrity" "sha512-Q0QaXjPjwIju/28TsugCHNEASwoCcJSyJV3uO1sOIQGI0jKgm9f41Lvz0DZj3n46cNCyAZTsEYoY4C2bVRUzyQ==" + "resolved" "https://registry.npmjs.org/immutability-helper/-/immutability-helper-3.1.1.tgz" + "version" "3.1.1" + +"import-fresh@^3.0.0", "import-fresh@^3.2.1": + "integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==" + "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + "version" "3.3.0" + dependencies: + "parent-module" "^1.0.0" + "resolve-from" "^4.0.0" + +"imurmurhash@^0.1.4": + "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + "version" "0.1.4" + +"inflight@^1.0.4": + "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" + "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + "version" "1.0.6" + dependencies: + "once" "^1.3.0" + "wrappy" "1" + +"inherits@~2.0.0", "inherits@~2.0.3", "inherits@2": + "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + "version" "2.0.4" + +"is-binary-path@~2.1.0": + "integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" + "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "binary-extensions" "^2.0.0" + +"is-extglob@^2.1.1": + "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + "version" "2.1.1" + +"is-fullwidth-code-point@^2.0.0": + "integrity" "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" + "version" "2.0.0" + +"is-fullwidth-code-point@^3.0.0": + "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + "version" "3.0.0" + +"is-glob@^4.0.0", "is-glob@^4.0.1", "is-glob@~4.0.1": + "integrity" "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==" + "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz" + "version" "4.0.1" + dependencies: + "is-extglob" "^2.1.1" + +"is-number@^7.0.0": + "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + "version" "7.0.0" + +"is-plain-obj@^2.1.0": + "integrity" "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + "resolved" "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" + "version" "2.1.0" + +"isarray@~1.0.0": + "integrity" "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + "version" "1.0.0" + +"isexe@^2.0.0": + "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + "version" "2.0.0" + +"js-tokens@^4.0.0": + "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + "version" "4.0.0" + +"js-yaml@^3.13.1", "js-yaml@^3.14.1": + "integrity" "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==" + "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + "version" "3.14.1" + dependencies: + "argparse" "^1.0.7" + "esprima" "^4.0.0" + +"js-yaml@4.0.0": + "integrity" "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==" + "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz" + "version" "4.0.0" + dependencies: + "argparse" "^2.0.1" + +"json-schema-traverse@^0.4.1": + "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + "version" "0.4.1" + +"json-schema-traverse@^1.0.0": + "integrity" "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + "version" "1.0.0" + +"json-stable-stringify-without-jsonify@^1.0.1": + "integrity" "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + "resolved" "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + "version" "1.0.1" + +"levn@^0.4.1": + "integrity" "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==" + "resolved" "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + "version" "0.4.1" + dependencies: + "prelude-ls" "^1.2.1" + "type-check" "~0.4.0" + +"listenercount@~1.0.1": + "integrity" "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" + "resolved" "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz" + "version" "1.0.1" + +"locate-path@^6.0.0": + "integrity" "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==" + "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + "version" "6.0.0" + dependencies: + "p-locate" "^5.0.0" + +"lodash@^4.17.15", "lodash@^4.17.20", "lodash@^4.17.21": + "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + "version" "4.17.21" + +"log-symbols@4.0.0": + "integrity" "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==" + "resolved" "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz" + "version" "4.0.0" + dependencies: + "chalk" "^4.0.0" + +"lru-cache@^6.0.0": + "integrity" "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" + "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + "version" "6.0.0" + dependencies: + "yallist" "^4.0.0" + +"merge2@^1.3.0": + "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + "resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + "version" "1.4.1" + +"micromatch@^4.0.2": + "integrity" "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==" + "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz" + "version" "4.0.2" + dependencies: + "braces" "^3.0.1" + "picomatch" "^2.0.5" + +"minimatch@^3.0.4", "minimatch@3.0.4": + "integrity" "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==" + "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" + "version" "3.0.4" + dependencies: + "brace-expansion" "^1.1.7" -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== +"minimist@^1.2.5": + "integrity" "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" + "version" "1.2.5" "mkdirp@>=0.5 0": - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + "integrity" "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==" + "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" + "version" "0.5.5" dependencies: - minimist "^1.2.5" + "minimist" "^1.2.5" -mocha@^8.1.3: - version "8.3.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.3.0.tgz#a83a7432d382ae1ca29686062d7fdc2c36f63fe5" - integrity sha512-TQqyC89V1J/Vxx0DhJIXlq9gbbL9XFNdeLQ1+JsnZsVaSOV1z3tWfw0qZmQJGQRIfkvZcs7snQnZnOCKoldq1Q== +"mocha@^8.1.3": + "integrity" "sha512-TQqyC89V1J/Vxx0DhJIXlq9gbbL9XFNdeLQ1+JsnZsVaSOV1z3tWfw0qZmQJGQRIfkvZcs7snQnZnOCKoldq1Q==" + "resolved" "https://registry.npmjs.org/mocha/-/mocha-8.3.0.tgz" + "version" "8.3.0" dependencies: "@ungap/promise-all-settled" "1.1.2" - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.1" - debug "4.3.1" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.1.6" - growl "1.10.5" - he "1.2.0" - js-yaml "4.0.0" - log-symbols "4.0.0" - minimatch "3.0.4" - ms "2.1.3" - nanoid "3.1.20" - serialize-javascript "5.0.1" - strip-json-comments "3.1.1" - supports-color "8.1.1" - which "2.0.2" - wide-align "1.1.3" - workerpool "6.1.0" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -nanoid@3.1.20: - version "3.1.20" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" - integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -queue-microtask@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.2.tgz#abf64491e6ecf0f38a6502403d4cda04f372dfd3" - integrity sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -readable-stream@^2.0.2, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readdirp@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" - integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== - dependencies: - picomatch "^2.2.1" - -regexpp@^3.0.0, regexpp@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-buffer@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -semver@^7.2.1, semver@^7.3.2: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== - dependencies: - lru-cache "^6.0.0" - -serialize-javascript@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" - integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== - dependencies: - randombytes "^2.1.0" - -setimmediate@~1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + "ansi-colors" "4.1.1" + "browser-stdout" "1.3.1" + "chokidar" "3.5.1" + "debug" "4.3.1" + "diff" "5.0.0" + "escape-string-regexp" "4.0.0" + "find-up" "5.0.0" + "glob" "7.1.6" + "growl" "1.10.5" + "he" "1.2.0" + "js-yaml" "4.0.0" + "log-symbols" "4.0.0" + "minimatch" "3.0.4" + "ms" "2.1.3" + "nanoid" "3.1.20" + "serialize-javascript" "5.0.1" + "strip-json-comments" "3.1.1" + "supports-color" "8.1.1" + "which" "2.0.2" + "wide-align" "1.1.3" + "workerpool" "6.1.0" + "yargs" "16.2.0" + "yargs-parser" "20.2.4" + "yargs-unparser" "2.0.0" + +"ms@2.1.2": + "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + "version" "2.1.2" + +"ms@2.1.3": + "integrity" "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + "version" "2.1.3" + +"nanoid@3.1.20": + "integrity" "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==" + "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz" + "version" "3.1.20" + +"natural-compare@^1.4.0": + "integrity" "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + "resolved" "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + "version" "1.4.0" + +"normalize-path@^3.0.0", "normalize-path@~3.0.0": + "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + "version" "3.0.0" + +"once@^1.3.0": + "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" + "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "wrappy" "1" + +"optionator@^0.9.1": + "integrity" "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==" + "resolved" "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + "version" "0.9.1" + dependencies: + "deep-is" "^0.1.3" + "fast-levenshtein" "^2.0.6" + "levn" "^0.4.1" + "prelude-ls" "^1.2.1" + "type-check" "^0.4.0" + "word-wrap" "^1.2.3" + +"p-limit@^3.0.2": + "integrity" "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==" + "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "yocto-queue" "^0.1.0" + +"p-locate@^5.0.0": + "integrity" "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==" + "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + "version" "5.0.0" + dependencies: + "p-limit" "^3.0.2" + +"parent-module@^1.0.0": + "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" + "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "callsites" "^3.0.0" + +"path-exists@^4.0.0": + "integrity" "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + "version" "4.0.0" + +"path-is-absolute@^1.0.0": + "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + "version" "1.0.1" + +"path-key@^3.1.0": + "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + "version" "3.1.1" + +"path-type@^4.0.0": + "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + "version" "4.0.0" + +"picomatch@^2.0.4", "picomatch@^2.0.5", "picomatch@^2.2.1": + "integrity" "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz" + "version" "2.2.2" + +"prelude-ls@^1.2.1": + "integrity" "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + "resolved" "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + "version" "1.2.1" + +"process-nextick-args@~2.0.0": + "integrity" "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "resolved" "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + "version" "2.0.1" + +"progress@^2.0.0": + "integrity" "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + "resolved" "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" + "version" "2.0.3" + +"punycode@^2.1.0": + "integrity" "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + "version" "2.1.1" + +"queue-microtask@^1.2.2": + "integrity" "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==" + "resolved" "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz" + "version" "1.2.2" + +"randombytes@^2.1.0": + "integrity" "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==" + "resolved" "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "safe-buffer" "^5.1.0" + +"readable-stream@^2.0.2", "readable-stream@~2.3.6": + "integrity" "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==" + "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" + "version" "2.3.7" + dependencies: + "core-util-is" "~1.0.0" + "inherits" "~2.0.3" + "isarray" "~1.0.0" + "process-nextick-args" "~2.0.0" + "safe-buffer" "~5.1.1" + "string_decoder" "~1.1.1" + "util-deprecate" "~1.0.1" + +"readdirp@~3.5.0": + "integrity" "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==" + "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz" + "version" "3.5.0" + dependencies: + "picomatch" "^2.2.1" + +"regexpp@^3.0.0", "regexpp@^3.1.0": + "integrity" "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==" + "resolved" "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz" + "version" "3.1.0" + +"require-directory@^2.1.1": + "integrity" "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + "resolved" "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + "version" "2.1.1" + +"require-from-string@^2.0.2": + "integrity" "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + "resolved" "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + "version" "2.0.2" + +"resolve-from@^4.0.0": + "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + "version" "4.0.0" + +"reusify@^1.0.4": + "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + "resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + "version" "1.0.4" + +"rimraf@^3.0.2": + "integrity" "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==" + "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + "version" "3.0.2" + dependencies: + "glob" "^7.1.3" + +"rimraf@2": + "integrity" "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==" + "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + "version" "2.7.1" + dependencies: + "glob" "^7.1.3" + +"run-parallel@^1.1.9": + "integrity" "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==" + "resolved" "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "queue-microtask" "^1.2.2" + +"safe-buffer@^5.1.0": + "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + "version" "5.2.1" + +"safe-buffer@~5.1.0", "safe-buffer@~5.1.1": + "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "version" "5.1.2" + +"semver@^7.2.1", "semver@^7.3.2": + "integrity" "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==" + "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz" + "version" "7.3.4" + dependencies: + "lru-cache" "^6.0.0" + +"serialize-javascript@5.0.1": + "integrity" "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==" + "resolved" "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz" + "version" "5.0.1" + dependencies: + "randombytes" "^2.1.0" + +"setimmediate@~1.0.4": + "integrity" "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + "resolved" "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + "version" "1.0.5" + +"shebang-command@^2.0.0": + "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" + "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "shebang-regex" "^3.0.0" + +"shebang-regex@^3.0.0": + "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + "version" "3.0.0" + +"slash@^3.0.0": + "integrity" "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + "resolved" "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + "version" "3.0.0" -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== +"slice-ansi@^4.0.0": + "integrity" "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==" + "resolved" "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" + "version" "4.0.0" dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + "ansi-styles" "^4.0.0" + "astral-regex" "^2.0.0" + "is-fullwidth-code-point" "^3.0.0" + +"sprintf-js@~1.0.2": + "integrity" "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "resolved" "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + "version" "1.0.3" + +"string_decoder@~1.1.1": + "integrity" "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==" + "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + "version" "1.1.1" dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" + "safe-buffer" "~5.1.0" -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== +"string-width@^1.0.2 || 2": + "integrity" "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==" + "resolved" "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" + "version" "2.1.1" dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" + "is-fullwidth-code-point" "^2.0.0" + "strip-ansi" "^4.0.0" -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== +"string-width@^4.1.0", "string-width@^4.2.0": + "integrity" "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==" + "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz" + "version" "4.2.0" dependencies: - safe-buffer "~5.1.0" + "emoji-regex" "^8.0.0" + "is-fullwidth-code-point" "^3.0.0" + "strip-ansi" "^6.0.0" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= +"strip-ansi@^4.0.0": + "integrity" "sha1-qEeQIusaw2iocTibY1JixQXuNo8=" + "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" + "version" "4.0.0" dependencies: - ansi-regex "^3.0.0" + "ansi-regex" "^3.0.0" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== +"strip-ansi@^6.0.0": + "integrity" "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==" + "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz" + "version" "6.0.0" dependencies: - ansi-regex "^5.0.0" + "ansi-regex" "^5.0.0" -strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +"strip-json-comments@^3.1.0", "strip-json-comments@^3.1.1", "strip-json-comments@3.1.1": + "integrity" "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + "version" "3.1.1" -supports-color@8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== +"supports-color@^5.3.0": + "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + "version" "5.5.0" dependencies: - has-flag "^4.0.0" + "has-flag" "^3.0.0" -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== +"supports-color@^7.1.0": + "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + "version" "7.2.0" dependencies: - has-flag "^3.0.0" + "has-flag" "^4.0.0" -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== +"supports-color@8.1.1": + "integrity" "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + "version" "8.1.1" dependencies: - has-flag "^4.0.0" + "has-flag" "^4.0.0" -table@^6.0.4: - version "6.0.7" - resolved "https://registry.yarnpkg.com/table/-/table-6.0.7.tgz#e45897ffbcc1bcf9e8a87bf420f2c9e5a7a52a34" - integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== +"table@^6.0.4": + "integrity" "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==" + "resolved" "https://registry.npmjs.org/table/-/table-6.0.7.tgz" + "version" "6.0.7" dependencies: - ajv "^7.0.2" - lodash "^4.17.20" - slice-ansi "^4.0.0" - string-width "^4.2.0" + "ajv" "^7.0.2" + "lodash" "^4.17.20" + "slice-ansi" "^4.0.0" + "string-width" "^4.2.0" -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +"text-table@^0.2.0": + "integrity" "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + "version" "0.2.0" -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== +"to-regex-range@^5.0.1": + "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" + "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + "version" "5.0.1" dependencies: - is-number "^7.0.0" + "is-number" "^7.0.0" "traverse@>=0.3.0 <0.4": - version "0.3.9" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" - integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= - -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tsutils@^3.17.1: - version "3.20.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.20.0.tgz#ea03ea45462e146b53d70ce0893de453ff24f698" - integrity sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg== - dependencies: - tslib "^1.8.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -typescript@^4.1.2: - version "4.1.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.5.tgz#123a3b214aaff3be32926f0d8f1f6e704eb89a72" - integrity sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA== - -unzipper@^0.10.11: - version "0.10.11" - resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.11.tgz#0b4991446472cbdb92ee7403909f26c2419c782e" - integrity sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw== - dependencies: - big-integer "^1.6.17" - binary "~0.3.0" - bluebird "~3.4.1" - buffer-indexof-polyfill "~1.0.0" - duplexer2 "~0.1.4" - fstream "^1.0.12" - graceful-fs "^4.2.2" - listenercount "~1.0.1" - readable-stream "~2.3.6" - setimmediate "~1.0.4" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -v8-compile-cache@^2.0.3: - version "2.2.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" - integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== - -vscode-test@^1.4.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/vscode-test/-/vscode-test-1.5.0.tgz#7bcb6b1aeac41d35c29f4404f8ca3399ae52e78e" - integrity sha512-svwE/mhBBqrB77C1U7pkUKfUmxnkzg0dLGi1vEmitsleu88oNsqZEhG3ANZrL/Ia4m0CW0oYEKRw2EojpFxLlQ== - dependencies: - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - rimraf "^3.0.2" - unzipper "^0.10.11" - -which@2.0.2, which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -word-wrap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -workerpool@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" - integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -y18n@^5.0.5: - version "5.0.5" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" - integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs-parser@^20.2.2: - version "20.2.5" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.5.tgz#5d37729146d3f894f39fc94b6796f5b239513186" - integrity sha512-jYRGS3zWy20NtDtK2kBgo/TlAoy5YUuhD9/LZ7z7W4j1Fdw2cqD0xEEclf8fxc8xjD6X5Qr+qQQwCEsP8iRiYg== - -yargs-unparser@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + "integrity" "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" + "resolved" "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz" + "version" "0.3.9" + +"tslib@^1.8.1": + "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + "version" "1.14.1" + +"tsutils@^3.17.1": + "integrity" "sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg==" + "resolved" "https://registry.npmjs.org/tsutils/-/tsutils-3.20.0.tgz" + "version" "3.20.0" + dependencies: + "tslib" "^1.8.1" + +"type-check@^0.4.0", "type-check@~0.4.0": + "integrity" "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==" + "resolved" "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + "version" "0.4.0" + dependencies: + "prelude-ls" "^1.2.1" + +"type-fest@^0.8.1": + "integrity" "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" + "version" "0.8.1" + +"typescript@^4.1.2", "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta": + "integrity" "sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA==" + "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz" + "version" "4.1.5" + +"unzipper@^0.10.11": + "integrity" "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==" + "resolved" "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz" + "version" "0.10.11" + dependencies: + "big-integer" "^1.6.17" + "binary" "~0.3.0" + "bluebird" "~3.4.1" + "buffer-indexof-polyfill" "~1.0.0" + "duplexer2" "~0.1.4" + "fstream" "^1.0.12" + "graceful-fs" "^4.2.2" + "listenercount" "~1.0.1" + "readable-stream" "~2.3.6" + "setimmediate" "~1.0.4" + +"uri-js@^4.2.2": + "integrity" "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==" + "resolved" "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + "version" "4.4.1" + dependencies: + "punycode" "^2.1.0" + +"util-deprecate@~1.0.1": + "integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "version" "1.0.2" + +"v8-compile-cache@^2.0.3": + "integrity" "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==" + "resolved" "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz" + "version" "2.2.0" + +"vscode-test@^1.4.1": + "integrity" "sha512-svwE/mhBBqrB77C1U7pkUKfUmxnkzg0dLGi1vEmitsleu88oNsqZEhG3ANZrL/Ia4m0CW0oYEKRw2EojpFxLlQ==" + "resolved" "https://registry.npmjs.org/vscode-test/-/vscode-test-1.5.0.tgz" + "version" "1.5.0" + dependencies: + "http-proxy-agent" "^4.0.1" + "https-proxy-agent" "^5.0.0" + "rimraf" "^3.0.2" + "unzipper" "^0.10.11" + +"which@^2.0.1", "which@2.0.2": + "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" + "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + "version" "2.0.2" + dependencies: + "isexe" "^2.0.0" + +"wide-align@1.1.3": + "integrity" "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==" + "resolved" "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz" + "version" "1.1.3" + dependencies: + "string-width" "^1.0.2 || 2" + +"word-wrap@^1.2.3": + "integrity" "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + "resolved" "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + "version" "1.2.3" + +"workerpool@6.1.0": + "integrity" "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==" + "resolved" "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz" + "version" "6.1.0" + +"wrap-ansi@^7.0.0": + "integrity" "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==" + "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + "version" "7.0.0" + dependencies: + "ansi-styles" "^4.0.0" + "string-width" "^4.1.0" + "strip-ansi" "^6.0.0" + +"wrappy@1": + "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + "version" "1.0.2" + +"y18n@^5.0.5": + "integrity" "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==" + "resolved" "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz" + "version" "5.0.5" + +"yallist@^4.0.0": + "integrity" "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "resolved" "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + "version" "4.0.0" + +"yargs-parser@^20.2.2", "yargs-parser@20.2.4": + "integrity" "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" + "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" + "version" "20.2.4" + +"yargs-unparser@2.0.0": + "integrity" "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==" + "resolved" "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "camelcase" "^6.0.0" + "decamelize" "^4.0.0" + "flat" "^5.0.2" + "is-plain-obj" "^2.1.0" + +"yargs@16.2.0": + "integrity" "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==" + "resolved" "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + "version" "16.2.0" + dependencies: + "cliui" "^7.0.2" + "escalade" "^3.1.1" + "get-caller-file" "^2.0.5" + "require-directory" "^2.1.1" + "string-width" "^4.2.0" + "y18n" "^5.0.5" + "yargs-parser" "^20.2.2" + +"yocto-queue@^0.1.0": + "integrity" "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + "resolved" "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + "version" "0.1.0" From ed4ee0df5fea962c0eab2f1b41982e1a77d205d4 Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Wed, 7 Jul 2021 16:39:40 -0700 Subject: [PATCH 03/40] Save only target decorations --- src/TestCase.ts | 149 ++++++++++++++++++++++++++++++++++------------- src/Types.ts | 16 ----- src/extension.ts | 20 +++---- 3 files changed, 118 insertions(+), 67 deletions(-) diff --git a/src/TestCase.ts b/src/TestCase.ts index 92ca242f10..83681eeb6d 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -1,28 +1,37 @@ +import * as yaml from "js-yaml"; import * as vscode from "vscode"; import { Position, Range, Selection } from "vscode"; import NavigationMap from "./NavigationMap"; -import * as yaml from "js-yaml"; -import { - ActionType, - PartialTarget, - SimplePosition, - SimpleRange, -} from "./Types"; -import { writeFileSync } from "fs"; - -export function serializeRange(range: Range): SimpleRange { - const { start, end } = range; - return { start: serializePosition(start), end: serializePosition(end) }; +import { ActionType, PartialTarget, PrimitiveTarget, Target } from "./Types"; + +export type SerializedPosition = { + line: number; + character: number; +}; + +export type SerializedRange = { + start: SerializedPosition; + end: SerializedPosition; +}; + +export type SerializedSelection = { + anchor: SerializedPosition; + active: SerializedPosition; +}; + +export function serializeRange(range: Range): SerializedRange { + return { + start: serializePosition(range.start), + end: serializePosition(range.end), + }; } -export function serializeSelection(selection: Selection) { - const { active, anchor } = selection; - return { active, anchor }; +export function serializeSelection(selection: Selection): SerializedSelection { + return { active: selection.active, anchor: selection.anchor }; } -export function serializePosition(position: Position): SimplePosition { - const { line, character } = position; - return { line, character }; +export function serializePosition(position: Position): SerializedPosition { + return { line: position.line, character: position.character }; } type Command = { @@ -32,55 +41,113 @@ type Command = { }; type Snapshot = { - fileContent: string; - visibleRanges: SimpleRange[]; - selections: { - active: { line: number; character: number }; - anchor: { line: number; character: number }; - }[]; + document: string; + visibleRanges: SerializedRange[]; + selections: SerializedSelection[]; }; +type DecorationRanges = { [coloredSymbol: string]: SerializedRange }; + export default class TestCase { command: Command; languageId: string; - navigationMap: { [coloredSymbol: string]: SimpleRange } | null; - initial: Snapshot | null = null; - result: Snapshot | null = null; + decorations: DecorationRanges | null; + initialState: Snapshot | null = null; + finalState: Snapshot | null = null; - constructor(command: Command, navigationMap: NavigationMap | null) { + constructor( + command: Command, + targets: Target[], + navigationMap: NavigationMap + ) { const activeEditor = vscode.window.activeTextEditor!; this.command = command; this.languageId = activeEditor.document.languageId; - this.navigationMap = navigationMap!.serializeRanges(); + this.decorations = this.extractTargetedDecorations(targets, navigationMap); + } + + extractPrimitiveTargetKeys(...targets: PrimitiveTarget[]) { + const keys = []; + for (const target of targets) { + if (target.mark.type === "decoratedSymbol") { + keys.push(`${target.mark.symbolColor}.${target.mark.character}`); + } + } + return keys; + } + + extractTargetKeys(target: Target): string[] { + switch (target.type) { + case "primitive": + return this.extractPrimitiveTargetKeys(target); + + case "list": + return target.elements + .map((element) => this.extractTargetKeys(element)) + .flat(); + + case "range": + return this.extractPrimitiveTargetKeys(target.start, target.end); + + default: + return []; + } + } + + extractTargetedDecorations(targets: Target[], navigationMap: NavigationMap) { + if (!navigationMap) { + return null; + } + + const decorationRanges = navigationMap.serializeRanges(); + const targetedDecorations: DecorationRanges = {}; + for (const target of targets) { + this.extractTargetKeys(target).forEach((key) => { + targetedDecorations[key] = decorationRanges[key]; + }); + } + return targetedDecorations; } takeSnapshot() { const activeEditor = vscode.window.activeTextEditor!; const snapshot: Snapshot = { - fileContent: activeEditor.document.getText(), + document: activeEditor.document.getText(), selections: activeEditor.selections.map(serializeSelection), visibleRanges: activeEditor.visibleRanges.map(serializeRange), }; - if (this.initial == null) { - this.initial = snapshot; - } else if (this.result == null) { - this.result = snapshot; + if (this.initialState == null) { + this.initialState = snapshot; + } else if (this.finalState == null) { + this.finalState = snapshot; } else { - throw Error("Initial and Result test snapshots already taken"); + throw Error("Both test snapshots already taken"); } } - writeToFile() { - const fixture = yaml.dump({ + toYaml() { + return yaml.dump({ command: this.command, languageId: this.languageId, - navigationMap: this.navigationMap, - initial: this.initial, - result: this.result, + decorations: this.decorations, + initialState: this.initialState, + finalState: this.finalState, + }); + } + + async presentFixture() { + const fixture = this.toYaml(); + const document = await vscode.workspace.openTextDocument({ + language: "yaml", + content: fixture, + }); + await vscode.window.showTextDocument(document, { + preserveFocus: true, + preview: true, + viewColumn: vscode.ViewColumn.Beside, }); - writeFileSync("/home/brock/code/cursorless-vscode/test.yaml", fixture); } } diff --git a/src/Types.ts b/src/Types.ts index afb5dac5c1..f6568d1dcb 100644 --- a/src/Types.ts +++ b/src/Types.ts @@ -272,19 +272,3 @@ export type SelectionExtractor = ( editor: vscode.TextEditor, node: SyntaxNode ) => SelectionWithContext | null; - -export interface DecorationColorSetting { - dark: string; - light: string; - highContrast: string; -} - -export type SimplePosition = { - line: number; - character: number; -}; - -export type SimpleRange = { - start: SimplePosition; - end: SimplePosition; -}; diff --git a/src/extension.ts b/src/extension.ts index bb6109bd0a..0ce6477125 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -83,7 +83,7 @@ export async function activate(context: vscode.ExtensionContext) { const graph = makeGraph(graphConstructors); var thatMark: SelectionWithEditor[] = []; - var recordTestCase = true; //todo + var recordTestCase = false; const cursorlessRecordTestCaseDisposable = vscode.commands.registerCommand( "cursorless.recordTestCase", () => { @@ -105,13 +105,6 @@ export async function activate(context: vscode.ExtensionContext) { console.debug(`extraArgs:`); console.debug(JSON.stringify(extraArgs, null, 3)); - let testCase: TestCase | null = null; - if (recordTestCase) { - const command = { actionName, partialTargets, extraArgs }; - testCase = new TestCase(command, navigationMap); - testCase.takeSnapshot(); - } - const action = graph.actions[actionName]; const selectionContents = @@ -144,6 +137,13 @@ export async function activate(context: vscode.ExtensionContext) { // console.log(`targets:`); // console.log(JSON.stringify(targets, null, 3)); + let testCase: TestCase | null = null; + if (recordTestCase) { + const command = { actionName, partialTargets, extraArgs }; + testCase = new TestCase(command, targets, navigationMap!); + testCase.takeSnapshot(); + } + const processedTargetsContext: ProcessedTargetsContext = { currentSelections: vscode.window.activeTextEditor?.selections.map((selection) => ({ @@ -167,8 +167,8 @@ export async function activate(context: vscode.ExtensionContext) { if (testCase != null) { testCase.takeSnapshot(); - testCase.writeToFile(); - recordTestCase = true; //todo + testCase.presentFixture(); + recordTestCase = false; } return returnValue; From 3d0e8b065a77639b7392db1700ba41318017c1dd Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Thu, 8 Jul 2021 15:39:02 -0700 Subject: [PATCH 04/40] Don't use yaml refs in test case fixtures --- src/NavigationMap.ts | 6 +++--- src/TestCase.ts | 25 +++++++++++-------------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/src/NavigationMap.ts b/src/NavigationMap.ts index 1c2e520afc..32c96ec7fe 100644 --- a/src/NavigationMap.ts +++ b/src/NavigationMap.ts @@ -1,7 +1,7 @@ import { TextDocumentChangeEvent } from "vscode"; import { SymbolColor } from "./constants"; -import { serializeRange } from "./TestCase"; -import { SimpleRange, Token } from "./Types"; +import { SerializedRange, serializeRange } from "./TestCase"; +import { Token } from "./Types"; /** * Maps from (color, character) pairs to tokens @@ -57,7 +57,7 @@ export default class NavigationMap { } public serializeRanges() { - const rangeMap: { [coloredSymbol: string]: SimpleRange } = {}; + const rangeMap: { [coloredSymbol: string]: SerializedRange } = {}; Object.entries(this.map).forEach(([key, value]) => { rangeMap[key] = serializeRange(value.range); }); diff --git a/src/TestCase.ts b/src/TestCase.ts index 83681eeb6d..85a036b3cc 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -68,12 +68,12 @@ export default class TestCase { } extractPrimitiveTargetKeys(...targets: PrimitiveTarget[]) { - const keys = []; - for (const target of targets) { + const keys: string[] = []; + targets.forEach((target) => { if (target.mark.type === "decoratedSymbol") { keys.push(`${target.mark.symbolColor}.${target.mark.character}`); } - } + }); return keys; } @@ -83,9 +83,7 @@ export default class TestCase { return this.extractPrimitiveTargetKeys(target); case "list": - return target.elements - .map((element) => this.extractTargetKeys(element)) - .flat(); + return target.elements.map(this.extractTargetKeys, this).flat(); case "range": return this.extractPrimitiveTargetKeys(target.start, target.end); @@ -102,17 +100,15 @@ export default class TestCase { const decorationRanges = navigationMap.serializeRanges(); const targetedDecorations: DecorationRanges = {}; - for (const target of targets) { - this.extractTargetKeys(target).forEach((key) => { - targetedDecorations[key] = decorationRanges[key]; - }); - } + const targetKeys = targets.map(this.extractTargetKeys, this).flat(); + targetKeys.forEach((key) => { + targetedDecorations[key] = decorationRanges[key]; + }); return targetedDecorations; } takeSnapshot() { const activeEditor = vscode.window.activeTextEditor!; - const snapshot: Snapshot = { document: activeEditor.document.getText(), selections: activeEditor.selections.map(serializeSelection), @@ -129,13 +125,14 @@ export default class TestCase { } toYaml() { - return yaml.dump({ + const fixture = { command: this.command, languageId: this.languageId, decorations: this.decorations, initialState: this.initialState, finalState: this.finalState, - }); + }; + return yaml.dump(fixture, { noRefs: true }); } async presentFixture() { From e9b60e41b8f8f1dfc41dd292fbb7d6002e4cd8f0 Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Fri, 9 Jul 2021 09:45:10 -0700 Subject: [PATCH 05/40] Record clipboard contents in snapshots --- src/TestCase.ts | 4 +++- src/extension.ts | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/TestCase.ts b/src/TestCase.ts index 85a036b3cc..c03f1deefe 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -42,6 +42,7 @@ type Command = { type Snapshot = { document: string; + clipboard: string | undefined; visibleRanges: SerializedRange[]; selections: SerializedSelection[]; }; @@ -107,12 +108,13 @@ export default class TestCase { return targetedDecorations; } - takeSnapshot() { + async takeSnapshot() { const activeEditor = vscode.window.activeTextEditor!; const snapshot: Snapshot = { document: activeEditor.document.getText(), selections: activeEditor.selections.map(serializeSelection), visibleRanges: activeEditor.visibleRanges.map(serializeRange), + clipboard: await vscode.env.clipboard.readText(), }; if (this.initialState == null) { diff --git a/src/extension.ts b/src/extension.ts index 0ce6477125..b72b1da94e 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -141,7 +141,7 @@ export async function activate(context: vscode.ExtensionContext) { if (recordTestCase) { const command = { actionName, partialTargets, extraArgs }; testCase = new TestCase(command, targets, navigationMap!); - testCase.takeSnapshot(); + await testCase.takeSnapshot(); } const processedTargetsContext: ProcessedTargetsContext = { @@ -166,7 +166,7 @@ export async function activate(context: vscode.ExtensionContext) { thatMark = newThatMark; if (testCase != null) { - testCase.takeSnapshot(); + await testCase.takeSnapshot(); testCase.presentFixture(); recordTestCase = false; } From efb696c2261d45d7cd83d5f7f548282e0a75501b Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Sat, 10 Jul 2021 15:23:56 -0700 Subject: [PATCH 06/40] Run recorded test cases --- src/TestCase.ts | 37 +++++++--- src/extension.ts | 14 +++- src/test/suite/inferFullTargets.test.ts | 2 +- src/test/suite/processTargets.test.ts | 2 +- src/test/suite/recorded.test.ts | 95 +++++++++++++++++++++++++ 5 files changed, 138 insertions(+), 12 deletions(-) create mode 100644 src/test/suite/recorded.test.ts diff --git a/src/TestCase.ts b/src/TestCase.ts index c03f1deefe..b697709dc2 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -27,7 +27,10 @@ export function serializeRange(range: Range): SerializedRange { } export function serializeSelection(selection: Selection): SerializedSelection { - return { active: selection.active, anchor: selection.anchor }; + return { + active: serializePosition(selection.active), + anchor: serializePosition(selection.anchor), + }; } export function serializePosition(position: Position): SerializedPosition { @@ -42,17 +45,25 @@ type Command = { type Snapshot = { document: string; - clipboard: string | undefined; + clipboard: string; visibleRanges: SerializedRange[]; selections: SerializedSelection[]; }; type DecorationRanges = { [coloredSymbol: string]: SerializedRange }; +export type TestCaseFixture = { + command: Command; + languageId: string; + decorations: DecorationRanges; + initialState: Snapshot; + finalState: Snapshot; +}; + export default class TestCase { command: Command; languageId: string; - decorations: DecorationRanges | null; + decorations: DecorationRanges; initialState: Snapshot | null = null; finalState: Snapshot | null = null; @@ -96,7 +107,7 @@ export default class TestCase { extractTargetedDecorations(targets: Target[], navigationMap: NavigationMap) { if (!navigationMap) { - return null; + return {}; } const decorationRanges = navigationMap.serializeRanges(); @@ -108,26 +119,35 @@ export default class TestCase { return targetedDecorations; } - async takeSnapshot() { + static async getSnapshot(): Promise { const activeEditor = vscode.window.activeTextEditor!; - const snapshot: Snapshot = { + return { document: activeEditor.document.getText(), selections: activeEditor.selections.map(serializeSelection), visibleRanges: activeEditor.visibleRanges.map(serializeRange), clipboard: await vscode.env.clipboard.readText(), }; + } + + async saveSnapshot() { + const snapshot = await TestCase.getSnapshot(); if (this.initialState == null) { this.initialState = snapshot; } else if (this.finalState == null) { this.finalState = snapshot; } else { - throw Error("Both test snapshots already taken"); + throw Error("Both snapshots already taken"); } + + return snapshot; } toYaml() { - const fixture = { + if (this.initialState == null || this.finalState == null) { + throw Error("Two snapshots must be taken before serializing"); + } + const fixture: TestCaseFixture = { command: this.command, languageId: this.languageId, decorations: this.decorations, @@ -138,6 +158,7 @@ export default class TestCase { } async presentFixture() { + // TODO: naming convention for fixture files? const fixture = this.toYaml(); const document = await vscode.workspace.openTextDocument({ language: "yaml", diff --git a/src/extension.ts b/src/extension.ts index b72b1da94e..528babceae 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -89,6 +89,14 @@ export async function activate(context: vscode.ExtensionContext) { () => { console.log("Recording test case for next command"); recordTestCase = true; + // Empty clipboard to avoid accidentally cluttering fixtures + vscode.env.clipboard.writeText(""); + } + ); + const cursorlessSetNavigationMapDisposable = vscode.commands.registerCommand( + "cursorless.setNavigationMap", + (newNavigationMap: NavigationMap) => { + navigationMap = newNavigationMap; } ); const cursorlessCommandDisposable = vscode.commands.registerCommand( @@ -141,7 +149,7 @@ export async function activate(context: vscode.ExtensionContext) { if (recordTestCase) { const command = { actionName, partialTargets, extraArgs }; testCase = new TestCase(command, targets, navigationMap!); - await testCase.takeSnapshot(); + await testCase.saveSnapshot(); } const processedTargetsContext: ProcessedTargetsContext = { @@ -166,7 +174,7 @@ export async function activate(context: vscode.ExtensionContext) { thatMark = newThatMark; if (testCase != null) { - await testCase.takeSnapshot(); + await testCase.saveSnapshot(); testCase.presentFixture(); recordTestCase = false; } @@ -197,6 +205,7 @@ export async function activate(context: vscode.ExtensionContext) { // const processedTargets = processTargets(navigationMap!, targets); } catch (e) { vscode.window.showErrorMessage(e.message); + console.trace(e.message); throw e; } } @@ -224,6 +233,7 @@ export async function activate(context: vscode.ExtensionContext) { cursorlessRecordTestCaseDisposable, toggleDecorationsDisposable, recomputeDecorationStylesDisposable, + cursorlessSetNavigationMapDisposable, vscode.workspace.onDidChangeConfiguration(recomputeDecorationStyles), vscode.window.onDidChangeTextEditorVisibleRanges(addDecorationsDebounced), vscode.window.onDidChangeActiveTextEditor(addDecorationsDebounced), diff --git a/src/test/suite/inferFullTargets.test.ts b/src/test/suite/inferFullTargets.test.ts index 9358f72489..d0ae191f4f 100644 --- a/src/test/suite/inferFullTargets.test.ts +++ b/src/test/suite/inferFullTargets.test.ts @@ -3,7 +3,7 @@ import * as assert from "assert"; import { inferFullTargets } from "../../inferFullTargets"; import fixture from "./fixtures/inferFullTargets.fixture"; -suite("inferFullTargets", () => { +suite.skip("inferFullTargets", () => { fixture.forEach(({ input, expectedOutput }, index) => { test(`inferFullTargets ${index}`, () => { assert.deepStrictEqual( diff --git a/src/test/suite/processTargets.test.ts b/src/test/suite/processTargets.test.ts index 9742b0fe6e..b58d226cbd 100644 --- a/src/test/suite/processTargets.test.ts +++ b/src/test/suite/processTargets.test.ts @@ -8,7 +8,7 @@ import processTargets from "../../processTargets"; import { Target, Token } from "../../Types"; // import * as myExtension from '../../extension'; -suite("processTargets", () => { +suite.skip("processTargets", () => { test("simple processTargets", () => { const navigationMap = new NavigationMap(); const token: Token = { diff --git a/src/test/suite/recorded.test.ts b/src/test/suite/recorded.test.ts new file mode 100644 index 0000000000..c224d5955e --- /dev/null +++ b/src/test/suite/recorded.test.ts @@ -0,0 +1,95 @@ +import * as assert from "assert"; +import { promises as fsp } from "fs"; +import * as path from "path"; +import * as yaml from "js-yaml"; +import * as vscode from "vscode"; +import NavigationMap from "../../NavigationMap"; +import TestCase, { + SerializedPosition, + SerializedRange, + SerializedSelection, + TestCaseFixture, +} from "../../TestCase"; +import { Token } from "../../Types"; + +function deserializePosition(position: SerializedPosition) { + return new vscode.Position(position.line, position.character); +} + +function deserializeRange(range: SerializedRange) { + return new vscode.Range( + deserializePosition(range.start), + deserializePosition(range.end) + ); +} + +function deserializeSelection( + selection: SerializedSelection +): vscode.Selection { + const active = deserializePosition(selection.active); + const anchor = deserializePosition(selection.anchor); + return new vscode.Selection(anchor, active); +} + +suite("recorded test cases", async function () { + const directory = path.join( + __dirname, + // TODO What's the best way to handle this? + "../../../src/test/suite/recordings" + ); + const files = await fsp.readdir(directory); + + files.forEach(async (file) => { + test(file.split(".")[0], async function () { + this.timeout(100000); + const buffer = await fsp.readFile(path.join(directory, file)); + const fixture = yaml.load(buffer.toString()) as TestCaseFixture; + + await vscode.commands.executeCommand("workbench.action.closeAllEditors"); + const document = await vscode.workspace.openTextDocument({ + language: fixture.languageId, + content: fixture.initialState.document, + }); + const editor = await vscode.window.showTextDocument(document); + + await vscode.env.clipboard.writeText(fixture.initialState.clipboard); + editor.selections = + fixture.initialState.selections.map(deserializeSelection); + + // TODO restore visible ranges? + // Not sure of a straightforward way to do this. Maybe just use to test folding? + + const navigationMap = new NavigationMap(); + Object.entries(fixture.decorations).forEach(([key, value], index) => { + const range = deserializeRange(value); + const text = editor.document.getText(range); + // TODO not a big fan of this, need a better way to create tokens + const token: Token = { + text, + range, + startOffset: editor.document.offsetAt(range.start) + index, + endOffset: editor.document.offsetAt(range.end) + index + text.length, + displayLine: value.start.line, // TODO depends on visible ranges? See above + editor: vscode.window.activeTextEditor!, + }; + const [color, character] = key.split("."); + // @ts-ignore TODO should probably add a decoration color type? + navigationMap.addToken(color, character, token); + }); + + await vscode.commands.executeCommand( + "cursorless.setNavigationMap", + navigationMap + ); + + await vscode.commands.executeCommand( + "cursorless.command", + fixture.command.actionName, + fixture.command.partialTargets, + ...fixture.command.extraArgs + ); + + assert.deepStrictEqual(fixture.finalState, await TestCase.getSnapshot()); + }); + }); +}); From e95a993fa9ff777d0dd23a5e4008e06ad638fccc Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Mon, 12 Jul 2021 19:52:55 -0700 Subject: [PATCH 07/40] Only save clipboard contents in copy/paste actions --- src/TestCase.ts | 4 ++++ src/extension.ts | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/TestCase.ts b/src/TestCase.ts index b697709dc2..7bc9adf0e1 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -132,6 +132,10 @@ export default class TestCase { async saveSnapshot() { const snapshot = await TestCase.getSnapshot(); + if (!["copy", "paste"].includes(this.command.actionName)) { + snapshot.clipboard = ""; + } + if (this.initialState == null) { this.initialState = snapshot; } else if (this.finalState == null) { diff --git a/src/extension.ts b/src/extension.ts index 528babceae..c3af7fe8c9 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -89,8 +89,6 @@ export async function activate(context: vscode.ExtensionContext) { () => { console.log("Recording test case for next command"); recordTestCase = true; - // Empty clipboard to avoid accidentally cluttering fixtures - vscode.env.clipboard.writeText(""); } ); const cursorlessSetNavigationMapDisposable = vscode.commands.registerCommand( From b06f27fe3ed59985ca8c733e8eb4d35ff84c3706 Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Mon, 12 Jul 2021 19:53:22 -0700 Subject: [PATCH 08/40] Reuse navigation map key creation --- src/NavigationMap.ts | 6 +++--- src/TestCase.ts | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/NavigationMap.ts b/src/NavigationMap.ts index 32c96ec7fe..49b20fe08a 100644 --- a/src/NavigationMap.ts +++ b/src/NavigationMap.ts @@ -44,16 +44,16 @@ export default class NavigationMap { [coloredSymbol: string]: Token; } = {}; - private getKey(color: SymbolColor, character: string) { + static getKey(color: SymbolColor, character: string) { return `${color}.${character}`; } public addToken(color: SymbolColor, character: string, token: Token) { - this.map[this.getKey(color, character)] = token; + this.map[NavigationMap.getKey(color, character)] = token; } public getToken(color: SymbolColor, character: string) { - return this.map[this.getKey(color, character)]; + return this.map[NavigationMap.getKey(color, character)]; } public serializeRanges() { diff --git a/src/TestCase.ts b/src/TestCase.ts index 7bc9adf0e1..8f23ff4aec 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -83,7 +83,8 @@ export default class TestCase { const keys: string[] = []; targets.forEach((target) => { if (target.mark.type === "decoratedSymbol") { - keys.push(`${target.mark.symbolColor}.${target.mark.character}`); + const { character, symbolColor } = target.mark; + keys.push(NavigationMap.getKey(symbolColor, character)); } }); return keys; @@ -162,7 +163,6 @@ export default class TestCase { } async presentFixture() { - // TODO: naming convention for fixture files? const fixture = this.toYaml(); const document = await vscode.workspace.openTextDocument({ language: "yaml", From c51def0b3427840a4313f4db10cd4114d7cc7e0e Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Mon, 12 Jul 2021 19:58:20 -0700 Subject: [PATCH 09/40] Add inferred full targets to fixture --- src/TestCase.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/TestCase.ts b/src/TestCase.ts index 8f23ff4aec..c335a3f021 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -54,6 +54,7 @@ type DecorationRanges = { [coloredSymbol: string]: SerializedRange }; export type TestCaseFixture = { command: Command; + targets: Target[]; languageId: string; decorations: DecorationRanges; initialState: Snapshot; @@ -63,6 +64,7 @@ export type TestCaseFixture = { export default class TestCase { command: Command; languageId: string; + targets: Target[]; decorations: DecorationRanges; initialState: Snapshot | null = null; finalState: Snapshot | null = null; @@ -77,6 +79,7 @@ export default class TestCase { this.command = command; this.languageId = activeEditor.document.languageId; this.decorations = this.extractTargetedDecorations(targets, navigationMap); + this.targets = targets; } extractPrimitiveTargetKeys(...targets: PrimitiveTarget[]) { @@ -155,6 +158,7 @@ export default class TestCase { const fixture: TestCaseFixture = { command: this.command, languageId: this.languageId, + targets: this.targets, decorations: this.decorations, initialState: this.initialState, finalState: this.finalState, From cc0e4bf085b8dcdf107269d6134800e34a7b0c81 Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Tue, 13 Jul 2021 21:19:03 -0700 Subject: [PATCH 10/40] Move test fixtures from src to root --- src/test/suite/recorded.test.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/test/suite/recorded.test.ts b/src/test/suite/recorded.test.ts index c224d5955e..f17402a37c 100644 --- a/src/test/suite/recorded.test.ts +++ b/src/test/suite/recorded.test.ts @@ -32,11 +32,7 @@ function deserializeSelection( } suite("recorded test cases", async function () { - const directory = path.join( - __dirname, - // TODO What's the best way to handle this? - "../../../src/test/suite/recordings" - ); + const directory = path.join(__dirname, "../../../testFixtures"); const files = await fsp.readdir(directory); files.forEach(async (file) => { From 9d65fde3e0863aa9bb7c7ea5d17418d13aa14d82 Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Tue, 13 Jul 2021 21:20:04 -0700 Subject: [PATCH 11/40] Remove setting up navigation map --- src/extension.ts | 7 ------- src/test/suite/recorded.test.ts | 23 ++--------------------- 2 files changed, 2 insertions(+), 28 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index c3af7fe8c9..2de76e6bc4 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -91,12 +91,6 @@ export async function activate(context: vscode.ExtensionContext) { recordTestCase = true; } ); - const cursorlessSetNavigationMapDisposable = vscode.commands.registerCommand( - "cursorless.setNavigationMap", - (newNavigationMap: NavigationMap) => { - navigationMap = newNavigationMap; - } - ); const cursorlessCommandDisposable = vscode.commands.registerCommand( "cursorless.command", async ( @@ -231,7 +225,6 @@ export async function activate(context: vscode.ExtensionContext) { cursorlessRecordTestCaseDisposable, toggleDecorationsDisposable, recomputeDecorationStylesDisposable, - cursorlessSetNavigationMapDisposable, vscode.workspace.onDidChangeConfiguration(recomputeDecorationStyles), vscode.window.onDidChangeTextEditorVisibleRanges(addDecorationsDebounced), vscode.window.onDidChangeActiveTextEditor(addDecorationsDebounced), diff --git a/src/test/suite/recorded.test.ts b/src/test/suite/recorded.test.ts index f17402a37c..0be9546d65 100644 --- a/src/test/suite/recorded.test.ts +++ b/src/test/suite/recorded.test.ts @@ -55,28 +55,9 @@ suite("recorded test cases", async function () { // TODO restore visible ranges? // Not sure of a straightforward way to do this. Maybe just use to test folding? - const navigationMap = new NavigationMap(); - Object.entries(fixture.decorations).forEach(([key, value], index) => { - const range = deserializeRange(value); - const text = editor.document.getText(range); - // TODO not a big fan of this, need a better way to create tokens - const token: Token = { - text, - range, - startOffset: editor.document.offsetAt(range.start) + index, - endOffset: editor.document.offsetAt(range.end) + index + text.length, - displayLine: value.start.line, // TODO depends on visible ranges? See above - editor: vscode.window.activeTextEditor!, - }; - const [color, character] = key.split("."); - // @ts-ignore TODO should probably add a decoration color type? - navigationMap.addToken(color, character, token); - }); + // TODO verify fixture decorations are in nav. map - await vscode.commands.executeCommand( - "cursorless.setNavigationMap", - navigationMap - ); + await new Promise((resolve) => setTimeout(resolve, 1000)); await vscode.commands.executeCommand( "cursorless.command", From fa527949c0b3c4093eccdf05ef6e4cbf7ac4f9c2 Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Tue, 13 Jul 2021 21:34:23 -0700 Subject: [PATCH 12/40] Attempt to mock clipboard (and fail) --- package.json | 2 + src/test/suite/inferFullTargets.test.ts | 3 + src/test/suite/processTargets.test.ts | 3 + src/test/suite/recorded.test.ts | 14 +- yarn.lock | 2886 ++++++++++++----------- 5 files changed, 1504 insertions(+), 1404 deletions(-) diff --git a/package.json b/package.json index 1ecca4330f..18350311a3 100644 --- a/package.json +++ b/package.json @@ -203,6 +203,7 @@ "@types/js-yaml": "^4.0.2", "@types/mocha": "^8.0.4", "@types/node": "^12.11.7", + "@types/sinon": "^10.0.2", "@types/vscode": "^1.53.0", "@typescript-eslint/eslint-plugin": "^4.9.0", "@typescript-eslint/parser": "^4.9.0", @@ -211,6 +212,7 @@ "glob": "^7.1.6", "js-yaml": "^3.14.1", "mocha": "^8.1.3", + "sinon": "^11.1.1", "typescript": "^4.1.2", "vscode-test": "^1.4.1" }, diff --git a/src/test/suite/inferFullTargets.test.ts b/src/test/suite/inferFullTargets.test.ts index d0ae191f4f..2f9ee820b3 100644 --- a/src/test/suite/inferFullTargets.test.ts +++ b/src/test/suite/inferFullTargets.test.ts @@ -3,6 +3,9 @@ import * as assert from "assert"; import { inferFullTargets } from "../../inferFullTargets"; import fixture from "./fixtures/inferFullTargets.fixture"; +/* + * FIXME: These tests are outdated and thus disabled for now + */ suite.skip("inferFullTargets", () => { fixture.forEach(({ input, expectedOutput }, index) => { test(`inferFullTargets ${index}`, () => { diff --git a/src/test/suite/processTargets.test.ts b/src/test/suite/processTargets.test.ts index b58d226cbd..4d1a7fa6f6 100644 --- a/src/test/suite/processTargets.test.ts +++ b/src/test/suite/processTargets.test.ts @@ -8,6 +8,9 @@ import processTargets from "../../processTargets"; import { Target, Token } from "../../Types"; // import * as myExtension from '../../extension'; +/* + * FIXME: These tests are outdated and thus disabled for now + */ suite.skip("processTargets", () => { test("simple processTargets", () => { const navigationMap = new NavigationMap(); diff --git a/src/test/suite/recorded.test.ts b/src/test/suite/recorded.test.ts index 0be9546d65..d4e6e8b184 100644 --- a/src/test/suite/recorded.test.ts +++ b/src/test/suite/recorded.test.ts @@ -3,14 +3,13 @@ import { promises as fsp } from "fs"; import * as path from "path"; import * as yaml from "js-yaml"; import * as vscode from "vscode"; -import NavigationMap from "../../NavigationMap"; +import * as sinon from "sinon"; import TestCase, { SerializedPosition, SerializedRange, SerializedSelection, TestCaseFixture, } from "../../TestCase"; -import { Token } from "../../Types"; function deserializePosition(position: SerializedPosition) { return new vscode.Position(position.line, position.character); @@ -47,13 +46,16 @@ suite("recorded test cases", async function () { content: fixture.initialState.document, }); const editor = await vscode.window.showTextDocument(document); - - await vscode.env.clipboard.writeText(fixture.initialState.clipboard); editor.selections = fixture.initialState.selections.map(deserializeSelection); - // TODO restore visible ranges? - // Not sure of a straightforward way to do this. Maybe just use to test folding? + // TODO (Many) unsuccessful mocking attempts + // TypeError: Cannot assign to read only property 'readText' of object '#' + // sinon.replace( + // vscode.env.clipboard, + // "readText", + // async () => fixture.initialState.clipboard + // ); // TODO verify fixture decorations are in nav. map diff --git a/yarn.lock b/yarn.lock index c7ad6c0d66..5650af0a97 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,1521 +3,1611 @@ "@babel/code-frame@7.12.11": - "integrity" "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==" - "resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" - "version" "7.12.11" + version "7.12.11" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: "@babel/highlight" "^7.10.4" "@babel/helper-validator-identifier@^7.12.11": - "integrity" "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" - "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz" - "version" "7.12.11" + version "7.12.11" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== "@babel/highlight@^7.10.4": - "integrity" "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==" - "resolved" "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz" - "version" "7.12.13" + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz" + integrity sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww== dependencies: "@babel/helper-validator-identifier" "^7.12.11" - "chalk" "^2.0.0" - "js-tokens" "^4.0.0" + chalk "^2.0.0" + js-tokens "^4.0.0" "@eslint/eslintrc@^0.3.0": - "integrity" "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==" - "resolved" "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz" - "version" "0.3.0" - dependencies: - "ajv" "^6.12.4" - "debug" "^4.1.1" - "espree" "^7.3.0" - "globals" "^12.1.0" - "ignore" "^4.0.6" - "import-fresh" "^3.2.1" - "js-yaml" "^3.13.1" - "lodash" "^4.17.20" - "minimatch" "^3.0.4" - "strip-json-comments" "^3.1.1" + version "0.3.0" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz" + integrity sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + lodash "^4.17.20" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" "@nodelib/fs.scandir@2.1.4": - "integrity" "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz" - "version" "2.1.4" + version "2.1.4" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz" + integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== dependencies: "@nodelib/fs.stat" "2.0.4" - "run-parallel" "^1.1.9" + run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.4": - "integrity" "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz" - "version" "2.0.4" +"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": + version "2.0.4" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz" + integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== "@nodelib/fs.walk@^1.2.3": - "integrity" "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz" - "version" "1.2.6" + version "1.2.6" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz" + integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== dependencies: "@nodelib/fs.scandir" "2.1.4" - "fastq" "^1.6.0" + fastq "^1.6.0" + +"@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.3": + version "1.8.3" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^7.0.4", "@sinonjs/fake-timers@^7.1.0": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5" + integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sinonjs/samsam@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-6.0.2.tgz#a0117d823260f282c04bff5f8704bdc2ac6910bb" + integrity sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ== + dependencies: + "@sinonjs/commons" "^1.6.0" + lodash.get "^4.4.2" + type-detect "^4.0.8" + +"@sinonjs/text-encoding@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" + integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== "@tootallnate/once@1": - "integrity" "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" - "resolved" "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" - "version" "1.1.2" + version "1.1.2" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@types/glob@^7.1.3": - "integrity" "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==" - "resolved" "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz" - "version" "7.1.3" + version "7.1.3" + resolved "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz" + integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== dependencies: "@types/minimatch" "*" "@types/node" "*" "@types/js-yaml@^4.0.2": - "integrity" "sha512-KbeHS/Y4R+k+5sWXEYzAZKuB1yQlZtEghuhRxrVRLaqhtoG5+26JwQsa4HyS3AWX8v1Uwukma5HheduUDskasA==" - "resolved" "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.2.tgz" - "version" "4.0.2" + version "4.0.2" + resolved "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.2.tgz" + integrity sha512-KbeHS/Y4R+k+5sWXEYzAZKuB1yQlZtEghuhRxrVRLaqhtoG5+26JwQsa4HyS3AWX8v1Uwukma5HheduUDskasA== "@types/json-schema@^7.0.3": - "integrity" "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==" - "resolved" "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz" - "version" "7.0.7" + version "7.0.7" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz" + integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== "@types/lodash@^4.14.168": - "integrity" "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==" - "resolved" "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz" - "version" "4.14.168" + version "4.14.168" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz" + integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q== "@types/minimatch@*": - "integrity" "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" - "resolved" "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz" - "version" "3.0.3" + version "3.0.3" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== "@types/mocha@^8.0.4": - "integrity" "sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ==" - "resolved" "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.0.tgz" - "version" "8.2.0" + version "8.2.0" + resolved "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.0.tgz" + integrity sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ== "@types/node@*", "@types/node@^12.11.7": - "integrity" "sha512-0/41wHcurotvSOTHQUFkgL702c3pyWR1mToSrrX3pGPvGfpHTv3Ksx0M4UVuU5VJfjVb62Eyr1eKO1tWNUCg2Q==" - "resolved" "https://registry.npmjs.org/@types/node/-/node-12.20.0.tgz" - "version" "12.20.0" + version "12.20.0" + resolved "https://registry.npmjs.org/@types/node/-/node-12.20.0.tgz" + integrity sha512-0/41wHcurotvSOTHQUFkgL702c3pyWR1mToSrrX3pGPvGfpHTv3Ksx0M4UVuU5VJfjVb62Eyr1eKO1tWNUCg2Q== + +"@types/sinon@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.2.tgz#f360d2f189c0fd433d14aeb97b9d705d7e4cc0e4" + integrity sha512-BHn8Bpkapj8Wdfxvh2jWIUoaYB/9/XhsL0oOvBfRagJtKlSl9NWPcFOz2lRukI9szwGxFtYZCTejJSqsGDbdmw== + dependencies: + "@sinonjs/fake-timers" "^7.1.0" "@types/vscode@^1.53.0": - "integrity" "sha512-XjFWbSPOM0EKIT2XhhYm3D3cx3nn3lshMUcWNy1eqefk+oqRuBq8unVb6BYIZqXy9lQZyeUl7eaBCOZWv+LcXQ==" - "resolved" "https://registry.npmjs.org/@types/vscode/-/vscode-1.53.0.tgz" - "version" "1.53.0" + version "1.53.0" + resolved "https://registry.npmjs.org/@types/vscode/-/vscode-1.53.0.tgz" + integrity sha512-XjFWbSPOM0EKIT2XhhYm3D3cx3nn3lshMUcWNy1eqefk+oqRuBq8unVb6BYIZqXy9lQZyeUl7eaBCOZWv+LcXQ== "@typescript-eslint/eslint-plugin@^4.9.0": - "integrity" "sha512-DJgdGZW+8CFUTz5C/dnn4ONcUm2h2T0itWD85Ob5/V27Ndie8hUoX5HKyGssvR8sUMkAIlUc/AMK67Lqa3kBIQ==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.15.0.tgz" - "version" "4.15.0" + version "4.15.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.15.0.tgz" + integrity sha512-DJgdGZW+8CFUTz5C/dnn4ONcUm2h2T0itWD85Ob5/V27Ndie8hUoX5HKyGssvR8sUMkAIlUc/AMK67Lqa3kBIQ== dependencies: "@typescript-eslint/experimental-utils" "4.15.0" "@typescript-eslint/scope-manager" "4.15.0" - "debug" "^4.1.1" - "functional-red-black-tree" "^1.0.1" - "lodash" "^4.17.15" - "regexpp" "^3.0.0" - "semver" "^7.3.2" - "tsutils" "^3.17.1" + debug "^4.1.1" + functional-red-black-tree "^1.0.1" + lodash "^4.17.15" + regexpp "^3.0.0" + semver "^7.3.2" + tsutils "^3.17.1" "@typescript-eslint/experimental-utils@4.15.0": - "integrity" "sha512-V4vaDWvxA2zgesg4KPgEGiomWEBpJXvY4ZX34Y3qxK8LUm5I87L+qGIOTd9tHZOARXNRt9pLbblSKiYBlGMawg==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.15.0.tgz" - "version" "4.15.0" + version "4.15.0" + resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.15.0.tgz" + integrity sha512-V4vaDWvxA2zgesg4KPgEGiomWEBpJXvY4ZX34Y3qxK8LUm5I87L+qGIOTd9tHZOARXNRt9pLbblSKiYBlGMawg== dependencies: "@types/json-schema" "^7.0.3" "@typescript-eslint/scope-manager" "4.15.0" "@typescript-eslint/types" "4.15.0" "@typescript-eslint/typescript-estree" "4.15.0" - "eslint-scope" "^5.0.0" - "eslint-utils" "^2.0.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" -"@typescript-eslint/parser@^4.0.0", "@typescript-eslint/parser@^4.9.0": - "integrity" "sha512-L6Dtbq8Bc7g2aZwnIBETpmUa9XDKCMzKVwAArnGp5Mn7PRNFjf3mUzq8UeBjL3K8t311hvevnyqXAMSmxO8Gpg==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.15.0.tgz" - "version" "4.15.0" +"@typescript-eslint/parser@^4.9.0": + version "4.15.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.15.0.tgz" + integrity sha512-L6Dtbq8Bc7g2aZwnIBETpmUa9XDKCMzKVwAArnGp5Mn7PRNFjf3mUzq8UeBjL3K8t311hvevnyqXAMSmxO8Gpg== dependencies: "@typescript-eslint/scope-manager" "4.15.0" "@typescript-eslint/types" "4.15.0" "@typescript-eslint/typescript-estree" "4.15.0" - "debug" "^4.1.1" + debug "^4.1.1" "@typescript-eslint/scope-manager@4.15.0": - "integrity" "sha512-CSNBZnCC2jEA/a+pR9Ljh8Y+5TY5qgbPz7ICEk9WCpSEgT6Pi7H2RIjxfrrbUXvotd6ta+i27sssKEH8Azm75g==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.15.0.tgz" - "version" "4.15.0" + version "4.15.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.15.0.tgz" + integrity sha512-CSNBZnCC2jEA/a+pR9Ljh8Y+5TY5qgbPz7ICEk9WCpSEgT6Pi7H2RIjxfrrbUXvotd6ta+i27sssKEH8Azm75g== dependencies: "@typescript-eslint/types" "4.15.0" "@typescript-eslint/visitor-keys" "4.15.0" "@typescript-eslint/types@4.15.0": - "integrity" "sha512-su4RHkJhS+iFwyqyXHcS8EGPlUVoC+XREfy5daivjLur9JP8GhvTmDipuRpcujtGC4M+GYhUOJCPDE3rC5NJrg==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.15.0.tgz" - "version" "4.15.0" + version "4.15.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.15.0.tgz" + integrity sha512-su4RHkJhS+iFwyqyXHcS8EGPlUVoC+XREfy5daivjLur9JP8GhvTmDipuRpcujtGC4M+GYhUOJCPDE3rC5NJrg== "@typescript-eslint/typescript-estree@4.15.0": - "integrity" "sha512-jG6xTmcNbi6xzZq0SdWh7wQ9cMb2pqXaUp6bUZOMsIlu5aOlxGxgE/t6L/gPybybQGvdguajXGkZKSndZJpksA==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.0.tgz" - "version" "4.15.0" + version "4.15.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.0.tgz" + integrity sha512-jG6xTmcNbi6xzZq0SdWh7wQ9cMb2pqXaUp6bUZOMsIlu5aOlxGxgE/t6L/gPybybQGvdguajXGkZKSndZJpksA== dependencies: "@typescript-eslint/types" "4.15.0" "@typescript-eslint/visitor-keys" "4.15.0" - "debug" "^4.1.1" - "globby" "^11.0.1" - "is-glob" "^4.0.1" - "semver" "^7.3.2" - "tsutils" "^3.17.1" + debug "^4.1.1" + globby "^11.0.1" + is-glob "^4.0.1" + semver "^7.3.2" + tsutils "^3.17.1" "@typescript-eslint/visitor-keys@4.15.0": - "integrity" "sha512-RnDtJwOwFucWFAMjG3ghCG/ikImFJFEg20DI7mn4pHEx3vC48lIAoyjhffvfHmErRDboUPC7p9Z2il4CLb7qxA==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.15.0.tgz" - "version" "4.15.0" + version "4.15.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.15.0.tgz" + integrity sha512-RnDtJwOwFucWFAMjG3ghCG/ikImFJFEg20DI7mn4pHEx3vC48lIAoyjhffvfHmErRDboUPC7p9Z2il4CLb7qxA== dependencies: "@typescript-eslint/types" "4.15.0" - "eslint-visitor-keys" "^2.0.0" + eslint-visitor-keys "^2.0.0" "@ungap/promise-all-settled@1.1.2": - "integrity" "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==" - "resolved" "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz" - "version" "1.1.2" - -"acorn-jsx@^5.3.1": - "integrity" "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==" - "resolved" "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz" - "version" "5.3.1" - -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^7.4.0": - "integrity" "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" - "resolved" "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" - "version" "7.4.1" - -"agent-base@6": - "integrity" "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==" - "resolved" "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" - "version" "6.0.2" - dependencies: - "debug" "4" - -"ajv@^6.10.0", "ajv@^6.12.4": - "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" - "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - "version" "6.12.6" - dependencies: - "fast-deep-equal" "^3.1.1" - "fast-json-stable-stringify" "^2.0.0" - "json-schema-traverse" "^0.4.1" - "uri-js" "^4.2.2" - -"ajv@^7.0.2": - "integrity" "sha512-svS9uILze/cXbH0z2myCK2Brqprx/+JJYK5pHicT/GQiBfzzhUVAIT6MwqJg8y4xV/zoGsUeuPuwtoiKSGE15g==" - "resolved" "https://registry.npmjs.org/ajv/-/ajv-7.1.0.tgz" - "version" "7.1.0" - dependencies: - "fast-deep-equal" "^3.1.1" - "json-schema-traverse" "^1.0.0" - "require-from-string" "^2.0.2" - "uri-js" "^4.2.2" - -"ansi-colors@^4.1.1", "ansi-colors@4.1.1": - "integrity" "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" - "resolved" "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" - "version" "4.1.1" - -"ansi-regex@^3.0.0": - "integrity" "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz" - "version" "3.0.0" - -"ansi-regex@^5.0.0": - "integrity" "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz" - "version" "5.0.0" - -"ansi-styles@^3.2.1": - "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - "version" "3.2.1" - dependencies: - "color-convert" "^1.9.0" - -"ansi-styles@^4.0.0", "ansi-styles@^4.1.0": - "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - "version" "4.3.0" - dependencies: - "color-convert" "^2.0.1" - -"anymatch@~3.1.1": - "integrity" "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==" - "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz" - "version" "3.1.1" - dependencies: - "normalize-path" "^3.0.0" - "picomatch" "^2.0.4" - -"argparse@^1.0.7": - "integrity" "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==" - "resolved" "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" - "version" "1.0.10" - dependencies: - "sprintf-js" "~1.0.2" - -"argparse@^2.0.1": - "integrity" "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - "resolved" "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" - "version" "2.0.1" - -"array-union@^2.1.0": - "integrity" "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - "resolved" "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" - "version" "2.1.0" - -"astral-regex@^2.0.0": - "integrity" "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" - "resolved" "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" - "version" "2.0.0" - -"balanced-match@^1.0.0": - "integrity" "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" - "version" "1.0.0" - -"big-integer@^1.6.17": - "integrity" "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==" - "resolved" "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz" - "version" "1.6.48" - -"binary-extensions@^2.0.0": - "integrity" "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - "version" "2.2.0" - -"binary@~0.3.0": - "integrity" "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=" - "resolved" "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz" - "version" "0.3.0" - dependencies: - "buffers" "~0.1.1" - "chainsaw" "~0.1.0" - -"bluebird@~3.4.1": - "integrity" "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" - "resolved" "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz" - "version" "3.4.7" - -"brace-expansion@^1.1.7": - "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" - "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - "version" "1.1.11" - dependencies: - "balanced-match" "^1.0.0" - "concat-map" "0.0.1" - -"braces@^3.0.1", "braces@~3.0.2": - "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" - "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - "version" "3.0.2" - dependencies: - "fill-range" "^7.0.1" - -"browser-stdout@1.3.1": - "integrity" "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" - "resolved" "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" - "version" "1.3.1" - -"buffer-indexof-polyfill@~1.0.0": - "integrity" "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==" - "resolved" "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz" - "version" "1.0.2" - -"buffers@~0.1.1": - "integrity" "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" - "resolved" "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" - "version" "0.1.1" - -"callsites@^3.0.0": - "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - "version" "3.1.0" - -"camelcase@^6.0.0": - "integrity" "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" - "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz" - "version" "6.2.0" - -"chainsaw@~0.1.0": - "integrity" "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=" - "resolved" "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz" - "version" "0.1.0" - dependencies: - "traverse" ">=0.3.0 <0.4" - -"chalk@^2.0.0": - "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - "version" "2.4.2" - dependencies: - "ansi-styles" "^3.2.1" - "escape-string-regexp" "^1.0.5" - "supports-color" "^5.3.0" - -"chalk@^4.0.0": - "integrity" "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz" - "version" "4.1.0" - dependencies: - "ansi-styles" "^4.1.0" - "supports-color" "^7.1.0" - -"chokidar@3.5.1": - "integrity" "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==" - "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz" - "version" "3.5.1" - dependencies: - "anymatch" "~3.1.1" - "braces" "~3.0.2" - "glob-parent" "~5.1.0" - "is-binary-path" "~2.1.0" - "is-glob" "~4.0.1" - "normalize-path" "~3.0.0" - "readdirp" "~3.5.0" + version "1.1.2" + resolved "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +acorn-jsx@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + +acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +agent-base@6: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^7.0.2: + version "7.1.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-7.1.0.tgz" + integrity sha512-svS9uILze/cXbH0z2myCK2Brqprx/+JJYK5pHicT/GQiBfzzhUVAIT6MwqJg8y4xV/zoGsUeuPuwtoiKSGE15g== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-colors@4.1.1, ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +big-integer@^1.6.17: + version "1.6.48" + resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz" + integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +binary@~0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz" + integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= + dependencies: + buffers "~0.1.1" + chainsaw "~0.1.0" + +bluebird@~3.4.1: + version "3.4.7" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz" + integrity sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +buffer-indexof-polyfill@~1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz" + integrity sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A== + +buffers@~0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" + integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^6.0.0: + version "6.2.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + +chainsaw@~0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz" + integrity sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= + dependencies: + traverse ">=0.3.0 <0.4" + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@3.5.1: + version "3.5.1" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" optionalDependencies: - "fsevents" "~2.3.1" + fsevents "~2.3.1" -"cliui@^7.0.2": - "integrity" "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==" - "resolved" "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" - "version" "7.0.4" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: - "string-width" "^4.2.0" - "strip-ansi" "^6.0.0" - "wrap-ansi" "^7.0.0" + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" -"color-convert@^1.9.0": - "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" - "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - "version" "1.9.3" - dependencies: - "color-name" "1.1.3" - -"color-convert@^2.0.1": - "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" - "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "color-name" "~1.1.4" - -"color-name@~1.1.4": - "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - "version" "1.1.4" - -"color-name@1.1.3": - "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - "version" "1.1.3" - -"concat-map@0.0.1": - "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - "version" "0.0.1" - -"core-util-is@~1.0.0": - "integrity" "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - "resolved" "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" - "version" "1.0.2" - -"cross-spawn@^7.0.2": - "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==" - "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - "version" "7.0.3" - dependencies: - "path-key" "^3.1.0" - "shebang-command" "^2.0.0" - "which" "^2.0.1" - -"debug@^4.0.1", "debug@^4.1.1", "debug@4", "debug@4.3.1": - "integrity" "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==" - "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz" - "version" "4.3.1" - dependencies: - "ms" "2.1.2" - -"decamelize@^4.0.0": - "integrity" "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" - "resolved" "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" - "version" "4.0.0" - -"deep-is@^0.1.3": - "integrity" "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - "resolved" "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz" - "version" "0.1.3" - -"diff@5.0.0": - "integrity" "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" - "resolved" "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" - "version" "5.0.0" - -"dir-glob@^3.0.1": - "integrity" "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==" - "resolved" "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" - "version" "3.0.1" - dependencies: - "path-type" "^4.0.0" - -"doctrine@^3.0.0": - "integrity" "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==" - "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "esutils" "^2.0.2" - -"duplexer2@~0.1.4": - "integrity" "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=" - "resolved" "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz" - "version" "0.1.4" - dependencies: - "readable-stream" "^2.0.2" - -"emoji-regex@^8.0.0": - "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - "version" "8.0.0" - -"enquirer@^2.3.5": - "integrity" "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==" - "resolved" "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" - "version" "2.3.6" - dependencies: - "ansi-colors" "^4.1.1" - -"esbuild@^0.11.12": - "integrity" "sha512-c8cso/1RwVj+fbDvLtUgSG4ZJQ0y9Zdrl6Ot/GAjyy4pdMCHaFnDMts5gqFnWRPLajWtEnI+3hlET4R9fVoZng==" - "resolved" "https://registry.npmjs.org/esbuild/-/esbuild-0.11.12.tgz" - "version" "0.11.12" - -"escalade@^3.1.1": - "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - "version" "3.1.1" - -"escape-string-regexp@^1.0.5": - "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - "version" "1.0.5" - -"escape-string-regexp@4.0.0": - "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - "version" "4.0.0" - -"eslint-scope@^5.0.0", "eslint-scope@^5.1.1": - "integrity" "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==" - "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" - "version" "5.1.1" - dependencies: - "esrecurse" "^4.3.0" - "estraverse" "^4.1.1" - -"eslint-utils@^2.0.0", "eslint-utils@^2.1.0": - "integrity" "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==" - "resolved" "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "eslint-visitor-keys" "^1.1.0" - -"eslint-visitor-keys@^1.1.0", "eslint-visitor-keys@^1.3.0": - "integrity" "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" - "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" - "version" "1.3.0" +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@4, debug@4.3.1, debug@^4.0.1, debug@^4.1.1: + version "4.3.1" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-is@^0.1.3: + version "0.1.3" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +diff@5.0.0, diff@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +duplexer2@~0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz" + integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= + dependencies: + readable-stream "^2.0.2" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +esbuild@^0.11.12: + version "0.11.12" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.11.12.tgz" + integrity sha512-c8cso/1RwVj+fbDvLtUgSG4ZJQ0y9Zdrl6Ot/GAjyy4pdMCHaFnDMts5gqFnWRPLajWtEnI+3hlET4R9fVoZng== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-scope@^5.0.0, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^2.0.0, eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -"eslint-visitor-keys@^2.0.0": - "integrity" "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==" - "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz" - "version" "2.0.0" +eslint-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -"eslint@*", "eslint@^5.0.0 || ^6.0.0 || ^7.0.0", "eslint@^7.15.0": - "integrity" "sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw==" - "resolved" "https://registry.npmjs.org/eslint/-/eslint-7.20.0.tgz" - "version" "7.20.0" +eslint@^7.15.0: + version "7.20.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-7.20.0.tgz" + integrity sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw== dependencies: "@babel/code-frame" "7.12.11" "@eslint/eslintrc" "^0.3.0" - "ajv" "^6.10.0" - "chalk" "^4.0.0" - "cross-spawn" "^7.0.2" - "debug" "^4.0.1" - "doctrine" "^3.0.0" - "enquirer" "^2.3.5" - "eslint-scope" "^5.1.1" - "eslint-utils" "^2.1.0" - "eslint-visitor-keys" "^2.0.0" - "espree" "^7.3.1" - "esquery" "^1.4.0" - "esutils" "^2.0.2" - "file-entry-cache" "^6.0.0" - "functional-red-black-tree" "^1.0.1" - "glob-parent" "^5.0.0" - "globals" "^12.1.0" - "ignore" "^4.0.6" - "import-fresh" "^3.0.0" - "imurmurhash" "^0.1.4" - "is-glob" "^4.0.0" - "js-yaml" "^3.13.1" - "json-stable-stringify-without-jsonify" "^1.0.1" - "levn" "^0.4.1" - "lodash" "^4.17.20" - "minimatch" "^3.0.4" - "natural-compare" "^1.4.0" - "optionator" "^0.9.1" - "progress" "^2.0.0" - "regexpp" "^3.1.0" - "semver" "^7.2.1" - "strip-ansi" "^6.0.0" - "strip-json-comments" "^3.1.0" - "table" "^6.0.4" - "text-table" "^0.2.0" - "v8-compile-cache" "^2.0.3" - -"espree@^7.3.0", "espree@^7.3.1": - "integrity" "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==" - "resolved" "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz" - "version" "7.3.1" - dependencies: - "acorn" "^7.4.0" - "acorn-jsx" "^5.3.1" - "eslint-visitor-keys" "^1.3.0" - -"esprima@^4.0.0": - "integrity" "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - "resolved" "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" - "version" "4.0.1" - -"esquery@^1.4.0": - "integrity" "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==" - "resolved" "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" - "version" "1.4.0" - dependencies: - "estraverse" "^5.1.0" - -"esrecurse@^4.3.0": - "integrity" "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==" - "resolved" "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - "version" "4.3.0" - dependencies: - "estraverse" "^5.2.0" - -"estraverse@^4.1.1": - "integrity" "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" - "version" "4.3.0" - -"estraverse@^5.1.0", "estraverse@^5.2.0": - "integrity" "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" - "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz" - "version" "5.2.0" - -"esutils@^2.0.2": - "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - "resolved" "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - "version" "2.0.3" - -"fast-deep-equal@^3.1.1": - "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - "version" "3.1.3" - -"fast-glob@^3.1.1": - "integrity" "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==" - "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz" - "version" "3.2.5" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + file-entry-cache "^6.0.0" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash "^4.17.20" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.4" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.1.1: + version "3.2.5" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" - "glob-parent" "^5.1.0" - "merge2" "^1.3.0" - "micromatch" "^4.0.2" - "picomatch" "^2.2.1" - -"fast-json-stable-stringify@^2.0.0": - "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - "version" "2.1.0" - -"fast-levenshtein@^2.0.6": - "integrity" "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - "resolved" "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - "version" "2.0.6" - -"fastq@^1.6.0": - "integrity" "sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA==" - "resolved" "https://registry.npmjs.org/fastq/-/fastq-1.10.1.tgz" - "version" "1.10.1" - dependencies: - "reusify" "^1.0.4" - -"file-entry-cache@^6.0.0": - "integrity" "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==" - "resolved" "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz" - "version" "6.0.0" - dependencies: - "flat-cache" "^3.0.4" - -"fill-range@^7.0.1": - "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" - "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - "version" "7.0.1" - dependencies: - "to-regex-range" "^5.0.1" - -"find-up@5.0.0": - "integrity" "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==" - "resolved" "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - "version" "5.0.0" - dependencies: - "locate-path" "^6.0.0" - "path-exists" "^4.0.0" - -"flat-cache@^3.0.4": - "integrity" "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==" - "resolved" "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" - "version" "3.0.4" - dependencies: - "flatted" "^3.1.0" - "rimraf" "^3.0.2" - -"flat@^5.0.2": - "integrity" "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" - "resolved" "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" - "version" "5.0.2" - -"flatted@^3.1.0": - "integrity" "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==" - "resolved" "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz" - "version" "3.1.1" - -"fs.realpath@^1.0.0": - "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - "version" "1.0.0" - -"fstream@^1.0.12": - "integrity" "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==" - "resolved" "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz" - "version" "1.0.12" - dependencies: - "graceful-fs" "^4.1.2" - "inherits" "~2.0.0" - "mkdirp" ">=0.5 0" - "rimraf" "2" - -"functional-red-black-tree@^1.0.1": - "integrity" "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" - "resolved" "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" - "version" "1.0.1" - -"get-caller-file@^2.0.5": - "integrity" "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - "resolved" "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - "version" "2.0.5" - -"glob-parent@^5.0.0", "glob-parent@^5.1.0", "glob-parent@~5.1.0": - "integrity" "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==" - "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz" - "version" "5.1.1" - dependencies: - "is-glob" "^4.0.1" - -"glob@^7.1.3", "glob@^7.1.6", "glob@7.1.6": - "integrity" "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==" - "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" - "version" "7.1.6" - dependencies: - "fs.realpath" "^1.0.0" - "inflight" "^1.0.4" - "inherits" "2" - "minimatch" "^3.0.4" - "once" "^1.3.0" - "path-is-absolute" "^1.0.0" - -"globals@^12.1.0": - "integrity" "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==" - "resolved" "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz" - "version" "12.4.0" - dependencies: - "type-fest" "^0.8.1" - -"globby@^11.0.1": - "integrity" "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==" - "resolved" "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz" - "version" "11.0.2" - dependencies: - "array-union" "^2.1.0" - "dir-glob" "^3.0.1" - "fast-glob" "^3.1.1" - "ignore" "^5.1.4" - "merge2" "^1.3.0" - "slash" "^3.0.0" - -"graceful-fs@^4.1.2", "graceful-fs@^4.2.2": - "integrity" "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" - "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz" - "version" "4.2.6" - -"growl@1.10.5": - "integrity" "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" - "resolved" "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" - "version" "1.10.5" - -"has-flag@^3.0.0": - "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - "version" "3.0.0" - -"has-flag@^4.0.0": - "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - "version" "4.0.0" - -"he@1.2.0": - "integrity" "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - "resolved" "https://registry.npmjs.org/he/-/he-1.2.0.tgz" - "version" "1.2.0" - -"http-proxy-agent@^4.0.1": - "integrity" "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==" - "resolved" "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" - "version" "4.0.1" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastq@^1.6.0: + version "1.10.1" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.10.1.tgz" + integrity sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz" + integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz" + integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +fstream@^1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: + version "5.1.1" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + +glob@7.1.6, glob@^7.1.3, glob@^7.1.6: + version "7.1.6" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +globby@^11.0.1: + version "11.0.2" + resolved "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz" + integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.2.2: + version "4.2.6" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +he@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== dependencies: "@tootallnate/once" "1" - "agent-base" "6" - "debug" "4" - -"https-proxy-agent@^5.0.0": - "integrity" "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==" - "resolved" "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz" - "version" "5.0.0" - dependencies: - "agent-base" "6" - "debug" "4" - -"ignore@^4.0.6": - "integrity" "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" - "resolved" "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" - "version" "4.0.6" - -"ignore@^5.1.4": - "integrity" "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" - "resolved" "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz" - "version" "5.1.8" - -"immutability-helper@^3.1.1": - "integrity" "sha512-Q0QaXjPjwIju/28TsugCHNEASwoCcJSyJV3uO1sOIQGI0jKgm9f41Lvz0DZj3n46cNCyAZTsEYoY4C2bVRUzyQ==" - "resolved" "https://registry.npmjs.org/immutability-helper/-/immutability-helper-3.1.1.tgz" - "version" "3.1.1" - -"import-fresh@^3.0.0", "import-fresh@^3.2.1": - "integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==" - "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" - "version" "3.3.0" - dependencies: - "parent-module" "^1.0.0" - "resolve-from" "^4.0.0" - -"imurmurhash@^0.1.4": - "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - "version" "0.1.4" - -"inflight@^1.0.4": - "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" - "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - "version" "1.0.6" - dependencies: - "once" "^1.3.0" - "wrappy" "1" - -"inherits@~2.0.0", "inherits@~2.0.3", "inherits@2": - "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - "version" "2.0.4" - -"is-binary-path@~2.1.0": - "integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" - "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "binary-extensions" "^2.0.0" - -"is-extglob@^2.1.1": - "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - "version" "2.1.1" - -"is-fullwidth-code-point@^2.0.0": - "integrity" "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" - "version" "2.0.0" - -"is-fullwidth-code-point@^3.0.0": - "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - "version" "3.0.0" - -"is-glob@^4.0.0", "is-glob@^4.0.1", "is-glob@~4.0.1": - "integrity" "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==" - "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "is-extglob" "^2.1.1" - -"is-number@^7.0.0": - "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - "version" "7.0.0" - -"is-plain-obj@^2.1.0": - "integrity" "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" - "resolved" "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" - "version" "2.1.0" - -"isarray@~1.0.0": - "integrity" "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - "version" "1.0.0" - -"isexe@^2.0.0": - "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - "version" "2.0.0" - -"js-tokens@^4.0.0": - "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - "version" "4.0.0" - -"js-yaml@^3.13.1", "js-yaml@^3.14.1": - "integrity" "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==" - "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - "version" "3.14.1" - dependencies: - "argparse" "^1.0.7" - "esprima" "^4.0.0" - -"js-yaml@4.0.0": - "integrity" "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==" - "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz" - "version" "4.0.0" - dependencies: - "argparse" "^2.0.1" - -"json-schema-traverse@^0.4.1": - "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - "version" "0.4.1" - -"json-schema-traverse@^1.0.0": - "integrity" "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" - "version" "1.0.0" - -"json-stable-stringify-without-jsonify@^1.0.1": - "integrity" "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - "resolved" "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" - "version" "1.0.1" - -"levn@^0.4.1": - "integrity" "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==" - "resolved" "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" - "version" "0.4.1" - dependencies: - "prelude-ls" "^1.2.1" - "type-check" "~0.4.0" - -"listenercount@~1.0.1": - "integrity" "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" - "resolved" "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz" - "version" "1.0.1" - -"locate-path@^6.0.0": - "integrity" "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==" - "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - "version" "6.0.0" - dependencies: - "p-locate" "^5.0.0" - -"lodash@^4.17.15", "lodash@^4.17.20", "lodash@^4.17.21": - "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" - "version" "4.17.21" - -"log-symbols@4.0.0": - "integrity" "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==" - "resolved" "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz" - "version" "4.0.0" - dependencies: - "chalk" "^4.0.0" - -"lru-cache@^6.0.0": - "integrity" "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" - "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - "version" "6.0.0" - dependencies: - "yallist" "^4.0.0" - -"merge2@^1.3.0": - "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - "resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - "version" "1.4.1" - -"micromatch@^4.0.2": - "integrity" "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==" - "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz" - "version" "4.0.2" - dependencies: - "braces" "^3.0.1" - "picomatch" "^2.0.5" - -"minimatch@^3.0.4", "minimatch@3.0.4": - "integrity" "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==" - "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" - "version" "3.0.4" - dependencies: - "brace-expansion" "^1.1.7" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +immutability-helper@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/immutability-helper/-/immutability-helper-3.1.1.tgz" + integrity sha512-Q0QaXjPjwIju/28TsugCHNEASwoCcJSyJV3uO1sOIQGI0jKgm9f41Lvz0DZj3n46cNCyAZTsEYoY4C2bVRUzyQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@~2.0.0, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz" + integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== + dependencies: + argparse "^2.0.1" + +js-yaml@^3.13.1, js-yaml@^3.14.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +just-extend@^4.0.2: + version "4.2.1" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" + integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +listenercount@~1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz" + integrity sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== + dependencies: + chalk "^4.0.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" -"minimist@^1.2.5": - "integrity" "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" - "version" "1.2.5" +minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== "mkdirp@>=0.5 0": - "integrity" "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==" - "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" - "version" "0.5.5" + version "0.5.5" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: - "minimist" "^1.2.5" + minimist "^1.2.5" -"mocha@^8.1.3": - "integrity" "sha512-TQqyC89V1J/Vxx0DhJIXlq9gbbL9XFNdeLQ1+JsnZsVaSOV1z3tWfw0qZmQJGQRIfkvZcs7snQnZnOCKoldq1Q==" - "resolved" "https://registry.npmjs.org/mocha/-/mocha-8.3.0.tgz" - "version" "8.3.0" +mocha@^8.1.3: + version "8.3.0" + resolved "https://registry.npmjs.org/mocha/-/mocha-8.3.0.tgz" + integrity sha512-TQqyC89V1J/Vxx0DhJIXlq9gbbL9XFNdeLQ1+JsnZsVaSOV1z3tWfw0qZmQJGQRIfkvZcs7snQnZnOCKoldq1Q== dependencies: "@ungap/promise-all-settled" "1.1.2" - "ansi-colors" "4.1.1" - "browser-stdout" "1.3.1" - "chokidar" "3.5.1" - "debug" "4.3.1" - "diff" "5.0.0" - "escape-string-regexp" "4.0.0" - "find-up" "5.0.0" - "glob" "7.1.6" - "growl" "1.10.5" - "he" "1.2.0" - "js-yaml" "4.0.0" - "log-symbols" "4.0.0" - "minimatch" "3.0.4" - "ms" "2.1.3" - "nanoid" "3.1.20" - "serialize-javascript" "5.0.1" - "strip-json-comments" "3.1.1" - "supports-color" "8.1.1" - "which" "2.0.2" - "wide-align" "1.1.3" - "workerpool" "6.1.0" - "yargs" "16.2.0" - "yargs-parser" "20.2.4" - "yargs-unparser" "2.0.0" - -"ms@2.1.2": - "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - "version" "2.1.2" - -"ms@2.1.3": - "integrity" "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - "version" "2.1.3" - -"nanoid@3.1.20": - "integrity" "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==" - "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz" - "version" "3.1.20" - -"natural-compare@^1.4.0": - "integrity" "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - "resolved" "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - "version" "1.4.0" - -"normalize-path@^3.0.0", "normalize-path@~3.0.0": - "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - "version" "3.0.0" - -"once@^1.3.0": - "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" - "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - "version" "1.4.0" - dependencies: - "wrappy" "1" - -"optionator@^0.9.1": - "integrity" "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==" - "resolved" "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" - "version" "0.9.1" - dependencies: - "deep-is" "^0.1.3" - "fast-levenshtein" "^2.0.6" - "levn" "^0.4.1" - "prelude-ls" "^1.2.1" - "type-check" "^0.4.0" - "word-wrap" "^1.2.3" - -"p-limit@^3.0.2": - "integrity" "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==" - "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "yocto-queue" "^0.1.0" - -"p-locate@^5.0.0": - "integrity" "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==" - "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - "version" "5.0.0" - dependencies: - "p-limit" "^3.0.2" - -"parent-module@^1.0.0": - "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" - "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "callsites" "^3.0.0" - -"path-exists@^4.0.0": - "integrity" "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - "version" "4.0.0" - -"path-is-absolute@^1.0.0": - "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - "version" "1.0.1" - -"path-key@^3.1.0": - "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - "version" "3.1.1" - -"path-type@^4.0.0": - "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - "version" "4.0.0" - -"picomatch@^2.0.4", "picomatch@^2.0.5", "picomatch@^2.2.1": - "integrity" "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" - "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz" - "version" "2.2.2" - -"prelude-ls@^1.2.1": - "integrity" "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" - "resolved" "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" - "version" "1.2.1" - -"process-nextick-args@~2.0.0": - "integrity" "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - "resolved" "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" - "version" "2.0.1" - -"progress@^2.0.0": - "integrity" "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" - "resolved" "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" - "version" "2.0.3" - -"punycode@^2.1.0": - "integrity" "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" - "version" "2.1.1" - -"queue-microtask@^1.2.2": - "integrity" "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==" - "resolved" "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz" - "version" "1.2.2" - -"randombytes@^2.1.0": - "integrity" "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==" - "resolved" "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "safe-buffer" "^5.1.0" - -"readable-stream@^2.0.2", "readable-stream@~2.3.6": - "integrity" "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==" - "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" - "version" "2.3.7" - dependencies: - "core-util-is" "~1.0.0" - "inherits" "~2.0.3" - "isarray" "~1.0.0" - "process-nextick-args" "~2.0.0" - "safe-buffer" "~5.1.1" - "string_decoder" "~1.1.1" - "util-deprecate" "~1.0.1" - -"readdirp@~3.5.0": - "integrity" "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==" - "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz" - "version" "3.5.0" - dependencies: - "picomatch" "^2.2.1" - -"regexpp@^3.0.0", "regexpp@^3.1.0": - "integrity" "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==" - "resolved" "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz" - "version" "3.1.0" - -"require-directory@^2.1.1": - "integrity" "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - "resolved" "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - "version" "2.1.1" - -"require-from-string@^2.0.2": - "integrity" "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - "resolved" "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" - "version" "2.0.2" - -"resolve-from@^4.0.0": - "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - "version" "4.0.0" - -"reusify@^1.0.4": - "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - "resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - "version" "1.0.4" - -"rimraf@^3.0.2": - "integrity" "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==" - "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - "version" "3.0.2" - dependencies: - "glob" "^7.1.3" - -"rimraf@2": - "integrity" "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==" - "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" - "version" "2.7.1" - dependencies: - "glob" "^7.1.3" - -"run-parallel@^1.1.9": - "integrity" "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==" - "resolved" "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - "version" "1.2.0" - dependencies: - "queue-microtask" "^1.2.2" - -"safe-buffer@^5.1.0": - "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - "version" "5.2.1" - -"safe-buffer@~5.1.0", "safe-buffer@~5.1.1": - "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - "version" "5.1.2" - -"semver@^7.2.1", "semver@^7.3.2": - "integrity" "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==" - "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz" - "version" "7.3.4" - dependencies: - "lru-cache" "^6.0.0" - -"serialize-javascript@5.0.1": - "integrity" "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==" - "resolved" "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz" - "version" "5.0.1" - dependencies: - "randombytes" "^2.1.0" - -"setimmediate@~1.0.4": - "integrity" "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - "resolved" "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" - "version" "1.0.5" - -"shebang-command@^2.0.0": - "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" - "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "shebang-regex" "^3.0.0" - -"shebang-regex@^3.0.0": - "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - "version" "3.0.0" - -"slash@^3.0.0": - "integrity" "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - "resolved" "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" - "version" "3.0.0" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.1" + debug "4.3.1" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.6" + growl "1.10.5" + he "1.2.0" + js-yaml "4.0.0" + log-symbols "4.0.0" + minimatch "3.0.4" + ms "2.1.3" + nanoid "3.1.20" + serialize-javascript "5.0.1" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + wide-align "1.1.3" + workerpool "6.1.0" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@3.1.20: + version "3.1.20" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz" + integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +nise@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.0.tgz#713ef3ed138252daef20ec035ab62b7a28be645c" + integrity sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ== + dependencies: + "@sinonjs/commons" "^1.7.0" + "@sinonjs/fake-timers" "^7.0.4" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + path-to-regexp "^1.7.0" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +queue-microtask@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz" + integrity sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +readable-stream@^2.0.2, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +regexpp@^3.0.0, regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@2: + version "2.7.1" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +semver@^7.2.1, semver@^7.3.2: + version "7.3.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + +serialize-javascript@5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" + +setimmediate@~1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +sinon@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-11.1.1.tgz#99a295a8b6f0fadbbb7e004076f3ae54fc6eab91" + integrity sha512-ZSSmlkSyhUWbkF01Z9tEbxZLF/5tRC9eojCdFh33gtQaP7ITQVaMWQHGuFM7Cuf/KEfihuh1tTl3/ABju3AQMg== + dependencies: + "@sinonjs/commons" "^1.8.3" + "@sinonjs/fake-timers" "^7.1.0" + "@sinonjs/samsam" "^6.0.2" + diff "^5.0.0" + nise "^5.1.0" + supports-color "^7.2.0" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -"slice-ansi@^4.0.0": - "integrity" "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==" - "resolved" "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" - "version" "4.0.0" - dependencies: - "ansi-styles" "^4.0.0" - "astral-regex" "^2.0.0" - "is-fullwidth-code-point" "^3.0.0" - -"sprintf-js@~1.0.2": - "integrity" "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - "resolved" "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - "version" "1.0.3" - -"string_decoder@~1.1.1": - "integrity" "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==" - "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - "version" "1.1.1" +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: - "safe-buffer" "~5.1.0" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" -"string-width@^1.0.2 || 2": - "integrity" "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==" - "resolved" "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" - "version" "2.1.1" +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== dependencies: - "is-fullwidth-code-point" "^2.0.0" - "strip-ansi" "^4.0.0" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" -"string-width@^4.1.0", "string-width@^4.2.0": - "integrity" "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==" - "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz" - "version" "4.2.0" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: - "emoji-regex" "^8.0.0" - "is-fullwidth-code-point" "^3.0.0" - "strip-ansi" "^6.0.0" + safe-buffer "~5.1.0" -"strip-ansi@^4.0.0": - "integrity" "sha1-qEeQIusaw2iocTibY1JixQXuNo8=" - "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" - "version" "4.0.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: - "ansi-regex" "^3.0.0" + ansi-regex "^3.0.0" -"strip-ansi@^6.0.0": - "integrity" "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==" - "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz" - "version" "6.0.0" +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== dependencies: - "ansi-regex" "^5.0.0" + ansi-regex "^5.0.0" -"strip-json-comments@^3.1.0", "strip-json-comments@^3.1.1", "strip-json-comments@3.1.1": - "integrity" "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - "version" "3.1.1" +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -"supports-color@^5.3.0": - "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - "version" "5.5.0" +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: - "has-flag" "^3.0.0" + has-flag "^4.0.0" -"supports-color@^7.1.0": - "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - "version" "7.2.0" +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: - "has-flag" "^4.0.0" + has-flag "^3.0.0" -"supports-color@8.1.1": - "integrity" "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - "version" "8.1.1" +supports-color@^7.1.0, supports-color@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: - "has-flag" "^4.0.0" + has-flag "^4.0.0" -"table@^6.0.4": - "integrity" "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==" - "resolved" "https://registry.npmjs.org/table/-/table-6.0.7.tgz" - "version" "6.0.7" +table@^6.0.4: + version "6.0.7" + resolved "https://registry.npmjs.org/table/-/table-6.0.7.tgz" + integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== dependencies: - "ajv" "^7.0.2" - "lodash" "^4.17.20" - "slice-ansi" "^4.0.0" - "string-width" "^4.2.0" + ajv "^7.0.2" + lodash "^4.17.20" + slice-ansi "^4.0.0" + string-width "^4.2.0" -"text-table@^0.2.0": - "integrity" "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - "version" "0.2.0" +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -"to-regex-range@^5.0.1": - "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" - "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - "version" "5.0.1" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: - "is-number" "^7.0.0" + is-number "^7.0.0" "traverse@>=0.3.0 <0.4": - "integrity" "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" - "resolved" "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz" - "version" "0.3.9" - -"tslib@^1.8.1": - "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - "version" "1.14.1" - -"tsutils@^3.17.1": - "integrity" "sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg==" - "resolved" "https://registry.npmjs.org/tsutils/-/tsutils-3.20.0.tgz" - "version" "3.20.0" - dependencies: - "tslib" "^1.8.1" - -"type-check@^0.4.0", "type-check@~0.4.0": - "integrity" "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==" - "resolved" "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" - "version" "0.4.0" - dependencies: - "prelude-ls" "^1.2.1" - -"type-fest@^0.8.1": - "integrity" "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" - "version" "0.8.1" - -"typescript@^4.1.2", "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta": - "integrity" "sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA==" - "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz" - "version" "4.1.5" - -"unzipper@^0.10.11": - "integrity" "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==" - "resolved" "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz" - "version" "0.10.11" - dependencies: - "big-integer" "^1.6.17" - "binary" "~0.3.0" - "bluebird" "~3.4.1" - "buffer-indexof-polyfill" "~1.0.0" - "duplexer2" "~0.1.4" - "fstream" "^1.0.12" - "graceful-fs" "^4.2.2" - "listenercount" "~1.0.1" - "readable-stream" "~2.3.6" - "setimmediate" "~1.0.4" - -"uri-js@^4.2.2": - "integrity" "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==" - "resolved" "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - "version" "4.4.1" - dependencies: - "punycode" "^2.1.0" - -"util-deprecate@~1.0.1": - "integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - "version" "1.0.2" - -"v8-compile-cache@^2.0.3": - "integrity" "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==" - "resolved" "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz" - "version" "2.2.0" - -"vscode-test@^1.4.1": - "integrity" "sha512-svwE/mhBBqrB77C1U7pkUKfUmxnkzg0dLGi1vEmitsleu88oNsqZEhG3ANZrL/Ia4m0CW0oYEKRw2EojpFxLlQ==" - "resolved" "https://registry.npmjs.org/vscode-test/-/vscode-test-1.5.0.tgz" - "version" "1.5.0" - dependencies: - "http-proxy-agent" "^4.0.1" - "https-proxy-agent" "^5.0.0" - "rimraf" "^3.0.2" - "unzipper" "^0.10.11" - -"which@^2.0.1", "which@2.0.2": - "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" - "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - "version" "2.0.2" - dependencies: - "isexe" "^2.0.0" - -"wide-align@1.1.3": - "integrity" "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==" - "resolved" "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz" - "version" "1.1.3" - dependencies: - "string-width" "^1.0.2 || 2" - -"word-wrap@^1.2.3": - "integrity" "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" - "resolved" "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" - "version" "1.2.3" - -"workerpool@6.1.0": - "integrity" "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==" - "resolved" "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz" - "version" "6.1.0" - -"wrap-ansi@^7.0.0": - "integrity" "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==" - "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - "version" "7.0.0" - dependencies: - "ansi-styles" "^4.0.0" - "string-width" "^4.1.0" - "strip-ansi" "^6.0.0" - -"wrappy@1": - "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - "version" "1.0.2" - -"y18n@^5.0.5": - "integrity" "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==" - "resolved" "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz" - "version" "5.0.5" - -"yallist@^4.0.0": - "integrity" "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - "resolved" "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - "version" "4.0.0" - -"yargs-parser@^20.2.2", "yargs-parser@20.2.4": - "integrity" "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" - "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" - "version" "20.2.4" - -"yargs-unparser@2.0.0": - "integrity" "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==" - "resolved" "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "camelcase" "^6.0.0" - "decamelize" "^4.0.0" - "flat" "^5.0.2" - "is-plain-obj" "^2.1.0" - -"yargs@16.2.0": - "integrity" "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==" - "resolved" "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" - "version" "16.2.0" - dependencies: - "cliui" "^7.0.2" - "escalade" "^3.1.1" - "get-caller-file" "^2.0.5" - "require-directory" "^2.1.1" - "string-width" "^4.2.0" - "y18n" "^5.0.5" - "yargs-parser" "^20.2.2" - -"yocto-queue@^0.1.0": - "integrity" "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" - "resolved" "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - "version" "0.1.0" + version "0.3.9" + resolved "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz" + integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsutils@^3.17.1: + version "3.20.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.20.0.tgz" + integrity sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@4.0.8, type-detect@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +typescript@^4.1.2: + version "4.1.5" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz" + integrity sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA== + +unzipper@^0.10.11: + version "0.10.11" + resolved "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz" + integrity sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw== + dependencies: + big-integer "^1.6.17" + binary "~0.3.0" + bluebird "~3.4.1" + buffer-indexof-polyfill "~1.0.0" + duplexer2 "~0.1.4" + fstream "^1.0.12" + graceful-fs "^4.2.2" + listenercount "~1.0.1" + readable-stream "~2.3.6" + setimmediate "~1.0.4" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +v8-compile-cache@^2.0.3: + version "2.2.0" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz" + integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== + +vscode-test@^1.4.1: + version "1.5.0" + resolved "https://registry.npmjs.org/vscode-test/-/vscode-test-1.5.0.tgz" + integrity sha512-svwE/mhBBqrB77C1U7pkUKfUmxnkzg0dLGi1vEmitsleu88oNsqZEhG3ANZrL/Ia4m0CW0oYEKRw2EojpFxLlQ== + dependencies: + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + rimraf "^3.0.2" + unzipper "^0.10.11" + +which@2.0.2, which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +workerpool@6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz" + integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +y18n@^5.0.5: + version "5.0.5" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz" + integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@20.2.4, yargs-parser@^20.2.2: + version "20.2.4" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 35a8ce520548b69caf4cf4c2461c87cc020f4c59 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Tue, 13 Jul 2021 18:24:27 +0100 Subject: [PATCH 13/40] Add navigationMap to graph --- src/NavigationMap.ts | 4 ++++ src/Types.ts | 1 + src/addDecorationsToEditor.ts | 11 ++++++----- src/extension.ts | 15 +++++---------- src/graphConstructors.ts | 2 ++ 5 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/NavigationMap.ts b/src/NavigationMap.ts index 49b20fe08a..a3a31f1a84 100644 --- a/src/NavigationMap.ts +++ b/src/NavigationMap.ts @@ -63,4 +63,8 @@ export default class NavigationMap { }); return rangeMap; } + + public clear() { + this.map = {}; + } } diff --git a/src/Types.ts b/src/Types.ts index f6568d1dcb..e5179aec3d 100644 --- a/src/Types.ts +++ b/src/Types.ts @@ -248,6 +248,7 @@ export type ActionRecord = Record; export interface Graph { readonly actions: ActionRecord; readonly editStyles: EditStyles; + readonly navigationMap: NavigationMap; } export interface DecorationColorSetting { diff --git a/src/addDecorationsToEditor.ts b/src/addDecorationsToEditor.ts index 865a15ae50..7f17c5768a 100644 --- a/src/addDecorationsToEditor.ts +++ b/src/addDecorationsToEditor.ts @@ -13,7 +13,12 @@ interface CharacterTokenInfo { tokenIdx: number; } -export function addDecorationsToEditors(decorations: Decorations) { +export function addDecorationsToEditors( + navigationMap: NavigationMap, + decorations: Decorations +) { + navigationMap.clear(); + var editors: vscode.TextEditor[]; if (vscode.window.activeTextEditor == null) { @@ -85,8 +90,6 @@ export function addDecorationsToEditors(decorations: Decorations) { ]) ); - const navigationMap = new NavigationMap(); - // Picks the character with minimum color such that the next token that contains // that character is as far away as possible. // TODO: Could be improved by ignoring subsequent tokens that also contain @@ -151,6 +154,4 @@ export function addDecorationsToEditors(decorations: Decorations) { editor.setDecorations(decorations.decorationMap[color]!, ranges[color]!); }); }); - - return navigationMap; } diff --git a/src/extension.ts b/src/extension.ts index 2de76e6bc4..eb28309586 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -4,7 +4,6 @@ import { DEBOUNCE_DELAY } from "./constants"; import Decorations from "./Decorations"; import graphConstructors from "./graphConstructors"; import { inferFullTargets } from "./inferFullTargets"; -import NavigationMap from "./NavigationMap"; import processTargets from "./processTargets"; import FontMeasurements from "./FontMeasurements"; import { @@ -40,14 +39,12 @@ export async function activate(context: vscode.ExtensionContext) { }); } - var navigationMap: NavigationMap | null = null; - function addDecorations() { if (isActive) { - navigationMap = addDecorationsToEditors(decorations); + addDecorationsToEditors(graph.navigationMap, decorations); } else { vscode.window.visibleTextEditors.forEach(clearEditorDecorations); - navigationMap = new NavigationMap(); + graph.navigationMap.clear(); } } @@ -140,7 +137,7 @@ export async function activate(context: vscode.ExtensionContext) { let testCase: TestCase | null = null; if (recordTestCase) { const command = { actionName, partialTargets, extraArgs }; - testCase = new TestCase(command, targets, navigationMap!); + testCase = new TestCase(command, targets, graph.navigationMap!); await testCase.saveSnapshot(); } @@ -151,7 +148,7 @@ export async function activate(context: vscode.ExtensionContext) { editor: vscode.window.activeTextEditor!, })) ?? [], currentEditor: vscode.window.activeTextEditor, - navigationMap: navigationMap!, + navigationMap: graph.navigationMap, thatMark, getNodeAtLocation, }; @@ -206,9 +203,7 @@ export async function activate(context: vscode.ExtensionContext) { addDecorationsDebounced(); function handleEdit(edit: vscode.TextDocumentChangeEvent) { - if (navigationMap != null) { - navigationMap.updateTokenRanges(edit); - } + graph.navigationMap.updateTokenRanges(edit); addDecorationsDebounced(); } diff --git a/src/graphConstructors.ts b/src/graphConstructors.ts index c209e0fc21..ea2d61f9a0 100644 --- a/src/graphConstructors.ts +++ b/src/graphConstructors.ts @@ -2,10 +2,12 @@ import Actions from "./actions"; import EditStyles from "./editStyles"; import { Graph } from "./Types"; import { ConstructorMap } from "./makeGraph"; +import NavigationMap from "./NavigationMap"; const graphConstructors: ConstructorMap = { actions: Actions, editStyles: EditStyles, + navigationMap: NavigationMap, }; export default graphConstructors; From 0471c7f213cce0ca5586234cd7895d518b30ade6 Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Tue, 13 Jul 2021 22:28:39 -0700 Subject: [PATCH 14/40] Attempt to mock navigation map construction --- src/extension.ts | 2 +- src/makeGraph.ts | 2 +- src/test/suite/recorded.test.ts | 14 +++++++++++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index eb28309586..a0e8c5fbdf 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -12,7 +12,7 @@ import { ProcessedTargetsContext, SelectionWithEditor, } from "./Types"; -import makeGraph from "./makeGraph"; +import { makeGraph } from "./makeGraph"; import { logBranchTypes } from "./debug"; import TestCase from "./TestCase"; diff --git a/src/makeGraph.ts b/src/makeGraph.ts index 01b1d400c5..e3b2472574 100644 --- a/src/makeGraph.ts +++ b/src/makeGraph.ts @@ -25,7 +25,7 @@ function makeGetter( }; } -export default function makeGraph( +export function makeGraph( constructorMap: ConstructorMap ) { const components: Partial = {}; diff --git a/src/test/suite/recorded.test.ts b/src/test/suite/recorded.test.ts index d4e6e8b184..cb16b83a8a 100644 --- a/src/test/suite/recorded.test.ts +++ b/src/test/suite/recorded.test.ts @@ -10,6 +10,9 @@ import TestCase, { SerializedSelection, TestCaseFixture, } from "../../TestCase"; +import * as makeGraphModule from "../../makeGraph"; +import graphConstructors from "../../graphConstructors"; +import { SymbolColor } from "../../constants"; function deserializePosition(position: SerializedPosition) { return new vscode.Position(position.line, position.character); @@ -57,7 +60,15 @@ suite("recorded test cases", async function () { // async () => fixture.initialState.clipboard // ); - // TODO verify fixture decorations are in nav. map + // TODO This actually needs to happen before extension activation... + // Assert that recorded decorations are present + // const graph = makeGraphModule.makeGraph(graphConstructors); + // Object.entries(fixture.decorations).forEach(([key, _]) => { + // const [color, character] = key.split(".") as [SymbolColor, string]; + // const token = graph.navigationMap.getToken(color, character); + // assert(token != null); + // }); + // sinon.replace(makeGraphModule, "makeGraph", sinon.fake.returns(graph)); await new Promise((resolve) => setTimeout(resolve, 1000)); @@ -69,6 +80,7 @@ suite("recorded test cases", async function () { ); assert.deepStrictEqual(fixture.finalState, await TestCase.getSnapshot()); + sinon.restore(); }); }); }); From 09a743f98da876f920d69d9ffa7251edb48db4bd Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Thu, 15 Jul 2021 07:35:21 -0700 Subject: [PATCH 15/40] Store "that mark" in test case fixture --- src/TestCase.ts | 53 ++++++++++++++++++++------------- src/extension.ts | 19 +++++++----- src/test/suite/recorded.test.ts | 2 ++ 3 files changed, 47 insertions(+), 27 deletions(-) diff --git a/src/TestCase.ts b/src/TestCase.ts index c335a3f021..fbd6bf755a 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -2,7 +2,13 @@ import * as yaml from "js-yaml"; import * as vscode from "vscode"; import { Position, Range, Selection } from "vscode"; import NavigationMap from "./NavigationMap"; -import { ActionType, PartialTarget, PrimitiveTarget, Target } from "./Types"; +import { + ActionType, + PartialTarget, + PrimitiveTarget, + SelectionWithEditor, + Target, +} from "./Types"; export type SerializedPosition = { line: number; @@ -37,13 +43,19 @@ export function serializePosition(position: Position): SerializedPosition { return { line: position.line, character: position.character }; } -type Command = { +type TestCaseCommand = { actionName: ActionType; partialTargets: PartialTarget[]; extraArgs: any[]; }; -type Snapshot = { +type TestCaseContext = { + thatMark: SelectionWithEditor[]; + targets: Target[]; + navigationMap: NavigationMap; +}; + +type TestCaseSnapshot = { document: string; clipboard: string; visibleRanges: SerializedRange[]; @@ -53,32 +65,32 @@ type Snapshot = { type DecorationRanges = { [coloredSymbol: string]: SerializedRange }; export type TestCaseFixture = { - command: Command; + command: TestCaseCommand; targets: Target[]; languageId: string; - decorations: DecorationRanges; - initialState: Snapshot; - finalState: Snapshot; + marks: DecorationRanges; + thatMark: SerializedSelection[]; + initialState: TestCaseSnapshot; + finalState: TestCaseSnapshot; }; export default class TestCase { - command: Command; + command: TestCaseCommand; languageId: string; targets: Target[]; - decorations: DecorationRanges; - initialState: Snapshot | null = null; - finalState: Snapshot | null = null; - - constructor( - command: Command, - targets: Target[], - navigationMap: NavigationMap - ) { + marks: DecorationRanges; + thatMark: SerializedSelection[]; + initialState: TestCaseSnapshot | null = null; + finalState: TestCaseSnapshot | null = null; + + constructor(command: TestCaseCommand, context: TestCaseContext) { const activeEditor = vscode.window.activeTextEditor!; + const { thatMark, navigationMap, targets } = context; this.command = command; this.languageId = activeEditor.document.languageId; - this.decorations = this.extractTargetedDecorations(targets, navigationMap); + this.marks = this.extractTargetedDecorations(targets, navigationMap); + this.thatMark = thatMark.map((mark) => serializeSelection(mark.selection)); this.targets = targets; } @@ -123,7 +135,7 @@ export default class TestCase { return targetedDecorations; } - static async getSnapshot(): Promise { + static async getSnapshot(): Promise { const activeEditor = vscode.window.activeTextEditor!; return { document: activeEditor.document.getText(), @@ -159,7 +171,8 @@ export default class TestCase { command: this.command, languageId: this.languageId, targets: this.targets, - decorations: this.decorations, + marks: this.marks, + thatMark: this.thatMark, initialState: this.initialState, finalState: this.finalState, }; diff --git a/src/extension.ts b/src/extension.ts index a0e8c5fbdf..e2e4ff2bbe 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -134,13 +134,6 @@ export async function activate(context: vscode.ExtensionContext) { // console.log(`targets:`); // console.log(JSON.stringify(targets, null, 3)); - let testCase: TestCase | null = null; - if (recordTestCase) { - const command = { actionName, partialTargets, extraArgs }; - testCase = new TestCase(command, targets, graph.navigationMap!); - await testCase.saveSnapshot(); - } - const processedTargetsContext: ProcessedTargetsContext = { currentSelections: vscode.window.activeTextEditor?.selections.map((selection) => ({ @@ -155,6 +148,18 @@ export async function activate(context: vscode.ExtensionContext) { const selections = processTargets(processedTargetsContext, targets); + let testCase: TestCase | null = null; + if (recordTestCase) { + const command = { actionName, partialTargets, extraArgs }; + const context = { + thatMark, + targets, + navigationMap: graph.navigationMap!, + }; + testCase = new TestCase(command, context); + await testCase.saveSnapshot(); + } + const { returnValue, thatMark: newThatMark } = await action.run( selections, ...extraArgs diff --git a/src/test/suite/recorded.test.ts b/src/test/suite/recorded.test.ts index cb16b83a8a..b2070d4e2c 100644 --- a/src/test/suite/recorded.test.ts +++ b/src/test/suite/recorded.test.ts @@ -52,6 +52,8 @@ suite("recorded test cases", async function () { editor.selections = fixture.initialState.selections.map(deserializeSelection); + // TODO Restore `thatMark` from fixture + // TODO (Many) unsuccessful mocking attempts // TypeError: Cannot assign to read only property 'readText' of object '#' // sinon.replace( From 43a4473d94d18175d9179312ed8d2e5cf6bb6558 Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Fri, 16 Jul 2021 20:08:22 -0700 Subject: [PATCH 16/40] Check nav map and improve that mark handling --- src/TestCase.ts | 33 ++++++++++++++++++++++------ src/extension.ts | 2 ++ src/test/suite/recorded.test.ts | 38 ++++++++++++++++----------------- 3 files changed, 46 insertions(+), 27 deletions(-) diff --git a/src/TestCase.ts b/src/TestCase.ts index fbd6bf755a..bce3016a66 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -1,4 +1,5 @@ import * as yaml from "js-yaml"; +import { isEqual } from "lodash"; import * as vscode from "vscode"; import { Position, Range, Selection } from "vscode"; import NavigationMap from "./NavigationMap"; @@ -60,6 +61,7 @@ type TestCaseSnapshot = { clipboard: string; visibleRanges: SerializedRange[]; selections: SerializedSelection[]; + thatMark: SerializedSelection[] | null; }; type DecorationRanges = { [coloredSymbol: string]: SerializedRange }; @@ -69,7 +71,6 @@ export type TestCaseFixture = { targets: Target[]; languageId: string; marks: DecorationRanges; - thatMark: SerializedSelection[]; initialState: TestCaseSnapshot; finalState: TestCaseSnapshot; }; @@ -79,19 +80,19 @@ export default class TestCase { languageId: string; targets: Target[]; marks: DecorationRanges; - thatMark: SerializedSelection[]; + context: TestCaseContext; initialState: TestCaseSnapshot | null = null; finalState: TestCaseSnapshot | null = null; constructor(command: TestCaseCommand, context: TestCaseContext) { const activeEditor = vscode.window.activeTextEditor!; - const { thatMark, navigationMap, targets } = context; + const { navigationMap, targets } = context; this.command = command; this.languageId = activeEditor.document.languageId; this.marks = this.extractTargetedDecorations(targets, navigationMap); - this.thatMark = thatMark.map((mark) => serializeSelection(mark.selection)); this.targets = targets; + this.context = context; } extractPrimitiveTargetKeys(...targets: PrimitiveTarget[]) { @@ -135,23 +136,42 @@ export default class TestCase { return targetedDecorations; } - static async getSnapshot(): Promise { + isThatMarkTargeted() { + return this.context.thatMark.every((thatSelection) => { + return Object.values(this.marks).some((targetedSelection) => + isEqual(thatSelection, targetedSelection) + ); + }); + } + + static async getSnapshot( + thatMark: SelectionWithEditor[] + ): Promise { const activeEditor = vscode.window.activeTextEditor!; return { document: activeEditor.document.getText(), selections: activeEditor.selections.map(serializeSelection), visibleRanges: activeEditor.visibleRanges.map(serializeRange), clipboard: await vscode.env.clipboard.readText(), + thatMark: thatMark.map((mark) => serializeSelection(mark.selection)), }; } + async getSnapshot(): Promise { + return await TestCase.getSnapshot(this.context.thatMark); + } + async saveSnapshot() { - const snapshot = await TestCase.getSnapshot(); + const snapshot = await this.getSnapshot(); if (!["copy", "paste"].includes(this.command.actionName)) { snapshot.clipboard = ""; } + if (!this.isThatMarkTargeted() && this.initialState == null) { + snapshot.thatMark = null; + } + if (this.initialState == null) { this.initialState = snapshot; } else if (this.finalState == null) { @@ -172,7 +192,6 @@ export default class TestCase { languageId: this.languageId, targets: this.targets, marks: this.marks, - thatMark: this.thatMark, initialState: this.initialState, finalState: this.finalState, }; diff --git a/src/extension.ts b/src/extension.ts index e2e4ff2bbe..79076b512f 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -242,6 +242,8 @@ export async function activate(context: vscode.ExtensionContext) { }, } ); + + return { navigationMap: graph.navigationMap, thatMark }; } // this method is called when your extension is deactivated diff --git a/src/test/suite/recorded.test.ts b/src/test/suite/recorded.test.ts index b2070d4e2c..853becd6cc 100644 --- a/src/test/suite/recorded.test.ts +++ b/src/test/suite/recorded.test.ts @@ -10,21 +10,12 @@ import TestCase, { SerializedSelection, TestCaseFixture, } from "../../TestCase"; -import * as makeGraphModule from "../../makeGraph"; -import graphConstructors from "../../graphConstructors"; import { SymbolColor } from "../../constants"; function deserializePosition(position: SerializedPosition) { return new vscode.Position(position.line, position.character); } -function deserializeRange(range: SerializedRange) { - return new vscode.Range( - deserializePosition(range.start), - deserializePosition(range.end) - ); -} - function deserializeSelection( selection: SerializedSelection ): vscode.Selection { @@ -34,12 +25,19 @@ function deserializeSelection( } suite("recorded test cases", async function () { + this.timeout(100000); const directory = path.join(__dirname, "../../../testFixtures"); const files = await fsp.readdir(directory); files.forEach(async (file) => { test(file.split(".")[0], async function () { - this.timeout(100000); + const cursorless = vscode.extensions.getExtension("pokey.cursorless"); + + if (cursorless == null) { + throw new Error("Could not get cursorless extension"); + } + + const cursorlessApi = await cursorless.activate(); const buffer = await fsp.readFile(path.join(directory, file)); const fixture = yaml.load(buffer.toString()) as TestCaseFixture; @@ -52,7 +50,7 @@ suite("recorded test cases", async function () { editor.selections = fixture.initialState.selections.map(deserializeSelection); - // TODO Restore `thatMark` from fixture + sinon.replace(cursorlessApi, "thatMark", fixture.initialState.thatMark); // TODO (Many) unsuccessful mocking attempts // TypeError: Cannot assign to read only property 'readText' of object '#' @@ -62,15 +60,12 @@ suite("recorded test cases", async function () { // async () => fixture.initialState.clipboard // ); - // TODO This actually needs to happen before extension activation... // Assert that recorded decorations are present - // const graph = makeGraphModule.makeGraph(graphConstructors); - // Object.entries(fixture.decorations).forEach(([key, _]) => { - // const [color, character] = key.split(".") as [SymbolColor, string]; - // const token = graph.navigationMap.getToken(color, character); - // assert(token != null); - // }); - // sinon.replace(makeGraphModule, "makeGraph", sinon.fake.returns(graph)); + Object.entries(fixture.marks).forEach(([key, _]) => { + const [color, character] = key.split(".") as [SymbolColor, string]; + const token = cursorlessApi.navigationMap.getToken(color, character); + assert(token != null); + }); await new Promise((resolve) => setTimeout(resolve, 1000)); @@ -81,8 +76,11 @@ suite("recorded test cases", async function () { ...fixture.command.extraArgs ); - assert.deepStrictEqual(fixture.finalState, await TestCase.getSnapshot()); sinon.restore(); + assert.deepStrictEqual( + fixture.finalState, + await TestCase.getSnapshot(cursorlessApi.thatMark) + ); }); }); }); From 829882dc0af75f6134a0b3cfbb617d75084fdcf9 Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Fri, 16 Jul 2021 20:48:21 -0700 Subject: [PATCH 17/40] Give up for the night lol --- src/test/suite/recorded.test.ts | 26 +++++--- testFixtures/chuckthat.yml | 73 +++++++++++++++++++++++ testFixtures/swap.yaml | 101 ++++++++++++++++++++++++++++++++ 3 files changed, 192 insertions(+), 8 deletions(-) create mode 100644 testFixtures/chuckthat.yml create mode 100644 testFixtures/swap.yaml diff --git a/src/test/suite/recorded.test.ts b/src/test/suite/recorded.test.ts index 853becd6cc..363363a775 100644 --- a/src/test/suite/recorded.test.ts +++ b/src/test/suite/recorded.test.ts @@ -50,15 +50,25 @@ suite("recorded test cases", async function () { editor.selections = fixture.initialState.selections.map(deserializeSelection); - sinon.replace(cursorlessApi, "thatMark", fixture.initialState.thatMark); + if (fixture.initialState.thatMark) { + const thatMarkFixture = fixture.initialState.thatMark.map((mark) => ({ + selection: deserializeSelection(mark), + editor, + })); + // sinon.replace(cursorlessApi, "thatMark", thatMarkFixture); + // TODO Either way fails! + // cursorlessApi.thatMark = thatMarkFixture; + } - // TODO (Many) unsuccessful mocking attempts - // TypeError: Cannot assign to read only property 'readText' of object '#' - // sinon.replace( - // vscode.env.clipboard, - // "readText", - // async () => fixture.initialState.clipboard - // ); + await vscode.env.clipboard.writeText(""); + // TODO Literally any way I try to mock this fails + // let clipText = fixture.initialState.clipboard; + // sinon.replaceGetter(vscode.env, "clipboard", () => ({ + // readText: async () => clipText, + // writeText: async (value) => { + // clipText = value; + // }, + // })); // Assert that recorded decorations are present Object.entries(fixture.marks).forEach(([key, _]) => { diff --git a/testFixtures/chuckthat.yml b/testFixtures/chuckthat.yml new file mode 100644 index 0000000000..a1ca19b182 --- /dev/null +++ b/testFixtures/chuckthat.yml @@ -0,0 +1,73 @@ +command: + actionName: delete + partialTargets: + - type: primitive + mark: + type: that + extraArgs: [] +languageId: python +targets: + - type: primitive + mark: + type: that + selectionType: token + position: contents + modifier: + type: identity + insideOutsideType: outside +marks: {} +initialState: + document: | + import sys + + def hello_world(name="pokey"): + print(f"hello, {name}") + + if __name__ == "__main__": + hello_world(sys.argv[0]) + selections: + - active: + line: 5 + character: 13 + anchor: + line: 5 + character: 13 + visibleRanges: + - start: + line: 0 + character: 0 + end: + line: 7 + character: 0 + clipboard: "" + thatMark: null +finalState: + document: | + import sys + + + + if __name__ == "__main__": + hello_world(sys.argv[0]) + selections: + - active: + line: 4 + character: 13 + anchor: + line: 4 + character: 13 + visibleRanges: + - start: + line: 0 + character: 0 + end: + line: 6 + character: 0 + clipboard: "" + thatMark: + - active: + line: 3 + character: 27 + anchor: + line: 2 + character: 0 diff --git a/testFixtures/swap.yaml b/testFixtures/swap.yaml new file mode 100644 index 0000000000..9a60dec5ea --- /dev/null +++ b/testFixtures/swap.yaml @@ -0,0 +1,101 @@ +command: + actionName: swap + partialTargets: + - type: primitive + mark: + type: decoratedSymbol + symbolColor: default + character: h + - type: primitive + mark: + type: decoratedSymbol + symbolColor: default + character: k + extraArgs: [] +languageId: python +targets: + - type: primitive + mark: + type: decoratedSymbol + symbolColor: default + character: h + selectionType: token + position: contents + modifier: + type: identity + insideOutsideType: inside + - type: primitive + mark: + type: decoratedSymbol + symbolColor: default + character: k + selectionType: token + position: contents + modifier: + type: identity + insideOutsideType: inside +marks: + default.h: + start: + line: 3 + character: 12 + end: + line: 3 + character: 17 + default.k: + start: + line: 2 + character: 22 + end: + line: 2 + character: 27 +initialState: + document: | + import sys + + def hello_world(name="pokey"): + print(f"hello, {name}") + + if __name__ == "__main__": + hello_world(sys.argv[0]) + selections: + - active: + line: 7 + character: 0 + anchor: + line: 7 + character: 0 + visibleRanges: + - start: + line: 0 + character: 0 + end: + line: 7 + character: 0 + clipboard: "" + thatMark: [] +finalState: + document: | + import sys + + def hello_world(name="hello"): + print(f"pokey, {name}") + + if __name__ == "__main__": + hello_world(sys.argv[0]) + selections: + - active: + line: 7 + character: 0 + anchor: + line: 7 + character: 0 + visibleRanges: + - start: + line: 0 + character: 0 + end: + line: 7 + character: 0 + clipboard: "" + thatMark: [] From 087c7fd9a45bb7a4de9cd7ac31c54b5db1243ed6 Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Sun, 18 Jul 2021 12:27:55 -0700 Subject: [PATCH 18/40] Support testing that mark --- src/TestCase.ts | 24 +++++++++++++-------- src/ThatMark.ts | 13 ++++++++++++ src/extension.ts | 14 ++++++++----- src/test/suite/recorded.test.ts | 37 +++++++++++++-------------------- testFixtures/chuckthat.yml | 28 +++++++++++++++---------- 5 files changed, 69 insertions(+), 47 deletions(-) create mode 100644 src/ThatMark.ts diff --git a/src/TestCase.ts b/src/TestCase.ts index bce3016a66..cc519c09cc 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -3,6 +3,7 @@ import { isEqual } from "lodash"; import * as vscode from "vscode"; import { Position, Range, Selection } from "vscode"; import NavigationMap from "./NavigationMap"; +import { ThatMark } from "./ThatMark"; import { ActionType, PartialTarget, @@ -51,7 +52,7 @@ type TestCaseCommand = { }; type TestCaseContext = { - thatMark: SelectionWithEditor[]; + thatMark: ThatMark; targets: Target[]; navigationMap: NavigationMap; }; @@ -137,10 +138,15 @@ export default class TestCase { } isThatMarkTargeted() { - return this.context.thatMark.every((thatSelection) => { - return Object.values(this.marks).some((targetedSelection) => - isEqual(thatSelection, targetedSelection) - ); + return this.context.thatMark.get().every(({ selection: thatSelection }) => { + return Object.values(this.marks).some((targetedSelection) => { + return ( + thatSelection.end.character === targetedSelection.end.character && + thatSelection.end.line === targetedSelection.end.line && + thatSelection.start.character === targetedSelection.start.character && + thatSelection.start.line === targetedSelection.start.line + ); + }); }); } @@ -158,7 +164,7 @@ export default class TestCase { } async getSnapshot(): Promise { - return await TestCase.getSnapshot(this.context.thatMark); + return await TestCase.getSnapshot(this.context.thatMark.get()); } async saveSnapshot() { @@ -168,9 +174,9 @@ export default class TestCase { snapshot.clipboard = ""; } - if (!this.isThatMarkTargeted() && this.initialState == null) { - snapshot.thatMark = null; - } + // if (this.initialState == null && !this.isThatMarkTargeted()) { + // snapshot.thatMark = []; + // } if (this.initialState == null) { this.initialState = snapshot; diff --git a/src/ThatMark.ts b/src/ThatMark.ts new file mode 100644 index 0000000000..80abc085c8 --- /dev/null +++ b/src/ThatMark.ts @@ -0,0 +1,13 @@ +import { SelectionWithEditor } from "./Types"; + +export class ThatMark { + private mark: SelectionWithEditor[] = []; + + set(value: SelectionWithEditor[]) { + this.mark = value; + } + + get() { + return this.mark; + } +} diff --git a/src/extension.ts b/src/extension.ts index 79076b512f..4a9c7b06bc 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -15,6 +15,7 @@ import { import { makeGraph } from "./makeGraph"; import { logBranchTypes } from "./debug"; import TestCase from "./TestCase"; +import { ThatMark } from "./ThatMark"; export async function activate(context: vscode.ExtensionContext) { const fontMeasurements = new FontMeasurements(context); @@ -79,7 +80,7 @@ export async function activate(context: vscode.ExtensionContext) { ); const graph = makeGraph(graphConstructors); - var thatMark: SelectionWithEditor[] = []; + const thatMark = new ThatMark(); var recordTestCase = false; const cursorlessRecordTestCaseDisposable = vscode.commands.registerCommand( "cursorless.recordTestCase", @@ -142,7 +143,7 @@ export async function activate(context: vscode.ExtensionContext) { })) ?? [], currentEditor: vscode.window.activeTextEditor, navigationMap: graph.navigationMap, - thatMark, + thatMark: thatMark.get(), getNodeAtLocation, }; @@ -152,7 +153,7 @@ export async function activate(context: vscode.ExtensionContext) { if (recordTestCase) { const command = { actionName, partialTargets, extraArgs }; const context = { - thatMark, + thatMark: thatMark, targets, navigationMap: graph.navigationMap!, }; @@ -165,7 +166,7 @@ export async function activate(context: vscode.ExtensionContext) { ...extraArgs ); - thatMark = newThatMark; + thatMark.set(newThatMark); if (testCase != null) { await testCase.saveSnapshot(); @@ -243,7 +244,10 @@ export async function activate(context: vscode.ExtensionContext) { } ); - return { navigationMap: graph.navigationMap, thatMark }; + return { + navigationMap: graph.navigationMap, + thatMark, + }; } // this method is called when your extension is deactivated diff --git a/src/test/suite/recorded.test.ts b/src/test/suite/recorded.test.ts index 363363a775..b32905c421 100644 --- a/src/test/suite/recorded.test.ts +++ b/src/test/suite/recorded.test.ts @@ -3,14 +3,14 @@ import { promises as fsp } from "fs"; import * as path from "path"; import * as yaml from "js-yaml"; import * as vscode from "vscode"; -import * as sinon from "sinon"; import TestCase, { SerializedPosition, - SerializedRange, SerializedSelection, TestCaseFixture, } from "../../TestCase"; import { SymbolColor } from "../../constants"; +import { ThatMark } from "../../ThatMark"; +import NavigationMap from "../../NavigationMap"; function deserializePosition(position: SerializedPosition) { return new vscode.Position(position.line, position.character); @@ -25,19 +25,23 @@ function deserializeSelection( } suite("recorded test cases", async function () { - this.timeout(100000); const directory = path.join(__dirname, "../../../testFixtures"); - const files = await fsp.readdir(directory); + // No await here because an async function swallows errors + const files = await fsp.readdir(directory); files.forEach(async (file) => { test(file.split(".")[0], async function () { + this.timeout(100000); const cursorless = vscode.extensions.getExtension("pokey.cursorless"); if (cursorless == null) { throw new Error("Could not get cursorless extension"); } - const cursorlessApi = await cursorless.activate(); + const cursorlessApi: { + thatMark: ThatMark; + navigationMap: NavigationMap; + } = await cursorless.activate(); const buffer = await fsp.readFile(path.join(directory, file)); const fixture = yaml.load(buffer.toString()) as TestCaseFixture; @@ -51,24 +55,14 @@ suite("recorded test cases", async function () { fixture.initialState.selections.map(deserializeSelection); if (fixture.initialState.thatMark) { - const thatMarkFixture = fixture.initialState.thatMark.map((mark) => ({ + const initialThatMark = fixture.initialState.thatMark.map((mark) => ({ selection: deserializeSelection(mark), editor, })); - // sinon.replace(cursorlessApi, "thatMark", thatMarkFixture); - // TODO Either way fails! - // cursorlessApi.thatMark = thatMarkFixture; + cursorlessApi.thatMark.set(initialThatMark); } - await vscode.env.clipboard.writeText(""); - // TODO Literally any way I try to mock this fails - // let clipText = fixture.initialState.clipboard; - // sinon.replaceGetter(vscode.env, "clipboard", () => ({ - // readText: async () => clipText, - // writeText: async (value) => { - // clipText = value; - // }, - // })); + vscode.env.clipboard.writeText(fixture.initialState.clipboard); // Assert that recorded decorations are present Object.entries(fixture.marks).forEach(([key, _]) => { @@ -86,11 +80,10 @@ suite("recorded test cases", async function () { ...fixture.command.extraArgs ); - sinon.restore(); - assert.deepStrictEqual( - fixture.finalState, - await TestCase.getSnapshot(cursorlessApi.thatMark) + const resultState = await TestCase.getSnapshot( + cursorlessApi.thatMark.get() ); + assert.deepStrictEqual(fixture.finalState, resultState); }); }); }); diff --git a/testFixtures/chuckthat.yml b/testFixtures/chuckthat.yml index a1ca19b182..65493b174f 100644 --- a/testFixtures/chuckthat.yml +++ b/testFixtures/chuckthat.yml @@ -27,11 +27,11 @@ initialState: hello_world(sys.argv[0]) selections: - active: - line: 5 - character: 13 + line: 3 + character: 27 anchor: - line: 5 - character: 13 + line: 3 + character: 27 visibleRanges: - start: line: 0 @@ -40,7 +40,13 @@ initialState: line: 7 character: 0 clipboard: "" - thatMark: null + thatMark: + - active: + line: 3 + character: 27 + anchor: + line: 2 + character: 0 finalState: document: | import sys @@ -51,11 +57,11 @@ finalState: hello_world(sys.argv[0]) selections: - active: - line: 4 - character: 13 + line: 2 + character: 0 anchor: - line: 4 - character: 13 + line: 2 + character: 0 visibleRanges: - start: line: 0 @@ -66,8 +72,8 @@ finalState: clipboard: "" thatMark: - active: - line: 3 - character: 27 + line: 2 + character: 0 anchor: line: 2 character: 0 From 50ff1e4deac0b98cd7d2b7787339fc412d9e8bb5 Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Sun, 18 Jul 2021 12:46:57 -0700 Subject: [PATCH 19/40] Add mockable clipboard layer --- src/Clipboard.ts | 12 +++++++++ src/TestCase.ts | 3 ++- src/extension.ts | 3 ++- src/test/suite/recorded.test.ts | 20 +++++++++----- testFixtures/{swap.yaml => swap.yml} | 40 ++++++++++++++++++---------- 5 files changed, 56 insertions(+), 22 deletions(-) create mode 100644 src/Clipboard.ts rename testFixtures/{swap.yaml => swap.yml} (77%) diff --git a/src/Clipboard.ts b/src/Clipboard.ts new file mode 100644 index 0000000000..f2d13d1b97 --- /dev/null +++ b/src/Clipboard.ts @@ -0,0 +1,12 @@ +import * as vscode from "vscode"; + +/** + * A mockable layer over the vscode clipboard + * + * For unknown reasons it's not possible to mock the clipboard directly. + * Use this instead of vscode.env.clipboard so it can be mocked in testing. + **/ +export class Clipboard { + static readText = vscode.env.clipboard.readText; + static writeText = vscode.env.clipboard.writeText; +} diff --git a/src/TestCase.ts b/src/TestCase.ts index cc519c09cc..33e8f89a83 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -2,6 +2,7 @@ import * as yaml from "js-yaml"; import { isEqual } from "lodash"; import * as vscode from "vscode"; import { Position, Range, Selection } from "vscode"; +import { Clipboard } from "./Clipboard"; import NavigationMap from "./NavigationMap"; import { ThatMark } from "./ThatMark"; import { @@ -158,7 +159,7 @@ export default class TestCase { document: activeEditor.document.getText(), selections: activeEditor.selections.map(serializeSelection), visibleRanges: activeEditor.visibleRanges.map(serializeRange), - clipboard: await vscode.env.clipboard.readText(), + clipboard: await Clipboard.readText(), thatMark: thatMark.map((mark) => serializeSelection(mark.selection)), }; } diff --git a/src/extension.ts b/src/extension.ts index 4a9c7b06bc..ebce28c1a2 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -16,6 +16,7 @@ import { makeGraph } from "./makeGraph"; import { logBranchTypes } from "./debug"; import TestCase from "./TestCase"; import { ThatMark } from "./ThatMark"; +import { Clipboard } from "./Clipboard"; export async function activate(context: vscode.ExtensionContext) { const fontMeasurements = new FontMeasurements(context); @@ -115,7 +116,7 @@ export async function activate(context: vscode.ExtensionContext) { var clipboardContents: string | undefined; if (isPaste) { - clipboardContents = await vscode.env.clipboard.readText(); + clipboardContents = await Clipboard.readText(); // clipboardContents = "hello"; // clipboardContents = "hello\n"; // clipboardContents = "\nhello\n"; diff --git a/src/test/suite/recorded.test.ts b/src/test/suite/recorded.test.ts index b32905c421..4a8c66cc7b 100644 --- a/src/test/suite/recorded.test.ts +++ b/src/test/suite/recorded.test.ts @@ -11,6 +11,8 @@ import TestCase, { import { SymbolColor } from "../../constants"; import { ThatMark } from "../../ThatMark"; import NavigationMap from "../../NavigationMap"; +import * as sinon from "sinon"; +import { Clipboard } from "../../Clipboard"; function deserializePosition(position: SerializedPosition) { return new vscode.Position(position.line, position.character); @@ -26,9 +28,8 @@ function deserializeSelection( suite("recorded test cases", async function () { const directory = path.join(__dirname, "../../../testFixtures"); - - // No await here because an async function swallows errors const files = await fsp.readdir(directory); + files.forEach(async (file) => { test(file.split(".")[0], async function () { this.timeout(100000); @@ -62,17 +63,22 @@ suite("recorded test cases", async function () { cursorlessApi.thatMark.set(initialThatMark); } - vscode.env.clipboard.writeText(fixture.initialState.clipboard); + let clip = fixture.initialState.clipboard; + sinon.replace(Clipboard, "readText", async () => clip); + sinon.replace(Clipboard, "writeText", async (value: string) => { + clip = value; + }); + + // Wait for cursorless to set up decorations + await new Promise((resolve) => setTimeout(resolve, 300)); // Assert that recorded decorations are present Object.entries(fixture.marks).forEach(([key, _]) => { const [color, character] = key.split(".") as [SymbolColor, string]; const token = cursorlessApi.navigationMap.getToken(color, character); - assert(token != null); + assert(token != null, `Mark "${color} ${character}" not found`); }); - await new Promise((resolve) => setTimeout(resolve, 1000)); - await vscode.commands.executeCommand( "cursorless.command", fixture.command.actionName, @@ -84,6 +90,8 @@ suite("recorded test cases", async function () { cursorlessApi.thatMark.get() ); assert.deepStrictEqual(fixture.finalState, resultState); + + sinon.restore(); }); }); }); diff --git a/testFixtures/swap.yaml b/testFixtures/swap.yml similarity index 77% rename from testFixtures/swap.yaml rename to testFixtures/swap.yml index 9a60dec5ea..88cb3f097e 100644 --- a/testFixtures/swap.yaml +++ b/testFixtures/swap.yml @@ -10,7 +10,7 @@ command: mark: type: decoratedSymbol symbolColor: default - character: k + character: p extraArgs: [] languageId: python targets: @@ -28,7 +28,7 @@ targets: mark: type: decoratedSymbol symbolColor: default - character: k + character: p selectionType: token position: contents modifier: @@ -42,13 +42,13 @@ marks: end: line: 3 character: 17 - default.k: + default.p: start: - line: 2 - character: 22 + line: 3 + character: 4 end: - line: 2 - character: 27 + line: 3 + character: 9 initialState: document: | import sys @@ -60,10 +60,10 @@ initialState: hello_world(sys.argv[0]) selections: - active: - line: 7 + line: 2 character: 0 anchor: - line: 7 + line: 2 character: 0 visibleRanges: - start: @@ -78,17 +78,17 @@ finalState: document: | import sys - def hello_world(name="hello"): - print(f"pokey, {name}") + def hello_world(name="pokey"): + hello(f"print, {name}") if __name__ == "__main__": hello_world(sys.argv[0]) selections: - active: - line: 7 + line: 2 character: 0 anchor: - line: 7 + line: 2 character: 0 visibleRanges: - start: @@ -98,4 +98,16 @@ finalState: line: 7 character: 0 clipboard: "" - thatMark: [] + thatMark: + - active: + line: 3 + character: 17 + anchor: + line: 3 + character: 12 + - active: + line: 3 + character: 9 + anchor: + line: 3 + character: 4 From f6db9e4c0638c7e331aeaeb548f42b8294c90edb Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Sun, 18 Jul 2021 13:03:43 -0700 Subject: [PATCH 20/40] Test command return value --- src/TestCase.ts | 5 ++++- src/extension.ts | 1 + src/test/suite/recorded.test.ts | 3 ++- testFixtures/{chuckthat.yml => chuckThat.yml} | 1 + testFixtures/swap.yml | 1 + 5 files changed, 9 insertions(+), 2 deletions(-) rename testFixtures/{chuckthat.yml => chuckThat.yml} (98%) diff --git a/src/TestCase.ts b/src/TestCase.ts index 33e8f89a83..9efd4ce16f 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -75,6 +75,7 @@ export type TestCaseFixture = { marks: DecorationRanges; initialState: TestCaseSnapshot; finalState: TestCaseSnapshot; + returnValue: any; }; export default class TestCase { @@ -85,6 +86,7 @@ export default class TestCase { context: TestCaseContext; initialState: TestCaseSnapshot | null = null; finalState: TestCaseSnapshot | null = null; + returnValue: any = null; constructor(command: TestCaseCommand, context: TestCaseContext) { const activeEditor = vscode.window.activeTextEditor!; @@ -201,8 +203,9 @@ export default class TestCase { marks: this.marks, initialState: this.initialState, finalState: this.finalState, + returnValue: this.returnValue, }; - return yaml.dump(fixture, { noRefs: true }); + return yaml.dump(fixture, { noRefs: true, quotingType: '"' }); } async presentFixture() { diff --git a/src/extension.ts b/src/extension.ts index ebce28c1a2..950bf2214c 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -171,6 +171,7 @@ export async function activate(context: vscode.ExtensionContext) { if (testCase != null) { await testCase.saveSnapshot(); + testCase.returnValue = returnValue; testCase.presentFixture(); recordTestCase = false; } diff --git a/src/test/suite/recorded.test.ts b/src/test/suite/recorded.test.ts index 4a8c66cc7b..91a233397f 100644 --- a/src/test/suite/recorded.test.ts +++ b/src/test/suite/recorded.test.ts @@ -79,7 +79,7 @@ suite("recorded test cases", async function () { assert(token != null, `Mark "${color} ${character}" not found`); }); - await vscode.commands.executeCommand( + const returnValue = await vscode.commands.executeCommand( "cursorless.command", fixture.command.actionName, fixture.command.partialTargets, @@ -90,6 +90,7 @@ suite("recorded test cases", async function () { cursorlessApi.thatMark.get() ); assert.deepStrictEqual(fixture.finalState, resultState); + assert.deepStrictEqual(fixture.returnValue, returnValue); sinon.restore(); }); diff --git a/testFixtures/chuckthat.yml b/testFixtures/chuckThat.yml similarity index 98% rename from testFixtures/chuckthat.yml rename to testFixtures/chuckThat.yml index 65493b174f..c486acaf97 100644 --- a/testFixtures/chuckthat.yml +++ b/testFixtures/chuckThat.yml @@ -77,3 +77,4 @@ finalState: anchor: line: 2 character: 0 +returnValue: null diff --git a/testFixtures/swap.yml b/testFixtures/swap.yml index 88cb3f097e..30d2048edb 100644 --- a/testFixtures/swap.yml +++ b/testFixtures/swap.yml @@ -111,3 +111,4 @@ finalState: anchor: line: 3 character: 4 +returnValue: null From be29b40f9b7617a67bacffcb5dfedf8fe8736bd4 Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Sun, 18 Jul 2021 14:21:39 -0700 Subject: [PATCH 21/40] Only save targeted that marks to fixture --- src/TestCase.ts | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/src/TestCase.ts b/src/TestCase.ts index 9efd4ce16f..865d138d53 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -141,16 +141,9 @@ export default class TestCase { } isThatMarkTargeted() { - return this.context.thatMark.get().every(({ selection: thatSelection }) => { - return Object.values(this.marks).some((targetedSelection) => { - return ( - thatSelection.end.character === targetedSelection.end.character && - thatSelection.end.line === targetedSelection.end.line && - thatSelection.start.character === targetedSelection.start.character && - thatSelection.start.line === targetedSelection.start.line - ); - }); - }); + return this.targets.some( + (target) => target.type === "primitive" && target.mark.type === "that" + ); } static async getSnapshot( @@ -177,9 +170,9 @@ export default class TestCase { snapshot.clipboard = ""; } - // if (this.initialState == null && !this.isThatMarkTargeted()) { - // snapshot.thatMark = []; - // } + if (this.initialState == null && !this.isThatMarkTargeted()) { + snapshot.thatMark = []; + } if (this.initialState == null) { this.initialState = snapshot; From 84326b401683b130dcf612a80c57bfe674cffc95 Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Sun, 18 Jul 2021 16:35:58 -0700 Subject: [PATCH 22/40] Name fixture and include Talon command --- src/TestCase.ts | 39 +++++++++++++++++++++++++++++--------- src/extension.ts | 31 ++++++++++++++++++++++++------ testFixtures/chuckThat.yml | 1 + testFixtures/swap.yml | 35 +++++++++++++++++----------------- 4 files changed, 74 insertions(+), 32 deletions(-) diff --git a/src/TestCase.ts b/src/TestCase.ts index 865d138d53..909b322e0f 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -1,5 +1,6 @@ +import * as path from "path"; +import * as fs from "fs"; import * as yaml from "js-yaml"; -import { isEqual } from "lodash"; import * as vscode from "vscode"; import { Position, Range, Selection } from "vscode"; import { Clipboard } from "./Clipboard"; @@ -53,6 +54,7 @@ type TestCaseCommand = { }; type TestCaseContext = { + talonCommand: string; thatMark: ThatMark; targets: Target[]; navigationMap: NavigationMap; @@ -69,6 +71,7 @@ type TestCaseSnapshot = { type DecorationRanges = { [coloredSymbol: string]: SerializedRange }; export type TestCaseFixture = { + talonCommand: string; command: TestCaseCommand; targets: Target[]; languageId: string; @@ -79,6 +82,7 @@ export type TestCaseFixture = { }; export default class TestCase { + talonCommand: string; command: TestCaseCommand; languageId: string; targets: Target[]; @@ -90,8 +94,9 @@ export default class TestCase { constructor(command: TestCaseCommand, context: TestCaseContext) { const activeEditor = vscode.window.activeTextEditor!; - const { navigationMap, targets } = context; + const { navigationMap, targets, talonCommand } = context; + this.talonCommand = talonCommand; this.command = command; this.languageId = activeEditor.document.languageId; this.marks = this.extractTargetedDecorations(targets, navigationMap); @@ -190,6 +195,7 @@ export default class TestCase { throw Error("Two snapshots must be taken before serializing"); } const fixture: TestCaseFixture = { + talonCommand: this.talonCommand, command: this.command, languageId: this.languageId, targets: this.targets, @@ -201,15 +207,30 @@ export default class TestCase { return yaml.dump(fixture, { noRefs: true, quotingType: '"' }); } - async presentFixture() { + async writeFixture(filename: string) { + if (filename === "") { + throw new Error("Filename required"); + } + const fixture = this.toYaml(); - const document = await vscode.workspace.openTextDocument({ - language: "yaml", - content: fixture, - }); + const workspacePath = vscode.workspace.workspaceFolders?.[0].uri.path; + let document; + + if (workspacePath) { + const fixturePath = path.join( + workspacePath, + "testFixtures", + `${filename}.yml` + ); + fs.writeFileSync(fixturePath, fixture); + document = await vscode.workspace.openTextDocument(fixturePath); + } else { + document = await vscode.workspace.openTextDocument({ + language: "yaml", + content: fixture, + }); + } await vscode.window.showTextDocument(document, { - preserveFocus: true, - preview: true, viewColumn: vscode.ViewColumn.Beside, }); } diff --git a/src/extension.ts b/src/extension.ts index 950bf2214c..853101983d 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -82,12 +82,30 @@ export async function activate(context: vscode.ExtensionContext) { const graph = makeGraph(graphConstructors); const thatMark = new ThatMark(); - var recordTestCase = false; + let testCaseRecording = { active: false, talonCommand: "", filename: "" }; const cursorlessRecordTestCaseDisposable = vscode.commands.registerCommand( "cursorless.recordTestCase", - () => { + async () => { console.log("Recording test case for next command"); - recordTestCase = true; + + const talonCommand = await vscode.window.showInputBox({ + prompt: "Talon Command", + validateInput: (input) => + input.trim().length ? "" : "Missing command", + }); + const filename = await vscode.window.showInputBox({ + prompt: "Test Filename", + validateInput: (input) => + input.trim().length ? "" : "Missing filename", + }); + + if (!filename || !talonCommand) { + throw new Error("File name and talon command required"); + } + + testCaseRecording.active = true; + testCaseRecording.filename = filename; + testCaseRecording.talonCommand = talonCommand; } ); const cursorlessCommandDisposable = vscode.commands.registerCommand( @@ -151,12 +169,13 @@ export async function activate(context: vscode.ExtensionContext) { const selections = processTargets(processedTargetsContext, targets); let testCase: TestCase | null = null; - if (recordTestCase) { + if (testCaseRecording.active) { const command = { actionName, partialTargets, extraArgs }; const context = { thatMark: thatMark, targets, navigationMap: graph.navigationMap!, + talonCommand: testCaseRecording.talonCommand, }; testCase = new TestCase(command, context); await testCase.saveSnapshot(); @@ -172,8 +191,8 @@ export async function activate(context: vscode.ExtensionContext) { if (testCase != null) { await testCase.saveSnapshot(); testCase.returnValue = returnValue; - testCase.presentFixture(); - recordTestCase = false; + testCase.writeFixture(testCaseRecording.filename); + testCaseRecording.active = false; } return returnValue; diff --git a/testFixtures/chuckThat.yml b/testFixtures/chuckThat.yml index c486acaf97..2670a81a01 100644 --- a/testFixtures/chuckThat.yml +++ b/testFixtures/chuckThat.yml @@ -1,3 +1,4 @@ +talonCommand: chuck that command: actionName: delete partialTargets: diff --git a/testFixtures/swap.yml b/testFixtures/swap.yml index 30d2048edb..2f71f275e5 100644 --- a/testFixtures/swap.yml +++ b/testFixtures/swap.yml @@ -1,3 +1,4 @@ +talonCommand: swap harp with crunch command: actionName: swap partialTargets: @@ -10,7 +11,7 @@ command: mark: type: decoratedSymbol symbolColor: default - character: p + character: k extraArgs: [] languageId: python targets: @@ -28,7 +29,7 @@ targets: mark: type: decoratedSymbol symbolColor: default - character: p + character: k selectionType: token position: contents modifier: @@ -42,13 +43,13 @@ marks: end: line: 3 character: 17 - default.p: + default.k: start: - line: 3 - character: 4 + line: 2 + character: 22 end: - line: 3 - character: 9 + line: 2 + character: 27 initialState: document: | import sys @@ -60,10 +61,10 @@ initialState: hello_world(sys.argv[0]) selections: - active: - line: 2 + line: 7 character: 0 anchor: - line: 2 + line: 7 character: 0 visibleRanges: - start: @@ -78,17 +79,17 @@ finalState: document: | import sys - def hello_world(name="pokey"): - hello(f"print, {name}") + def hello_world(name="hello"): + print(f"pokey, {name}") if __name__ == "__main__": hello_world(sys.argv[0]) selections: - active: - line: 2 + line: 7 character: 0 anchor: - line: 2 + line: 7 character: 0 visibleRanges: - start: @@ -106,9 +107,9 @@ finalState: line: 3 character: 12 - active: - line: 3 - character: 9 + line: 2 + character: 27 anchor: - line: 3 - character: 4 + line: 2 + character: 22 returnValue: null From c6cd5ec70fb703e6ad3650019d77f36a1d1cef74 Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Sun, 18 Jul 2021 16:42:30 -0700 Subject: [PATCH 23/40] Only save visible ranges for folding actions --- src/TestCase.ts | 4 ++++ testFixtures/chuckThat.yml | 24 ++---------------------- testFixtures/swap.yml | 16 ++-------------- 3 files changed, 8 insertions(+), 36 deletions(-) diff --git a/src/TestCase.ts b/src/TestCase.ts index 909b322e0f..dfd0d74ed6 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -175,6 +175,10 @@ export default class TestCase { snapshot.clipboard = ""; } + if (!["fold", "unfold"].includes(this.command.actionName)) { + snapshot.visibleRanges = []; + } + if (this.initialState == null && !this.isThatMarkTargeted()) { snapshot.thatMark = []; } diff --git a/testFixtures/chuckThat.yml b/testFixtures/chuckThat.yml index 2670a81a01..0bb2634dbd 100644 --- a/testFixtures/chuckThat.yml +++ b/testFixtures/chuckThat.yml @@ -33,21 +33,7 @@ initialState: anchor: line: 3 character: 27 - visibleRanges: - - start: - line: 0 - character: 0 - end: - line: 7 - character: 0 - clipboard: "" - thatMark: - - active: - line: 3 - character: 27 - anchor: - line: 2 - character: 0 + visibleRanges: [] finalState: document: | import sys @@ -63,13 +49,7 @@ finalState: anchor: line: 2 character: 0 - visibleRanges: - - start: - line: 0 - character: 0 - end: - line: 6 - character: 0 + visibleRanges: [] clipboard: "" thatMark: - active: diff --git a/testFixtures/swap.yml b/testFixtures/swap.yml index 2f71f275e5..ab155a2456 100644 --- a/testFixtures/swap.yml +++ b/testFixtures/swap.yml @@ -66,13 +66,7 @@ initialState: anchor: line: 7 character: 0 - visibleRanges: - - start: - line: 0 - character: 0 - end: - line: 7 - character: 0 + visibleRanges: [] clipboard: "" thatMark: [] finalState: @@ -91,13 +85,7 @@ finalState: anchor: line: 7 character: 0 - visibleRanges: - - start: - line: 0 - character: 0 - end: - line: 7 - character: 0 + visibleRanges: [] clipboard: "" thatMark: - active: From ca334b2cd98e8025a890199ac0aa7b3c38f5fede Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Mon, 26 Jul 2021 20:18:27 -0700 Subject: [PATCH 24/40] Start refactoring test cases Don't define irrelevant fixture properties Extract test case helpers Remove navigation map serializer Clarify test case methods --- src/NavigationMap.ts | 9 -- src/TestCase.ts | 191 ++++++++------------------------ src/extension.ts | 40 +++---- src/extractTargetedMarks.ts | 50 +++++++++ src/serializers.ts | 46 ++++++++ src/takeSnapshot.ts | 45 ++++++++ src/test/suite/recorded.test.ts | 38 ++++--- testFixtures/chuckThat.yml | 20 ++-- testFixtures/swap.yml | 5 - 9 files changed, 234 insertions(+), 210 deletions(-) create mode 100644 src/extractTargetedMarks.ts create mode 100644 src/serializers.ts create mode 100644 src/takeSnapshot.ts diff --git a/src/NavigationMap.ts b/src/NavigationMap.ts index a3a31f1a84..7f92a5adc1 100644 --- a/src/NavigationMap.ts +++ b/src/NavigationMap.ts @@ -1,6 +1,5 @@ import { TextDocumentChangeEvent } from "vscode"; import { SymbolColor } from "./constants"; -import { SerializedRange, serializeRange } from "./TestCase"; import { Token } from "./Types"; /** @@ -56,14 +55,6 @@ export default class NavigationMap { return this.map[NavigationMap.getKey(color, character)]; } - public serializeRanges() { - const rangeMap: { [coloredSymbol: string]: SerializedRange } = {}; - Object.entries(this.map).forEach(([key, value]) => { - rangeMap[key] = serializeRange(value.range); - }); - return rangeMap; - } - public clear() { this.map = {}; } diff --git a/src/TestCase.ts b/src/TestCase.ts index dfd0d74ed6..40b88b47c0 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -2,50 +2,12 @@ import * as path from "path"; import * as fs from "fs"; import * as yaml from "js-yaml"; import * as vscode from "vscode"; -import { Position, Range, Selection } from "vscode"; -import { Clipboard } from "./Clipboard"; import NavigationMap from "./NavigationMap"; import { ThatMark } from "./ThatMark"; -import { - ActionType, - PartialTarget, - PrimitiveTarget, - SelectionWithEditor, - Target, -} from "./Types"; - -export type SerializedPosition = { - line: number; - character: number; -}; - -export type SerializedRange = { - start: SerializedPosition; - end: SerializedPosition; -}; - -export type SerializedSelection = { - anchor: SerializedPosition; - active: SerializedPosition; -}; - -export function serializeRange(range: Range): SerializedRange { - return { - start: serializePosition(range.start), - end: serializePosition(range.end), - }; -} - -export function serializeSelection(selection: Selection): SerializedSelection { - return { - active: serializePosition(selection.active), - anchor: serializePosition(selection.anchor), - }; -} - -export function serializePosition(position: Position): SerializedPosition { - return { line: position.line, character: position.character }; -} +import { ActionType, PartialTarget, Target } from "./Types"; +import { extractTargetedMarks } from "./extractTargetedMarks"; +import { serializeMarks, SerializedMarks } from "./serializers"; +import { takeSnapshot, TestCaseSnapshot } from "./takeSnapshot"; type TestCaseCommand = { actionName: ActionType; @@ -60,148 +22,75 @@ type TestCaseContext = { navigationMap: NavigationMap; }; -type TestCaseSnapshot = { - document: string; - clipboard: string; - visibleRanges: SerializedRange[]; - selections: SerializedSelection[]; - thatMark: SerializedSelection[] | null; -}; - -type DecorationRanges = { [coloredSymbol: string]: SerializedRange }; - export type TestCaseFixture = { talonCommand: string; command: TestCaseCommand; targets: Target[]; languageId: string; - marks: DecorationRanges; + marks: SerializedMarks; initialState: TestCaseSnapshot; finalState: TestCaseSnapshot; - returnValue: any; + returnValue: unknown; }; -export default class TestCase { +export class TestCase { talonCommand: string; command: TestCaseCommand; languageId: string; targets: Target[]; - marks: DecorationRanges; + marks: SerializedMarks; context: TestCaseContext; initialState: TestCaseSnapshot | null = null; finalState: TestCaseSnapshot | null = null; - returnValue: any = null; + returnValue: unknown = null; constructor(command: TestCaseCommand, context: TestCaseContext) { const activeEditor = vscode.window.activeTextEditor!; const { navigationMap, targets, talonCommand } = context; + const targetedMarks = extractTargetedMarks(targets, navigationMap); this.talonCommand = talonCommand; this.command = command; this.languageId = activeEditor.document.languageId; - this.marks = this.extractTargetedDecorations(targets, navigationMap); + this.marks = serializeMarks(targetedMarks); this.targets = targets; this.context = context; } - extractPrimitiveTargetKeys(...targets: PrimitiveTarget[]) { - const keys: string[] = []; - targets.forEach((target) => { - if (target.mark.type === "decoratedSymbol") { - const { character, symbolColor } = target.mark; - keys.push(NavigationMap.getKey(symbolColor, character)); - } - }); - return keys; - } - - extractTargetKeys(target: Target): string[] { - switch (target.type) { - case "primitive": - return this.extractPrimitiveTargetKeys(target); - - case "list": - return target.elements.map(this.extractTargetKeys, this).flat(); - - case "range": - return this.extractPrimitiveTargetKeys(target.start, target.end); - - default: - return []; - } - } - - extractTargetedDecorations(targets: Target[], navigationMap: NavigationMap) { - if (!navigationMap) { - return {}; - } - - const decorationRanges = navigationMap.serializeRanges(); - const targetedDecorations: DecorationRanges = {}; - const targetKeys = targets.map(this.extractTargetKeys, this).flat(); - targetKeys.forEach((key) => { - targetedDecorations[key] = decorationRanges[key]; - }); - return targetedDecorations; - } - - isThatMarkTargeted() { + private includesThatMark(target: Target) { return this.targets.some( (target) => target.type === "primitive" && target.mark.type === "that" ); } - static async getSnapshot( - thatMark: SelectionWithEditor[] - ): Promise { - const activeEditor = vscode.window.activeTextEditor!; - return { - document: activeEditor.document.getText(), - selections: activeEditor.selections.map(serializeSelection), - visibleRanges: activeEditor.visibleRanges.map(serializeRange), - clipboard: await Clipboard.readText(), - thatMark: thatMark.map((mark) => serializeSelection(mark.selection)), + private getExcludedFields() { + const excludableFields = { + clipboard: !["copy", "paste"].includes(this.command.actionName), + thatMark: + this.initialState == null && + !this.targets.some(this.includesThatMark, this), + visibleRanges: ![ + "fold", + "unfold", + "scrollToBottom", + "scrollToCenter", + "scrollToTop", + ].includes(this.command.actionName), }; - } - - async getSnapshot(): Promise { - return await TestCase.getSnapshot(this.context.thatMark.get()); - } - async saveSnapshot() { - const snapshot = await this.getSnapshot(); - - if (!["copy", "paste"].includes(this.command.actionName)) { - snapshot.clipboard = ""; - } - - if (!["fold", "unfold"].includes(this.command.actionName)) { - snapshot.visibleRanges = []; - } - - if (this.initialState == null && !this.isThatMarkTargeted()) { - snapshot.thatMark = []; - } - - if (this.initialState == null) { - this.initialState = snapshot; - } else if (this.finalState == null) { - this.finalState = snapshot; - } else { - throw Error("Both snapshots already taken"); - } - - return snapshot; + return Object.keys(excludableFields).filter( + (field) => excludableFields[field] + ); } - toYaml() { + private toYaml() { if (this.initialState == null || this.finalState == null) { throw Error("Two snapshots must be taken before serializing"); } const fixture: TestCaseFixture = { talonCommand: this.talonCommand, - command: this.command, languageId: this.languageId, + command: this.command, targets: this.targets, marks: this.marks, initialState: this.initialState, @@ -211,16 +100,26 @@ export default class TestCase { return yaml.dump(fixture, { noRefs: true, quotingType: '"' }); } - async writeFixture(filename: string) { - if (filename === "") { - throw new Error("Filename required"); - } + async recordInitialState() { + const excludeFields = this.getExcludedFields(); + this.initialState = await takeSnapshot( + this.context.thatMark, + excludeFields + ); + } + + async recordFinalState(returnValue: unknown) { + const excludeFields = this.getExcludedFields(); + this.returnValue = returnValue; + this.finalState = await takeSnapshot(this.context.thatMark, excludeFields); + } + async writeFile(filename: string) { const fixture = this.toYaml(); const workspacePath = vscode.workspace.workspaceFolders?.[0].uri.path; let document; - if (workspacePath) { + if (workspacePath && filename) { const fixturePath = path.join( workspacePath, "testFixtures", diff --git a/src/extension.ts b/src/extension.ts index 853101983d..fc8c72e4de 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -6,15 +6,10 @@ import graphConstructors from "./graphConstructors"; import { inferFullTargets } from "./inferFullTargets"; import processTargets from "./processTargets"; import FontMeasurements from "./FontMeasurements"; -import { - ActionType, - PartialTarget, - ProcessedTargetsContext, - SelectionWithEditor, -} from "./Types"; +import { ActionType, PartialTarget, ProcessedTargetsContext } from "./Types"; import { makeGraph } from "./makeGraph"; import { logBranchTypes } from "./debug"; -import TestCase from "./TestCase"; +import { TestCase } from "./TestCase"; import { ThatMark } from "./ThatMark"; import { Clipboard } from "./Clipboard"; @@ -82,7 +77,7 @@ export async function activate(context: vscode.ExtensionContext) { const graph = makeGraph(graphConstructors); const thatMark = new ThatMark(); - let testCaseRecording = { active: false, talonCommand: "", filename: "" }; + const testCaseRecorder = { active: false, talonCommand: "", filename: "" }; const cursorlessRecordTestCaseDisposable = vscode.commands.registerCommand( "cursorless.recordTestCase", async () => { @@ -90,22 +85,14 @@ export async function activate(context: vscode.ExtensionContext) { const talonCommand = await vscode.window.showInputBox({ prompt: "Talon Command", - validateInput: (input) => - input.trim().length ? "" : "Missing command", }); const filename = await vscode.window.showInputBox({ prompt: "Test Filename", - validateInput: (input) => - input.trim().length ? "" : "Missing filename", }); - if (!filename || !talonCommand) { - throw new Error("File name and talon command required"); - } - - testCaseRecording.active = true; - testCaseRecording.filename = filename; - testCaseRecording.talonCommand = talonCommand; + testCaseRecorder.active = true; + testCaseRecorder.filename = filename ?? ""; + testCaseRecorder.talonCommand = talonCommand ?? ""; } ); const cursorlessCommandDisposable = vscode.commands.registerCommand( @@ -169,16 +156,16 @@ export async function activate(context: vscode.ExtensionContext) { const selections = processTargets(processedTargetsContext, targets); let testCase: TestCase | null = null; - if (testCaseRecording.active) { + if (testCaseRecorder.active) { const command = { actionName, partialTargets, extraArgs }; const context = { - thatMark: thatMark, targets, + thatMark: thatMark, navigationMap: graph.navigationMap!, - talonCommand: testCaseRecording.talonCommand, + talonCommand: testCaseRecorder.talonCommand, }; testCase = new TestCase(command, context); - await testCase.saveSnapshot(); + await testCase.recordInitialState(); } const { returnValue, thatMark: newThatMark } = await action.run( @@ -189,10 +176,9 @@ export async function activate(context: vscode.ExtensionContext) { thatMark.set(newThatMark); if (testCase != null) { - await testCase.saveSnapshot(); - testCase.returnValue = returnValue; - testCase.writeFixture(testCaseRecording.filename); - testCaseRecording.active = false; + testCaseRecorder.active = false; + await testCase.recordFinalState(returnValue); + await testCase.writeFile(testCaseRecorder.filename); } return returnValue; diff --git a/src/extractTargetedMarks.ts b/src/extractTargetedMarks.ts new file mode 100644 index 0000000000..41f713bbb3 --- /dev/null +++ b/src/extractTargetedMarks.ts @@ -0,0 +1,50 @@ +import { SymbolColor } from "./constants"; +import NavigationMap from "./NavigationMap"; +import { PrimitiveTarget, Target, Token } from "./Types"; + +function extractPrimitiveTargetKeys(...targets: PrimitiveTarget[]) { + const keys: string[] = []; + targets.forEach((target) => { + if (target.mark.type === "decoratedSymbol") { + const { character, symbolColor } = target.mark; + keys.push(NavigationMap.getKey(symbolColor, character)); + } + }); + return keys; +} + +function extractTargetKeys(target: Target): string[] { + switch (target.type) { + case "primitive": + return extractPrimitiveTargetKeys(target); + + case "list": + return target.elements.map(extractTargetKeys).flat(); + + case "range": + return extractPrimitiveTargetKeys(target.start, target.end); + + default: + return []; + } +} + +export function extractTargetedMarks( + targets: Target[], + navigationMap: NavigationMap +) { + if (!navigationMap) { + return {}; + } + + const targetedMarks: { [coloredSymbol: string]: Token } = {}; + const targetKeys = targets.map(extractTargetKeys).flat(); + targetKeys.forEach((key) => { + const [color, character] = key.split("."); + targetedMarks[key] = navigationMap.getToken( + color as SymbolColor, + character + ); + }); + return targetedMarks; +} diff --git a/src/serializers.ts b/src/serializers.ts new file mode 100644 index 0000000000..089715a127 --- /dev/null +++ b/src/serializers.ts @@ -0,0 +1,46 @@ +import { Selection, Position, Range } from "vscode"; +import { Token } from "./Types"; + +export type SerializedPosition = { + line: number; + character: number; +}; + +export type SerializedRange = { + start: SerializedPosition; + end: SerializedPosition; +}; + +export type SerializedSelection = { + anchor: SerializedPosition; + active: SerializedPosition; +}; + +export type SerializedMarks = { [coloredSymbol: string]: SerializedRange }; + +export function serializeRange(range: Range): SerializedRange { + return { + start: serializePosition(range.start), + end: serializePosition(range.end), + }; +} + +export function serializeSelection(selection: Selection): SerializedSelection { + return { + active: serializePosition(selection.active), + anchor: serializePosition(selection.anchor), + }; +} + +export function serializePosition(position: Position): SerializedPosition { + return { line: position.line, character: position.character }; +} + +export function serializeMarks(marks: { [coloredSymbol: string]: Token }) { + const serializedMarks: SerializedMarks = {}; + Object.entries(marks).forEach( + ([key, value]: [string, Token]) => + (serializedMarks[key] = serializeRange(value.range)) + ); + return serializedMarks; +} diff --git a/src/takeSnapshot.ts b/src/takeSnapshot.ts new file mode 100644 index 0000000000..1c30e0c649 --- /dev/null +++ b/src/takeSnapshot.ts @@ -0,0 +1,45 @@ +import * as vscode from "vscode"; +import { Clipboard } from "./Clipboard"; +import { + serializeSelection, + serializeRange, + SerializedRange, + SerializedSelection, +} from "./serializers"; +import { ThatMark } from "./ThatMark"; + +export type TestCaseSnapshot = { + document: string; + selections: SerializedSelection[]; + clipboard?: string; + visibleRanges?: SerializedRange[]; + thatMark?: SerializedSelection[]; +}; + +export async function takeSnapshot( + thatMark?: ThatMark, + excludeFields: string[] = [] +) { + const activeEditor = vscode.window.activeTextEditor!; + + const snapshot: TestCaseSnapshot = { + document: activeEditor.document.getText(), + selections: activeEditor.selections.map(serializeSelection), + }; + + if (!excludeFields.includes("clipboard")) { + snapshot.clipboard = await Clipboard.readText(); + } + + if (!excludeFields.includes("visibleRanges")) { + snapshot.visibleRanges = activeEditor.visibleRanges.map(serializeRange); + } + + if (thatMark && !excludeFields.includes("thatMark")) { + snapshot.thatMark = thatMark + .get() + .map((mark) => serializeSelection(mark.selection)); + } + + return snapshot; +} diff --git a/src/test/suite/recorded.test.ts b/src/test/suite/recorded.test.ts index 91a233397f..7fb6d4becd 100644 --- a/src/test/suite/recorded.test.ts +++ b/src/test/suite/recorded.test.ts @@ -3,16 +3,15 @@ import { promises as fsp } from "fs"; import * as path from "path"; import * as yaml from "js-yaml"; import * as vscode from "vscode"; -import TestCase, { - SerializedPosition, - SerializedSelection, - TestCaseFixture, -} from "../../TestCase"; +import { isMatch } from "lodash"; +import { TestCaseFixture } from "../../TestCase"; import { SymbolColor } from "../../constants"; import { ThatMark } from "../../ThatMark"; import NavigationMap from "../../NavigationMap"; import * as sinon from "sinon"; import { Clipboard } from "../../Clipboard"; +import { takeSnapshot } from "../../takeSnapshot"; +import { SerializedPosition, SerializedSelection } from "../../serializers"; function deserializePosition(position: SerializedPosition) { return new vscode.Position(position.line, position.character); @@ -30,6 +29,10 @@ suite("recorded test cases", async function () { const directory = path.join(__dirname, "../../../testFixtures"); const files = await fsp.readdir(directory); + teardown(() => { + sinon.restore(); + }); + files.forEach(async (file) => { test(file.split(".")[0], async function () { this.timeout(100000); @@ -63,11 +66,13 @@ suite("recorded test cases", async function () { cursorlessApi.thatMark.set(initialThatMark); } - let clip = fixture.initialState.clipboard; - sinon.replace(Clipboard, "readText", async () => clip); - sinon.replace(Clipboard, "writeText", async (value: string) => { - clip = value; - }); + if (fixture.initialState.clipboard) { + let mockClipboard = fixture.initialState.clipboard; + sinon.replace(Clipboard, "readText", async () => mockClipboard); + sinon.replace(Clipboard, "writeText", async (value: string) => { + mockClipboard = value; + }); + } // Wait for cursorless to set up decorations await new Promise((resolve) => setTimeout(resolve, 300)); @@ -86,13 +91,16 @@ suite("recorded test cases", async function () { ...fixture.command.extraArgs ); - const resultState = await TestCase.getSnapshot( - cursorlessApi.thatMark.get() + // Do not assert visible ranges; for now they are included as context + const { visibleRanges, ...resultState } = await takeSnapshot( + cursorlessApi.thatMark ); - assert.deepStrictEqual(fixture.finalState, resultState); - assert.deepStrictEqual(fixture.returnValue, returnValue); - sinon.restore(); + assert( + isMatch(resultState, fixture.finalState), + "Unexpected final state" + ); + assert.deepStrictEqual(fixture.returnValue, returnValue); }); }); }); diff --git a/testFixtures/chuckThat.yml b/testFixtures/chuckThat.yml index 0bb2634dbd..8be5a84da2 100644 --- a/testFixtures/chuckThat.yml +++ b/testFixtures/chuckThat.yml @@ -28,12 +28,18 @@ initialState: hello_world(sys.argv[0]) selections: - active: - line: 3 + line: 6 character: 27 anchor: + line: 6 + character: 27 + thatMark: + - active: line: 3 character: 27 - visibleRanges: [] + anchor: + line: 2 + character: 0 finalState: document: | import sys @@ -44,13 +50,11 @@ finalState: hello_world(sys.argv[0]) selections: - active: - line: 2 - character: 0 + line: 5 + character: 27 anchor: - line: 2 - character: 0 - visibleRanges: [] - clipboard: "" + line: 5 + character: 27 thatMark: - active: line: 2 diff --git a/testFixtures/swap.yml b/testFixtures/swap.yml index ab155a2456..66c05099c2 100644 --- a/testFixtures/swap.yml +++ b/testFixtures/swap.yml @@ -66,9 +66,6 @@ initialState: anchor: line: 7 character: 0 - visibleRanges: [] - clipboard: "" - thatMark: [] finalState: document: | import sys @@ -85,8 +82,6 @@ finalState: anchor: line: 7 character: 0 - visibleRanges: [] - clipboard: "" thatMark: - active: line: 3 From 01b8553eb647a21b3b5b9698f6db006e111ab316 Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Mon, 26 Jul 2021 20:26:40 -0700 Subject: [PATCH 25/40] Fix that mark detection on compound targets --- src/TestCase.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/TestCase.ts b/src/TestCase.ts index 40b88b47c0..3113541ade 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -58,9 +58,14 @@ export class TestCase { } private includesThatMark(target: Target) { - return this.targets.some( - (target) => target.type === "primitive" && target.mark.type === "that" - ); + if (target.type === "primitive" && target.mark.type === "that") { + return true; + } else if (target.type === "list") { + return target.elements.some(this.includesThatMark, this); + } else if (target.type === "range") { + return [target.start, target.end].some(this.includesThatMark, this); + } + return false; } private getExcludedFields() { From c5c3d9bd40cf0085e1bcbada78384aead0500d38 Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Wed, 28 Jul 2021 07:41:11 -0700 Subject: [PATCH 26/40] Improve navigation map handling --- src/NavigationMap.ts | 5 +++++ src/extractTargetedMarks.ts | 6 +----- src/test/suite/recorded.test.ts | 15 +++++++++++---- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/NavigationMap.ts b/src/NavigationMap.ts index 7f92a5adc1..aad42e316d 100644 --- a/src/NavigationMap.ts +++ b/src/NavigationMap.ts @@ -47,6 +47,11 @@ export default class NavigationMap { return `${color}.${character}`; } + static splitKey(key: string) { + const [color, character] = key.split("."); + return { color: color as SymbolColor, character }; + } + public addToken(color: SymbolColor, character: string, token: Token) { this.map[NavigationMap.getKey(color, character)] = token; } diff --git a/src/extractTargetedMarks.ts b/src/extractTargetedMarks.ts index 41f713bbb3..12fc5297ce 100644 --- a/src/extractTargetedMarks.ts +++ b/src/extractTargetedMarks.ts @@ -33,14 +33,10 @@ export function extractTargetedMarks( targets: Target[], navigationMap: NavigationMap ) { - if (!navigationMap) { - return {}; - } - const targetedMarks: { [coloredSymbol: string]: Token } = {}; const targetKeys = targets.map(extractTargetKeys).flat(); targetKeys.forEach((key) => { - const [color, character] = key.split("."); + const { color, character } = NavigationMap.splitKey(key); targetedMarks[key] = navigationMap.getToken( color as SymbolColor, character diff --git a/src/test/suite/recorded.test.ts b/src/test/suite/recorded.test.ts index 7fb6d4becd..d1c926c898 100644 --- a/src/test/suite/recorded.test.ts +++ b/src/test/suite/recorded.test.ts @@ -78,10 +78,17 @@ suite("recorded test cases", async function () { await new Promise((resolve) => setTimeout(resolve, 300)); // Assert that recorded decorations are present - Object.entries(fixture.marks).forEach(([key, _]) => { - const [color, character] = key.split(".") as [SymbolColor, string]; - const token = cursorlessApi.navigationMap.getToken(color, character); - assert(token != null, `Mark "${color} ${character}" not found`); + Object.entries(fixture.marks).forEach(([key, token]) => { + const { color, character } = NavigationMap.splitKey(key); + const currentToken = cursorlessApi.navigationMap.getToken( + color, + character + ); + assert(currentToken != null, `Mark "${color} ${character}" not found`); + const tokensMatch = + currentToken.range.start === token.start && + currentToken.range.end === token.end; + assert(tokensMatch, `Token for "${color} ${character}" does not match`); }); const returnValue = await vscode.commands.executeCommand( From 060d91d9e67e3e92666fd1d37872a739804d9361 Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Wed, 28 Jul 2021 07:44:27 -0700 Subject: [PATCH 27/40] Clarify thatMark exclusion conditions --- src/TestCase.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/TestCase.ts b/src/TestCase.ts index 3113541ade..96dd3a606f 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -68,12 +68,12 @@ export class TestCase { return false; } - private getExcludedFields() { + private getExcludedFields(context?: { initialSnapshot?: boolean }) { const excludableFields = { clipboard: !["copy", "paste"].includes(this.command.actionName), thatMark: - this.initialState == null && - !this.targets.some(this.includesThatMark, this), + context?.initialSnapshot && + !this.fullTargets.some(this.includesThatMark, this), visibleRanges: ![ "fold", "unfold", @@ -106,7 +106,7 @@ export class TestCase { } async recordInitialState() { - const excludeFields = this.getExcludedFields(); + const excludeFields = this.getExcludedFields({ initialSnapshot: true }); this.initialState = await takeSnapshot( this.context.thatMark, excludeFields From 08ebc6bc03c26a9f63dcb6725d175aa82117536d Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Wed, 28 Jul 2021 07:44:51 -0700 Subject: [PATCH 28/40] Rename fixture fields --- src/TestCase.ts | 8 ++++---- src/takeSnapshot.ts | 4 ++-- src/test/suite/recorded.test.ts | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/TestCase.ts b/src/TestCase.ts index 96dd3a606f..da822ed496 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -25,7 +25,7 @@ type TestCaseContext = { export type TestCaseFixture = { talonCommand: string; command: TestCaseCommand; - targets: Target[]; + fullTargets: Target[]; languageId: string; marks: SerializedMarks; initialState: TestCaseSnapshot; @@ -37,7 +37,7 @@ export class TestCase { talonCommand: string; command: TestCaseCommand; languageId: string; - targets: Target[]; + fullTargets: Target[]; marks: SerializedMarks; context: TestCaseContext; initialState: TestCaseSnapshot | null = null; @@ -53,7 +53,7 @@ export class TestCase { this.command = command; this.languageId = activeEditor.document.languageId; this.marks = serializeMarks(targetedMarks); - this.targets = targets; + this.fullTargets = targets; this.context = context; } @@ -96,11 +96,11 @@ export class TestCase { talonCommand: this.talonCommand, languageId: this.languageId, command: this.command, - targets: this.targets, marks: this.marks, initialState: this.initialState, finalState: this.finalState, returnValue: this.returnValue, + fullTargets: this.fullTargets, }; return yaml.dump(fixture, { noRefs: true, quotingType: '"' }); } diff --git a/src/takeSnapshot.ts b/src/takeSnapshot.ts index 1c30e0c649..af4a1e72d1 100644 --- a/src/takeSnapshot.ts +++ b/src/takeSnapshot.ts @@ -9,7 +9,7 @@ import { import { ThatMark } from "./ThatMark"; export type TestCaseSnapshot = { - document: string; + documentContents: string; selections: SerializedSelection[]; clipboard?: string; visibleRanges?: SerializedRange[]; @@ -23,7 +23,7 @@ export async function takeSnapshot( const activeEditor = vscode.window.activeTextEditor!; const snapshot: TestCaseSnapshot = { - document: activeEditor.document.getText(), + documentContents: activeEditor.document.getText(), selections: activeEditor.selections.map(serializeSelection), }; diff --git a/src/test/suite/recorded.test.ts b/src/test/suite/recorded.test.ts index d1c926c898..c4051d777f 100644 --- a/src/test/suite/recorded.test.ts +++ b/src/test/suite/recorded.test.ts @@ -52,7 +52,7 @@ suite("recorded test cases", async function () { await vscode.commands.executeCommand("workbench.action.closeAllEditors"); const document = await vscode.workspace.openTextDocument({ language: fixture.languageId, - content: fixture.initialState.document, + content: fixture.initialState.documentContents, }); const editor = await vscode.window.showTextDocument(document); editor.selections = From 076da28f44a8c64d20b07ad678bd8ca344fb2de1 Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Wed, 28 Jul 2021 07:52:43 -0700 Subject: [PATCH 29/40] Rephrase 'serialize' as 'to plain object' --- src/TestCase.ts | 4 +-- src/serializers.ts | 46 ------------------------------- src/takeSnapshot.ts | 22 +++++++-------- src/test/suite/recorded.test.ts | 17 +++++------- src/toPlainObject.ts | 48 +++++++++++++++++++++++++++++++++ 5 files changed, 68 insertions(+), 69 deletions(-) delete mode 100644 src/serializers.ts create mode 100644 src/toPlainObject.ts diff --git a/src/TestCase.ts b/src/TestCase.ts index da822ed496..5e89a45bb2 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -6,7 +6,7 @@ import NavigationMap from "./NavigationMap"; import { ThatMark } from "./ThatMark"; import { ActionType, PartialTarget, Target } from "./Types"; import { extractTargetedMarks } from "./extractTargetedMarks"; -import { serializeMarks, SerializedMarks } from "./serializers"; +import { marksToPlainObject, SerializedMarks } from "./toPlainObject"; import { takeSnapshot, TestCaseSnapshot } from "./takeSnapshot"; type TestCaseCommand = { @@ -52,7 +52,7 @@ export class TestCase { this.talonCommand = talonCommand; this.command = command; this.languageId = activeEditor.document.languageId; - this.marks = serializeMarks(targetedMarks); + this.marks = marksToPlainObject(targetedMarks); this.fullTargets = targets; this.context = context; } diff --git a/src/serializers.ts b/src/serializers.ts deleted file mode 100644 index 089715a127..0000000000 --- a/src/serializers.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Selection, Position, Range } from "vscode"; -import { Token } from "./Types"; - -export type SerializedPosition = { - line: number; - character: number; -}; - -export type SerializedRange = { - start: SerializedPosition; - end: SerializedPosition; -}; - -export type SerializedSelection = { - anchor: SerializedPosition; - active: SerializedPosition; -}; - -export type SerializedMarks = { [coloredSymbol: string]: SerializedRange }; - -export function serializeRange(range: Range): SerializedRange { - return { - start: serializePosition(range.start), - end: serializePosition(range.end), - }; -} - -export function serializeSelection(selection: Selection): SerializedSelection { - return { - active: serializePosition(selection.active), - anchor: serializePosition(selection.anchor), - }; -} - -export function serializePosition(position: Position): SerializedPosition { - return { line: position.line, character: position.character }; -} - -export function serializeMarks(marks: { [coloredSymbol: string]: Token }) { - const serializedMarks: SerializedMarks = {}; - Object.entries(marks).forEach( - ([key, value]: [string, Token]) => - (serializedMarks[key] = serializeRange(value.range)) - ); - return serializedMarks; -} diff --git a/src/takeSnapshot.ts b/src/takeSnapshot.ts index af4a1e72d1..e435752fc2 100644 --- a/src/takeSnapshot.ts +++ b/src/takeSnapshot.ts @@ -1,19 +1,19 @@ import * as vscode from "vscode"; import { Clipboard } from "./Clipboard"; import { - serializeSelection, - serializeRange, - SerializedRange, - SerializedSelection, -} from "./serializers"; + selectionToPlainObject, + rangeToPlainObject, + RangePlainObject, + SelectionPlainObject, +} from "./toPlainObject"; import { ThatMark } from "./ThatMark"; export type TestCaseSnapshot = { documentContents: string; - selections: SerializedSelection[]; + selections: SelectionPlainObject[]; clipboard?: string; - visibleRanges?: SerializedRange[]; - thatMark?: SerializedSelection[]; + visibleRanges?: RangePlainObject[]; + thatMark?: SelectionPlainObject[]; }; export async function takeSnapshot( @@ -24,7 +24,7 @@ export async function takeSnapshot( const snapshot: TestCaseSnapshot = { documentContents: activeEditor.document.getText(), - selections: activeEditor.selections.map(serializeSelection), + selections: activeEditor.selections.map(selectionToPlainObject), }; if (!excludeFields.includes("clipboard")) { @@ -32,13 +32,13 @@ export async function takeSnapshot( } if (!excludeFields.includes("visibleRanges")) { - snapshot.visibleRanges = activeEditor.visibleRanges.map(serializeRange); + snapshot.visibleRanges = activeEditor.visibleRanges.map(rangeToPlainObject); } if (thatMark && !excludeFields.includes("thatMark")) { snapshot.thatMark = thatMark .get() - .map((mark) => serializeSelection(mark.selection)); + .map((mark) => selectionToPlainObject(mark.selection)); } return snapshot; diff --git a/src/test/suite/recorded.test.ts b/src/test/suite/recorded.test.ts index c4051d777f..910d4109a1 100644 --- a/src/test/suite/recorded.test.ts +++ b/src/test/suite/recorded.test.ts @@ -11,17 +11,15 @@ import NavigationMap from "../../NavigationMap"; import * as sinon from "sinon"; import { Clipboard } from "../../Clipboard"; import { takeSnapshot } from "../../takeSnapshot"; -import { SerializedPosition, SerializedSelection } from "../../serializers"; +import { PositionPlainObject, SelectionPlainObject } from "../../toPlainObject"; -function deserializePosition(position: SerializedPosition) { +function createPosition(position: PositionPlainObject) { return new vscode.Position(position.line, position.character); } -function deserializeSelection( - selection: SerializedSelection -): vscode.Selection { - const active = deserializePosition(selection.active); - const anchor = deserializePosition(selection.anchor); +function createSelection(selection: SelectionPlainObject): vscode.Selection { + const active = createPosition(selection.active); + const anchor = createPosition(selection.anchor); return new vscode.Selection(anchor, active); } @@ -55,12 +53,11 @@ suite("recorded test cases", async function () { content: fixture.initialState.documentContents, }); const editor = await vscode.window.showTextDocument(document); - editor.selections = - fixture.initialState.selections.map(deserializeSelection); + editor.selections = fixture.initialState.selections.map(createSelection); if (fixture.initialState.thatMark) { const initialThatMark = fixture.initialState.thatMark.map((mark) => ({ - selection: deserializeSelection(mark), + selection: createSelection(mark), editor, })); cursorlessApi.thatMark.set(initialThatMark); diff --git a/src/toPlainObject.ts b/src/toPlainObject.ts new file mode 100644 index 0000000000..6de7f03072 --- /dev/null +++ b/src/toPlainObject.ts @@ -0,0 +1,48 @@ +import { Selection, Position, Range } from "vscode"; +import { Token } from "./Types"; + +export type PositionPlainObject = { + line: number; + character: number; +}; + +export type RangePlainObject = { + start: PositionPlainObject; + end: PositionPlainObject; +}; + +export type SelectionPlainObject = { + anchor: PositionPlainObject; + active: PositionPlainObject; +}; + +export type SerializedMarks = { [coloredSymbol: string]: RangePlainObject }; + +export function rangeToPlainObject(range: Range): RangePlainObject { + return { + start: positionToPlainObject(range.start), + end: positionToPlainObject(range.end), + }; +} + +export function selectionToPlainObject( + selection: Selection +): SelectionPlainObject { + return { + active: positionToPlainObject(selection.active), + anchor: positionToPlainObject(selection.anchor), + }; +} + +export function positionToPlainObject(position: Position): PositionPlainObject { + return { line: position.line, character: position.character }; +} + +export function marksToPlainObject(marks: { [coloredSymbol: string]: Token }) { + const serializedMarks: SerializedMarks = {}; + Object.entries(marks).forEach( + ([key, value]: [string, Token]) => + (serializedMarks[key] = rangeToPlainObject(value.range)) + ); + return serializedMarks; +} From 52f4408c1f707c661dd4c9bd98c66276722fc506 Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Wed, 28 Jul 2021 08:04:44 -0700 Subject: [PATCH 30/40] Add issue for visible range testing --- src/TestCase.ts | 3 ++- src/takeSnapshot.ts | 2 ++ src/test/suite/recorded.test.ts | 3 ++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/TestCase.ts b/src/TestCase.ts index 5e89a45bb2..07414a18ee 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -25,12 +25,13 @@ type TestCaseContext = { export type TestCaseFixture = { talonCommand: string; command: TestCaseCommand; - fullTargets: Target[]; languageId: string; marks: SerializedMarks; initialState: TestCaseSnapshot; finalState: TestCaseSnapshot; returnValue: unknown; + /** Inferred full targets added for context; not currently used in testing */ + fullTargets: Target[]; }; export class TestCase { diff --git a/src/takeSnapshot.ts b/src/takeSnapshot.ts index e435752fc2..988c000f7f 100644 --- a/src/takeSnapshot.ts +++ b/src/takeSnapshot.ts @@ -12,6 +12,8 @@ export type TestCaseSnapshot = { documentContents: string; selections: SelectionPlainObject[]; clipboard?: string; + // TODO Visible ranges are not asserted during testing, see: + // https://github.com/pokey/cursorless-vscode/issues/160 visibleRanges?: RangePlainObject[]; thatMark?: SelectionPlainObject[]; }; diff --git a/src/test/suite/recorded.test.ts b/src/test/suite/recorded.test.ts index 910d4109a1..4ca842f7f6 100644 --- a/src/test/suite/recorded.test.ts +++ b/src/test/suite/recorded.test.ts @@ -95,7 +95,8 @@ suite("recorded test cases", async function () { ...fixture.command.extraArgs ); - // Do not assert visible ranges; for now they are included as context + // TODO Visible ranges are not asserted, see: + // https://github.com/pokey/cursorless-vscode/issues/160 const { visibleRanges, ...resultState } = await takeSnapshot( cursorlessApi.thatMark ); From ff6a1e1d6365b82c20d2db99dd75eee7e9bd37cc Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Wed, 28 Jul 2021 08:07:31 -0700 Subject: [PATCH 31/40] Revert makeGraph export change --- src/extension.ts | 2 +- src/makeGraph.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index fc8c72e4de..e83fdefb68 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -7,7 +7,7 @@ import { inferFullTargets } from "./inferFullTargets"; import processTargets from "./processTargets"; import FontMeasurements from "./FontMeasurements"; import { ActionType, PartialTarget, ProcessedTargetsContext } from "./Types"; -import { makeGraph } from "./makeGraph"; +import makeGraph from "./makeGraph"; import { logBranchTypes } from "./debug"; import { TestCase } from "./TestCase"; import { ThatMark } from "./ThatMark"; diff --git a/src/makeGraph.ts b/src/makeGraph.ts index e3b2472574..01b1d400c5 100644 --- a/src/makeGraph.ts +++ b/src/makeGraph.ts @@ -25,7 +25,7 @@ function makeGetter( }; } -export function makeGraph( +export default function makeGraph( constructorMap: ConstructorMap ) { const components: Partial = {}; From f585de01b2a2a6be54031c5b14f10ca146c0663a Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Thu, 29 Jul 2021 20:04:03 -0700 Subject: [PATCH 32/40] Improve fixture writing and move directory --- src/TestCase.ts | 34 +++++++++---------- src/extension.ts | 30 ++++++++++++---- .../suite/fixtures/recorded}/chuckThat.yml | 0 .../test/suite/fixtures/recorded}/swap.yml | 0 src/test/suite/recorded.test.ts | 5 ++- 5 files changed, 45 insertions(+), 24 deletions(-) rename {testFixtures => src/test/suite/fixtures/recorded}/chuckThat.yml (100%) rename {testFixtures => src/test/suite/fixtures/recorded}/swap.yml (100%) diff --git a/src/TestCase.ts b/src/TestCase.ts index 07414a18ee..74bbb4d460 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -120,25 +120,25 @@ export class TestCase { this.finalState = await takeSnapshot(this.context.thatMark, excludeFields); } - async writeFile(filename: string) { + async writeFile(outPath: string) { const fixture = this.toYaml(); - const workspacePath = vscode.workspace.workspaceFolders?.[0].uri.path; - let document; - - if (workspacePath && filename) { - const fixturePath = path.join( - workspacePath, - "testFixtures", - `${filename}.yml` - ); - fs.writeFileSync(fixturePath, fixture); - document = await vscode.workspace.openTextDocument(fixturePath); - } else { - document = await vscode.workspace.openTextDocument({ - language: "yaml", - content: fixture, + fs.writeFileSync(outPath, fixture); + vscode.window + .showInformationMessage("Cursorless test case saved.", "View") + .then(async (action) => { + if (action === "View") { + const document = await vscode.workspace.openTextDocument(outPath); + await vscode.window.showTextDocument(document); + } }); - } + } + + async showFixture() { + const fixture = this.toYaml(); + const document = await vscode.workspace.openTextDocument({ + language: "yaml", + content: fixture, + }); await vscode.window.showTextDocument(document, { viewColumn: vscode.ViewColumn.Beside, }); diff --git a/src/extension.ts b/src/extension.ts index e83fdefb68..01a67afad5 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,4 +1,5 @@ import * as vscode from "vscode"; +import * as path from "path"; import { addDecorationsToEditors } from "./addDecorationsToEditor"; import { DEBOUNCE_DELAY } from "./constants"; import Decorations from "./Decorations"; @@ -77,21 +78,33 @@ export async function activate(context: vscode.ExtensionContext) { const graph = makeGraph(graphConstructors); const thatMark = new ThatMark(); - const testCaseRecorder = { active: false, talonCommand: "", filename: "" }; + const testCaseRecorder = { active: false, talonCommand: "", outPath: "" }; const cursorlessRecordTestCaseDisposable = vscode.commands.registerCommand( "cursorless.recordTestCase", async () => { console.log("Recording test case for next command"); + const workspacePath = vscode.workspace.workspaceFolders?.[0].uri.path; + const workSpaceFolder = path.basename(workspacePath ?? ""); + + if (workspacePath && workSpaceFolder === "cursorless-vscode") { + const filename = await vscode.window.showInputBox({ + prompt: "Test Filename", + }); + if (filename) { + testCaseRecorder.outPath = path.join( + workspacePath, + "src/test/suite/fixtures/recorded", + `${filename}.yml` + ); + } + } + const talonCommand = await vscode.window.showInputBox({ prompt: "Talon Command", }); - const filename = await vscode.window.showInputBox({ - prompt: "Test Filename", - }); testCaseRecorder.active = true; - testCaseRecorder.filename = filename ?? ""; testCaseRecorder.talonCommand = talonCommand ?? ""; } ); @@ -178,7 +191,12 @@ export async function activate(context: vscode.ExtensionContext) { if (testCase != null) { testCaseRecorder.active = false; await testCase.recordFinalState(returnValue); - await testCase.writeFile(testCaseRecorder.filename); + + if (testCaseRecorder.outPath) { + await testCase.writeFile(testCaseRecorder.outPath); + } else { + await testCase.showFixture(); + } } return returnValue; diff --git a/testFixtures/chuckThat.yml b/src/test/suite/fixtures/recorded/chuckThat.yml similarity index 100% rename from testFixtures/chuckThat.yml rename to src/test/suite/fixtures/recorded/chuckThat.yml diff --git a/testFixtures/swap.yml b/src/test/suite/fixtures/recorded/swap.yml similarity index 100% rename from testFixtures/swap.yml rename to src/test/suite/fixtures/recorded/swap.yml diff --git a/src/test/suite/recorded.test.ts b/src/test/suite/recorded.test.ts index 4ca842f7f6..30888b88c3 100644 --- a/src/test/suite/recorded.test.ts +++ b/src/test/suite/recorded.test.ts @@ -24,7 +24,10 @@ function createSelection(selection: SelectionPlainObject): vscode.Selection { } suite("recorded test cases", async function () { - const directory = path.join(__dirname, "../../../testFixtures"); + const directory = path.join( + __dirname, + "../../../src/test/suite/fixtures/recorded" + ); const files = await fsp.readdir(directory); teardown(() => { From b8df9237faec978f8cabee8cbe6111d2a4578c13 Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Thu, 29 Jul 2021 20:44:11 -0700 Subject: [PATCH 33/40] Add test case folder selection --- src/extension.ts | 68 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 57 insertions(+), 11 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 01a67afad5..ceeef5d259 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,5 +1,6 @@ import * as vscode from "vscode"; import * as path from "path"; +import * as fs from "fs"; import { addDecorationsToEditors } from "./addDecorationsToEditor"; import { DEBOUNCE_DELAY } from "./constants"; import Decorations from "./Decorations"; @@ -84,25 +85,70 @@ export async function activate(context: vscode.ExtensionContext) { async () => { console.log("Recording test case for next command"); + const talonCommand = await vscode.window.showInputBox({ + prompt: "Talon Command", + ignoreFocusOut: true, + validateInput: (input) => (input.trim().length > 0 ? null : "Required"), + }); + + if (!talonCommand) { + return; + } + const workspacePath = vscode.workspace.workspaceFolders?.[0].uri.path; const workSpaceFolder = path.basename(workspacePath ?? ""); if (workspacePath && workSpaceFolder === "cursorless-vscode") { + const fixtureRoot = path.join( + workspacePath, + "src/test/suite/fixtures/recorded" + ); + const subdirectories = fs + .readdirSync(fixtureRoot, { withFileTypes: true }) + .filter((item) => item.isDirectory()) + .map((directory) => directory.name); + + const createNewSubdirectory = "Create new folder →"; + const subdirectorySelection = await vscode.window.showQuickPick([ + ...subdirectories, + createNewSubdirectory, + ]); + let subdirectory: string | undefined; + + if (subdirectorySelection === createNewSubdirectory) { + subdirectory = await vscode.window.showInputBox({ + prompt: "New Folder Name", + ignoreFocusOut: true, + validateInput: (input) => { + if (input.trim().length === 0) { + return "Required"; + } else if (fs.existsSync(path.join(fixtureRoot, input))) { + return "Folder already exists"; + } + }, + }); + + if (!subdirectory) { + return; + } + + fs.mkdirSync(path.join(fixtureRoot, subdirectory)); + } + const filename = await vscode.window.showInputBox({ - prompt: "Test Filename", + prompt: "Fixture Filename", }); - if (filename) { - testCaseRecorder.outPath = path.join( - workspacePath, - "src/test/suite/fixtures/recorded", - `${filename}.yml` - ); + + if (!filename || !subdirectory) { + return; } - } - const talonCommand = await vscode.window.showInputBox({ - prompt: "Talon Command", - }); + testCaseRecorder.outPath = path.join( + fixtureRoot, + subdirectory, + `${filename}.yml` + ); + } testCaseRecorder.active = true; testCaseRecorder.talonCommand = talonCommand ?? ""; From decc22ffb6d14de6f0622b8eda68f7c655721e19 Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Thu, 29 Jul 2021 21:43:07 -0700 Subject: [PATCH 34/40] Create test case recorder class --- src/TestCaseRecorder.ts | 123 ++++++++++++++++++ src/extension.ts | 74 +---------- .../recorded/{ => examples}/chuckThat.yml | 0 .../fixtures/recorded/{ => examples}/swap.yml | 0 4 files changed, 126 insertions(+), 71 deletions(-) create mode 100644 src/TestCaseRecorder.ts rename src/test/suite/fixtures/recorded/{ => examples}/chuckThat.yml (100%) rename src/test/suite/fixtures/recorded/{ => examples}/swap.yml (100%) diff --git a/src/TestCaseRecorder.ts b/src/TestCaseRecorder.ts new file mode 100644 index 0000000000..a8ed33ab2c --- /dev/null +++ b/src/TestCaseRecorder.ts @@ -0,0 +1,123 @@ +import * as vscode from "vscode"; +import * as path from "path"; +import * as fs from "fs"; + +export class TestCaseRecorder { + active: boolean = false; + outPath: string | null = null; + talonCommand: string | null = null; + workspacePath: string | null; + workSpaceFolder: string | null; + fixtureRoot: string | null; + fixtureSubdirectory: string | null = null; + + constructor() { + this.workspacePath = + vscode.workspace.workspaceFolders?.[0].uri.path ?? null; + + this.workSpaceFolder = this.workspacePath + ? path.basename(this.workspacePath) + : null; + + this.fixtureRoot = this.workspacePath + ? path.join(this.workspacePath, "src/test/suite/fixtures/recorded") + : null; + } + + start(): Promise { + return this.promptTalonCommand(); + } + + private async promptTalonCommand(): Promise { + const result = await vscode.window.showInputBox({ + prompt: "Talon Command", + ignoreFocusOut: true, + validateInput: (input) => (input.trim().length > 0 ? null : "Required"), + }); + + // Inputs return undefined when a user cancels by hitting 'escape' + if (result === undefined) { + this.active = false; + return; + } + + this.talonCommand = result; + return this.promptSubdirectory(); + } + + private async promptSubdirectory(): Promise { + if ( + this.workspacePath == null || + this.fixtureRoot == null || + this.workSpaceFolder !== "cursorless-vscode" + ) { + return; + } + + const subdirectories = fs + .readdirSync(this.fixtureRoot, { withFileTypes: true }) + .filter((item) => item.isDirectory()) + .map((directory) => directory.name); + + const createNewSubdirectory = "Create new folder →"; + const subdirectorySelection = await vscode.window.showQuickPick([ + ...subdirectories, + createNewSubdirectory, + ]); + + if (subdirectorySelection === undefined) { + return this.promptTalonCommand(); // go back a prompt + } else if (subdirectorySelection === createNewSubdirectory) { + return this.promptNewSubdirectory(); + } else { + this.fixtureSubdirectory = subdirectorySelection; + return this.promptFileName(); + } + } + + private async promptNewSubdirectory(): Promise { + if (this.fixtureRoot == null) { + throw new Error("Missing fixture root. Not in cursorless workspace?"); + } + + const subdirectory = await vscode.window.showInputBox({ + prompt: "New Folder Name", + ignoreFocusOut: true, + validateInput: (input) => (input.trim().length > 0 ? null : "Required"), + }); + + if (subdirectory === undefined) { + return this.promptSubdirectory(); // go back a prompt + } + + this.fixtureSubdirectory = subdirectory; + return this.promptFileName(); + } + + private async promptFileName(): Promise { + if (this.fixtureRoot == null) { + throw new Error("Missing fixture root. Not in cursorless workspace?"); + } + + const filename = await vscode.window.showInputBox({ + prompt: "Fixture Filename", + }); + + if (filename === undefined || this.fixtureSubdirectory == null) { + this.promptSubdirectory(); // go back a prompt + return; + } + + const targetDirectory = path.join( + this.fixtureRoot, + this.fixtureSubdirectory, + `${filename}.yml` + ); + + if (!fs.existsSync(targetDirectory)) { + fs.mkdirSync(targetDirectory); + } + + this.outPath = path.join(targetDirectory, `${filename}.yml`); + } +} diff --git a/src/extension.ts b/src/extension.ts index ceeef5d259..c5996a3c40 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,6 +1,4 @@ import * as vscode from "vscode"; -import * as path from "path"; -import * as fs from "fs"; import { addDecorationsToEditors } from "./addDecorationsToEditor"; import { DEBOUNCE_DELAY } from "./constants"; import Decorations from "./Decorations"; @@ -14,6 +12,7 @@ import { logBranchTypes } from "./debug"; import { TestCase } from "./TestCase"; import { ThatMark } from "./ThatMark"; import { Clipboard } from "./Clipboard"; +import { TestCaseRecorder } from "./TestCaseRecorder"; export async function activate(context: vscode.ExtensionContext) { const fontMeasurements = new FontMeasurements(context); @@ -79,79 +78,12 @@ export async function activate(context: vscode.ExtensionContext) { const graph = makeGraph(graphConstructors); const thatMark = new ThatMark(); - const testCaseRecorder = { active: false, talonCommand: "", outPath: "" }; + const testCaseRecorder = new TestCaseRecorder(); const cursorlessRecordTestCaseDisposable = vscode.commands.registerCommand( "cursorless.recordTestCase", async () => { console.log("Recording test case for next command"); - - const talonCommand = await vscode.window.showInputBox({ - prompt: "Talon Command", - ignoreFocusOut: true, - validateInput: (input) => (input.trim().length > 0 ? null : "Required"), - }); - - if (!talonCommand) { - return; - } - - const workspacePath = vscode.workspace.workspaceFolders?.[0].uri.path; - const workSpaceFolder = path.basename(workspacePath ?? ""); - - if (workspacePath && workSpaceFolder === "cursorless-vscode") { - const fixtureRoot = path.join( - workspacePath, - "src/test/suite/fixtures/recorded" - ); - const subdirectories = fs - .readdirSync(fixtureRoot, { withFileTypes: true }) - .filter((item) => item.isDirectory()) - .map((directory) => directory.name); - - const createNewSubdirectory = "Create new folder →"; - const subdirectorySelection = await vscode.window.showQuickPick([ - ...subdirectories, - createNewSubdirectory, - ]); - let subdirectory: string | undefined; - - if (subdirectorySelection === createNewSubdirectory) { - subdirectory = await vscode.window.showInputBox({ - prompt: "New Folder Name", - ignoreFocusOut: true, - validateInput: (input) => { - if (input.trim().length === 0) { - return "Required"; - } else if (fs.existsSync(path.join(fixtureRoot, input))) { - return "Folder already exists"; - } - }, - }); - - if (!subdirectory) { - return; - } - - fs.mkdirSync(path.join(fixtureRoot, subdirectory)); - } - - const filename = await vscode.window.showInputBox({ - prompt: "Fixture Filename", - }); - - if (!filename || !subdirectory) { - return; - } - - testCaseRecorder.outPath = path.join( - fixtureRoot, - subdirectory, - `${filename}.yml` - ); - } - - testCaseRecorder.active = true; - testCaseRecorder.talonCommand = talonCommand ?? ""; + testCaseRecorder.start(); } ); const cursorlessCommandDisposable = vscode.commands.registerCommand( diff --git a/src/test/suite/fixtures/recorded/chuckThat.yml b/src/test/suite/fixtures/recorded/examples/chuckThat.yml similarity index 100% rename from src/test/suite/fixtures/recorded/chuckThat.yml rename to src/test/suite/fixtures/recorded/examples/chuckThat.yml diff --git a/src/test/suite/fixtures/recorded/swap.yml b/src/test/suite/fixtures/recorded/examples/swap.yml similarity index 100% rename from src/test/suite/fixtures/recorded/swap.yml rename to src/test/suite/fixtures/recorded/examples/swap.yml From 16f67bbb324176bac7060460316787ebfe097cc5 Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Thu, 29 Jul 2021 22:00:46 -0700 Subject: [PATCH 35/40] Ask for fixture directory after recording --- src/TestCaseRecorder.ts | 24 ++++++++++++++---------- src/extension.ts | 8 ++++---- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/TestCaseRecorder.ts b/src/TestCaseRecorder.ts index a8ed33ab2c..d004e448a8 100644 --- a/src/TestCaseRecorder.ts +++ b/src/TestCaseRecorder.ts @@ -25,9 +25,15 @@ export class TestCaseRecorder { } start(): Promise { + this.active = true; return this.promptTalonCommand(); } + finish(): Promise { + this.active = false; + return this.promptSubdirectory(); + } + private async promptTalonCommand(): Promise { const result = await vscode.window.showInputBox({ prompt: "Talon Command", @@ -42,16 +48,15 @@ export class TestCaseRecorder { } this.talonCommand = result; - return this.promptSubdirectory(); } - private async promptSubdirectory(): Promise { + private async promptSubdirectory(): Promise { if ( this.workspacePath == null || this.fixtureRoot == null || this.workSpaceFolder !== "cursorless-vscode" ) { - return; + return null; } const subdirectories = fs @@ -66,7 +71,7 @@ export class TestCaseRecorder { ]); if (subdirectorySelection === undefined) { - return this.promptTalonCommand(); // go back a prompt + return null; } else if (subdirectorySelection === createNewSubdirectory) { return this.promptNewSubdirectory(); } else { @@ -75,7 +80,7 @@ export class TestCaseRecorder { } } - private async promptNewSubdirectory(): Promise { + private async promptNewSubdirectory(): Promise { if (this.fixtureRoot == null) { throw new Error("Missing fixture root. Not in cursorless workspace?"); } @@ -94,7 +99,7 @@ export class TestCaseRecorder { return this.promptFileName(); } - private async promptFileName(): Promise { + private async promptFileName(): Promise { if (this.fixtureRoot == null) { throw new Error("Missing fixture root. Not in cursorless workspace?"); } @@ -104,14 +109,12 @@ export class TestCaseRecorder { }); if (filename === undefined || this.fixtureSubdirectory == null) { - this.promptSubdirectory(); // go back a prompt - return; + return this.promptSubdirectory(); // go back a prompt } const targetDirectory = path.join( this.fixtureRoot, - this.fixtureSubdirectory, - `${filename}.yml` + this.fixtureSubdirectory ); if (!fs.existsSync(targetDirectory)) { @@ -119,5 +122,6 @@ export class TestCaseRecorder { } this.outPath = path.join(targetDirectory, `${filename}.yml`); + return this.outPath; } } diff --git a/src/extension.ts b/src/extension.ts index c5996a3c40..3c419f9f91 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -153,7 +153,7 @@ export async function activate(context: vscode.ExtensionContext) { targets, thatMark: thatMark, navigationMap: graph.navigationMap!, - talonCommand: testCaseRecorder.talonCommand, + talonCommand: testCaseRecorder.talonCommand ?? "", }; testCase = new TestCase(command, context); await testCase.recordInitialState(); @@ -167,11 +167,11 @@ export async function activate(context: vscode.ExtensionContext) { thatMark.set(newThatMark); if (testCase != null) { - testCaseRecorder.active = false; await testCase.recordFinalState(returnValue); + const outPath = await testCaseRecorder.finish(); - if (testCaseRecorder.outPath) { - await testCase.writeFile(testCaseRecorder.outPath); + if (outPath) { + await testCase.writeFile(outPath); } else { await testCase.showFixture(); } From 0b8df4184648e20e011add96d622e68241e12efd Mon Sep 17 00:00:00 2001 From: Brock McElroy <28877984+brxck@users.noreply.github.com> Date: Thu, 29 Jul 2021 22:09:19 -0700 Subject: [PATCH 36/40] Move file handling to test case recorder --- src/TestCase.ts | 26 +------------------------- src/TestCaseRecorder.ts | 36 ++++++++++++++++++++++++++++++++++-- src/extension.ts | 8 +------- 3 files changed, 36 insertions(+), 34 deletions(-) diff --git a/src/TestCase.ts b/src/TestCase.ts index 74bbb4d460..263375d27b 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -89,7 +89,7 @@ export class TestCase { ); } - private toYaml() { + toYaml() { if (this.initialState == null || this.finalState == null) { throw Error("Two snapshots must be taken before serializing"); } @@ -119,28 +119,4 @@ export class TestCase { this.returnValue = returnValue; this.finalState = await takeSnapshot(this.context.thatMark, excludeFields); } - - async writeFile(outPath: string) { - const fixture = this.toYaml(); - fs.writeFileSync(outPath, fixture); - vscode.window - .showInformationMessage("Cursorless test case saved.", "View") - .then(async (action) => { - if (action === "View") { - const document = await vscode.workspace.openTextDocument(outPath); - await vscode.window.showTextDocument(document); - } - }); - } - - async showFixture() { - const fixture = this.toYaml(); - const document = await vscode.workspace.openTextDocument({ - language: "yaml", - content: fixture, - }); - await vscode.window.showTextDocument(document, { - viewColumn: vscode.ViewColumn.Beside, - }); - } } diff --git a/src/TestCaseRecorder.ts b/src/TestCaseRecorder.ts index d004e448a8..d445315dbd 100644 --- a/src/TestCaseRecorder.ts +++ b/src/TestCaseRecorder.ts @@ -1,6 +1,7 @@ import * as vscode from "vscode"; import * as path from "path"; import * as fs from "fs"; +import { TestCase } from "./TestCase"; export class TestCaseRecorder { active: boolean = false; @@ -29,9 +30,40 @@ export class TestCaseRecorder { return this.promptTalonCommand(); } - finish(): Promise { + async finish(testCase: TestCase): Promise { this.active = false; - return this.promptSubdirectory(); + const outPath = await this.promptSubdirectory(); + const fixture = testCase.toYaml(); + + if (outPath) { + this.writeToFile(outPath, fixture); + } else { + this.showFixture(fixture); + } + + return outPath; + } + + private async writeToFile(outPath: string, fixture: string) { + fs.writeFileSync(outPath, fixture); + vscode.window + .showInformationMessage("Cursorless test case saved.", "View") + .then(async (action) => { + if (action === "View") { + const document = await vscode.workspace.openTextDocument(outPath); + await vscode.window.showTextDocument(document); + } + }); + } + + private async showFixture(fixture: string) { + const document = await vscode.workspace.openTextDocument({ + language: "yaml", + content: fixture, + }); + await vscode.window.showTextDocument(document, { + viewColumn: vscode.ViewColumn.Beside, + }); } private async promptTalonCommand(): Promise { diff --git a/src/extension.ts b/src/extension.ts index 3c419f9f91..553d47361b 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -168,13 +168,7 @@ export async function activate(context: vscode.ExtensionContext) { if (testCase != null) { await testCase.recordFinalState(returnValue); - const outPath = await testCaseRecorder.finish(); - - if (outPath) { - await testCase.writeFile(outPath); - } else { - await testCase.showFixture(); - } + await testCaseRecorder.finish(testCase); } return returnValue; From 3f188a3ddff3ee081170d91b358dd34377c844a3 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Fri, 30 Jul 2021 17:55:43 -0700 Subject: [PATCH 37/40] Cleanup --- .vscode/launch.json | 6 +- package.json | 6 +- src/TestCase.ts | 16 ++-- src/TestCaseRecorder.ts | 20 ++--- src/extension.ts | 5 +- src/serialize.ts | 66 ++++++++++++++ .../fixtures/recorded/examples/chuckThat.yml | 53 +++-------- .../suite/fixtures/recorded/examples/swap.yml | 88 ++++--------------- .../fixtures/recorded/examples/takeHarp.yml | 27 ++++++ src/test/suite/recorded.test.ts | 21 +++-- src/test/suite/walkSync.ts | 30 +++++++ yarn.lock | 29 ++++-- 12 files changed, 222 insertions(+), 145 deletions(-) create mode 100644 src/serialize.ts create mode 100644 src/test/suite/fixtures/recorded/examples/takeHarp.yml create mode 100644 src/test/suite/walkSync.ts diff --git a/.vscode/launch.json b/.vscode/launch.json index 670d6e66ce..66eb477000 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -10,6 +10,8 @@ "type": "extensionHost", "request": "launch", "args": [ + "--disable-extension", + "asvetliakov.vscode-neovim", "--extensionDevelopmentPath=${workspaceFolder}" ], "outFiles": [ @@ -22,6 +24,8 @@ "type": "extensionHost", "request": "launch", "args": [ + "--disable-extension", + "asvetliakov.vscode-neovim", "--extensionDevelopmentPath=${workspaceFolder}", "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" ], @@ -31,4 +35,4 @@ "preLaunchTask": "${defaultBuildTask}" } ] -} +} \ No newline at end of file diff --git a/package.json b/package.json index 18350311a3..66db24996c 100644 --- a/package.json +++ b/package.json @@ -209,8 +209,8 @@ "@typescript-eslint/parser": "^4.9.0", "esbuild": "^0.11.12", "eslint": "^7.15.0", - "glob": "^7.1.6", - "js-yaml": "^3.14.1", + "glob": "^7.1.7", + "js-yaml": "^4.1.0", "mocha": "^8.1.3", "sinon": "^11.1.1", "typescript": "^4.1.2", @@ -221,4 +221,4 @@ "immutability-helper": "^3.1.1", "lodash": "^4.17.21" } -} +} \ No newline at end of file diff --git a/src/TestCase.ts b/src/TestCase.ts index 263375d27b..bf96b50ed0 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -1,6 +1,5 @@ import * as path from "path"; import * as fs from "fs"; -import * as yaml from "js-yaml"; import * as vscode from "vscode"; import NavigationMap from "./NavigationMap"; import { ThatMark } from "./ThatMark"; @@ -8,6 +7,7 @@ import { ActionType, PartialTarget, Target } from "./Types"; import { extractTargetedMarks } from "./extractTargetedMarks"; import { marksToPlainObject, SerializedMarks } from "./toPlainObject"; import { takeSnapshot, TestCaseSnapshot } from "./takeSnapshot"; +import serialize from "./serialize"; type TestCaseCommand = { actionName: ActionType; @@ -16,14 +16,14 @@ type TestCaseCommand = { }; type TestCaseContext = { - talonCommand: string; + spokenForm: string; thatMark: ThatMark; targets: Target[]; navigationMap: NavigationMap; }; export type TestCaseFixture = { - talonCommand: string; + spokenForm: string; command: TestCaseCommand; languageId: string; marks: SerializedMarks; @@ -35,7 +35,7 @@ export type TestCaseFixture = { }; export class TestCase { - talonCommand: string; + spokenForm: string; command: TestCaseCommand; languageId: string; fullTargets: Target[]; @@ -47,10 +47,10 @@ export class TestCase { constructor(command: TestCaseCommand, context: TestCaseContext) { const activeEditor = vscode.window.activeTextEditor!; - const { navigationMap, targets, talonCommand } = context; + const { navigationMap, targets, spokenForm } = context; const targetedMarks = extractTargetedMarks(targets, navigationMap); - this.talonCommand = talonCommand; + this.spokenForm = spokenForm; this.command = command; this.languageId = activeEditor.document.languageId; this.marks = marksToPlainObject(targetedMarks); @@ -94,7 +94,7 @@ export class TestCase { throw Error("Two snapshots must be taken before serializing"); } const fixture: TestCaseFixture = { - talonCommand: this.talonCommand, + spokenForm: this.spokenForm, languageId: this.languageId, command: this.command, marks: this.marks, @@ -103,7 +103,7 @@ export class TestCase { returnValue: this.returnValue, fullTargets: this.fullTargets, }; - return yaml.dump(fixture, { noRefs: true, quotingType: '"' }); + return serialize(fixture); } async recordInitialState() { diff --git a/src/TestCaseRecorder.ts b/src/TestCaseRecorder.ts index d445315dbd..510695d1ed 100644 --- a/src/TestCaseRecorder.ts +++ b/src/TestCaseRecorder.ts @@ -2,19 +2,22 @@ import * as vscode from "vscode"; import * as path from "path"; import * as fs from "fs"; import { TestCase } from "./TestCase"; +import { walkDirsSync } from "./test/suite/walkSync"; export class TestCaseRecorder { active: boolean = false; outPath: string | null = null; - talonCommand: string | null = null; + spokenForm: string | null = null; workspacePath: string | null; workSpaceFolder: string | null; fixtureRoot: string | null; fixtureSubdirectory: string | null = null; - constructor() { + constructor(extensionContext: vscode.ExtensionContext) { this.workspacePath = - vscode.workspace.workspaceFolders?.[0].uri.path ?? null; + extensionContext.extensionMode === vscode.ExtensionMode.Development + ? extensionContext.extensionPath + : vscode.workspace.workspaceFolders?.[0].uri.path ?? null; this.workSpaceFolder = this.workspacePath ? path.basename(this.workspacePath) @@ -27,7 +30,7 @@ export class TestCaseRecorder { start(): Promise { this.active = true; - return this.promptTalonCommand(); + return this.promptSpokenForm(); } async finish(testCase: TestCase): Promise { @@ -66,7 +69,7 @@ export class TestCaseRecorder { }); } - private async promptTalonCommand(): Promise { + private async promptSpokenForm(): Promise { const result = await vscode.window.showInputBox({ prompt: "Talon Command", ignoreFocusOut: true, @@ -79,7 +82,7 @@ export class TestCaseRecorder { return; } - this.talonCommand = result; + this.spokenForm = result; } private async promptSubdirectory(): Promise { @@ -91,10 +94,7 @@ export class TestCaseRecorder { return null; } - const subdirectories = fs - .readdirSync(this.fixtureRoot, { withFileTypes: true }) - .filter((item) => item.isDirectory()) - .map((directory) => directory.name); + const subdirectories = walkDirsSync(this.fixtureRoot).concat("/"); const createNewSubdirectory = "Create new folder →"; const subdirectorySelection = await vscode.window.showQuickPick([ diff --git a/src/extension.ts b/src/extension.ts index 553d47361b..cebf1ac5b2 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -78,7 +78,7 @@ export async function activate(context: vscode.ExtensionContext) { const graph = makeGraph(graphConstructors); const thatMark = new ThatMark(); - const testCaseRecorder = new TestCaseRecorder(); + const testCaseRecorder = new TestCaseRecorder(context); const cursorlessRecordTestCaseDisposable = vscode.commands.registerCommand( "cursorless.recordTestCase", async () => { @@ -153,7 +153,7 @@ export async function activate(context: vscode.ExtensionContext) { targets, thatMark: thatMark, navigationMap: graph.navigationMap!, - talonCommand: testCaseRecorder.talonCommand ?? "", + spokenForm: testCaseRecorder.spokenForm ?? "", }; testCase = new TestCase(command, context); await testCase.recordInitialState(); @@ -244,6 +244,7 @@ export async function activate(context: vscode.ExtensionContext) { return { navigationMap: graph.navigationMap, thatMark, + addDecorations, }; } diff --git a/src/serialize.ts b/src/serialize.ts new file mode 100644 index 0000000000..b274e0dffd --- /dev/null +++ b/src/serialize.ts @@ -0,0 +1,66 @@ +// @ts-nocheck +// From https://github.com/nodeca/js-yaml/issues/586#issuecomment-814310104 +// This file ensures that simple objects and arrays (ie without array or object +// children) will be serialized inline, and also ensures that "fullTargets" will be inlined as well +// TODO: Add types + +import * as yaml from "js-yaml"; + +function customDump(data: unknown, opts) { + if (!(this instanceof customDump)) { + return new customDump(data, opts); + } + this.data = data; + this.opts = opts; +} + +customDump.prototype.represent = function () { + let result = yaml.dump( + this.data, + Object.assign({ replacer, schema }, this.opts) + ); + result = result.trim(); + if (result.includes("\n")) { + result = "\n" + result; + } + return result; +}; + +const customDumpType = new yaml.Type("!format", { + kind: "scalar", + resolve: () => false, + instanceOf: customDump, + represent: (d) => d.represent(), +}); + +let schema = yaml.DEFAULT_SCHEMA.extend({ implicit: [customDumpType] }); + +const isObject = (value: unknown) => typeof value === "object" && value != null; + +function hasSimpleChildren(value: unknown) { + if (isObject(value)) { + return Object.values(value).every( + (value) => !isObject(value) && !Array.isArray(value) + ); + } + if (Array.isArray(value)) { + return value.every((value) => !isObject(value) && !Array.isArray(value)); + } +} + +function replacer(key: string, value: unknown) { + if (key === "") { + return value; + } // top-level, don't change this + + if (key === "fullTargets" || hasSimpleChildren(value)) { + return customDump(value, { flowLevel: 0 }); + } + + return value; // default +} + +const serialize = (obj: unknown) => + customDump(obj, { noRefs: true, quotingType: '"' }).represent().trim(); + +export default serialize; diff --git a/src/test/suite/fixtures/recorded/examples/chuckThat.yml b/src/test/suite/fixtures/recorded/examples/chuckThat.yml index 8be5a84da2..ea7206e120 100644 --- a/src/test/suite/fixtures/recorded/examples/chuckThat.yml +++ b/src/test/suite/fixtures/recorded/examples/chuckThat.yml @@ -1,24 +1,14 @@ -talonCommand: chuck that +spokenForm: chuck that +languageId: python command: actionName: delete partialTargets: - type: primitive - mark: - type: that + mark: {type: that} extraArgs: [] -languageId: python -targets: - - type: primitive - mark: - type: that - selectionType: token - position: contents - modifier: - type: identity - insideOutsideType: outside marks: {} initialState: - document: | + documentContents: | import sys def hello_world(name="pokey"): @@ -27,21 +17,13 @@ initialState: if __name__ == "__main__": hello_world(sys.argv[0]) selections: - - active: - line: 6 - character: 27 - anchor: - line: 6 - character: 27 + - active: {line: 6, character: 28} + anchor: {line: 6, character: 28} thatMark: - - active: - line: 3 - character: 27 - anchor: - line: 2 - character: 0 + - active: {line: 3, character: 27} + anchor: {line: 2, character: 0} finalState: - document: | + documentContents: | import sys @@ -49,17 +31,10 @@ finalState: if __name__ == "__main__": hello_world(sys.argv[0]) selections: - - active: - line: 5 - character: 27 - anchor: - line: 5 - character: 27 + - active: {line: 5, character: 28} + anchor: {line: 5, character: 28} thatMark: - - active: - line: 2 - character: 0 - anchor: - line: 2 - character: 0 + - active: {line: 2, character: 0} + anchor: {line: 2, character: 0} returnValue: null +fullTargets: [{type: primitive, mark: {type: that}, selectionType: token, position: contents, modifier: {type: identity}, insideOutsideType: outside}] diff --git a/src/test/suite/fixtures/recorded/examples/swap.yml b/src/test/suite/fixtures/recorded/examples/swap.yml index 66c05099c2..3afc99b524 100644 --- a/src/test/suite/fixtures/recorded/examples/swap.yml +++ b/src/test/suite/fixtures/recorded/examples/swap.yml @@ -1,57 +1,22 @@ -talonCommand: swap harp with crunch +spokenForm: swap harp with crunch +languageId: python command: actionName: swap partialTargets: - type: primitive - mark: - type: decoratedSymbol - symbolColor: default - character: h + mark: {type: decoratedSymbol, symbolColor: default, character: h} - type: primitive - mark: - type: decoratedSymbol - symbolColor: default - character: k + mark: {type: decoratedSymbol, symbolColor: default, character: k} extraArgs: [] -languageId: python -targets: - - type: primitive - mark: - type: decoratedSymbol - symbolColor: default - character: h - selectionType: token - position: contents - modifier: - type: identity - insideOutsideType: inside - - type: primitive - mark: - type: decoratedSymbol - symbolColor: default - character: k - selectionType: token - position: contents - modifier: - type: identity - insideOutsideType: inside marks: default.h: - start: - line: 3 - character: 12 - end: - line: 3 - character: 17 + start: {line: 3, character: 12} + end: {line: 3, character: 17} default.k: - start: - line: 2 - character: 22 - end: - line: 2 - character: 27 + start: {line: 2, character: 22} + end: {line: 2, character: 27} initialState: - document: | + documentContents: | import sys def hello_world(name="pokey"): @@ -60,14 +25,10 @@ initialState: if __name__ == "__main__": hello_world(sys.argv[0]) selections: - - active: - line: 7 - character: 0 - anchor: - line: 7 - character: 0 + - active: {line: 7, character: 0} + anchor: {line: 7, character: 0} finalState: - document: | + documentContents: | import sys def hello_world(name="hello"): @@ -76,23 +37,12 @@ finalState: if __name__ == "__main__": hello_world(sys.argv[0]) selections: - - active: - line: 7 - character: 0 - anchor: - line: 7 - character: 0 + - active: {line: 7, character: 0} + anchor: {line: 7, character: 0} thatMark: - - active: - line: 3 - character: 17 - anchor: - line: 3 - character: 12 - - active: - line: 2 - character: 27 - anchor: - line: 2 - character: 22 + - active: {line: 3, character: 17} + anchor: {line: 3, character: 12} + - active: {line: 2, character: 27} + anchor: {line: 2, character: 22} returnValue: null +fullTargets: [{type: primitive, mark: {type: decoratedSymbol, symbolColor: default, character: h}, selectionType: token, position: contents, modifier: {type: identity}, insideOutsideType: inside}, {type: primitive, mark: {type: decoratedSymbol, symbolColor: default, character: k}, selectionType: token, position: contents, modifier: {type: identity}, insideOutsideType: inside}] diff --git a/src/test/suite/fixtures/recorded/examples/takeHarp.yml b/src/test/suite/fixtures/recorded/examples/takeHarp.yml new file mode 100644 index 0000000000..094ce74c29 --- /dev/null +++ b/src/test/suite/fixtures/recorded/examples/takeHarp.yml @@ -0,0 +1,27 @@ +spokenForm: take harp +languageId: plaintext +command: + actionName: setSelection + partialTargets: + - type: primitive + mark: {type: decoratedSymbol, symbolColor: default, character: h} + extraArgs: [] +marks: + default.h: + start: {line: 0, character: 0} + end: {line: 0, character: 5} +initialState: + documentContents: hello world + selections: + - active: {line: 0, character: 11} + anchor: {line: 0, character: 11} +finalState: + documentContents: hello world + selections: + - active: {line: 0, character: 5} + anchor: {line: 0, character: 0} + thatMark: + - active: {line: 0, character: 5} + anchor: {line: 0, character: 0} +returnValue: null +fullTargets: [{type: primitive, mark: {type: decoratedSymbol, symbolColor: default, character: h}, selectionType: token, position: contents, modifier: {type: identity}, insideOutsideType: inside}] \ No newline at end of file diff --git a/src/test/suite/recorded.test.ts b/src/test/suite/recorded.test.ts index 30888b88c3..831706045f 100644 --- a/src/test/suite/recorded.test.ts +++ b/src/test/suite/recorded.test.ts @@ -11,7 +11,12 @@ import NavigationMap from "../../NavigationMap"; import * as sinon from "sinon"; import { Clipboard } from "../../Clipboard"; import { takeSnapshot } from "../../takeSnapshot"; -import { PositionPlainObject, SelectionPlainObject } from "../../toPlainObject"; +import { + PositionPlainObject, + rangeToPlainObject, + SelectionPlainObject, +} from "../../toPlainObject"; +import { walkFilesSync } from "./walkSync"; function createPosition(position: PositionPlainObject) { return new vscode.Position(position.line, position.character); @@ -28,7 +33,9 @@ suite("recorded test cases", async function () { __dirname, "../../../src/test/suite/fixtures/recorded" ); - const files = await fsp.readdir(directory); + console.log(directory); + const files = await walkFilesSync(directory); + console.log(files); teardown(() => { sinon.restore(); @@ -46,8 +53,9 @@ suite("recorded test cases", async function () { const cursorlessApi: { thatMark: ThatMark; navigationMap: NavigationMap; + addDecorations: () => void; } = await cursorless.activate(); - const buffer = await fsp.readFile(path.join(directory, file)); + const buffer = await fsp.readFile(file); const fixture = yaml.load(buffer.toString()) as TestCaseFixture; await vscode.commands.executeCommand("workbench.action.closeAllEditors"); @@ -75,7 +83,7 @@ suite("recorded test cases", async function () { } // Wait for cursorless to set up decorations - await new Promise((resolve) => setTimeout(resolve, 300)); + cursorlessApi.addDecorations(); // Assert that recorded decorations are present Object.entries(fixture.marks).forEach(([key, token]) => { @@ -85,10 +93,7 @@ suite("recorded test cases", async function () { character ); assert(currentToken != null, `Mark "${color} ${character}" not found`); - const tokensMatch = - currentToken.range.start === token.start && - currentToken.range.end === token.end; - assert(tokensMatch, `Token for "${color} ${character}" does not match`); + assert.deepStrictEqual(rangeToPlainObject(currentToken.range), token); }); const returnValue = await vscode.commands.executeCommand( diff --git a/src/test/suite/walkSync.ts b/src/test/suite/walkSync.ts new file mode 100644 index 0000000000..cbe12b8a42 --- /dev/null +++ b/src/test/suite/walkSync.ts @@ -0,0 +1,30 @@ +import { statSync } from "fs"; +import * as path from "path"; +import { readdirSync } from "fs"; + +/** + * From https://gist.github.com/kethinov/6658166#gistcomment-1941504 + * @param dir + * @param filelist + * @returns + */ +export const walkFilesSync = (dir: string, filelist: string[] = []) => { + readdirSync(dir).forEach((file) => { + filelist = statSync(path.join(dir, file)).isDirectory() + ? walkFilesSync(path.join(dir, file), filelist) + : filelist.concat(path.join(dir, file)); + }); + return filelist; +}; + +export const walkDirsSync = (dir: string, filelist: string[] = []) => { + readdirSync(dir).forEach((name) => { + const file = path.join(dir, name); + filelist = statSync(file).isDirectory() + ? filelist.concat(file, ...walkFilesSync(file, filelist)) + : filelist; + }); + return filelist + .filter((file) => statSync(file).isDirectory()) + .map((file) => path.relative(dir, file)); +}; diff --git a/yarn.lock b/yarn.lock index 5650af0a97..064d26e0bb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -294,7 +294,7 @@ anymatch@~3.1.1: argparse@^1.0.7: version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" @@ -627,7 +627,7 @@ espree@^7.3.0, espree@^7.3.1: esprima@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.4.0: @@ -770,7 +770,7 @@ glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" -glob@7.1.6, glob@^7.1.3, glob@^7.1.6: +glob@7.1.6, glob@^7.1.3: version "7.1.6" resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -782,6 +782,18 @@ glob@7.1.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.npmjs.org/globals/-/globals-12.4.0.tgz" @@ -950,7 +962,7 @@ js-yaml@4.0.0: dependencies: argparse "^2.0.1" -js-yaml@^3.13.1, js-yaml@^3.14.1: +js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -958,6 +970,13 @@ js-yaml@^3.13.1, js-yaml@^3.14.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" @@ -1360,7 +1379,7 @@ slice-ansi@^4.0.0: sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= "string-width@^1.0.2 || 2": From a255e0b6829dbc5ac704cb896c1ee6944ba43e70 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Fri, 30 Jul 2021 17:58:09 -0700 Subject: [PATCH 38/40] More cleanup --- src/test/suite/recorded.test.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/test/suite/recorded.test.ts b/src/test/suite/recorded.test.ts index 831706045f..83b4cffd47 100644 --- a/src/test/suite/recorded.test.ts +++ b/src/test/suite/recorded.test.ts @@ -33,9 +33,7 @@ suite("recorded test cases", async function () { __dirname, "../../../src/test/suite/fixtures/recorded" ); - console.log(directory); const files = await walkFilesSync(directory); - console.log(files); teardown(() => { sinon.restore(); From 8ce8f867ba0b561d34a89b290e66acb6e70c0afb Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Fri, 30 Jul 2021 17:59:18 -0700 Subject: [PATCH 39/40] cleanup --- src/test/suite/walkSync.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/test/suite/walkSync.ts b/src/test/suite/walkSync.ts index cbe12b8a42..6b8e89ce78 100644 --- a/src/test/suite/walkSync.ts +++ b/src/test/suite/walkSync.ts @@ -3,6 +3,7 @@ import * as path from "path"; import { readdirSync } from "fs"; /** + * Note: Returns full paths * From https://gist.github.com/kethinov/6658166#gistcomment-1941504 * @param dir * @param filelist @@ -17,6 +18,12 @@ export const walkFilesSync = (dir: string, filelist: string[] = []) => { return filelist; }; +/** + * Note: Returns relative paths + * @param dir + * @param filelist + * @returns + */ export const walkDirsSync = (dir: string, filelist: string[] = []) => { readdirSync(dir).forEach((name) => { const file = path.join(dir, name); From 39d62f51b97781a1e54cba4b1a3f4401ae877d58 Mon Sep 17 00:00:00 2001 From: Pokey Rule Date: Fri, 30 Jul 2021 18:27:17 -0700 Subject: [PATCH 40/40] swap anchor with active --- .../fixtures/recorded/examples/chuckThat.yml | 16 ++++++++-------- .../suite/fixtures/recorded/examples/swap.yml | 16 ++++++++-------- .../fixtures/recorded/examples/takeHarp.yml | 12 ++++++------ src/toPlainObject.ts | 2 +- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/test/suite/fixtures/recorded/examples/chuckThat.yml b/src/test/suite/fixtures/recorded/examples/chuckThat.yml index ea7206e120..8bdc29dbdc 100644 --- a/src/test/suite/fixtures/recorded/examples/chuckThat.yml +++ b/src/test/suite/fixtures/recorded/examples/chuckThat.yml @@ -17,11 +17,11 @@ initialState: if __name__ == "__main__": hello_world(sys.argv[0]) selections: - - active: {line: 6, character: 28} - anchor: {line: 6, character: 28} + - anchor: {line: 6, character: 28} + active: {line: 6, character: 28} thatMark: - - active: {line: 3, character: 27} - anchor: {line: 2, character: 0} + - anchor: {line: 2, character: 0} + active: {line: 3, character: 27} finalState: documentContents: | import sys @@ -31,10 +31,10 @@ finalState: if __name__ == "__main__": hello_world(sys.argv[0]) selections: - - active: {line: 5, character: 28} - anchor: {line: 5, character: 28} + - anchor: {line: 5, character: 28} + active: {line: 5, character: 28} thatMark: - - active: {line: 2, character: 0} - anchor: {line: 2, character: 0} + - anchor: {line: 2, character: 0} + active: {line: 2, character: 0} returnValue: null fullTargets: [{type: primitive, mark: {type: that}, selectionType: token, position: contents, modifier: {type: identity}, insideOutsideType: outside}] diff --git a/src/test/suite/fixtures/recorded/examples/swap.yml b/src/test/suite/fixtures/recorded/examples/swap.yml index 3afc99b524..6858f6bb76 100644 --- a/src/test/suite/fixtures/recorded/examples/swap.yml +++ b/src/test/suite/fixtures/recorded/examples/swap.yml @@ -25,8 +25,8 @@ initialState: if __name__ == "__main__": hello_world(sys.argv[0]) selections: - - active: {line: 7, character: 0} - anchor: {line: 7, character: 0} + - anchor: {line: 7, character: 0} + active: {line: 7, character: 0} finalState: documentContents: | import sys @@ -37,12 +37,12 @@ finalState: if __name__ == "__main__": hello_world(sys.argv[0]) selections: - - active: {line: 7, character: 0} - anchor: {line: 7, character: 0} + - anchor: {line: 7, character: 0} + active: {line: 7, character: 0} thatMark: - - active: {line: 3, character: 17} - anchor: {line: 3, character: 12} - - active: {line: 2, character: 27} - anchor: {line: 2, character: 22} + - anchor: {line: 3, character: 12} + active: {line: 3, character: 17} + - anchor: {line: 2, character: 22} + active: {line: 2, character: 27} returnValue: null fullTargets: [{type: primitive, mark: {type: decoratedSymbol, symbolColor: default, character: h}, selectionType: token, position: contents, modifier: {type: identity}, insideOutsideType: inside}, {type: primitive, mark: {type: decoratedSymbol, symbolColor: default, character: k}, selectionType: token, position: contents, modifier: {type: identity}, insideOutsideType: inside}] diff --git a/src/test/suite/fixtures/recorded/examples/takeHarp.yml b/src/test/suite/fixtures/recorded/examples/takeHarp.yml index 094ce74c29..953caeddb6 100644 --- a/src/test/suite/fixtures/recorded/examples/takeHarp.yml +++ b/src/test/suite/fixtures/recorded/examples/takeHarp.yml @@ -13,15 +13,15 @@ marks: initialState: documentContents: hello world selections: - - active: {line: 0, character: 11} - anchor: {line: 0, character: 11} + - anchor: {line: 0, character: 11} + active: {line: 0, character: 11} finalState: documentContents: hello world selections: - - active: {line: 0, character: 5} - anchor: {line: 0, character: 0} + - anchor: {line: 0, character: 0} + active: {line: 0, character: 5} thatMark: - - active: {line: 0, character: 5} - anchor: {line: 0, character: 0} + - anchor: {line: 0, character: 0} + active: {line: 0, character: 5} returnValue: null fullTargets: [{type: primitive, mark: {type: decoratedSymbol, symbolColor: default, character: h}, selectionType: token, position: contents, modifier: {type: identity}, insideOutsideType: inside}] \ No newline at end of file diff --git a/src/toPlainObject.ts b/src/toPlainObject.ts index 6de7f03072..53b6e302b6 100644 --- a/src/toPlainObject.ts +++ b/src/toPlainObject.ts @@ -29,8 +29,8 @@ export function selectionToPlainObject( selection: Selection ): SelectionPlainObject { return { - active: positionToPlainObject(selection.active), anchor: positionToPlainObject(selection.anchor), + active: positionToPlainObject(selection.active), }; }