├── 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 |
4 |
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 |
--------------------------------------------------------------------------------