├── CHANGELOG.md ├── .replit ├── .npmignore ├── .gitignore ├── dev ├── vite.config.js ├── index.html ├── test.html ├── index.ts └── web-demo.html ├── replit.nix ├── .github └── workflows │ └── ci.yml ├── tsconfig.json ├── pull_request_template.md ├── README.md ├── LICENSE ├── package.json ├── src ├── block-cursor.ts └── index.ts ├── test └── webtest-emacs.js └── yarn.lock /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.replit: -------------------------------------------------------------------------------- 1 | run = "yarn run dev" 2 | 3 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | /src 2 | /test 3 | /node_modules 4 | .tern-* 5 | rollup.config.js 6 | tsconfig.json 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | package-lock.json 3 | /dist 4 | /test/*.js 5 | /test/*.d.ts 6 | /test/*.d.ts.map 7 | .tern-* 8 | -------------------------------------------------------------------------------- /dev/vite.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | server: { 3 | host: '0.0.0.0', 4 | /*hmr: { 5 | port: 443, 6 | }*/ 7 | } 8 | } -------------------------------------------------------------------------------- /replit.nix: -------------------------------------------------------------------------------- 1 | { pkgs }: { 2 | deps = [ 3 | pkgs.nodejs-16_x 4 | pkgs.nodePackages.yarn 5 | pkgs.nodePackages.typescript-language-server 6 | pkgs.chromedriver 7 | pkgs.chromium 8 | ]; 9 | } -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: main 2 | on: 3 | push: 4 | branches: [ master ] 5 | pull_request: 6 | branches: [ master ] 7 | repository_dispatch: 8 | jobs: 9 | build-and-test: 10 | runs-on: ubuntu-latest 11 | name: Build and test 12 | steps: 13 | - uses: styfle/cancel-workflow-action@0.6.0 14 | with: 15 | access_token: ${{ github.token }} 16 | 17 | - uses: actions/checkout@v1 18 | 19 | - uses: actions/setup-node@v2 20 | with: 21 | node-version: '16.4' 22 | 23 | - run: npm install 24 | - run: npm run build 25 | - run: npm run test 26 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | // "module": "commonjs", 4 | // "noImplicitAny": true, 5 | // "noEmit": true, 6 | // "declaration": false, 7 | // "lib": ["es2019", "DOM"] 8 | 9 | "allowJs": false, 10 | "checkJs": false, 11 | "lib": ["es6", "dom", "scripthost"], 12 | "types": ["mocha"], 13 | "stripInternal": true, 14 | "typeRoots": ["./node_modules/@types"], 15 | "noUnusedLocals": true, 16 | "strict": true, 17 | "target": "es6", 18 | "module": "es2020", 19 | "newLine": "lf", 20 | "moduleResolution": "node", 21 | }, 22 | "include": [ 23 | "src/*.ts" 24 | ] 25 | } -------------------------------------------------------------------------------- /dev/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Vite App 7 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /pull_request_template.md: -------------------------------------------------------------------------------- 1 | # Why 2 | 3 | 7 | 8 | # What changed 9 | 10 | 16 | 17 | # Test plan 18 | 19 | 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Emacs keybindings for CM6 2 | 3 | Run on Replit badge 4 | NPM version badge 5 | 6 | ## Installation 7 | 8 | `npm i @replit/codemirror-emacs` 9 | 10 | ## Usage 11 | 12 | ```js 13 | import { basicSetup, EditorView } from 'codemirror'; 14 | import { emacs } from "@replit/codemirror-emacs" 15 | 16 | new EditorView({ 17 | doc: "", 18 | extensions: [ 19 | // make sure emacs is included before other keymaps 20 | emacs(), 21 | // include the default keymap and all other keymaps you want to use in insert mode 22 | basicSetup, 23 | ], 24 | parent: document.querySelector('#editor'), 25 | }) 26 | ``` 27 | -------------------------------------------------------------------------------- /dev/test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | CodeMirror view tests 4 | 5 |

CodeMirror view tests

6 | 7 |
8 | 9 |
10 | 11 | 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (C) 2018-2021 by Marijn Haverbeke and others 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@replit/codemirror-emacs", 3 | "version": "6.1.0", 4 | "description": "Emacs keybindings for CodeMirror 6", 5 | "scripts": { 6 | "dev": "vite ./dev", 7 | "test": "cm-runtests", 8 | "build": "cm-buildhelper src/index.ts", 9 | "prepublishOnly": "npm run build" 10 | }, 11 | "keywords": [ 12 | "editor", 13 | "code" 14 | ], 15 | "type": "module", 16 | "main": "dist/index.cjs", 17 | "exports": { 18 | "import": "./dist/index.js", 19 | "require": "./dist/index.cjs" 20 | }, 21 | "types": "dist/index.d.ts", 22 | "module": "dist/index.js", 23 | "sideEffects": false, 24 | "license": "MIT", 25 | "peerDependencies": { 26 | "@codemirror/state": "^6.0.1", 27 | "@codemirror/view": "^6.3.0", 28 | "@codemirror/commands": "^6.0.0", 29 | "@codemirror/autocomplete": "^6.0.2", 30 | "@codemirror/search": "^6.0.0" 31 | }, 32 | "devDependencies": { 33 | "codemirror": "6.0.0", 34 | "@codemirror/buildhelper": "^0.1.16", 35 | "@codemirror/language": "^6.1.0", 36 | "@codemirror/lang-javascript": "^6.0.0", 37 | "@codemirror/lang-xml": "^6.0.0", 38 | "vite": "^2.3.8" 39 | }, 40 | "repository": { 41 | "type": "git", 42 | "url": "https://github.com/replit/codemirror-emacs.git" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /dev/index.ts: -------------------------------------------------------------------------------- 1 | import { basicSetup, EditorView } from 'codemirror'; 2 | import { highlightActiveLine } from '@codemirror/view'; 3 | import { javascript } from '@codemirror/lang-javascript'; 4 | import { xml } from '@codemirror/lang-xml'; 5 | import { emacs } from "../src/index" 6 | 7 | import * as commands from "@codemirror/commands"; 8 | (window as any)._commands = commands 9 | 10 | const doc = `// 🌞 אבג 11 | import { basicSetup, EditorView } from 'codemirror'; 12 | import { javascript } from '@codemirror/lang-javascript'; 13 | import { emacs } from "../src/" 14 | 15 | const doc = \` 16 | console.log('hi') 17 | \` 18 | 19 | new EditorView({ 20 | doc, 21 | extensions: [emacs(), basicSetup, javascript()], 22 | parent: document.querySelector('#editor'), 23 | }); 24 | 25 | `; 26 | 27 | 28 | let wrapCheckbox = document.getElementById("wrap") as HTMLInputElement 29 | wrapCheckbox.checked = localStorage.wrap == "true" 30 | wrapCheckbox.onclick = function() { 31 | updateView(); 32 | localStorage.wrap = wrapCheckbox.checked; 33 | } 34 | let htmlCheckbox = document.getElementById("html") as HTMLInputElement 35 | htmlCheckbox.checked = localStorage.html == "true" 36 | htmlCheckbox.onclick = function() { 37 | updateView(); 38 | localStorage.html = htmlCheckbox.checked; 39 | } 40 | 41 | let view 42 | function updateView() { 43 | if (view) view.destroy() 44 | view = (window as any)._view = new EditorView({ 45 | doc: htmlCheckbox.checked ? document.documentElement.outerHTML : doc, 46 | extensions: [ 47 | emacs(), 48 | basicSetup, 49 | htmlCheckbox.checked ? xml(): javascript(), 50 | highlightActiveLine(), 51 | wrapCheckbox.checked && EditorView.lineWrapping, 52 | ].filter(Boolean), 53 | parent: document.querySelector('#editor'), 54 | }); 55 | } 56 | 57 | 58 | updateView() -------------------------------------------------------------------------------- /src/block-cursor.ts: -------------------------------------------------------------------------------- 1 | import type {EmacsHandler} from "./index" 2 | import { SelectionRange, Prec } from "@codemirror/state" 3 | import { ViewUpdate, EditorView, Direction } from "@codemirror/view" 4 | 5 | import * as View from "@codemirror/view" 6 | // backwards compatibility for old versions not supporting getDrawSelectionConfig 7 | let getDrawSelectionConfig = View.getDrawSelectionConfig || function() { 8 | let defaultConfig = {cursorBlinkRate: 1200}; 9 | return function() { 10 | return defaultConfig; 11 | } 12 | }(); 13 | 14 | type Measure = {cursors: Piece[]} 15 | 16 | class Piece { 17 | constructor(readonly left: number, readonly top: number, 18 | readonly height: number, 19 | readonly fontFamily: string, 20 | readonly fontSize: string, 21 | readonly fontWeight: string, 22 | readonly color: string, 23 | readonly className: string, 24 | readonly letter: string, 25 | readonly partial: boolean) {} 26 | 27 | draw() { 28 | let elt = document.createElement("div") 29 | elt.className = this.className 30 | this.adjust(elt) 31 | return elt 32 | } 33 | 34 | adjust(elt: HTMLElement) { 35 | elt.style.left = this.left + "px" 36 | elt.style.top = this.top + "px" 37 | elt.style.height = this.height + "px" 38 | elt.style.lineHeight = this.height + "px" 39 | elt.style.fontFamily = this.fontFamily; 40 | elt.style.fontSize = this.fontSize; 41 | elt.style.fontWeight = this.fontWeight; 42 | elt.style.color = this.partial ? "transparent" : this.color; 43 | 44 | elt.className = this.className; 45 | elt.textContent = this.letter; 46 | } 47 | 48 | eq(p: Piece) { 49 | return this.left == p.left && this.top == p.top && this.height == p.height && 50 | this.fontFamily == p.fontFamily && this.fontSize == p.fontSize && 51 | this.fontWeight == p.fontWeight && this.color == p.color && 52 | this.className == p.className && 53 | this.letter == p.letter; 54 | } 55 | } 56 | 57 | export class BlockCursorPlugin { 58 | rangePieces: readonly Piece[] = [] 59 | cursors: readonly Piece[] = [] 60 | measureReq: {read: () => Measure, write: (value: Measure) => void} 61 | cursorLayer: HTMLElement 62 | em: EmacsHandler; 63 | 64 | constructor(readonly view: EditorView, em: EmacsHandler) { 65 | this.em = em; 66 | this.measureReq = {read: this.readPos.bind(this), write: this.drawSel.bind(this)} 67 | this.cursorLayer = view.scrollDOM.appendChild(document.createElement("div")) 68 | this.cursorLayer.className = "cm-cursorLayer cm-vimCursorLayer" 69 | this.cursorLayer.setAttribute("aria-hidden", "true") 70 | view.requestMeasure(this.measureReq) 71 | this.setBlinkRate() 72 | } 73 | 74 | setBlinkRate() { 75 | let config = getDrawSelectionConfig(this.view.state); 76 | let blinkRate = config.cursorBlinkRate; 77 | this.cursorLayer.style.animationDuration = blinkRate + "ms"; 78 | } 79 | 80 | update(update: ViewUpdate) { 81 | if (update.selectionSet || update.geometryChanged || update.viewportChanged) { 82 | this.view.requestMeasure(this.measureReq) 83 | this.cursorLayer.style.animationName = this.cursorLayer.style.animationName == "cm-blink" ? "cm-blink2" : "cm-blink" 84 | } 85 | if (configChanged(update)) this.setBlinkRate(); 86 | } 87 | 88 | scheduleRedraw() { 89 | this.view.requestMeasure(this.measureReq) 90 | } 91 | 92 | readPos(): Measure { 93 | let {state} = this.view 94 | let cursors: Piece[] = [] 95 | for (let r of state.selection.ranges) { 96 | let prim = r == state.selection.main 97 | let piece = measureCursor(this.em, this.view, r, prim) 98 | if (piece) cursors.push(piece) 99 | } 100 | return {cursors} 101 | } 102 | 103 | drawSel({cursors}: Measure) { 104 | if (cursors.length != this.cursors.length || cursors.some((c, i) => !c.eq(this.cursors[i]))) { 105 | let oldCursors = this.cursorLayer.children 106 | if (oldCursors.length !== cursors.length) { 107 | this.cursorLayer.textContent = "" 108 | for (const c of cursors) 109 | this.cursorLayer.appendChild(c.draw()) 110 | } else { 111 | cursors.forEach((c, idx) => c.adjust(oldCursors[idx] as HTMLElement)) 112 | } 113 | this.cursors = cursors 114 | } 115 | } 116 | 117 | destroy() { 118 | this.cursorLayer.remove() 119 | } 120 | } 121 | function configChanged(update: ViewUpdate) { 122 | return getDrawSelectionConfig(update.startState) != getDrawSelectionConfig(update.state) 123 | } 124 | 125 | const themeSpec = { 126 | ".cm-line": { 127 | "& ::selection": {backgroundColor: "transparent !important"}, 128 | "&::selection": {backgroundColor: "transparent !important"}, 129 | caretColor: "transparent !important", 130 | }, 131 | ".cm-fat-cursor": { 132 | position: "absolute", 133 | background: "#ff9696", 134 | border: "none", 135 | whiteSpace: "pre", 136 | }, 137 | "&:not(.cm-focused) .cm-fat-cursor": { 138 | background: "none", 139 | outline: "solid 1px #ff9696", 140 | color: "transparent !important", 141 | }, 142 | } 143 | 144 | export const hideNativeSelection = Prec.highest(EditorView.theme(themeSpec)) 145 | 146 | function getBase(view: EditorView) { 147 | let rect = view.scrollDOM.getBoundingClientRect() 148 | let left = view.textDirection == Direction.LTR ? rect.left : rect.right - view.scrollDOM.clientWidth 149 | return {left: left - view.scrollDOM.scrollLeft, top: rect.top - view.scrollDOM.scrollTop} 150 | } 151 | 152 | function measureCursor(em: EmacsHandler, view: EditorView, cursor: SelectionRange, primary: boolean): Piece | null { 153 | let head = cursor.head; 154 | let fatCursor = true; 155 | let hCoeff = 1; 156 | if (em.$data.count || em.$data.keyChain) { 157 | hCoeff = 0.5; 158 | } 159 | 160 | if (fatCursor) { 161 | let letter = head < view.state.doc.length && view.state.sliceDoc(head, head + 1); 162 | if (letter && (/[\uDC00-\uDFFF]/.test(letter) && head > 1)) { 163 | // step back if cursor is on the second half of a surrogate pair 164 | head--; 165 | letter = view.state.sliceDoc(head, head + 1); 166 | } 167 | let pos = view.coordsAtPos(head, 1); 168 | if (!pos) return null; 169 | let base = getBase(view); 170 | let domAtPos = view.domAtPos(head); 171 | let node = domAtPos ? domAtPos.node : view.contentDOM; 172 | while (domAtPos && domAtPos.node instanceof HTMLElement) { 173 | node = domAtPos.node; 174 | domAtPos = {node: domAtPos.node.childNodes[domAtPos.offset], offset: 0}; 175 | } 176 | if (!(node instanceof HTMLElement)) { 177 | if (!node.parentNode) return null; 178 | node = node.parentNode; 179 | } 180 | let style = getComputedStyle(node as HTMLElement); 181 | let left = pos.left; 182 | // TODO remove coordsAtPos when all supported versions of codemirror have coordsForChar api 183 | let charCoords = (view as any).coordsForChar?.(head); 184 | if (charCoords) { 185 | left = charCoords.left; 186 | } 187 | if (!letter || letter == "\n" || letter == "\r") { 188 | letter = "\xa0"; 189 | } else if (letter == "\t") { 190 | letter = "\xa0"; 191 | var nextPos = view.coordsAtPos(head + 1, -1); 192 | if (nextPos) { 193 | left = nextPos.left - (nextPos.left - pos.left) / parseInt(style.tabSize); 194 | } 195 | } else if ((/[\uD800-\uDBFF]/.test(letter) && head < view.state.doc.length - 1)) { 196 | // include the second half of a surrogate pair in cursor 197 | letter += view.state.sliceDoc(head + 1, head + 2); 198 | } 199 | let h = (pos.bottom - pos.top); 200 | return new Piece(left - base.left, pos.top - base.top + h * (1 - hCoeff), h * hCoeff, 201 | style.fontFamily, style.fontSize, style.fontWeight, style.color, 202 | primary ? "cm-fat-cursor cm-cursor-primary" : "cm-fat-cursor cm-cursor-secondary", 203 | letter, hCoeff != 1) 204 | } else { 205 | return null; 206 | } 207 | } 208 | -------------------------------------------------------------------------------- /test/webtest-emacs.js: -------------------------------------------------------------------------------- 1 | import {EditorView, basicSetup} from "codemirror" 2 | import {xml} from "@codemirror/lang-xml" 3 | import {javascript} from "@codemirror/lang-javascript" 4 | import { indentUnit } from "@codemirror/language"; 5 | import { keymap } from "@codemirror/view"; 6 | import { emacs } from ".." 7 | import { EditorState, EditorSelection } from "@codemirror/state"; 8 | import {indentWithTab} from "@codemirror/commands"; 9 | 10 | describe("Emacs keybinding", () => { 11 | /**@type {HTMLDivElement}*/ 12 | var root 13 | function addRoot() { 14 | if (!root) { 15 | root = document.createElement("div") 16 | root.id = "testground" 17 | root.style.height = "300px"; 18 | root.style.position = "fixed" 19 | root.style.top = "100px" 20 | root.style.left = "200px" 21 | root.style.width = "500px" 22 | } 23 | document.body.appendChild(root) 24 | } 25 | addRoot() 26 | 27 | function test(name, fn) { 28 | it(name, function() { 29 | fn(); 30 | }) 31 | } 32 | function eqCursorPos(a, b) { 33 | if (a.line != b.line || a.ch != b.ch) 34 | throw failure( 35 | "Expected cursor position " + JSON.stringify([a.line, a.ch]) + 36 | " to be equal to " + JSON.stringify([b.line, b.ch]), 37 | eqCursorPos 38 | ); 39 | } 40 | function eq(a, b, _reason) { 41 | if (a != b) 42 | throw failure("Expected " + a + " to be equal to " + b, eq); 43 | } 44 | function is(a) { 45 | if (!a) throw failure("Expected " + a + " to be truthy", is); 46 | } 47 | function failure(message, root) { 48 | var error = new Error(message); 49 | if (Error.captureStackTrace) 50 | Error.captureStackTrace(error, root); 51 | return error; 52 | } 53 | 54 | 55 | var editor; 56 | function initEditor(value, options = {}) { 57 | addRoot(); 58 | if (editor) editor.destroy(); 59 | 60 | var view = new EditorView({ 61 | doc: value, 62 | extensions: [ 63 | emacs(), 64 | basicSetup, 65 | options.mode == "xml" ? xml() : javascript(), 66 | EditorState.tabSize.of(options.tabSize || 4), 67 | indentUnit.of( 68 | options.indentWithTabs ? "\t" : " ".repeat(options.indentUnit || 2) 69 | ), 70 | options.lineWrapping && EditorView.lineWrapping, 71 | keymap.of([indentWithTab]), 72 | ].filter(Boolean), 73 | parent: root, 74 | }); 75 | editor = view; 76 | window.view = view; 77 | 78 | view.contentDOM._handleInputEventForTest = function(text) { 79 | view.dispatch(view.state.replaceSelection(text)) 80 | }; 81 | 82 | view.dom.style.backgroundColor = "white"; 83 | view.dom.style.width = "420px" 84 | view.dom.style.height = "300px" 85 | // without calling refresh cursor movement commands of codemirror 6 do not work 86 | view.measure() 87 | view.contentDOM.focus() 88 | 89 | var plugins = view.plugins.filter(x=>x.value.em) 90 | if (plugins.length != 1) throw new Error("Couldn't find emacs") 91 | view.em = plugins[0].value.em; 92 | } 93 | function getSelectedText() { 94 | var state = editor.state 95 | return state.selection.ranges.map(r => state.sliceDoc(r.from, r.to)).join("\n") 96 | } 97 | function getValue() { 98 | return editor.state.doc.toString() 99 | } 100 | function getSelections() { 101 | var state = editor.state 102 | return state.selection.ranges.map(r => r.anchor+ ">" +r.head).join(",") 103 | } 104 | function setSelections(ranges, primIndex = 0) { 105 | ranges = ranges.map(range => { 106 | if (typeof range == "number") 107 | return EditorSelection.cursor(range, 1) 108 | return EditorSelection.range(range[0], range[1]) 109 | }) 110 | editor.dispatch({ 111 | selection: EditorSelection.create(ranges, primIndex) 112 | }) 113 | } 114 | 115 | test("keyboardQuit clears selection", function() { 116 | initEditor('foo'); 117 | typeKey('Ctrl-x', 'Ctrl-p'); 118 | eq(getSelectedText(), "foo") 119 | typeKey('Ctrl-g'); 120 | eq(getSelectedText(), "") 121 | }) 122 | test("exchangePointAndMark without mark set", function() { 123 | initEditor('foo'); 124 | setSelections([[1, 3]]); 125 | eq(getSelections(), "1>3"); 126 | typeKey('Ctrl-x', 'Ctrl-x'); 127 | eq(getSelections(), "3>1"); 128 | }); 129 | 130 | test("exchangePointAndMark with mark set", function() { 131 | initEditor('foo bar'); 132 | setSelections([[1, 1]]); 133 | typeKey('Ctrl-Space', 'Ctrl-Space'); 134 | setSelections([[2, 2]]); 135 | typeKey('Ctrl-Space', 'Ctrl-Space'); 136 | setSelections([[3, 3]]); 137 | typeKey('Ctrl-4', 'Ctrl-x', 'Ctrl-x'); 138 | eq('2>2', getSelections()); 139 | typeKey('Ctrl-4', 'Ctrl-x', 'Ctrl-x'); 140 | eq('3>3', getSelections()); 141 | 142 | typeKey('Ctrl-u', 'Ctrl-Space'); 143 | eq('2>2', getSelections()); 144 | typeKey('Ctrl-u', 'Ctrl-Space'); 145 | eq('1>1', getSelections()); 146 | typeKey('Ctrl-u', 'Ctrl-Space'); 147 | eq('3>3', getSelections()); 148 | typeKey('Ctrl-u', 'Ctrl-Space'); 149 | eq('2>2', getSelections()); 150 | }); 151 | 152 | test("exchangePointAndMark with selection", function() { 153 | initEditor('foo'); 154 | setSelections([[1, 1]]); 155 | typeKey('Ctrl-Space', 'Ctrl-Space'); 156 | setSelections([[2, 2]]); 157 | typeKey('Ctrl-Space', 'Ctrl-Space'); 158 | 159 | setSelections([[1, 0]]); 160 | typeKey('Ctrl-x', 'Ctrl-x'); 161 | eq('0>1', getSelections()); 162 | typeKey('Ctrl-x', 'Ctrl-x'); 163 | eq('1>0', getSelections()); 164 | }); 165 | 166 | test("exchangePointAndMark with multi selection", function() { 167 | initEditor('foo\nhello world\n123'); 168 | setSelections([[0, 3], [4, 9], [18, 19]]); 169 | eq("0>3,4>9,18>19", getSelections()); 170 | typeKey('Ctrl-x', 'Ctrl-x'); 171 | eq("3>0,9>4,19>18", getSelections()); 172 | }); 173 | 174 | test("setMark with multi cursors", function() { 175 | initEditor('foo\nhello world\n123'); 176 | setSelections([0, 4, 9]); 177 | typeKey('Ctrl-Space'); 178 | typeKey('Right'); 179 | eq("0>1,4>5,9>10", getSelections()); 180 | typeKey('Ctrl-Space'); 181 | eq("1>1,5>5,10>10", getSelections()); 182 | typeKey('Left'); 183 | eq("0>0,4>4,9>9", getSelections()); 184 | }); 185 | 186 | test("killLine", function() { 187 | initEditor("foo \n Hello world\n \n 123"); 188 | setSelections([[0, 2]]); 189 | typeKey('Ctrl-k'); 190 | eq(getValue(),"fo\n Hello world\n \n 123"); 191 | typeKey('Ctrl-k'); 192 | eq(getValue(),"fo Hello world\n \n 123"); 193 | typeKey('Ctrl-k'); 194 | eq(getValue(),"fo\n \n 123"); 195 | typeKey('Ctrl-k'); 196 | eq(getValue(),"fo \n 123"); 197 | typeKey('Ctrl-k'); 198 | eq(getValue(),"fo 123"); 199 | typeKey('Ctrl-k'); 200 | eq(getValue(),"fo"); 201 | typeKey('Ctrl-k'); 202 | typeKey('Ctrl-y'); 203 | eq(getValue(),"foo \n Hello world\n \n 123"); 204 | }); 205 | 206 | }); 207 | 208 | 209 | 210 | var typeKey = function() { 211 | var keyCodeToKey = {}; 212 | var keyCodeToCode = {}; 213 | 214 | var alias = {}; 215 | alias.Ctrl = "Control"; 216 | alias.Option = "Alt"; 217 | alias.Cmd = alias.Super = alias.Meta = "Command"; 218 | 219 | var controlKeys = { 220 | Shift: 16, Control: 17, Alt: 18, Meta: 224, Command: 224, 221 | Backspace:8, Tab:9, Return: 13, Enter: 13, 222 | Pause: 19, Escape: 27, PageUp: 33, PageDown: 34, End: 35, Home: 36, 223 | Left: 37, Up: 38, Right: 39, Down: 40, Insert: 45, Delete: 46, 224 | ArrowLeft: 37, ArrowUp: 38, ArrowRight: 39, ArrowDown: 40, 225 | }; 226 | var shiftedKeys = {}; 227 | var printableKeys = {}; 228 | var specialKeys = { 229 | Backquote: [192, "`", "~"], Minus: [189, "-", "_"], Equal: [187, "=", "+"], 230 | BracketLeft: [219, "[", "{"], Backslash: [220, "\\", "|"], BracketRight: [221, "]", "}"], 231 | Semicolon: [186, ";", ":"], Quote: [222, "'", '"'], Comma: [188, ",", "<"], 232 | Period: [190, ".", ">"], Slash: [191, "/", "?"], Space: [32, " ", " "], NumpadAdd: [107, "+"], 233 | NumpadDecimal: [110, "."], NumpadSubtract: [109, "-"], NumpadDivide: [111, "/"], NumpadMultiply: [106, "*"] 234 | }; 235 | for (var i in specialKeys) { 236 | var key = specialKeys[i]; 237 | printableKeys[i] = printableKeys[key[1]] = shiftedKeys[key[2]] = key[0]; 238 | keyCodeToCode[key[0]] = i; 239 | keyCodeToKey[key[0]] = key[1]; 240 | keyCodeToKey["s-" + key[0]] = key[2]; 241 | } 242 | for (var i = 0; i < 10; i++) { 243 | var shifted = "!@#$%^&*()"[i]; 244 | printableKeys[i] = shiftedKeys[shifted] = 48 + i; 245 | keyCodeToCode[48 + i] = "Digit" + i; 246 | keyCodeToKey[48 + i] = i.toString(); 247 | keyCodeToKey["s-" + (48 + i)] = shifted; 248 | } 249 | for (var i = 65; i < 91; i++) { 250 | var chr = String.fromCharCode(i + 32); 251 | printableKeys[chr] = shiftedKeys[chr.toUpperCase()] = i; 252 | keyCodeToCode[i] = "Key" + chr.toUpperCase(); 253 | keyCodeToKey[i] = chr; 254 | keyCodeToKey["s-" + i] = chr.toUpperCase(); 255 | } 256 | for (var i = 1; i < 13; i++) { 257 | controlKeys["F" + i] = 111 + i; 258 | } 259 | 260 | for (var i in controlKeys) { 261 | keyCodeToKey[controlKeys[i]] = i; 262 | keyCodeToCode[controlKeys[i]] = i; 263 | } 264 | controlKeys["\t"] = controlKeys.Tab; 265 | controlKeys["\n"] = controlKeys.Return; 266 | controlKeys.Del = controlKeys.Delete; 267 | controlKeys.Esc = controlKeys.Escape; 268 | controlKeys.Ins = controlKeys.Insert; 269 | 270 | var shift = false; 271 | var ctrl = false; 272 | var meta = false; 273 | var alt = false; 274 | function reset() { 275 | shift = ctrl = meta = alt = false; 276 | } 277 | function updateModifierStates(keyCode) { 278 | if (keyCode == controlKeys.Shift) 279 | return shift = true; 280 | if (keyCode == controlKeys.Control) 281 | return ctrl = true; 282 | if (keyCode == controlKeys.Meta) 283 | return meta = true; 284 | if (keyCode == controlKeys.Alt) 285 | return alt = true; 286 | } 287 | 288 | function sendKey(letter, options) { 289 | var keyCode = controlKeys[letter] || printableKeys[letter] || shiftedKeys[letter]; 290 | var isModifier = updateModifierStates(keyCode); 291 | 292 | var text = letter; 293 | var isTextInput = true; 294 | if (ctrl || alt || meta) { 295 | isTextInput = false; 296 | } else if (controlKeys[letter]) { 297 | if (keyCode == controlKeys.Return) { 298 | text = "\n"; 299 | isTextInput = true; 300 | } else { 301 | isTextInput = false; 302 | } 303 | } else if (shift) { 304 | text = text.toUpperCase(); 305 | } 306 | 307 | if (keyCodeToKey[keyCode] != text && keyCodeToKey["s-" + keyCode] == text) { 308 | shift = true; 309 | } 310 | var key = keyCodeToKey[(shift ? "s-" : "") + keyCode]; 311 | 312 | if (options && options.macAltText) { 313 | alt = true; 314 | text = key = options.macAltText; 315 | isTextInput = true; 316 | } 317 | 318 | var target = document.activeElement; 319 | var prevented = emit("keydown", true); 320 | if (isModifier) return; 321 | if (!prevented && isTextInput) prevented = emit("keypress", true); 322 | if (!prevented && ctrl && !alt && !meta && letter == "c") emitClipboard("copy"); 323 | if (!prevented) updateTextInput(); 324 | emit("keyup", true); 325 | 326 | function emitClipboard(eventType) { 327 | var data = {bubbles: true, cancelable:true}; 328 | var event = new KeyboardEvent(eventType, data); 329 | event.clipboardData = { 330 | setData: function(mime, text) { 331 | type.clipboard.$data = text; 332 | }, 333 | getData: function() { 334 | return type.clipboard.$data; 335 | }, 336 | clearData: function() {}, 337 | }; 338 | target.dispatchEvent(event); 339 | } 340 | function emit(type, bubbles) { 341 | var el = document.activeElement; 342 | var data = {bubbles: bubbles, cancelable:true}; 343 | data.charCode = text.charCodeAt(0); 344 | data.keyCode = type == "keypress" ? data.charCode : keyCode; 345 | data.which = data.keyCode; 346 | data.shiftKey = shift || (shiftedKeys[text] && !printableKeys[text]); 347 | data.ctrlKey = ctrl; 348 | data.altKey = alt; 349 | data.metaKey = meta; 350 | data.key = key; 351 | data.code = keyCodeToCode[keyCode]; 352 | var event = new KeyboardEvent(type, data); 353 | 354 | var el = document.activeElement; 355 | el.dispatchEvent(event); 356 | return event.defaultPrevented; 357 | } 358 | function updateTextInput() { 359 | if (!isTextInput && keyCode == controlKeys.Return) { 360 | text = "\n"; 361 | } 362 | if (target._handleInputEventForTest) { 363 | if (!isTextInput) return; 364 | return target._handleInputEventForTest(text); 365 | } 366 | var isTextarea = "selectionStart" in target && typeof target.value == "string"; 367 | if (!isTextarea) return; 368 | 369 | var start = target.selectionStart; 370 | var end = target.selectionEnd; 371 | var value = target.value; 372 | 373 | if (!isTextInput) { 374 | if (keyCode == controlKeys.Backspace) { 375 | if (start != end) start = Math.max(start - 1, 0); 376 | } else if (keyCode == controlKeys.Delete) { 377 | if (start != end) end = Math.min(end + 1, value.length); 378 | } else { 379 | return; 380 | } 381 | } 382 | var newValue = value.slice(0, start) + text + value.slice(end); 383 | var newStart = start + text.length; 384 | var newEnd = newStart; 385 | if (newValue != value || newStart != start || newEnd != end) { 386 | target.value = newValue; 387 | target.setSelectionRange(newStart, newEnd); 388 | emit("input", false); 389 | } 390 | } 391 | } 392 | 393 | function type() { 394 | var keys = Array.prototype.slice.call(arguments); 395 | for (var i = 0; i < keys.length; i++) { 396 | var key = keys[i]; 397 | if (Array.isArray(key)) { 398 | type.apply(null, key); 399 | continue; 400 | } 401 | reset(); 402 | if (key.length > 1) { 403 | var isKeyName = controlKeys[key] || printableKeys[key] || shiftedKeys[key]; 404 | if (!isKeyName) { 405 | var parts = key.split("-"); 406 | var modifiers = parts.slice(0, parts.length - 1).map(function(part) { 407 | return controlKeys[alias[part] || part]; 408 | }); 409 | var isValid = modifiers.length && modifiers.every(updateModifierStates); 410 | if (!isValid) { 411 | type.apply(null, key.split("")); 412 | continue; 413 | } 414 | key = parts.pop(); 415 | parts.forEach(function(part) { 416 | var keyCode = controlKeys[part]; 417 | updateModifierStates(keyCode); 418 | }); 419 | } 420 | } 421 | sendKey(key); 422 | } 423 | } 424 | 425 | // emulates option-9 inputting } on mac swiss keyboard 426 | type.optionTextInput = function(letter, altText) { 427 | reset(); 428 | sendKey(letter, {macAltText: altText}); 429 | }; 430 | 431 | type.clipboard = {}; 432 | 433 | return type; 434 | }(); 435 | -------------------------------------------------------------------------------- /dev/web-demo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 12 | 13 | 607 | 608 | 609 | 610 | 611 |
612 |
613 |
614 | tests
615 | 649 | 724 | 725 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { BlockCursorPlugin, hideNativeSelection } from "./block-cursor" 2 | import { StateField, StateEffect, ChangeDesc, EditorSelection, Extension, MapMode } from "@codemirror/state" 3 | import { showPanel, EditorView, ViewPlugin, PluginValue, ViewUpdate } from "@codemirror/view" 4 | import * as commands from "@codemirror/commands" 5 | import { startCompletion, completionStatus } from "@codemirror/autocomplete" 6 | import { openSearchPanel } from "@codemirror/search" 7 | 8 | const emacsStyle = EditorView.theme({ 9 | ".cm-emacsMode .cm-cursorLayer:not(.cm-vimCursorLayer)": { 10 | display: "none", 11 | }, 12 | ".cm-vim-panel": { 13 | padding: "5px 10px", 14 | backgroundColor: "#fffa8f", 15 | fontFamily: "monospace", 16 | }, 17 | ".cm-vim-panel input": { 18 | border: "none", 19 | outline: "none", 20 | backgroundColor: "#fffa8f", 21 | }, 22 | }) 23 | 24 | const emacsPlugin = ViewPlugin.fromClass(class implements PluginValue { 25 | public view: EditorView; 26 | public status = "" 27 | public em: EmacsHandler 28 | blockCursor: BlockCursorPlugin 29 | constructor(view: EditorView) { 30 | this.view = view 31 | this.em = new EmacsHandler(view); 32 | 33 | this.blockCursor = new BlockCursorPlugin(view, this.em) 34 | this.view.scrollDOM.classList.add("cm-emacsMode") 35 | 36 | /*this.em.on("dialog", () => { 37 | view.dispatch({ 38 | effects: showEmacsPanel.of(!!this.cm.state.dialog) 39 | }) 40 | });*/ 41 | 42 | } 43 | 44 | update(update: ViewUpdate) { 45 | if (update.docChanged) { 46 | this.em.$emacsMark = null 47 | this.em.updateMarksOnChange(update.changes) 48 | } 49 | /*if (update.selectionSet) { 50 | this.em.onSelectionChange() 51 | } 52 | if (update.viewportChanged) { 53 | // scroll 54 | } 55 | if (this.em.curOp && !this.em.curOp.isVimOp) { 56 | this.em.onBeforeEndOperation(); 57 | }/**/ 58 | 59 | this.blockCursor.update(update); 60 | } 61 | 62 | destroy() { 63 | this.view.scrollDOM.classList.remove("cm-emacsMode") 64 | this.blockCursor.destroy(); 65 | } 66 | }, { 67 | eventHandlers: { 68 | keydown: function (e: KeyboardEvent, view: EditorView) { 69 | var result = this.em.handleKeyboard(e) 70 | if (result) this.blockCursor.scheduleRedraw(); 71 | return !!result; 72 | }, 73 | mousedown: function() { 74 | this.em.$emacsMark = null 75 | } 76 | }, 77 | }) 78 | 79 | 80 | 81 | 82 | const showVimPanel = StateEffect.define() 83 | 84 | const vimPanelState = StateField.define({ 85 | create: () => false, 86 | update(value, tr) { 87 | for (let e of tr.effects) if (e.is(showVimPanel)) value = e.value 88 | return value 89 | }, 90 | provide: f => { 91 | return showPanel.from(f, on => on ? createVimPanel : null) 92 | } 93 | }) 94 | 95 | function createVimPanel(view: EditorView) { 96 | let dom = document.createElement("div") 97 | dom.className = "cm-vim-panel" 98 | return { top: false, dom } 99 | } 100 | 101 | export function emacs(options: {} = {}): Extension { 102 | return [ 103 | emacsStyle, 104 | emacsPlugin, 105 | hideNativeSelection, 106 | vimPanelState 107 | ] 108 | } 109 | 110 | type EmacsMark = number[]|null|undefined; 111 | 112 | var specialKey: Record = { 113 | Return: 'Return', Escape: 'Esc', Insert: 'Ins', 114 | ArrowLeft: 'Left', ArrowRight: 'Right', ArrowUp: 'Up', ArrowDown: 'Down', 115 | Enter: 'Return', Divide: '/', Slash: '/', Multiply: '*', 116 | Subtract: '-', Minus: "-", Equal: '=', 117 | }; 118 | var ignoredKeys: any = { Shift: 1, Alt: 1, Command: 1, Control: 1, CapsLock: 1 }; 119 | 120 | const commandKeyBinding: Record = {} 121 | export class EmacsHandler { 122 | static bindKey(keyGroup: string, command: any) { 123 | keyGroup.split("|").forEach(function (binding) { 124 | let chain = ""; 125 | let parts = binding.split(/\s+/); 126 | parts.forEach(function (keyGroup, index) { 127 | let modifiers = keyGroup.split(/-(?=.)/) 128 | let key = modifiers.pop() 129 | if (modifiers.length) { 130 | chain += modifiers.sort().join("-") + "-" 131 | } 132 | chain += key 133 | if (index === parts.length - 1) { 134 | commandKeyBinding[chain] = command; 135 | } else { 136 | commandKeyBinding[chain] = "null" 137 | chain += " "; 138 | } 139 | }); 140 | }) 141 | } 142 | static getKey(e: KeyboardEvent): string[] { 143 | var code = e.code; 144 | var key = e.key; 145 | if (ignoredKeys[key]) return ['', '', '']; 146 | if (code.length > 1) { 147 | if (code[0] == "N") code = code.replace(/^Numpad/, ""); 148 | if (code[0] == "K") code = code.replace(/^Key/, ""); 149 | } 150 | code = specialKey[code] || code; 151 | if (code.length == 1) code = code.toLowerCase(); 152 | 153 | var modifier = ''; 154 | if (e.ctrlKey) { modifier += 'C-'; } 155 | if (e.metaKey) { modifier += 'CMD-'; } 156 | if (e.altKey) { modifier += 'M-'; } 157 | if (e.shiftKey) { modifier += 'S-'; } 158 | 159 | return [code, modifier, key]; 160 | } 161 | 162 | 163 | static commands: Record = {} 164 | static addCommands(commands: any) { 165 | Object.keys(commands).forEach(function (name) { 166 | var command = commands[name] 167 | if (typeof command == "function") { 168 | command = { exec: command } 169 | } 170 | EmacsHandler.commands[name] = command; 171 | }) 172 | } 173 | static execCommand(command: any, handler: EmacsHandler, args: any, count: number = 1) { 174 | var commandResult = undefined; 175 | if (count < 0) count = -count; 176 | if (typeof command === "function") { 177 | for (var i = 0; i < count; i++) command(handler.view); 178 | } else if (command === "null") { 179 | // waith for next key in the chain 180 | } else if (command.exec) { 181 | if (count > 1 && command.handlesCount) { 182 | if (!args) args = {}; 183 | if (typeof args === 'object') args.count = count; 184 | count = 1 185 | } 186 | for (var i = 0; i < count; i++) commandResult = command.exec(handler, args || {}) 187 | } else { 188 | throw new Error("missformed command") 189 | } 190 | return commandResult; 191 | }; 192 | 193 | 194 | handleKeyboard(e: KeyboardEvent) { 195 | var keyData = EmacsHandler.getKey(e) 196 | var result = this.findCommand(keyData) 197 | 198 | if (/Up|Down/.test(keyData?.[0]) && completionStatus(this.view.state)) 199 | return; 200 | 201 | if (result && result.command) { 202 | var commandResult = EmacsHandler.execCommand(result.command, this, result.args, result.count) 203 | if (commandResult === false) 204 | return; 205 | } 206 | return result 207 | } 208 | 209 | constructor(readonly view: EditorView) { 210 | 211 | } 212 | 213 | // commands 214 | $data: { count?: number | null, keyChain: string, lastCommand: string | null } = { 215 | count: 0, 216 | keyChain: "", 217 | lastCommand: "" 218 | } 219 | findCommand([key, modifier, text]: string[]) { 220 | // if keyCode == -1 a non-printable key was pressed, such as just 221 | // control. Handling those is currently not supported in this handler 222 | if (!key) return undefined; 223 | 224 | var editor = this; 225 | var data = this.$data; 226 | // editor._signal("changeStatus"); 227 | // insertstring data.count times 228 | if (!modifier && key.length == 1) { 229 | editor.pushEmacsMark(); 230 | if (data.count) { 231 | var str = new Array(data.count + 1).join(text); 232 | data.count = null; 233 | return { command: "insertstring", args: str }; 234 | } 235 | } 236 | 237 | // CTRL + number / universalArgument for setting data.count 238 | if (modifier == "C-" || data.count) { 239 | var count = parseInt(key[key.length - 1]); 240 | if (typeof count === 'number' && !isNaN(count)) { 241 | data.count = Math.max(data.count || 0, 0); 242 | data.count = 10 * data.count + count; 243 | return { command: "null" }; 244 | } 245 | } 246 | 247 | // this.commandKeyBinding maps key specs like "c-p" (for CTRL + P) to 248 | // command objects, for lookup key needs to include the modifier 249 | if (modifier) key = modifier + key; 250 | 251 | // Key combos like CTRL+X H build up the data.keyChain 252 | if (data.keyChain) key = data.keyChain += " " + key; 253 | 254 | // Key combo prefixes get stored as "null" (String!) in this 255 | // this.commandKeyBinding. When encountered no command is invoked but we 256 | // buld up data.keyChain 257 | var command = commandKeyBinding[key]; 258 | data.keyChain = command == "null" ? key : ""; 259 | 260 | // there really is no command 261 | if (!command) return undefined; 262 | 263 | // we pass b/c of key combo or universalArgument 264 | if (command === "null") return { command: "null" }; 265 | 266 | if (command === "universalArgument") { 267 | // if no number pressed emacs repeats action 4 times. 268 | // minus sign is needed to allow next keypress to replace it 269 | data.count = -4; 270 | return { command: "null" }; 271 | } 272 | 273 | // lookup command 274 | // TODO extract special handling of markmode 275 | // TODO special case command.command is really unnecessary, remove 276 | var args; 277 | if (typeof command !== "string") { 278 | args = command.args; 279 | if (command.command) command = command.command; 280 | } 281 | 282 | if (command === "insertstring" || 283 | command === commands.splitLine || 284 | command === commands.toggleComment) { 285 | editor.pushEmacsMark(); 286 | } 287 | if (typeof command === "string") { 288 | command = EmacsHandler.commands[command]; 289 | if (!command) return undefined; 290 | } 291 | 292 | if (!command.readOnly && !command.keepLastCommand) { 293 | data.lastCommand = null; 294 | } 295 | 296 | var count = data.count || 1 297 | if (data.count) data.count = 0; 298 | 299 | return { command, args, count }; 300 | } 301 | 302 | showCommandLine(text: string) { 303 | console.error("TODO") 304 | } 305 | 306 | // mark 307 | $emacsMarkRing = [] as EmacsMark[]; 308 | $emacsMark?: EmacsMark = null; 309 | 310 | updateMarksOnChange(change: ChangeDesc) { 311 | if (this.$emacsMark) { 312 | this.$emacsMark = this.updateMark(this.$emacsMark, change); 313 | } 314 | this.$emacsMarkRing = this.$emacsMarkRing.map(x=> { 315 | return this.updateMark(x, change); 316 | }).filter(Boolean); 317 | } 318 | 319 | updateMark(mark: EmacsMark, change: ChangeDesc) { 320 | if (!mark) return; 321 | var updated = mark.map(function(x) { 322 | return change.mapPos(x, 1, MapMode.TrackDel) 323 | }).filter(x => x!= null); 324 | return updated.length == 0 ? null : (updated as number[]) 325 | } 326 | 327 | emacsMark() { 328 | return this.$emacsMark; 329 | }; 330 | 331 | setEmacsMark(p?: EmacsMark) { 332 | // to deactivate pass in a falsy value 333 | this.$emacsMark = p; 334 | }; 335 | 336 | pushEmacsMark(p?: EmacsMark, activate?: boolean) { 337 | var prevMark = this.$emacsMark; 338 | if (prevMark) 339 | pushUnique(this.$emacsMarkRing, prevMark); 340 | if (!p || activate) this.setEmacsMark(p); 341 | else pushUnique(this.$emacsMarkRing, p); 342 | }; 343 | 344 | popEmacsMark() { 345 | var mark = this.emacsMark(); 346 | if (mark) { this.setEmacsMark(null); return mark; } 347 | return this.$emacsMarkRing.pop(); 348 | }; 349 | 350 | getLastEmacsMark() { 351 | return this.$emacsMark || this.$emacsMarkRing.slice(-1)[0]; 352 | }; 353 | 354 | getCopyText() { 355 | var state = this.view.state 356 | return state.selection.ranges.map(r => state.sliceDoc(r.from, r.to)).join("\n") 357 | } 358 | 359 | clearSelection() { 360 | var view = this.view 361 | var selection = view.state.selection 362 | var isEmpty = !selection.ranges.some(r => r.from != r.to) 363 | if (isEmpty) return false 364 | var newRanges = selection.ranges.map(x => { 365 | return EditorSelection.range(x.head, x.head) 366 | }) 367 | view.dispatch({ 368 | selection: EditorSelection.create(newRanges, selection.mainIndex) 369 | }) 370 | return true 371 | } 372 | onPaste(text:string) { 373 | var view = this.view 374 | var selection = view.state.selection 375 | var linesToInsert: string[]; 376 | if (selection.ranges.length > 1) { 377 | var lines = text.split("\n") 378 | if (lines.length == selection.ranges.length) { 379 | linesToInsert = lines; 380 | } 381 | } 382 | 383 | var i = 0 384 | var specs = view.state.changeByRange((range) => { 385 | var toInsert = linesToInsert ? linesToInsert[i] : text 386 | i++; 387 | 388 | return { 389 | changes: { from: range.from, to: range.to, insert: toInsert }, 390 | range: EditorSelection.cursor(range.from + toInsert.length) 391 | } 392 | }) 393 | view.dispatch(specs) 394 | } 395 | selectionToEmacsMark() { 396 | var selection = this.view.state.selection; 397 | return selection.ranges.map(x => x.head) 398 | } 399 | } 400 | 401 | function pushUnique(array: T[], item:T) { 402 | if (array.length && array[array.length - 1] + "" == item + "") 403 | return; 404 | array.push(item); 405 | } 406 | 407 | export const emacsKeys: Record = { 408 | // movement 409 | "Up|C-p": { command: "goOrSelect", args: [commands.cursorLineUp, commands.selectLineUp] }, 410 | "Down|C-n": { command: "goOrSelect", args: [commands.cursorLineDown, commands.selectLineDown] }, 411 | "Left|C-b": { command: "goOrSelect", args: [commands.cursorCharBackward, commands.selectCharBackward] }, 412 | "Right|C-f": { command: "goOrSelect", args: [commands.cursorCharForward, commands.selectCharForward] }, 413 | "C-Left|M-b": { command: "goOrSelect", args: [commands.cursorGroupLeft, commands.selectGroupLeft] }, 414 | "C-Right|M-f": { command: "goOrSelect", args: [commands.cursorGroupRight, commands.selectGroupRight] }, 415 | "Home|C-a": { command: "goOrSelect", args: [commands.cursorLineStart, commands.selectLineStart] }, 416 | "End|C-e": { command: "goOrSelect", args: [commands.cursorLineEnd, commands.selectLineEnd] }, 417 | "C-Home|S-M-,": { command: "goOrSelect", args: [commands.cursorDocStart, commands.selectDocStart] }, 418 | "C-End|S-M-.": { command: "goOrSelect", args: [commands.cursorDocEnd, commands.selectDocEnd] }, 419 | 420 | // selection 421 | "S-Up|S-C-p": commands.selectLineUp, 422 | "S-Down|S-C-n": commands.selectLineDown, 423 | "S-Left|S-C-b": commands.selectCharBackward, 424 | "S-Right|S-C-f": commands.selectCharForward, 425 | "S-C-Left|S-M-b": commands.selectGroupBackward, 426 | "S-C-Right|S-M-f": commands.selectGroupForward, 427 | "S-Home|S-C-a": commands.selectLineStart, 428 | "S-End|S-C-e": commands.selectLineEnd, 429 | "S-C-Home": commands.selectDocStart, 430 | "S-C-End": commands.selectDocEnd, 431 | 432 | "C-l": "recenterTopBottom", 433 | "M-s": "centerSelection", 434 | "M-g": "gotoline", 435 | "C-x C-p|C-x h": commands.selectAll, 436 | 437 | "PageDown|C-v|C-Down": { command: "goOrSelect", args: [commands.cursorPageDown, commands.selectPageDown] }, 438 | "PageUp|M-v|C-Up": { command: "goOrSelect", args: [commands.cursorPageUp, commands.selectPageDown] }, 439 | "S-C-Down": commands.selectPageDown, 440 | "S-C-Up": commands.selectPageUp, 441 | 442 | // TODO use iSearch 443 | "C-s": openSearchPanel, // "iSearch", 444 | "C-r": openSearchPanel, // "iSearchBackwards", 445 | 446 | "M-C-s": "findnext", 447 | "M-C-r": "findprevious", 448 | "S-M-5": "replace", 449 | 450 | // basic editing 451 | "Backspace": commands.deleteCharBackward, 452 | "Delete|C-d": commands.deleteCharForward, 453 | "Return|C-m": { command: "insertstring", args: "\n" }, // "newline" 454 | "C-o": commands.splitLine, 455 | 456 | "M-d|C-Delete": { command: "killWord", args: "right" }, 457 | "C-Backspace|M-Backspace|M-Delete": { command: "killWord", args: "left" }, 458 | "C-k": "killLine", 459 | 460 | "M-h": "selectParagraph", 461 | "M-@|M-S-2": "markWord", 462 | 463 | "C-y|S-Delete": "yank", 464 | "M-y": "yankRotate", 465 | "C-g": "keyboardQuit", 466 | 467 | "C-w|C-S-w": "killRegion", 468 | "M-w": "killRingSave", 469 | "C-Space": "setMark", 470 | "C-x C-x": "exchangePointAndMark", 471 | 472 | "C-t": commands.transposeChars, 473 | "M-u": { command: "changeCase", args: {dir: 1}}, 474 | "M-l": { command: "changeCase", args: {dir: -1}}, 475 | "C-x C-u": { command: "changeCase", args: {dir: 1, region: true}}, 476 | "C-x C-l": { command: "changeCase", args: {dir: 1, region: true}}, 477 | "M-/": startCompletion, 478 | "C-u": "universalArgument", 479 | 480 | "M-;": commands.toggleComment, 481 | 482 | "C-/|C-x u|S-C--|C-z": commands.undo, 483 | "S-C-/|S-C-x u|C--|S-C-z": commands.redo, // infinite undo? 484 | // vertical editing 485 | "C-x r": "selectRectangularRegion", 486 | "M-x": { command: "focusCommandLine", args: "M-x " }, 487 | // todo 488 | // "C-x C-t" "M-t" "M-c" "F11" "C-M- "M-q" 489 | 490 | "Esc": "unsetTransientMark" 491 | }; 492 | 493 | 494 | for (let i in emacsKeys) { 495 | EmacsHandler.bindKey(i, emacsKeys[i]) 496 | } 497 | 498 | EmacsHandler.addCommands({ 499 | unsetTransientMark: function(handler: EmacsHandler) { 500 | handler.setEmacsMark(null) 501 | return false 502 | }, 503 | markWord: function(handler: EmacsHandler, args: any) { 504 | 505 | }, 506 | selectParagraph: function(handler: EmacsHandler, args: any) { 507 | var view = handler.view 508 | var head = view.state.selection.ranges[0].head 509 | var doc = view.state.doc 510 | var startLine = doc.lineAt(head) 511 | var start = -1; 512 | var end = -1; 513 | 514 | var line = startLine; 515 | while (/\S/.test(line.text) && line.from > 0) { 516 | start = line.from 517 | line = view.state.doc.lineAt(line.from - 1) 518 | } 519 | if (start == -1) { 520 | while (!/\S/.test(line.text) && line.to < doc.length) { 521 | start = line.from 522 | line = view.state.doc.lineAt(line.to + 1) 523 | } 524 | } else { 525 | line = startLine 526 | } 527 | while (/\S/.test(line.text) && line.to < doc.length) { 528 | end = line.to 529 | line = view.state.doc.lineAt(line.to + 1) 530 | } 531 | if (end == -1) { 532 | end = startLine.to; 533 | } 534 | var newRanges = [EditorSelection.range(start, end)]; 535 | view.dispatch({ 536 | selection: EditorSelection.create(newRanges) 537 | }) 538 | }, 539 | goOrSelect: { 540 | exec: function(handler: EmacsHandler, args: any) { 541 | var command = handler.emacsMark() ? args[1] : args[0]; 542 | command(handler.view); 543 | } 544 | }, 545 | changeCase: function (handler: EmacsHandler, args: any) { 546 | var view = handler.view 547 | if (!args.region) { 548 | handler.clearSelection() 549 | commands.selectGroupForward(view) 550 | } 551 | 552 | var specs = view.state.changeByRange((range) => { 553 | var toInsert = view.state.sliceDoc(range.from, range.to) 554 | toInsert = args.dir == 1 ? toInsert.toUpperCase() : toInsert.toLowerCase() 555 | return { 556 | changes: { from: range.from, to: range.to, insert: toInsert }, 557 | range: EditorSelection.cursor(range.from + toInsert.length) 558 | } 559 | }) 560 | view.dispatch(specs) 561 | }, 562 | centerSelection: function (handler: EmacsHandler) { 563 | handler.view.dispatch({scrollIntoView: true}) 564 | 565 | }, 566 | recenterTopBottom: function (handler: EmacsHandler) { 567 | var view = handler.view 568 | var scrollTop = view.scrollDOM.scrollTop; 569 | view.dispatch({scrollIntoView: true}) 570 | try { 571 | // force synchronous measurment 572 | (view as any).measure(true) 573 | } catch(e) {} 574 | 575 | if (scrollTop != view.scrollDOM.scrollTop) return; 576 | 577 | var base = view.scrollDOM.getBoundingClientRect() 578 | var cursor = view.coordsAtPos(view.state.selection.main.head) 579 | if (!cursor) return; 580 | 581 | var lineHeight = cursor.bottom - cursor.top 582 | var screenHeight = base.height; 583 | var cursorTop = cursor.top - base.top; 584 | 585 | if (Math.abs(cursorTop) < lineHeight/4) { 586 | scrollTop += cursorTop + lineHeight - screenHeight + 2; 587 | } else if (Math.abs(cursorTop - screenHeight * 0.5) < lineHeight/4) { 588 | scrollTop += cursorTop - 2; 589 | } else { 590 | scrollTop += cursorTop - screenHeight * 0.5; 591 | } 592 | view.scrollDOM.scrollTop = scrollTop 593 | }, 594 | selectRectangularRegion: function (handler: EmacsHandler) { 595 | var view = handler.view 596 | var ranges = view.state.selection.ranges; 597 | var newRanges = [] 598 | if (ranges.length > 1) { 599 | newRanges.push(EditorSelection.range(ranges[0].from, ranges[ranges.length - 1].to)) 600 | } else { 601 | let doc = view.state.doc; 602 | let startLine = doc.lineAt(ranges[0].from) 603 | let endLine = doc.lineAt(ranges[0].to) 604 | let startCollumn = ranges[0].from - startLine.from 605 | let endCollumn = ranges[0].to - endLine.from 606 | 607 | while (startLine.from < endLine.to) { 608 | newRanges.push(EditorSelection.range(startLine.from + startCollumn, startLine.from + endCollumn)) 609 | if (startLine.to + 1 >= doc.length) 610 | break; 611 | startLine = doc.lineAt(startLine.to + 1) 612 | } 613 | } 614 | 615 | view.dispatch({ 616 | selection: EditorSelection.create(newRanges) 617 | }) 618 | }, 619 | setMark: { 620 | exec: function (handler: EmacsHandler, args: any) { 621 | var view = handler.view; 622 | var ranges = view.state.selection.ranges 623 | // Sets mark-mode and clears current selection. 624 | // When mark is set, keyboard cursor movement commands become 625 | // selection modification commands. That is, 626 | // "goto" commands become "select" commands. 627 | // Any insertion or mouse click resets mark-mode. 628 | // setMark twice in a row at the same place resets markmode. 629 | // in multi select mode, ea selection is handled individually 630 | 631 | if (args && args.count) { 632 | var newMark = handler.selectionToEmacsMark(); 633 | var mark = handler.popEmacsMark(); 634 | if (mark) { 635 | var newRanges = mark.map((p: number)=> { 636 | return EditorSelection.cursor(p, p) 637 | }) 638 | view.dispatch({ 639 | selection: EditorSelection.create(newRanges) 640 | }) 641 | handler.$emacsMarkRing.unshift(newMark); 642 | } 643 | return; 644 | } 645 | 646 | var mark = handler.emacsMark(); 647 | var rangePositions = ranges.map(function (r) { return r.head; }); 648 | var transientMarkModeActive = true; 649 | var hasNoSelection = ranges.every(function (range) { return range.from == range.to; }); 650 | // if transientMarkModeActive then mark behavior is a little 651 | // different. Deactivate the mark when setMark is run with active 652 | // mark 653 | if (transientMarkModeActive && (mark || !hasNoSelection)) { 654 | handler.clearSelection(); 655 | if (mark) handler.pushEmacsMark(null); 656 | return; 657 | } 658 | 659 | if (!mark) { 660 | handler.pushEmacsMark(rangePositions) 661 | handler.setEmacsMark(rangePositions); 662 | return; 663 | } 664 | 665 | // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 666 | }, 667 | readOnly: true, 668 | handlesCount: true 669 | }, 670 | exchangePointAndMark: { 671 | exec: function(handler: EmacsHandler, args: any) { 672 | var view = handler.view; 673 | var selection = view.state.selection; 674 | var isEmpty = !selection.ranges.some(r => r.from != r.to) 675 | if (!args.count && !isEmpty) { // just invert selection 676 | var newRanges = selection.ranges.map(x => { 677 | return EditorSelection.range(x.head, x.anchor) 678 | }) 679 | view.dispatch({ 680 | selection: EditorSelection.create(newRanges, selection.mainIndex) 681 | }) 682 | return; 683 | } 684 | 685 | var markRing = handler.$emacsMarkRing 686 | var lastMark = markRing[markRing.length - 1] 687 | if (!lastMark) return; 688 | 689 | if (args.count) { // replace mark and point 690 | markRing[markRing.length - 1] = handler.selectionToEmacsMark() 691 | 692 | handler.clearSelection(); 693 | 694 | var newRanges = lastMark.map(x => { 695 | return EditorSelection.range(x, x) 696 | }) 697 | view.dispatch({ 698 | selection: EditorSelection.create(newRanges, selection.mainIndex) 699 | }) 700 | } else { // create selection to last mark 701 | var n = Math.min(lastMark.length, selection.ranges.length) 702 | newRanges = [] 703 | for (var i = 0; i < n; i++) { 704 | newRanges.push(EditorSelection.range(selection.ranges[i].head, lastMark[i])) 705 | } 706 | } 707 | }, 708 | readOnly: true, 709 | handlesCount: true, 710 | }, 711 | killWord: { 712 | exec: function (handler: EmacsHandler, dir: any) { 713 | var view = handler.view 714 | var selection = view.state.selection; 715 | var newRanges = selection.ranges.map(x => { 716 | return EditorSelection.range(x.head, x.head) 717 | }) 718 | view.dispatch({ 719 | selection: EditorSelection.create(newRanges, selection.mainIndex) 720 | }) 721 | if (dir == "left") 722 | commands.selectGroupBackward(view) 723 | else 724 | commands.selectGroupForward(view) 725 | selection = view.state.selection; 726 | 727 | selection.ranges.forEach(r => { 728 | var text = view.state.sliceDoc(r.from, r.to) 729 | killRing.add(text); 730 | }) 731 | 732 | view.dispatch(view.state.replaceSelection("")) 733 | }, 734 | }, 735 | killLine: { 736 | exec: function (handler: EmacsHandler) { 737 | handler.pushEmacsMark(null); 738 | // don't delete the selection if it's before the cursor 739 | handler.clearSelection(); 740 | var view = handler.view; 741 | var state = view.state 742 | 743 | var text: string[] = []; 744 | var changes = state.selection.ranges.map(function(range) { 745 | var from = range.head; 746 | var lineObject = state.doc.lineAt(from) 747 | 748 | var to = lineObject.to; 749 | var line = state.sliceDoc(from, to) 750 | 751 | // remove EOL if only whitespace remains after the cursor 752 | if (/^\s*$/.test(line) && to < state.doc.length - 1) { 753 | to += 1; 754 | text.push(line + "\n") 755 | } else { 756 | text.push(line) 757 | } 758 | return {from, to, insert: ""} 759 | }) 760 | if (handler.$data.lastCommand == "killLine") { 761 | killRing.append(text.join("\n")); 762 | } else { 763 | killRing.add(text.join("\n")); 764 | } 765 | handler.$data.lastCommand = "killLine"; 766 | view.dispatch({changes}); 767 | }, 768 | keepLastCommand: true 769 | }, 770 | yank: { 771 | exec: function (handler: EmacsHandler) { 772 | handler.onPaste(killRing.get()); 773 | handler.$data.lastCommand = "yank"; 774 | }, 775 | keepLastCommand: true 776 | }, 777 | yankRotate: { 778 | exec: function (handler: EmacsHandler) { 779 | if (handler.$data.lastCommand != "yank") 780 | return; 781 | commands.undo(handler.view); 782 | handler.$emacsMarkRing.pop(); // also undo recording mark 783 | handler.onPaste(killRing.rotate()); 784 | handler.$data.lastCommand = "yank"; 785 | }, 786 | keepLastCommand: true 787 | }, 788 | killRegion: { 789 | exec: function (handler: EmacsHandler) { 790 | killRing.add(handler.getCopyText()); 791 | var view = handler.view; 792 | view.dispatch(view.state.replaceSelection("")) 793 | handler.setEmacsMark(null); 794 | }, 795 | }, 796 | killRingSave: { 797 | exec: function (handler: EmacsHandler) { 798 | var text = handler.getCopyText() 799 | killRing.add(text); 800 | handler.clearSelection() 801 | navigator.clipboard.writeText(text); 802 | }, 803 | readOnly: true 804 | }, 805 | keyboardQuit: function (handler: EmacsHandler) { 806 | var view = handler.view; 807 | var selection = view.state.selection; 808 | var isEmpty = !selection.ranges.some(r => r.from != r.to) 809 | 810 | if (selection.ranges.length > 1 && !isEmpty) { 811 | var newRanges = selection.ranges.map(x => { 812 | return EditorSelection.range(x.head, x.head) 813 | }) 814 | view.dispatch({ 815 | selection: EditorSelection.create(newRanges, selection.mainIndex) 816 | }) 817 | } else { 818 | commands.simplifySelection(handler.view); 819 | } 820 | 821 | handler.setEmacsMark(null); 822 | handler.$data.count = null; 823 | }, 824 | focusCommandLine: function (handler: EmacsHandler, arg: string) { 825 | handler.showCommandLine(arg); 826 | } 827 | }); 828 | 829 | const killRing = { 830 | $data: [] as string[], 831 | add: function (str: string) { 832 | str && this.$data.push(str); 833 | if (this.$data.length > 30) 834 | this.$data.shift(); 835 | }, 836 | append: function (str: string) { 837 | var idx = this.$data.length - 1; 838 | var text = this.$data[idx] || ""; 839 | if (str) text += str; 840 | if (text) this.$data[idx] = text; 841 | }, 842 | get: function (n?: number) { 843 | n = n || 1; 844 | return this.$data.slice(this.$data.length - n, this.$data.length).reverse().join('\n'); 845 | }, 846 | pop: function () { 847 | if (this.$data.length > 1) 848 | this.$data.pop(); 849 | return this.get(); 850 | }, 851 | rotate: function () { 852 | let last = this.$data.pop() 853 | if (last) this.$data.unshift(last); 854 | return this.get(); 855 | } 856 | }; 857 | 858 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.12.13": 6 | version "7.18.6" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" 8 | integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== 9 | dependencies: 10 | "@babel/highlight" "^7.18.6" 11 | 12 | "@babel/helper-validator-identifier@^7.18.6": 13 | version "7.19.1" 14 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" 15 | integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== 16 | 17 | "@babel/highlight@^7.18.6": 18 | version "7.18.6" 19 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" 20 | integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== 21 | dependencies: 22 | "@babel/helper-validator-identifier" "^7.18.6" 23 | chalk "^2.0.0" 24 | js-tokens "^4.0.0" 25 | 26 | "@codemirror/autocomplete@^6.0.0": 27 | version "6.3.0" 28 | resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.3.0.tgz#217e16bb6ce63374ec7b9d2a01d007ba53ff0aff" 29 | integrity sha512-4jEvh3AjJZTDKazd10J6ZsCIqaYxDMCeua5ouQxY8hlFIml+nr7le0SgBhT3SIytFBmdzPK3AUhXGuW3T79nVg== 30 | dependencies: 31 | "@codemirror/language" "^6.0.0" 32 | "@codemirror/state" "^6.0.0" 33 | "@codemirror/view" "^6.0.0" 34 | "@lezer/common" "^1.0.0" 35 | 36 | "@codemirror/buildhelper@^0.1.16": 37 | version "0.1.16" 38 | resolved "https://registry.yarnpkg.com/@codemirror/buildhelper/-/buildhelper-0.1.16.tgz#bda138522fdade53d63f457c440b64be48c7fa71" 39 | integrity sha512-b88pPVoLoBp3DHe+CK5p/1t/WFGYRGxn69d9Efp/cEP3uF91hXTIKOimaL3IyVhm9q6ILjKzn8q8MFUUy7GvwA== 40 | dependencies: 41 | "@lezer/generator" "^1.0.0" 42 | "@types/mocha" "^9.1.1" 43 | acorn "^8.1.0" 44 | acorn-walk "^8.0.2" 45 | esmoduleserve "^0.2.0" 46 | ist "^1.1.7" 47 | mocha "^10.0.0" 48 | rollup "^2.35.1" 49 | rollup-plugin-dts "^3.0.0" 50 | selenium-webdriver "^4.0.0-beta.3" 51 | serve-static "^1.14.1" 52 | typescript "^4.2.3" 53 | 54 | "@codemirror/commands@^6.0.0": 55 | version "6.1.1" 56 | resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.1.1.tgz#f92a343f53f4ecff10fc1f4114d0c9e49e7715b7" 57 | integrity sha512-ibDohwkk7vyu3VsnZNlQhwk0OETBtlkYV+6AHfn5Zgq0sxa+yGVX+apwtC3M4wh6AH7yU5si/NysoECs5EGS3Q== 58 | dependencies: 59 | "@codemirror/language" "^6.0.0" 60 | "@codemirror/state" "^6.0.0" 61 | "@codemirror/view" "^6.0.0" 62 | "@lezer/common" "^1.0.0" 63 | 64 | "@codemirror/lang-javascript@^6.0.0": 65 | version "6.1.0" 66 | resolved "https://registry.yarnpkg.com/@codemirror/lang-javascript/-/lang-javascript-6.1.0.tgz#3b3ddfed59c5fb39b210c13f1e0e8e5a65f009f3" 67 | integrity sha512-wAWEY1Wdis2cKDy9A5q/rUmzLHFbZgoupJBcGaeMMsDPi68Rm90NsmzAEODE5kW8mYdRKFhQ157WJghOZ3yYdg== 68 | dependencies: 69 | "@codemirror/autocomplete" "^6.0.0" 70 | "@codemirror/language" "^6.0.0" 71 | "@codemirror/lint" "^6.0.0" 72 | "@codemirror/state" "^6.0.0" 73 | "@codemirror/view" "^6.0.0" 74 | "@lezer/common" "^1.0.0" 75 | "@lezer/javascript" "^1.0.0" 76 | 77 | "@codemirror/lang-xml@^6.0.0": 78 | version "6.0.0" 79 | resolved "https://registry.yarnpkg.com/@codemirror/lang-xml/-/lang-xml-6.0.0.tgz#40c187f406bba8bccc99b27c66a0c41c8523b80f" 80 | integrity sha512-M/HLWxIiP956xGjtrxkeHkCmDGVQGKu782x8pOH5CLJIMkWtiB1DWfDoDHqpFjdEE9dkfcqPWvYfVi6GbhuXEg== 81 | dependencies: 82 | "@codemirror/autocomplete" "^6.0.0" 83 | "@codemirror/language" "^6.0.0" 84 | "@codemirror/state" "^6.0.0" 85 | "@lezer/common" "^1.0.0" 86 | "@lezer/xml" "^1.0.0" 87 | 88 | "@codemirror/language@^6.0.0", "@codemirror/language@^6.1.0": 89 | version "6.2.1" 90 | resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.2.1.tgz#cb10cd785a76e50ecd2fe2dc59ff66af8a41b87a" 91 | integrity sha512-MC3svxuvIj0MRpFlGHxLS6vPyIdbTr2KKPEW46kCoCXw2ktb4NTkpkPBI/lSP/FoNXLCBJ0mrnUi1OoZxtpW1Q== 92 | dependencies: 93 | "@codemirror/state" "^6.0.0" 94 | "@codemirror/view" "^6.0.0" 95 | "@lezer/common" "^1.0.0" 96 | "@lezer/highlight" "^1.0.0" 97 | "@lezer/lr" "^1.0.0" 98 | style-mod "^4.0.0" 99 | 100 | "@codemirror/lint@^6.0.0": 101 | version "6.0.0" 102 | resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.0.0.tgz#a249b021ac9933b94fe312d994d220f0ef11a157" 103 | integrity sha512-nUUXcJW1Xp54kNs+a1ToPLK8MadO0rMTnJB8Zk4Z8gBdrN0kqV7uvUraU/T2yqg+grDNR38Vmy/MrhQN/RgwiA== 104 | dependencies: 105 | "@codemirror/state" "^6.0.0" 106 | "@codemirror/view" "^6.0.0" 107 | crelt "^1.0.5" 108 | 109 | "@codemirror/search@^6.0.0": 110 | version "6.2.1" 111 | resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-6.2.1.tgz#953ca99e04877f1caa1b521a2b3180dfd1adc499" 112 | integrity sha512-Q1JgUSBjQZRPIddlXzad/AVDigdhriLxQNFyP0gfrDTq6LDHNhr95U/tW3bpVssGenkaLzujtu/7XoK4kyvL3g== 113 | dependencies: 114 | "@codemirror/state" "^6.0.0" 115 | "@codemirror/view" "^6.0.0" 116 | crelt "^1.0.5" 117 | 118 | "@codemirror/state@^6.0.0": 119 | version "6.1.2" 120 | resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.1.2.tgz#182d46eabcc17c95508984d6add5a5a641dcd517" 121 | integrity sha512-Mxff85Hp5va+zuj+H748KbubXjrinX/k28lj43H14T2D0+4kuvEFIEIO7hCEcvBT8ubZyIelt9yGOjj2MWOEQA== 122 | 123 | "@codemirror/view@^6.0.0": 124 | version "6.3.0" 125 | resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.3.0.tgz#715c97d64e7e20c9674782e7101ab7aefef8e23d" 126 | integrity sha512-jMN9OGKmzRPJ+kksfMrB5e/A9heQncirHsz8XNBpgEbYONCk5tWHMKVWKTNwznkUGD5mnigXI1i5YIcWpscSPg== 127 | dependencies: 128 | "@codemirror/state" "^6.0.0" 129 | style-mod "^4.0.0" 130 | w3c-keyname "^2.2.4" 131 | 132 | "@esbuild/linux-loong64@0.14.54": 133 | version "0.14.54" 134 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" 135 | integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== 136 | 137 | "@lezer/common@^1.0.0": 138 | version "1.0.1" 139 | resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.0.1.tgz#d014fda6d582c24336fadf2715e76f02f73c8908" 140 | integrity sha512-8TR5++Q/F//tpDsLd5zkrvEX5xxeemafEaek7mUp7Y+bI8cKQXdSqhzTOBaOogETcMOVr0pT3BBPXp13477ciw== 141 | 142 | "@lezer/generator@^1.0.0": 143 | version "1.1.1" 144 | resolved "https://registry.yarnpkg.com/@lezer/generator/-/generator-1.1.1.tgz#c4708b2b12de27f10bf7de4596f96deabac51808" 145 | integrity sha512-GrB5EwOn09yf5YfDk6TcspHcF7PQZP83665moY5VmOURwCmNOx+Qit3mwp7W/EsGpqd4PPRioxNkYwYZii69cw== 146 | dependencies: 147 | "@lezer/common" "^1.0.0" 148 | "@lezer/lr" "^1.0.0" 149 | 150 | "@lezer/highlight@^1.0.0": 151 | version "1.1.1" 152 | resolved "https://registry.yarnpkg.com/@lezer/highlight/-/highlight-1.1.1.tgz#1f4f12f21320d7de102b46a5416eff49fdf3c695" 153 | integrity sha512-duv9D23O9ghEDnnUDmxu+L8pJy4nYo4AbCOHIudUhscrLSazqeJeK1V50EU6ZufWF1zv0KJwu/frFRyZWXxHBQ== 154 | dependencies: 155 | "@lezer/common" "^1.0.0" 156 | 157 | "@lezer/javascript@^1.0.0": 158 | version "1.0.2" 159 | resolved "https://registry.yarnpkg.com/@lezer/javascript/-/javascript-1.0.2.tgz#79b5c2c77e27322a0ae516395a193574b9ad3f5e" 160 | integrity sha512-IjOVeIRhM8IuafWNnk+UzRz7p4/JSOKBNINLYLsdSGuJS9Ju7vFdc82AlTt0jgtV5D8eBZf4g0vK4d3ttBNz7A== 161 | dependencies: 162 | "@lezer/highlight" "^1.0.0" 163 | "@lezer/lr" "^1.0.0" 164 | 165 | "@lezer/lr@^1.0.0": 166 | version "1.2.3" 167 | resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.2.3.tgz#f44ca844f15f6762fde4eab877d110567e34ffa1" 168 | integrity sha512-qpB7rBzH8f6Mzjv2AVZRahcm+2Cf7nbIH++uXbvVOL1yIRvVWQ3HAM/saeBLCyz/togB7LGo76qdJYL1uKQlqA== 169 | dependencies: 170 | "@lezer/common" "^1.0.0" 171 | 172 | "@lezer/xml@^1.0.0": 173 | version "1.0.0" 174 | resolved "https://registry.yarnpkg.com/@lezer/xml/-/xml-1.0.0.tgz#02817a3d421e7189b50fd31ed17430b2e1c8c0d8" 175 | integrity sha512-73iI9UK8iqSvWtLlOEl/g+50ivwQn8Ge6foHVN66AXUS1RccFnAoc7BYU8b3c8/rP6dfCOGqAGaWLxBzhj60MA== 176 | dependencies: 177 | "@lezer/highlight" "^1.0.0" 178 | "@lezer/lr" "^1.0.0" 179 | 180 | "@types/mocha@^9.1.1": 181 | version "9.1.1" 182 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" 183 | integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== 184 | 185 | "@ungap/promise-all-settled@1.1.2": 186 | version "1.1.2" 187 | resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" 188 | integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== 189 | 190 | acorn-walk@^8.0.0, acorn-walk@^8.0.2: 191 | version "8.2.0" 192 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" 193 | integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== 194 | 195 | acorn@^8.0.4, acorn@^8.1.0: 196 | version "8.8.0" 197 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" 198 | integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== 199 | 200 | ansi-colors@4.1.1: 201 | version "4.1.1" 202 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 203 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 204 | 205 | ansi-regex@^5.0.1: 206 | version "5.0.1" 207 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 208 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 209 | 210 | ansi-styles@^3.2.1: 211 | version "3.2.1" 212 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 213 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 214 | dependencies: 215 | color-convert "^1.9.0" 216 | 217 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 218 | version "4.3.0" 219 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 220 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 221 | dependencies: 222 | color-convert "^2.0.1" 223 | 224 | anymatch@~3.1.2: 225 | version "3.1.2" 226 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 227 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 228 | dependencies: 229 | normalize-path "^3.0.0" 230 | picomatch "^2.0.4" 231 | 232 | argparse@^2.0.1: 233 | version "2.0.1" 234 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 235 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 236 | 237 | balanced-match@^1.0.0: 238 | version "1.0.2" 239 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 240 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 241 | 242 | binary-extensions@^2.0.0: 243 | version "2.2.0" 244 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 245 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 246 | 247 | brace-expansion@^1.1.7: 248 | version "1.1.11" 249 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 250 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 251 | dependencies: 252 | balanced-match "^1.0.0" 253 | concat-map "0.0.1" 254 | 255 | brace-expansion@^2.0.1: 256 | version "2.0.1" 257 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 258 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 259 | dependencies: 260 | balanced-match "^1.0.0" 261 | 262 | braces@~3.0.2: 263 | version "3.0.2" 264 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 265 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 266 | dependencies: 267 | fill-range "^7.0.1" 268 | 269 | browser-stdout@1.3.1: 270 | version "1.3.1" 271 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 272 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 273 | 274 | camelcase@^6.0.0: 275 | version "6.3.0" 276 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" 277 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 278 | 279 | chalk@^2.0.0: 280 | version "2.4.2" 281 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 282 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 283 | dependencies: 284 | ansi-styles "^3.2.1" 285 | escape-string-regexp "^1.0.5" 286 | supports-color "^5.3.0" 287 | 288 | chalk@^4.1.0: 289 | version "4.1.2" 290 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 291 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 292 | dependencies: 293 | ansi-styles "^4.1.0" 294 | supports-color "^7.1.0" 295 | 296 | chokidar@3.5.3: 297 | version "3.5.3" 298 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 299 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 300 | dependencies: 301 | anymatch "~3.1.2" 302 | braces "~3.0.2" 303 | glob-parent "~5.1.2" 304 | is-binary-path "~2.1.0" 305 | is-glob "~4.0.1" 306 | normalize-path "~3.0.0" 307 | readdirp "~3.6.0" 308 | optionalDependencies: 309 | fsevents "~2.3.2" 310 | 311 | cliui@^7.0.2: 312 | version "7.0.4" 313 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 314 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 315 | dependencies: 316 | string-width "^4.2.0" 317 | strip-ansi "^6.0.0" 318 | wrap-ansi "^7.0.0" 319 | 320 | codemirror@6.0.0: 321 | version "6.0.0" 322 | resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-6.0.0.tgz#48aac6370d188f0761807ad9c3b62da7e7f72446" 323 | integrity sha512-c4XR9QtDn+NhKLM2FBsnRn9SFdRH7G6594DYC/fyKKIsTOcdLF0WNWRd+f6kNyd5j1vgYPucbIeq2XkywYCwhA== 324 | dependencies: 325 | "@codemirror/autocomplete" "^6.0.0" 326 | "@codemirror/commands" "^6.0.0" 327 | "@codemirror/language" "^6.0.0" 328 | "@codemirror/lint" "^6.0.0" 329 | "@codemirror/search" "^6.0.0" 330 | "@codemirror/state" "^6.0.0" 331 | "@codemirror/view" "^6.0.0" 332 | 333 | color-convert@^1.9.0: 334 | version "1.9.3" 335 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 336 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 337 | dependencies: 338 | color-name "1.1.3" 339 | 340 | color-convert@^2.0.1: 341 | version "2.0.1" 342 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 343 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 344 | dependencies: 345 | color-name "~1.1.4" 346 | 347 | color-name@1.1.3: 348 | version "1.1.3" 349 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 350 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 351 | 352 | color-name@~1.1.4: 353 | version "1.1.4" 354 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 355 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 356 | 357 | concat-map@0.0.1: 358 | version "0.0.1" 359 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 360 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 361 | 362 | core-util-is@~1.0.0: 363 | version "1.0.3" 364 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" 365 | integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== 366 | 367 | crelt@^1.0.5: 368 | version "1.0.5" 369 | resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.5.tgz#57c0d52af8c859e354bace1883eb2e1eb182bb94" 370 | integrity sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA== 371 | 372 | debug@2.6.9: 373 | version "2.6.9" 374 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 375 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 376 | dependencies: 377 | ms "2.0.0" 378 | 379 | debug@4.3.4: 380 | version "4.3.4" 381 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 382 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 383 | dependencies: 384 | ms "2.1.2" 385 | 386 | decamelize@^4.0.0: 387 | version "4.0.0" 388 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" 389 | integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== 390 | 391 | depd@2.0.0: 392 | version "2.0.0" 393 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 394 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 395 | 396 | destroy@1.2.0: 397 | version "1.2.0" 398 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" 399 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== 400 | 401 | diff@5.0.0: 402 | version "5.0.0" 403 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" 404 | integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== 405 | 406 | ee-first@1.1.1: 407 | version "1.1.1" 408 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 409 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 410 | 411 | emoji-regex@^8.0.0: 412 | version "8.0.0" 413 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 414 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 415 | 416 | encodeurl@~1.0.2: 417 | version "1.0.2" 418 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 419 | integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== 420 | 421 | esbuild-android-64@0.14.54: 422 | version "0.14.54" 423 | resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" 424 | integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== 425 | 426 | esbuild-android-arm64@0.14.54: 427 | version "0.14.54" 428 | resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" 429 | integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== 430 | 431 | esbuild-darwin-64@0.14.54: 432 | version "0.14.54" 433 | resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" 434 | integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== 435 | 436 | esbuild-darwin-arm64@0.14.54: 437 | version "0.14.54" 438 | resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" 439 | integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== 440 | 441 | esbuild-freebsd-64@0.14.54: 442 | version "0.14.54" 443 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" 444 | integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== 445 | 446 | esbuild-freebsd-arm64@0.14.54: 447 | version "0.14.54" 448 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" 449 | integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== 450 | 451 | esbuild-linux-32@0.14.54: 452 | version "0.14.54" 453 | resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" 454 | integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== 455 | 456 | esbuild-linux-64@0.14.54: 457 | version "0.14.54" 458 | resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" 459 | integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== 460 | 461 | esbuild-linux-arm64@0.14.54: 462 | version "0.14.54" 463 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" 464 | integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== 465 | 466 | esbuild-linux-arm@0.14.54: 467 | version "0.14.54" 468 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" 469 | integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== 470 | 471 | esbuild-linux-mips64le@0.14.54: 472 | version "0.14.54" 473 | resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" 474 | integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== 475 | 476 | esbuild-linux-ppc64le@0.14.54: 477 | version "0.14.54" 478 | resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" 479 | integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== 480 | 481 | esbuild-linux-riscv64@0.14.54: 482 | version "0.14.54" 483 | resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" 484 | integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== 485 | 486 | esbuild-linux-s390x@0.14.54: 487 | version "0.14.54" 488 | resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" 489 | integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== 490 | 491 | esbuild-netbsd-64@0.14.54: 492 | version "0.14.54" 493 | resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" 494 | integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== 495 | 496 | esbuild-openbsd-64@0.14.54: 497 | version "0.14.54" 498 | resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" 499 | integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== 500 | 501 | esbuild-sunos-64@0.14.54: 502 | version "0.14.54" 503 | resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" 504 | integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== 505 | 506 | esbuild-windows-32@0.14.54: 507 | version "0.14.54" 508 | resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" 509 | integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== 510 | 511 | esbuild-windows-64@0.14.54: 512 | version "0.14.54" 513 | resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" 514 | integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== 515 | 516 | esbuild-windows-arm64@0.14.54: 517 | version "0.14.54" 518 | resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" 519 | integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== 520 | 521 | esbuild@^0.14.27: 522 | version "0.14.54" 523 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" 524 | integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== 525 | optionalDependencies: 526 | "@esbuild/linux-loong64" "0.14.54" 527 | esbuild-android-64 "0.14.54" 528 | esbuild-android-arm64 "0.14.54" 529 | esbuild-darwin-64 "0.14.54" 530 | esbuild-darwin-arm64 "0.14.54" 531 | esbuild-freebsd-64 "0.14.54" 532 | esbuild-freebsd-arm64 "0.14.54" 533 | esbuild-linux-32 "0.14.54" 534 | esbuild-linux-64 "0.14.54" 535 | esbuild-linux-arm "0.14.54" 536 | esbuild-linux-arm64 "0.14.54" 537 | esbuild-linux-mips64le "0.14.54" 538 | esbuild-linux-ppc64le "0.14.54" 539 | esbuild-linux-riscv64 "0.14.54" 540 | esbuild-linux-s390x "0.14.54" 541 | esbuild-netbsd-64 "0.14.54" 542 | esbuild-openbsd-64 "0.14.54" 543 | esbuild-sunos-64 "0.14.54" 544 | esbuild-windows-32 "0.14.54" 545 | esbuild-windows-64 "0.14.54" 546 | esbuild-windows-arm64 "0.14.54" 547 | 548 | escalade@^3.1.1: 549 | version "3.1.1" 550 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 551 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 552 | 553 | escape-html@~1.0.3: 554 | version "1.0.3" 555 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 556 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 557 | 558 | escape-string-regexp@4.0.0: 559 | version "4.0.0" 560 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 561 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 562 | 563 | escape-string-regexp@^1.0.5: 564 | version "1.0.5" 565 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 566 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 567 | 568 | esmoduleserve@^0.2.0: 569 | version "0.2.0" 570 | resolved "https://registry.yarnpkg.com/esmoduleserve/-/esmoduleserve-0.2.0.tgz#01ed56cbee408f624641dab0b2916a54407c891e" 571 | integrity sha512-vg1j7fzKZUFR5TCsYQ3PABfBRMRi6V9K7mxcRh2MftO3gwAHBwYaPHtLHFDsKVSxdHmpu/GgT37lsRT+vezaKQ== 572 | dependencies: 573 | acorn "^8.0.4" 574 | acorn-walk "^8.0.0" 575 | resolve "^1.15.1" 576 | serve-static "^1.14.1" 577 | 578 | etag@~1.8.1: 579 | version "1.8.1" 580 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 581 | integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== 582 | 583 | fill-range@^7.0.1: 584 | version "7.0.1" 585 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 586 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 587 | dependencies: 588 | to-regex-range "^5.0.1" 589 | 590 | find-up@5.0.0: 591 | version "5.0.0" 592 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 593 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 594 | dependencies: 595 | locate-path "^6.0.0" 596 | path-exists "^4.0.0" 597 | 598 | flat@^5.0.2: 599 | version "5.0.2" 600 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 601 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 602 | 603 | fresh@0.5.2: 604 | version "0.5.2" 605 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 606 | integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== 607 | 608 | fs.realpath@^1.0.0: 609 | version "1.0.0" 610 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 611 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 612 | 613 | fsevents@~2.3.2: 614 | version "2.3.2" 615 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 616 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 617 | 618 | function-bind@^1.1.1: 619 | version "1.1.1" 620 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 621 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 622 | 623 | get-caller-file@^2.0.5: 624 | version "2.0.5" 625 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 626 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 627 | 628 | glob-parent@~5.1.2: 629 | version "5.1.2" 630 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 631 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 632 | dependencies: 633 | is-glob "^4.0.1" 634 | 635 | glob@7.2.0: 636 | version "7.2.0" 637 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" 638 | integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== 639 | dependencies: 640 | fs.realpath "^1.0.0" 641 | inflight "^1.0.4" 642 | inherits "2" 643 | minimatch "^3.0.4" 644 | once "^1.3.0" 645 | path-is-absolute "^1.0.0" 646 | 647 | glob@^7.1.3: 648 | version "7.2.3" 649 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 650 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 651 | dependencies: 652 | fs.realpath "^1.0.0" 653 | inflight "^1.0.4" 654 | inherits "2" 655 | minimatch "^3.1.1" 656 | once "^1.3.0" 657 | path-is-absolute "^1.0.0" 658 | 659 | has-flag@^3.0.0: 660 | version "3.0.0" 661 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 662 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 663 | 664 | has-flag@^4.0.0: 665 | version "4.0.0" 666 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 667 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 668 | 669 | has@^1.0.3: 670 | version "1.0.3" 671 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 672 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 673 | dependencies: 674 | function-bind "^1.1.1" 675 | 676 | he@1.2.0: 677 | version "1.2.0" 678 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 679 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 680 | 681 | http-errors@2.0.0: 682 | version "2.0.0" 683 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 684 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 685 | dependencies: 686 | depd "2.0.0" 687 | inherits "2.0.4" 688 | setprototypeof "1.2.0" 689 | statuses "2.0.1" 690 | toidentifier "1.0.1" 691 | 692 | immediate@~3.0.5: 693 | version "3.0.6" 694 | resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" 695 | integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== 696 | 697 | inflight@^1.0.4: 698 | version "1.0.6" 699 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 700 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 701 | dependencies: 702 | once "^1.3.0" 703 | wrappy "1" 704 | 705 | inherits@2, inherits@2.0.4, inherits@~2.0.3: 706 | version "2.0.4" 707 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 708 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 709 | 710 | is-binary-path@~2.1.0: 711 | version "2.1.0" 712 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 713 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 714 | dependencies: 715 | binary-extensions "^2.0.0" 716 | 717 | is-core-module@^2.9.0: 718 | version "2.10.0" 719 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" 720 | integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== 721 | dependencies: 722 | has "^1.0.3" 723 | 724 | is-extglob@^2.1.1: 725 | version "2.1.1" 726 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 727 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 728 | 729 | is-fullwidth-code-point@^3.0.0: 730 | version "3.0.0" 731 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 732 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 733 | 734 | is-glob@^4.0.1, is-glob@~4.0.1: 735 | version "4.0.3" 736 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 737 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 738 | dependencies: 739 | is-extglob "^2.1.1" 740 | 741 | is-number@^7.0.0: 742 | version "7.0.0" 743 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 744 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 745 | 746 | is-plain-obj@^2.1.0: 747 | version "2.1.0" 748 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 749 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 750 | 751 | is-unicode-supported@^0.1.0: 752 | version "0.1.0" 753 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 754 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== 755 | 756 | isarray@~1.0.0: 757 | version "1.0.0" 758 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 759 | integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== 760 | 761 | ist@^1.1.7: 762 | version "1.1.7" 763 | resolved "https://registry.yarnpkg.com/ist/-/ist-1.1.7.tgz#64161305bca42937d8e05394a2883c3431c5f7ff" 764 | integrity sha512-ex9JyqY+tCjBlxN1pXlqxEgtGGUGp1TG83ll1xpu8SfPgOhfAhEGCuepNHlB+d7Le+hLoBcfCu/G0ZQaFbi9hA== 765 | 766 | js-tokens@^4.0.0: 767 | version "4.0.0" 768 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 769 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 770 | 771 | js-yaml@4.1.0: 772 | version "4.1.0" 773 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 774 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 775 | dependencies: 776 | argparse "^2.0.1" 777 | 778 | jszip@^3.10.0: 779 | version "3.10.1" 780 | resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" 781 | integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== 782 | dependencies: 783 | lie "~3.3.0" 784 | pako "~1.0.2" 785 | readable-stream "~2.3.6" 786 | setimmediate "^1.0.5" 787 | 788 | lie@~3.3.0: 789 | version "3.3.0" 790 | resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" 791 | integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== 792 | dependencies: 793 | immediate "~3.0.5" 794 | 795 | locate-path@^6.0.0: 796 | version "6.0.0" 797 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 798 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 799 | dependencies: 800 | p-locate "^5.0.0" 801 | 802 | log-symbols@4.1.0: 803 | version "4.1.0" 804 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 805 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== 806 | dependencies: 807 | chalk "^4.1.0" 808 | is-unicode-supported "^0.1.0" 809 | 810 | magic-string@^0.25.7: 811 | version "0.25.9" 812 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" 813 | integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== 814 | dependencies: 815 | sourcemap-codec "^1.4.8" 816 | 817 | mime@1.6.0: 818 | version "1.6.0" 819 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 820 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 821 | 822 | minimatch@5.0.1: 823 | version "5.0.1" 824 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" 825 | integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== 826 | dependencies: 827 | brace-expansion "^2.0.1" 828 | 829 | minimatch@^3.0.4, minimatch@^3.1.1: 830 | version "3.1.2" 831 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 832 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 833 | dependencies: 834 | brace-expansion "^1.1.7" 835 | 836 | mocha@^10.0.0: 837 | version "10.0.0" 838 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.0.0.tgz#205447d8993ec755335c4b13deba3d3a13c4def9" 839 | integrity sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA== 840 | dependencies: 841 | "@ungap/promise-all-settled" "1.1.2" 842 | ansi-colors "4.1.1" 843 | browser-stdout "1.3.1" 844 | chokidar "3.5.3" 845 | debug "4.3.4" 846 | diff "5.0.0" 847 | escape-string-regexp "4.0.0" 848 | find-up "5.0.0" 849 | glob "7.2.0" 850 | he "1.2.0" 851 | js-yaml "4.1.0" 852 | log-symbols "4.1.0" 853 | minimatch "5.0.1" 854 | ms "2.1.3" 855 | nanoid "3.3.3" 856 | serialize-javascript "6.0.0" 857 | strip-json-comments "3.1.1" 858 | supports-color "8.1.1" 859 | workerpool "6.2.1" 860 | yargs "16.2.0" 861 | yargs-parser "20.2.4" 862 | yargs-unparser "2.0.0" 863 | 864 | ms@2.0.0: 865 | version "2.0.0" 866 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 867 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 868 | 869 | ms@2.1.2: 870 | version "2.1.2" 871 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 872 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 873 | 874 | ms@2.1.3: 875 | version "2.1.3" 876 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 877 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 878 | 879 | nanoid@3.3.3: 880 | version "3.3.3" 881 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" 882 | integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== 883 | 884 | nanoid@^3.3.4: 885 | version "3.3.4" 886 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" 887 | integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== 888 | 889 | normalize-path@^3.0.0, normalize-path@~3.0.0: 890 | version "3.0.0" 891 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 892 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 893 | 894 | on-finished@2.4.1: 895 | version "2.4.1" 896 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 897 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 898 | dependencies: 899 | ee-first "1.1.1" 900 | 901 | once@^1.3.0: 902 | version "1.4.0" 903 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 904 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 905 | dependencies: 906 | wrappy "1" 907 | 908 | p-limit@^3.0.2: 909 | version "3.1.0" 910 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 911 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 912 | dependencies: 913 | yocto-queue "^0.1.0" 914 | 915 | p-locate@^5.0.0: 916 | version "5.0.0" 917 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 918 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 919 | dependencies: 920 | p-limit "^3.0.2" 921 | 922 | pako@~1.0.2: 923 | version "1.0.11" 924 | resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" 925 | integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== 926 | 927 | parseurl@~1.3.3: 928 | version "1.3.3" 929 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 930 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 931 | 932 | path-exists@^4.0.0: 933 | version "4.0.0" 934 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 935 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 936 | 937 | path-is-absolute@^1.0.0: 938 | version "1.0.1" 939 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 940 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 941 | 942 | path-parse@^1.0.7: 943 | version "1.0.7" 944 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 945 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 946 | 947 | picocolors@^1.0.0: 948 | version "1.0.0" 949 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 950 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 951 | 952 | picomatch@^2.0.4, picomatch@^2.2.1: 953 | version "2.3.1" 954 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 955 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 956 | 957 | postcss@^8.4.13: 958 | version "8.4.16" 959 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.16.tgz#33a1d675fac39941f5f445db0de4db2b6e01d43c" 960 | integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ== 961 | dependencies: 962 | nanoid "^3.3.4" 963 | picocolors "^1.0.0" 964 | source-map-js "^1.0.2" 965 | 966 | process-nextick-args@~2.0.0: 967 | version "2.0.1" 968 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 969 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 970 | 971 | randombytes@^2.1.0: 972 | version "2.1.0" 973 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 974 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 975 | dependencies: 976 | safe-buffer "^5.1.0" 977 | 978 | range-parser@~1.2.1: 979 | version "1.2.1" 980 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 981 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 982 | 983 | readable-stream@~2.3.6: 984 | version "2.3.7" 985 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 986 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 987 | dependencies: 988 | core-util-is "~1.0.0" 989 | inherits "~2.0.3" 990 | isarray "~1.0.0" 991 | process-nextick-args "~2.0.0" 992 | safe-buffer "~5.1.1" 993 | string_decoder "~1.1.1" 994 | util-deprecate "~1.0.1" 995 | 996 | readdirp@~3.6.0: 997 | version "3.6.0" 998 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 999 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1000 | dependencies: 1001 | picomatch "^2.2.1" 1002 | 1003 | require-directory@^2.1.1: 1004 | version "2.1.1" 1005 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1006 | integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== 1007 | 1008 | resolve@^1.15.1, resolve@^1.22.0: 1009 | version "1.22.1" 1010 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" 1011 | integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== 1012 | dependencies: 1013 | is-core-module "^2.9.0" 1014 | path-parse "^1.0.7" 1015 | supports-preserve-symlinks-flag "^1.0.0" 1016 | 1017 | rimraf@^3.0.0: 1018 | version "3.0.2" 1019 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1020 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1021 | dependencies: 1022 | glob "^7.1.3" 1023 | 1024 | rollup-plugin-dts@^3.0.0: 1025 | version "3.0.2" 1026 | resolved "https://registry.yarnpkg.com/rollup-plugin-dts/-/rollup-plugin-dts-3.0.2.tgz#2b628d88f864d271d6eaec2e4c2a60ae4e944c5c" 1027 | integrity sha512-hswlsdWu/x7k5pXzaLP6OvKRKcx8Bzprksz9i9mUe72zvt8LvqAb/AZpzs6FkLgmyRaN8B6rUQOVtzA3yEt9Yw== 1028 | dependencies: 1029 | magic-string "^0.25.7" 1030 | optionalDependencies: 1031 | "@babel/code-frame" "^7.12.13" 1032 | 1033 | "rollup@>=2.59.0 <2.78.0": 1034 | version "2.77.3" 1035 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.77.3.tgz#8f00418d3a2740036e15deb653bed1a90ee0cc12" 1036 | integrity sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g== 1037 | optionalDependencies: 1038 | fsevents "~2.3.2" 1039 | 1040 | rollup@^2.35.1: 1041 | version "2.79.1" 1042 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" 1043 | integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== 1044 | optionalDependencies: 1045 | fsevents "~2.3.2" 1046 | 1047 | safe-buffer@^5.1.0: 1048 | version "5.2.1" 1049 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1050 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1051 | 1052 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1053 | version "5.1.2" 1054 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1055 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1056 | 1057 | selenium-webdriver@^4.0.0-beta.3: 1058 | version "4.4.0" 1059 | resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.4.0.tgz#3f280504f6c0ac64a24b176304213b5a49ec2553" 1060 | integrity sha512-Du+/xfpvNi9zHAeYgXhOWN9yH0hph+cuX+hHDBr7d+SbtQVcfNJwBzLsbdHrB1Wh7MHXFuIkSG88A9TRRQUx3g== 1061 | dependencies: 1062 | jszip "^3.10.0" 1063 | tmp "^0.2.1" 1064 | ws ">=8.7.0" 1065 | 1066 | send@0.18.0: 1067 | version "0.18.0" 1068 | resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" 1069 | integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== 1070 | dependencies: 1071 | debug "2.6.9" 1072 | depd "2.0.0" 1073 | destroy "1.2.0" 1074 | encodeurl "~1.0.2" 1075 | escape-html "~1.0.3" 1076 | etag "~1.8.1" 1077 | fresh "0.5.2" 1078 | http-errors "2.0.0" 1079 | mime "1.6.0" 1080 | ms "2.1.3" 1081 | on-finished "2.4.1" 1082 | range-parser "~1.2.1" 1083 | statuses "2.0.1" 1084 | 1085 | serialize-javascript@6.0.0: 1086 | version "6.0.0" 1087 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" 1088 | integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== 1089 | dependencies: 1090 | randombytes "^2.1.0" 1091 | 1092 | serve-static@^1.14.1: 1093 | version "1.15.0" 1094 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" 1095 | integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== 1096 | dependencies: 1097 | encodeurl "~1.0.2" 1098 | escape-html "~1.0.3" 1099 | parseurl "~1.3.3" 1100 | send "0.18.0" 1101 | 1102 | setimmediate@^1.0.5: 1103 | version "1.0.5" 1104 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 1105 | integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== 1106 | 1107 | setprototypeof@1.2.0: 1108 | version "1.2.0" 1109 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 1110 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 1111 | 1112 | source-map-js@^1.0.2: 1113 | version "1.0.2" 1114 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 1115 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 1116 | 1117 | sourcemap-codec@^1.4.8: 1118 | version "1.4.8" 1119 | resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" 1120 | integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== 1121 | 1122 | statuses@2.0.1: 1123 | version "2.0.1" 1124 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 1125 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 1126 | 1127 | string-width@^4.1.0, string-width@^4.2.0: 1128 | version "4.2.3" 1129 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1130 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1131 | dependencies: 1132 | emoji-regex "^8.0.0" 1133 | is-fullwidth-code-point "^3.0.0" 1134 | strip-ansi "^6.0.1" 1135 | 1136 | string_decoder@~1.1.1: 1137 | version "1.1.1" 1138 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1139 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1140 | dependencies: 1141 | safe-buffer "~5.1.0" 1142 | 1143 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1144 | version "6.0.1" 1145 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1146 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1147 | dependencies: 1148 | ansi-regex "^5.0.1" 1149 | 1150 | strip-json-comments@3.1.1: 1151 | version "3.1.1" 1152 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1153 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1154 | 1155 | style-mod@^4.0.0: 1156 | version "4.0.0" 1157 | resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.0.0.tgz#97e7c2d68b592975f2ca7a63d0dd6fcacfe35a01" 1158 | integrity sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw== 1159 | 1160 | supports-color@8.1.1: 1161 | version "8.1.1" 1162 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 1163 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1164 | dependencies: 1165 | has-flag "^4.0.0" 1166 | 1167 | supports-color@^5.3.0: 1168 | version "5.5.0" 1169 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1170 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1171 | dependencies: 1172 | has-flag "^3.0.0" 1173 | 1174 | supports-color@^7.1.0: 1175 | version "7.2.0" 1176 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1177 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1178 | dependencies: 1179 | has-flag "^4.0.0" 1180 | 1181 | supports-preserve-symlinks-flag@^1.0.0: 1182 | version "1.0.0" 1183 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 1184 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 1185 | 1186 | tmp@^0.2.1: 1187 | version "0.2.1" 1188 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" 1189 | integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== 1190 | dependencies: 1191 | rimraf "^3.0.0" 1192 | 1193 | to-regex-range@^5.0.1: 1194 | version "5.0.1" 1195 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1196 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1197 | dependencies: 1198 | is-number "^7.0.0" 1199 | 1200 | toidentifier@1.0.1: 1201 | version "1.0.1" 1202 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 1203 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 1204 | 1205 | typescript@^4.2.3: 1206 | version "4.8.4" 1207 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" 1208 | integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== 1209 | 1210 | util-deprecate@~1.0.1: 1211 | version "1.0.2" 1212 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1213 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 1214 | 1215 | vite@^2.3.8: 1216 | version "2.9.16" 1217 | resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.16.tgz#daf7ba50f5cc37a7bf51b118ba06bc36e97898e9" 1218 | integrity sha512-X+6q8KPyeuBvTQV8AVSnKDvXoBMnTx8zxh54sOwmmuOdxkjMmEJXH2UEchA+vTMps1xw9vL64uwJOWryULg7nA== 1219 | dependencies: 1220 | esbuild "^0.14.27" 1221 | postcss "^8.4.13" 1222 | resolve "^1.22.0" 1223 | rollup ">=2.59.0 <2.78.0" 1224 | optionalDependencies: 1225 | fsevents "~2.3.2" 1226 | 1227 | w3c-keyname@^2.2.4: 1228 | version "2.2.6" 1229 | resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.6.tgz#8412046116bc16c5d73d4e612053ea10a189c85f" 1230 | integrity sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg== 1231 | 1232 | workerpool@6.2.1: 1233 | version "6.2.1" 1234 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" 1235 | integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== 1236 | 1237 | wrap-ansi@^7.0.0: 1238 | version "7.0.0" 1239 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1240 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1241 | dependencies: 1242 | ansi-styles "^4.0.0" 1243 | string-width "^4.1.0" 1244 | strip-ansi "^6.0.0" 1245 | 1246 | wrappy@1: 1247 | version "1.0.2" 1248 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1249 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1250 | 1251 | ws@>=8.7.0: 1252 | version "8.9.0" 1253 | resolved "https://registry.yarnpkg.com/ws/-/ws-8.9.0.tgz#2a994bb67144be1b53fe2d23c53c028adeb7f45e" 1254 | integrity sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg== 1255 | 1256 | y18n@^5.0.5: 1257 | version "5.0.8" 1258 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 1259 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 1260 | 1261 | yargs-parser@20.2.4: 1262 | version "20.2.4" 1263 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" 1264 | integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== 1265 | 1266 | yargs-parser@^20.2.2: 1267 | version "20.2.9" 1268 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 1269 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 1270 | 1271 | yargs-unparser@2.0.0: 1272 | version "2.0.0" 1273 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" 1274 | integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== 1275 | dependencies: 1276 | camelcase "^6.0.0" 1277 | decamelize "^4.0.0" 1278 | flat "^5.0.2" 1279 | is-plain-obj "^2.1.0" 1280 | 1281 | yargs@16.2.0: 1282 | version "16.2.0" 1283 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 1284 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 1285 | dependencies: 1286 | cliui "^7.0.2" 1287 | escalade "^3.1.1" 1288 | get-caller-file "^2.0.5" 1289 | require-directory "^2.1.1" 1290 | string-width "^4.2.0" 1291 | y18n "^5.0.5" 1292 | yargs-parser "^20.2.2" 1293 | 1294 | yocto-queue@^0.1.0: 1295 | version "0.1.0" 1296 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1297 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1298 | --------------------------------------------------------------------------------