Compare commits

...

13 Commits

Author SHA1 Message Date
koehr e259186d4c adds extended menu 5 years ago
koehr e7b5cdcbde SPA redirect config for netlify 5 years ago
koehr 58d3970e8e some extras for the live preview 5 years ago
koehr 4482fa2fcf Merge branch 'master' into own-rich-text-solution 5 years ago
koehr 35ef3505ce select whole title on focus 5 years ago
koehr 2085e22688 Fixes problems with bogus root level text nodes
Depending on the browser in different situations the root node itself is
selected and new text ends up in a text node on root level instead of a new
paragraph. This happens in:

 * Firefox: after inserting a closed block like a horizontal rule
 * Chromium: after inserting or selecting such a closed block

Now instead of inserting a paragraph directly after inserting an HR, the editor
simply checks for normal text input inside the root node and wraps the newly
written text with a paragraph (and moves the caret to the end of the paragraph
because chromium moves it to the beginning of the line)
5 years ago
koehr 18e043baad add home/end/pageup/pagedown keys to menu sync 5 years ago
koehr 8668838238 fix menu sync
this loops the search for marks until a block element is found, because marks
are nested elements like for example `<p><b><i>bold and italic</i></b></p>`.
5 years ago
koehr bfa4ef8ba0 add marks to editor actions (breaks menu sync) 5 years ago
koehr 5986e599fd implements basic menu functionalities
this includes standard block elements (headers, paragraphs, lists, rulers)
but not marks (bold, italic)
and for sure not special elements like the stat block
5 years ago
koehr 42dfa704d7 remove tiptap, start simple homegrown richtext functionalities
* menu now sends command events and button states
* menu state is synced with the elements at caret postion
* menu functionalities are not yet implemented
5 years ago
koehr e33adfe230 trying to extend that editor 5 years ago
koehr 591530246b add tiptap rich text editor and lots of small improvements 5 years ago

@ -46,8 +46,7 @@
], ],
"parserOptions": { "parserOptions": {
"ecmaVersion": 2020 "ecmaVersion": 2020
}, }
"rules": {}
}, },
"browserslist": [ "browserslist": [
"> 1%", "> 1%",

@ -0,0 +1 @@
/* /index.html 200

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

@ -5,6 +5,13 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0"> <meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico"> <link rel="icon" href="<%= BASE_URL %>favicon.ico">
<link rel="icon" href="<%= BASE_URL %>favicon-32.png" sizes="32x32">
<link rel="icon" href="<%= BASE_URL %>favicon-128.png" sizes="128x128">
<link rel="icon" href="<%= BASE_URL %>favicon-192.png" sizes="192x192">
<link rel="shortcut icon" href="<%= BASE_URL %>favicon-196.png" sizes="196x196">
<link rel="apple-touch-icon" href="<%= BASE_URL %>favicon-152.png" sizes="152x152">
<link rel="apple-touch-icon" href="<%= BASE_URL %>favicon-180.png" sizes="180x180">
<title><%= htmlWebpackPlugin.options.title %></title> <title><%= htmlWebpackPlugin.options.title %></title>
</head> </head>
<body> <body>

@ -46,7 +46,6 @@ html,body {
header { header {
display: block; display: block;
height: 10rem;
font-size: 2rem; font-size: 2rem;
line-height: 2rem; line-height: 2rem;
padding: 4rem 0; padding: 4rem 0;
@ -55,6 +54,13 @@ header {
header > p { header > p {
opacity: .6; opacity: .6;
} }
section[name=notifications] {
display: block;
max-width: 70rem;
margin: 0 auto 1em;
padding: 1rem 3rem;
border: .5em solid red;
}
#popup { #popup {
position: fixed; position: fixed;
@ -86,6 +92,9 @@ input, button, select {
input { input {
padding: 0 .7em; padding: 0 .7em;
} }
button {
cursor: pointer;
}
select { select {
padding: 0 .5em; padding: 0 .5em;
} }
@ -117,17 +126,9 @@ a { color: inherit; text-decoration: inherit; }
box-shadow: 0 0 2rem 0 #A44; box-shadow: 0 0 2rem 0 #A44;
} }
button.edit-close { button.action-close {
background: white url(./zondicons/close-outline.svg) center no-repeat; background: white url(./zondicons/close-outline.svg) center no-repeat;
border: 1px solid white; border: 1px solid white;
border-radius: 1em; border-radius: 1em;
cursor: pointer; cursor: pointer;
} }
button.edit-pencil {
background: transparent url(./zondicons/edit-pencil.svg) center no-repeat;
border: none;
cursor: pointer;
}
[contenteditable="true"] { text-decoration: underline dotted; }
[contenteditable="true"]:focus { text-decoration: none; }

@ -0,0 +1,136 @@
<template>
<menu class="menu-bar" :class="{ active }">
<button class="editor-button-bold" :class="{ active: value.bold }" @click="menuAction('bold')" />
<button class="editor-button-italic" :class="{ active: value.italic }" @click="menuAction('italic')" />
<button class="editor-button-paragraph" :class="{ active: value.paragraph }" @click="menuAction('paragraph')" />
<button class="editor-button-heading2" :class="{ active: value.heading2 }" @click="menuAction('heading2')" />
<button class="editor-button-heading3" :class="{ active: value.heading3 }" @click="menuAction('heading3')" />
<button class="editor-button-bullet-list" :class="{ active: value.bulletList }" @click="menuAction('bulletList')" />
<button class="editor-button-horizontal-rule" :class="{ active: value.separator}" @click="menuAction('separator')" />
<button class="editor-button-dropdown" :class="{ active: dropdownOpen }" @click="toggleDropdown" />
<div class="extended-menu" v-show="dropdownOpen">
<button class="extended-menu-button" @click="extMenuAction('statBlock')">Stat Block (DnD5e)</button>
<button class="extended-menu-button" @click="extMenuAction('boxes')">Empty Boxes</button>
</div>
</menu>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator'
import { blocks, marks, State } from '@/editor'
@Component
export default class DeckCardEditorMenu extends Vue {
@Prop() public readonly active!: boolean
@Prop() public readonly value!: State
private dropdownOpen = false
private menuAction (name: string) {
const newState = { ...this.value }
if (blocks.indexOf(name) >= 0) { // blocks behave like radio buttons
blocks.forEach(block => {
newState[block] = false
})
newState[name] = true
} else if (marks.indexOf(name)) { // marks behave like checkboxes
newState[name] = !newState[name]
}
this.$emit('input', newState)
this.$emit('action', name)
}
private toggleDropdown () {
this.dropdownOpen = !this.dropdownOpen
this.$emit('action', 'refocus')
}
private extMenuAction (name: string) {
this.menuAction(name)
this.dropdownOpen = false
}
}
</script>
<style scoped>
.card-front > main > .menu-bar {
position: absolute;
width: 70%;
margin: -3rem 0 0 -1rem;
padding: .2rem 1rem;
visibility: hidden;
opacity: 0;
transition: opacity .3s .2s, visibility .3s .2s;
background-color: var(--highlight-color);
z-index: 2;
}
.card-front > main > .menu-bar.active {
opacity: 1.0;
visibility: visible;
}
.menu-bar > button {
position: relative;
width: 1.6rem;
height: 1.6rem;
margin: 0 .1rem;
background-color: #EEE;
background-position: center;
background-repeat: no-repeat;
background-size: 75%;
border: none;
border-radius: 0;
}
.menu-bar > button:after {
position: absolute;
top: 0;
left: 0;
height: 1.6rem;
width: 1.6rem;
font-size: 1.2rem;
color: black;
}
.menu-bar > button.active {
background-color: #FF0;
}
.editor-button-bold { background-image: url(../assets/zondicons/format-bold.svg); }
.editor-button-italic { background-image: url(../assets/zondicons/format-italic.svg); }
.editor-button-bullet-list { background-image: url(../assets/zondicons/list-bullet.svg); }
.editor-button-heading2:after { content: 'H2'; }
.editor-button-heading3:after { content: 'H3'; }
.editor-button-paragraph:after { content: 'P'; }
.editor-button-horizontal-rule:after { content: '—'; }
.editor-button-stat-block:after { content: 'ST'; }
.menu-bar > button.editor-button-dropdown {
width: 3.6rem;
}
.menu-bar > button.editor-button-dropdown:after {
content: ' more ';
width: 90%;
font-size: 1rem;
}
.extended-menu {
width: 100%;
height: 4rem;
padding-top: .5rem;
background: var(--highlight-color);
}
.extended-menu-button {
width: 97%;
height: 1.6rem;
margin: 0 .1rem;
background-color: #EEE;
color: black;
font-size: 1rem;
border: none;
}
</style>

@ -0,0 +1,197 @@
<template>
<main>
<deck-card-editor-menu
:active="contentInFocus"
@action="editorAction"
v-model="menuState"
/>
<div
ref="content"
class="card-content"
:contenteditable="active"
@focus="start"
@click="syncMenuStateIfFocussed"
@keyup="syncMenuStateOnKeyPress"
@blur="stop"
>
<h2>card content</h2>
<hr />
<p><b>foo:</b> boom</p>
<p><b>bar:</b> blam</p>
<hr />
<p>Some description maybe?</p>
</div>
</main>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator'
import DeckCardEditorMenu from '@/components/deck-card-editor-menu.vue'
import {
menuActionToCommand,
getActiveMarksAndBlocks,
State,
movementKeys,
controlSequenceKeys,
isRootNode,
isTextNode,
moveCaretToEOL
} from '@/editor'
@Component({
components: { DeckCardEditorMenu }
})
export default class DeckCardEditor extends Vue {
@Prop() public readonly active!: boolean
@Prop() public readonly content!: Card['content']
private contentInFocus = false
private defaultMenuState (): State {
return {
bold: false,
italic: false,
paragraph: true,
heading1: false,
heading2: false,
heading3: false,
bulletList: false,
spacer: false,
separator: false,
statBlock: false
}
}
private menuState = this.defaultMenuState()
private resetMenuState () {
this.menuState = this.defaultMenuState()
}
private setMenuState (marks: string[], block: string) {
this.resetMenuState()
marks.forEach(mark => { this.menuState[mark] = true })
if (block !== 'paragraph') {
this.menuState.paragraph = false
this.menuState[block] = true
}
}
private editorAction (action: string) {
const content = this.$refs.content as HTMLElement
content.focus()
const cmd = menuActionToCommand[action]
if (cmd) cmd()
this.$nextTick(() => this.syncMenuState())
}
private syncMenuState () {
const sel = window.getSelection()?.focusNode
if (!sel) return
const { marks, block } = getActiveMarksAndBlocks(sel as HTMLElement)
this.setMenuState(marks, block)
}
private syncMenuStateIfFocussed () {
if (this.contentInFocus) this.syncMenuState()
}
private syncMenuStateOnKeyPress (event: KeyboardEvent) {
// undo/redo/cut/paste
const isCtrlSq = event.ctrlKey && controlSequenceKeys.indexOf(event.key) >= 0
// arrow keys, enter, delete, etc
const isMove = movementKeys.indexOf(event.key) >= 0
if (isCtrlSq || isMove) {
return this.syncMenuState()
} else if (!event.ctrlKey && event.key.length === 1) {
// this should capture all normal typable letters and numbers
// TODO: this needs to be done on text pasting as well
// some browsers create bogus root level text nodes, so whenever
// something is typed in such a root level node, we simply wrap it with
// a paragraph
const sel = window.getSelection()?.focusNode
if (sel && isTextNode(sel) && isRootNode(sel.parentElement as HTMLElement)) {
console.debug(`Typed letter "${event.key} into root node, throwing a <p> at it!"`)
document.execCommand('formatblock', false, 'P')
// Firefox behaves nicely and leaves the caret alone after surrounding
// the text node with a <p>. Unlike Chromium that moves the caret to
// the beginning of the new paragraph. To mitigate that, we set the
// caret to end-of-line manually.
moveCaretToEOL()
}
}
}
private start () {
this.contentInFocus = true
this.syncMenuState()
// insert paragraphs instead of DIVs on enter
document.execCommand('defaultParagraphSeparator', false, 'p')
}
private stop () {
this.contentInFocus = false
}
}
</script>
<style>
.card-content p {
margin: 0;
line-height: 1.2;
}
.card-content ul {
list-style-position: inside;
margin: 0;
padding-left: .5em;
}
.card-content li > p {
display: inline;
}
.card-content h2 {
font-size: 1.4rem;
color: var(--highlight-color);
margin: 0;
font-weight: normal;
}
.card-content h3 {
font-size: 1.4rem;
color: var(--highlight-color);
margin: 0 0 .2em 0;
font-weight: normal;
font-variant: small-caps;
line-height: .9em;
border-bottom: 1px solid var(--highlight-color);
}
.card-content hr {
height: 0;
margin: .2em 0;
border: 2px solid var(--highlight-color);
}
.card-content hr.pointing-right {
height: 0;
margin: .2em 0;
border-style: solid;
border-width: 2px 0 2px 220px;
border-color: transparent transparent transparent var(--highlight-color);
}
.card-content hr.pointing-left {
height: 0;
margin: .2em 0;
border-style: solid;
border-width: 2px 220px 2px 0;
border-color: transparent var(--highlight-color) transparent transparent;
}
[contenteditable="true"] { outline: none; }
</style>

@ -5,31 +5,26 @@
:class="{ active: isSelection }" :class="{ active: isSelection }"
:style="containerStyle" :style="containerStyle"
@click="clickUnlessSelected"> @click="clickUnlessSelected">
<div class="active-background" @click.self.stop="$emit('close')" />
<button class="action-close" @click.self.stop="$emit('close')" v-if="isSelection" />
<section name="card-front" class="card-front"> <section name="card-front" class="card-front">
<header> <header>
<h2 :contenteditable="isSelection" <h1 :contenteditable="isSelection"
@focus="selectLine"
@blur="editField('name', $event)"
@keypress.enter.prevent="editField('name', $event)"> @keypress.enter.prevent="editField('name', $event)">
{{ card.name }} {{ card.name }}
</h2> </h1>
<img :src="icon" /> <img :src="icon" />
<button class="edit-close" @click.self.stop="$emit('close')" v-if="isSelection" />
</header> </header>
<main> <deck-card-editor :active="isSelection" :content="card.content" @input="$emit('edit', $event)" />
<component v-for="(entry, i) in card.content"
:is="`deck-card-${entry.type}`"
:key="`e${i}`"
:params="entry.params"
:editable="isSelection"
@edit="editContentFieldParam(i, $event)"
@replace="replaceContentField(i, $event)"
/>
</main>
</section> </section>
<section name="card-back" class="card-back"> <section name="card-back" class="card-back">
<div class="icon-wrapper"> <div class="icon-wrapper">
<img :src="backIcon" /> <img :src="backIcon" />
</div> </div>
<p>click to edit</p> <button @click="$emit('click')">edit card</button>
<button @click="$emit('delete')">delete card</button>
</section> </section>
</div> </div>
</template> </template>
@ -37,44 +32,20 @@
<script lang="ts"> <script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator' import { Component, Prop, Vue } from 'vue-property-decorator'
import { cardWHtoStyle, iconPath } from '@/lib' import { cardWHtoStyle, iconPath } from '@/lib'
import DeckCardEditor from '@/components/deck-card-editor.vue'
import DeckCardSubtitle from './deck-card-subtitle.vue' import { selectLine } from '@/editor'
import DeckCardSection from './deck-card-section.vue'
import DeckCardRule from './deck-card-rule.vue'
import DeckCardProperty from './deck-card-property.vue'
import DeckCardDescription from './deck-card-description.vue'
import DeckCardText from './deck-card-text.vue'
import DeckCardNote from './deck-card-note.vue'
import DeckCardFill from './deck-card-fill.vue'
import DeckCardBulletList from './deck-card-bullet-list.vue'
import DeckCardBoxes from './deck-card-boxes.vue'
import DeckCardDndstats from './deck-card-dndstats.vue'
interface ContentEditEvent {
param: number;
value: string;
}
@Component({ @Component({
components: { components: { DeckCardEditor }
DeckCardSubtitle,
DeckCardSection,
DeckCardRule,
DeckCardProperty,
DeckCardDescription,
DeckCardText,
DeckCardNote,
DeckCardFill,
DeckCardBulletList,
DeckCardBoxes,
DeckCardDndstats
}
}) })
export default class DeckCard extends Vue { export default class DeckCard extends Vue {
@Prop() public readonly card!: Card @Prop() public readonly card!: Card
@Prop() public readonly deck!: Deck @Prop() public readonly deck!: Deck
@Prop() public readonly isSelection!: boolean @Prop() public readonly isSelection!: boolean
/// TODO: onEdit
// this.$emit('edit', { field: 'content', value: doc.content })
private editHeadline = false; private editHeadline = false;
private editFieldIndex: number | null = null; private editFieldIndex: number | null = null;
@ -90,25 +61,6 @@ export default class DeckCard extends Vue {
this.$emit('edit', payload) this.$emit('edit', payload)
} }
private replaceContentField (index: number, newParams: Field['params']) {
const newContent = [...this.card.content]
const newField = {
type: newContent[index].type,
params: newParams
}
newContent.splice(index, 1, newField)
const payload = { field: 'content', value: newContent }
this.$emit('edit', payload)
}
private editContentFieldParam (index: number, event: ContentEditEvent) {
const { param, value } = event
const params = [...this.card.content[index].params]
params[param] = value
this.replaceContentField(index, params)
}
private get icon () { private get icon () {
const icon = this.card.icon || this.deck.icon const icon = this.card.icon || this.deck.icon
return iconPath(icon) return iconPath(icon)
@ -126,7 +78,10 @@ export default class DeckCard extends Vue {
transform: '' transform: ''
} }
if (this.isSelection && this.$el) { const selected = this.isSelection
const hasElement = this.$el
if (selected && hasElement) {
const el = this.$el.getBoundingClientRect() const el = this.$el.getBoundingClientRect()
const wWidth = window.innerWidth const wWidth = window.innerWidth
const wHeight = window.innerHeight const wHeight = window.innerHeight
@ -149,6 +104,10 @@ export default class DeckCard extends Vue {
return style return style
} }
private selectLine () {
selectLine()
}
} }
</script> </script>
@ -158,9 +117,22 @@ export default class DeckCard extends Vue {
perspective: 600px; perspective: 600px;
transition: transform .2s ease-out .4s; transition: transform .2s ease-out .4s;
} }
.flip-card > .active-background {
display: none;
position: fixed;
top: -100vh;
left: -100vw;
width: 200vw;
height: 200vh;
background-color: #0008;
}
.flip-card.active { .flip-card.active {
z-index: 1; z-index: 1;
} }
.flip-card.active > .active-background {
display: block;
}
.card-front, .card-back { .card-front, .card-back {
position: absolute; position: absolute;
top: 0; top: 0;
@ -172,10 +144,7 @@ export default class DeckCard extends Vue {
transform-style: preserve-3d; transform-style: preserve-3d;
backface-visibility: hidden; backface-visibility: hidden;
transition: transform .4s ease-out; transition: transform .4s ease-out;
z-index: 0; overflow: hidden;
}
.card-front {
z-index: 1;
} }
.flip-card:not(.active):hover > .card-front { .flip-card:not(.active):hover > .card-front {
transform: rotateX(0) rotateY(179deg); transform: rotateX(0) rotateY(179deg);
@ -193,6 +162,7 @@ export default class DeckCard extends Vue {
display: flex; display: flex;
flex-flow: column nowrap; flex-flow: column nowrap;
justify-content: flex-start; justify-content: flex-start;
z-index: 1;
} }
.card-front > header { .card-front > header {
display: flex; display: flex;
@ -206,16 +176,21 @@ export default class DeckCard extends Vue {
padding: 0 1em; padding: 0 1em;
text-align: left; text-align: left;
} }
.card-front > header > h2 { .card-front > header > h1 {
margin: 0; margin: .5em 0 0 0;
align-self: end; align-self: center;
line-height: .9em; line-height: .9em;
font-size: 2rem;
} }
.card-front > header > img { .card-front > header > img {
height: 3rem; height: 3rem;
align-self: end; align-self: end;
} }
.card-front > header > h1[contenteditable="true"] { text-decoration: underline dotted; }
.card-front > header > h1[contenteditable="true"]:focus { text-decoration: none; }
.card-front > main { .card-front > main {
position: relative;
display: flex; display: flex;
flex-flow: column nowrap; flex-flow: column nowrap;
flex: 1; flex: 1;
@ -226,13 +201,6 @@ export default class DeckCard extends Vue {
border-radius: 1rem; border-radius: 1rem;
font-size: 1.2rem; font-size: 1.2rem;
color: black; color: black;
overflow: hidden;
}
.card-front > main > .entry.fill {
display: none;
}
.card-front > main > .entry.text > span {
display: block;
} }
.card-back { .card-back {
@ -244,19 +212,24 @@ export default class DeckCard extends Vue {
.card-back > .icon-wrapper { .card-back > .icon-wrapper {
margin: 3em; margin: 3em;
} }
.card-back > p { .card-back > button {
position: absolute; width: 80%;
bottom: -12%; margin: .1rem auto;
width: 100%;
text-align: center;
} }
.edit-close { .action-close {
position: absolute; position: absolute;
top: 0; top: 0;
left: calc(25vw + 1.5rem); right: 0;
width: 3rem; width: 3rem;
height: 3rem; height: 3rem;
margin-top: -3rem; margin-top: -3rem;
} }
@media screen and (orientation:landscape) {
.action-close {
top: 3rem;
right: -3rem;
}
}
</style> </style>

@ -0,0 +1,33 @@
import { getFocussedNode } from './node'
function applyRange (callback: (range: Range) => void) {
const range = document.createRange()
callback(range)
const sel = window.getSelection()
if (sel) {
sel.removeAllRanges()
sel.addRange(range)
}
}
function collapseRange (node: Node, toStart = false) {
applyRange(range => {
range.selectNode(node)
range.collapse(toStart)
})
}
export function moveCaretToBOL () {
const node = getFocussedNode()
if (node) collapseRange(node, true)
}
export function moveCaretToEOL () {
const node = getFocussedNode()
if (node) collapseRange(node, false)
}
export function selectLine () {
const node = getFocussedNode()
if (node) {
applyRange(range => range.selectNodeContents(node))
}
}

@ -0,0 +1,41 @@
export const movementKeys = [
'ArrowLeft',
'ArrowRight',
'ArrowUp',
'ArrowDown',
'Delete',
'Backspace',
'Enter',
'Home',
'End',
'PageUp',
'PageDown'
]
export const controlSequenceKeys = ['p', 'x', 'y', 'z', 'Z']
export const elementNameToMenuState: KV<string> = {
B: 'bold',
STRONG: 'bold',
I: 'italic',
EM: 'italic',
P: 'paragraph',
H1: 'heading1',
H2: 'heading2',
H3: 'heading3',
UL: 'bulletList',
OL: 'numberedList',
HR: 'separator'
}
export const marks = ['bold', 'italic']
export const blocks = [
'paragraph',
'heading1',
'heading2',
'heading3',
'bulletList',
'spacer',
'separator',
'statBlock'
]

@ -0,0 +1,81 @@
import { elementNameToMenuState, marks, blocks } from './constants'
export {
isRootNode,
isRootChild,
isElementNode,
isTextNode,
isEmptyTextNode,
getFocussedNode
} from './node'
export {
moveCaretToBOL,
moveCaretToEOL,
selectLine
} from './caret'
export type State = KV<boolean>
export {
movementKeys,
controlSequenceKeys,
marks,
blocks
} from './constants'
function simpleAction (cmd: string, arg?: string): () => boolean {
return () => {
return document.execCommand(cmd, false, arg)
}
}
export const menuActionToCommand: KV<() => boolean> = {
paragraph: simpleAction('formatblock', 'P'),
heading1: simpleAction('formatblock', 'H1'),
heading2: simpleAction('formatblock', 'H2'),
heading3: simpleAction('formatblock', 'H3'),
bulletList: simpleAction('insertUnorderedList'),
numberedList: simpleAction('insertOrderedList'),
separator: simpleAction('insertHorizontalRule'),
bold: simpleAction('bold'),
italic: simpleAction('italic')
}
export function getActiveMarksAndBlocks (el: HTMLElement): {
marks: string[];
block: string;
} {
let activeBlock = 'paragraph'
const activeMarks: string[] = []
const focussedEl = el.nodeName === '#text' ? el.parentElement : el
if (!focussedEl) return { marks: activeMarks, block: activeBlock }
const focussedState = elementNameToMenuState[focussedEl.nodeName]
if (!focussedState) return { marks: activeMarks, block: activeBlock }
if (blocks.indexOf(focussedState) >= 0) {
activeBlock = focussedState
return { marks: activeMarks, block: activeBlock }
}
let wrappingEl = focussedEl.parentElement
let wrappingState: string
if (marks.indexOf(focussedState) >= 0) {
activeMarks.push(focussedState)
while (wrappingEl) {
wrappingState = elementNameToMenuState[wrappingEl.nodeName]
if (marks.indexOf(wrappingState) < 0) {
if (blocks.indexOf(wrappingState) >= 0) activeBlock = wrappingState
break
}
activeMarks.push(wrappingState)
wrappingEl = wrappingEl.parentElement
}
}
return { marks: activeMarks, block: activeBlock }
}

@ -0,0 +1,20 @@
const { TEXT_NODE, ELEMENT_NODE } = Node
export function getFocussedNode (): Node | null {
return window.getSelection()?.focusNode || null
}
export function isTextNode ({ nodeType }: Node): boolean {
return nodeType === TEXT_NODE
}
export function isElementNode ({ nodeType }: Node): boolean {
return nodeType === ELEMENT_NODE
}
export function isEmptyTextNode (node: Node): boolean {
return isTextNode(node) && (node as CharacterData).data === ''
}
export function isRootNode (node: Node): boolean {
return (node as HTMLElement).contentEditable === 'true'
}
export function isRootChild (node: Node): boolean {
// TODO: maybe use a data attribute or something for saver identification
return node.parentElement?.contentEditable === 'true'
}

@ -41,7 +41,7 @@ export function defaultDeck (): Deck {
export function defaultCard (): Card { export function defaultCard (): Card {
return { return {
id: `c${randomId()}`, id: `c${randomId()}`,
name: '', name: 'no title yet',
count: 1, count: 1,
tags: [], tags: [],
icon: 'robe', icon: 'robe',

@ -1,7 +1,6 @@
import Vue from 'vue' import Vue from 'vue'
import VueRouter from 'vue-router' import VueRouter from 'vue-router'
import Home from './views/Home.vue' import Home from './views/Home.vue'
import DeckView from './views/Deck.vue'
Vue.use(VueRouter) Vue.use(VueRouter)
@ -14,7 +13,7 @@ const routes = [
{ {
path: '/deck/:id', path: '/deck/:id',
name: 'Deck', name: 'Deck',
component: DeckView component: () => import(/* webpackChunkName "deck" */ './views/Deck.vue')
}, },
{ {
path: '/about', path: '/about',

20
src/shims.d.ts vendored

@ -1,6 +1,20 @@
interface Field { interface KV<V> {
[key: string]: V;
}
interface TextNode {
type: 'text';
text: string;
}
interface SimpleNode {
type: string;
}
interface ContentNode {
type: string; type: string;
params: (string | number)[]; content: (ContentNode | TextNode | SimpleNode)[];
attrs?: object;
} }
interface Card { interface Card {
@ -9,7 +23,7 @@ interface Card {
count: number; count: number;
tags: string[]; tags: string[];
icon: string; icon: string;
content: Field[]; content: (ContentNode | SimpleNode)[];
backIcon?: string; backIcon?: string;
color?: string; color?: string;
} }

@ -41,7 +41,7 @@ export default class StorageHandler {
return null return null
} }
private persist () { persist () {
localStorage.setItem(KEY, JSON.stringify(this.cache)) localStorage.setItem(KEY, JSON.stringify(this.cache))
} }
} }

@ -22,8 +22,7 @@
</header> </header>
<section name="deck-cards" class="cards" :class="{ centered: !deck.cards.length }"> <section name="deck-cards" class="cards" :class="{ centered: !deck.cards.length }">
<!--deck-cover :key="card.id" v-for="card in deck.cards" :card="deck" /--> <deck-card v-for="(card, i) in deck.cards"
<deck-card v-for="card in testCards"
:key="card.id" :key="card.id"
:card="card" :card="card"
:deck="deck" :deck="deck"
@ -31,6 +30,7 @@
@click="selection = card" @click="selection = card"
@close="selection = null" @close="selection = null"
@edit="editCard(card, $event.field, $event.value)" @edit="editCard(card, $event.field, $event.value)"
@delete="removeCard(i)"
/> />
<deck-cover @click="newCard" /> <deck-cover @click="newCard" />
</section> </section>
@ -64,88 +64,6 @@ export default class DeckView extends Vue {
private deck: Deck | null = null private deck: Deck | null = null
private selection: Card | null = null private selection: Card | null = null
private testCards: Card[] = [{
id: 'foo',
name: 'Hideous Laughter',
count: 1,
tags: ['foo', 'test'],
icon: 'robe',
content: [
{ type: 'subtitle', params: ['1st Level Enchantment'] },
{ type: 'rule', params: ['pointing-right'] },
{ type: 'property', params: ['Casting Time', '1 Action'] },
{ type: 'property', params: ['Range', 'Self (15ft cone)'] },
{ type: 'property', params: ['Components', 'V,S,M*'] },
{ type: 'rule', params: ['pointing-left'] },
{ type: 'fill', params: ['2'] },
{ type: 'text', params: ['A creature of your choice that you can see within range perceives everything as hilariously funny if this spell affects it. The target must succeed on a Wisdom saving throw or fall prone, becoming incapacitated and unable to stand up for the duration. Only applies to creatures with Int 4 or higher.'] },
{ type: 'text', params: ['Either at the end of its turn or when taken damage, the target can make another Wisdom saving throw (with advantage if triggered by damage). On a success, the spell ends.'] },
{ type: 'fill', params: ['3'] },
{ type: 'note', params: ['* - (tiny tarts and a feather)'] }
]
}, {
id: 'fire',
name: 'Burning Hands',
count: 1,
tags: ['fire', 'test'],
icon: 'robe',
content: [
{ type: 'subtitle', params: ['1st Level Evocation'] },
{ type: 'rule', params: ['pointing-right'] },
{ type: 'property', params: ['Casting Time', '1 Action'] },
{ type: 'property', params: ['Range', 'Self (15ft cone)'] },
{ type: 'property', params: ['Components', 'V,S'] },
{ type: 'rule', params: ['pointing-left'] },
{ type: 'fill', params: [2] },
{ type: 'text', params: ['Each creature in a 15-foot cone must make a Dexterity saving throw. A creature takes 3d6 fire damage on a failed save, or half as much damage on a successful one.'] },
{ type: 'text', params: ['The fire ignites any flammable objects in the area that aren\'t being worn or carried.'] },
{ type: 'fill', params: [3] },
{ type: 'section', params: ['At higher levels'] },
{ type: 'text', params: ['+1d6 damage for each slot above 1st.'] }
]
}, {
id: 'wand',
name: 'Wand of Magic Missiles',
count: 1,
tags: ['wand', 'test'],
icon: 'robe',
content: [
{ type: 'subtitle', params: ['Wondrous Item'] },
{ type: 'rule', params: ['pointing-right'] },
{ type: 'property', params: ['Maximum charges', '7'] },
{ type: 'property', params: ['Recharge', '1d6+1 each day'] },
{ type: 'property', params: ['Depletion', 'If you expend the last charge, roll a d20. On a 1, the item is destroyed.'] },
{ type: 'rule', params: ['pointing-left'] },
{ type: 'fill', params: [2] },
{ type: 'description', params: ['Spells', 'You can use your action to cast the following spells:'] },
{ type: 'bullet-list', params: ['magic missile, 1st level (1 charge)', 'magic missile, 2nd level (2 charges)', 'magic missile, 3rd level (3 charges)'] },
{ type: 'fill', params: [3] },
{ type: 'boxes', params: [7, 2.5] }
]
}, {
id: 'goblin',
name: 'Goblin',
count: 1,
tags: ['goblin', 'test'],
icon: 'robe',
content: [
{ type: 'subtitle', params: ['Small humanoid (goblinoid)'] },
{ type: 'rule', params: ['pointing-right'] },
{ type: 'property', params: ['Armor Class', '15 (leather armor)'] },
{ type: 'property', params: ['Hit Points', '7 (2d6)'] },
{ type: 'rule', params: ['pointing-left'] },
{ type: 'dndstats', params: [8, 14, 10, 10, 8, 8] },
{ type: 'rule', params: ['pointing-left'] },
{ type: 'property', params: ['Skills', 'Stealth +6'] },
{ type: 'property', params: ['Challenge', '1/4 (50 XP)'] },
{ type: 'rule', params: ['pointing-left'] },
{ type: 'description', params: ['Nimble escape', 'Disengage or Hide as bonus action'] },
{ type: 'fill', params: [2] },
{ type: 'section', params: ['Actions'] },
{ type: 'description', params: ['Scimitar.', 'Melee Weapon Attack: +4 to hit, reach 5 ft., one target. Hit: 5 (1d6 + 2) slashing damage'] }
]
}]
private mounted () { private mounted () {
const currentDeckId = this.$route.params.id const currentDeckId = this.$route.params.id
this.deck = this.$storage.findDeck(currentDeckId) this.deck = this.$storage.findDeck(currentDeckId)
@ -168,12 +86,45 @@ export default class DeckView extends Vue {
if (this.deck === null) return if (this.deck === null) return
const newCard = defaultCard() const newCard = defaultCard()
newCard.content = [{
type: 'heading',
attrs: { level: 2 },
content: [{
type: 'text',
text: 'feel free to edit this card'
}]
}, {
type: 'horizontal_rule'
}, {
type: 'paragraph',
content: [{
type: 'text',
text: 'This is a rich-text editor, so you can basically do whatever you want.'
}]
}]
this.deck.cards.push(newCard) this.deck.cards.push(newCard)
this.selection = newCard this.$storage.persist()
this.$nextTick(() => {
this.selection = newCard
})
} }
private editCard<Card, K extends keyof Card> (card: Card, field: K, value: Card[K]) { private editCard<Card, K extends keyof Card> (card: Card, field: K, value: Card[K]) {
card[field] = value card[field] = value
this.$storage.persist()
}
private removeCard (index: number) {
if (this.deck === null) return
if (this.deck.cards.length - 1 < index) return
const userIsSure = confirm('Are you sure you want to permanently delete this card?')
if (!userIsSure) return
this.deck.cards.splice(index, 1)
this.$storage.persist()
this.closeAndReload()
} }
} }
</script> </script>

@ -1,6 +1,14 @@
<template> <template>
<main name="home" :class="{ popup }"> <main name="home" :class="{ popup }">
<header>RPG Cards for y'all</header> <header>RPG Cards for y'all</header>
<section name="notifications">
<p class="warning">
<strong>This is a pre-alpha version.</strong>
Many features are still unstable or completely missing.
<br />
Check out <a href="https://github.com/nkoehring/rpg-cards-ng/">the code repository</a> for more information.
</p>
</section>
<section name="deck-covers" class="cards" :class="{ centered: !savedDecks.length }"> <section name="deck-covers" class="cards" :class="{ centered: !savedDecks.length }">
<router-link :to="{ name: 'Deck', params: { id: deck.id } }" :key="deck.id" v-for="deck in savedDecks"> <router-link :to="{ name: 'Deck', params: { id: deck.id } }" :key="deck.id" v-for="deck in savedDecks">
<deck-cover :deck="deck" /> <deck-cover :deck="deck" />

@ -916,39 +916,39 @@
integrity sha512-eWN5ElDTeBc5lRDh95SqA8x18D0ll2pWudU3uWiyfsRmIZcmUXpEsxPU+7+BsdCrO2vfLRC629u/MmjbmF+2tA== integrity sha512-eWN5ElDTeBc5lRDh95SqA8x18D0ll2pWudU3uWiyfsRmIZcmUXpEsxPU+7+BsdCrO2vfLRC629u/MmjbmF+2tA==
"@typescript-eslint/eslint-plugin@^2.18.0": "@typescript-eslint/eslint-plugin@^2.18.0":
version "2.23.0" version "2.24.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.23.0.tgz#aa7133bfb7b685379d9eafe4ae9e08b9037e129d" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.24.0.tgz#a86cf618c965a462cddf3601f594544b134d6d68"
integrity sha512-8iA4FvRsz8qTjR0L/nK9RcRUN3QtIHQiOm69FzV7WS3SE+7P7DyGGwh3k4UNR2JBbk+Ej2Io+jLAaqKibNhmtw== integrity sha512-wJRBeaMeT7RLQ27UQkDFOu25MqFOBus8PtOa9KaT5ZuxC1kAsd7JEHqWt4YXuY9eancX0GK9C68i5OROnlIzBA==
dependencies: dependencies:
"@typescript-eslint/experimental-utils" "2.23.0" "@typescript-eslint/experimental-utils" "2.24.0"
eslint-utils "^1.4.3" eslint-utils "^1.4.3"
functional-red-black-tree "^1.0.1" functional-red-black-tree "^1.0.1"
regexpp "^3.0.0" regexpp "^3.0.0"
tsutils "^3.17.1" tsutils "^3.17.1"
"@typescript-eslint/experimental-utils@2.23.0": "@typescript-eslint/experimental-utils@2.24.0":
version "2.23.0" version "2.24.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.23.0.tgz#5d2261c8038ec1698ca4435a8da479c661dc9242" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.24.0.tgz#a5cb2ed89fedf8b59638dc83484eb0c8c35e1143"
integrity sha512-OswxY59RcXH3NNPmq+4Kis2CYZPurRU6mG5xPcn24CjFyfdVli5mySwZz/g/xDbJXgDsYqNGq7enV0IziWGXVQ== integrity sha512-DXrwuXTdVh3ycNCMYmWhUzn/gfqu9N0VzNnahjiDJvcyhfBy4gb59ncVZVxdp5XzBC77dCncu0daQgOkbvPwBw==
dependencies: dependencies:
"@types/json-schema" "^7.0.3" "@types/json-schema" "^7.0.3"
"@typescript-eslint/typescript-estree" "2.23.0" "@typescript-eslint/typescript-estree" "2.24.0"
eslint-scope "^5.0.0" eslint-scope "^5.0.0"
"@typescript-eslint/parser@^2.18.0": "@typescript-eslint/parser@^2.18.0":
version "2.23.0" version "2.24.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.23.0.tgz#f3d4e2928ff647fe77fc2fcef1a3534fee6a3212" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.24.0.tgz#2cf0eae6e6dd44d162486ad949c126b887f11eb8"
integrity sha512-k61pn/Nepk43qa1oLMiyqApC6x5eP5ddPz6VUYXCAuXxbmRLqkPYzkFRKl42ltxzB2luvejlVncrEpflgQoSUg== integrity sha512-H2Y7uacwSSg8IbVxdYExSI3T7uM1DzmOn2COGtCahCC3g8YtM1xYAPi2MAHyfPs61VKxP/J/UiSctcRgw4G8aw==
dependencies: dependencies:
"@types/eslint-visitor-keys" "^1.0.0" "@types/eslint-visitor-keys" "^1.0.0"
"@typescript-eslint/experimental-utils" "2.23.0" "@typescript-eslint/experimental-utils" "2.24.0"
"@typescript-eslint/typescript-estree" "2.23.0" "@typescript-eslint/typescript-estree" "2.24.0"
eslint-visitor-keys "^1.1.0" eslint-visitor-keys "^1.1.0"
"@typescript-eslint/typescript-estree@2.23.0": "@typescript-eslint/typescript-estree@2.24.0":
version "2.23.0" version "2.24.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.23.0.tgz#d355960fab96bd550855488dcc34b9a4acac8d36" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.24.0.tgz#38bbc8bb479790d2f324797ffbcdb346d897c62a"
integrity sha512-pmf7IlmvXdlEXvE/JWNNJpEvwBV59wtJqA8MLAxMKLXNKVRC3HZBXR/SlZLPWTCcwOSg9IM7GeRSV3SIerGVqw== integrity sha512-RJ0yMe5owMSix55qX7Mi9V6z2FDuuDpN6eR5fzRJrp+8in9UF41IGNQHbg5aMK4/PjVaEQksLvz0IA8n+Mr/FA==
dependencies: dependencies:
debug "^4.1.1" debug "^4.1.1"
eslint-visitor-keys "^1.1.0" eslint-visitor-keys "^1.1.0"
@ -1383,11 +1383,6 @@
resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
abbrev@1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7:
version "1.3.7" version "1.3.7"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
@ -1534,7 +1529,7 @@ anymatch@^2.0.0:
micromatch "^3.1.4" micromatch "^3.1.4"
normalize-path "^2.1.1" normalize-path "^2.1.1"
aproba@^1.0.3, aproba@^1.1.1: aproba@^1.1.1:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
@ -1544,14 +1539,6 @@ arch@^2.1.1:
resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e" resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e"
integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg== integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==
are-we-there-yet@~1.1.2:
version "1.1.5"
resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
dependencies:
delegates "^1.0.0"
readable-stream "^2.0.6"
argparse@^1.0.7: argparse@^1.0.7:
version "1.0.10" version "1.0.10"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
@ -2502,11 +2489,6 @@ console-browserify@^1.1.0:
resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==
console-control-strings@^1.0.0, console-control-strings@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
consolidate@^0.15.1: consolidate@^0.15.1:
version "0.15.1" version "0.15.1"
resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7"
@ -2886,7 +2868,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9:
dependencies: dependencies:
ms "2.0.0" ms "2.0.0"
debug@^3.0.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: debug@^3.0.0, debug@^3.1.1, debug@^3.2.5:
version "3.2.6" version "3.2.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
@ -2927,11 +2909,6 @@ deep-equal@^1.0.1:
object-keys "^1.1.1" object-keys "^1.1.1"
regexp.prototype.flags "^1.2.0" regexp.prototype.flags "^1.2.0"
deep-extend@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
deep-is@~0.1.3: deep-is@~0.1.3:
version "0.1.3" version "0.1.3"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
@ -3025,11 +3002,6 @@ delayed-stream@~1.0.0:
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
delegates@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
depd@~1.1.2: depd@~1.1.2:
version "1.1.2" version "1.1.2"
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
@ -3048,11 +3020,6 @@ destroy@~1.0.4:
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
detect-libc@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
detect-node@^2.0.4: detect-node@^2.0.4:
version "2.0.4" version "2.0.4"
resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c"
@ -3230,9 +3197,9 @@ ejs@^2.6.1:
integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
electron-to-chromium@^1.3.363: electron-to-chromium@^1.3.363:
version "1.3.376" version "1.3.378"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.376.tgz#7cb7b5205564a06c8f8ecfbe832cbd47a1224bb1" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.378.tgz#18c572cbb54bf5b2769855597cdc7511c02b481f"
integrity sha512-cv/PYVz5szeMz192ngilmezyPNFkUjuynuL2vNdiqIrio440nfTDdc0JJU0TS2KHLSVCs9gBbt4CFqM+HcBnjw== integrity sha512-nBp/AfhaVIOnfwgL1CZxt80IcqWcyYXiX6v5gflAksxy+SzBVz7A7UWR1Nos92c9ofXW74V9PoapzRb0jJfYXw==
elegant-spinner@^1.0.1: elegant-spinner@^1.0.1:
version "1.0.1" version "1.0.1"
@ -4093,13 +4060,6 @@ fs-extra@^7.0.1:
jsonfile "^4.0.0" jsonfile "^4.0.0"
universalify "^0.1.0" universalify "^0.1.0"
fs-minipass@^1.2.5:
version "1.2.7"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
dependencies:
minipass "^2.6.0"
fs-minipass@^2.0.0: fs-minipass@^2.0.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
@ -4140,20 +4100,6 @@ functional-red-black-tree@^1.0.1:
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
gauge@~2.7.3:
version "2.7.4"
resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
dependencies:
aproba "^1.0.3"
console-control-strings "^1.0.0"
has-unicode "^2.0.0"
object-assign "^4.1.0"
signal-exit "^3.0.0"
string-width "^1.0.1"
strip-ansi "^3.0.1"
wide-align "^1.1.0"
gensync@^1.0.0-beta.1: gensync@^1.0.0-beta.1:
version "1.0.0-beta.1" version "1.0.0-beta.1"
resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269"
@ -4353,11 +4299,6 @@ has-symbols@^1.0.0, has-symbols@^1.0.1:
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
has-unicode@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
has-value@^0.3.1: has-value@^0.3.1:
version "0.3.1" version "0.3.1"
resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
@ -4609,7 +4550,7 @@ human-signals@^1.1.1:
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: iconv-lite@0.4.24, iconv-lite@^0.4.24:
version "0.4.24" version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@ -4633,13 +4574,6 @@ iferr@^0.1.5:
resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=
ignore-walk@^3.0.1:
version "3.0.3"
resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37"
integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==
dependencies:
minimatch "^3.0.4"
ignore@^3.3.5: ignore@^3.3.5:
version "3.3.10" version "3.3.10"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
@ -4741,11 +4675,6 @@ inherits@2.0.3:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
ini@~1.3.0:
version "1.3.5"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
inquirer@^6.3.1: inquirer@^6.3.1:
version "6.5.2" version "6.5.2"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca"
@ -5260,11 +5189,11 @@ json5@^1.0.1:
minimist "^1.2.0" minimist "^1.2.0"
json5@^2.1.0: json5@^2.1.0:
version "2.1.1" version "2.1.2"
resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e"
integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== integrity sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==
dependencies: dependencies:
minimist "^1.2.0" minimist "^1.2.5"
jsonfile@^4.0.0: jsonfile@^4.0.0:
version "4.0.0" version "4.0.0"
@ -5829,7 +5758,7 @@ minimist@0.0.8:
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
minimist@^1.2.0: minimist@^1.2.0, minimist@^1.2.5:
version "1.2.5" version "1.2.5"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
@ -5855,14 +5784,6 @@ minipass-pipeline@^1.2.2:
dependencies: dependencies:
minipass "^3.0.0" minipass "^3.0.0"
minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
version "2.9.0"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
dependencies:
safe-buffer "^5.1.2"
yallist "^3.0.0"
minipass@^3.0.0, minipass@^3.1.1: minipass@^3.0.0, minipass@^3.1.1:
version "3.1.1" version "3.1.1"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5"
@ -5870,13 +5791,6 @@ minipass@^3.0.0, minipass@^3.1.1:
dependencies: dependencies:
yallist "^4.0.0" yallist "^4.0.0"
minizlib@^1.2.1:
version "1.3.3"
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
dependencies:
minipass "^2.9.0"
mississippi@^3.0.0: mississippi@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
@ -5901,13 +5815,20 @@ mixin-deep@^1.2.0:
for-in "^1.0.2" for-in "^1.0.2"
is-extendable "^1.0.1" is-extendable "^1.0.1"
mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: mkdirp@0.5.1:
version "0.5.1" version "0.5.1"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
dependencies: dependencies:
minimist "0.0.8" minimist "0.0.8"
mkdirp@^0.5.1, mkdirp@~0.5.1:
version "0.5.3"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz#5a514b7179259287952881e94410ec5465659f8c"
integrity sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==
dependencies:
minimist "^1.2.5"
move-concurrently@^1.0.1: move-concurrently@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
@ -5994,15 +5915,6 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
needle@^2.2.1:
version "2.3.3"
resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.3.tgz#a041ad1d04a871b0ebb666f40baaf1fb47867117"
integrity sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==
dependencies:
debug "^3.2.6"
iconv-lite "^0.4.4"
sax "^1.2.4"
negotiator@0.6.2: negotiator@0.6.2:
version "0.6.2" version "0.6.2"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
@ -6068,22 +5980,6 @@ node-ipc@^9.1.1:
util "^0.11.0" util "^0.11.0"
vm-browserify "^1.0.1" vm-browserify "^1.0.1"
node-pre-gyp@*:
version "0.14.0"
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83"
integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==
dependencies:
detect-libc "^1.0.2"
mkdirp "^0.5.1"
needle "^2.2.1"
nopt "^4.0.1"
npm-packlist "^1.1.6"
npmlog "^4.0.2"
rc "^1.2.7"
rimraf "^2.6.1"
semver "^5.3.0"
tar "^4.4.2"
node-releases@^1.1.50: node-releases@^1.1.50:
version "1.1.52" version "1.1.52"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9"
@ -6091,14 +5987,6 @@ node-releases@^1.1.50:
dependencies: dependencies:
semver "^6.3.0" semver "^6.3.0"
nopt@^4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48"
integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==
dependencies:
abbrev "1"
osenv "^0.1.4"
normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: normalize-package-data@^2.3.2, normalize-package-data@^2.5.0:
version "2.5.0" version "2.5.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
@ -6146,27 +6034,6 @@ normalize-url@^3.0.0:
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==
npm-bundled@^1.0.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b"
integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==
dependencies:
npm-normalize-package-bin "^1.0.1"
npm-normalize-package-bin@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2"
integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==
npm-packlist@^1.1.6:
version "1.4.8"
resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e"
integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==
dependencies:
ignore-walk "^3.0.1"
npm-bundled "^1.0.1"
npm-normalize-package-bin "^1.0.1"
npm-run-path@^2.0.0: npm-run-path@^2.0.0:
version "2.0.2" version "2.0.2"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
@ -6188,16 +6055,6 @@ npm-run-path@^4.0.0:
dependencies: dependencies:
path-key "^3.0.0" path-key "^3.0.0"
npmlog@^4.0.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
dependencies:
are-we-there-yet "~1.1.2"
console-control-strings "~1.1.0"
gauge "~2.7.3"
set-blocking "~2.0.0"
nth-check@^1.0.2, nth-check@~1.0.1: nth-check@^1.0.2, nth-check@~1.0.1:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
@ -6377,6 +6234,11 @@ ora@^3.4.0:
strip-ansi "^5.2.0" strip-ansi "^5.2.0"
wcwidth "^1.0.1" wcwidth "^1.0.1"
orderedmap@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-1.1.1.tgz#c618e77611b3b21d0fe3edc92586265e0059c789"
integrity sha512-3Ux8um0zXbVacKUkcytc0u3HgC0b0bBLT+I60r2J/En72cI0nZffqrA7Xtf2Hqs27j1g82llR5Mhbd0Z1XW4AQ==
original@^1.0.0: original@^1.0.0:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f"
@ -6389,11 +6251,6 @@ os-browserify@^0.3.0:
resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=
os-homedir@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
os-locale@^3.0.0: os-locale@^3.0.0:
version "3.1.0" version "3.1.0"
resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a"
@ -6403,19 +6260,11 @@ os-locale@^3.0.0:
lcid "^2.0.0" lcid "^2.0.0"
mem "^4.0.0" mem "^4.0.0"
os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: os-tmpdir@~1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
osenv@^0.1.4:
version "0.1.5"
resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
dependencies:
os-homedir "^1.0.0"
os-tmpdir "^1.0.0"
p-defer@^1.0.0: p-defer@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c"
@ -7155,6 +7004,13 @@ promise-inflight@^1.0.1:
resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
prosemirror-model@1.8.2:
version "1.8.2"
resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.8.2.tgz#c74eaacb0bbfea49b59a6d89fef5516181666a56"
integrity sha512-piffokzW7opZVCjf/9YaoXvTC0g7zMRWKJib1hpphPfC+4x6ZXe5CiExgycoWZJe59VxxP7uHX8aFiwg2i9mUQ==
dependencies:
orderedmap "^1.1.0"
proxy-addr@~2.0.5: proxy-addr@~2.0.5:
version "2.0.6" version "2.0.6"
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
@ -7298,16 +7154,6 @@ raw-body@2.4.0:
iconv-lite "0.4.24" iconv-lite "0.4.24"
unpipe "1.0.0" unpipe "1.0.0"
rc@^1.2.7:
version "1.2.8"
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
dependencies:
deep-extend "^0.6.0"
ini "~1.3.0"
minimist "^1.2.0"
strip-json-comments "~2.0.1"
read-pkg-up@^2.0.0: read-pkg-up@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
@ -7335,7 +7181,7 @@ read-pkg@^5.1.1:
parse-json "^5.0.0" parse-json "^5.0.0"
type-fest "^0.6.0" type-fest "^0.6.0"
"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6:
version "2.3.7" version "2.3.7"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
@ -7691,7 +7537,7 @@ safe-regex@^1.1.0:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
sax@^1.2.4, sax@~1.2.4: sax@~1.2.4:
version "1.2.4" version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
@ -7792,7 +7638,7 @@ serve-static@1.14.1:
parseurl "~1.3.3" parseurl "~1.3.3"
send "0.17.1" send "0.17.1"
set-blocking@^2.0.0, set-blocking@~2.0.0: set-blocking@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
@ -8166,7 +8012,7 @@ string-width@^1.0.1:
is-fullwidth-code-point "^1.0.0" is-fullwidth-code-point "^1.0.0"
strip-ansi "^3.0.0" strip-ansi "^3.0.0"
"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
version "2.1.1" version "2.1.1"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
@ -8292,11 +8138,6 @@ strip-json-comments@^3.0.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7"
integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==
strip-json-comments@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
stylehacks@^4.0.0: stylehacks@^4.0.0:
version "4.0.3" version "4.0.3"
resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5"
@ -8381,19 +8222,6 @@ tapable@^1.0.0, tapable@^1.1.3:
resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
tar@^4.4.2:
version "4.4.13"
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==
dependencies:
chownr "^1.1.1"
fs-minipass "^1.2.5"
minipass "^2.8.6"
minizlib "^1.2.1"
mkdirp "^0.5.0"
safe-buffer "^5.1.2"
yallist "^3.0.3"
terser-webpack-plugin@^1.4.3: terser-webpack-plugin@^1.4.3:
version "1.4.3" version "1.4.3"
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c"
@ -8425,9 +8253,9 @@ terser-webpack-plugin@^2.3.4:
webpack-sources "^1.4.3" webpack-sources "^1.4.3"
terser@^4.1.2, terser@^4.4.3: terser@^4.1.2, terser@^4.4.3:
version "4.6.6" version "4.6.7"
resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.6.tgz#da2382e6cafbdf86205e82fb9a115bd664d54863" resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.7.tgz#478d7f9394ec1907f0e488c5f6a6a9a2bad55e72"
integrity sha512-4lYPyeNmstjIIESr/ysHg2vUPRGf2tzF9z2yYwnowXVuVzLEamPN1Gfrz7f8I9uEPuHcbFlW4PLIAsJoxXyJ1g== integrity sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g==
dependencies: dependencies:
commander "^2.20.0" commander "^2.20.0"
source-map "~0.6.1" source-map "~0.6.1"
@ -8937,9 +8765,9 @@ vue-loader@^15.8.3:
vue-style-loader "^4.1.0" vue-style-loader "^4.1.0"
vue-property-decorator@^8.4.0: vue-property-decorator@^8.4.0:
version "8.4.0" version "8.4.1"
resolved "https://registry.yarnpkg.com/vue-property-decorator/-/vue-property-decorator-8.4.0.tgz#f4e641f84ca51a7b4721e236392a1efbb6eac00b" resolved "https://registry.yarnpkg.com/vue-property-decorator/-/vue-property-decorator-8.4.1.tgz#fd8045b8678e1348fed57f9149279e00e404ed38"
integrity sha512-0o85LJSTLZvDaB7IXfmpONfAQZ7NgScFvptFSrlFFSsScR716muJb3mMFojNnKC3Vpm7CM4PsmHNdk30uuNpag== integrity sha512-8R4Us7DxFO0rwAL/2fv6vaZL8Oa4n/HGanHODYGTcvQHwT0FYJr9UuuFm2GoWAIXQu1mDO03HNeHswFp9vmTVA==
dependencies: dependencies:
vue-class-component "^7.1.0" vue-class-component "^7.1.0"
@ -9159,13 +8987,6 @@ which@^2.0.1:
dependencies: dependencies:
isexe "^2.0.0" isexe "^2.0.0"
wide-align@^1.1.0:
version "1.1.3"
resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
dependencies:
string-width "^1.0.2 || 2"
word-wrap@~1.2.3: word-wrap@~1.2.3:
version "1.2.3" version "1.2.3"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
@ -9379,7 +9200,7 @@ yallist@^2.1.2:
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: yallist@^3.0.2:
version "3.1.1" version "3.1.1"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==

Loading…
Cancel
Save