├── .gitignore ├── .npmignore ├── .prettierrc.yaml ├── .replit ├── LICENSE ├── README.md ├── dev ├── index.html ├── index.ts ├── print-lezer-tree.ts ├── vite.config.js └── watch.cjs ├── package.json ├── replit.nix ├── src ├── content.js ├── highlight.ts ├── html-tokens.js ├── index.ts ├── syntax.grammar ├── syntax.grammar.d.ts ├── syntax.grammar.terms.d.ts └── tokens.ts └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | example.png -------------------------------------------------------------------------------- /.prettierrc.yaml: -------------------------------------------------------------------------------- 1 | printWidth: 90 2 | semi: false 3 | singleQuote: false 4 | quoteProps: preserve 5 | trailingComma: none 6 | bracketSpacing: true 7 | arrowParens: avoid 8 | endOfLine: auto 9 | -------------------------------------------------------------------------------- /.replit: -------------------------------------------------------------------------------- 1 | run="yarn dev" 2 | 3 | [packager] 4 | language = "nodejs-yarn" 5 | [packager.features] 6 | packageSearch = true 7 | 8 | [languages.js] 9 | pattern = "**/*.ts" 10 | [languages.js.languageServer] 11 | start = ["typescript-language-server", "--stdio"] -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Replit 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 all 13 | 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 THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CodeMirror Svelte Mode 2 | 3 | This is a CodeMirror 6 extension that adds support for Svelte. 4 | 5 | ### Usage 6 | 7 | ```typescript 8 | import { EditorState } from '@codemirror/state'; 9 | import { EditorView } from '@codemirror/view'; 10 | import { svelte } from "@replit/codemirror-lang-svelte"; 11 | import { basicSetup } from 'codemirror'; 12 | 13 | new EditorView({ 14 | state: EditorState.create({ 15 | doc: `
{a}
`, 16 | extensions: [basicSetup, svelte()], 17 | }), 18 | parent: document.querySelector('#editor'), 19 | }); 20 | ``` -------------------------------------------------------------------------------- /dev/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Vite App 7 | 8 | 34 | 35 | 36 | 37 |
38 |
39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /dev/index.ts: -------------------------------------------------------------------------------- 1 | import { EditorState } from '@codemirror/state'; 2 | import { EditorView } from '@codemirror/view'; 3 | import { basicSetup } from 'codemirror'; 4 | import { svelte, svelteParser } from "../dist/"; 5 | import { printTree } from "./print-lezer-tree"; 6 | import { oneDark } from '@codemirror/theme-one-dark'; 7 | import { syntaxTree } from '@codemirror/language'; 8 | 9 | const testDoc = ` 10 | {#unknown} 11 | 12 | {#each foo as foo} 13 | {#unknown} 14 | {/each} 15 | 16 | 17 | 18 | 19 | 20 | 26 | 27 | {#if nesting({ foo: "bar" })} asdf {/if} 28 | {#if foo} asdf {:else if aaggghg} foobar {:else} bar {/if} 29 | {#each asdf.foo({ test: "yes it ignores this as" }) as something} asfd {/each} 30 | {#each asdf as { foo }} asdf {/each} 31 | {#each asdf as { bar }} asdf {/each} 32 | {#each asdf as foo, bar} asdf {/each} 33 | {#each asdf as foo, bar (test)} asdf {/each} 34 | 35 | {#if answer === 42} 36 |

what was the question?

37 | {/if} 38 | 39 | {#if porridge.temperature > 100} 40 |

too hot!

41 | {:else if 80 > porridge.temperature} 42 |

too cold!

43 | {:else} 44 |

just right!

45 | {/if} 46 | 47 |

Shopping list

48 |
    49 | {#each items as item} 50 |
  • {item.name} x {item.qty}
  • 51 | {/each} 52 |
53 | 54 | {#each items as item, i} 55 |
  • {i + 1}: {item.name} x {item.qty}
  • 56 | {/each} 57 | 58 | {#each items as item (item.id)} 59 |
  • {item.name} x {item.qty}
  • 60 | {/each} 61 | 62 | 63 | {#each items as item, i (item.id)} 64 |
  • {i + 1}: {item.name} x {item.qty}
  • 65 | {/each} 66 | 67 | {#each items as { id, name, qty }, i (id)} 68 |
  • {i + 1}: {name} x {qty}
  • 69 | {/each} 70 | 71 | {#each objects as { id, ...rest }} 72 |
  • {id}
  • 73 | {/each} 74 | 75 | {#each items as [id, ...rest]} 76 |
  • {id}
  • 77 | {/each} 78 | 79 | {#each todos as todo} 80 |

    {todo.text}

    81 | {:else} 82 |

    No tasks today!

    83 | {/each} 84 | 85 | {#await promise} 86 | 87 |

    waiting for the promise to resolve...

    88 | {:then value} 89 | 90 |

    The value is {value}

    91 | {:catch error} 92 | 93 |

    Something went wrong: {error.message}

    94 | {/await} 95 | 96 | {#await promise} 97 | 98 |

    waiting for the promise to resolve...

    99 | {:then value} 100 | 101 |

    The value is {value}

    102 | {/await} 103 | 104 | {#await promise then value} 105 |

    The value is {value}

    106 | {/await} 107 | {#await promise catch error} 108 |

    The error is {error}

    109 | {/await} 110 | 111 | {#key value} 112 |
    {value}
    113 | {/key} 114 | 115 |
    116 |

    {post.title}

    117 | {@html post.content} 118 |
    119 | 120 | {@debug var} 121 | 122 | {@debug var1, var2, var3} 123 | 124 | 127 | 128 | {#each boxes as box} 129 | {@const area = box.width * box.height} 130 | {box.width} * {box.height} = {area} 131 | {/each}` 132 | 133 | const svelteTutorialDoc = "

    Hello world!

    \n\n

    Hello {name.toUpperCase()}!

    \n\n\n\"{name}\n\n

    This is a paragraph.

    \n\n

    This is a paragraph.

    \n\n

    This is a paragraph.

    \n\n\n

    {string}

    \n\n

    {@html string}

    \n\n\n\n\n\n\n\n\n\n\n

    {count} doubled is {doubled}

    \n\n\n\n

    {numbers.join(' + ')} = {sum}

    \n\n\n\n

    {numbers.join(' + ')} = {sum}

    \n\n\n\n\n\n

    \n\tThe {name} package is {speed} fast.\n\tDownload version {version} from npm\n\tand learn more here\n

    \n\n\n\n\n\n\n\n\n\n{#if user.loggedIn}\n\t\n{/if}\n\n{#if !user.loggedIn}\n\t\n{/if}\n\n{#if user.loggedIn}\n\t\n{:else}\n\t\n{/if}\n\n{#if x > 10}\n\t

    {x} is greater than 10

    \n{:else}\n\t{#if 5 > x}\n\t\t

    {x} is less than 5

    \n\t{:else}\n\t\t

    {x} is between 5 and 10

    \n\t{/if}\n{/if}\n\n{#if x > 10}\n\t

    {x} is greater than 10

    \n{:else if 5 > x}\n\t

    {x} is less than 5

    \n{:else}\n\t

    {x} is between 5 and 10

    \n{/if}\n\n

    The Famous Cats of YouTube

    \n\n\n\n

    The Famous Cats of YouTube

    \n\n\n\n\n\n{#each things as thing}\n\t\n{/each}\n\n\n\n{#each things as thing (thing.id) }\n\t\n{/each}\n\n\n\n{#await promise}\n\t

    ...waiting

    \n{:then number}\n\t

    The number is {number}

    \n{:catch error}\n\t

    {error.message}

    \n{/await}\n\n
    \n\tThe mouse position is {m.x} x {m.y}\n
    \n\n
    m = { x: e.clientX, y: e.clientY }}\">\n\tThe mouse position is {m.x} x {m.y}\n
    \n\n
    m = { x: e.clientX, y: e.clientY }}>\n\tThe mouse position is {m.x} x {m.y}\n
    \n\n\n\n\n\n\n\n\n\n\n\n

    Hello {name}!

    \n\n\n\n\n\n

    {a} + {b} = {a + b}

    \n\n\n\n{#if yes}\n\t

    Thank you. We will bombard your inbox and sell your personal details.

    \n{:else}\n\t

    You must opt-in to continue. If you're not paying, you're the product.

    \n{/if}\n\n\n\n

    Size

    \n\n\n\n\n\n\n\n

    Flavours

    \n\n{#each menu as flavour}\n\t\n{/each}\n\n{#if flavours.length === 0}\n\t

    Please select at least one flavour

    \n{:else if flavours.length > scoops}\n\t

    Can't order more flavours than scoops!

    \n{:else}\n\t

    \n\t\tYou ordered {scoops} {scoops === 1 ? 'scoop' : 'scoops'}\n\t\tof {join(flavours)}\n\t

    \n{/if}\n\n{@html marked(value)}\n\n\n\n

    Insecurity questions

    \n\n
    \n\t\n\n\t\n\n\t\n
    \n\n

    selected question {selected ? selected.id : '[waiting...]'}

    \n\n

    Size

    \n\n\n\n\n\n\n\n

    Flavours

    \n\n\n\n{#if flavours.length === 0}\n\t

    Please select at least one flavour

    \n{:else if flavours.length > scoops}\n\t

    Can't order more flavours than scoops!

    \n{:else}\n\t

    \n\t\tYou ordered {scoops} {scoops === 1 ? 'scoop' : 'scoops'}\n\t\tof {join(flavours)}\n\t

    \n{/if}\n\n\n\n
    {html}
    \n\n

    Todos

    \n\n{#each todos as todo}\n\t
    \n\t\t\n\n\t\t\n\t
    \n{/each}\n\n

    {remaining} remaining

    \n\n\n\n\n\n

    Caminandes: Llamigos

    \n

    From Blender Studio. CC-BY

    \n\n
    \n\t\n\t\t\n\t\n\n\t
    \n\t\t\n\n\t\t
    \n\t\t\t{format(time)}\n\t\t\tclick anywhere to {paused ? 'play' : 'pause'} / drag to seek\n\t\t\t{format(duration)}\n\t\t
    \n\t
    \n
    \n\n\n\n\n

    size: {w}px x {h}px

    \n\n
    \n\t{text}\n
    \n\n\n\n

    {view}

    \n\n\n\n
    \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\n\t\n\t\n\t\n
    \n\n\n\n\n\n\n\n

    Photo album

    \n\n
    \n\t{#each photos as photo}\n\t\t
    \n\t\t\t{photo.title}\n\t\t\t
    {photo.title}
    \n\t\t
    \n\t{:else}\n\t\t\n\t\t

    loading...

    \n\t{/each}\n
    \n\n
    \n\t\n\t

    \n\t\tThe Timer component has been open for\n\t\t{seconds} {seconds === 1 ? 'second' : 'seconds'}\n\t

    \n\t{#if open}\n\t\n\t{/if}\n
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n
    \n\t\n\n\t\n
    \n\n coords.set({ x: e.clientX, y: e.clientY })}\"\n\ton:mousedown=\"{() => size.set(30)}\"\n\ton:mouseup=\"{() => size.set(10)}\"\n>\n\t\n\n\n{#if visible}\n\t

    \n\t\tFades in and out\n\t

    \n{/if}\n\n{#if visible}\n\t

    \n\t\tFlies in and out\n\t

    \n{/if}\n\n{#if visible}\n\t

    \n\t\tFlies in, fades out\n\t

    \n{/if}\n\n\n\n{#if visible}\n\t
    \n\t\ttransitions!\n\t
    \n{/if}\n\n

    status: {status}

    \n\n\n\n{#if visible}\n\t status = 'intro started'}\"\n\t\ton:outrostart=\"{() => status = 'outro started'}\"\n\t\ton:introend=\"{() => status = 'intro ended'}\"\n\t\ton:outroend=\"{() => status = 'outro ended'}\"\n\t>\n\t\tFlies in and out\n\t

    \n{/if}\n\n\n\n\n\n{#if showItems}\n\t{#each items.slice(0, i) as item}\n\t\t
    \n\t\t\t{item}\n\t\t
    \n\t{/each}\n{/if}\n\n
    \n\t e.key === 'Enter' && add(e.target)}\n\t>\n\n\t
    \n\t\t

    todo

    \n\t\t{#each todos.filter(t => !t.done) as todo (todo.id)}\n\t\t\t\n\t\t\t\t mark(todo, true)}>\n\t\t\t\t{todo.description}\n\t\t\t\t\n\t\t\t\n\t\t{/each}\n\t
    \n\n\t
    \n\t\t

    done

    \n\t\t{#each todos.filter(t => t.done) as todo (todo.id)}\n\t\t\t\n\t\t\t\t mark(todo, false)}>\n\t\t\t\t{todo.description}\n\t\t\t\t\n\t\t\t\n\t\t{/each}\n\t
    \n
    \n\n
    \n\tThe number is:\n\t{#key number}\n\t\t\n\t\t\t{number}\n\t\t\n\t{/key}\n
    \n
    \n {\n\t\tnumber += 1;\n\t}}>\n\tIncrement\n\n\n
    \n\t e.key === 'Enter' && add(e.target)}\n\t>\n\n\t
    \n\t\t

    todo

    \n\t\t{#each todos.filter(t => !t.done) as todo (todo.id)}\n\t\t\t\n\t\t\t\t mark(todo, true)}>\n\t\t\t\t{todo.description}\n\t\t\t\t\n\t\t\t\n\t\t{/each}\n\t
    \n\n\t
    \n\t\t

    done

    \n\t\t{#each todos.filter(t => t.done) as todo (todo.id)}\n\t\t\t\n\t\t\t\t mark(todo, false)}>\n\t\t\t\t{todo.description}\n\t\t\t\t\n\t\t\t\n\t\t{/each}\n\t
    \n
    \n\n\n{#if showModal}\n\t
    (showModal = false)}>\n\t\tClick outside me!\n\t
    \n{/if}\n\n\n\n\n\n{#if pressed}\n\t

    congratulations, you pressed and held for {duration}ms

    \n{/if}\n\n current = 'foo'}\"\n>foo\n\n current = 'bar'}\"\n>bar\n\n current = 'baz'}\"\n>baz\n\n
    \n\tsome {big ? 'big' : 'small'} text\n
    \n\n\n\n

    This is a paragraph.

    \n\n\n\n

    This is a paragraph.

    \n\n\n\t
    \n\t\t{#if active}\n\t\t\t

    I am being hovered upon.

    \n\t\t{:else}\n\t\t\t

    Hover over me!

    \n\t\t{/if}\n\t
    \n
    \n\n\n\t
    \n\t\t{#if active}\n\t\t\t

    I am being hovered upon.

    \n\t\t{:else}\n\t\t\t

    Hover over me!

    \n\t\t{/if}\n\t
    \n
    \n\n\n\t
    \n\t\t{#if active}\n\t\t\t

    I am being hovered upon.

    \n\t\t{:else}\n\t\t\t

    Hover over me!

    \n\t\t{/if}\n\t
    \n
    \n\n\n\nI'm a {selected} tag\n\n\n\n
    \n\t{#if key}\n\t\t{key === ' ' ? 'Space' : key}\n\t\t

    {code}

    \n\t{:else}\n\t\t

    Focus this window and press any key

    \n\t{/if}\n
    \n\n\n\n\n\n\n\n\t\n\n\n

    Hello world!

    \n\n\n\n\n{@debug user}\n\n

    Hello {user.firstname}!

    \n\n{#each confetti as c}\n\t{c.character}\n{/each}" 134 | 135 | const doc = testDoc + "\n" + svelteTutorialDoc 136 | 137 | const syncAST = EditorView.updateListener.of(update => { 138 | if (update.docChanged || update.selectionSet) { 139 | const { from: oldFrom, to: oldTo } = update.startState.selection.ranges[0] 140 | let { from, to } = update.state.selection.ranges[0] 141 | 142 | const docChanged = update.docChanged 143 | const selectionChanged = 144 | !((from === to && oldFrom === oldTo) || (from === oldFrom && to === oldTo)) 145 | const hasSelection = from !== to 146 | 147 | if (docChanged || selectionChanged) { 148 | const ast = printTree( 149 | syntaxTree(update.view.state), 150 | update.state.doc.toString(), 151 | hasSelection ? { from, to } : undefined 152 | ) 153 | 154 | queueMicrotask(() => { 155 | astView.dispatch({ changes: { from: 0, to: astView.state.doc.length, insert: ast }}) 156 | }) 157 | } 158 | 159 | } 160 | }) 161 | 162 | const mainView = new EditorView({ 163 | state: EditorState.create({ 164 | doc, 165 | extensions: [basicSetup, svelte(), oneDark, EditorView.lineWrapping, syncAST], 166 | }), 167 | parent: document.querySelector('#editor'), 168 | }); 169 | 170 | const astView = new EditorView({ 171 | state: EditorState.create({ 172 | doc: printTree(svelteParser.parse(doc), doc), 173 | extensions: [basicSetup, oneDark, EditorView.lineWrapping, EditorState.readOnly.of(true)] 174 | }), 175 | parent: document.querySelector('#editor-ast') 176 | }) -------------------------------------------------------------------------------- /dev/print-lezer-tree.ts: -------------------------------------------------------------------------------- 1 | // From: https://gist.github.com/msteen/e4828fbf25d6efef73576fc43ac479d2/ 2 | 3 | import { Text } from "@codemirror/state" 4 | import { Input, NodeType, SyntaxNode, Tree, TreeCursor } from "@lezer/common" 5 | 6 | class StringInput implements Input { 7 | constructor(private readonly input: string) {} 8 | 9 | get length() { 10 | return this.input.length 11 | } 12 | 13 | chunk(from: number): string { 14 | return this.input.slice(from) 15 | } 16 | 17 | lineChunks = false 18 | 19 | read(from: number, to: number): string { 20 | return this.input.slice(from, to) 21 | } 22 | } 23 | 24 | export function sliceType(cursor: TreeCursor, input: Input, type: number): string | null { 25 | if (cursor.type.id === type) { 26 | const s = input.read(cursor.from, cursor.to) 27 | cursor.nextSibling() 28 | return s 29 | } 30 | return null 31 | } 32 | 33 | export function isType(cursor: TreeCursor, type: number): boolean { 34 | const cond = cursor.type.id === type 35 | if (cond) cursor.nextSibling() 36 | return cond 37 | } 38 | 39 | export type CursorNode = { type: NodeType; from: number; to: number; isLeaf: boolean } 40 | 41 | function cursorNode({ type, from, to }: TreeCursor, isLeaf = false): CursorNode { 42 | return { type, from, to, isLeaf } 43 | } 44 | 45 | export type TreeTraversal = { 46 | beforeEnter?: (cursor: TreeCursor) => void 47 | onEnter: (node: CursorNode) => false | void 48 | onLeave?: (node: CursorNode) => false | void 49 | } 50 | 51 | type TreeTraversalOptions = { 52 | from?: number 53 | to?: number 54 | includeParents?: boolean 55 | } & TreeTraversal 56 | 57 | export function traverseTree( 58 | cursor: TreeCursor | Tree | SyntaxNode, 59 | { 60 | from = -Infinity, 61 | to = Infinity, 62 | includeParents = false, 63 | beforeEnter, 64 | onEnter, 65 | onLeave, 66 | }: TreeTraversalOptions, 67 | ): void { 68 | if (!(cursor instanceof TreeCursor)) cursor = cursor.cursor() 69 | for (;;) { 70 | let node = cursorNode(cursor) 71 | let leave = false 72 | if (node.from <= to && node.to >= from) { 73 | const enter = !node.type.isAnonymous && (includeParents || (node.from >= from && node.to <= to)) 74 | if (enter && beforeEnter) beforeEnter(cursor) 75 | node.isLeaf = !cursor.firstChild() 76 | if (enter) { 77 | leave = true 78 | if (onEnter(node) === false) return 79 | } 80 | if (!node.isLeaf) continue 81 | } 82 | for (;;) { 83 | node = cursorNode(cursor, node.isLeaf) 84 | if (leave && onLeave) if (onLeave(node) === false) return 85 | leave = cursor.type.isAnonymous 86 | node.isLeaf = false 87 | if (cursor.nextSibling()) break 88 | if (!cursor.parent()) return 89 | leave = true 90 | } 91 | } 92 | } 93 | 94 | function isChildOf(child: CursorNode, parent: CursorNode): boolean { 95 | return ( 96 | child.from >= parent.from && child.from <= parent.to && child.to <= parent.to && child.to >= parent.from 97 | ) 98 | } 99 | 100 | export function validatorTraversal( 101 | input: Input | string, 102 | { fullMatch = true }: { fullMatch?: boolean } = {}, 103 | ) { 104 | if (typeof input === "string") input = new StringInput(input) 105 | const state = { 106 | valid: true, 107 | parentNodes: [] as CursorNode[], 108 | lastLeafTo: 0, 109 | } 110 | return { 111 | state, 112 | traversal: { 113 | onEnter(node) { 114 | state.valid = true 115 | if (!node.isLeaf) state.parentNodes.unshift(node) 116 | if (node.from > node.to || node.from < state.lastLeafTo) { 117 | state.valid = false 118 | } else if (node.isLeaf) { 119 | if (state.parentNodes.length && !isChildOf(node, state.parentNodes[0])) state.valid = false 120 | state.lastLeafTo = node.to 121 | } else { 122 | if (state.parentNodes.length) { 123 | if (!isChildOf(node, state.parentNodes[0])) state.valid = false 124 | } else if (fullMatch && (node.from !== 0 || node.to !== input.length)) { 125 | state.valid = false 126 | } 127 | } 128 | }, 129 | onLeave(node) { 130 | if (!node.isLeaf) state.parentNodes.shift() 131 | }, 132 | } as TreeTraversal, 133 | } 134 | } 135 | 136 | export function validateTree( 137 | tree: TreeCursor | Tree | SyntaxNode, 138 | input: Input | string, 139 | options?: { fullMatch?: boolean }, 140 | ): boolean { 141 | const { state, traversal } = validatorTraversal(input, options) 142 | traverseTree(tree, traversal) 143 | return state.valid 144 | } 145 | 146 | enum Color { 147 | Red = 31, 148 | Green = 32, 149 | Yellow = 33, 150 | } 151 | 152 | function colorize(value: any, color: number): string { 153 | // return "\u001b[" + color + "m" + String(value) + "\u001b[39m" 154 | return String(value) 155 | } 156 | 157 | type PrintTreeOptions = { from?: number; to?: number; start?: number; includeParents?: boolean } 158 | 159 | export function printTree( 160 | cursor: TreeCursor | Tree | SyntaxNode, 161 | input: Input | string, 162 | { from, to, start = 0, includeParents }: PrintTreeOptions = {}, 163 | ): string { 164 | const inp = typeof input === "string" ? new StringInput(input) : input 165 | const text = Text.of(inp.read(0, inp.length).split("\n")) 166 | const state = { 167 | output: "", 168 | prefixes: [] as string[], 169 | hasNextSibling: false, 170 | } 171 | const validator = validatorTraversal(inp) 172 | traverseTree(cursor, { 173 | from, 174 | to, 175 | includeParents, 176 | beforeEnter(cursor) { 177 | state.hasNextSibling = cursor.nextSibling() && cursor.prevSibling() 178 | }, 179 | onEnter(node) { 180 | validator.traversal.onEnter(node) 181 | const isTop = state.output === "" 182 | const hasPrefix = !isTop || node.from > 0 183 | if (hasPrefix) { 184 | state.output += (!isTop ? "\n" : "") + state.prefixes.join("") 185 | if (state.hasNextSibling) { 186 | state.output += " ├─ " 187 | state.prefixes.push(" │ ") 188 | } else { 189 | state.output += " └─ " 190 | state.prefixes.push(" ") 191 | } 192 | } 193 | const hasRange = node.from !== node.to 194 | state.output += 195 | (node.type.isError || !validator.state.valid ? colorize(node.type.name, Color.Red) : node.type.name) + 196 | " " + 197 | (hasRange 198 | ? "[" + 199 | colorize(locAt(text, start + node.from), Color.Yellow) + 200 | ".." + 201 | colorize(locAt(text, start + node.to), Color.Yellow) + 202 | "]" 203 | : colorize(locAt(text, start + node.from), Color.Yellow)) 204 | if (hasRange && node.isLeaf) { 205 | state.output += ": " + colorize(JSON.stringify(inp.read(node.from, node.to)), Color.Green) 206 | } 207 | }, 208 | onLeave(node) { 209 | validator.traversal.onLeave!(node) 210 | state.prefixes.pop() 211 | }, 212 | }) 213 | return state.output 214 | } 215 | 216 | function locAt(text: Text, pos: number): string { 217 | const line = text.lineAt(pos) 218 | return line.number + ":" + (pos - line.from) 219 | } 220 | 221 | export function logTree( 222 | tree: TreeCursor | Tree | SyntaxNode, 223 | input: string, 224 | options?: PrintTreeOptions, 225 | ): void { 226 | console.log(printTree(tree, input, options)) 227 | } 228 | -------------------------------------------------------------------------------- /dev/vite.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: [], 3 | root: "dev", 4 | server: { 5 | host: '0.0.0.0', 6 | hmr: { 7 | clientPort: 443, 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /dev/watch.cjs: -------------------------------------------------------------------------------- 1 | const {watch} = require("@codemirror/buildhelper") 2 | const {resolve} = require("path") 3 | 4 | let args = process.argv.slice(2) 5 | 6 | console.log(args) 7 | 8 | if (args.length != 1) { 9 | console.log("Usage: cm-buildhelper src/mainfile.ts") 10 | process.exit(1) 11 | } 12 | 13 | watch([resolve(args[0])]) -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@replit/codemirror-lang-svelte", 3 | "description": "Svelte language support for CodeMirror6", 4 | "version": "6.0.0", 5 | "author": { 6 | "name": "Brian Pool", 7 | "email": "brian@repl.it" 8 | }, 9 | "type": "module", 10 | "main": "dist/index.cjs", 11 | "exports": { 12 | "import": "./dist/index.js", 13 | "require": "./dist/index.cjs" 14 | }, 15 | "types": "dist/index.d.ts", 16 | "module": "dist/index.js", 17 | "sideEffects": false, 18 | "license": "MIT", 19 | "scripts": { 20 | "dev": "npm run build && run-p dev-cm dev-vite", 21 | "dev-vite": "vite ./dev", 22 | "dev-cm": "node ./dev/watch.cjs src/index.ts", 23 | "build": "cm-buildhelper src/index.ts", 24 | "test": "cm-runtests", 25 | "publish": "npm run build && npm publish", 26 | "format": "prettier src/* --write --ignore-unknown" 27 | }, 28 | "peerDependencies": { 29 | "@codemirror/autocomplete": "^6.0.0", 30 | "@codemirror/lang-css": "^6.0.1", 31 | "@codemirror/lang-html": "^6.2.0", 32 | "@codemirror/lang-javascript": "^6.1.1", 33 | "@codemirror/language": "^6.0.0", 34 | "@codemirror/state": "^6.0.0", 35 | "@codemirror/view": "^6.0.0", 36 | "@lezer/common": "^1.0.0", 37 | "@lezer/highlight": "^1.0.0", 38 | "@lezer/javascript": "^1.2.0", 39 | "@lezer/lr": "^1.0.0" 40 | }, 41 | "devDependencies": { 42 | "@codemirror/autocomplete": "^6.0.0", 43 | "@codemirror/buildhelper": "^0.1.16", 44 | "@codemirror/lang-css": "^6.0.1", 45 | "@codemirror/lang-html": "^6.2.0", 46 | "@codemirror/lang-javascript": "^6.1.1", 47 | "@codemirror/language": "^6.0.0", 48 | "@codemirror/state": "^6.0.0", 49 | "@codemirror/theme-one-dark": "^6.0.0", 50 | "@codemirror/view": "^6.0.0", 51 | "@lezer/common": "^1.0.0", 52 | "@lezer/generator": "^1.0.0", 53 | "@lezer/highlight": "^1.0.0", 54 | "@lezer/javascript": "^1.2.0", 55 | "@lezer/lr": "^1.0.0", 56 | "codemirror": "^6.0.0", 57 | "npm-run-all": "^4.1.5", 58 | "prettier": "^2.8.0", 59 | "vite": "^2.9.17" 60 | }, 61 | "repository": { 62 | "type": "git", 63 | "url": "https://github.com/replit/codemirror-lang-svelte.git" 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /replit.nix: -------------------------------------------------------------------------------- 1 | { pkgs }: { 2 | deps = [ 3 | pkgs.nodePackages.prettier 4 | pkgs.nodejs-16_x 5 | pkgs.nodePackages.yarn 6 | pkgs.nodePackages.typescript-language-server 7 | ]; 8 | } -------------------------------------------------------------------------------- /src/content.js: -------------------------------------------------------------------------------- 1 | import { 2 | ShortExpression, 3 | LongExpression, 4 | ScriptText, 5 | StyleText, 6 | TextareaText, 7 | Element 8 | } from "./syntax.grammar.terms" 9 | import { parseMixed } from "@lezer/common" 10 | import { parser as javascriptParser } from "@lezer/javascript" 11 | 12 | function getAttrs(element, input) { 13 | let attrs = Object.create(null) 14 | for (let att of element.firstChild.getChildren("Attribute")) { 15 | let name = att.getChild("AttributeName"), 16 | value = att.getChild("AttributeValue") || att.getChild("UnquotedAttributeValue") 17 | if (name) 18 | attrs[input.read(name.from, name.to)] = !value 19 | ? "" 20 | : value.name == "AttributeValue" 21 | ? input.read(value.from + 1, value.to - 1) 22 | : input.read(value.from, value.to) 23 | } 24 | return attrs 25 | } 26 | 27 | function maybeNest(node, input, tags) { 28 | let attrs 29 | for (let tag of tags) { 30 | if (!tag.attrs || tag.attrs(attrs || (attrs = getAttrs(node.node.parent, input)))) 31 | return { parser: tag.parser } 32 | } 33 | return null 34 | } 35 | 36 | const expressionParser = javascriptParser.configure({ top: "SingleExpression" }) 37 | 38 | // tags: { 39 | // tag: "script" | "style" | "textarea", 40 | // attrs?: ({[attr: string]: string}) => boolean, 41 | // parser: Parser 42 | // }[] 43 | 44 | export function configureNesting(tags) { 45 | let script = [], 46 | style = [], 47 | textarea = [] 48 | for (let tag of tags) { 49 | let array = 50 | tag.tag == "script" 51 | ? script 52 | : tag.tag == "style" 53 | ? style 54 | : tag.tag == "textarea" 55 | ? textarea 56 | : null 57 | if (!array) 58 | throw new RangeError( 59 | "Only script, style, and textarea tags can host nested parsers" 60 | ) 61 | array.push(tag) 62 | } 63 | return parseMixed((node, input) => { 64 | let id = node.type.id 65 | if (id === LongExpression) return { parser: expressionParser } 66 | if (id === ShortExpression) return { parser: expressionParser } 67 | if (id === ScriptText) return maybeNest(node, input, script) 68 | if (id === StyleText) return maybeNest(node, input, style) 69 | if (id === TextareaText) return maybeNest(node, input, textarea) 70 | return null 71 | }) 72 | } 73 | -------------------------------------------------------------------------------- /src/highlight.ts: -------------------------------------------------------------------------------- 1 | import { styleTags, tags as t } from "@lezer/highlight" 2 | 3 | export const svelteHighlighting = styleTags({ 4 | "Text RawText": t.content, 5 | "StartTag StartCloseTag SelfClosingEndTag EndTag": t.angleBracket, 6 | "TagName": t.tagName, 7 | "MismatchedCloseTag/TagName": [t.tagName, t.invalid], 8 | "AttributeName": t.attributeName, 9 | "UnquotedAttributeValue": t.attributeValue, 10 | "DoubleQuote SingleQuote AttributeValueContent": t.attributeValue, 11 | "Is": t.definitionOperator, 12 | "EntityReference CharacterReference": t.character, 13 | "Comment": t.blockComment, 14 | "ProcessingInst": t.processingInstruction, 15 | "DoctypeDecl": t.documentMeta, 16 | "{ }": t.bracket, 17 | "[ ]": t.squareBracket, 18 | "( )": t.paren, 19 | "| , :": t.punctuation, 20 | "...": t.derefOperator, 21 | "ComponentName": t.className, 22 | "SvelteElementNamespace": t.namespace, 23 | "SvelteElementType": t.tagName, 24 | "StyleAttributeName": t.propertyName, 25 | "BlockType": t.controlKeyword, 26 | "BlockPrefix": t.typeOperator, 27 | "UnknownBlock/BlockType": t.invalid, 28 | "UnknownBlockContent": t.invalid, 29 | "if then catch": t.controlKeyword, 30 | "as": t.definitionOperator, 31 | "Variable": t.variableName, 32 | "Modifier": t.modifier, 33 | "DirectlyInterpolatedAttributeValue": t.attributeValue, 34 | "DirectiveOn/DirectiveName": t.controlKeyword, 35 | "DirectiveOn/DirectiveTarget": t.typeName, 36 | "DirectiveUse/DirectiveName": t.controlKeyword, 37 | "DirectiveUse/DirectiveTarget": t.function(t.variableName), 38 | "DirectiveBind/DirectiveName": t.controlKeyword, 39 | "DirectiveBind/DirectiveTarget": t.variableName, 40 | "DirectiveLet/DirectiveName": t.definitionKeyword, 41 | "DirectiveLet/DirectiveTarget": t.definition(t.variableName), 42 | "DirectiveTransition/DirectiveName": t.operatorKeyword, 43 | "DirectiveTransition/DirectiveTarget": t.function(t.variableName), 44 | "DirectiveIn/DirectiveName": t.operatorKeyword, 45 | "DirectiveIn/DirectiveTarget": t.function(t.variableName), 46 | "DirectiveOut/DirectiveName": t.operatorKeyword, 47 | "DirectiveOut/DirectiveTarget": t.function(t.variableName), 48 | "DirectiveAnimate/DirectiveName": t.operatorKeyword, 49 | "DirectiveAnimate/DirectiveTarget": t.function(t.variableName), 50 | "DirectiveClass/DirectiveName": t.attributeName, 51 | "DirectiveClass/DirectiveTarget": t.variableName, 52 | "DirectiveStyle/DirectiveName": t.attributeName, 53 | "DirectiveStyle/DirectiveTarget": t.propertyName 54 | }) 55 | -------------------------------------------------------------------------------- /src/html-tokens.js: -------------------------------------------------------------------------------- 1 | import { ExternalTokenizer, ContextTracker } from "@lezer/lr" 2 | import { 3 | StartTag, 4 | StartCloseTag, 5 | NoMatchStartCloseTag, 6 | MismatchedStartCloseTag, 7 | missingCloseTag, 8 | StartSelfClosingTag, 9 | IncompleteCloseTag, 10 | Element, 11 | OpenTag, 12 | StartScriptTag, 13 | scriptText, 14 | StartCloseScriptTag, 15 | StartStyleTag, 16 | styleText, 17 | StartCloseStyleTag, 18 | StartTextareaTag, 19 | textareaText, 20 | StartCloseTextareaTag 21 | } from "./syntax.grammar.terms" 22 | 23 | const selfClosers = { 24 | area: true, 25 | base: true, 26 | br: true, 27 | col: true, 28 | command: true, 29 | embed: true, 30 | frame: true, 31 | hr: true, 32 | img: true, 33 | input: true, 34 | keygen: true, 35 | link: true, 36 | meta: true, 37 | param: true, 38 | source: true, 39 | track: true, 40 | wbr: true, 41 | menuitem: true 42 | } 43 | 44 | const implicitlyClosed = { 45 | dd: true, 46 | li: true, 47 | optgroup: true, 48 | option: true, 49 | p: true, 50 | rp: true, 51 | rt: true, 52 | tbody: true, 53 | td: true, 54 | tfoot: true, 55 | th: true, 56 | tr: true 57 | } 58 | 59 | const closeOnOpen = { 60 | dd: { dd: true, dt: true }, 61 | dt: { dd: true, dt: true }, 62 | li: { li: true }, 63 | option: { option: true, optgroup: true }, 64 | optgroup: { optgroup: true }, 65 | p: { 66 | address: true, 67 | article: true, 68 | aside: true, 69 | blockquote: true, 70 | dir: true, 71 | div: true, 72 | dl: true, 73 | fieldset: true, 74 | footer: true, 75 | form: true, 76 | h1: true, 77 | h2: true, 78 | h3: true, 79 | h4: true, 80 | h5: true, 81 | h6: true, 82 | header: true, 83 | hgroup: true, 84 | hr: true, 85 | menu: true, 86 | nav: true, 87 | ol: true, 88 | p: true, 89 | pre: true, 90 | section: true, 91 | table: true, 92 | ul: true 93 | }, 94 | rp: { rp: true, rt: true }, 95 | rt: { rp: true, rt: true }, 96 | tbody: { tbody: true, tfoot: true }, 97 | td: { td: true, th: true }, 98 | tfoot: { tbody: true }, 99 | th: { td: true, th: true }, 100 | thead: { tbody: true, tfoot: true }, 101 | tr: { tr: true } 102 | } 103 | 104 | function nameChar(ch) { 105 | return ( 106 | ch == 45 || 107 | ch == 46 || 108 | ch == 58 || 109 | (ch >= 65 && ch <= 90) || 110 | ch == 95 || 111 | (ch >= 97 && ch <= 122) || 112 | ch >= 161 113 | ) 114 | } 115 | 116 | function isSpace(ch) { 117 | return ch == 9 || ch == 10 || ch == 13 || ch == 32 118 | } 119 | 120 | let cachedName = null, 121 | cachedInput = null, 122 | cachedPos = 0 123 | function tagNameAfter(input, offset) { 124 | let pos = input.pos + offset 125 | if (cachedPos == pos && cachedInput == input) return cachedName 126 | let next = input.peek(offset) 127 | while (isSpace(next)) next = input.peek(++offset) 128 | let name = "" 129 | for (;;) { 130 | if (!nameChar(next)) break 131 | name += String.fromCharCode(next) 132 | next = input.peek(++offset) 133 | } 134 | // Undefined to signal there's a -1 171 | ? new ElementContext(tagNameAfter(input, 1) || "", context) 172 | : context 173 | }, 174 | reduce(context, term) { 175 | return term == Element && context ? context.parent : context 176 | }, 177 | reuse(context, node, stack, input) { 178 | let type = node.type.id 179 | return type == StartTag || type == OpenTag 180 | ? new ElementContext(tagNameAfter(input, 1) || "", context) 181 | : context 182 | }, 183 | hash(context) { 184 | return context ? context.hash : 0 185 | }, 186 | strict: false 187 | }) 188 | 189 | export const tagStart = new ExternalTokenizer( 190 | (input, stack) => { 191 | if (input.next != lessThan) { 192 | // End of file, close any open tags 193 | if (input.next < 0 && stack.context) input.acceptToken(missingCloseTag) 194 | return 195 | } 196 | input.advance() 197 | let close = input.next == slash 198 | if (close) input.advance() 199 | let name = tagNameAfter(input, 0) 200 | if (name === undefined) return 201 | if (!name) return input.acceptToken(close ? IncompleteCloseTag : StartTag) 202 | 203 | let parent = stack.context ? stack.context.name : null 204 | if (close) { 205 | if (name == parent) return input.acceptToken(StartCloseTag) 206 | if (parent && implicitlyClosed[parent]) 207 | return input.acceptToken(missingCloseTag, -2) 208 | // if (stack.dialectEnabled(Dialect_noMatch)) return input.acceptToken(NoMatchStartCloseTag) 209 | for (let cx = stack.context; cx; cx = cx.parent) if (cx.name == name) return 210 | input.acceptToken(MismatchedStartCloseTag) 211 | } else { 212 | if (name == "script") return input.acceptToken(StartScriptTag) 213 | if (name == "style") return input.acceptToken(StartStyleTag) 214 | if (name == "textarea") return input.acceptToken(StartTextareaTag) 215 | if (selfClosers.hasOwnProperty(name)) return input.acceptToken(StartSelfClosingTag) 216 | if (parent && closeOnOpen[parent] && closeOnOpen[parent][name]) 217 | input.acceptToken(missingCloseTag, -1) 218 | else input.acceptToken(StartTag) 219 | } 220 | }, 221 | { contextual: true } 222 | ) 223 | 224 | function contentTokenizer(tag, textToken, endToken) { 225 | let lastState = 2 + tag.length 226 | return new ExternalTokenizer(input => { 227 | // state means: 228 | // - 0 nothing matched 229 | // - 1 '<' matched 230 | // - 2 '= 2 && state < lastState && input.next == tag.charCodeAt(state - 2)) 242 | ) { 243 | state++ 244 | matchedLen++ 245 | } else if ((state == 2 || state == lastState) && isSpace(input.next)) { 246 | matchedLen++ 247 | } else if (state == lastState && input.next == greaterThan) { 248 | if (i > matchedLen) input.acceptToken(textToken, -matchedLen) 249 | else input.acceptToken(endToken, -(matchedLen - 2)) 250 | break 251 | } else if ((input.next == 10 /* '\n' */ || input.next == 13) /* '\r' */ && i) { 252 | input.acceptToken(textToken, 1) 253 | break 254 | } else { 255 | state = matchedLen = 0 256 | } 257 | input.advance() 258 | } 259 | }) 260 | } 261 | 262 | export const scriptTokens = contentTokenizer("script", scriptText, StartCloseScriptTag) 263 | 264 | export const styleTokens = contentTokenizer("style", styleText, StartCloseStyleTag) 265 | 266 | export const textareaTokens = contentTokenizer( 267 | "textarea", 268 | textareaText, 269 | StartCloseTextareaTag 270 | ) 271 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { parser as svelteParser } from "./syntax.grammar" 2 | import { 3 | LRLanguage, 4 | LanguageSupport, 5 | indentNodeProp, 6 | foldNodeProp, 7 | syntaxTree 8 | } from "@codemirror/language" 9 | import { Parser, SyntaxNode } from "@lezer/common" 10 | import { cssLanguage, css } from "@codemirror/lang-css" 11 | import { 12 | javascriptLanguage, 13 | typescriptLanguage, 14 | javascript 15 | } from "@codemirror/lang-javascript" 16 | import { configureNesting } from "./content.js" 17 | import { htmlCompletionSource } from "@codemirror/lang-html" 18 | import { EditorView } from "@codemirror/view" 19 | import { EditorSelection, Text } from "@codemirror/state" 20 | 21 | type NestedLang = { 22 | tag: "script" | "style" | "textarea" 23 | attrs?: (attrs: { [attr: string]: string }) => boolean 24 | parser: Parser 25 | } 26 | 27 | const defaultNesting: NestedLang[] = [ 28 | { 29 | tag: "script", 30 | attrs: attrs => attrs.type === "text/typescript" || attrs.lang === "ts", 31 | parser: typescriptLanguage.parser 32 | }, 33 | { 34 | tag: "script", 35 | attrs(attrs) { 36 | return ( 37 | !attrs.type || 38 | /^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i.test(attrs.type) 39 | ) 40 | }, 41 | parser: javascriptLanguage.parser 42 | }, 43 | { 44 | tag: "style", 45 | attrs(attrs) { 46 | return ( 47 | (!attrs.lang || attrs.lang === "css" || attrs.lang === "scss") && 48 | (!attrs.type || /^(text\/)?(x-)?(stylesheet|css|scss)$/i.test(attrs.type)) 49 | ) 50 | }, 51 | parser: cssLanguage.parser 52 | } 53 | ] 54 | 55 | export { svelteParser } 56 | 57 | export const svelteLanguage = LRLanguage.define({ 58 | // @ts-expect-error 59 | parser: svelteParser.configure({ 60 | wrap: configureNesting(defaultNesting), 61 | 62 | props: [ 63 | indentNodeProp.add({ 64 | "Element": context => { 65 | let after = /^(\s*)(<\/)?/.exec(context.textAfter)! 66 | if (context.node.to <= context.pos + after[0].length) return context.continue() 67 | return context.lineIndent(context.node.from) + (after[2] ? 0 : context.unit) 68 | }, 69 | 70 | "Block": context => { 71 | const node = context.node 72 | const text = context.textAfter.trim() 73 | 74 | if (text.startsWith("{/")) { 75 | const name = node.name 76 | if ( 77 | (name === "IfBlock" && text.startsWith("{/if")) || 78 | (name === "EachBlock" && text.startsWith("{/each")) || 79 | (name === "AwaitBlock" && text.startsWith("{/await")) || 80 | (name === "KeyBlock" && text.startsWith("{/key")) 81 | ) { 82 | return context.lineIndent(context.node.from) 83 | } 84 | 85 | return null 86 | } 87 | 88 | if (node.name === "IfBlock" || node.name === "EachBlock") { 89 | if (text.startsWith("{:else")) return context.lineIndent(node.from) 90 | } else if (node.name === "AwaitBlock") { 91 | if (text.startsWith("{:then")) return context.lineIndent(node.from) 92 | if (text.startsWith("{:catch")) return context.lineIndent(node.from) 93 | } 94 | 95 | // not sure if this needed to be duplicated 96 | let after = /^(\s*)(<\/)?/.exec(context.textAfter)! 97 | if (context.node.to <= context.pos + after[0].length) return context.continue() 98 | return context.lineIndent(context.node.from) + (after[2] ? 0 : context.unit) 99 | }, 100 | 101 | "BlockOpen BlockClose BlockInline": context => { 102 | return context.column(context.node.from) + context.unit 103 | }, 104 | 105 | "OpenTag CloseTag SelfClosingTag": context => { 106 | return context.column(context.node.from) + context.unit 107 | }, 108 | 109 | "Document": context => { 110 | if (context.pos + /\s*/.exec(context.textAfter)![0].length < context.node.to) { 111 | return context.continue() 112 | } 113 | 114 | let endElt: SyntaxNode | null = null 115 | let close: SyntaxNode 116 | 117 | for (let cur = context.node; ; ) { 118 | let last = cur.lastChild 119 | if (!last || last.name != "Element" || last.to != cur.to) break 120 | endElt = cur = last 121 | } 122 | 123 | if ( 124 | endElt && 125 | !( 126 | (close = endElt.lastChild) && 127 | (close.name === "CloseTag" || close.name === "SelfClosingTag") 128 | ) 129 | ) { 130 | return context.lineIndent(endElt.from) + context.unit 131 | } 132 | 133 | return null 134 | } 135 | }), 136 | 137 | foldNodeProp.add({ 138 | "Block": node => { 139 | const open = `${node.name}Open` 140 | const close = `${node.name}Close` 141 | 142 | const first = node.firstChild 143 | const last = node.lastChild 144 | 145 | if (!first || first.name !== open) return null 146 | 147 | return { from: first.to, to: last?.name === close ? last.from : node.to } 148 | }, 149 | 150 | "Element": node => { 151 | let first = node.firstChild 152 | let last = node.lastChild! 153 | if (!first || first.name != "OpenTag") return null 154 | return { from: first.to, to: last.name === "CloseTag" ? last.from : node.to } 155 | } 156 | }) 157 | ] 158 | }), 159 | 160 | languageData: { 161 | commentTokens: { block: { open: "" } }, 162 | indentOnInput: /^\s*((<\/\w+\W)|(\{:(else|then|catch))|(\{\/(if|each|await|key)))$/, 163 | wordChars: "-._", 164 | autocomplete: htmlCompletionSource 165 | } 166 | }) 167 | 168 | export function svelte() { 169 | return new LanguageSupport(svelteLanguage, [ 170 | javascript().support, 171 | css().support, 172 | autoCloseTags 173 | ]) 174 | } 175 | 176 | // unfortunately the HTML language explicitly checks for the language type, 177 | // so we have to duplicate the entire autoCloseTags extension 178 | 179 | function elementName(doc: Text, tree: SyntaxNode | null | undefined, max = doc.length) { 180 | if (!tree) return "" 181 | let tag = tree.firstChild 182 | let name = 183 | tag && 184 | (tag.getChild("TagName") || 185 | tag.getChild("ComponentName") || 186 | tag.getChild("SvelteElementName")) 187 | return name ? doc.sliceString(name.from, Math.min(name.to, max)) : "" 188 | } 189 | 190 | const autoCloseTags = EditorView.inputHandler.of((view, from, to, text) => { 191 | if ( 192 | view.composing || 193 | view.state.readOnly || 194 | from != to || 195 | (text != ">" && text != "/") || 196 | !svelteLanguage.isActiveAt(view.state, from, -1) 197 | ) 198 | return false 199 | let { state } = view 200 | let changes = state.changeByRange(range => { 201 | let { head } = range 202 | let around = syntaxTree(state).resolveInner(head, -1) 203 | let name: string 204 | 205 | if ( 206 | around.name === "TagName" || 207 | around.name === "ComponentName" || 208 | around.name === "SvelteElementName" || 209 | around.name === "StartTag" 210 | ) { 211 | around = around.parent! 212 | } 213 | 214 | if (text === ">" && around.name === "OpenTag") { 215 | if ( 216 | around.parent?.lastChild?.name != "CloseTag" && 217 | (name = elementName(state.doc, around.parent, head)) 218 | ) { 219 | let hasRightBracket = view.state.doc.sliceString(head, head + 1) === ">" 220 | let insert = `${hasRightBracket ? "" : ">"}` 221 | return { 222 | range: EditorSelection.cursor(head + 1), 223 | changes: { from: head + (hasRightBracket ? 1 : 0), insert } 224 | } 225 | } 226 | } else if (text === "/" && around.name === "OpenTag") { 227 | let empty = around.parent, 228 | base = empty?.parent 229 | if ( 230 | empty!.from == head - 1 && 231 | base!.lastChild?.name != "CloseTag" && 232 | (name = elementName(state.doc, base, head)) 233 | ) { 234 | let hasRightBracket = view.state.doc.sliceString(head, head + 1) === ">" 235 | let insert = `/${name}${hasRightBracket ? "" : ">"}` 236 | let pos = head + insert.length + (hasRightBracket ? 1 : 0) 237 | return { range: EditorSelection.cursor(pos), changes: { from: head, insert } } 238 | } 239 | } 240 | return { range } 241 | }) 242 | 243 | if (changes.changes.empty) return false 244 | 245 | view.dispatch(changes, { userEvent: "input.type", scrollIntoView: true }) 246 | 247 | return true 248 | }) 249 | -------------------------------------------------------------------------------- /src/syntax.grammar: -------------------------------------------------------------------------------- 1 | @top Document { (entity | DoctypeDecl)* } 2 | 3 | entity[@isGroup=Entity] { 4 | IfBlock | 5 | EachBlock | 6 | AwaitBlock | 7 | KeyBlock | 8 | RawHTMLBlock | 9 | DebugBlock | 10 | ConstBlock | 11 | Interpolation | 12 | UnknownBlock | 13 | Text | 14 | EntityReference | 15 | CharacterReference | 16 | InvalidEntity | 17 | Element | 18 | Comment | 19 | ProcessingInst | 20 | IncompleteCloseTag | 21 | MismatchedCloseTag | 22 | NoMatchCloseTag 23 | } 24 | 25 | IfBlock[group=Block] { 26 | IfBlockOpen (ElseBlock | entity)* IfBlockClose 27 | } 28 | 29 | EachBlock[group=Block] { 30 | EachBlockOpen (ElseBlock | entity)* EachBlockClose 31 | } 32 | 33 | AwaitBlock[group=Block] { 34 | AwaitBlockOpen (ThenBlock | CatchBlock | entity)* AwaitBlockClose 35 | } 36 | 37 | KeyBlock[group=Block] { 38 | KeyBlockOpen entity* KeyBlockClose 39 | } 40 | 41 | Element { 42 | OpenScriptTag ScriptText (CloseScriptTag | missingCloseTag) | 43 | OpenStyleTag StyleText (CloseStyleTag | missingCloseTag) | 44 | OpenTextareaTag TextareaText (CloseTextareaTag | missingCloseTag) | 45 | OpenTag entity* (CloseTag | missingCloseTag) | 46 | SelfClosingTag 47 | } 48 | 49 | ScriptText[group="TextContent Entity"] { scriptText* } 50 | 51 | StyleText[group="TextContent Entity"] { styleText* } 52 | 53 | TextareaText[group="TextContent Entity"] { textareaText* } 54 | 55 | Comment { commentStart commentContent* commentEnd } 56 | 57 | @skip { space } { 58 | OpenTag[closedBy=CloseTag] { 59 | StartTag elementName attr* EndTag 60 | } 61 | 62 | SelfClosingTag { 63 | StartSelfClosingTag TagName attr* EndTag | 64 | StartTag elementName attr* SelfClosingEndTag 65 | } 66 | 67 | MismatchedCloseTag { 68 | MismatchedStartCloseTag elementName EndTag 69 | } 70 | 71 | NoMatchCloseTag[@name=CloseTag] { 72 | NoMatchStartCloseTag elementName EndTag 73 | } 74 | 75 | CloseTag[openedBy=OpenTag] { 76 | StartCloseTag elementName EndTag 77 | } 78 | 79 | OpenScriptTag[@name=OpenTag,closedBy=CloseTag] { 80 | StartScriptTag TagName attr* EndTag 81 | } 82 | 83 | CloseScriptTag[@name=CloseTag,openedBy=OpenTag] { 84 | StartCloseScriptTag TagName EndTag 85 | } 86 | 87 | OpenStyleTag[@name=OpenTag,closedBy=CloseTag] { 88 | StartStyleTag TagName attr* EndTag 89 | } 90 | 91 | CloseStyleTag[@name=CloseTag,openedBy=OpenTag] { 92 | StartCloseStyleTag TagName EndTag 93 | } 94 | 95 | OpenTextareaTag[@name=OpenTag,closedBy=CloseTag] { 96 | StartTextareaTag TagName attr* EndTag 97 | } 98 | 99 | CloseTextareaTag[@name=CloseTag,openedBy=OpenTag] { 100 | StartCloseTextareaTag TagName EndTag 101 | } 102 | 103 | attr { 104 | DirectlyInterpolatedAttribute | 105 | SpreadInterpolatedAttribute | 106 | Directive | 107 | StyleAttribute | 108 | Attribute 109 | } 110 | 111 | DirectlyInterpolatedAttribute { 112 | "{" (DirectlyInterpolatedAttributeValue { identifier })? "}" 113 | } 114 | 115 | SpreadInterpolatedAttribute { 116 | "{" "..." LongExpression "}" 117 | } 118 | 119 | Directive { 120 | directiveStart 121 | ("|" Modifier)* 122 | (Is (AttributeValue | UnquotedAttributeValue))? 123 | } 124 | 125 | StyleAttribute { 126 | StyleAttributeName (Is (AttributeValue | UnquotedAttributeValue))? 127 | } 128 | 129 | Attribute { 130 | AttributeName 131 | ("|" Modifier)* 132 | (Is (AttributeValue | UnquotedAttributeValue))? 133 | } 134 | 135 | IfBlockOpen[group=BlockOpen,closedBy=IfBlockClose] { 136 | "{" pfx<"#"> blk<"if"> LongExpression "}" 137 | } 138 | 139 | IfBlockClose[group=BlockClose,openedBy=IfBlockOpen] { 140 | "{" pfx<"/"> blk<"if"> "}" 141 | } 142 | 143 | ElseBlock[group=BlockInline] { 144 | "{" pfx<":"> blk<"else"> (kw<"if"> LongExpression)? "}" 145 | } 146 | 147 | EachBlockOpen[group=BlockOpen,closedBy=EachBlockClose] { 148 | "{" pfx<"#"> blk<"each"> 149 | ShortExpression 150 | kw<"as"> 151 | ShortExpression 152 | ( 153 | ("(" LongExpression ")") | 154 | ("," Variable? ("(" LongExpression ")")?) 155 | )? 156 | "}" 157 | } 158 | 159 | EachBlockClose[group=BlockClose,openedBy=EachBlockOpen] { 160 | "{" pfx<"/"> blk<"each"> "}" 161 | } 162 | 163 | AwaitBlockOpen[group=BlockOpen,closedBy=AwaitBlockClose] { 164 | "{" pfx<"#"> blk<"await"> 165 | ShortExpression 166 | ((kw<"then"> | kw<"catch">) ShortExpression)? 167 | "}" 168 | } 169 | 170 | AwaitBlockClose[group=BlockClose,closedBy=AwaitBlockOpen] { 171 | "{" pfx<"/"> blk<"await"> "}" 172 | } 173 | 174 | ThenBlock[group=BlockInline] { 175 | "{" pfx<":"> blk<"then"> Variable? "}" 176 | } 177 | 178 | CatchBlock[group=BlockInline] { 179 | "{" pfx<":"> blk<"catch"> Variable? "}" 180 | } 181 | 182 | KeyBlockOpen[group=BlockOpen,closedBy=KeyBlockClose] { 183 | "{" pfx<"#"> blk<"key"> LongExpression "}" 184 | } 185 | 186 | KeyBlockClose[group=BlockClose,openedBy=KeyBlockOpen] { 187 | "{" pfx<"/"> blk<"key"> "}" 188 | } 189 | 190 | RawHTMLBlock[group=BlockInline] { 191 | "{" pfx<"@"> blk<"html"> LongExpression "}" 192 | } 193 | 194 | DebugBlock[group=BlockInline] { 195 | "{" pfx<"@"> blk<"debug"> Variable ("," Variable)* "}" 196 | } 197 | 198 | ConstBlock[group=BlockInline] { 199 | "{" pfx<"@"> blk<"const"> LongExpression "}" 200 | } 201 | 202 | UnknownBlock[group=BlockInline] { 203 | "{" 204 | BlockPrefix 205 | BlockType 206 | UnknownBlockContent? 207 | "}" 208 | } 209 | 210 | Interpolation { 211 | "{" LongExpression "}" 212 | } 213 | } 214 | 215 | elementName { 216 | TagName | 217 | ComponentName | 218 | SvelteElementName 219 | } 220 | 221 | SvelteElementName { 222 | @extend[@name=SvelteElementNamespace] 223 | ":" 224 | SvelteElementType 225 | } 226 | 227 | dr { 228 | dir[@name=Directive{name}] { 229 | dirName[@name=DirectiveName] { @extend } 230 | ":" 231 | DirectiveTarget 232 | } 233 | } 234 | 235 | directiveStart { 236 | dr<"On", "on"> | 237 | dr<"Bind", "bind"> | 238 | dr<"Let", "let"> | 239 | dr<"Class", "class"> | 240 | dr<"Style", "style"> | 241 | dr<"Use", "use"> | 242 | dr<"Transition", "transition"> | 243 | dr<"In", "in"> | 244 | dr<"Out", "out"> | 245 | dr<"Animate", "animate"> 246 | } 247 | 248 | AttributeValue { 249 | Interpolation | 250 | "\"" attributeValueContentDouble? "\"" | 251 | "\'" attributeValueContentSingle? "\'" 252 | } 253 | 254 | attributeValueContentDouble[@name=AttributeValueContent] { 255 | (attributeValueContentCharDouble | attributeValueContentEntity)+ 256 | } 257 | 258 | attributeValueContentSingle[@name=AttributeValueContent] { 259 | (attributeValueContentCharSingle | attributeValueContentEntity)+ 260 | } 261 | 262 | attributeValueContentEntity { 263 | EntityReference | 264 | CharacterReference | 265 | Interpolation | 266 | InvalidEntity 267 | } 268 | 269 | @context elementContext from "./html-tokens.js" 270 | 271 | @external tokens scriptTokens from "./html-tokens.js" { 272 | scriptText 273 | StartCloseScriptTag[@name=StartCloseTag,closedBy=EndTag] 274 | } 275 | 276 | @external tokens styleTokens from "./html-tokens.js" { 277 | styleText 278 | StartCloseStyleTag[@name=StartCloseTag,closedBy=EndTag] 279 | } 280 | 281 | @external tokens textareaTokens from "./html-tokens.js" { 282 | textareaText 283 | StartCloseTextareaTag[@name=StartCloseTag,closedBy=EndTag] 284 | } 285 | 286 | @external tokens tagStart from "./html-tokens.js" { 287 | StartTag[closedBy="EndTag SelfClosingEndTag"], 288 | StartScriptTag[@name=StartTag,closedBy=EndTag], 289 | StartStyleTag[@name=StartTag,closedBy=EndTag], 290 | StartTextareaTag[@name=StartTag,closedBy=EndTag], 291 | StartSelfClosingTag[@name=StartTag,closedBy=EndTag], 292 | StartCloseTag[closedBy=EndTag], 293 | NoMatchStartCloseTag[@name=StartCloseTag,closedBy=EndTag] 294 | MismatchedStartCloseTag[@name=StartCloseTag,closedBy=EndTag], 295 | missingCloseTag, 296 | IncompleteCloseTag 297 | } 298 | 299 | @external tokens commentContent from "./tokens.js" { 300 | commentContent 301 | } 302 | 303 | @external tokens longExpression from "./tokens.js" { 304 | LongExpression 305 | } 306 | 307 | @external tokens shortExpression from "./tokens.js" { 308 | ShortExpression 309 | } 310 | 311 | kw { @specialize[@name={term}] } 312 | 313 | pfx { @extend[@name=BlockPrefix] } 314 | 315 | blk { @specialize[@name=BlockType] } 316 | 317 | @tokens { 318 | "\""[@name=DoubleQuote, openedBy="\"", closedBy="\""] 319 | "\'"[@name=SingleQuote, openedBy="\'", closedBy="\'"] 320 | 321 | "{"[closedBy="}"] 322 | "}"[openedBy="{"] 323 | "("[closedBy="("] 324 | ")"[openedBy=")"] 325 | "["[closedBy="]"] 326 | "]"[openedBy="["] 327 | 328 | "," "|" "..." 329 | 330 | space { (" " | "\t" | "\r" | "\n")+ } 331 | 332 | identifierChar { @asciiLetter | $[_$\u{a1}-\u{10ffff}] } 333 | word { identifierChar (identifierChar | @digit)* } 334 | identifier { word } 335 | 336 | Variable { identifierChar (identifierChar | @digit | ".")* } 337 | 338 | BlockPrefix { "#" | "@" | "/" | ":" } 339 | BlockType { identifier } 340 | 341 | UnknownBlockContent { ![}]+ } 342 | 343 | @precedence { UnknownBlockContent space } 344 | 345 | commentStart { "" } 347 | 348 | EndTag[openedBy="StartTag StartCloseTag"] { "/"? ">" } 349 | SelfClosingEndTag[openedBy=StartTag] { "/>" } 350 | @precedence { SelfClosingEndTag, EndTag } 351 | 352 | tagNameStart { 353 | "_" | 354 | @asciiLowercase | 355 | $[\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D] | 356 | $[\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u{10000}-\u{EFFFF}] 357 | } 358 | 359 | componentNameStart { 360 | @asciiUppercase 361 | } 362 | 363 | nameChar { 364 | "_" | 365 | "-" | 366 | "." | 367 | @asciiLetter | 368 | @digit | 369 | $[\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D] | 370 | $[\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u{10000}-\u{EFFFF}] | 371 | $[\u00B7\u0300-\u036F\u203F-\u2040] 372 | } 373 | 374 | TagName { tagNameStart nameChar* } 375 | 376 | ComponentName { componentNameStart nameChar* } 377 | 378 | SvelteElementType { @asciiLetter+ } 379 | 380 | attributeChar { ![\u0000-\u0020\u007F-\u009F"'>/=|:{\uFDD0-\uFDEF\uFFFE\uFFFF] } 381 | 382 | AttributeName { attributeChar+ } 383 | StyleAttributeName { "--" attributeChar+ } 384 | Modifier { attributeChar+ } 385 | DirectiveTarget { attributeChar+ } 386 | 387 | @precedence { StyleAttributeName AttributeName } 388 | 389 | UnquotedAttributeValue { ![ \t\n\r\u000C=<>"'`{] ![ \t\n\r\u000C=<>"'`]* } 390 | 391 | attributeValueContentCharDouble { !["&{] } 392 | 393 | attributeValueContentCharSingle { !['&{] } 394 | 395 | Is { "=" } 396 | 397 | EntityReference { "&" ![#; ]+ ";" } 398 | 399 | CharacterReference { "&#" ![; ]+ ";" } 400 | 401 | InvalidEntity { "&" } 402 | 403 | @precedence { CharacterReference, EntityReference, InvalidEntity } 404 | 405 | Text[group=TextContent] { ![<&{]+ } 406 | 407 | ProcessingInst { "] piContent | ">" } 411 | 412 | DoctypeDecl { "]* ">" } 413 | 414 | @precedence { commentStart, ProcessingInst, DoctypeDecl } 415 | } 416 | 417 | @external propSource svelteHighlighting from "./highlight" -------------------------------------------------------------------------------- /src/syntax.grammar.d.ts: -------------------------------------------------------------------------------- 1 | import { Parser } from "@lezer/common" 2 | 3 | export declare const parser: Parser 4 | -------------------------------------------------------------------------------- /src/syntax.grammar.terms.d.ts: -------------------------------------------------------------------------------- 1 | export const scriptText = 138, 2 | StartCloseScriptTag = 1, 3 | styleText = 139, 4 | StartCloseStyleTag = 2, 5 | textareaText = 140, 6 | StartCloseTextareaTag = 3, 7 | StartTag = 4, 8 | StartScriptTag = 5, 9 | StartStyleTag = 6, 10 | StartTextareaTag = 7, 11 | StartSelfClosingTag = 8, 12 | StartCloseTag = 9, 13 | MismatchedStartCloseTag = 11, 14 | missingCloseTag = 141, 15 | IncompleteCloseTag = 12, 16 | commentContent = 142, 17 | LongExpression = 13, 18 | ShortExpression = 14, 19 | Element = 62, 20 | ScriptText = 103, 21 | StyleText = 106, 22 | TextareaText = 109, 23 | OpenTag = 111 24 | -------------------------------------------------------------------------------- /src/tokens.ts: -------------------------------------------------------------------------------- 1 | import { ExternalTokenizer, InputStream } from "@lezer/lr" 2 | import { 3 | LongExpression as longExprToken, 4 | ShortExpression as shortExprToken, 5 | commentContent as cmtToken 6 | } from "./syntax.grammar.terms" 7 | 8 | const space = [ 9 | 9, 10, 11, 12, 13, 32, 133, 160, 5760, 8192, 8193, 8194, 8195, 8196, 8197, 8198, 8199, 10 | 8200, 8201, 8202, 8232, 8233, 8239, 8287, 12288 11 | ] 12 | 13 | const parenOpen = 40 14 | const parenClose = 41 15 | const squareOpen = 91 16 | const squareClose = 93 17 | const curlyOpen = 123 18 | const curlyClose = 125 19 | const comma = 44 20 | const colon = 58 21 | const hash = 35 22 | const at = 64 23 | const slash = 47 24 | const greaterThan = 62 25 | const dash = 45 26 | const quoteDouble = 34 27 | const quoteSingle = 39 28 | const backslash = 92 29 | const newline = 10 30 | const asterisk = 42 31 | const tick = 96 32 | 33 | const prefixes = [colon, hash, at, slash] 34 | 35 | export const commentContent = new ExternalTokenizer(input => { 36 | for (let dashes = 0, i = 0; ; i++) { 37 | if (input.next < 0) { 38 | if (i) input.acceptToken(cmtToken) 39 | break 40 | } 41 | if (input.next == dash) { 42 | dashes++ 43 | } else if (input.next == greaterThan && dashes >= 2) { 44 | if (i > 3) input.acceptToken(cmtToken, -2) 45 | break 46 | } else { 47 | dashes = 0 48 | } 49 | input.advance() 50 | } 51 | }) 52 | 53 | // TODO: string handler does not handle interpolation 54 | 55 | function createStringHandler(input: InputStream) { 56 | let inString = false 57 | let inStringType: "double" | "single" | "template" | null = null 58 | let inStringIgnoreNext = false 59 | 60 | return () => { 61 | if (inString) { 62 | if (inStringIgnoreNext) { 63 | inStringIgnoreNext = false 64 | return true 65 | } 66 | 67 | if (input.next === backslash) { 68 | inStringIgnoreNext = true 69 | return true 70 | } 71 | 72 | if (inStringType === "double" && input.next === quoteDouble) { 73 | inString = false 74 | inStringType = null 75 | return true 76 | } 77 | 78 | if (inStringType === "single" && input.next === quoteSingle) { 79 | inString = false 80 | inStringType = null 81 | return true 82 | } 83 | 84 | if (inStringType === "template" && input.next === tick) { 85 | inString = false 86 | inStringType = null 87 | return true 88 | } 89 | 90 | return true 91 | } 92 | 93 | if (input.next === quoteDouble) { 94 | inString = true 95 | inStringType = "double" 96 | return true 97 | } 98 | 99 | if (input.next === quoteSingle) { 100 | inString = true 101 | inStringType = "single" 102 | return true 103 | } 104 | 105 | if (input.next === tick) { 106 | inString = true 107 | inStringType = "template" 108 | return true 109 | } 110 | 111 | return false 112 | } 113 | } 114 | 115 | function createCommentHandler(input: InputStream) { 116 | let inLineComment = false 117 | let inBlockComment = false 118 | 119 | return () => { 120 | if (inLineComment) { 121 | if (input.next === newline) { 122 | inLineComment = false 123 | return true 124 | } 125 | 126 | return true 127 | } 128 | 129 | if (inBlockComment) { 130 | if (input.next === asterisk && input.peek(1) === slash) { 131 | inBlockComment = false 132 | return true 133 | } 134 | 135 | return true 136 | } 137 | 138 | if (input.next === slash && input.peek(1) === slash) { 139 | inLineComment = true 140 | return true 141 | } 142 | 143 | if (input.next === slash && input.peek(1) === asterisk) { 144 | inBlockComment = true 145 | return true 146 | } 147 | 148 | return false 149 | } 150 | } 151 | 152 | // closes on a delimiter that probably isn't in the expression 153 | export const longExpression = new ExternalTokenizer(input => { 154 | if (prefixes.includes(input.next)) { 155 | return 156 | } 157 | 158 | const commentHandler = createCommentHandler(input) 159 | const stringHandler = createStringHandler(input) 160 | 161 | let stack: ("(" | "{" | "[")[] = [] 162 | 163 | const popIfMatch = (match: "(" | "{" | "[") => { 164 | const idx = stack.lastIndexOf(match) 165 | if (idx !== -1) { 166 | while (stack.length > idx) { 167 | stack.pop() 168 | } 169 | } 170 | } 171 | 172 | for (let pos = 0; ; pos++) { 173 | // end of input 174 | if (input.next < 0) { 175 | if (pos > 0) input.acceptToken(longExprToken) 176 | break 177 | } 178 | 179 | if (commentHandler() || stringHandler()) { 180 | input.advance() 181 | continue 182 | } 183 | 184 | if ( 185 | stack.length === 0 && 186 | (input.next === curlyClose || 187 | input.next === parenClose || 188 | input.next === squareClose) 189 | ) { 190 | input.acceptToken(longExprToken) 191 | break 192 | } 193 | 194 | // prettier-ignore 195 | switch (input.next) { 196 | case parenOpen: stack.push("("); break 197 | case parenClose: popIfMatch("("); break 198 | case squareOpen: stack.push("["); break 199 | case squareClose: popIfMatch("["); break 200 | case curlyOpen: stack.push("{"); break 201 | case curlyClose: popIfMatch("{"); break 202 | } 203 | 204 | input.advance() 205 | } 206 | }) 207 | 208 | // same as long expression but will close on either a space or comma 209 | // that is reasonably not inside of the expression 210 | export const shortExpression = new ExternalTokenizer(input => { 211 | if (prefixes.includes(input.peek(0))) { 212 | return 213 | } 214 | 215 | const commentHandler = createCommentHandler(input) 216 | const stringHandler = createStringHandler(input) 217 | 218 | let stack: ("(" | "{" | "[")[] = [] 219 | 220 | const popIfMatch = (match: "(" | "{" | "[") => { 221 | const idx = stack.lastIndexOf(match) 222 | if (idx !== -1) { 223 | while (stack.length > idx) { 224 | stack.pop() 225 | } 226 | } 227 | } 228 | 229 | for (let pos = 0; ; pos++) { 230 | // end of input 231 | if (input.next < 0) { 232 | if (pos > 0) input.acceptToken(shortExprToken) 233 | break 234 | } 235 | 236 | if (commentHandler() || stringHandler()) { 237 | input.advance() 238 | continue 239 | } 240 | 241 | if ( 242 | stack.length === 0 && 243 | (input.next === curlyClose || 244 | input.next === parenClose || 245 | input.next === squareClose || 246 | input.next === comma 247 | ) 248 | ) { 249 | input.acceptToken(shortExprToken) 250 | break 251 | } 252 | 253 | // prettier-ignore 254 | switch (input.next) { 255 | case parenOpen: stack.push("("); break 256 | case parenClose: popIfMatch("("); break 257 | case squareOpen: stack.push("["); break 258 | case squareClose: popIfMatch("["); break 259 | case curlyOpen: stack.push("{"); break 260 | case curlyClose: popIfMatch("{"); break 261 | } 262 | 263 | if (pos !== 0 && stack.length === 0 && space.includes(input.next)) { 264 | input.acceptToken(shortExprToken) 265 | break 266 | } 267 | 268 | input.advance() 269 | } 270 | }) 271 | -------------------------------------------------------------------------------- /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.4" 28 | resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.3.4.tgz#dd22f0a0220718e1f6e3b48319649859b6c929b6" 29 | integrity sha512-irxKsTSjS0OkfMWWt9YxtNK97++/E+XIHfKnRpSVfZyHzda/amYF0BR+T8mMkrGQWidx2zApxHx08GT13egyQA== 30 | dependencies: 31 | "@codemirror/language" "^6.0.0" 32 | "@codemirror/state" "^6.0.0" 33 | "@codemirror/view" "^6.6.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.2" 56 | resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.1.2.tgz#84fb7d170047c3aeb7b0047ace59510bb19208de" 57 | integrity sha512-sO3jdX1s0pam6lIdeSJLMN3DQ6mPEbM4yLvyKkdqtmd/UDwhXA5+AwFJ89rRXm6vTeOXBsE5cAmlos/t7MJdgg== 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-css@^6.0.0", "@codemirror/lang-css@^6.0.1": 65 | version "6.0.1" 66 | resolved "https://registry.yarnpkg.com/@codemirror/lang-css/-/lang-css-6.0.1.tgz#470fff614e4cfbbe796ec43103420d59c797dd7a" 67 | integrity sha512-rlLq1Dt0WJl+2epLQeAsfqIsx3lGu4HStHCJu95nGGuz2P2fNugbU3dQYafr2VRjM4eMC9HviI6jvS98CNtG5w== 68 | dependencies: 69 | "@codemirror/autocomplete" "^6.0.0" 70 | "@codemirror/language" "^6.0.0" 71 | "@codemirror/state" "^6.0.0" 72 | "@lezer/css" "^1.0.0" 73 | 74 | "@codemirror/lang-html@^6.2.0": 75 | version "6.3.1" 76 | resolved "https://registry.yarnpkg.com/@codemirror/lang-html/-/lang-html-6.3.1.tgz#01094bf141794e47f050000adce44c10c6533871" 77 | integrity sha512-36PoquiZ1S8HW0mF2hupZYPajYgpSwK27YDPOOwMk4jFW+shkS79I7mSNmYlDBkgRS8p3ldfh3dG2/HknwsawA== 78 | dependencies: 79 | "@codemirror/autocomplete" "^6.0.0" 80 | "@codemirror/lang-css" "^6.0.0" 81 | "@codemirror/lang-javascript" "^6.0.0" 82 | "@codemirror/language" "^6.0.0" 83 | "@codemirror/state" "^6.0.0" 84 | "@codemirror/view" "^6.2.2" 85 | "@lezer/common" "^1.0.0" 86 | "@lezer/html" "^1.1.0" 87 | 88 | "@codemirror/lang-javascript@^6.0.0", "@codemirror/lang-javascript@^6.1.1": 89 | version "6.1.1" 90 | resolved "https://registry.yarnpkg.com/@codemirror/lang-javascript/-/lang-javascript-6.1.1.tgz#f920192db30531927a02b8a1af9cf3c3d895101c" 91 | integrity sha512-F4+kiuC5d5dUSJmff96tJQwpEXs/tX/4bapMRnZWW6bHKK1Fx6MunTzopkCUWRa9bF87GPmb9m7Qtg7Yv8f3uQ== 92 | dependencies: 93 | "@codemirror/autocomplete" "^6.0.0" 94 | "@codemirror/language" "^6.0.0" 95 | "@codemirror/lint" "^6.0.0" 96 | "@codemirror/state" "^6.0.0" 97 | "@codemirror/view" "^6.0.0" 98 | "@lezer/common" "^1.0.0" 99 | "@lezer/javascript" "^1.0.0" 100 | 101 | "@codemirror/language@^6.0.0": 102 | version "6.3.1" 103 | resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.3.1.tgz#1d61f33aa5de9aa74a713ee1f5ce600adc74df6b" 104 | integrity sha512-MK+G1QKaGfSEUg9YEFaBkMBI6j1ge4VMBPZv9fDYotw7w695c42x5Ba1mmwBkesYnzYFBfte6Hh9TDcKa6xORQ== 105 | dependencies: 106 | "@codemirror/state" "^6.0.0" 107 | "@codemirror/view" "^6.0.0" 108 | "@lezer/common" "^1.0.0" 109 | "@lezer/highlight" "^1.0.0" 110 | "@lezer/lr" "^1.0.0" 111 | style-mod "^4.0.0" 112 | 113 | "@codemirror/lint@^6.0.0": 114 | version "6.1.0" 115 | resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.1.0.tgz#f006142d3a580fdb8ffc2faa3361b2232c08e079" 116 | integrity sha512-mdvDQrjRmYPvQ3WrzF6Ewaao+NWERYtpthJvoQ3tK3t/44Ynhk8ZGjTSL9jMEv8CgSMogmt75X8ceOZRDSXHtQ== 117 | dependencies: 118 | "@codemirror/state" "^6.0.0" 119 | "@codemirror/view" "^6.0.0" 120 | crelt "^1.0.5" 121 | 122 | "@codemirror/search@^6.0.0": 123 | version "6.2.3" 124 | resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-6.2.3.tgz#fab933fef1b1de8ef40cda275c73d9ac7a1ff40f" 125 | integrity sha512-V9n9233lopQhB1dyjsBK2Wc1i+8hcCqxl1wQ46c5HWWLePoe4FluV3TGHoZ04rBRlGjNyz9DTmpJErig8UE4jw== 126 | dependencies: 127 | "@codemirror/state" "^6.0.0" 128 | "@codemirror/view" "^6.0.0" 129 | crelt "^1.0.5" 130 | 131 | "@codemirror/state@^6.0.0", "@codemirror/state@^6.1.4": 132 | version "6.1.4" 133 | resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.1.4.tgz#2b654ae233ac4f41ee89ce095509ea35ecdf1031" 134 | integrity sha512-g+3OJuRylV5qsXuuhrc6Cvs1NQluNioepYMM2fhnpYkNk7NgX+j0AFuevKSVKzTDmDyt9+Puju+zPdHNECzCNQ== 135 | 136 | "@codemirror/theme-one-dark@^6.0.0": 137 | version "6.1.0" 138 | resolved "https://registry.yarnpkg.com/@codemirror/theme-one-dark/-/theme-one-dark-6.1.0.tgz#6f8b3c7fc22e9fec59edd573f4ba9546db42e007" 139 | integrity sha512-AiTHtFRu8+vWT9wWUWDM+cog6ZwgivJogB1Tm/g40NIpLwph7AnmxrSzWfvJN5fBVufsuwBxecQCNmdcR5D7Aw== 140 | dependencies: 141 | "@codemirror/language" "^6.0.0" 142 | "@codemirror/state" "^6.0.0" 143 | "@codemirror/view" "^6.0.0" 144 | "@lezer/highlight" "^1.0.0" 145 | 146 | "@codemirror/view@^6.0.0", "@codemirror/view@^6.2.2", "@codemirror/view@^6.6.0": 147 | version "6.6.0" 148 | resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.6.0.tgz#d89a24912ae2f4b9d7bd430c7804c25c5e32838c" 149 | integrity sha512-40VaFVZI3rkyjO5GHFAbNwaW+YgZexjKyx5gxLU2DvfuXAEZX0kW0apOXb0SBRLnKIQJ+U/n2nPfxgBVFHERrg== 150 | dependencies: 151 | "@codemirror/state" "^6.1.4" 152 | style-mod "^4.0.0" 153 | w3c-keyname "^2.2.4" 154 | 155 | "@esbuild/linux-loong64@0.14.54": 156 | version "0.14.54" 157 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" 158 | integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== 159 | 160 | "@lezer/common@^1.0.0": 161 | version "1.0.2" 162 | resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.0.2.tgz#8fb9b86bdaa2ece57e7d59e5ffbcb37d71815087" 163 | integrity sha512-SVgiGtMnMnW3ActR8SXgsDhw7a0w0ChHSYAyAUxxrOiJ1OqYWEKk/xJd84tTSPo1mo6DXLObAJALNnd0Hrv7Ng== 164 | 165 | "@lezer/css@^1.0.0": 166 | version "1.1.0" 167 | resolved "https://registry.yarnpkg.com/@lezer/css/-/css-1.1.0.tgz#f86f35e5808c6c4f293e7a9ce509ee109180ae56" 168 | integrity sha512-3dc6l8ZQOOAZUhNk6ekrkaZ6iJScn0QKxsmKgmn0BsaIXePqgPPk3d1iqo/d7laICE6eYrLpxm5HrGyNyR0hfQ== 169 | dependencies: 170 | "@lezer/highlight" "^1.0.0" 171 | "@lezer/lr" "^1.0.0" 172 | 173 | "@lezer/generator@^1.0.0": 174 | version "1.1.3" 175 | resolved "https://registry.yarnpkg.com/@lezer/generator/-/generator-1.1.3.tgz#ec57d5594142421d4f58637400486a43afb55ea5" 176 | integrity sha512-qGF0I2TTJ+VBjjsVX8FGqKJy3laALBnVbD5EbXEu13Sgszl/vjnxjcZ69O8w9IK8/WtVFQLspU4UjCCUNRlWzA== 177 | dependencies: 178 | "@lezer/common" "^1.0.0" 179 | "@lezer/lr" "^1.0.0" 180 | 181 | "@lezer/highlight@^1.0.0": 182 | version "1.1.3" 183 | resolved "https://registry.yarnpkg.com/@lezer/highlight/-/highlight-1.1.3.tgz#bf5a36c2ee227f526d74997ac91f7777e29bd25d" 184 | integrity sha512-3vLKLPThO4td43lYRBygmMY18JN3CPh9w+XS2j8WC30vR4yZeFG4z1iFe4jXE43NtGqe//zHW5q8ENLlHvz9gw== 185 | dependencies: 186 | "@lezer/common" "^1.0.0" 187 | 188 | "@lezer/html@^1.1.0": 189 | version "1.2.0" 190 | resolved "https://registry.yarnpkg.com/@lezer/html/-/html-1.2.0.tgz#1db82c8005be288eb99c568baf66c8730b01877a" 191 | integrity sha512-T6sseEJQPTFayX3h9DINh7KyFBwCjEtrqQRD+7USmtkJh1xHDutsB6KYHKveSd+TbsedIPAcZwar+gkHl1rVSw== 192 | dependencies: 193 | "@lezer/common" "^1.0.0" 194 | "@lezer/highlight" "^1.0.0" 195 | "@lezer/lr" "^1.0.0" 196 | 197 | "@lezer/javascript@^1.0.0", "@lezer/javascript@^1.2.0": 198 | version "1.3.1" 199 | resolved "https://registry.yarnpkg.com/@lezer/javascript/-/javascript-1.3.1.tgz#de1d942adc964242d90e0ecb0fd00410f9a55512" 200 | integrity sha512-3Z6OggGxRuqMntAuadxW0Oy7Zbs56KJSwujDc6vwhVfbi5upHOEzNIrNLvphDU/HozLoTCGQcjNmjLkb2Zr5pg== 201 | dependencies: 202 | "@lezer/highlight" "^1.0.0" 203 | "@lezer/lr" "^1.0.0" 204 | 205 | "@lezer/lr@^1.0.0": 206 | version "1.2.5" 207 | resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.2.5.tgz#e9088164a711690596f17378665e0554157c9b03" 208 | integrity sha512-f9319YG1A/3ysgUE3bqCHEd7g+3ZZ71MWlwEc42mpnLVYXgfJJgtu1XAyBB4Kz8FmqmnFe9caopDqKeMMMAU6g== 209 | dependencies: 210 | "@lezer/common" "^1.0.0" 211 | 212 | "@types/mocha@^9.1.1": 213 | version "9.1.1" 214 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" 215 | integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== 216 | 217 | acorn-walk@^8.0.0, acorn-walk@^8.0.2: 218 | version "8.2.0" 219 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" 220 | integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== 221 | 222 | acorn@^8.0.4, acorn@^8.1.0: 223 | version "8.8.1" 224 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" 225 | integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== 226 | 227 | ansi-colors@4.1.1: 228 | version "4.1.1" 229 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 230 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 231 | 232 | ansi-regex@^5.0.1: 233 | version "5.0.1" 234 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 235 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 236 | 237 | ansi-styles@^3.2.1: 238 | version "3.2.1" 239 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 240 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 241 | dependencies: 242 | color-convert "^1.9.0" 243 | 244 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 245 | version "4.3.0" 246 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 247 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 248 | dependencies: 249 | color-convert "^2.0.1" 250 | 251 | anymatch@~3.1.2: 252 | version "3.1.3" 253 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 254 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 255 | dependencies: 256 | normalize-path "^3.0.0" 257 | picomatch "^2.0.4" 258 | 259 | argparse@^2.0.1: 260 | version "2.0.1" 261 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 262 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 263 | 264 | balanced-match@^1.0.0: 265 | version "1.0.2" 266 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 267 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 268 | 269 | binary-extensions@^2.0.0: 270 | version "2.2.0" 271 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 272 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 273 | 274 | brace-expansion@^1.1.7: 275 | version "1.1.11" 276 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 277 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 278 | dependencies: 279 | balanced-match "^1.0.0" 280 | concat-map "0.0.1" 281 | 282 | brace-expansion@^2.0.1: 283 | version "2.0.1" 284 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 285 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 286 | dependencies: 287 | balanced-match "^1.0.0" 288 | 289 | braces@~3.0.2: 290 | version "3.0.2" 291 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 292 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 293 | dependencies: 294 | fill-range "^7.0.1" 295 | 296 | browser-stdout@1.3.1: 297 | version "1.3.1" 298 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 299 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 300 | 301 | call-bind@^1.0.0, call-bind@^1.0.2: 302 | version "1.0.2" 303 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 304 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 305 | dependencies: 306 | function-bind "^1.1.1" 307 | get-intrinsic "^1.0.2" 308 | 309 | camelcase@^6.0.0: 310 | version "6.3.0" 311 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" 312 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 313 | 314 | chalk@^2.0.0, chalk@^2.4.1: 315 | version "2.4.2" 316 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 317 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 318 | dependencies: 319 | ansi-styles "^3.2.1" 320 | escape-string-regexp "^1.0.5" 321 | supports-color "^5.3.0" 322 | 323 | chalk@^4.1.0: 324 | version "4.1.2" 325 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 326 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 327 | dependencies: 328 | ansi-styles "^4.1.0" 329 | supports-color "^7.1.0" 330 | 331 | chokidar@3.5.3: 332 | version "3.5.3" 333 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 334 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 335 | dependencies: 336 | anymatch "~3.1.2" 337 | braces "~3.0.2" 338 | glob-parent "~5.1.2" 339 | is-binary-path "~2.1.0" 340 | is-glob "~4.0.1" 341 | normalize-path "~3.0.0" 342 | readdirp "~3.6.0" 343 | optionalDependencies: 344 | fsevents "~2.3.2" 345 | 346 | cliui@^7.0.2: 347 | version "7.0.4" 348 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 349 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 350 | dependencies: 351 | string-width "^4.2.0" 352 | strip-ansi "^6.0.0" 353 | wrap-ansi "^7.0.0" 354 | 355 | codemirror@^6.0.0: 356 | version "6.0.1" 357 | resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-6.0.1.tgz#62b91142d45904547ee3e0e0e4c1a79158035a29" 358 | integrity sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg== 359 | dependencies: 360 | "@codemirror/autocomplete" "^6.0.0" 361 | "@codemirror/commands" "^6.0.0" 362 | "@codemirror/language" "^6.0.0" 363 | "@codemirror/lint" "^6.0.0" 364 | "@codemirror/search" "^6.0.0" 365 | "@codemirror/state" "^6.0.0" 366 | "@codemirror/view" "^6.0.0" 367 | 368 | color-convert@^1.9.0: 369 | version "1.9.3" 370 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 371 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 372 | dependencies: 373 | color-name "1.1.3" 374 | 375 | color-convert@^2.0.1: 376 | version "2.0.1" 377 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 378 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 379 | dependencies: 380 | color-name "~1.1.4" 381 | 382 | color-name@1.1.3: 383 | version "1.1.3" 384 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 385 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 386 | 387 | color-name@~1.1.4: 388 | version "1.1.4" 389 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 390 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 391 | 392 | concat-map@0.0.1: 393 | version "0.0.1" 394 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 395 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 396 | 397 | core-util-is@~1.0.0: 398 | version "1.0.3" 399 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" 400 | integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== 401 | 402 | crelt@^1.0.5: 403 | version "1.0.5" 404 | resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.5.tgz#57c0d52af8c859e354bace1883eb2e1eb182bb94" 405 | integrity sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA== 406 | 407 | cross-spawn@^6.0.5: 408 | version "6.0.5" 409 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 410 | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 411 | dependencies: 412 | nice-try "^1.0.4" 413 | path-key "^2.0.1" 414 | semver "^5.5.0" 415 | shebang-command "^1.2.0" 416 | which "^1.2.9" 417 | 418 | debug@2.6.9: 419 | version "2.6.9" 420 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 421 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 422 | dependencies: 423 | ms "2.0.0" 424 | 425 | debug@4.3.4: 426 | version "4.3.4" 427 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 428 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 429 | dependencies: 430 | ms "2.1.2" 431 | 432 | decamelize@^4.0.0: 433 | version "4.0.0" 434 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" 435 | integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== 436 | 437 | define-properties@^1.1.3, define-properties@^1.1.4: 438 | version "1.1.4" 439 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" 440 | integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== 441 | dependencies: 442 | has-property-descriptors "^1.0.0" 443 | object-keys "^1.1.1" 444 | 445 | depd@2.0.0: 446 | version "2.0.0" 447 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 448 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 449 | 450 | destroy@1.2.0: 451 | version "1.2.0" 452 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" 453 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== 454 | 455 | diff@5.0.0: 456 | version "5.0.0" 457 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" 458 | integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== 459 | 460 | ee-first@1.1.1: 461 | version "1.1.1" 462 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 463 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 464 | 465 | emoji-regex@^8.0.0: 466 | version "8.0.0" 467 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 468 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 469 | 470 | encodeurl@~1.0.2: 471 | version "1.0.2" 472 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 473 | integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== 474 | 475 | error-ex@^1.3.1: 476 | version "1.3.2" 477 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 478 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 479 | dependencies: 480 | is-arrayish "^0.2.1" 481 | 482 | es-abstract@^1.19.0, es-abstract@^1.20.4: 483 | version "1.20.4" 484 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" 485 | integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== 486 | dependencies: 487 | call-bind "^1.0.2" 488 | es-to-primitive "^1.2.1" 489 | function-bind "^1.1.1" 490 | function.prototype.name "^1.1.5" 491 | get-intrinsic "^1.1.3" 492 | get-symbol-description "^1.0.0" 493 | has "^1.0.3" 494 | has-property-descriptors "^1.0.0" 495 | has-symbols "^1.0.3" 496 | internal-slot "^1.0.3" 497 | is-callable "^1.2.7" 498 | is-negative-zero "^2.0.2" 499 | is-regex "^1.1.4" 500 | is-shared-array-buffer "^1.0.2" 501 | is-string "^1.0.7" 502 | is-weakref "^1.0.2" 503 | object-inspect "^1.12.2" 504 | object-keys "^1.1.1" 505 | object.assign "^4.1.4" 506 | regexp.prototype.flags "^1.4.3" 507 | safe-regex-test "^1.0.0" 508 | string.prototype.trimend "^1.0.5" 509 | string.prototype.trimstart "^1.0.5" 510 | unbox-primitive "^1.0.2" 511 | 512 | es-to-primitive@^1.2.1: 513 | version "1.2.1" 514 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 515 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 516 | dependencies: 517 | is-callable "^1.1.4" 518 | is-date-object "^1.0.1" 519 | is-symbol "^1.0.2" 520 | 521 | esbuild-android-64@0.14.54: 522 | version "0.14.54" 523 | resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" 524 | integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== 525 | 526 | esbuild-android-arm64@0.14.54: 527 | version "0.14.54" 528 | resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" 529 | integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== 530 | 531 | esbuild-darwin-64@0.14.54: 532 | version "0.14.54" 533 | resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" 534 | integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== 535 | 536 | esbuild-darwin-arm64@0.14.54: 537 | version "0.14.54" 538 | resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" 539 | integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== 540 | 541 | esbuild-freebsd-64@0.14.54: 542 | version "0.14.54" 543 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" 544 | integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== 545 | 546 | esbuild-freebsd-arm64@0.14.54: 547 | version "0.14.54" 548 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" 549 | integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== 550 | 551 | esbuild-linux-32@0.14.54: 552 | version "0.14.54" 553 | resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" 554 | integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== 555 | 556 | esbuild-linux-64@0.14.54: 557 | version "0.14.54" 558 | resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" 559 | integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== 560 | 561 | esbuild-linux-arm64@0.14.54: 562 | version "0.14.54" 563 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" 564 | integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== 565 | 566 | esbuild-linux-arm@0.14.54: 567 | version "0.14.54" 568 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" 569 | integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== 570 | 571 | esbuild-linux-mips64le@0.14.54: 572 | version "0.14.54" 573 | resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" 574 | integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== 575 | 576 | esbuild-linux-ppc64le@0.14.54: 577 | version "0.14.54" 578 | resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" 579 | integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== 580 | 581 | esbuild-linux-riscv64@0.14.54: 582 | version "0.14.54" 583 | resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" 584 | integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== 585 | 586 | esbuild-linux-s390x@0.14.54: 587 | version "0.14.54" 588 | resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" 589 | integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== 590 | 591 | esbuild-netbsd-64@0.14.54: 592 | version "0.14.54" 593 | resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" 594 | integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== 595 | 596 | esbuild-openbsd-64@0.14.54: 597 | version "0.14.54" 598 | resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" 599 | integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== 600 | 601 | esbuild-sunos-64@0.14.54: 602 | version "0.14.54" 603 | resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" 604 | integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== 605 | 606 | esbuild-windows-32@0.14.54: 607 | version "0.14.54" 608 | resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" 609 | integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== 610 | 611 | esbuild-windows-64@0.14.54: 612 | version "0.14.54" 613 | resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" 614 | integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== 615 | 616 | esbuild-windows-arm64@0.14.54: 617 | version "0.14.54" 618 | resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" 619 | integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== 620 | 621 | esbuild@^0.14.27: 622 | version "0.14.54" 623 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" 624 | integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== 625 | optionalDependencies: 626 | "@esbuild/linux-loong64" "0.14.54" 627 | esbuild-android-64 "0.14.54" 628 | esbuild-android-arm64 "0.14.54" 629 | esbuild-darwin-64 "0.14.54" 630 | esbuild-darwin-arm64 "0.14.54" 631 | esbuild-freebsd-64 "0.14.54" 632 | esbuild-freebsd-arm64 "0.14.54" 633 | esbuild-linux-32 "0.14.54" 634 | esbuild-linux-64 "0.14.54" 635 | esbuild-linux-arm "0.14.54" 636 | esbuild-linux-arm64 "0.14.54" 637 | esbuild-linux-mips64le "0.14.54" 638 | esbuild-linux-ppc64le "0.14.54" 639 | esbuild-linux-riscv64 "0.14.54" 640 | esbuild-linux-s390x "0.14.54" 641 | esbuild-netbsd-64 "0.14.54" 642 | esbuild-openbsd-64 "0.14.54" 643 | esbuild-sunos-64 "0.14.54" 644 | esbuild-windows-32 "0.14.54" 645 | esbuild-windows-64 "0.14.54" 646 | esbuild-windows-arm64 "0.14.54" 647 | 648 | escalade@^3.1.1: 649 | version "3.1.1" 650 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 651 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 652 | 653 | escape-html@~1.0.3: 654 | version "1.0.3" 655 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 656 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 657 | 658 | escape-string-regexp@4.0.0: 659 | version "4.0.0" 660 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 661 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 662 | 663 | escape-string-regexp@^1.0.5: 664 | version "1.0.5" 665 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 666 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 667 | 668 | esmoduleserve@^0.2.0: 669 | version "0.2.0" 670 | resolved "https://registry.yarnpkg.com/esmoduleserve/-/esmoduleserve-0.2.0.tgz#01ed56cbee408f624641dab0b2916a54407c891e" 671 | integrity sha512-vg1j7fzKZUFR5TCsYQ3PABfBRMRi6V9K7mxcRh2MftO3gwAHBwYaPHtLHFDsKVSxdHmpu/GgT37lsRT+vezaKQ== 672 | dependencies: 673 | acorn "^8.0.4" 674 | acorn-walk "^8.0.0" 675 | resolve "^1.15.1" 676 | serve-static "^1.14.1" 677 | 678 | etag@~1.8.1: 679 | version "1.8.1" 680 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 681 | integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== 682 | 683 | fill-range@^7.0.1: 684 | version "7.0.1" 685 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 686 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 687 | dependencies: 688 | to-regex-range "^5.0.1" 689 | 690 | find-up@5.0.0: 691 | version "5.0.0" 692 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 693 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 694 | dependencies: 695 | locate-path "^6.0.0" 696 | path-exists "^4.0.0" 697 | 698 | flat@^5.0.2: 699 | version "5.0.2" 700 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 701 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 702 | 703 | fresh@0.5.2: 704 | version "0.5.2" 705 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 706 | integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== 707 | 708 | fs.realpath@^1.0.0: 709 | version "1.0.0" 710 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 711 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 712 | 713 | fsevents@~2.3.2: 714 | version "2.3.2" 715 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 716 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 717 | 718 | function-bind@^1.1.1: 719 | version "1.1.1" 720 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 721 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 722 | 723 | function.prototype.name@^1.1.5: 724 | version "1.1.5" 725 | resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" 726 | integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== 727 | dependencies: 728 | call-bind "^1.0.2" 729 | define-properties "^1.1.3" 730 | es-abstract "^1.19.0" 731 | functions-have-names "^1.2.2" 732 | 733 | functions-have-names@^1.2.2: 734 | version "1.2.3" 735 | resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" 736 | integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== 737 | 738 | get-caller-file@^2.0.5: 739 | version "2.0.5" 740 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 741 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 742 | 743 | get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: 744 | version "1.1.3" 745 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" 746 | integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== 747 | dependencies: 748 | function-bind "^1.1.1" 749 | has "^1.0.3" 750 | has-symbols "^1.0.3" 751 | 752 | get-symbol-description@^1.0.0: 753 | version "1.0.0" 754 | resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" 755 | integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== 756 | dependencies: 757 | call-bind "^1.0.2" 758 | get-intrinsic "^1.1.1" 759 | 760 | glob-parent@~5.1.2: 761 | version "5.1.2" 762 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 763 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 764 | dependencies: 765 | is-glob "^4.0.1" 766 | 767 | glob@7.2.0: 768 | version "7.2.0" 769 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" 770 | integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== 771 | dependencies: 772 | fs.realpath "^1.0.0" 773 | inflight "^1.0.4" 774 | inherits "2" 775 | minimatch "^3.0.4" 776 | once "^1.3.0" 777 | path-is-absolute "^1.0.0" 778 | 779 | glob@^7.1.3: 780 | version "7.2.3" 781 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 782 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 783 | dependencies: 784 | fs.realpath "^1.0.0" 785 | inflight "^1.0.4" 786 | inherits "2" 787 | minimatch "^3.1.1" 788 | once "^1.3.0" 789 | path-is-absolute "^1.0.0" 790 | 791 | graceful-fs@^4.1.2: 792 | version "4.2.10" 793 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" 794 | integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== 795 | 796 | has-bigints@^1.0.1, has-bigints@^1.0.2: 797 | version "1.0.2" 798 | resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" 799 | integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== 800 | 801 | has-flag@^3.0.0: 802 | version "3.0.0" 803 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 804 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 805 | 806 | has-flag@^4.0.0: 807 | version "4.0.0" 808 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 809 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 810 | 811 | has-property-descriptors@^1.0.0: 812 | version "1.0.0" 813 | resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" 814 | integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== 815 | dependencies: 816 | get-intrinsic "^1.1.1" 817 | 818 | has-symbols@^1.0.2, has-symbols@^1.0.3: 819 | version "1.0.3" 820 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 821 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 822 | 823 | has-tostringtag@^1.0.0: 824 | version "1.0.0" 825 | resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" 826 | integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== 827 | dependencies: 828 | has-symbols "^1.0.2" 829 | 830 | has@^1.0.3: 831 | version "1.0.3" 832 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 833 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 834 | dependencies: 835 | function-bind "^1.1.1" 836 | 837 | he@1.2.0: 838 | version "1.2.0" 839 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 840 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 841 | 842 | hosted-git-info@^2.1.4: 843 | version "2.8.9" 844 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" 845 | integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== 846 | 847 | http-errors@2.0.0: 848 | version "2.0.0" 849 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 850 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 851 | dependencies: 852 | depd "2.0.0" 853 | inherits "2.0.4" 854 | setprototypeof "1.2.0" 855 | statuses "2.0.1" 856 | toidentifier "1.0.1" 857 | 858 | immediate@~3.0.5: 859 | version "3.0.6" 860 | resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" 861 | integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== 862 | 863 | inflight@^1.0.4: 864 | version "1.0.6" 865 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 866 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 867 | dependencies: 868 | once "^1.3.0" 869 | wrappy "1" 870 | 871 | inherits@2, inherits@2.0.4, inherits@~2.0.3: 872 | version "2.0.4" 873 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 874 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 875 | 876 | internal-slot@^1.0.3: 877 | version "1.0.3" 878 | resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" 879 | integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== 880 | dependencies: 881 | get-intrinsic "^1.1.0" 882 | has "^1.0.3" 883 | side-channel "^1.0.4" 884 | 885 | is-arrayish@^0.2.1: 886 | version "0.2.1" 887 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 888 | integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== 889 | 890 | is-bigint@^1.0.1: 891 | version "1.0.4" 892 | resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" 893 | integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== 894 | dependencies: 895 | has-bigints "^1.0.1" 896 | 897 | is-binary-path@~2.1.0: 898 | version "2.1.0" 899 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 900 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 901 | dependencies: 902 | binary-extensions "^2.0.0" 903 | 904 | is-boolean-object@^1.1.0: 905 | version "1.1.2" 906 | resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" 907 | integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== 908 | dependencies: 909 | call-bind "^1.0.2" 910 | has-tostringtag "^1.0.0" 911 | 912 | is-callable@^1.1.4, is-callable@^1.2.7: 913 | version "1.2.7" 914 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" 915 | integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== 916 | 917 | is-core-module@^2.9.0: 918 | version "2.11.0" 919 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" 920 | integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== 921 | dependencies: 922 | has "^1.0.3" 923 | 924 | is-date-object@^1.0.1: 925 | version "1.0.5" 926 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" 927 | integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== 928 | dependencies: 929 | has-tostringtag "^1.0.0" 930 | 931 | is-extglob@^2.1.1: 932 | version "2.1.1" 933 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 934 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 935 | 936 | is-fullwidth-code-point@^3.0.0: 937 | version "3.0.0" 938 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 939 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 940 | 941 | is-glob@^4.0.1, is-glob@~4.0.1: 942 | version "4.0.3" 943 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 944 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 945 | dependencies: 946 | is-extglob "^2.1.1" 947 | 948 | is-negative-zero@^2.0.2: 949 | version "2.0.2" 950 | resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" 951 | integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== 952 | 953 | is-number-object@^1.0.4: 954 | version "1.0.7" 955 | resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" 956 | integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== 957 | dependencies: 958 | has-tostringtag "^1.0.0" 959 | 960 | is-number@^7.0.0: 961 | version "7.0.0" 962 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 963 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 964 | 965 | is-plain-obj@^2.1.0: 966 | version "2.1.0" 967 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 968 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 969 | 970 | is-regex@^1.1.4: 971 | version "1.1.4" 972 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" 973 | integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== 974 | dependencies: 975 | call-bind "^1.0.2" 976 | has-tostringtag "^1.0.0" 977 | 978 | is-shared-array-buffer@^1.0.2: 979 | version "1.0.2" 980 | resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" 981 | integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== 982 | dependencies: 983 | call-bind "^1.0.2" 984 | 985 | is-string@^1.0.5, is-string@^1.0.7: 986 | version "1.0.7" 987 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" 988 | integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== 989 | dependencies: 990 | has-tostringtag "^1.0.0" 991 | 992 | is-symbol@^1.0.2, is-symbol@^1.0.3: 993 | version "1.0.4" 994 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" 995 | integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== 996 | dependencies: 997 | has-symbols "^1.0.2" 998 | 999 | is-unicode-supported@^0.1.0: 1000 | version "0.1.0" 1001 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 1002 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== 1003 | 1004 | is-weakref@^1.0.2: 1005 | version "1.0.2" 1006 | resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" 1007 | integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== 1008 | dependencies: 1009 | call-bind "^1.0.2" 1010 | 1011 | isarray@~1.0.0: 1012 | version "1.0.0" 1013 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1014 | integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== 1015 | 1016 | isexe@^2.0.0: 1017 | version "2.0.0" 1018 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1019 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1020 | 1021 | ist@^1.1.7: 1022 | version "1.1.7" 1023 | resolved "https://registry.yarnpkg.com/ist/-/ist-1.1.7.tgz#64161305bca42937d8e05394a2883c3431c5f7ff" 1024 | integrity sha512-ex9JyqY+tCjBlxN1pXlqxEgtGGUGp1TG83ll1xpu8SfPgOhfAhEGCuepNHlB+d7Le+hLoBcfCu/G0ZQaFbi9hA== 1025 | 1026 | js-tokens@^4.0.0: 1027 | version "4.0.0" 1028 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1029 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1030 | 1031 | js-yaml@4.1.0: 1032 | version "4.1.0" 1033 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 1034 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 1035 | dependencies: 1036 | argparse "^2.0.1" 1037 | 1038 | json-parse-better-errors@^1.0.1: 1039 | version "1.0.2" 1040 | resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" 1041 | integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== 1042 | 1043 | jszip@^3.10.0: 1044 | version "3.10.1" 1045 | resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" 1046 | integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== 1047 | dependencies: 1048 | lie "~3.3.0" 1049 | pako "~1.0.2" 1050 | readable-stream "~2.3.6" 1051 | setimmediate "^1.0.5" 1052 | 1053 | lie@~3.3.0: 1054 | version "3.3.0" 1055 | resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" 1056 | integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== 1057 | dependencies: 1058 | immediate "~3.0.5" 1059 | 1060 | load-json-file@^4.0.0: 1061 | version "4.0.0" 1062 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" 1063 | integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== 1064 | dependencies: 1065 | graceful-fs "^4.1.2" 1066 | parse-json "^4.0.0" 1067 | pify "^3.0.0" 1068 | strip-bom "^3.0.0" 1069 | 1070 | locate-path@^6.0.0: 1071 | version "6.0.0" 1072 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 1073 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 1074 | dependencies: 1075 | p-locate "^5.0.0" 1076 | 1077 | log-symbols@4.1.0: 1078 | version "4.1.0" 1079 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 1080 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== 1081 | dependencies: 1082 | chalk "^4.1.0" 1083 | is-unicode-supported "^0.1.0" 1084 | 1085 | magic-string@^0.25.7: 1086 | version "0.25.9" 1087 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" 1088 | integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== 1089 | dependencies: 1090 | sourcemap-codec "^1.4.8" 1091 | 1092 | memorystream@^0.3.1: 1093 | version "0.3.1" 1094 | resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" 1095 | integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== 1096 | 1097 | mime@1.6.0: 1098 | version "1.6.0" 1099 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1100 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1101 | 1102 | minimatch@5.0.1: 1103 | version "5.0.1" 1104 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" 1105 | integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== 1106 | dependencies: 1107 | brace-expansion "^2.0.1" 1108 | 1109 | minimatch@^3.0.4, minimatch@^3.1.1: 1110 | version "3.1.2" 1111 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1112 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1113 | dependencies: 1114 | brace-expansion "^1.1.7" 1115 | 1116 | mocha@^10.0.0: 1117 | version "10.1.0" 1118 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.1.0.tgz#dbf1114b7c3f9d0ca5de3133906aea3dfc89ef7a" 1119 | integrity sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg== 1120 | dependencies: 1121 | ansi-colors "4.1.1" 1122 | browser-stdout "1.3.1" 1123 | chokidar "3.5.3" 1124 | debug "4.3.4" 1125 | diff "5.0.0" 1126 | escape-string-regexp "4.0.0" 1127 | find-up "5.0.0" 1128 | glob "7.2.0" 1129 | he "1.2.0" 1130 | js-yaml "4.1.0" 1131 | log-symbols "4.1.0" 1132 | minimatch "5.0.1" 1133 | ms "2.1.3" 1134 | nanoid "3.3.3" 1135 | serialize-javascript "6.0.0" 1136 | strip-json-comments "3.1.1" 1137 | supports-color "8.1.1" 1138 | workerpool "6.2.1" 1139 | yargs "16.2.0" 1140 | yargs-parser "20.2.4" 1141 | yargs-unparser "2.0.0" 1142 | 1143 | ms@2.0.0: 1144 | version "2.0.0" 1145 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1146 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 1147 | 1148 | ms@2.1.2: 1149 | version "2.1.2" 1150 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1151 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1152 | 1153 | ms@2.1.3: 1154 | version "2.1.3" 1155 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1156 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1157 | 1158 | nanoid@3.3.3: 1159 | version "3.3.3" 1160 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" 1161 | integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== 1162 | 1163 | nanoid@^3.3.6: 1164 | version "3.3.6" 1165 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" 1166 | integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== 1167 | 1168 | nice-try@^1.0.4: 1169 | version "1.0.5" 1170 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 1171 | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 1172 | 1173 | normalize-package-data@^2.3.2: 1174 | version "2.5.0" 1175 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 1176 | integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== 1177 | dependencies: 1178 | hosted-git-info "^2.1.4" 1179 | resolve "^1.10.0" 1180 | semver "2 || 3 || 4 || 5" 1181 | validate-npm-package-license "^3.0.1" 1182 | 1183 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1184 | version "3.0.0" 1185 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1186 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1187 | 1188 | npm-run-all@^4.1.5: 1189 | version "4.1.5" 1190 | resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" 1191 | integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== 1192 | dependencies: 1193 | ansi-styles "^3.2.1" 1194 | chalk "^2.4.1" 1195 | cross-spawn "^6.0.5" 1196 | memorystream "^0.3.1" 1197 | minimatch "^3.0.4" 1198 | pidtree "^0.3.0" 1199 | read-pkg "^3.0.0" 1200 | shell-quote "^1.6.1" 1201 | string.prototype.padend "^3.0.0" 1202 | 1203 | object-inspect@^1.12.2, object-inspect@^1.9.0: 1204 | version "1.12.2" 1205 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" 1206 | integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== 1207 | 1208 | object-keys@^1.1.1: 1209 | version "1.1.1" 1210 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1211 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1212 | 1213 | object.assign@^4.1.4: 1214 | version "4.1.4" 1215 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" 1216 | integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== 1217 | dependencies: 1218 | call-bind "^1.0.2" 1219 | define-properties "^1.1.4" 1220 | has-symbols "^1.0.3" 1221 | object-keys "^1.1.1" 1222 | 1223 | on-finished@2.4.1: 1224 | version "2.4.1" 1225 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 1226 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 1227 | dependencies: 1228 | ee-first "1.1.1" 1229 | 1230 | once@^1.3.0: 1231 | version "1.4.0" 1232 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1233 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 1234 | dependencies: 1235 | wrappy "1" 1236 | 1237 | p-limit@^3.0.2: 1238 | version "3.1.0" 1239 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1240 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1241 | dependencies: 1242 | yocto-queue "^0.1.0" 1243 | 1244 | p-locate@^5.0.0: 1245 | version "5.0.0" 1246 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1247 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1248 | dependencies: 1249 | p-limit "^3.0.2" 1250 | 1251 | pako@~1.0.2: 1252 | version "1.0.11" 1253 | resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" 1254 | integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== 1255 | 1256 | parse-json@^4.0.0: 1257 | version "4.0.0" 1258 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" 1259 | integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== 1260 | dependencies: 1261 | error-ex "^1.3.1" 1262 | json-parse-better-errors "^1.0.1" 1263 | 1264 | parseurl@~1.3.3: 1265 | version "1.3.3" 1266 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 1267 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 1268 | 1269 | path-exists@^4.0.0: 1270 | version "4.0.0" 1271 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1272 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1273 | 1274 | path-is-absolute@^1.0.0: 1275 | version "1.0.1" 1276 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1277 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 1278 | 1279 | path-key@^2.0.1: 1280 | version "2.0.1" 1281 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1282 | integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== 1283 | 1284 | path-parse@^1.0.7: 1285 | version "1.0.7" 1286 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1287 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1288 | 1289 | path-type@^3.0.0: 1290 | version "3.0.0" 1291 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" 1292 | integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== 1293 | dependencies: 1294 | pify "^3.0.0" 1295 | 1296 | picocolors@^1.0.0: 1297 | version "1.0.0" 1298 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 1299 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 1300 | 1301 | picomatch@^2.0.4, picomatch@^2.2.1: 1302 | version "2.3.1" 1303 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1304 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1305 | 1306 | pidtree@^0.3.0: 1307 | version "0.3.1" 1308 | resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" 1309 | integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== 1310 | 1311 | pify@^3.0.0: 1312 | version "3.0.0" 1313 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 1314 | integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== 1315 | 1316 | postcss@^8.4.13: 1317 | version "8.4.31" 1318 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" 1319 | integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== 1320 | dependencies: 1321 | nanoid "^3.3.6" 1322 | picocolors "^1.0.0" 1323 | source-map-js "^1.0.2" 1324 | 1325 | prettier@^2.8.0: 1326 | version "2.8.0" 1327 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.0.tgz#c7df58393c9ba77d6fba3921ae01faf994fb9dc9" 1328 | integrity sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA== 1329 | 1330 | process-nextick-args@~2.0.0: 1331 | version "2.0.1" 1332 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1333 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1334 | 1335 | randombytes@^2.1.0: 1336 | version "2.1.0" 1337 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 1338 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 1339 | dependencies: 1340 | safe-buffer "^5.1.0" 1341 | 1342 | range-parser@~1.2.1: 1343 | version "1.2.1" 1344 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 1345 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 1346 | 1347 | read-pkg@^3.0.0: 1348 | version "3.0.0" 1349 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" 1350 | integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== 1351 | dependencies: 1352 | load-json-file "^4.0.0" 1353 | normalize-package-data "^2.3.2" 1354 | path-type "^3.0.0" 1355 | 1356 | readable-stream@~2.3.6: 1357 | version "2.3.7" 1358 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 1359 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 1360 | dependencies: 1361 | core-util-is "~1.0.0" 1362 | inherits "~2.0.3" 1363 | isarray "~1.0.0" 1364 | process-nextick-args "~2.0.0" 1365 | safe-buffer "~5.1.1" 1366 | string_decoder "~1.1.1" 1367 | util-deprecate "~1.0.1" 1368 | 1369 | readdirp@~3.6.0: 1370 | version "3.6.0" 1371 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1372 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1373 | dependencies: 1374 | picomatch "^2.2.1" 1375 | 1376 | regexp.prototype.flags@^1.4.3: 1377 | version "1.4.3" 1378 | resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" 1379 | integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== 1380 | dependencies: 1381 | call-bind "^1.0.2" 1382 | define-properties "^1.1.3" 1383 | functions-have-names "^1.2.2" 1384 | 1385 | require-directory@^2.1.1: 1386 | version "2.1.1" 1387 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1388 | integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== 1389 | 1390 | resolve@^1.10.0, resolve@^1.15.1, resolve@^1.22.0: 1391 | version "1.22.1" 1392 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" 1393 | integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== 1394 | dependencies: 1395 | is-core-module "^2.9.0" 1396 | path-parse "^1.0.7" 1397 | supports-preserve-symlinks-flag "^1.0.0" 1398 | 1399 | rimraf@^3.0.0: 1400 | version "3.0.2" 1401 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1402 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1403 | dependencies: 1404 | glob "^7.1.3" 1405 | 1406 | rollup-plugin-dts@^3.0.0: 1407 | version "3.0.2" 1408 | resolved "https://registry.yarnpkg.com/rollup-plugin-dts/-/rollup-plugin-dts-3.0.2.tgz#2b628d88f864d271d6eaec2e4c2a60ae4e944c5c" 1409 | integrity sha512-hswlsdWu/x7k5pXzaLP6OvKRKcx8Bzprksz9i9mUe72zvt8LvqAb/AZpzs6FkLgmyRaN8B6rUQOVtzA3yEt9Yw== 1410 | dependencies: 1411 | magic-string "^0.25.7" 1412 | optionalDependencies: 1413 | "@babel/code-frame" "^7.12.13" 1414 | 1415 | "rollup@>=2.59.0 <2.78.0": 1416 | version "2.77.3" 1417 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.77.3.tgz#8f00418d3a2740036e15deb653bed1a90ee0cc12" 1418 | integrity sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g== 1419 | optionalDependencies: 1420 | fsevents "~2.3.2" 1421 | 1422 | rollup@^2.35.1: 1423 | version "2.79.1" 1424 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" 1425 | integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== 1426 | optionalDependencies: 1427 | fsevents "~2.3.2" 1428 | 1429 | safe-buffer@^5.1.0: 1430 | version "5.2.1" 1431 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1432 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1433 | 1434 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1435 | version "5.1.2" 1436 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1437 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1438 | 1439 | safe-regex-test@^1.0.0: 1440 | version "1.0.0" 1441 | resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" 1442 | integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== 1443 | dependencies: 1444 | call-bind "^1.0.2" 1445 | get-intrinsic "^1.1.3" 1446 | is-regex "^1.1.4" 1447 | 1448 | selenium-webdriver@^4.0.0-beta.3: 1449 | version "4.6.1" 1450 | resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.6.1.tgz#ac66867206542a40c24b5a44f4ccbae992e962dc" 1451 | integrity sha512-FT8Dw0tbzaTp8YYLuwhaCnve/nw03HKrOJrA3aUmTKmxaIFSP4kT2R5fN3K0RpV5kbR0ZnM4FGVI2vANBvekaA== 1452 | dependencies: 1453 | jszip "^3.10.0" 1454 | tmp "^0.2.1" 1455 | ws ">=8.7.0" 1456 | 1457 | "semver@2 || 3 || 4 || 5", semver@^5.5.0: 1458 | version "5.7.1" 1459 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1460 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1461 | 1462 | send@0.18.0: 1463 | version "0.18.0" 1464 | resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" 1465 | integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== 1466 | dependencies: 1467 | debug "2.6.9" 1468 | depd "2.0.0" 1469 | destroy "1.2.0" 1470 | encodeurl "~1.0.2" 1471 | escape-html "~1.0.3" 1472 | etag "~1.8.1" 1473 | fresh "0.5.2" 1474 | http-errors "2.0.0" 1475 | mime "1.6.0" 1476 | ms "2.1.3" 1477 | on-finished "2.4.1" 1478 | range-parser "~1.2.1" 1479 | statuses "2.0.1" 1480 | 1481 | serialize-javascript@6.0.0: 1482 | version "6.0.0" 1483 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" 1484 | integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== 1485 | dependencies: 1486 | randombytes "^2.1.0" 1487 | 1488 | serve-static@^1.14.1: 1489 | version "1.15.0" 1490 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" 1491 | integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== 1492 | dependencies: 1493 | encodeurl "~1.0.2" 1494 | escape-html "~1.0.3" 1495 | parseurl "~1.3.3" 1496 | send "0.18.0" 1497 | 1498 | setimmediate@^1.0.5: 1499 | version "1.0.5" 1500 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 1501 | integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== 1502 | 1503 | setprototypeof@1.2.0: 1504 | version "1.2.0" 1505 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 1506 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 1507 | 1508 | shebang-command@^1.2.0: 1509 | version "1.2.0" 1510 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1511 | integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== 1512 | dependencies: 1513 | shebang-regex "^1.0.0" 1514 | 1515 | shebang-regex@^1.0.0: 1516 | version "1.0.0" 1517 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1518 | integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== 1519 | 1520 | shell-quote@^1.6.1: 1521 | version "1.7.4" 1522 | resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.4.tgz#33fe15dee71ab2a81fcbd3a52106c5cfb9fb75d8" 1523 | integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== 1524 | 1525 | side-channel@^1.0.4: 1526 | version "1.0.4" 1527 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 1528 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 1529 | dependencies: 1530 | call-bind "^1.0.0" 1531 | get-intrinsic "^1.0.2" 1532 | object-inspect "^1.9.0" 1533 | 1534 | source-map-js@^1.0.2: 1535 | version "1.0.2" 1536 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 1537 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 1538 | 1539 | sourcemap-codec@^1.4.8: 1540 | version "1.4.8" 1541 | resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" 1542 | integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== 1543 | 1544 | spdx-correct@^3.0.0: 1545 | version "3.1.1" 1546 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" 1547 | integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== 1548 | dependencies: 1549 | spdx-expression-parse "^3.0.0" 1550 | spdx-license-ids "^3.0.0" 1551 | 1552 | spdx-exceptions@^2.1.0: 1553 | version "2.3.0" 1554 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" 1555 | integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== 1556 | 1557 | spdx-expression-parse@^3.0.0: 1558 | version "3.0.1" 1559 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" 1560 | integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== 1561 | dependencies: 1562 | spdx-exceptions "^2.1.0" 1563 | spdx-license-ids "^3.0.0" 1564 | 1565 | spdx-license-ids@^3.0.0: 1566 | version "3.0.12" 1567 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" 1568 | integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== 1569 | 1570 | statuses@2.0.1: 1571 | version "2.0.1" 1572 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 1573 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 1574 | 1575 | string-width@^4.1.0, string-width@^4.2.0: 1576 | version "4.2.3" 1577 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1578 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1579 | dependencies: 1580 | emoji-regex "^8.0.0" 1581 | is-fullwidth-code-point "^3.0.0" 1582 | strip-ansi "^6.0.1" 1583 | 1584 | string.prototype.padend@^3.0.0: 1585 | version "3.1.4" 1586 | resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz#2c43bb3a89eb54b6750de5942c123d6c98dd65b6" 1587 | integrity sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw== 1588 | dependencies: 1589 | call-bind "^1.0.2" 1590 | define-properties "^1.1.4" 1591 | es-abstract "^1.20.4" 1592 | 1593 | string.prototype.trimend@^1.0.5: 1594 | version "1.0.6" 1595 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" 1596 | integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== 1597 | dependencies: 1598 | call-bind "^1.0.2" 1599 | define-properties "^1.1.4" 1600 | es-abstract "^1.20.4" 1601 | 1602 | string.prototype.trimstart@^1.0.5: 1603 | version "1.0.6" 1604 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" 1605 | integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== 1606 | dependencies: 1607 | call-bind "^1.0.2" 1608 | define-properties "^1.1.4" 1609 | es-abstract "^1.20.4" 1610 | 1611 | string_decoder@~1.1.1: 1612 | version "1.1.1" 1613 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1614 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1615 | dependencies: 1616 | safe-buffer "~5.1.0" 1617 | 1618 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1619 | version "6.0.1" 1620 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1621 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1622 | dependencies: 1623 | ansi-regex "^5.0.1" 1624 | 1625 | strip-bom@^3.0.0: 1626 | version "3.0.0" 1627 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1628 | integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== 1629 | 1630 | strip-json-comments@3.1.1: 1631 | version "3.1.1" 1632 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1633 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1634 | 1635 | style-mod@^4.0.0: 1636 | version "4.0.0" 1637 | resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.0.0.tgz#97e7c2d68b592975f2ca7a63d0dd6fcacfe35a01" 1638 | integrity sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw== 1639 | 1640 | supports-color@8.1.1: 1641 | version "8.1.1" 1642 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 1643 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1644 | dependencies: 1645 | has-flag "^4.0.0" 1646 | 1647 | supports-color@^5.3.0: 1648 | version "5.5.0" 1649 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1650 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1651 | dependencies: 1652 | has-flag "^3.0.0" 1653 | 1654 | supports-color@^7.1.0: 1655 | version "7.2.0" 1656 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1657 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1658 | dependencies: 1659 | has-flag "^4.0.0" 1660 | 1661 | supports-preserve-symlinks-flag@^1.0.0: 1662 | version "1.0.0" 1663 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 1664 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 1665 | 1666 | tmp@^0.2.1: 1667 | version "0.2.1" 1668 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" 1669 | integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== 1670 | dependencies: 1671 | rimraf "^3.0.0" 1672 | 1673 | to-regex-range@^5.0.1: 1674 | version "5.0.1" 1675 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1676 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1677 | dependencies: 1678 | is-number "^7.0.0" 1679 | 1680 | toidentifier@1.0.1: 1681 | version "1.0.1" 1682 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 1683 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 1684 | 1685 | typescript@^4.2.3: 1686 | version "4.9.3" 1687 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" 1688 | integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== 1689 | 1690 | unbox-primitive@^1.0.2: 1691 | version "1.0.2" 1692 | resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" 1693 | integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== 1694 | dependencies: 1695 | call-bind "^1.0.2" 1696 | has-bigints "^1.0.2" 1697 | has-symbols "^1.0.3" 1698 | which-boxed-primitive "^1.0.2" 1699 | 1700 | util-deprecate@~1.0.1: 1701 | version "1.0.2" 1702 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1703 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 1704 | 1705 | validate-npm-package-license@^3.0.1: 1706 | version "3.0.4" 1707 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 1708 | integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== 1709 | dependencies: 1710 | spdx-correct "^3.0.0" 1711 | spdx-expression-parse "^3.0.0" 1712 | 1713 | vite@^2.9.17: 1714 | version "2.9.17" 1715 | resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.17.tgz#6b770525e12fa2a2e3a0fa0d028d304f4f7dc7d4" 1716 | integrity sha512-XxcRzra6d7xrKXH66jZUgb+srThoPu+TLJc06GifUyKq9JmjHkc1Numc8ra0h56rju2jfVWw3B3fs5l3OFMvUw== 1717 | dependencies: 1718 | esbuild "^0.14.27" 1719 | postcss "^8.4.13" 1720 | resolve "^1.22.0" 1721 | rollup ">=2.59.0 <2.78.0" 1722 | optionalDependencies: 1723 | fsevents "~2.3.2" 1724 | 1725 | w3c-keyname@^2.2.4: 1726 | version "2.2.6" 1727 | resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.6.tgz#8412046116bc16c5d73d4e612053ea10a189c85f" 1728 | integrity sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg== 1729 | 1730 | which-boxed-primitive@^1.0.2: 1731 | version "1.0.2" 1732 | resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" 1733 | integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== 1734 | dependencies: 1735 | is-bigint "^1.0.1" 1736 | is-boolean-object "^1.1.0" 1737 | is-number-object "^1.0.4" 1738 | is-string "^1.0.5" 1739 | is-symbol "^1.0.3" 1740 | 1741 | which@^1.2.9: 1742 | version "1.3.1" 1743 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1744 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1745 | dependencies: 1746 | isexe "^2.0.0" 1747 | 1748 | workerpool@6.2.1: 1749 | version "6.2.1" 1750 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" 1751 | integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== 1752 | 1753 | wrap-ansi@^7.0.0: 1754 | version "7.0.0" 1755 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1756 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1757 | dependencies: 1758 | ansi-styles "^4.0.0" 1759 | string-width "^4.1.0" 1760 | strip-ansi "^6.0.0" 1761 | 1762 | wrappy@1: 1763 | version "1.0.2" 1764 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1765 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1766 | 1767 | ws@>=8.7.0: 1768 | version "8.11.0" 1769 | resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" 1770 | integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== 1771 | 1772 | y18n@^5.0.5: 1773 | version "5.0.8" 1774 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 1775 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 1776 | 1777 | yargs-parser@20.2.4: 1778 | version "20.2.4" 1779 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" 1780 | integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== 1781 | 1782 | yargs-parser@^20.2.2: 1783 | version "20.2.9" 1784 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 1785 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 1786 | 1787 | yargs-unparser@2.0.0: 1788 | version "2.0.0" 1789 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" 1790 | integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== 1791 | dependencies: 1792 | camelcase "^6.0.0" 1793 | decamelize "^4.0.0" 1794 | flat "^5.0.2" 1795 | is-plain-obj "^2.1.0" 1796 | 1797 | yargs@16.2.0: 1798 | version "16.2.0" 1799 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 1800 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 1801 | dependencies: 1802 | cliui "^7.0.2" 1803 | escalade "^3.1.1" 1804 | get-caller-file "^2.0.5" 1805 | require-directory "^2.1.1" 1806 | string-width "^4.2.0" 1807 | y18n "^5.0.5" 1808 | yargs-parser "^20.2.2" 1809 | 1810 | yocto-queue@^0.1.0: 1811 | version "0.1.0" 1812 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1813 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1814 | --------------------------------------------------------------------------------