` field `` cell. If custom attributes per cell are required, a callback function can be specified instead. The function will be called as `thAttr(value, key, item, type)` and it must return an `Object`. |
| `isRowHeader` | Boolean | When set to `true`, the field's item data cell will be rendered with ` | ` rather than the default of ` | `. |
-| `stickyColumn` | Boolean | When set to `true`, and the table in in [responsive](#responsive-tables) mode or has [sticky headers](#sticky-headers), will cause the column to become fixed to the left when the table's horizontal scrollbar is scrolled. See [Sticky columns](#sticky-columns) for more details |
+| `stickyColumn` | Boolean | When set to `true`, and the table in [responsive](#responsive-tables) mode or has [sticky headers](#sticky-headers), will cause the column to become fixed to the left when the table's horizontal scrollbar is scrolled. See [Sticky columns](#sticky-columns) for more details |
**Notes:**
@@ -890,9 +890,12 @@ The slot's scope variable (`data` in the above sample) will have the following p
| `item` | Object | The entire raw record data (i.e. `items[index]`) for this row (before any formatter is applied) |
| `value` | Any | The value for this key in the record (`null` or `undefined` if a virtual column), or the output of the field's [`formatter` function](#formatter-callback) |
| `unformatted` | Any | The raw value for this key in the item record (`null` or `undefined` if a virtual column), before being passed to the field's [`formatter` function](#formatter-callback) |
+| `field` | Object | The field's normalized field definition object |
| `detailsShowing` | Boolean | Will be `true` if the row's `row-details` scoped slot is visible. See section [Row details support](#row-details-support) below for additional information |
| `toggleDetails` | Function | Can be called to toggle the visibility of the rows `row-details` scoped slot. See section [Row details support](#row-details-support) below for additional information |
| `rowSelected` | Boolean | Will be `true` if the row has been selected. See section [Row select support](#row-select-support) for additional information |
+| `selectRow` | Function | When called, selects the current row. See section [Row select support](#row-select-support) for additional information |
+| `unselectRow` | Function | When called, unselects the current row. See section [Row select support](#row-select-support) for additional information |
**Notes:**
@@ -1406,12 +1409,17 @@ for proper reactive detection of changes to it's value. Read more about
**Available `row-details` scoped variable properties:**
-| Property | Type | Description |
-| --------------- | -------- | ------------------------------------------------------------------------- |
-| `item` | Object | The entire row record data object |
-| `index` | Number | The current visible row number |
-| `fields` | Array | The normalized fields definition array (in the _array of objects_ format) |
-| `toggleDetails` | Function | Function to toggle visibility of the row's details slot |
+| Property | Type | Description |
+| --------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------- |
+| `item` | Object | The entire row record data object |
+| `index` | Number | The current visible row number |
+| `fields` | Array | The normalized fields definition array (in the _array of objects_ format) |
+| `toggleDetails` | Function | Function to toggle visibility of the row's details slot |
+| `rowSelected` | Boolean | Will be `true` if the row has been selected. See section [Row select support](#row-select-support) for additional information |
+| `selectRow` | Function | When called, selects the current row. See section [Row select support](#row-select-support) for additional information |
+| `unselectRow` | Function | When called, unselects the current row. See section [Row select support](#row-select-support) for additional information |
+
+Note: the row select related scope properties are only available in ``.
In the following example, we show two methods of toggling the visibility of the details: one via a
button, and one via a checkbox. We also have the third row details defaulting to have details
@@ -1509,6 +1517,8 @@ Rows can also be programmatically selected and unselected via the following expo
- In `single` mode, `selectRow(index)` will unselect any previous selected row.
- Attempting to `selectRow(index)` or `unselectRow(index)` on a non-existent row will be ignored.
- The table must be `selectable` for any of these methods to have effect.
+- You can disable selection of rows via click events by setting the `no-select-on-click` prop. Rows
+ will then only be selectable programmatically.
**Row select notes:**
@@ -1540,12 +1550,12 @@ example).
The `selected-variant` can be any of the
[standard (or custom) bootstrap base color variants](/docs/reference/color-variants), or the special
-[table `active` variant](/docs/reference/color-variants#table-variants) which takes precedence over
-any specific row or cell variants.
+[table `active` variant](/docs/reference/color-variants#table-variants) (the default) which takes
+precedence over any specific row or cell variants.
For accessibility reasons (specifically for color blind users, or users with color contrast issues),
it is highly recommended to always provide some other visual means of conveying that a row is
-selected, such as shown in the example below.
+selected, such as a virtual column as shown in the example below.
```html
@@ -1558,7 +1568,6 @@ selected, such as shown in the example below.
ref="selectableTable"
selectable
:select-mode="selectMode"
- selected-variant="active"
:items="items"
:fields="fields"
@row-selected="onRowSelected"
@@ -1932,7 +1941,7 @@ sorts _before_ `z`) or Swedish set `sort-compare-locale="sv"` (in Swedish, `รค`
**Notes:**
- Refer to
- [MDN `String.prototype.localeCompare()` documentation](https://developer.mozilla.org/enUS/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare)
+ [MDN `String.prototype.localeCompare()` documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare)
for details on the options object property values.
- Refer to
[MDN locales documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#locales_argument)
@@ -2125,6 +2134,9 @@ Setting the prop `filter` to null or an empty string will clear local items filt
### Debouncing filter criteria changes
+deprecated in v2.1.0 Use the `debounce` feature of
+[``](/docs/components/form-input#debounce-support) instead.
+
If you have a text input tied to the `filter` prop of ``, the filtering process will occur
for each character typed by the user. With large items datasets, this process can take a while and
may cause the text input to appear sluggish.
@@ -2332,8 +2344,9 @@ of records.
respective `no-provider-*` prop set to `true`).
- The `no-local-sorting` prop has no effect when `items` is a provider function.
- When using provider filtering, you may find that setting the
- [`filter-debounce` prop](#debouncing-filter-criteria-changes) to a value greater than `100` ms
- will help minimize the number of calls to your back end API as the user types in the criteria.
+ [`debounce` prop on ``](/docs/components/form-input#debounce-support) to a value
+ greater than `100` ms will help minimize the number of calls to your back end API as the user
+ types in the criteria.
### Force refreshing of table data
@@ -2757,10 +2770,11 @@ cells.
### Data row accessibility
-When the table is in `selectable` mode (`` only), or if there is a `row-clicked` event
-listener registered (`` and ``), all data item rows (`` elements) will be
-placed into the document tab sequence (via `tabindex="0"`) to allow keyboard-only and screen reader
-users the ability to click the rows by pressing ENTER.
+When the table is in `selectable` mode (`` only, and prop `no-select-on-click` is not set),
+or if there is a `row-clicked` event listener registered (`` and ``), all
+data item rows (`` elements) will be placed into the document tab sequence (via `tabindex="0"`)
+to allow keyboard-only and screen reader users the ability to click the rows by pressing
+ENTER or SPACE.
When the table items rows are placed in the document tab sequence (`` and
``), they will also support basic keyboard navigation when focused:
@@ -2770,8 +2784,6 @@ When the table items rows are placed in the document tab sequence (`` a
- END or DOWN+SHIFT will move to the last row
- HOME or UP+SHIFT will move to the first row
- ENTER or SPACE to click the row.
-- SHIFT and CTRL modifiers will also work (depending on the table selectable
- mode, for `` only).
### Row event accessibility
diff --git a/src/components/table/_table.scss b/src/components/table/_table.scss
index 34c905cbe25..a5a8ac33448 100644
--- a/src/components/table/_table.scss
+++ b/src/components/table/_table.scss
@@ -361,7 +361,7 @@ $bv-escaped-characters: (("<", "%3c"), (">", "%3e"), ("#", "%23"));
// --- Selectable rows ---
.table.b-table {
- &.b-table-selectable {
+ &.b-table-selectable:not(.b-table-selectable-no-click) {
& > tbody > tr {
cursor: pointer;
}
diff --git a/src/components/table/helpers/mixin-filtering.js b/src/components/table/helpers/mixin-filtering.js
index 550103c08b3..64707cbc95a 100644
--- a/src/components/table/helpers/mixin-filtering.js
+++ b/src/components/table/helpers/mixin-filtering.js
@@ -2,8 +2,12 @@ import cloneDeep from '../../../utils/clone-deep'
import looseEqual from '../../../utils/loose-equal'
import { concat } from '../../../utils/array'
import { isFunction, isString, isRegExp } from '../../../utils/inspect'
+import { warn } from '../../../utils/warn'
import stringifyRecordValues from './stringify-record-values'
+const DEPRECATED_DEBOUNCE =
+ 'b-table: Prop "filter-debounce" is deprecated. Use the debounce feature of instead'
+
export default {
props: {
filter: {
@@ -24,6 +28,7 @@ export default {
},
filterDebounce: {
type: [Number, String],
+ deprecated: DEPRECATED_DEBOUNCE,
default: 0,
validator: val => /^\d+/.test(String(val))
}
@@ -45,7 +50,12 @@ export default {
return this.filterIncludedFields ? concat(this.filterIncludedFields).filter(Boolean) : null
},
computedFilterDebounce() {
- return parseInt(this.filterDebounce, 10) || 0
+ const ms = parseInt(this.filterDebounce, 10) || 0
+ /* istanbul ignore next */
+ if (ms > 0) {
+ warn(DEPRECATED_DEBOUNCE)
+ }
+ return ms
},
localFiltering() {
return this.hasProvider ? !!this.noProviderFiltering : true
diff --git a/src/components/table/helpers/mixin-items.js b/src/components/table/helpers/mixin-items.js
index 8b98cba518b..0449fe52d96 100644
--- a/src/components/table/helpers/mixin-items.js
+++ b/src/components/table/helpers/mixin-items.js
@@ -1,5 +1,6 @@
import looseEqual from '../../../utils/loose-equal'
import { isArray, isFunction, isNull, isString, isUndefined } from '../../../utils/inspect'
+import { clone } from '../../../utils/object'
import normalizeFields from './normalize-fields'
export default {
@@ -50,7 +51,7 @@ export default {
const parent = this.$parent
return this.computedFields.reduce((obj, f) => {
// We use object spread here so we don't mutate the original field object
- obj[f.key] = { ...f }
+ obj[f.key] = clone(f)
if (f.formatter) {
// Normalize formatter to a function ref or `undefined`
let formatter = f.formatter
diff --git a/src/components/table/helpers/mixin-provider.js b/src/components/table/helpers/mixin-provider.js
index 6340e8cb35a..6a037487381 100644
--- a/src/components/table/helpers/mixin-provider.js
+++ b/src/components/table/helpers/mixin-provider.js
@@ -1,6 +1,7 @@
import looseEqual from '../../../utils/loose-equal'
import warn from '../../../utils/warn'
import { isArray, isFunction, isPromise } from '../../../utils/inspect'
+import { clone } from '../../../utils/object'
import listenOnRootMixin from '../../../mixins/listen-on-root'
export default {
@@ -62,7 +63,7 @@ export default {
ctx.perPage = this.perPage
ctx.currentPage = this.currentPage
}
- return { ...ctx }
+ return clone(ctx)
}
},
watch: {
diff --git a/src/components/table/helpers/mixin-selectable.js b/src/components/table/helpers/mixin-selectable.js
index 65fa7ccfe85..e31bec32127 100644
--- a/src/components/table/helpers/mixin-selectable.js
+++ b/src/components/table/helpers/mixin-selectable.js
@@ -19,6 +19,11 @@ export default {
selectedVariant: {
type: String,
default: () => getComponentConfig('BTable', 'selectedVariant')
+ },
+ noSelectOnClick: {
+ // Disable use of click handlers for row selection
+ type: Boolean,
+ default: false
}
},
data() {
@@ -31,6 +36,12 @@ export default {
isSelectable() {
return this.selectable && this.selectMode
},
+ hasSelectableRowClick() {
+ return this.isSelectable && !this.noSelectOnClick
+ },
+ supportsSelectableRows() {
+ return true
+ },
selectableHasSelection() {
return (
this.isSelectable &&
@@ -46,11 +57,15 @@ export default {
return {
'b-table-selectable': this.isSelectable,
[`b-table-select-${this.selectMode}`]: this.isSelectable,
- 'b-table-selecting': this.selectableHasSelection
+ 'b-table-selecting': this.selectableHasSelection,
+ 'b-table-selectable-no-click': this.isSelectable && !this.hasSelectableRowClick
}
},
selectableTableAttrs() {
return {
+ // TODO:
+ // Should this attribute not be included when no-select-on-click is set
+ // since this attribute implies keyboard navigation?
'aria-multiselectable': !this.isSelectable
? null
: this.selectableIsMultiSelect
@@ -82,6 +97,10 @@ export default {
selectMode(newVal, oldVal) {
this.clearSelected()
},
+ hasSelectableRowClick(newVal, oldVal) {
+ this.clearSelected()
+ this.setSelectionHandlers(!newVal)
+ },
selectedRows(selectedRows, oldVal) {
if (this.isSelectable && !looseEqual(selectedRows, oldVal)) {
const items = []
@@ -96,7 +115,7 @@ export default {
}
},
beforeMount() {
- // Set up handlers
+ // Set up handlers if needed
if (this.isSelectable) {
this.setSelectionHandlers(true)
}
@@ -161,7 +180,7 @@ export default {
}
},
setSelectionHandlers(on) {
- const method = on ? '$on' : '$off'
+ const method = on && !this.noSelectOnClick ? '$on' : '$off'
// Handle row-clicked event
this[method]('row-clicked', this.selectionHandler)
// Clear selection on filter, pagination, and sort changes
@@ -170,11 +189,9 @@ export default {
},
selectionHandler(item, index, evt) {
/* istanbul ignore if: should never happen */
- if (!this.isSelectable) {
+ if (!this.isSelectable || this.noSelectOnClick) {
// Don't do anything if table is not in selectable mode
- /* istanbul ignore next: should never happen */
this.clearSelected()
- /* istanbul ignore next: should never happen */
return
}
const selectMode = this.selectMode
diff --git a/src/components/table/helpers/mixin-tbody-row.js b/src/components/table/helpers/mixin-tbody-row.js
index 485429971cb..2a7c77b96f4 100644
--- a/src/components/table/helpers/mixin-tbody-row.js
+++ b/src/components/table/helpers/mixin-tbody-row.js
@@ -10,7 +10,11 @@ const detailsSlotName = 'row-details'
export default {
props: {
tbodyTrClass: {
- type: [String, Array, Function],
+ type: [String, Array, Object, Function],
+ default: null
+ },
+ detailsTdClass: {
+ type: [String, Array, Object],
default: null
}
},
@@ -85,10 +89,12 @@ export default {
const hasDetailsSlot = this.hasNormalizedSlot(detailsSlotName)
const formatted = this.getFormattedValue(item, field)
const key = field.key
+ const stickyColumn =
+ !this.isStacked && (this.isResponsive || this.stickyHeader) && field.stickyColumn
// We only uses the helper components for sticky columns to
// improve performance of BTable/BTableLite by reducing the
// total number of vue instances created during render
- const cellTag = field.stickyColumn
+ const cellTag = stickyColumn
? field.isRowHeader
? BTh
: BTd
@@ -114,11 +120,11 @@ export default {
: this.getTdValues(item, key, field.tdAttr, {}))
}
}
- if (field.stickyColumn) {
+ if (stickyColumn) {
// We are using the helper BTd or BTh
data.props = {
stackedHeading: this.isStacked ? field.label : null,
- stickyColumn: field.stickyColumn,
+ stickyColumn: true,
variant: cellVariant
}
} else {
@@ -142,9 +148,12 @@ export default {
toggleDetails: this.toggleDetailsFactory(hasDetailsSlot, item),
detailsShowing: Boolean(item._showDetails)
}
- if (this.selectedRows) {
- // Add in rowSelected scope property if selectable rows supported
+ // If table supports selectable mode, then add in the following scope
+ // this.supportsSelectableRows will be undefined if mixin isn't loaded
+ if (this.supportsSelectableRows) {
slotScope.rowSelected = this.isRowSelected(rowIndex)
+ slotScope.selectRow = () => this.selectRow(rowIndex)
+ slotScope.unselectRow = () => this.unselectRow(rowIndex)
}
// The new `v-slot` syntax doesn't like a slot name starting with
// a square bracket and if using in-document HTML templates, the
@@ -170,7 +179,7 @@ export default {
const tableStriped = this.striped
const hasDetailsSlot = this.hasNormalizedSlot(detailsSlotName)
const rowShowDetails = Boolean(item._showDetails && hasDetailsSlot)
- const hasRowClickHandler = this.$listeners['row-clicked'] || this.isSelectable
+ const hasRowClickHandler = this.$listeners['row-clicked'] || this.hasSelectableRowClick
// We can return more than one TR if rowDetails enabled
const $rows = []
@@ -196,12 +205,12 @@ export default {
// rows index within the tbody.
// See: https://github.com/bootstrap-vue/bootstrap-vue/issues/2410
const primaryKey = this.primaryKey
- const hasPkValue = primaryKey && !isUndefinedOrNull(item[primaryKey])
- const rowKey = hasPkValue ? toString(item[primaryKey]) : String(rowIndex)
+ const primaryKeyValue = toString(get(item, primaryKey)) || null
+ const rowKey = primaryKeyValue || String(rowIndex)
// If primary key is provided, use it to generate a unique ID on each tbody > tr
// In the format of '{tableId}__row_{primaryKeyValue}'
- const rowId = hasPkValue ? this.safeId(`_row_${item[primaryKey]}`) : null
+ const rowId = primaryKeyValue ? this.safeId(`_row_${primaryKeyValue}`) : null
// Selectable classes and attributes
const selectableClasses = this.selectableRowClasses ? this.selectableRowClasses(rowIndex) : {}
@@ -224,8 +233,7 @@ export default {
attrs: {
id: rowId,
tabindex: hasRowClickHandler ? '0' : null,
- 'data-pk': rowId ? String(item[primaryKey]) : null,
- // Should this be `aria-details` instead?
+ 'data-pk': primaryKeyValue || null,
'aria-details': detailsId,
'aria-owns': detailsId,
'aria-rowindex': ariaRowIndex,
@@ -249,16 +257,24 @@ export default {
fields: fields,
toggleDetails: this.toggleDetailsFactory(hasDetailsSlot, item)
}
+ // If table supports selectable mode, then add in the following scope
+ // this.supportsSelectableRows will be undefined if mixin isn't loaded
+ if (this.supportsSelectableRows) {
+ detailsScope.rowSelected = this.isRowSelected(rowIndex)
+ detailsScope.selectRow = () => this.selectRow(rowIndex)
+ detailsScope.unselectRow = () => this.unselectRow(rowIndex)
+ }
// Render the details slot in a TD
- const $details = h(BTd, { props: { colspan: fields.length } }, [
+ const $details = h(BTd, { props: { colspan: fields.length }, class: this.detailsTdClass }, [
this.normalizeSlot(detailsSlotName, detailsScope)
])
// Add a hidden row to keep table row striping consistent when details showing
+ // Only added if the table is striped
if (tableStriped) {
$rows.push(
- // We don't use `BTr` here as we dont need the extra functionality
+ // We don't use `BTr` here as we don't need the extra functionality
h('tr', {
key: `__b-table-details-stripe__${rowKey}`,
staticClass: 'd-none',
diff --git a/src/components/table/helpers/mixin-tbody.js b/src/components/table/helpers/mixin-tbody.js
index 56b308ed084..ae27c17dc61 100644
--- a/src/components/table/helpers/mixin-tbody.js
+++ b/src/components/table/helpers/mixin-tbody.js
@@ -1,5 +1,5 @@
import KeyCodes from '../../../utils/key-codes'
-import { arrayIncludes } from '../../../utils/array'
+import { arrayIncludes, from as arrayFrom } from '../../../utils/array'
import { closest, isElement } from '../../../utils/dom'
import { props as tbodyProps, BTbody } from '../tbody'
import filterEvent from './filter-event'
@@ -23,11 +23,14 @@ export default {
// Returns all the item TR elements (excludes detail and spacer rows)
// `this.$refs.itemRows` is an array of item TR components/elements
// Rows should all be B-TR components, but we map to TR elements
+ // Also note that `this.$refs.itemRows` may not always be in document order
+ const tbody = this.$refs.tbody.$el || this.$refs.tbody
+ const trs = (this.$refs.itemRows || []).map(tr => tr.$el || tr)
// TODO: This may take time for tables many rows, so we may want to cache
// the result of this during each render cycle on a non-reactive
// property. We clear out the cache as each render starts, and
// populate it on first access of this method if null
- return (this.$refs.itemRows || []).map(tr => tr.$el || tr)
+ return arrayFrom(tbody.children).filter(tr => arrayIncludes(trs, tr))
},
getTbodyTrIndex(el) {
// Returns index of a particular TBODY item TR
@@ -133,7 +136,7 @@ export default {
const items = this.computedItems
// Shortcut to `createElement` (could use `this._c()` instead)
const h = this.$createElement
- const hasRowClickHandler = this.$listeners['row-clicked'] || this.isSelectable
+ const hasRowClickHandler = this.$listeners['row-clicked'] || this.hasSelectableRowClick
// Prepare the tbody rows
const $rows = []
diff --git a/src/components/table/helpers/mixin-tfoot.js b/src/components/table/helpers/mixin-tfoot.js
index e8555d14842..c5e53f01b4c 100644
--- a/src/components/table/helpers/mixin-tfoot.js
+++ b/src/components/table/helpers/mixin-tfoot.js
@@ -8,9 +8,13 @@ export default {
default: false
},
footVariant: {
- type: String,
+ type: String, // 'dark', 'light', or `null` (or custom)
default: () => getComponentConfig('BTable', 'footVariant')
},
+ footRowVariant: {
+ type: String, // Any Bootstrap theme variant (or custom). Falls back to `headRowVariant`
+ default: null
+ },
tfootClass: {
type: [String, Array, Object],
default: null
diff --git a/src/components/table/helpers/mixin-thead.js b/src/components/table/helpers/mixin-thead.js
index beade432335..6b09047a2fd 100644
--- a/src/components/table/helpers/mixin-thead.js
+++ b/src/components/table/helpers/mixin-thead.js
@@ -2,6 +2,7 @@ import KeyCodes from '../../../utils/key-codes'
import startCase from '../../../utils/startcase'
import { getComponentConfig } from '../../../utils/config'
import { htmlOrText } from '../../../utils/html'
+import { isUndefinedOrNull } from '../../../utils/inspect'
import filterEvent from './filter-event'
import textSelectionActive from './text-selection-active'
import { BThead } from '../thead'
@@ -12,9 +13,13 @@ import { BTh } from '../th'
export default {
props: {
headVariant: {
- type: String, // 'light', 'dark' or null (or custom)
+ type: String, // 'light', 'dark' or `null` (or custom)
default: () => getComponentConfig('BTable', 'headVariant')
},
+ headRowVariant: {
+ type: String, // Any Bootstrap theme variant (or custom)
+ default: null
+ },
theadClass: {
type: [String, Array, Object]
// default: undefined
@@ -50,12 +55,12 @@ export default {
const fields = this.computedFields || []
if (this.isStackedAlways || fields.length === 0) {
- // In always stacked mode, we don't bother rendering the head/foot.
+ // In always stacked mode, we don't bother rendering the head/foot
// Or if no field headings (empty table)
return h()
}
- // Refernce to `selectAllRows` and `clearSelected()`, if table is Selectable
+ // Reference to `selectAllRows` and `clearSelected()`, if table is selectable
const selectAllRows = this.isSelectable ? this.selectAllRows : () => {}
const clearSelected = this.isSelectable ? this.clearSelected : () => {}
@@ -142,7 +147,12 @@ export default {
// Genrate the row(s)
const $trs = []
if (isFoot) {
- $trs.push(h(BTr, { class: this.tfootTrClass }, $cells))
+ const trProps = {
+ variant: isUndefinedOrNull(this.footRowVariant)
+ ? this.headRowVariant
+ : this.footRowVariant
+ }
+ $trs.push(h(BTr, { class: this.tfootTrClass, props: trProps }, $cells))
} else {
const scope = {
columns: fields.length,
@@ -152,7 +162,9 @@ export default {
clearSelected
}
$trs.push(this.normalizeSlot('thead-top', scope) || h())
- $trs.push(h(BTr, { class: this.theadTrClass }, $cells))
+ $trs.push(
+ h(BTr, { class: this.theadTrClass, props: { variant: this.headRowVariant } }, $cells)
+ )
}
return h(
diff --git a/src/components/table/helpers/normalize-fields.js b/src/components/table/helpers/normalize-fields.js
index 525c822ab39..03fb47a24eb 100644
--- a/src/components/table/helpers/normalize-fields.js
+++ b/src/components/table/helpers/normalize-fields.js
@@ -1,6 +1,6 @@
import startCase from '../../../utils/startcase'
import { isArray, isFunction, isObject, isString } from '../../../utils/inspect'
-import { keys } from '../../../utils/object'
+import { clone, keys } from '../../../utils/object'
import { IGNORED_FIELD_KEYS } from './constants'
// Private function to massage field entry into common object format
@@ -13,7 +13,7 @@ const processField = (key, value) => {
// Formatter shortcut
field = { key: key, formatter: value }
} else if (isObject(value)) {
- field = { ...value }
+ field = clone(value)
field.key = field.key || key
} else if (value !== false) {
// Fallback to just key
@@ -35,7 +35,7 @@ const normalizeFields = (origFields, items) => {
fields.push({ key: f, label: startCase(f) })
} else if (isObject(f) && f.key && isString(f.key)) {
// Full object definition. We use assign so that we don't mutate the original
- fields.push({ ...f })
+ fields.push(clone(f))
} else if (isObject(f) && keys(f).length === 1) {
// Shortcut object (i.e. { 'foo_bar': 'This is Foo Bar' }
const key = keys(f)[0]
diff --git a/src/components/table/package.json b/src/components/table/package.json
index 3e4313a8801..f4f689eb937 100644
--- a/src/components/table/package.json
+++ b/src/components/table/package.json
@@ -75,19 +75,29 @@
},
{
"prop": "headVariant",
- "description": "Header variant: 'light' or 'dark', or unset"
+ "description": "Header variant: 'light' or 'dark', or unset. May take precedence over head-row-variant"
+ },
+ {
+ "prop": "headRowVariant",
+ "version": "2.1.0",
+ "description": "Apply a Bootstrap theme color variant to the tr element in the thead"
},
{
"prop": "footVariant",
- "description": "Footer variant: 'light' or 'dark', or unset"
+ "description": "Footer variant: 'light' or 'dark', or unset. May take precedence over foot-row-variant"
+ },
+ {
+ "prop": "footRowVariant",
+ "version": "2.1.0",
+ "description": "Apply a Bootstrap theme color variant to the tr element in the tfoot. Falls back to head-row-variant"
},
{
"prop": "tbodyTransitionProps",
- "description": "Vue 'transition-list' properties. When provided will make the tbody a Vue 'transition-list' component"
+ "description": "Vue 'transition-group' properties. When provided will make the tbody a Vue 'transition-group' component"
},
{
"prop": "tbodyTransitionHandlers",
- "description": "Vue 'transition-list' event handlers. When provided will make the tbody a Vue 'transition-list' component"
+ "description": "Vue 'transition-group' event handlers. When provided will make the tbody a Vue 'transition-group' component"
},
{
"prop": "caption",
@@ -125,6 +135,11 @@
"prop": "tbodyTrClass",
"description": "CSS class (or classes) to apply to the tr element in the tbody. Can be a function that returns a class (see docs for details)"
},
+ {
+ "prop": "detailsTdClass",
+ "version": "2.1.0",
+ "description": "CSS class (or classes) to apply to the td element in the details row"
+ },
{
"prop": "value",
"description": "Currently displayed row data. Read-only. Do not set a value on this prop"
@@ -235,7 +250,12 @@
},
{
"prop": "selectedVariant",
- "description": "Bootstrap color theme variant to set selected rows to. use any of hte standard Bootstrap theme variants, or the special table row variant 'active'"
+ "description": "Bootstrap color theme variant to set selected rows to. Use any of the standard Bootstrap theme color variants, or the special table row variant 'active' (default). Set to an empty string to not use a variant"
+ },
+ {
+ "prop": "noSelectOnClick",
+ "version": "2.1.0",
+ "description": "Disables row selection via click events. Row selection will be only available programmatically"
},
{
"prop": "showEmpty",
@@ -276,7 +296,7 @@
{
"prop": "filterDebounce",
"version": "2.0.0",
- "description": "Time in milliseconds to debounce changes to the filter criteria before filtering hte records"
+ "description": "Time in milliseconds to debounce changes to the filter criteria before filtering the records"
}
],
"events": [
@@ -296,7 +316,10 @@
},
{
"arg": "event",
- "type": "MouseEvent",
+ "type": [
+ "MouseEvent",
+ "KeyboardEvent"
+ ],
"description": "Native event object."
}
]
@@ -433,7 +456,10 @@
},
{
"arg": "event",
- "type": "MouseEvent",
+ "type": [
+ "MouseEvent",
+ "KeyboardEvent"
+ ],
"description": "Native event object."
},
{
@@ -518,6 +544,11 @@
"prop": "unformatted",
"description": "The raw value for this key in the item record (null or undefined if a virtual column), before being passed to the field's formatter function"
},
+ {
+ "prop": "field",
+ "type": "Object",
+ "description": "The field's normalized definition object (from the fields prop)"
+ },
{
"prop": "detailsShowing",
"type": "Boolean",
@@ -531,7 +562,19 @@
{
"prop": "rowSelected",
"type": "Boolean",
- "description": "Will be true if the row has been selected."
+ "description": "Will be true if the row has been selected. Only applicable when table is in selectable mode"
+ },
+ {
+ "prop": "selectRow",
+ "type": "Function",
+ "version": "2.1.0",
+ "description": "Can be called to select the current row. Only applicable when table is in selectable mode"
+ },
+ {
+ "prop": "unselectRow",
+ "type": "Function",
+ "version": "2.1.0",
+ "description": "Can be called to unselect the current row. Only applicable when table is in selectable mode"
}
]
},
@@ -557,6 +600,11 @@
"prop": "unformatted",
"description": "The raw value for this key in the item record (null or undefined if a virtual column), before being passed to the field's formatter function"
},
+ {
+ "prop": "field",
+ "type": "Object",
+ "description": "The field's normalized definition object (from the fields prop)"
+ },
{
"prop": "detailsShowing",
"type": "Boolean",
@@ -570,7 +618,19 @@
{
"prop": "rowSelected",
"type": "Boolean",
- "description": "Will be true if the row has been selected."
+ "description": "Will be true if the row has been selected. Only applicable when table is in selectable mode"
+ },
+ {
+ "prop": "selectRow",
+ "type": "Function",
+ "version": "2.1.0",
+ "description": "Can be called to select the current row. Only applicable when table is in selectable mode"
+ },
+ {
+ "prop": "unselectRow",
+ "type": "Function",
+ "version": "2.1.0",
+ "description": "Can be called to unselect the current row. Only applicable when table is in selectable mode"
}
]
},
@@ -587,7 +647,7 @@
{
"prop": "field",
"type": "Object",
- "description": "the field's definition object (from the fields prop)"
+ "description": "The field's normalized definition object (from the fields prop)"
},
{
"prop": "label",
@@ -623,7 +683,7 @@
{
"prop": "field",
"type": "Object",
- "description": "the field's definition object (from the fields prop)"
+ "description": "The field's normalized definition object (from the fields prop)"
},
{
"prop": "label",
@@ -660,7 +720,7 @@
{
"prop": "field",
"type": "Object",
- "description": "the field's definition object (from the fields prop)"
+ "description": "The field's normalized definition object (from the fields prop)"
},
{
"prop": "label",
@@ -691,7 +751,7 @@
{
"prop": "field",
"type": "Object",
- "description": "the field's definition object (from the fields prop)"
+ "description": "The field's normalized definition object (from the fields prop)"
},
{
"prop": "label",
@@ -721,7 +781,7 @@
{
"prop": "columns",
"type": "Number",
- "description": "the number of columns in the table"
+ "description": "The number of columns in the table"
},
{
"prop": "fields",
@@ -757,6 +817,24 @@
"prop": "toggleDetails",
"type": "Function",
"description": "Function to toggle visibility of the row's details slot"
+ },
+ {
+ "prop": "rowSelected",
+ "type": "Boolean",
+ "version": "2.1.0",
+ "description": "Will be true if the row has been selected. Only applicable when table is in selectable mode"
+ },
+ {
+ "prop": "selectRow",
+ "type": "Function",
+ "version": "2.1.0",
+ "description": "Can be called to select the current row. Only applicable when table is in selectable mode"
+ },
+ {
+ "prop": "unselectRow",
+ "type": "Function",
+ "version": "2.1.0",
+ "description": "Can be called to unselect the current row. Only applicable when table is in selectable mode"
}
]
},
@@ -839,7 +917,7 @@
{
"prop": "columns",
"type": "Number",
- "description": "the number of columns in the table"
+ "description": "The number of columns in the table"
},
{
"prop": "fields",
@@ -865,7 +943,7 @@
{
"prop": "columns",
"type": "Number",
- "description": "the number of columns in the table"
+ "description": "The number of columns in the table"
},
{
"prop": "fields",
@@ -881,7 +959,7 @@
{
"prop": "columns",
"type": "Number",
- "description": "the number of columns in the table"
+ "description": "The number of columns in the table"
},
{
"prop": "fields",
@@ -897,7 +975,7 @@
{
"prop": "columns",
"type": "Number",
- "description": "the number of columns in the table"
+ "description": "The number of columns in the table"
},
{
"prop": "fields",
@@ -979,19 +1057,29 @@
},
{
"prop": "headVariant",
- "description": "Header variant: 'light' or 'dark', or unset"
+ "description": "Header variant: 'light' or 'dark', or unset. May take precedence over head-row-variant"
+ },
+ {
+ "prop": "headRowVariant",
+ "version": "2.1.0",
+ "description": "Apply a Bootstrap theme color variant to the tr element in the thead"
},
{
"prop": "footVariant",
- "description": "Footer variant: 'light' or 'dark', or unset"
+ "description": "Footer variant: 'light' or 'dark', or unset. May take precedence over foot-row-variant"
+ },
+ {
+ "prop": "footRowVariant",
+ "version": "2.1.0",
+ "description": "Apply a Bootstrap theme color variant to the tr element in the tfoot. Falls back to head-row-variant"
},
{
"prop": "tbodyTransitionProps",
- "description": "Vue 'transition-list' properties. When provided will make the tbody a Vue 'transition-list' component"
+ "description": "Vue 'transition-group' properties. When provided will make the tbody a Vue 'transition-group' component"
},
{
"prop": "tbodyTransitionHandlers",
- "description": "Vue 'transition-list' event handlers. When provided will make the tbody a Vue 'transition-list' component"
+ "description": "Vue 'transition-group' event handlers. When provided will make the tbody a Vue 'transition-group' component"
},
{
"prop": "caption",
@@ -1029,6 +1117,11 @@
"prop": "tbodyTrClass",
"description": "CSS class (or classes) to apply to the tr element in the tbody. Can be a function that returns a class (see docs for details)"
},
+ {
+ "prop": "detailsTdClass",
+ "version": "2.1.0",
+ "description": "CSS class (or classes) to apply to the td element in the details row"
+ },
{
"prop": "value",
"description": "Currently displayed row data. Read-only. Do not set a value on this prop"
@@ -1063,7 +1156,10 @@
},
{
"arg": "event",
- "type": "MouseEvent",
+ "type": [
+ "MouseEvent",
+ "KeyboardEvent"
+ ],
"description": "Native event object."
}
]
@@ -1189,7 +1285,10 @@
},
{
"arg": "event",
- "type": "MouseEvent",
+ "type": [
+ "MouseEvent",
+ "KeyboardEvent"
+ ],
"description": "Native event object."
},
{
@@ -1224,6 +1323,11 @@
"prop": "unformatted",
"description": "The raw value for this key in the item record (null or undefined if a virtual column), before being passed to the field's formatter function"
},
+ {
+ "prop": "field",
+ "type": "Object",
+ "description": "The field's normalized definition object (from the fields prop)"
+ },
{
"prop": "detailsShowing",
"type": "Boolean",
@@ -1258,6 +1362,11 @@
"prop": "unformatted",
"description": "The raw value for this key in the item record (null or undefined if a virtual column), before being passed to the field's formatter function"
},
+ {
+ "prop": "field",
+ "type": "Object",
+ "description": "The field's normalized definition object (from the fields prop)"
+ },
{
"prop": "detailsShowing",
"type": "Boolean",
@@ -1283,7 +1392,7 @@
{
"prop": "field",
"type": "Object",
- "description": "the field's definition object (from the fields prop)"
+ "description": "The field's normalized definition object (from the fields prop)"
},
{
"prop": "label",
@@ -1309,7 +1418,7 @@
{
"prop": "field",
"type": "Object",
- "description": "the field's definition object (from the fields prop)"
+ "description": "The field's normalized definition object (from the fields prop)"
},
{
"prop": "label",
@@ -1336,7 +1445,7 @@
{
"prop": "field",
"type": "Object",
- "description": "the field's definition object (from the fields prop)"
+ "description": "The field's normalized definition object (from the fields prop)"
},
{
"prop": "label",
@@ -1357,7 +1466,7 @@
{
"prop": "field",
"type": "Object",
- "description": "the field's definition object (from the fields prop)"
+ "description": "The field's normalized definition object (from the fields prop)"
},
{
"prop": "label",
@@ -1377,7 +1486,7 @@
{
"prop": "columns",
"type": "Number",
- "description": "the number of columns in the table"
+ "description": "The number of columns in the table"
},
{
"prop": "fields",
@@ -1419,7 +1528,7 @@
{
"prop": "columns",
"type": "Number",
- "description": "the number of columns in the table"
+ "description": "The number of columns in the table"
},
{
"prop": "fields",
@@ -1445,7 +1554,7 @@
{
"prop": "columns",
"type": "Number",
- "description": "the number of columns in the table"
+ "description": "The number of columns in the table"
},
{
"prop": "fields",
@@ -1532,11 +1641,11 @@
"props": [
{
"prop": "tbodyTransitionProps",
- "description": "Vue 'transition-list' properties. When provided will make the tbody a Vue 'transition-list' component"
+ "description": "Vue 'transition-group' properties. When provided will make the tbody a Vue 'transition-group' component"
},
{
"prop": "tbodyTransitionHandlers",
- "description": "Vue 'transition-list' event handlers. When provided will make the tbody a Vue 'transition-list' component"
+ "description": "Vue 'transition-group' event handlers. When provided will make the tbody a Vue 'transition-group' component"
}
]
},
diff --git a/src/components/table/table-filtering.spec.js b/src/components/table/table-filtering.spec.js
index 2a79ba09c0f..8ae63515286 100644
--- a/src/components/table/table-filtering.spec.js
+++ b/src/components/table/table-filtering.spec.js
@@ -236,81 +236,89 @@ describe('table > filtering', () => {
wrapper.destroy()
})
- it('filter debouncing works', async () => {
- jest.useFakeTimers()
- let lastFilterTimer = null
- const wrapper = mount(BTable, {
- propsData: {
- fields: testFields,
- items: testItems,
- filterDebounce: 100 // 100ms
- }
- })
- expect(wrapper).toBeDefined()
- expect(wrapper.findAll('tbody > tr').exists()).toBe(true)
- expect(wrapper.findAll('tbody > tr').length).toBe(3)
- expect(wrapper.vm.$_filterTimer).toBe(null)
- await waitNT(wrapper.vm)
- expect(wrapper.emitted('input')).toBeDefined()
- expect(wrapper.emitted('input').length).toBe(1)
- expect(wrapper.emitted('input')[0][0]).toEqual(testItems)
- expect(wrapper.vm.$_filterTimer).toBe(null)
- lastFilterTimer = wrapper.vm.$_filterTimer
-
- // Set filter to a single character
- wrapper.setProps({
- filter: '1'
- })
- await waitNT(wrapper.vm)
- expect(wrapper.emitted('input').length).toBe(1)
- expect(wrapper.vm.$_filterTimer).not.toBe(null)
- expect(wrapper.vm.$_filterTimer).not.toEqual(lastFilterTimer)
- lastFilterTimer = wrapper.vm.$_filterTimer
- expect(wrapper.vm.localFilter).not.toEqual('1')
-
- // Change filter
- wrapper.setProps({
- filter: 'z'
- })
- await waitNT(wrapper.vm)
- expect(wrapper.emitted('input').length).toBe(1)
- expect(wrapper.vm.$_filterTimer).not.toBe(null)
- expect(wrapper.vm.$_filterTimer).not.toEqual(lastFilterTimer)
- lastFilterTimer = wrapper.vm.$_filterTimer
- expect(wrapper.vm.localFilter).not.toEqual('z')
-
- jest.runTimersToTime(101)
- await waitNT(wrapper.vm)
- expect(wrapper.emitted('input').length).toBe(2)
- expect(wrapper.emitted('input')[1][0]).toEqual([testItems[2]])
- expect(wrapper.vm.$_filterTimer).toEqual(lastFilterTimer)
- lastFilterTimer = wrapper.vm.$_filterTimer
- expect(wrapper.vm.localFilter).toEqual('z')
-
- // Change filter
- wrapper.setProps({
- filter: '1'
- })
- await waitNT(wrapper.vm)
- expect(wrapper.vm.$_filterTimer).not.toBe(null)
- expect(wrapper.emitted('input').length).toBe(2)
- expect(wrapper.vm.$_filterTimer).not.toEqual(lastFilterTimer)
- lastFilterTimer = wrapper.vm.$_filterTimer
- expect(wrapper.vm.localFilter).not.toEqual('1')
- expect(wrapper.vm.localFilter).toEqual('z')
-
- // Change filter-debounce to no debouncing
- wrapper.setProps({
- filterDebounce: 0
+ describe('debouncing (deprecated)', () => {
+ // Wrapped in a describe to limit console.warn override
+ // to prevent depreacted prop warnings
+ const originalWarn = console.warn
+ afterEach(() => (console.warn = originalWarn))
+ beforeEach(() => (console.warn = () => {}))
+
+ it('filter debouncing works', async () => {
+ jest.useFakeTimers()
+ let lastFilterTimer = null
+ const wrapper = mount(BTable, {
+ propsData: {
+ fields: testFields,
+ items: testItems,
+ filterDebounce: 100 // 100ms
+ }
+ })
+ expect(wrapper).toBeDefined()
+ expect(wrapper.findAll('tbody > tr').exists()).toBe(true)
+ expect(wrapper.findAll('tbody > tr').length).toBe(3)
+ expect(wrapper.vm.$_filterTimer).toBe(null)
+ await waitNT(wrapper.vm)
+ expect(wrapper.emitted('input')).toBeDefined()
+ expect(wrapper.emitted('input').length).toBe(1)
+ expect(wrapper.emitted('input')[0][0]).toEqual(testItems)
+ expect(wrapper.vm.$_filterTimer).toBe(null)
+ lastFilterTimer = wrapper.vm.$_filterTimer
+
+ // Set filter to a single character
+ wrapper.setProps({
+ filter: '1'
+ })
+ await waitNT(wrapper.vm)
+ expect(wrapper.emitted('input').length).toBe(1)
+ expect(wrapper.vm.$_filterTimer).not.toBe(null)
+ expect(wrapper.vm.$_filterTimer).not.toEqual(lastFilterTimer)
+ lastFilterTimer = wrapper.vm.$_filterTimer
+ expect(wrapper.vm.localFilter).not.toEqual('1')
+
+ // Change filter
+ wrapper.setProps({
+ filter: 'z'
+ })
+ await waitNT(wrapper.vm)
+ expect(wrapper.emitted('input').length).toBe(1)
+ expect(wrapper.vm.$_filterTimer).not.toBe(null)
+ expect(wrapper.vm.$_filterTimer).not.toEqual(lastFilterTimer)
+ lastFilterTimer = wrapper.vm.$_filterTimer
+ expect(wrapper.vm.localFilter).not.toEqual('z')
+
+ jest.runTimersToTime(101)
+ await waitNT(wrapper.vm)
+ expect(wrapper.emitted('input').length).toBe(2)
+ expect(wrapper.emitted('input')[1][0]).toEqual([testItems[2]])
+ expect(wrapper.vm.$_filterTimer).toEqual(lastFilterTimer)
+ lastFilterTimer = wrapper.vm.$_filterTimer
+ expect(wrapper.vm.localFilter).toEqual('z')
+
+ // Change filter
+ wrapper.setProps({
+ filter: '1'
+ })
+ await waitNT(wrapper.vm)
+ expect(wrapper.vm.$_filterTimer).not.toBe(null)
+ expect(wrapper.emitted('input').length).toBe(2)
+ expect(wrapper.vm.$_filterTimer).not.toEqual(lastFilterTimer)
+ lastFilterTimer = wrapper.vm.$_filterTimer
+ expect(wrapper.vm.localFilter).not.toEqual('1')
+ expect(wrapper.vm.localFilter).toEqual('z')
+
+ // Change filter-debounce to no debouncing
+ wrapper.setProps({
+ filterDebounce: 0
+ })
+ await waitNT(wrapper.vm)
+ // Should clear the pending timer
+ expect(wrapper.vm.$_filterTimer).toBe(null)
+ // Should immediately filter the items
+ expect(wrapper.emitted('input').length).toBe(3)
+ expect(wrapper.emitted('input')[2][0]).toEqual([testItems[1]])
+ expect(wrapper.vm.localFilter).toEqual('1')
+
+ wrapper.destroy()
})
- await waitNT(wrapper.vm)
- // Should clear the pending timer
- expect(wrapper.vm.$_filterTimer).toBe(null)
- // Should immediately filter the items
- expect(wrapper.emitted('input').length).toBe(3)
- expect(wrapper.emitted('input')[2][0]).toEqual([testItems[1]])
- expect(wrapper.vm.localFilter).toEqual('1')
-
- wrapper.destroy()
})
})
diff --git a/src/components/table/table-row-details.spec.js b/src/components/table/table-row-details.spec.js
index 80fb37f078a..d04bebf3735 100644
--- a/src/components/table/table-row-details.spec.js
+++ b/src/components/table/table-row-details.spec.js
@@ -59,6 +59,45 @@ describe('table > row details', () => {
wrapper.destroy()
})
+ it('prop `details-td-class` works', async () => {
+ const testItems = [
+ { a: 1, b: 2, c: 3, _showDetails: true },
+ { a: 5, b: 5, c: 6 },
+ { a: 7, b: 8, c: 9, _showDetails: false }
+ ]
+ const testFields = ['a', 'b', 'c']
+ const wrapper = mount(BTable, {
+ propsData: {
+ fields: testFields,
+ items: testItems,
+ detailsTdClass: 'foobar-class'
+ },
+ slots: {
+ // Named slots get turned into scopedSlots in Vue 2.6.x
+ 'row-details': 'foobar '
+ }
+ })
+
+ expect(wrapper).toBeDefined()
+ expect(wrapper.find('tbody').exists()).toBe(true)
+ const $trs = wrapper.findAll('tbody > tr')
+ expect($trs.length).toBe(4)
+ expect($trs.at(0).is('tr.b-table-details')).toBe(false)
+ expect($trs.at(0).findAll('td').length).toBe(3)
+ expect($trs.at(1).is('tr.b-table-details')).toBe(true)
+ expect($trs.at(1).findAll('td').length).toBe(1)
+ expect($trs.at(1).text()).toBe('foobar')
+ const $detailsTd = $trs.at(1).find('td')
+ expect($detailsTd.classes().length).toBe(1)
+ expect($detailsTd.classes()).toContain('foobar-class')
+ expect($trs.at(2).is('tr.b-table-details')).toBe(false)
+ expect($trs.at(2).findAll('td').length).toBe(3)
+ expect($trs.at(3).is('tr.b-table-details')).toBe(false)
+ expect($trs.at(3).findAll('td').length).toBe(3)
+
+ wrapper.destroy()
+ })
+
it('should show details slot when _showDetails changed', async () => {
const testItems = [
{ a: 1, b: 2, c: 3, _showDetails: true },
diff --git a/src/components/table/table-selectable.spec.js b/src/components/table/table-selectable.spec.js
index dfab7823c1c..0f1ce80c44b 100644
--- a/src/components/table/table-selectable.spec.js
+++ b/src/components/table/table-selectable.spec.js
@@ -31,6 +31,7 @@ describe('table > row select', () => {
await waitNT(wrapper.vm)
expect(wrapper.attributes('aria-multiselectable')).not.toBeDefined()
expect(wrapper.classes()).not.toContain('b-table-selectable')
+ expect(wrapper.classes()).not.toContain('b-table-selectable-no-click')
expect(wrapper.classes()).not.toContain('b-table-selecting')
expect(wrapper.classes()).not.toContain('b-table-select-single')
expect(wrapper.classes()).not.toContain('b-table-select-multi')
@@ -59,6 +60,7 @@ describe('table > row select', () => {
await waitNT(wrapper.vm)
expect(wrapper.attributes('aria-multiselectable')).not.toBeDefined()
expect(wrapper.classes()).not.toContain('b-table-selectable')
+ expect(wrapper.classes()).not.toContain('b-table-selectable-no-click')
expect(wrapper.classes()).not.toContain('b-table-selecting')
expect(wrapper.classes()).not.toContain('b-table-select-single')
expect(wrapper.classes()).not.toContain('b-table-select-multi')
@@ -73,6 +75,31 @@ describe('table > row select', () => {
wrapper.destroy()
})
+ it('has class b-table-selectable-no-click when prop no-select-on-click set', async () => {
+ const wrapper = mount(BTable, {
+ propsData: {
+ fields: testFields,
+ items: testItems,
+ selectable: true,
+ selectMode: 'single',
+ noSelectOnClick: true
+ }
+ })
+
+ expect(wrapper).toBeDefined()
+ await waitNT(wrapper.vm)
+ expect(wrapper.attributes('aria-multiselectable')).toBe('false')
+ expect(wrapper.classes()).toContain('b-table-selectable')
+ expect(wrapper.classes()).toContain('b-table-select-single')
+ expect(wrapper.classes()).toContain('b-table-selectable-no-click')
+ expect(wrapper.classes()).not.toContain('b-table-selecting')
+ expect(wrapper.classes()).not.toContain('b-table-select-multi')
+ expect(wrapper.classes()).not.toContain('b-table-select-range')
+ expect(wrapper.emitted('row-selected')).not.toBeDefined()
+
+ wrapper.destroy()
+ })
+
it('select mode single works', async () => {
const wrapper = mount(BTable, {
propsData: {
@@ -89,6 +116,7 @@ describe('table > row select', () => {
expect(wrapper.attributes('aria-multiselectable')).toBe('false')
expect(wrapper.classes()).toContain('b-table-selectable')
expect(wrapper.classes()).toContain('b-table-select-single')
+ expect(wrapper.classes()).not.toContain('b-table-selectable-no-click')
expect(wrapper.classes()).not.toContain('b-table-selecting')
expect(wrapper.classes()).not.toContain('b-table-select-multi')
expect(wrapper.classes()).not.toContain('b-table-select-range')
diff --git a/src/components/table/table-sticky-column.spec.js b/src/components/table/table-sticky-column.spec.js
index e0e04243f92..297ee538f36 100644
--- a/src/components/table/table-sticky-column.spec.js
+++ b/src/components/table/table-sticky-column.spec.js
@@ -11,10 +11,11 @@ const fields = [
]
describe('table > sticky columns', () => {
- it('has expected classes when sticky column is enabled', async () => {
+ it('has expected classes when sticky column is enabled and responsive', async () => {
const wrapper = mount(BTable, {
propsData: {
responsive: true,
+ footClone: true,
items: items,
fields: fields
}
@@ -24,14 +25,102 @@ describe('table > sticky columns', () => {
expect(wrapper.is(BTable)).toBe(true)
expect(wrapper.is('div')).toBe(true)
expect(wrapper.classes()).toContain('table-responsive')
+ expect(wrapper.classes()).not.toContain('b-table-sticky-header')
const table = wrapper.find('table')
expect(table.classes()).toContain('table')
expect(table.classes()).toContain('b-table')
- const trs = wrapper.findAll('tbody > tr')
+ // Body
+ let trs = wrapper.findAll('tbody > tr')
expect(trs.length).toBe(2)
+ let cells = trs.at(0).findAll('th, td')
+ expect(cells.length).toBe(3)
+
+ // First column should be BTh with sticky classes
+ expect(cells.at(0).is(BTh)).toBe(true)
+ expect(cells.at(0).is('th')).toBe(true)
+ expect(cells.at(0).classes()).toContain('b-table-sticky-column')
+
+ // Second column should be BTd with sticky classes
+ expect(cells.at(1).is(BTd)).toBe(true)
+ expect(cells.at(1).is('td')).toBe(true)
+ expect(cells.at(1).classes()).toContain('b-table-sticky-column')
+
+ // Third column should be td
+ expect(cells.at(2).is(BTd)).toBe(false)
+ expect(cells.at(2).is(BTh)).toBe(false)
+ expect(cells.at(2).is('td')).toBe(true)
+ expect(cells.at(2).classes()).not.toContain('b-table-sticky-column')
+
+ // Header cells
+ trs = wrapper.findAll('thead > tr')
+ expect(trs.length).toBe(1)
+ cells = trs.at(0).findAll('th')
+ expect(cells.length).toBe(3)
+
+ // First column should be BTh with sticky classes
+ expect(cells.at(0).is(BTh)).toBe(true)
+ expect(cells.at(0).is('th')).toBe(true)
+ expect(cells.at(0).classes()).toContain('b-table-sticky-column')
+
+ // Second column should be BTh with sticky classes
+ expect(cells.at(1).is(BTh)).toBe(true)
+ expect(cells.at(1).is('th')).toBe(true)
+ expect(cells.at(1).classes()).toContain('b-table-sticky-column')
+
+ // Third column should be BTh
+ expect(cells.at(2).is(BTh)).toBe(true)
+ expect(cells.at(2).is('th')).toBe(true)
+ expect(cells.at(2).classes()).not.toContain('b-table-sticky-column')
+
+ // Footer cells
+ trs = wrapper.findAll('tfoot > tr')
+ expect(trs.length).toBe(1)
+ cells = trs.at(0).findAll('th')
+ expect(cells.length).toBe(3)
+
+ // First column should be BTh with sticky classes
+ expect(cells.at(0).is(BTh)).toBe(true)
+ expect(cells.at(0).is('th')).toBe(true)
+ expect(cells.at(0).classes()).toContain('b-table-sticky-column')
+
+ // Second column should be BTh with sticky classes
+ expect(cells.at(1).is(BTh)).toBe(true)
+ expect(cells.at(1).is('th')).toBe(true)
+ expect(cells.at(1).classes()).toContain('b-table-sticky-column')
+
+ // Third column should be BTh
+ expect(cells.at(2).is(BTh)).toBe(true)
+ expect(cells.at(2).is('th')).toBe(true)
+ expect(cells.at(2).classes()).not.toContain('b-table-sticky-column')
- const cells = trs.at(0).findAll('th, td')
+ wrapper.destroy()
+ })
+
+ it('has expected classes when sticky column is enabled with sticky headers', async () => {
+ const wrapper = mount(BTable, {
+ propsData: {
+ responsive: false,
+ stickyHeader: true,
+ footClone: true,
+ items: items,
+ fields: fields
+ }
+ })
+
+ expect(wrapper).toBeDefined()
+ expect(wrapper.is(BTable)).toBe(true)
+ expect(wrapper.is('div')).toBe(true)
+ expect(wrapper.classes()).not.toContain('table-responsive')
+ expect(wrapper.classes()).toContain('b-table-sticky-header')
+ const table = wrapper.find('table')
+ expect(table.classes()).toContain('table')
+ expect(table.classes()).toContain('b-table')
+
+ // Tbody cells
+ let trs = wrapper.findAll('tbody > tr')
+ expect(trs.length).toBe(2)
+ let cells = trs.at(0).findAll('th, td')
expect(cells.length).toBe(3)
// First column should be BTh with sticky classes
@@ -50,6 +139,134 @@ describe('table > sticky columns', () => {
expect(cells.at(2).is('td')).toBe(true)
expect(cells.at(2).classes()).not.toContain('b-table-sticky-column')
+ // Header cells
+ trs = wrapper.findAll('thead > tr')
+ expect(trs.length).toBe(1)
+ cells = trs.at(0).findAll('th')
+ expect(cells.length).toBe(3)
+
+ // First column should be BTh with sticky classes
+ expect(cells.at(0).is(BTh)).toBe(true)
+ expect(cells.at(0).is('th')).toBe(true)
+ expect(cells.at(0).classes()).toContain('b-table-sticky-column')
+
+ // Second column should be BTh with sticky classes
+ expect(cells.at(1).is(BTh)).toBe(true)
+ expect(cells.at(1).is('th')).toBe(true)
+ expect(cells.at(1).classes()).toContain('b-table-sticky-column')
+
+ // Third column should be BTh
+ expect(cells.at(2).is(BTh)).toBe(true)
+ expect(cells.at(2).is('th')).toBe(true)
+ expect(cells.at(2).classes()).not.toContain('b-table-sticky-column')
+
+ // Footer cells
+ trs = wrapper.findAll('tfoot > tr')
+ expect(trs.length).toBe(1)
+
+ cells = trs.at(0).findAll('th')
+ expect(cells.length).toBe(3)
+
+ // First column should be BTh with sticky classes
+ expect(cells.at(0).is(BTh)).toBe(true)
+ expect(cells.at(0).is('th')).toBe(true)
+ expect(cells.at(0).classes()).toContain('b-table-sticky-column')
+
+ // Second column should be BTh with sticky classes
+ expect(cells.at(1).is(BTh)).toBe(true)
+ expect(cells.at(1).is('th')).toBe(true)
+ expect(cells.at(1).classes()).toContain('b-table-sticky-column')
+
+ // Third column should be BTh
+ expect(cells.at(2).is(BTh)).toBe(true)
+ expect(cells.at(2).is('th')).toBe(true)
+ expect(cells.at(2).classes()).not.toContain('b-table-sticky-column')
+
+ wrapper.destroy()
+ })
+
+ it('does not have sticky classes when sticky column is enabled and not responsive and no sticky header', async () => {
+ const wrapper = mount(BTable, {
+ propsData: {
+ responsive: false,
+ stickyHeader: false,
+ footClone: true,
+ items: items,
+ fields: fields
+ }
+ })
+
+ expect(wrapper).toBeDefined()
+ expect(wrapper.is(BTable)).toBe(true)
+ expect(wrapper.is('table')).toBe(true)
+ expect(wrapper.classes()).not.toContain('table-responsive')
+ expect(wrapper.classes()).not.toContain('b-table-sticky-header')
+ expect(wrapper.classes()).toContain('table')
+ expect(wrapper.classes()).toContain('b-table')
+
+ // Body
+ let trs = wrapper.findAll('tbody > tr')
+ expect(trs.length).toBe(2)
+ let cells = trs.at(0).findAll('th, td')
+ expect(cells.length).toBe(3)
+
+ // First column should be th
+ expect(cells.at(0).is(BTh)).toBe(false)
+ expect(cells.at(0).is('th')).toBe(true)
+ expect(cells.at(0).classes()).not.toContain('b-table-sticky-column')
+
+ // Second column should be td
+ expect(cells.at(1).is(BTd)).toBe(false)
+ expect(cells.at(1).is('td')).toBe(true)
+ expect(cells.at(1).classes()).not.toContain('b-table-sticky-column')
+
+ // Third column should be td
+ expect(cells.at(2).is(BTd)).toBe(false)
+ expect(cells.at(2).is('td')).toBe(true)
+ expect(cells.at(2).classes()).not.toContain('b-table-sticky-column')
+
+ // Header cells
+ trs = wrapper.findAll('thead > tr')
+ expect(trs.length).toBe(1)
+ cells = trs.at(0).findAll('th')
+ expect(cells.length).toBe(3)
+
+ // First column should be BTh with sticky classes
+ expect(cells.at(0).is(BTh)).toBe(true)
+ expect(cells.at(0).is('th')).toBe(true)
+ expect(cells.at(0).classes()).not.toContain('b-table-sticky-column')
+
+ // Second column should be BTh with sticky classes
+ expect(cells.at(1).is(BTh)).toBe(true)
+ expect(cells.at(1).is('th')).toBe(true)
+ expect(cells.at(1).classes()).not.toContain('b-table-sticky-column')
+
+ // Third column should be BTh
+ expect(cells.at(2).is(BTh)).toBe(true)
+ expect(cells.at(2).is('th')).toBe(true)
+ expect(cells.at(2).classes()).not.toContain('b-table-sticky-column')
+
+ // Footer cells
+ trs = wrapper.findAll('tfoot > tr')
+ expect(trs.length).toBe(1)
+ cells = trs.at(0).findAll('th')
+ expect(cells.length).toBe(3)
+
+ // First column should be BTh with sticky classes
+ expect(cells.at(0).is(BTh)).toBe(true)
+ expect(cells.at(0).is('th')).toBe(true)
+ expect(cells.at(0).classes()).not.toContain('b-table-sticky-column')
+
+ // Second column should be BTh with sticky classes
+ expect(cells.at(1).is(BTh)).toBe(true)
+ expect(cells.at(1).is('th')).toBe(true)
+ expect(cells.at(1).classes()).not.toContain('b-table-sticky-column')
+
+ // Third column should be BTh
+ expect(cells.at(2).is(BTh)).toBe(true)
+ expect(cells.at(2).is('th')).toBe(true)
+ expect(cells.at(2).classes()).not.toContain('b-table-sticky-column')
+
wrapper.destroy()
})
})
diff --git a/src/components/table/tbody.js b/src/components/table/tbody.js
index 32cba20d817..7b1033ead86 100644
--- a/src/components/table/tbody.js
+++ b/src/components/table/tbody.js
@@ -53,6 +53,12 @@ export const BTbody = /*#__PURE__*/ Vue.extend({
// Sticky headers are only supported in thead
return false
},
+ hasStickyHeader() {
+ // Sniffed by / /
+ // Needed to handle header background classes, due to lack of
+ // background color inheritance with Bootstrap v4 table CSS
+ return !this.isStacked && this.bvTable.stickyHeader
+ },
tableVariant() /* istanbul ignore next: Not currently sniffed in tests */ {
// Sniffed by / /
return this.bvTable.tableVariant
@@ -65,21 +71,25 @@ export const BTbody = /*#__PURE__*/ Vue.extend({
},
tbodyProps() {
return this.tbodyTransitionProps ? { ...this.tbodyTransitionProps, tag: 'tbody' } : {}
- },
- tbodyListeners() {
- const handlers = this.tbodyTransitionHandlers || {}
- return { ...this.$listeners, ...handlers }
}
},
render(h) {
+ const data = {
+ props: this.tbodyProps,
+ attrs: this.tbodyAttrs
+ }
+ if (this.isTransitionGroup) {
+ // We use native listeners if a transition group
+ // for any delegated events
+ data.on = this.tbodyTransitionHandlers || {}
+ data.nativeOn = this.$listeners || {}
+ } else {
+ // Otherwise we place any listeners on the tbody element
+ data.on = this.$listeners || {}
+ }
return h(
this.isTransitionGroup ? 'transition-group' : 'tbody',
- {
- props: this.tbodyProps,
- attrs: this.tbodyAttrs,
- // Pass down any listeners
- on: this.tbodyListeners
- },
+ data,
this.normalizeSlot('default', {})
)
}
diff --git a/src/components/table/td.js b/src/components/table/td.js
index 0cc7d362ef0..13e29a94b8a 100644
--- a/src/components/table/td.js
+++ b/src/components/table/td.js
@@ -85,13 +85,18 @@ export const BTd = /*#__PURE__*/ Vue.extend({
// Sticky headers only apply to cells in table `thead`
return this.bvTableTr.isStickyHeader
},
- isStickyColumn() {
+ hasStickyHeader() {
// Needed to handle header background classes, due to lack of
// background color inheritance with Bootstrap v4 table CSS
+ return this.bvTableTr.hasStickyHeader
+ },
+ isStickyColumn() {
+ // Needed to handle background classes, due to lack of
+ // background color inheritance with Bootstrap v4 table CSS
// Sticky column cells are only available in responsive
// mode (horizontal scrolling) or when sticky header mode
// Applies to cells in `thead`, `tbody` and `tfoot`
- return !this.isStacked && (this.isResponsive || this.isStickyHeader) && this.stickyColumn
+ return !this.isStacked && (this.isResponsive || this.hasStickyHeader) && this.stickyColumn
},
rowVariant() {
return this.bvTableTr.variant
diff --git a/src/components/table/tfoot.js b/src/components/table/tfoot.js
index 34fe53019ee..75f8b936740 100644
--- a/src/components/table/tfoot.js
+++ b/src/components/table/tfoot.js
@@ -49,6 +49,12 @@ export const BTfoot = /*#__PURE__*/ Vue.extend({
// Sticky headers are only supported in thead
return false
},
+ hasStickyHeader() {
+ // Sniffed by / /
+ // Needed to handle header background classes, due to lack of
+ // background color inheritance with Bootstrap v4 table CSS
+ return !this.isStacked && this.bvTable.stickyHeader
+ },
tableVariant() /* istanbul ignore next: Not currently sniffed in tests */ {
// Sniffed by / /
return this.bvTable.tableVariant
diff --git a/src/components/table/thead.js b/src/components/table/thead.js
index db3a5fe683d..cf393dd1362 100644
--- a/src/components/table/thead.js
+++ b/src/components/table/thead.js
@@ -52,6 +52,12 @@ export const BThead = /*#__PURE__*/ Vue.extend({
// Sticky headers only apply to cells in table `thead`
return !this.isStacked && this.bvTable.stickyHeader
},
+ hasStickyHeader() {
+ // Sniffed by / /
+ // Needed to handle header background classes, due to lack of
+ // background color inheritance with Bootstrap v4 table CSS
+ return !this.isStacked && this.bvTable.stickyHeader
+ },
tableVariant() {
// Sniffed by / /
return this.bvTable.tableVariant
diff --git a/src/components/table/tr.js b/src/components/table/tr.js
index 4fe6ede0fb0..2a973deb442 100644
--- a/src/components/table/tr.js
+++ b/src/components/table/tr.js
@@ -8,6 +8,9 @@ export const props = {
}
}
+const LIGHT = 'light'
+const DARK = 'dark'
+
// @vue/component
export const BTr = /*#__PURE__*/ Vue.extend({
name: 'BTr',
@@ -56,16 +59,33 @@ export const BTr = /*#__PURE__*/ Vue.extend({
// Sticky headers are only supported in thead
return this.bvTableRowGroup.isStickyHeader
},
+ hasStickyHeader() {
+ // Sniffed by / /
+ // Needed to handle header background classes, due to lack of
+ // background color inheritance with Bootstrap v4 table CSS
+ return !this.isStacked && this.bvTableRowGroup.hasStickyHeader
+ },
tableVariant() {
// Sniffed by /
return this.bvTableRowGroup.tableVariant
},
headVariant() {
// Sniffed by /
- return this.bvTableRowGroup.headVariant
+ return this.inThead ? this.bvTableRowGroup.headVariant : null
+ },
+ footVariant() {
+ // Sniffed by /
+ return this.inTfoot ? this.bvTableRowGroup.footVariant : null
+ },
+ isRowDark() {
+ return this.headVariant === LIGHT || this.footVariant === LIGHT
+ ? false
+ : this.headVariant === DARK || this.footVariant === DARK
+ ? true
+ : this.isDark
},
trClasses() {
- return [this.variant ? `${this.isDark ? 'bg' : 'table'}-${this.variant}` : null]
+ return [this.variant ? `${this.isRowDark ? 'bg' : 'table'}-${this.variant}` : null]
},
trAttrs() {
return { role: 'row', ...this.$attrs }
diff --git a/src/components/tabs/README.md b/src/components/tabs/README.md
index b61e90d71e0..ced10660033 100644
--- a/src/components/tabs/README.md
+++ b/src/components/tabs/README.md
@@ -36,10 +36,10 @@ component in order to properly decorate the card header and remove the extra pad
- Tab Contents 1
+ Tab contents 1
- Tab Contents 2
+ Tab contents 2
@@ -102,8 +102,8 @@ variant.
- Tab Contents 1
- Tab Contents 2
+ Tab contents 1
+ Tab contents 2
@@ -175,8 +175,8 @@ Visually move the tab controls to the bottom by setting the prop `end`.
- Tab Contents 1
- Tab Contents 2
+ Tab contents 1
+ Tab contents 2
@@ -202,9 +202,9 @@ tabs work with or without `card` mode enabled.
- Tab Contents 1
- Tab Contents 2
- Tab Contents 3
+ Tab contents 1
+ Tab contents 2
+ Tab contents 3
@@ -218,9 +218,9 @@ Visually move the tab controls to the right hand side by setting the `end` prop:
- Tab Contents 1
- Tab Contents 2
- Tab Contents 3
+ Tab contents 1
+ Tab contents 2
+ Tab contents 3
@@ -237,9 +237,9 @@ column classes such as `col-2`, `col-3`, etc.
- Tab Contents 1
- Tab Contents 2
- Tab Contents 3
+ Tab contents 1
+ Tab contents 2
+ Tab contents 3
@@ -290,7 +290,7 @@ If you want to add extra tabs that do not have any content, you can put them in
{}">Another tab
- Plain Text
+ Plain text
@@ -314,16 +314,16 @@ Vue component, this possible by using `title` slot of ``.
- I'm Custom Title
+ I'm custom title
- Tab Contents 1
+ Tab contents 1
Tab 2
- Tab Contents 2
+ Tab contents 2
@@ -350,9 +350,9 @@ need to accommodate your custom classes for this._
- Tab Contents 1
- Tab Contents 2
- Tab Contents 3
+ Tab contents 1
+ Tab contents 2
+ Tab contents 3
@@ -380,6 +380,39 @@ need to accommodate your custom classes for this._
```
+## Lazy loading tab content
+
+Sometimes it's preferred to load components & data only when activating a tab, instead of loading
+all tabs (and associated data) when rendering the `` set.
+
+Individual `` components can be lazy loaded via the `lazy` prop, which when set doesn't mount
+the content of the `` until it is activated (shown), and will be un-mounted when the tab is
+deactivated (hidden):
+
+```html
+
+
+ I'm always mounted
+
+
+
+ I'm lazy mounted!
+
+
+
+```
+
+One can also make all tab's lazy by setting the `lazy` prop on the parent `` component:
+
+```html
+
+ I'm lazy mounted!
+ I'm lazy mounted too!
+
+
+
+```
+
## Keyboard navigation
Keyboard navigation is enabled by default for ARIA compliance with tablists when a tab button has
@@ -399,11 +432,11 @@ focus.
Disable keyboard navigation by setting the prop `no-key-nav`. Behavior will now default to regular
browser navigation with TAB key.
-| Keypress | Action |
-| ------------------------------- | ------------------------------------------------------ |
-| TAB | Move to the next tab button or control on the page |
-| SHIFT+TAB | Move to the previous tab button or control on the page |
-| ENTER | Activate current focused button's tab |
+| Keypress | Action |
+| ------------------------------------ | ------------------------------------------------------ |
+| TAB | Move to the next tab button or control on the page |
+| SHIFT+TAB | Move to the previous tab button or control on the page |
+| ENTER or SPACE | Activate current focused button's tab |
## Programmatically activating and deactivating tabs
@@ -419,6 +452,23 @@ methods are `.activate()` and `.deactivate()`, respectively. If activation or de
will remain active and the method will return `false`. You will need a reference to the `` in
order to use these methods.
+## Preventing a `` from being activated
+
+To prevent a tab from activating, simply set the `disabled` prop on the `` component.
+
+Alternatively, you can listen for the `activate-tab` event, which provides an option to prevent the
+tab from activating. The `activate-tab` event is emitted with three arguments:
+
+- `newTabIndex`: The index of the tab that is going to be activated
+- `prevTabIndex`: The index of the currently active tab
+- `bvEvent`: The `BvEvent` object. Call `bvEvt.preventDefault()` to prevent `newTabIndex` from being
+ activated
+
+For accessibility reasons, when using the `activate-tab` event to prevent a tab from activating, you
+should provide some means of notification to the user as to why the tab is not able to be activated.
+It is recommended to use the `disabled` attribute on the `` component instead of using the
+`activate-tab` event (as `disabled` is more intuitive for screen reader users).
+
## Advanced examples
### External controls using `v-model`
@@ -473,7 +523,7 @@ order to use these methods.
- Tab Contents {{ i }}
+ Tab contents {{ i }}
Close tab
diff --git a/src/components/tabs/package.json b/src/components/tabs/package.json
index f990c20dc80..49e8c3c10f0 100644
--- a/src/components/tabs/package.json
+++ b/src/components/tabs/package.json
@@ -93,6 +93,28 @@
}
]
},
+ {
+ "event": "activate-tab",
+ "version": "2.1.0",
+ "description": "Emitted just before a tab is shown/activated. Cancelable",
+ "args": [
+ {
+ "arg": "newTabIndex",
+ "type": "Number",
+ "description": "Tab being activated (0-based index)"
+ },
+ {
+ "arg": "prevTabIndex",
+ "type": "Number",
+ "description": "Tab that is currently active (0-based index). Will be -1 if no current active tab"
+ },
+ {
+ "arg": "bvEvt",
+ "type": "BvEvent",
+ "description": "BvEvent object. Call bvEvt.preventDefault() to cancel"
+ }
+ ]
+ },
{
"event": "changed",
"description": "Emitted when a tab is added, removed, or tabs are re-ordered",
diff --git a/src/components/tabs/tabs.js b/src/components/tabs/tabs.js
index d6c91d029b7..accaa16b354 100644
--- a/src/components/tabs/tabs.js
+++ b/src/components/tabs/tabs.js
@@ -4,6 +4,7 @@ import looseEqual from '../../utils/loose-equal'
import observeDom from '../../utils/observe-dom'
import stableSort from '../../utils/stable-sort'
import { arrayIncludes, concat } from '../../utils/array'
+import { BvEvent } from '../../utils/bv-event.class'
import { requestAF, selectAll } from '../../utils/dom'
import { isEvent } from '../../utils/inspect'
import { omit } from '../../utils/object'
@@ -70,8 +71,10 @@ const BTabButtonHelper = /*#__PURE__*/ Vue.extend({
if (type === 'click') {
stop()
this.$emit('click', evt)
- } else if (type === 'keydown' && !this.noKeyNav && key === KeyCodes.SPACE) {
- // In keynav mode, SPACE press will also trigger a click/select
+ } else if (type === 'keydown' && key === KeyCodes.SPACE) {
+ // For ARIA tabs the SPACE key will also trigger a click/select
+ // Even with keyboard navigation disabled, SPACE should "click" the button
+ // See: https://github.com/bootstrap-vue/bootstrap-vue/issues/4323
stop()
this.$emit('click', evt)
} else if (type === 'keydown' && !this.noKeyNav) {
@@ -262,7 +265,7 @@ export const BTabs = /*#__PURE__*/ Vue.extend({
old = parseInt(old, 10) || 0
const tabs = this.tabs
if (tabs[val] && !tabs[val].disabled) {
- this.currentTab = val
+ this.activateTab(tabs[val])
} else {
// Try next or prev tabs
if (val < old) {
@@ -481,14 +484,22 @@ export const BTabs = /*#__PURE__*/ Vue.extend({
let result = false
if (tab) {
const index = this.tabs.indexOf(tab)
- if (!tab.disabled && index > -1) {
- result = true
- this.currentTab = index
+ if (!tab.disabled && index > -1 && index !== this.currentTab) {
+ const tabEvt = new BvEvent('activate-tab', {
+ cancelable: true,
+ vueTarget: this,
+ componentId: this.safeId()
+ })
+ this.$emit(tabEvt.type, index, this.currentTab, tabEvt)
+ if (!tabEvt.defaultPrevented) {
+ result = true
+ this.currentTab = index
+ }
}
}
- if (!result) {
- // Couldn't set tab, so ensure v-model is set to `this.currentTab`
- /* istanbul ignore next: should rarely happen */
+ // Couldn't set tab, so ensure v-model is set to `this.currentTab`
+ /* istanbul ignore next: should rarely happen */
+ if (!result && this.currentTab !== this.value) {
this.$emit('input', this.currentTab)
}
return result
@@ -500,11 +511,9 @@ export const BTabs = /*#__PURE__*/ Vue.extend({
// Find first non-disabled tab that isn't the one being deactivated
// If no tabs are available, then don't deactivate current tab
return this.activateTab(this.tabs.filter(t => t !== tab).find(notDisabled))
- } else {
- // No tab specified
- /* istanbul ignore next: should never happen */
- return false
}
+ /* istanbul ignore next: should never/rarely happen */
+ return false
},
// Focus a tab button given it's instance
focusButton(tab) {
diff --git a/src/components/tabs/tabs.spec.js b/src/components/tabs/tabs.spec.js
index e6d5e3c649b..dc001b9cd17 100644
--- a/src/components/tabs/tabs.spec.js
+++ b/src/components/tabs/tabs.spec.js
@@ -311,6 +311,72 @@ describe('tabs', () => {
wrapper.destroy()
})
+ it('`activate-tab` event works', async () => {
+ const App = Vue.extend({
+ methods: {
+ preventTab(next, prev, bvEvt) {
+ // Prevent 3rd tab (index === 2) from activating
+ if (next === 2) {
+ bvEvt.preventDefault()
+ }
+ }
+ },
+ render(h) {
+ return h(BTabs, { props: { value: 0 }, on: { 'activate-tab': this.preventTab } }, [
+ h(BTab, { props: {} }, 'tab 0'),
+ h(BTab, { props: {} }, 'tab 1'),
+ h(BTab, { props: {} }, 'tab 2')
+ ])
+ }
+ })
+ const wrapper = mount(App)
+ expect(wrapper).toBeDefined()
+
+ await waitNT(wrapper.vm)
+ await waitRAF()
+ const tabs = wrapper.find(BTabs)
+ expect(tabs).toBeDefined()
+ expect(tabs.findAll(BTab).length).toBe(3)
+
+ // Expect 1st tab (index 0) to be active
+ expect(tabs.vm.currentTab).toBe(0)
+ expect(tabs.vm.tabs[0].localActive).toBe(true)
+ expect(tabs.emitted('input')).not.toBeDefined()
+ expect(tabs.emitted('activate-tab')).not.toBeDefined()
+
+ // Set 2nd BTab to be active
+ tabs.setProps({ value: 1 })
+ await waitNT(wrapper.vm)
+ await waitRAF()
+ expect(tabs.vm.currentTab).toBe(1)
+ expect(tabs.emitted('input')).toBeDefined()
+ expect(tabs.emitted('input').length).toBe(1)
+ expect(tabs.emitted('input')[0][0]).toBe(1)
+ expect(tabs.emitted('activate-tab')).toBeDefined()
+ expect(tabs.emitted('activate-tab').length).toBe(1)
+ expect(tabs.emitted('activate-tab')[0][0]).toBe(1)
+ expect(tabs.emitted('activate-tab')[0][1]).toBe(0)
+ expect(tabs.emitted('activate-tab')[0][2]).toBeDefined()
+ expect(tabs.emitted('activate-tab')[0][2].vueTarget).toBe(tabs.vm)
+
+ // Attempt to set 3rd BTab to be active
+ tabs.setProps({ value: 2 })
+ await waitNT(wrapper.vm)
+ await waitRAF()
+ expect(tabs.vm.currentTab).toBe(1)
+ expect(tabs.emitted('input')).toBeDefined()
+ expect(tabs.emitted('input').length).toBe(2)
+ expect(tabs.emitted('input')[1][0]).toBe(1)
+ expect(tabs.emitted('activate-tab').length).toBe(2)
+ expect(tabs.emitted('activate-tab')[1][0]).toBe(2)
+ expect(tabs.emitted('activate-tab')[1][1]).toBe(1)
+ expect(tabs.emitted('activate-tab')[1][2]).toBeDefined()
+ expect(tabs.emitted('activate-tab')[1][2].vueTarget).toBe(tabs.vm)
+ expect(tabs.emitted('activate-tab')[1][2].defaultPrevented).toBe(true)
+
+ wrapper.destroy()
+ })
+
it('clicking on tab activates the tab, and tab emits click event', async () => {
const App = Vue.extend({
render(h) {
@@ -388,6 +454,83 @@ describe('tabs', () => {
wrapper.destroy()
})
+ it('pressing space on tab activates the tab, and tab emits click event', async () => {
+ const App = Vue.extend({
+ render(h) {
+ return h(BTabs, { props: { value: 0, noKeyNav: true } }, [
+ h(BTab, { props: { title: 'one' } }, 'tab 0'),
+ h(BTab, { props: { title: 'two' } }, 'tab 1'),
+ h(BTab, { props: { title: 'three' } }, 'tab 2')
+ ])
+ }
+ })
+ const wrapper = mount(App)
+ expect(wrapper).toBeDefined()
+
+ await waitNT(wrapper.vm)
+ await waitRAF()
+ const tabs = wrapper.find(BTabs)
+ expect(tabs).toBeDefined()
+ expect(tabs.findAll(BTab).length).toBe(3)
+
+ const tab1 = tabs.findAll(BTab).at(0)
+ const tab2 = tabs.findAll(BTab).at(1)
+ const tab3 = tabs.findAll(BTab).at(2)
+
+ expect(wrapper.findAll('.nav-link')).toBeDefined()
+ expect(wrapper.findAll('.nav-link').length).toBe(3)
+
+ // Expect 1st tab (index 0) to be active
+ expect(tabs.vm.currentTab).toBe(0)
+ expect(tab1.vm.localActive).toBe(true)
+ expect(tab2.vm.localActive).toBe(false)
+ expect(tab3.vm.localActive).toBe(false)
+
+ // Try to set 2nd BTab to be active via space keypress
+ expect(tab2.emitted('click')).not.toBeDefined()
+ wrapper
+ .findAll('.nav-link')
+ .at(1)
+ .trigger('keydown.space')
+ await waitNT(wrapper.vm)
+ await waitRAF()
+ expect(tabs.vm.currentTab).toBe(1)
+ expect(tab1.vm.localActive).toBe(false)
+ expect(tab2.vm.localActive).toBe(true)
+ expect(tab3.vm.localActive).toBe(false)
+ expect(tab2.emitted('click')).toBeDefined()
+
+ // Try to set 3rd BTab to be active via space keypress
+ expect(tab3.emitted('click')).not.toBeDefined()
+ wrapper
+ .findAll('.nav-link')
+ .at(2)
+ .trigger('keydown.space')
+ await waitNT(wrapper.vm)
+ await waitRAF()
+ expect(tabs.vm.currentTab).toBe(2)
+ expect(tab1.vm.localActive).toBe(false)
+ expect(tab2.vm.localActive).toBe(false)
+ expect(tab3.vm.localActive).toBe(true)
+ expect(tab3.emitted('click')).toBeDefined()
+
+ // Try to set 1st BTab to be active via space keypress
+ expect(tab1.emitted('click')).not.toBeDefined()
+ wrapper
+ .findAll('.nav-link')
+ .at(0)
+ .trigger('keydown.space')
+ await waitNT(wrapper.vm)
+ await waitRAF()
+ expect(tabs.vm.currentTab).toBe(0)
+ expect(tab1.vm.localActive).toBe(true)
+ expect(tab2.vm.localActive).toBe(false)
+ expect(tab3.vm.localActive).toBe(false)
+ expect(tab1.emitted('click')).toBeDefined()
+
+ wrapper.destroy()
+ })
+
it('key nav works', async () => {
const App = Vue.extend({
render(h) {
diff --git a/src/directives/index.d.ts b/src/directives/index.d.ts
index 7ff01bd1c33..4c4235c6eeb 100644
--- a/src/directives/index.d.ts
+++ b/src/directives/index.d.ts
@@ -4,8 +4,9 @@ import { BvPlugin } from '../'
export declare const directivesPlugin: BvPlugin
// Named exports of all directives
-export * from './toggle'
export * from './modal'
+export * from './popover'
export * from './scrollspy'
+export * from './toggle'
export * from './tooltip'
-export * from './popover'
+export * from './visible'
diff --git a/src/directives/index.js b/src/directives/index.js
index 50cdbaad94f..359771b1851 100644
--- a/src/directives/index.js
+++ b/src/directives/index.js
@@ -5,6 +5,7 @@ import { VBPopoverPlugin } from './popover'
import { VBScrollspyPlugin } from './scrollspy'
import { VBTogglePlugin } from './toggle'
import { VBTooltipPlugin } from './tooltip'
+import { VBVisiblePlugin } from './visible'
// Main plugin for installing all directive plugins
export const directivesPlugin = /*#__PURE__*/ pluginFactory({
@@ -13,6 +14,7 @@ export const directivesPlugin = /*#__PURE__*/ pluginFactory({
VBPopoverPlugin,
VBScrollspyPlugin,
VBTogglePlugin,
- VBTooltipPlugin
+ VBTooltipPlugin,
+ VBVisiblePlugin
}
})
diff --git a/src/directives/modal/modal.js b/src/directives/modal/modal.js
index c47dcb59701..0f92ea31b8a 100644
--- a/src/directives/modal/modal.js
+++ b/src/directives/modal/modal.js
@@ -1,3 +1,4 @@
+import KeyCodes from '../../utils/key-codes'
import {
eventOn,
eventOff,
@@ -25,15 +26,22 @@ const getTarget = ({ modifiers = {}, arg, value }) => {
}
const getTriggerElement = el => {
- // If root element is a dropdown item or nav item, we
+ // If root element is a dropdown-item or nav-item, we
// need to target the inner link or button instead
return el && matches(el, '.dropdown-menu > li, li.nav-item') ? select('a, button', el) || el : el
}
const setRole = trigger => {
- // Only set a role if the trigger element doesn't have one
- if (trigger && trigger.tagName !== 'BUTTON' && !hasAttr(trigger, 'role')) {
- setAttr(trigger, 'role', 'button')
+ // Ensure accessibility on non button elements
+ if (trigger && trigger.tagName !== 'BUTTON') {
+ // Only set a role if the trigger element doesn't have one
+ if (!hasAttr(trigger, 'role')) {
+ setAttr(trigger, 'role', 'button')
+ }
+ // Add a tabindex is not a button or link, and tabindex is not provided
+ if (trigger.tagName !== 'A' && !hasAttr(trigger, 'tabindex')) {
+ setAttr(trigger, 'tabindex', '0')
+ }
}
}
@@ -46,8 +54,12 @@ const bind = (el, binding, vnode) => {
const currentTarget = evt.currentTarget
if (!isDisabled(currentTarget)) {
const type = evt.type
+ const key = evt.keyCode
// Open modal only if trigger is not disabled
- if (type === 'click' || (type === 'keydown' && evt.keyCode === 32)) {
+ if (
+ type === 'click' ||
+ (type === 'keydown' && (key === KeyCodes.ENTER || key === KeyCodes.SPACE))
+ ) {
vnode.context.$root.$emit(EVENT_SHOW, target, currentTarget)
}
}
@@ -59,7 +71,7 @@ const bind = (el, binding, vnode) => {
eventOn(trigger, 'click', handler, EVENT_OPTS)
if (trigger.tagName !== 'BUTTON' && getAttr(trigger, 'role') === 'button') {
// If trigger isn't a button but has role button,
- // we also listen for `keydown.space`
+ // we also listen for `keydown.space` && `keydown.enter`
eventOn(trigger, 'keydown', handler, EVENT_OPTS)
}
}
diff --git a/src/directives/modal/modal.spec.js b/src/directives/modal/modal.spec.js
index b8a6ce6ae70..3cf7f622916 100644
--- a/src/directives/modal/modal.spec.js
+++ b/src/directives/modal/modal.spec.js
@@ -26,6 +26,8 @@ describe('v-b-modal directive', () => {
expect(wrapper.isVueInstance()).toBe(true)
expect(wrapper.is('button')).toBe(true)
+ expect(wrapper.find('button').attributes('tabindex')).not.toBeDefined()
+ expect(wrapper.find('button').attributes('role')).not.toBeDefined()
expect(spy).not.toHaveBeenCalled()
const $button = wrapper.find('button')
@@ -36,6 +38,48 @@ describe('v-b-modal directive', () => {
wrapper.destroy()
})
+ it('works on links', async () => {
+ const localVue = new CreateLocalVue()
+ const spy = jest.fn()
+
+ const App = localVue.extend({
+ directives: {
+ bModal: VBModal
+ },
+ data() {
+ return {
+ text: 'link'
+ }
+ },
+ mounted() {
+ this.$root.$on(EVENT_SHOW, spy)
+ },
+ beforeDestroy() {
+ this.$root.$off(EVENT_SHOW, spy)
+ },
+ template: '{{ text }}'
+ })
+ const wrapper = mount(App, {
+ localVue: localVue
+ })
+
+ expect(wrapper.isVueInstance()).toBe(true)
+ expect(wrapper.is('a')).toBe(true)
+ expect(spy).not.toHaveBeenCalled()
+ expect(wrapper.find('a').attributes('role')).toBe('button')
+ expect(wrapper.find('a').attributes('tabindex')).not.toBeDefined()
+ expect(wrapper.find('a').text()).toBe('link')
+
+ const $link = wrapper.find('a')
+ $link.trigger('click')
+ expect(spy).toHaveBeenCalledTimes(1)
+ expect(spy).toBeCalledWith('test', $link.element)
+ expect(wrapper.find('a').attributes('role')).toBe('button')
+ expect(wrapper.find('a').attributes('tabindex')).not.toBeDefined()
+
+ wrapper.destroy()
+ })
+
it('works on non-buttons', async () => {
const localVue = new CreateLocalVue()
const spy = jest.fn()
@@ -55,7 +99,7 @@ describe('v-b-modal directive', () => {
beforeDestroy() {
this.$root.$off(EVENT_SHOW, spy)
},
- template: '{{ text }}'
+ template: '{{ text }}'
})
const wrapper = mount(App, {
localVue: localVue
@@ -65,6 +109,7 @@ describe('v-b-modal directive', () => {
expect(wrapper.is('span')).toBe(true)
expect(spy).not.toHaveBeenCalled()
expect(wrapper.find('span').attributes('role')).toBe('button')
+ expect(wrapper.find('span').attributes('tabindex')).toBe('0')
expect(wrapper.find('span').text()).toBe('span')
const $span = wrapper.find('span')
@@ -82,4 +127,85 @@ describe('v-b-modal directive', () => {
wrapper.destroy()
})
+
+ it('works on non-buttons using keydown space', async () => {
+ const localVue = new CreateLocalVue()
+ const spy = jest.fn()
+
+ const App = localVue.extend({
+ directives: {
+ bModal: VBModal
+ },
+ data() {
+ return {
+ text: 'span'
+ }
+ },
+ mounted() {
+ this.$root.$on(EVENT_SHOW, spy)
+ },
+ beforeDestroy() {
+ this.$root.$off(EVENT_SHOW, spy)
+ },
+ template: '{{ text }}'
+ })
+ const wrapper = mount(App, {
+ localVue: localVue
+ })
+
+ expect(wrapper.isVueInstance()).toBe(true)
+ expect(wrapper.is('span')).toBe(true)
+ expect(spy).not.toHaveBeenCalled()
+ expect(wrapper.find('span').attributes('role')).toBe('button')
+ expect(wrapper.find('span').attributes('tabindex')).toBe('0')
+ expect(wrapper.find('span').text()).toBe('span')
+
+ const $span = wrapper.find('span')
+ $span.trigger('keydown.space')
+ expect(spy).toHaveBeenCalledTimes(1)
+ expect(spy).toBeCalledWith('test', $span.element)
+ expect(wrapper.find('span').attributes('role')).toBe('button')
+
+ wrapper.destroy()
+ })
+
+ it('works on non-buttons using keydown enter', async () => {
+ const localVue = new CreateLocalVue()
+ const spy = jest.fn()
+
+ const App = localVue.extend({
+ directives: {
+ bModal: VBModal
+ },
+ data() {
+ return {
+ text: 'span'
+ }
+ },
+ mounted() {
+ this.$root.$on(EVENT_SHOW, spy)
+ },
+ beforeDestroy() {
+ this.$root.$off(EVENT_SHOW, spy)
+ },
+ template: '{{ text }}'
+ })
+ const wrapper = mount(App, {
+ localVue: localVue
+ })
+
+ expect(wrapper.isVueInstance()).toBe(true)
+ expect(wrapper.is('span')).toBe(true)
+ expect(spy).not.toHaveBeenCalled()
+ expect(wrapper.find('span').attributes('role')).toBe('button')
+ expect(wrapper.find('span').text()).toBe('span')
+
+ const $span = wrapper.find('span')
+ $span.trigger('keydown.enter')
+ expect(spy).toHaveBeenCalledTimes(1)
+ expect(spy).toBeCalledWith('test', $span.element)
+ expect(wrapper.find('span').attributes('role')).toBe('button')
+
+ wrapper.destroy()
+ })
})
diff --git a/src/directives/popover/package.json b/src/directives/popover/package.json
index d4c8f307769..f65fdd8855b 100644
--- a/src/directives/popover/package.json
+++ b/src/directives/popover/package.json
@@ -6,8 +6,9 @@
"description": "Add BootstrapVue popovers to any element on your site, using Bootstrap v4 CSS for styling and animations. Popovers are tooltips on steroids.",
"directive": "VBPopover",
"arg": {
- "pattern": "[a-zA-Z][a-ZA-Z0-9_\\-]*",
- "description": "ID of element to append the popover markup when visible. Optional, defaults to the body"
+ "pattern": "[a-zA-Z][a-zA-Z0-9_\\-]*",
+ "description": "ID of element to append the popover markup when visible. Optional, defaults to the body",
+ "required": false
},
"expression": [
"String",
diff --git a/src/directives/popover/popover.js b/src/directives/popover/popover.js
index 86e8be83d4e..35944c402e4 100644
--- a/src/directives/popover/popover.js
+++ b/src/directives/popover/popover.js
@@ -193,10 +193,10 @@ const applyPopover = (el, bindings, vnode) => {
// and content if they are functions
const data = {}
if (isFunction(config.title)) {
- data.title = config.title()
+ data.title = config.title(el)
}
if (isFunction(config.content)) {
- data.content = config.content()
+ data.content = config.content(el)
}
if (keys(data).length > 0) {
el[BV_POPOVER].updateData(data)
@@ -233,7 +233,7 @@ const applyPopover = (el, bindings, vnode) => {
// If title/content is a function, we execute it here
newData[prop] =
(prop === 'title' || prop === 'content') && isFunction(data[prop])
- ? data[prop]()
+ ? data[prop](el)
: data[prop]
}
})
diff --git a/src/directives/scrollspy/package.json b/src/directives/scrollspy/package.json
index d3593963018..4e711feecca 100644
--- a/src/directives/scrollspy/package.json
+++ b/src/directives/scrollspy/package.json
@@ -6,8 +6,9 @@
"description": "Automatically activate BootstrapVue navigation or list group components based on scroll position to indicate which link is currently active in the viewport.",
"directive": "VBScrollspy",
"arg": {
- "pattern": "[a-zA-Z][a-ZA-Z0-9_\\-]*",
- "description": "ID of element to monitor scrolling on (if not provided defaults to the body element)"
+ "pattern": "[a-zA-Z][a-zA-Z0-9_\\-]*",
+ "description": "ID of element to monitor scrolling on (if not provided defaults to the body element)",
+ "required": false
},
"expression": [
"String",
diff --git a/src/directives/tooltip/package.json b/src/directives/tooltip/package.json
index e18303e5c26..5f170e6a4fa 100644
--- a/src/directives/tooltip/package.json
+++ b/src/directives/tooltip/package.json
@@ -6,8 +6,9 @@
"description": "Add custom BootstrapVue tooltips to any element. Tooltips can be triggered by hovering, focusing, or clicking an element.",
"directive": "VBTooltip",
"arg": {
- "pattern": "[a-zA-Z][a-ZA-Z0-9_\\-]*",
- "description": "ID of element to append the tooltip markup when visible. Optional, defaults to the body"
+ "pattern": "[a-zA-Z][a-zA-Z0-9_\\-]*",
+ "description": "ID of element to append the tooltip markup when visible. Optional, defaults to the body",
+ "required": false
},
"expression": [
"String",
diff --git a/src/directives/tooltip/tooltip.js b/src/directives/tooltip/tooltip.js
index ab79df85b18..a7e5a9da2b4 100644
--- a/src/directives/tooltip/tooltip.js
+++ b/src/directives/tooltip/tooltip.js
@@ -193,7 +193,7 @@ const applyTooltip = (el, bindings, vnode) => {
// Before showing the tooltip, we update the title if it is a function
if (isFunction(config.title)) {
el[BV_TOOLTIP].updateData({
- title: config.title()
+ title: config.title(el)
})
}
})
@@ -225,7 +225,7 @@ const applyTooltip = (el, bindings, vnode) => {
// We only pass data properties that have changed
if (data[prop] !== oldData[prop]) {
// if title is a function, we execute it here
- newData[prop] = prop === 'title' && isFunction(data[prop]) ? data[prop]() : data[prop]
+ newData[prop] = prop === 'title' && isFunction(data[prop]) ? data[prop](el) : data[prop]
}
})
el[BV_TOOLTIP].updateData(newData)
diff --git a/src/directives/visible/README.md b/src/directives/visible/README.md
new file mode 100644
index 00000000000..79595488864
--- /dev/null
+++ b/src/directives/visible/README.md
@@ -0,0 +1,246 @@
+# Visible
+
+> `v-b-visible` is a lightweight directive that allows you to react when an element becomes visible
+> in the viewport and/or when it moves out of the viewport (or is no longer visible).
+
+The `v-b-visible` directive was added in version `2.1.0`.
+
+## Overview
+
+- `v-b-visible` will call your callback method with a boolean value indicating if the element is
+ visible (intersecting with the viewport) or not.
+- The directive can be placed on almost any element or component.
+- Changes in visibility can also be detected (such as `display: none`), as long as the element is
+ within (or partially within) the viewport, or within the optional offset. Note: transitioning to a
+ non-visible state due to `v-if="false"` _cannot_ be detected.
+- Internally, BootstrapVue uses this directive in several components, such as ``.
+- The `v-b-visible` directive requires browser support of
+ [`IntersectionObserver`](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API).
+ For older browsers that do not support `IntersectionObserver`, you will need to use a
+ [polyfill](/docs/#js).
+- If `IntersectionObserver` support is not detected, then `v-b-visible` will assume the element is
+ _always visible_, and will call the callback once with the argument set to `true`.
+
+## Directive syntax and usage
+
+```html
+content
+```
+
+Where `callback` is required:
+
+- A function reference that will be called whenever visibility changes. The callback is passed a
+ single boolean argument. `true` indicates that the element is intersecting (partially or entirely
+ visible) in the viewport, or `false` if the element is not visible/intersecting with the viewport.
+ The callback will be called each time the element's visibility changes (except when the `once`
+ modifier is used. See below for details)
+
+Where `[mod1]` or `[mod2]` can be (all optional):
+
+- A positive integer number representing the offset (margin) in pixels _away_ from the edge of the
+ _viewport_ to determine when the element is considered in (or just about to be in) the viewport.
+ The value adds a margin around the viewport. The default value is `0`.
+- The keyword `once`. When this modifier is present, the callback will be called only once the first
+ time the element is visible (with the argument of `true` indicating the element is
+ intersecting/visible). Note the callback _may be_ called prior to this with an argument of `false`
+ signifying the element is not intersecting/visible.
+
+The order of the modifiers is not important.
+
+### Usage syntax examples
+
+In all use cases, the callback function is required.
+
+#### Basic (no modifiers)
+
+```html
+
+ ...
+
+
+```
+
+#### With viewport offset modifier
+
+In this example, the modifier value represents 350px (if the element is outside of the physical
+viewport by at least 350px, then it will be considered "visible"):
+
+```html
+
+ ...
+
+
+```
+
+#### With the `once` modifier
+
+```html
+
+ ...
+
+
+```
+
+#### With both `once` and offset modifiers
+
+```html
+
+ ...
+
+
+```
+
+## Live examples
+
+Here are two live examples showing two common use cases.
+
+### Visibility of scrolled content
+
+Scroll the container to see the reaction when the `` scrolls into view. Note that
+visibility state will also change if the element is scrolled out of the viewport.
+
+```html
+
+
+
+ {{ text }}
+ Element with v-b-visible directive
+ {{ text }}
+
+
+ Visible: {{ isVisible }}
+
+
+
+
+
+
+
+```
+
+One use case for this, when combined with the `once` modifier, is to see if a user has scrolled to
+the bottom of a page or scrollable div (i.e. has "read" the entire terms of service).
+
+### CSS display visibility detection
+
+Click the button to change the `` visibility state. Note that visibility state will also change
+if the element is scrolled out of the viewport.
+
+```html
+
+
+ Toggle display
+ Visible: {{ isVisible }}
+
+
+
+ Element with v-b-visible directive
+
+
+
+
+
+
+
+
+```
+
+## See also
+
+For more details on `IntersectionObserver`, refer to the
+[MDN documentation](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API)
diff --git a/src/directives/visible/index.d.ts b/src/directives/visible/index.d.ts
new file mode 100644
index 00000000000..d2ea62bb3fd
--- /dev/null
+++ b/src/directives/visible/index.d.ts
@@ -0,0 +1,11 @@
+//
+// VBVisible
+//
+import Vue, { DirectiveOptions } from 'vue'
+import { BvPlugin } from '../../'
+
+// Plugin
+export declare const VBVisiblePlugin: BvPlugin
+
+// Directive: v-b-visible
+export declare const VBVisible: DirectiveOptions
diff --git a/src/directives/visible/index.js b/src/directives/visible/index.js
new file mode 100644
index 00000000000..7b97b5f9798
--- /dev/null
+++ b/src/directives/visible/index.js
@@ -0,0 +1,8 @@
+import { VBVisible } from './visible'
+import { pluginFactory } from '../../utils/plugins'
+
+const VBVisiblePlugin = /*#__PURE__*/ pluginFactory({
+ directives: { VBVisible }
+})
+
+export { VBVisiblePlugin, VBVisible }
diff --git a/src/directives/visible/package.json b/src/directives/visible/package.json
new file mode 100644
index 00000000000..593053ce8a7
--- /dev/null
+++ b/src/directives/visible/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "@bootstrap-vue/v-b-visible",
+ "version": "0.0.0",
+ "meta": {
+ "title": "Visible",
+ "description": "The `v-b-visible` directive allows you to react when an element becomes visible in the viewport.",
+ "directive": "VBVisible",
+ "new": true,
+ "version": "2.1.0",
+ "expression": [
+ "Function"
+ ],
+ "modifiers": [
+ {
+ "name": "once",
+ "description": "Only calls the callback once when the element becomes visible in the viewport"
+ },
+ {
+ "name": "{###}",
+ "pattern": "[0-9]+",
+ "description": "An offset value in pixels (where `{###}` is the number of pixels) relative to the viewport, defaults to 0. Negative values allowed"
+ }
+ ]
+ }
+}
diff --git a/src/directives/visible.js b/src/directives/visible/visible.js
similarity index 91%
rename from src/directives/visible.js
rename to src/directives/visible/visible.js
index 8ef04b63d76..fc78c215e56 100644
--- a/src/directives/visible.js
+++ b/src/directives/visible/visible.js
@@ -31,10 +31,10 @@
// )
// }
-import looseEqual from '../utils/loose-equal'
-import { requestAF } from '../utils/dom'
-import { isFunction } from '../utils/inspect'
-import { keys } from '../utils/object'
+import looseEqual from '../../utils/loose-equal'
+import { requestAF } from '../../utils/dom'
+import { isFunction } from '../../utils/inspect'
+import { clone, keys } from '../../utils/object'
const OBSERVER_PROP_NAME = '__bv__visibility_observer'
@@ -149,7 +149,7 @@ const bind = (el, { value, modifiers }, vnode) => {
// Create new observer
el[OBSERVER_PROP_NAME] = new VisibilityObserver(el, options, vnode)
// Store the current modifiers on the object (cloned)
- el[OBSERVER_PROP_NAME]._prevModifiers = { ...modifiers }
+ el[OBSERVER_PROP_NAME]._prevModifiers = clone(modifiers)
}
// When the directive options may have been updated (or element)
@@ -157,10 +157,13 @@ const componentUpdated = (el, { value, oldValue, modifiers }, vnode) => {
// Compare value/oldValue and modifiers to see if anything has changed
// and if so, destroy old observer and create new observer
/* istanbul ignore next */
+ modifiers = clone(modifiers)
+ /* istanbul ignore next */
if (
- value !== oldValue ||
- !el[OBSERVER_PROP_NAME] ||
- !looseEqual(modifiers, el[OBSERVER_PROP_NAME]._prevModifiers)
+ el &&
+ (value !== oldValue ||
+ !el[OBSERVER_PROP_NAME] ||
+ !looseEqual(modifiers, el[OBSERVER_PROP_NAME]._prevModifiers))
) {
// Re-bind on element
bind(el, { value, modifiers }, vnode)
diff --git a/src/index.js b/src/index.js
index 55476dfdc14..c763a851ae2 100644
--- a/src/index.js
+++ b/src/index.js
@@ -47,8 +47,9 @@ export {
//
// Export named injection plugins
//
-// TODO: we should probably move injections into their
-// own parent directory (i.e. /src/injections)
+// TODO:
+// We should probably move injections into their own
+// parent directory (i.e. `/src/injections`)
export { BVModalPlugin } from './components/modal/helpers/bv-modal'
export { BVToastPlugin } from './components/toast/helpers/bv-toast'
@@ -56,12 +57,12 @@ export { BVToastPlugin } from './components/toast/helpers/bv-toast'
// Export all individual components and component group plugins as named exports.
//
-// Webpack 4 has optimization difficulties with re-eport of re-exports, so
-// we import the components individulaly here for better tree shaking,
+// Webpack 4 has optimization difficulties with re-export of re-exports,
+// so we import the components individually here for better tree shaking
//
// Webpack v5 fixes the optimizations with re-export of re-exports so this
-// can be reverted back to `export * from './table'` when Webpack v5 is released.
-// https://github.com/webpack/webpack/pull/9203 (available in Webpack v5.0.0-alpha.15)
+// can be reverted back to `export * from './table'` when Webpack v5 is released
+// See: https://github.com/webpack/webpack/pull/9203 (available in Webpack v5.0.0-alpha.15)
// export * from './components/alert'
export { AlertPlugin } from './components/alert'
@@ -273,11 +274,11 @@ export { BTooltip } from './components/tooltip/tooltip'
// Named exports of all directives (VB ) and Plugins (VBPlugin)
//
-// Webpack 4 has optimization difficulties with re-eport of re-exports, so
-// we import the directives individulaly here for better tree shaking,
+// Webpack 4 has optimization difficulties with re-export of re-exports,
+// so we import the directives individually here for better tree shaking
//
// Webpack v5 fixes the optimizations with re-export of re-exports so this
-// can be reverted back to `export * from './scrollspy'` when Webpack v5 is released.
+// can be reverted back to `export * from './scrollspy'` when Webpack v5 is released
// https://github.com/webpack/webpack/pull/9203 (available in Webpack v5.0.0-alpha.15)
// export * from './directives/modal'
@@ -300,5 +301,9 @@ export { VBToggle } from './directives/toggle/toggle'
export { VBTooltipPlugin } from './directives/tooltip'
export { VBTooltip } from './directives/tooltip/tooltip'
+// export * from './directives/tooltip'
+export { VBVisiblePlugin } from './directives/visible'
+export { VBVisible } from './directives/visible/visible'
+
// Default export is the BootstrapVue plugin
export default BootstrapVue
diff --git a/src/mixins/click-out.js b/src/mixins/click-out.js
index 1d98af4024c..308ee26d6dd 100644
--- a/src/mixins/click-out.js
+++ b/src/mixins/click-out.js
@@ -1,5 +1,7 @@
import { contains, eventOff, eventOn } from '../utils/dom'
+const eventOptions = { passive: true, capture: false }
+
// @vue/component
export default {
data() {
@@ -10,9 +12,9 @@ export default {
watch: {
listenForClickOut(newValue, oldValue) {
if (newValue !== oldValue) {
- eventOff(this.clickOutElement, this.clickOutEventName, this._clickOutHandler, false)
+ eventOff(this.clickOutElement, this.clickOutEventName, this._clickOutHandler, eventOptions)
if (newValue) {
- eventOn(this.clickOutElement, this.clickOutEventName, this._clickOutHandler, false)
+ eventOn(this.clickOutElement, this.clickOutEventName, this._clickOutHandler, eventOptions)
}
}
}
@@ -30,11 +32,11 @@ export default {
this.clickOutEventName = 'ontouchstart' in document.documentElement ? 'touchstart' : 'click'
}
if (this.listenForClickOut) {
- eventOn(this.clickOutElement, this.clickOutEventName, this._clickOutHandler, false)
+ eventOn(this.clickOutElement, this.clickOutEventName, this._clickOutHandler, eventOptions)
}
},
beforeDestroy() /* istanbul ignore next */ {
- eventOff(this.clickOutElement, this.clickOutEventName, this._clickOutHandler, false)
+ eventOff(this.clickOutElement, this.clickOutEventName, this._clickOutHandler, eventOptions)
},
methods: {
isClickOut(evt) {
diff --git a/src/mixins/dropdown.js b/src/mixins/dropdown.js
index c950298e7f4..0d58aed484e 100644
--- a/src/mixins/dropdown.js
+++ b/src/mixins/dropdown.js
@@ -2,8 +2,11 @@ import Popper from 'popper.js'
import KeyCodes from '../utils/key-codes'
import warn from '../utils/warn'
import { BvEvent } from '../utils/bv-event.class'
-import { closest, contains, isVisible, requestAF, selectAll, eventOn, eventOff } from '../utils/dom'
+import { closest, contains, isVisible, requestAF, selectAll } from '../utils/dom'
+import { hasTouchSupport } from '../utils/env'
import { isNull } from '../utils/inspect'
+import clickOutMixin from './click-out'
+import focusInMixin from './focus-in'
import idMixin from './id'
// Return an array of visible items
@@ -15,7 +18,7 @@ const ROOT_DROPDOWN_SHOWN = `${ROOT_DROPDOWN_PREFIX}shown`
const ROOT_DROPDOWN_HIDDEN = `${ROOT_DROPDOWN_PREFIX}hidden`
// Delay when loosing focus before closing menu (in ms)
-const FOCUSOUT_DELAY = 100
+const FOCUSOUT_DELAY = hasTouchSupport ? 450 : 150
// Dropdown item CSS selectors
const Selector = {
@@ -47,7 +50,7 @@ const AttachmentMap = {
// @vue/component
export default {
- mixins: [idMixin],
+ mixins: [idMixin, clickOutMixin, focusInMixin],
provide() {
return {
bvDropdown: this
@@ -171,18 +174,21 @@ export default {
},
created() {
// Create non-reactive property
- this._popper = null
+ this.$_popper = null
+ this.$_hideTimeout = null
+ this.$_noop = () => {}
},
deactivated() /* istanbul ignore next: not easy to test */ {
// In case we are inside a ``
this.visible = false
this.whileOpenListen(false)
- this.removePopper()
+ this.destroyPopper()
},
beforeDestroy() {
this.visible = false
this.whileOpenListen(false)
- this.removePopper()
+ this.destroyPopper()
+ this.clearHideTimeout()
},
methods: {
// Event emitter
@@ -235,18 +241,25 @@ export default {
this.whileOpenListen(false)
this.$root.$emit(ROOT_DROPDOWN_HIDDEN, this)
this.$emit('hidden')
- this.removePopper()
+ this.destroyPopper()
},
createPopper(element) {
- this.removePopper()
- this._popper = new Popper(element, this.$refs.menu, this.getPopperConfig())
+ this.destroyPopper()
+ this.$_popper = new Popper(element, this.$refs.menu, this.getPopperConfig())
},
- removePopper() {
- if (this._popper) {
+ destroyPopper() {
+ if (this.$_popper) {
// Ensure popper event listeners are removed cleanly
- this._popper.destroy()
+ this.$_popper.destroy()
+ }
+ this.$_popper = null
+ },
+ clearHideTimeout() {
+ /* istanbul ignore next */
+ if (this.$_hideTimeout) {
+ clearTimeout(this.$_hideTimeout)
+ this.$_hideTimeout = null
}
- this._popper = null
},
getPopperConfig() {
let placement = AttachmentMap.BOTTOM
@@ -271,17 +284,15 @@ export default {
}
return { ...popperConfig, ...(this.popperOpts || {}) }
},
+ // Turn listeners on/off while open
whileOpenListen(isOpen) {
- // turn listeners on/off while open
- if (isOpen) {
- // If another dropdown is opened
- this.$root.$on(ROOT_DROPDOWN_SHOWN, this.rootCloseListener)
- // Hide the menu when focus moves out
- eventOn(this.$el, 'focusout', this.onFocusOut, { passive: true })
- } else {
- this.$root.$off(ROOT_DROPDOWN_SHOWN, this.rootCloseListener)
- eventOff(this.$el, 'focusout', this.onFocusOut, { passive: true })
- }
+ // Hide the dropdown when clicked outside
+ this.listenForClickOut = isOpen
+ // Hide the dropdown when it loses focus
+ this.listenForFocusIn = isOpen
+ // Hide the dropdown when another dropdown is opened
+ const method = isOpen ? '$on' : '$off'
+ this.$root[method](ROOT_DROPDOWN_SHOWN, this.rootCloseListener)
},
rootCloseListener(vm) {
if (vm !== this) {
@@ -375,27 +386,28 @@ export default {
this.$once('hidden', this.focusToggler)
}
},
- // Dropdown wrapper focusOut handler
- onFocusOut(evt) {
- // `relatedTarget` is the element gaining focus
- const relatedTarget = evt.relatedTarget
- // If focus moves outside the menu or toggler, then close menu
- if (
- this.visible &&
- !contains(this.$refs.menu, relatedTarget) &&
- !contains(this.toggler, relatedTarget)
- ) {
+ // Document click out listener
+ clickOutHandler(evt) {
+ const target = evt.target
+ if (this.visible && !contains(this.$refs.menu, target) && !contains(this.toggler, target)) {
const doHide = () => {
this.visible = false
+ return null
}
// When we are in a navbar (which has been responsively stacked), we
// delay the dropdown's closing so that the next element has a chance
// to have it's click handler fired (in case it's position moves on
// the screen do to a navbar menu above it collapsing)
// https://github.com/bootstrap-vue/bootstrap-vue/issues/4113
- this.inNavbar ? setTimeout(doHide, FOCUSOUT_DELAY) : doHide()
+ this.clearHideTimeout()
+ this.$_hideTimeout = this.inNavbar ? setTimeout(doHide, FOCUSOUT_DELAY) : doHide()
}
},
+ // Document focusin listener
+ focusInHandler(evt) {
+ // Shared logic with click-out handler
+ this.clickOutHandler(evt)
+ },
// Keyboard nav
focusNext(evt, up) {
// Ignore key up/down on form elements
diff --git a/src/mixins/focus-in.js b/src/mixins/focus-in.js
index 4860c0c6962..94b84b75c31 100644
--- a/src/mixins/focus-in.js
+++ b/src/mixins/focus-in.js
@@ -1,5 +1,7 @@
import { eventOff, eventOn } from '../utils/dom'
+const eventOptions = { passive: true, capture: false }
+
// @vue/component
export default {
data() {
@@ -10,9 +12,9 @@ export default {
watch: {
listenForFocusIn(newValue, oldValue) {
if (newValue !== oldValue) {
- eventOff(this.focusInElement, 'focusin', this._focusInHandler, false)
+ eventOff(this.focusInElement, 'focusin', this._focusInHandler, eventOptions)
if (newValue) {
- eventOn(this.focusInElement, 'focusin', this._focusInHandler, false)
+ eventOn(this.focusInElement, 'focusin', this._focusInHandler, eventOptions)
}
}
}
@@ -26,11 +28,11 @@ export default {
this.focusInElement = document
}
if (this.listenForFocusIn) {
- eventOn(this.focusInElement, 'focusin', this._focusInHandler, false)
+ eventOn(this.focusInElement, 'focusin', this._focusInHandler, eventOptions)
}
},
beforeDestroy() /* istanbul ignore next */ {
- eventOff(this.focusInElement, 'focusin', this._focusInHandler, false)
+ eventOff(this.focusInElement, 'focusin', this._focusInHandler, eventOptions)
},
methods: {
_focusInHandler(evt) {
diff --git a/src/mixins/form-text.js b/src/mixins/form-text.js
index 2e81ad710e7..607c625313f 100644
--- a/src/mixins/form-text.js
+++ b/src/mixins/form-text.js
@@ -1,4 +1,4 @@
-import { isFunction, isNull, isUndefined } from '../utils/inspect'
+import { isFunction, isUndefinedOrNull } from '../utils/inspect'
// @vue/component
export default {
@@ -35,6 +35,10 @@ export default {
type: Function,
default: null
},
+ lazyFormatter: {
+ type: Boolean,
+ default: false
+ },
trim: {
type: Boolean,
default: false
@@ -43,26 +47,38 @@ export default {
type: Boolean,
default: false
},
- lazyFormatter: {
+ lazy: {
+ // Only update the `v-model` on blur/change events
type: Boolean,
- value: false
+ default: false
+ },
+ debounce: {
+ // Debounce timout (in ms). Not applicable with `lazy` prop
+ type: [Number, String],
+ default: 0
}
},
data() {
return {
- localValue: this.stringifyValue(this.value)
+ localValue: this.stringifyValue(this.value),
+ vModelValue: this.value
}
},
computed: {
+ computedDebounce() {
+ // Ensure we have a positive number equal to or greater than 0
+ return Math.max(parseInt(this.debounce, 10) || 0, 0)
+ },
computedClass() {
return [
{
- // Range input needs class custom-range
+ // Range input needs class `custom-range`
'custom-range': this.type === 'range',
- // plaintext not supported by type=range or type=color
+ // `plaintext` not supported by `type="range"` or `type="color"`
'form-control-plaintext':
this.plaintext && this.type !== 'range' && this.type !== 'color',
- // form-control not used by type=range or plaintext. Always used by type=color
+ // `form-control` not used by `type="range"` or `plaintext`
+ // Always used by `type="color"`
'form-control': (!this.plaintext && this.type !== 'range') || this.type === 'color'
},
this.sizeFormClass,
@@ -71,11 +87,11 @@ export default {
},
computedAriaInvalid() {
if (!this.ariaInvalid || this.ariaInvalid === 'false') {
- // this.ariaInvalid is null or false or 'false'
+ // `this.ariaInvalid` is `null` or `false` or 'false'
return this.computedState === false ? 'true' : null
}
if (this.ariaInvalid === true) {
- // User wants explicit aria-invalid=true
+ // User wants explicit `:aria-invalid="true"`
return 'true'
}
// Most likely a string value (which could be the string 'true')
@@ -84,53 +100,76 @@ export default {
},
watch: {
value(newVal) {
- if (newVal !== this.localValue) {
- this.localValue = this.stringifyValue(newVal)
+ const stringifyValue = this.stringifyValue(newVal)
+ if (stringifyValue !== this.localValue && newVal !== this.vModelValue) {
+ // Clear any pending debounce timeout, as we are overwriting the user input
+ this.clearDebounce()
+ // Update the local values
+ this.localValue = stringifyValue
+ this.vModelValue = newVal
}
}
},
mounted() {
- const value = this.stringifyValue(this.value)
- if (value !== this.localValue) {
- /* istanbul ignore next */
- this.localValue = value
+ // Create non-reactive property and set up destroy handler
+ this.$_inputDebounceTimer = null
+ this.$on('hook:beforeDestroy', this.clearDebounce)
+ // Preset the internal state
+ const value = this.value
+ const stringifyValue = this.stringifyValue(value)
+ /* istanbul ignore next */
+ if (stringifyValue !== this.localValue && value !== this.vModelValue) {
+ this.localValue = stringifyValue
+ this.vModelValue = value
}
},
methods: {
+ clearDebounce() {
+ clearTimeout(this.$_inputDebounceTimer)
+ this.$_inputDebounceTimer = null
+ },
stringifyValue(value) {
- return isUndefined(value) || isNull(value) ? '' : String(value)
+ return isUndefinedOrNull(value) ? '' : String(value)
},
- getFormatted(value, evt, force = false) {
+ formatValue(value, evt, force = false) {
value = this.stringifyValue(value)
if ((!this.lazyFormatter || force) && isFunction(this.formatter)) {
value = this.formatter(value, evt)
}
return value
},
- updateValue(value) {
- value = this.stringifyValue(value)
- if (value !== this.localValue) {
- // Keep the input set to the value before modifiers
- this.localValue = value
- if (this.number) {
- // Emulate `.number` modifier behaviour
- const num = parseFloat(value)
- value = isNaN(num) ? value : num
- } else if (this.trim) {
- // Emulate `.trim` modifier behaviour
- value = value.trim()
+ modifyValue(value) {
+ // Emulate `.trim` modifier behaviour
+ if (this.trim) {
+ value = value.trim()
+ }
+ // Emulate `.number` modifier behaviour
+ if (this.number) {
+ const number = parseFloat(value)
+ value = isNaN(number) ? value : number
+ }
+ return value
+ },
+ updateValue(value, force = false) {
+ const lazy = this.lazy
+ const ms = this.computedDebounce
+ if (lazy && !force) {
+ return
+ }
+ value = this.modifyValue(value)
+ if (value !== this.vModelValue) {
+ this.clearDebounce()
+ const doUpdate = () => {
+ this.vModelValue = value
+ this.$emit('update', value)
+ }
+ if (ms > 0 && !lazy && !force) {
+ // Change/Blur/Force will not be debounced
+ this.$_inputDebounceTimer = setTimeout(doUpdate, ms)
+ } else {
+ // Immediately update the v-model
+ doUpdate()
}
- // Update the v-model
- this.$emit('update', value)
- } else if (this.$refs.input && value !== this.$refs.input.value) {
- // When the `localValue` hasn't changed but the actual input value
- // is out of sync, make sure to change it to the given one.
- // Usually casued by browser autocomplete and how it triggers the
- // change or input event, or depending on the formatter function.
- // https://github.com/bootstrap-vue/bootstrap-vue/issues/2657
- // https://github.com/bootstrap-vue/bootstrap-vue/issues/3498
- /* istanbul ignore next: hard to test */
- this.$refs.input.value = value
}
},
onInput(evt) {
@@ -140,16 +179,18 @@ export default {
if (evt.target.composing) {
return
}
- const formatted = this.getFormatted(evt.target.value, evt)
+ const value = evt.target.value
+ const formattedValue = this.formatValue(value, evt)
// Exit when the `formatter` function strictly returned `false`
// or prevented the input event
- if (formatted === false || evt.defaultPrevented) {
- /* istanbul ignore next */
+ /* istanbul ignore next */
+ if (formattedValue === false || evt.defaultPrevented) {
evt.preventDefault()
return
}
- this.updateValue(formatted)
- this.$emit('input', formatted)
+ this.localValue = formattedValue
+ this.updateValue(formattedValue)
+ this.$emit('input', formattedValue)
},
onChange(evt) {
// `evt.target.composing` is set by Vue
@@ -158,26 +199,31 @@ export default {
if (evt.target.composing) {
return
}
- const formatted = this.getFormatted(evt.target.value, evt)
+ const value = evt.target.value
+ const formattedValue = this.formatValue(value, evt)
// Exit when the `formatter` function strictly returned `false`
// or prevented the input event
- if (formatted === false || evt.defaultPrevented) {
- /* istanbul ignore next */
+ /* istanbul ignore next */
+ if (formattedValue === false || evt.defaultPrevented) {
evt.preventDefault()
return
}
- this.updateValue(formatted)
- this.$emit('change', formatted)
+ this.localValue = formattedValue
+ this.updateValue(formattedValue, true)
+ this.$emit('change', formattedValue)
},
onBlur(evt) {
- // Lazy formatter
- if (this.lazyFormatter) {
- const formatted = this.getFormatted(evt.target.value, evt, true)
- // Exit when the `formatter` function strictly returned `false`
- if (formatted === false) {
- return
- }
- this.updateValue(formatted)
+ // Apply the `localValue` on blur to prevent cursor jumps
+ // on mobile browsers (e.g. caused by autocomplete)
+ const value = evt.target.value
+ const formattedValue = this.formatValue(value, evt, true)
+ if (formattedValue !== false) {
+ // We need to use the modified value here to apply the
+ // `.trim` and `.number` modifiers properly
+ this.localValue = this.stringifyValue(this.modifyValue(formattedValue))
+ // We pass the formatted value here since the `updateValue` method
+ // handles the modifiers itself
+ this.updateValue(formattedValue, true)
}
// Emit native blur event
this.$emit('blur', evt)
diff --git a/src/mixins/pagination.js b/src/mixins/pagination.js
index dfe0548d479..f9ad65a3db3 100644
--- a/src/mixins/pagination.js
+++ b/src/mixins/pagination.js
@@ -78,6 +78,10 @@ export const props = {
type: String,
default: 'left'
},
+ pills: {
+ type: Boolean,
+ default: false
+ },
hideGotoEndButtons: {
type: Boolean,
default: false
@@ -166,6 +170,9 @@ export default {
}
return ''
},
+ styleClass() {
+ return this.pills ? 'b-pagination-pills' : ''
+ },
computedCurrentPage() {
return sanitizeCurrentPage(this.currentPage, this.localNumberOfPages)
},
@@ -280,6 +287,17 @@ export default {
})
},
methods: {
+ handleKeyNav(evt) {
+ const keyCode = evt.keyCode
+ const shift = evt.shiftKey
+ if (keyCode === KeyCodes.LEFT || keyCode === KeyCodes.UP) {
+ evt.preventDefault()
+ shift ? this.focusFirst() : this.focusPrev()
+ } else if (keyCode === KeyCodes.RIGHT || keyCode === KeyCodes.DOWN) {
+ evt.preventDefault()
+ shift ? this.focusLast() : this.focusNext()
+ }
+ },
getButtons() {
// Return only buttons that are visible
return selectAll('a.page-link', this.$el).filter(btn => isVisible(btn))
@@ -532,25 +550,13 @@ export default {
{
ref: 'ul',
staticClass: 'pagination',
- class: ['b-pagination', this.btnSize, this.alignment],
+ class: ['b-pagination', this.btnSize, this.alignment, this.styleClass],
attrs: {
role: 'menubar',
'aria-disabled': disabled ? 'true' : 'false',
'aria-label': this.ariaLabel || null
},
- on: {
- keydown: evt => {
- const keyCode = evt.keyCode
- const shift = evt.shiftKey
- if (keyCode === KeyCodes.LEFT) {
- evt.preventDefault()
- shift ? this.focusFirst() : this.focusPrev()
- } else if (keyCode === KeyCodes.RIGHT) {
- evt.preventDefault()
- shift ? this.focusLast() : this.focusNext()
- }
- }
- }
+ on: { keydown: this.handleKeyNav }
},
buttons
)
diff --git a/src/utils/config-defaults.js b/src/utils/config-defaults.js
index f0e29e2657c..89518c76f6b 100644
--- a/src/utils/config-defaults.js
+++ b/src/utils/config-defaults.js
@@ -152,7 +152,7 @@ export default deepFreeze({
variant: null
},
BTable: {
- selectedVariant: 'primary',
+ selectedVariant: 'active',
headVariant: null,
footVariant: null
},
diff --git a/src/utils/copy-props.js b/src/utils/copy-props.js
index 0a4621050ba..31768e7e550 100644
--- a/src/utils/copy-props.js
+++ b/src/utils/copy-props.js
@@ -1,5 +1,6 @@
import identity from './identity'
import { isArray, isObject } from './inspect'
+import { clone } from './object'
/**
* Copies props from one array/object to a new array/object. Prop values
@@ -22,7 +23,7 @@ const copyProps = (props, transformFn = identity) => {
if (props.hasOwnProperty(prop)) {
// If the prop value is an object, do a shallow clone to prevent
// potential mutations to the original object.
- copied[transformFn(prop)] = isObject(props[prop]) ? { ...props[prop] } : props[prop]
+ copied[transformFn(prop)] = isObject(props[prop]) ? clone(props[prop]) : props[prop]
}
}
diff --git a/src/utils/object.js b/src/utils/object.js
index 7068d9724c9..99454bbaaa8 100644
--- a/src/utils/object.js
+++ b/src/utils/object.js
@@ -36,12 +36,25 @@ export const isObject = obj => obj !== null && typeof obj === 'object'
*/
export const isPlainObject = obj => Object.prototype.toString.call(obj) === '[object Object]'
-// @link https://gist.github.com/bisubus/2da8af7e801ffd813fab7ac221aa7afc
+/**
+ * Shallow copy an object. If the passed in object
+ * is null or undefined, returns an empty object
+ */
+export const clone = obj => ({ ...obj })
+
+/**
+ * Return a shallow copy of object with
+ * the specified properties omitted
+ * @link https://gist.github.com/bisubus/2da8af7e801ffd813fab7ac221aa7afc
+ */
export const omit = (obj, props) =>
keys(obj)
.filter(key => props.indexOf(key) === -1)
.reduce((result, key) => ({ ...result, [key]: obj[key] }), {})
+/**
+ * Convenience method to create a read-only descriptor
+ */
export const readonlyDescriptor = () => ({ enumerable: true, configurable: false, writable: false })
/**
diff --git a/yarn.lock b/yarn.lock
index f2ef5b0d7a1..4d8865fd142 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,18 +2,17 @@
# yarn lockfile v1
-"@babel/cli@^7.6.4":
- version "7.6.4"
- resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.6.4.tgz#9b35a4e15fa7d8f487418aaa8229c8b0bc815f20"
- integrity sha512-tqrDyvPryBM6xjIyKKUwr3s8CzmmYidwgdswd7Uc/Cv0ogZcuS1TYQTLx/eWKP3UbJ6JxZAiYlBZabXm/rtRsQ==
+"@babel/cli@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.7.0.tgz#8d10c9acb2acb362d7614a9493e1791c69100d89"
+ integrity sha512-jECEqAq6Ngf3pOhLSg7od9WKyrIacyh1oNNYtRXNn+ummSHCTXBamGywOAtiae34Vk7zKuQNnLvo2BKTMCoV4A==
dependencies:
commander "^2.8.1"
convert-source-map "^1.1.0"
fs-readdir-recursive "^1.1.0"
glob "^7.0.0"
lodash "^4.17.13"
- mkdirp "^0.5.1"
- output-file-sync "^2.0.0"
+ make-dir "^2.1.0"
slash "^2.0.0"
source-map "^0.5.0"
optionalDependencies:
@@ -73,6 +72,26 @@
semver "^5.4.1"
source-map "^0.5.0"
+"@babel/core@^7.7.2":
+ version "7.7.2"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.2.tgz#ea5b99693bcfc058116f42fa1dd54da412b29d91"
+ integrity sha512-eeD7VEZKfhK1KUXGiyPFettgF3m513f8FoBSWiQ1xTvl1RAopLs42Wp9+Ze911I6H0N9lNqJMDgoZT7gHsipeQ==
+ dependencies:
+ "@babel/code-frame" "^7.5.5"
+ "@babel/generator" "^7.7.2"
+ "@babel/helpers" "^7.7.0"
+ "@babel/parser" "^7.7.2"
+ "@babel/template" "^7.7.0"
+ "@babel/traverse" "^7.7.2"
+ "@babel/types" "^7.7.2"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ json5 "^2.1.0"
+ lodash "^4.17.13"
+ resolve "^1.3.2"
+ semver "^5.4.1"
+ source-map "^0.5.0"
+
"@babel/generator@^7.4.0", "@babel/generator@^7.5.0":
version "7.5.0"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.0.tgz#f20e4b7a91750ee8b63656073d843d2a736dca4a"
@@ -125,6 +144,26 @@
lodash "^4.17.13"
source-map "^0.5.0"
+"@babel/generator@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.0.tgz#c6d4d1f7a0d6e139cbd01aca73170b0bff5425b4"
+ integrity sha512-1wdJ6UxHyL1XoJQ119JmvuRX27LRih7iYStMPZOWAjQqeAabFg3dYXKMpgihma+to+0ADsTVVt6oRyUxWZw6Mw==
+ dependencies:
+ "@babel/types" "^7.7.0"
+ jsesc "^2.5.1"
+ lodash "^4.17.13"
+ source-map "^0.5.0"
+
+"@babel/generator@^7.7.2":
+ version "7.7.2"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.2.tgz#2f4852d04131a5e17ea4f6645488b5da66ebf3af"
+ integrity sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==
+ dependencies:
+ "@babel/types" "^7.7.2"
+ jsesc "^2.5.1"
+ lodash "^4.17.13"
+ source-map "^0.5.0"
+
"@babel/helper-annotate-as-pure@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32"
@@ -132,6 +171,13 @@
dependencies:
"@babel/types" "^7.0.0"
+"@babel/helper-annotate-as-pure@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.0.tgz#efc54032d43891fe267679e63f6860aa7dbf4a5e"
+ integrity sha512-k50CQxMlYTYo+GGyUGFwpxKVtxVJi9yh61sXZji3zYHccK9RYliZGSTOgci85T+r+0VFN2nWbGM04PIqwfrpMg==
+ dependencies:
+ "@babel/types" "^7.7.0"
+
"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0":
version "7.1.0"
resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f"
@@ -173,6 +219,14 @@
"@babel/helper-replace-supers" "^7.5.5"
"@babel/helper-split-export-declaration" "^7.4.4"
+"@babel/helper-create-regexp-features-plugin@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.0.tgz#2e8badfe201cfafb5d930f46cf1e0b6f1cdcab23"
+ integrity sha512-ZhagAAVGD3L6MPM9/zZi7RRteonfBFLVUz3kjsnYsMAtr9hOJCKI9BAKIMpqn3NyWicPieoX779UL+7/3BEAOA==
+ dependencies:
+ "@babel/helper-regex" "^7.4.4"
+ regexpu-core "^4.6.0"
+
"@babel/helper-define-map@^7.5.5":
version "7.5.5"
resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369"
@@ -182,6 +236,15 @@
"@babel/types" "^7.5.5"
lodash "^4.17.13"
+"@babel/helper-define-map@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.7.0.tgz#60b0e9fd60def9de5054c38afde8c8ee409c7529"
+ integrity sha512-kPKWPb0dMpZi+ov1hJiwse9dWweZsz3V9rP4KdytnX1E7z3cTNmFGglwklzFPuqIcHLIY3bgKSs4vkwXXdflQA==
+ dependencies:
+ "@babel/helper-function-name" "^7.7.0"
+ "@babel/types" "^7.7.0"
+ lodash "^4.17.13"
+
"@babel/helper-explode-assignable-expression@^7.1.0":
version "7.1.0"
resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6"
@@ -199,6 +262,15 @@
"@babel/template" "^7.1.0"
"@babel/types" "^7.0.0"
+"@babel/helper-function-name@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz#44a5ad151cfff8ed2599c91682dda2ec2c8430a3"
+ integrity sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==
+ dependencies:
+ "@babel/helper-get-function-arity" "^7.7.0"
+ "@babel/template" "^7.7.0"
+ "@babel/types" "^7.7.0"
+
"@babel/helper-get-function-arity@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3"
@@ -206,6 +278,13 @@
dependencies:
"@babel/types" "^7.0.0"
+"@babel/helper-get-function-arity@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz#c604886bc97287a1d1398092bc666bc3d7d7aa2d"
+ integrity sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==
+ dependencies:
+ "@babel/types" "^7.7.0"
+
"@babel/helper-hoist-variables@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a"
@@ -213,6 +292,13 @@
dependencies:
"@babel/types" "^7.4.4"
+"@babel/helper-hoist-variables@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.0.tgz#b4552e4cfe5577d7de7b183e193e84e4ec538c81"
+ integrity sha512-LUe/92NqsDAkJjjCEWkNe+/PcpnisvnqdlRe19FahVapa4jndeuJ+FBiTX1rcAKWKcJGE+C3Q3tuEuxkSmCEiQ==
+ dependencies:
+ "@babel/types" "^7.7.0"
+
"@babel/helper-member-expression-to-functions@^7.5.5":
version "7.5.5"
resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz#1fb5b8ec4453a93c439ee9fe3aeea4a84b76b590"
@@ -220,6 +306,13 @@
dependencies:
"@babel/types" "^7.5.5"
+"@babel/helper-member-expression-to-functions@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.0.tgz#472b93003a57071f95a541ea6c2b098398bcad8a"
+ integrity sha512-QaCZLO2RtBcmvO/ekOLp8p7R5X2JriKRizeDpm5ChATAFWrrYDcDxPuCIBXKyBjY+i1vYSdcUTMIb8psfxHDPA==
+ dependencies:
+ "@babel/types" "^7.7.0"
+
"@babel/helper-module-imports@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d"
@@ -227,6 +320,13 @@
dependencies:
"@babel/types" "^7.0.0"
+"@babel/helper-module-imports@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz#99c095889466e5f7b6d66d98dffc58baaf42654d"
+ integrity sha512-Dv3hLKIC1jyfTkClvyEkYP2OlkzNvWs5+Q8WgPbxM5LMeorons7iPP91JM+DU7tRbhqA1ZeooPaMFvQrn23RHw==
+ dependencies:
+ "@babel/types" "^7.7.0"
+
"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz#96115ea42a2f139e619e98ed46df6019b94414b8"
@@ -239,6 +339,18 @@
"@babel/types" "^7.4.4"
lodash "^4.17.11"
+"@babel/helper-module-transforms@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.0.tgz#154a69f0c5b8fd4d39e49750ff7ac4faa3f36786"
+ integrity sha512-rXEefBuheUYQyX4WjV19tuknrJFwyKw0HgzRwbkyTbB+Dshlq7eqkWbyjzToLrMZk/5wKVKdWFluiAsVkHXvuQ==
+ dependencies:
+ "@babel/helper-module-imports" "^7.7.0"
+ "@babel/helper-simple-access" "^7.7.0"
+ "@babel/helper-split-export-declaration" "^7.7.0"
+ "@babel/template" "^7.7.0"
+ "@babel/types" "^7.7.0"
+ lodash "^4.17.13"
+
"@babel/helper-optimise-call-expression@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5"
@@ -246,6 +358,13 @@
dependencies:
"@babel/types" "^7.0.0"
+"@babel/helper-optimise-call-expression@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.0.tgz#4f66a216116a66164135dc618c5d8b7a959f9365"
+ integrity sha512-48TeqmbazjNU/65niiiJIJRc5JozB8acui1OS7bSd6PgxfuovWsvjfWSzlgx+gPFdVveNzUdpdIg5l56Pl5jqg==
+ dependencies:
+ "@babel/types" "^7.7.0"
+
"@babel/helper-plugin-utils@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250"
@@ -269,6 +388,17 @@
"@babel/traverse" "^7.1.0"
"@babel/types" "^7.0.0"
+"@babel/helper-remap-async-to-generator@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.0.tgz#4d69ec653e8bff5bce62f5d33fc1508f223c75a7"
+ integrity sha512-pHx7RN8X0UNHPB/fnuDnRXVZ316ZigkO8y8D835JlZ2SSdFKb6yH9MIYRU4fy/KPe5sPHDFOPvf8QLdbAGGiyw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.7.0"
+ "@babel/helper-wrap-function" "^7.7.0"
+ "@babel/template" "^7.7.0"
+ "@babel/traverse" "^7.7.0"
+ "@babel/types" "^7.7.0"
+
"@babel/helper-replace-supers@^7.5.5":
version "7.5.5"
resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz#f84ce43df031222d2bad068d2626cb5799c34bc2"
@@ -279,6 +409,16 @@
"@babel/traverse" "^7.5.5"
"@babel/types" "^7.5.5"
+"@babel/helper-replace-supers@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.7.0.tgz#d5365c8667fe7cbd13b8ddddceb9bd7f2b387512"
+ integrity sha512-5ALYEul5V8xNdxEeWvRsBzLMxQksT7MaStpxjJf9KsnLxpAKBtfw5NeMKZJSYDa0lKdOcy0g+JT/f5mPSulUgg==
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "^7.7.0"
+ "@babel/helper-optimise-call-expression" "^7.7.0"
+ "@babel/traverse" "^7.7.0"
+ "@babel/types" "^7.7.0"
+
"@babel/helper-simple-access@^7.1.0":
version "7.1.0"
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c"
@@ -287,6 +427,14 @@
"@babel/template" "^7.1.0"
"@babel/types" "^7.0.0"
+"@babel/helper-simple-access@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.7.0.tgz#97a8b6c52105d76031b86237dc1852b44837243d"
+ integrity sha512-AJ7IZD7Eem3zZRuj5JtzFAptBw7pMlS3y8Qv09vaBWoFsle0d1kAn5Wq6Q9MyBXITPOKnxwkZKoAm4bopmv26g==
+ dependencies:
+ "@babel/template" "^7.7.0"
+ "@babel/types" "^7.7.0"
+
"@babel/helper-split-export-declaration@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677"
@@ -294,6 +442,13 @@
dependencies:
"@babel/types" "^7.4.4"
+"@babel/helper-split-export-declaration@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz#1365e74ea6c614deeb56ebffabd71006a0eb2300"
+ integrity sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==
+ dependencies:
+ "@babel/types" "^7.7.0"
+
"@babel/helper-wrap-function@^7.1.0":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa"
@@ -304,6 +459,16 @@
"@babel/traverse" "^7.1.0"
"@babel/types" "^7.2.0"
+"@babel/helper-wrap-function@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.7.0.tgz#15af3d3e98f8417a60554acbb6c14e75e0b33b74"
+ integrity sha512-sd4QjeMgQqzshSjecZjOp8uKfUtnpmCyQhKQrVJBBgeHAB/0FPi33h3AbVlVp07qQtMD4QgYSzaMI7VwncNK/w==
+ dependencies:
+ "@babel/helper-function-name" "^7.7.0"
+ "@babel/template" "^7.7.0"
+ "@babel/traverse" "^7.7.0"
+ "@babel/types" "^7.7.0"
+
"@babel/helpers@^7.5.0":
version "7.5.2"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.5.2.tgz#97424dc82fc0041f4c751119b4d2b1ec68cdb5ba"
@@ -322,6 +487,15 @@
"@babel/traverse" "^7.6.2"
"@babel/types" "^7.6.0"
+"@babel/helpers@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.0.tgz#359bb5ac3b4726f7c1fde0ec75f64b3f4275d60b"
+ integrity sha512-VnNwL4YOhbejHb7x/b5F39Zdg5vIQpUUNzJwx0ww1EcVRt41bbGRZWhAURrfY32T5zTT3qwNOQFWpn+P0i0a2g==
+ dependencies:
+ "@babel/template" "^7.7.0"
+ "@babel/traverse" "^7.7.0"
+ "@babel/types" "^7.7.0"
+
"@babel/highlight@^7.0.0":
version "7.5.0"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540"
@@ -361,6 +535,16 @@
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.4.tgz#cb9b36a7482110282d5cb6dd424ec9262b473d81"
integrity sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A==
+"@babel/parser@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.0.tgz#232618f6e8947bc54b407fa1f1c91a22758e7159"
+ integrity sha512-GqL+Z0d7B7ADlQBMXlJgvXEbtt5qlqd1YQ5fr12hTSfh7O/vgrEIvJxU2e7aSVrEUn75zTZ6Nd0s8tthrlZnrQ==
+
+"@babel/parser@^7.7.2":
+ version "7.7.2"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.2.tgz#ea8334dc77416bfd9473eb470fd00d8245b3943b"
+ integrity sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==
+
"@babel/plugin-proposal-async-generator-functions@^7.2.0":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e"
@@ -370,6 +554,15 @@
"@babel/helper-remap-async-to-generator" "^7.1.0"
"@babel/plugin-syntax-async-generators" "^7.2.0"
+"@babel/plugin-proposal-async-generator-functions@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.0.tgz#83ef2d6044496b4c15d8b4904e2219e6dccc6971"
+ integrity sha512-ot/EZVvf3mXtZq0Pd0+tSOfGWMizqmOohXmNZg6LNFjHOV+wOPv7BvVYh8oPR8LhpIP3ye8nNooKL50YRWxpYA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-remap-async-to-generator" "^7.7.0"
+ "@babel/plugin-syntax-async-generators" "^7.2.0"
+
"@babel/plugin-proposal-class-properties@^7.5.5":
version "7.5.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz#a974cfae1e37c3110e71f3c6a2e48b8e71958cd4"
@@ -395,6 +588,14 @@
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-syntax-dynamic-import" "^7.2.0"
+"@babel/plugin-proposal-dynamic-import@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.0.tgz#dc02a8bad8d653fb59daf085516fa416edd2aa7f"
+ integrity sha512-7poL3Xi+QFPC7sGAzEIbXUyYzGJwbc2+gSD0AkiC5k52kH2cqHdqxm5hNFfLW3cRSTcx9bN0Fl7/6zWcLLnKAQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-syntax-dynamic-import" "^7.2.0"
+
"@babel/plugin-proposal-json-strings@^7.2.0":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317"
@@ -428,6 +629,14 @@
"@babel/helper-regex" "^7.4.4"
regexpu-core "^4.6.0"
+"@babel/plugin-proposal-unicode-property-regex@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.0.tgz#549fe1717a1bd0a2a7e63163841cb37e78179d5d"
+ integrity sha512-mk34H+hp7kRBWJOOAR0ZMGCydgKMD4iN9TpDRp3IIcbunltxEY89XSimc6WbtSLCDrwcdy/EEw7h5CFCzxTchw==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.7.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+
"@babel/plugin-syntax-async-generators@^7.2.0":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f"
@@ -477,6 +686,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
+"@babel/plugin-syntax-top-level-await@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.0.tgz#f5699549f50bbe8d12b1843a4e82f0a37bb65f4d"
+ integrity sha512-hi8FUNiFIY1fnUI2n1ViB1DR0R4QeK4iHcTlW6aJkrPoTdb8Rf1EMQ6GT3f67DDkYyWgew9DFoOZ6gOoEsdzTA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
"@babel/plugin-transform-arrow-functions@^7.2.0":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550"
@@ -493,6 +709,15 @@
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/helper-remap-async-to-generator" "^7.1.0"
+"@babel/plugin-transform-async-to-generator@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.0.tgz#e2b84f11952cf5913fe3438b7d2585042772f492"
+ integrity sha512-vLI2EFLVvRBL3d8roAMqtVY0Bm9C1QzLkdS57hiKrjUBSqsQYrBsMCeOg/0KK7B0eK9V71J5mWcha9yyoI2tZw==
+ dependencies:
+ "@babel/helper-module-imports" "^7.7.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-remap-async-to-generator" "^7.7.0"
+
"@babel/plugin-transform-block-scoped-functions@^7.2.0":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190"
@@ -522,6 +747,20 @@
"@babel/helper-split-export-declaration" "^7.4.4"
globals "^11.1.0"
+"@babel/plugin-transform-classes@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.0.tgz#b411ecc1b8822d24b81e5d184f24149136eddd4a"
+ integrity sha512-/b3cKIZwGeUesZheU9jNYcwrEA7f/Bo4IdPmvp7oHgvks2majB5BoT5byAql44fiNQYOPzhk2w8DbgfuafkMoA==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.7.0"
+ "@babel/helper-define-map" "^7.7.0"
+ "@babel/helper-function-name" "^7.7.0"
+ "@babel/helper-optimise-call-expression" "^7.7.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-replace-supers" "^7.7.0"
+ "@babel/helper-split-export-declaration" "^7.7.0"
+ globals "^11.1.0"
+
"@babel/plugin-transform-computed-properties@^7.2.0":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da"
@@ -545,6 +784,14 @@
"@babel/helper-regex" "^7.4.4"
regexpu-core "^4.6.0"
+"@babel/plugin-transform-dotall-regex@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.0.tgz#c5c9ecacab3a5e0c11db6981610f0c32fd698b3b"
+ integrity sha512-3QQlF7hSBnSuM1hQ0pS3pmAbWLax/uGNCbPBND9y+oJ4Y776jsyujG2k0Sn2Aj2a0QwVOiOFL5QVPA7spjvzSA==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.7.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+
"@babel/plugin-transform-duplicate-keys@^7.5.0":
version "7.5.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853"
@@ -575,6 +822,14 @@
"@babel/helper-function-name" "^7.1.0"
"@babel/helper-plugin-utils" "^7.0.0"
+"@babel/plugin-transform-function-name@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.0.tgz#0fa786f1eef52e3b7d4fc02e54b2129de8a04c2a"
+ integrity sha512-P5HKu0d9+CzZxP5jcrWdpe7ZlFDe24bmqP6a6X8BHEBl/eizAsY8K6LX8LASZL0Jxdjm5eEfzp+FIrxCm/p8bA==
+ dependencies:
+ "@babel/helper-function-name" "^7.7.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+
"@babel/plugin-transform-literals@^7.2.0":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1"
@@ -608,6 +863,16 @@
"@babel/helper-simple-access" "^7.1.0"
babel-plugin-dynamic-import-node "^2.3.0"
+"@babel/plugin-transform-modules-commonjs@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.0.tgz#3e5ffb4fd8c947feede69cbe24c9554ab4113fe3"
+ integrity sha512-KEMyWNNWnjOom8vR/1+d+Ocz/mILZG/eyHHO06OuBQ2aNhxT62fr4y6fGOplRx+CxCSp3IFwesL8WdINfY/3kg==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.7.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-simple-access" "^7.7.0"
+ babel-plugin-dynamic-import-node "^2.3.0"
+
"@babel/plugin-transform-modules-systemjs@^7.5.0":
version "7.5.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz#e75266a13ef94202db2a0620977756f51d52d249"
@@ -617,6 +882,15 @@
"@babel/helper-plugin-utils" "^7.0.0"
babel-plugin-dynamic-import-node "^2.3.0"
+"@babel/plugin-transform-modules-systemjs@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.0.tgz#9baf471213af9761c1617bb12fd278e629041417"
+ integrity sha512-ZAuFgYjJzDNv77AjXRqzQGlQl4HdUM6j296ee4fwKVZfhDR9LAGxfvXjBkb06gNETPnN0sLqRm9Gxg4wZH6dXg==
+ dependencies:
+ "@babel/helper-hoist-variables" "^7.7.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+ babel-plugin-dynamic-import-node "^2.3.0"
+
"@babel/plugin-transform-modules-umd@^7.2.0":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae"
@@ -625,6 +899,14 @@
"@babel/helper-module-transforms" "^7.1.0"
"@babel/helper-plugin-utils" "^7.0.0"
+"@babel/plugin-transform-modules-umd@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.0.tgz#d62c7da16670908e1d8c68ca0b5d4c0097b69966"
+ integrity sha512-u7eBA03zmUswQ9LQ7Qw0/ieC1pcAkbp5OQatbWUzY1PaBccvuJXUkYzoN1g7cqp7dbTu6Dp9bXyalBvD04AANA==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.7.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+
"@babel/plugin-transform-named-capturing-groups-regex@^7.6.3":
version "7.6.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.3.tgz#aaa6e409dd4fb2e50b6e2a91f7e3a3149dbce0cf"
@@ -632,6 +914,13 @@
dependencies:
regexpu-core "^4.6.0"
+"@babel/plugin-transform-named-capturing-groups-regex@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.0.tgz#358e6fd869b9a4d8f5cbc79e4ed4fc340e60dcaf"
+ integrity sha512-+SicSJoKouPctL+j1pqktRVCgy+xAch1hWWTMy13j0IflnyNjaoskj+DwRQFimHbLqO3sq2oN2CXMvXq3Bgapg==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.7.0"
+
"@babel/plugin-transform-new-target@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5"
@@ -670,6 +959,13 @@
dependencies:
regenerator-transform "^0.14.0"
+"@babel/plugin-transform-regenerator@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.0.tgz#f1b20b535e7716b622c99e989259d7dd942dd9cc"
+ integrity sha512-AXmvnC+0wuj/cFkkS/HFHIojxH3ffSXE+ttulrqWjZZRaUOonfJc60e1wSNT4rV8tIunvu/R3wCp71/tLAa9xg==
+ dependencies:
+ regenerator-transform "^0.14.0"
+
"@babel/plugin-transform-reserved-words@^7.2.0":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634"
@@ -733,6 +1029,14 @@
"@babel/helper-regex" "^7.4.4"
regexpu-core "^4.6.0"
+"@babel/plugin-transform-unicode-regex@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.0.tgz#743d9bcc44080e3cc7d49259a066efa30f9187a3"
+ integrity sha512-RrThb0gdrNwFAqEAAx9OWgtx6ICK69x7i9tCnMdVrxQwSDp/Abu9DXFU5Hh16VP33Rmxh04+NGW28NsIkFvFKA==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.7.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+
"@babel/preset-env@^7.6.3":
version "7.6.3"
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.6.3.tgz#9e1bf05a2e2d687036d24c40e4639dc46cef2271"
@@ -789,6 +1093,63 @@
js-levenshtein "^1.1.3"
semver "^5.5.0"
+"@babel/preset-env@^7.7.1":
+ version "7.7.1"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.1.tgz#04a2ff53552c5885cf1083e291c8dd5490f744bb"
+ integrity sha512-/93SWhi3PxcVTDpSqC+Dp4YxUu3qZ4m7I76k0w73wYfn7bGVuRIO4QUz95aJksbS+AD1/mT1Ie7rbkT0wSplaA==
+ dependencies:
+ "@babel/helper-module-imports" "^7.7.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-proposal-async-generator-functions" "^7.7.0"
+ "@babel/plugin-proposal-dynamic-import" "^7.7.0"
+ "@babel/plugin-proposal-json-strings" "^7.2.0"
+ "@babel/plugin-proposal-object-rest-spread" "^7.6.2"
+ "@babel/plugin-proposal-optional-catch-binding" "^7.2.0"
+ "@babel/plugin-proposal-unicode-property-regex" "^7.7.0"
+ "@babel/plugin-syntax-async-generators" "^7.2.0"
+ "@babel/plugin-syntax-dynamic-import" "^7.2.0"
+ "@babel/plugin-syntax-json-strings" "^7.2.0"
+ "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.2.0"
+ "@babel/plugin-syntax-top-level-await" "^7.7.0"
+ "@babel/plugin-transform-arrow-functions" "^7.2.0"
+ "@babel/plugin-transform-async-to-generator" "^7.7.0"
+ "@babel/plugin-transform-block-scoped-functions" "^7.2.0"
+ "@babel/plugin-transform-block-scoping" "^7.6.3"
+ "@babel/plugin-transform-classes" "^7.7.0"
+ "@babel/plugin-transform-computed-properties" "^7.2.0"
+ "@babel/plugin-transform-destructuring" "^7.6.0"
+ "@babel/plugin-transform-dotall-regex" "^7.7.0"
+ "@babel/plugin-transform-duplicate-keys" "^7.5.0"
+ "@babel/plugin-transform-exponentiation-operator" "^7.2.0"
+ "@babel/plugin-transform-for-of" "^7.4.4"
+ "@babel/plugin-transform-function-name" "^7.7.0"
+ "@babel/plugin-transform-literals" "^7.2.0"
+ "@babel/plugin-transform-member-expression-literals" "^7.2.0"
+ "@babel/plugin-transform-modules-amd" "^7.5.0"
+ "@babel/plugin-transform-modules-commonjs" "^7.7.0"
+ "@babel/plugin-transform-modules-systemjs" "^7.7.0"
+ "@babel/plugin-transform-modules-umd" "^7.7.0"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.7.0"
+ "@babel/plugin-transform-new-target" "^7.4.4"
+ "@babel/plugin-transform-object-super" "^7.5.5"
+ "@babel/plugin-transform-parameters" "^7.4.4"
+ "@babel/plugin-transform-property-literals" "^7.2.0"
+ "@babel/plugin-transform-regenerator" "^7.7.0"
+ "@babel/plugin-transform-reserved-words" "^7.2.0"
+ "@babel/plugin-transform-shorthand-properties" "^7.2.0"
+ "@babel/plugin-transform-spread" "^7.6.2"
+ "@babel/plugin-transform-sticky-regex" "^7.2.0"
+ "@babel/plugin-transform-template-literals" "^7.4.4"
+ "@babel/plugin-transform-typeof-symbol" "^7.2.0"
+ "@babel/plugin-transform-unicode-regex" "^7.7.0"
+ "@babel/types" "^7.7.1"
+ browserslist "^4.6.0"
+ core-js-compat "^3.1.1"
+ invariant "^2.2.2"
+ js-levenshtein "^1.1.3"
+ semver "^5.5.0"
+
"@babel/runtime@^7.6.3":
version "7.6.3"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.3.tgz#935122c74c73d2240cafd32ddb5fc2a6cd35cf1f"
@@ -796,10 +1157,10 @@
dependencies:
regenerator-runtime "^0.13.2"
-"@babel/standalone@^7.6.4":
- version "7.6.4"
- resolved "https://registry.yarnpkg.com/@babel/standalone/-/standalone-7.6.4.tgz#10686768f27aa4ce4b5927b9791776738f6cb0e1"
- integrity sha512-ikqLCCQ3iSaRhkE1xgVc6+f49s+ZbMu8gvaW1VNJdKE+pQMAp+2CALy4rRKopaLfYWULvtfeKrs4suICO64/dg==
+"@babel/standalone@^7.7.3":
+ version "7.7.3"
+ resolved "https://registry.yarnpkg.com/@babel/standalone/-/standalone-7.7.3.tgz#9a4f7fc64876b11398e7371665969ccfdb0c9806"
+ integrity sha512-tVwxALbq7HGudHD0oZ6SQPkWM2L/Snw1vcbrtirDTqZsgswZ9xyuOOsSplqGtyazCCt9fidbymM47ZfYjASscg==
"@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4":
version "7.4.4"
@@ -819,6 +1180,15 @@
"@babel/parser" "^7.6.0"
"@babel/types" "^7.6.0"
+"@babel/template@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.0.tgz#4fadc1b8e734d97f56de39c77de76f2562e597d0"
+ integrity sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ "@babel/parser" "^7.7.0"
+ "@babel/types" "^7.7.0"
+
"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.0":
version "7.5.0"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.0.tgz#4216d6586854ef5c3c4592dab56ec7eb78485485"
@@ -879,6 +1249,36 @@
globals "^11.1.0"
lodash "^4.17.13"
+"@babel/traverse@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.0.tgz#9f5744346b8d10097fd2ec2eeffcaf19813cbfaf"
+ integrity sha512-ea/3wRZc//e/uwCpuBX2itrhI0U9l7+FsrKWyKGNyvWbuMcCG7ATKY2VI4wlg2b2TA39HHwIxnvmXvtiKsyn7w==
+ dependencies:
+ "@babel/code-frame" "^7.5.5"
+ "@babel/generator" "^7.7.0"
+ "@babel/helper-function-name" "^7.7.0"
+ "@babel/helper-split-export-declaration" "^7.7.0"
+ "@babel/parser" "^7.7.0"
+ "@babel/types" "^7.7.0"
+ debug "^4.1.0"
+ globals "^11.1.0"
+ lodash "^4.17.13"
+
+"@babel/traverse@^7.7.2":
+ version "7.7.2"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.2.tgz#ef0a65e07a2f3c550967366b3d9b62a2dcbeae09"
+ integrity sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==
+ dependencies:
+ "@babel/code-frame" "^7.5.5"
+ "@babel/generator" "^7.7.2"
+ "@babel/helper-function-name" "^7.7.0"
+ "@babel/helper-split-export-declaration" "^7.7.0"
+ "@babel/parser" "^7.7.2"
+ "@babel/types" "^7.7.2"
+ debug "^4.1.0"
+ globals "^11.1.0"
+ lodash "^4.17.13"
+
"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.0":
version "7.5.0"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.0.tgz#e47d43840c2e7f9105bc4d3a2c371b4d0c7832ab"
@@ -915,6 +1315,24 @@
lodash "^4.17.13"
to-fast-properties "^2.0.0"
+"@babel/types@^7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.0.tgz#bdf5967277ced7590da452c31d60853d0beb5d4f"
+ integrity sha512-ptM1jeXPYi3BfRBelzbTgL/7aP99oYJCbLtGha8phqRY3EeXch+i6LuxRcNQAIgL++yyNPR/rO6cGLDc0cvUMQ==
+ dependencies:
+ esutils "^2.0.2"
+ lodash "^4.17.13"
+ to-fast-properties "^2.0.0"
+
+"@babel/types@^7.7.1", "@babel/types@^7.7.2":
+ version "7.7.2"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.2.tgz#550b82e5571dcd174af576e23f0adba7ffc683f7"
+ integrity sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==
+ dependencies:
+ esutils "^2.0.2"
+ lodash "^4.17.13"
+ to-fast-properties "^2.0.0"
+
"@cnakazawa/watch@^1.0.3":
version "1.0.3"
resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef"
@@ -1134,10 +1552,10 @@
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
-"@nuxt/babel-preset-app@2.10.1":
- version "2.10.1"
- resolved "https://registry.yarnpkg.com/@nuxt/babel-preset-app/-/babel-preset-app-2.10.1.tgz#9669ff09d652011fefeb55cdc1684cd21f49b34a"
- integrity sha512-kTJ1+kperaoPdkIE1Do6x+/2cMEk0zMKiLCc6a4vUvnhkfPLc5m5/ylwx2kke42xXqTGHNX84BSaJ891AxDJgQ==
+"@nuxt/babel-preset-app@2.10.2":
+ version "2.10.2"
+ resolved "https://registry.yarnpkg.com/@nuxt/babel-preset-app/-/babel-preset-app-2.10.2.tgz#2af6334a6bd0c4cc5abf9661bcddbe1cbc4af051"
+ integrity sha512-620Ho7tp0054PL+1fu4aJAaKs/VbpkS9KsuUMPNmmxPPt+UfVtEIesds5OIatT4tgO/SPQXfwPC4chA5u1duBQ==
dependencies:
"@babel/core" "^7.6.4"
"@babel/plugin-proposal-class-properties" "^7.5.5"
@@ -1148,18 +1566,18 @@
"@vue/babel-preset-jsx" "^1.1.1"
core-js "^2.6.5"
-"@nuxt/builder@2.10.1":
- version "2.10.1"
- resolved "https://registry.yarnpkg.com/@nuxt/builder/-/builder-2.10.1.tgz#06df592cb0e3b76a82505dbf34030834650264b2"
- integrity sha512-LyKVoR7f8CKkeIk1EYvpXaMxO6ShASH3iA/5ck0PDm0qcl6iyn4bTwvF55cwkbPP+hStEjqpkhTccNxDTWCgQQ==
+"@nuxt/builder@2.10.2":
+ version "2.10.2"
+ resolved "https://registry.yarnpkg.com/@nuxt/builder/-/builder-2.10.2.tgz#4b718e675c2e2206648fc233d73d438c21908b34"
+ integrity sha512-Apk46yuCbcSCrBN2dh1idIESjkxciW8pyAcGBfNW17IzEA55/XmkjQWTEMlI7fkHDUFQ4YXOcM+gYqP/cx72ew==
dependencies:
"@nuxt/devalue" "^1.2.4"
- "@nuxt/utils" "2.10.1"
- "@nuxt/vue-app" "2.10.1"
- chokidar "^3.2.1"
+ "@nuxt/utils" "2.10.2"
+ "@nuxt/vue-app" "2.10.2"
+ chokidar "^3.2.2"
consola "^2.10.1"
fs-extra "^8.1.0"
- glob "^7.1.4"
+ glob "^7.1.5"
hash-sum "^2.0.0"
ignore "^5.1.4"
lodash "^4.17.15"
@@ -1168,18 +1586,18 @@
serialize-javascript "^2.1.0"
upath "^1.2.0"
-"@nuxt/cli@2.10.1":
- version "2.10.1"
- resolved "https://registry.yarnpkg.com/@nuxt/cli/-/cli-2.10.1.tgz#92b43e2d7ea39703b63da0514228f353f2284061"
- integrity sha512-byXTGebvtQfzd7yBSVeHD7IZqB+Qeh9shCO8Cn6j803fHJA7s+XwzhZq3lOqOvHBO4rQ3LTkjKnsBaYtGGtVuw==
+"@nuxt/cli@2.10.2":
+ version "2.10.2"
+ resolved "https://registry.yarnpkg.com/@nuxt/cli/-/cli-2.10.2.tgz#62e376857e251492206c7efb0e1d143c7b3797c3"
+ integrity sha512-EYLb5zYggTkdxO9Og9Vn+5/LDcQioL1zijIr5V2gi690v3Zim2rSifdgxuUDOlUPzoy+3kiOFqdtzOJ81ES+bA==
dependencies:
- "@nuxt/config" "2.10.1"
- "@nuxt/utils" "2.10.1"
+ "@nuxt/config" "2.10.2"
+ "@nuxt/utils" "2.10.2"
boxen "^4.1.0"
chalk "^2.4.2"
consola "^2.10.1"
esm "^3.2.25"
- execa "^2.1.0"
+ execa "^3.2.0"
exit "^0.1.2"
fs-extra "^8.1.0"
hable "^2.3.2"
@@ -1189,25 +1607,25 @@
std-env "^2.2.1"
wrap-ansi "^6.0.0"
-"@nuxt/config@2.10.1":
- version "2.10.1"
- resolved "https://registry.yarnpkg.com/@nuxt/config/-/config-2.10.1.tgz#3a2fc555bcdecdedc366a8e5fac94f3553e86603"
- integrity sha512-ydxDU1U4bEwLixn8wqYy8Y+4nVOtMaSodW0a4Kuyx9Z/3qnQbI0yvdO58I6CIw+6njAmATsAqaApIcX9bJQOeQ==
+"@nuxt/config@2.10.2":
+ version "2.10.2"
+ resolved "https://registry.yarnpkg.com/@nuxt/config/-/config-2.10.2.tgz#76555cafa69638d4a9f9b72faaa9a0c5ca3ff8fc"
+ integrity sha512-A4Tvm85PyeBAKwTlqQkFiuatmXr2Ro/oLelvi9wnrF/jSmgzU9NwcIZIQBND0/XpK1BL49ze5al5+SELOoGUpg==
dependencies:
- "@nuxt/utils" "2.10.1"
+ "@nuxt/utils" "2.10.2"
consola "^2.10.1"
std-env "^2.2.1"
-"@nuxt/core@2.10.1":
- version "2.10.1"
- resolved "https://registry.yarnpkg.com/@nuxt/core/-/core-2.10.1.tgz#fc934d70e9112fdc5fe7b459977d7f82b783c1d8"
- integrity sha512-6GLUNo7wILEEeEzxcTLVc3N5ao+A7z36iW5RUK1PibT2CERwlJbyoQILMioxXwTldPTA4tPAm7xmOgb4CC66Yw==
+"@nuxt/core@2.10.2":
+ version "2.10.2"
+ resolved "https://registry.yarnpkg.com/@nuxt/core/-/core-2.10.2.tgz#3fc0ef2afce3689a2a9d70d568bb64c046005932"
+ integrity sha512-PCA9J41kv7SA3rZbhuLwwzPMJr7NtDVofTzAMJ+NOpIuGiQ7rHTtwgprEXs9j08A5hyk5zfmgypjyZKxxmOFjA==
dependencies:
- "@nuxt/config" "2.10.1"
+ "@nuxt/config" "2.10.2"
"@nuxt/devalue" "^1.2.4"
- "@nuxt/server" "2.10.1"
- "@nuxt/utils" "2.10.1"
- "@nuxt/vue-renderer" "2.10.1"
+ "@nuxt/server" "2.10.2"
+ "@nuxt/utils" "2.10.2"
+ "@nuxt/vue-renderer" "2.10.2"
consola "^2.10.1"
debug "^4.1.1"
esm "^3.2.25"
@@ -1233,12 +1651,12 @@
error-stack-parser "^2.0.0"
string-width "^2.0.0"
-"@nuxt/generator@2.10.1":
- version "2.10.1"
- resolved "https://registry.yarnpkg.com/@nuxt/generator/-/generator-2.10.1.tgz#5430cd908f25f095af3a07df8fe6febff871a0a0"
- integrity sha512-tjd1cf1fX3eGpdIeacgkdWloOIin3XQBFzJoquNbz4noqwWuhjyN6Noi+9FaDrFpMu6qZE5rvX1Zf0/6kP1SJg==
+"@nuxt/generator@2.10.2":
+ version "2.10.2"
+ resolved "https://registry.yarnpkg.com/@nuxt/generator/-/generator-2.10.2.tgz#7b7aa2ba4e7a3c7fcf7b4c12a8e44d2c7f8410b6"
+ integrity sha512-0d8oENAxSnv5s2FtqtyDZ2S9lLVge9M1gKmw5BFaRJRyvfT0Bq9hG+tU9lnHslYkScEToomFUcV5Wt1E22fuvQ==
dependencies:
- "@nuxt/utils" "2.10.1"
+ "@nuxt/utils" "2.10.2"
chalk "^2.4.2"
consola "^2.10.1"
fs-extra "^8.1.0"
@@ -1263,13 +1681,13 @@
consola "^2.10.1"
node-fetch "^2.6.0"
-"@nuxt/server@2.10.1":
- version "2.10.1"
- resolved "https://registry.yarnpkg.com/@nuxt/server/-/server-2.10.1.tgz#6f2a19ccde971df365f6a847c9a33181e81e2142"
- integrity sha512-+1PMy8VknZWKj/uxKxwllTXuU+mgGOq17YSWfhKUAidlAb1YpdndlVOuWZgfdEsoQjJYq1vmIHMg8389chy7+g==
+"@nuxt/server@2.10.2":
+ version "2.10.2"
+ resolved "https://registry.yarnpkg.com/@nuxt/server/-/server-2.10.2.tgz#6f9b5c19e8e6bb3dd3d063388045206f3b6f8d70"
+ integrity sha512-kWUmBq9/4ftXJXcSfNphMwweEfd8lBD7XCrFR/tK3FciIO/MuWlAtReNP8fC+KTC00RXks2fiR1xFpGEsIHUaA==
dependencies:
- "@nuxt/config" "2.10.1"
- "@nuxt/utils" "2.10.1"
+ "@nuxt/config" "2.10.2"
+ "@nuxt/utils" "2.10.2"
"@nuxtjs/youch" "^4.2.3"
chalk "^2.4.2"
compression "^1.7.4"
@@ -1286,10 +1704,10 @@
serve-static "^1.14.1"
server-destroy "^1.0.1"
-"@nuxt/utils@2.10.1":
- version "2.10.1"
- resolved "https://registry.yarnpkg.com/@nuxt/utils/-/utils-2.10.1.tgz#273f14519354b7676aa8640456716967c0b56857"
- integrity sha512-SXTm0vSh3H6Izpib/p0IepopmKaJz4JUtSuHVoauCv+CQMj09GRUeKwZ8SbXjBNQmGI+tdKedVlUUKKYY8R4LQ==
+"@nuxt/utils@2.10.2":
+ version "2.10.2"
+ resolved "https://registry.yarnpkg.com/@nuxt/utils/-/utils-2.10.2.tgz#01df9e0e8e8b264b100f7247e869076a0dc64419"
+ integrity sha512-GBtQlGovu7inXwaKBsD+ayt//4yZAJAazlHibMoRJxK/O8gfhuGf/hINxB98ZpjhjttCuJ6nABUN90+e06ARtg==
dependencies:
consola "^2.10.1"
fs-extra "^8.1.0"
@@ -1300,10 +1718,10 @@
signal-exit "^3.0.2"
ua-parser-js "^0.7.20"
-"@nuxt/vue-app@2.10.1":
- version "2.10.1"
- resolved "https://registry.yarnpkg.com/@nuxt/vue-app/-/vue-app-2.10.1.tgz#76fc682d45faddf953044806a7c9f4ed0c6e6945"
- integrity sha512-GyjBOwyngKrb4NeSRP5s8tr4ccu05FhwuaN+TIlXsRSaPYaGz7LnLsxp5UgHrgMJH8TqIB6k4b9syejR7FT8Jg==
+"@nuxt/vue-app@2.10.2":
+ version "2.10.2"
+ resolved "https://registry.yarnpkg.com/@nuxt/vue-app/-/vue-app-2.10.2.tgz#eb92ce5e8d7f5cc511626366d3a0fe080d2f9354"
+ integrity sha512-aP5JWQaaimo/zMyoZg7aUqS6wYZq9jtDt/woKWOeuJJvnKE+youitazXbuVf+1l4c771b4AZMEuDW1duOfjDRA==
dependencies:
node-fetch "^2.6.0"
unfetch "^4.1.0"
@@ -1315,13 +1733,13 @@
vue-template-compiler "^2.6.10"
vuex "^3.1.1"
-"@nuxt/vue-renderer@2.10.1":
- version "2.10.1"
- resolved "https://registry.yarnpkg.com/@nuxt/vue-renderer/-/vue-renderer-2.10.1.tgz#80219f78cda19fd0e665ed05eccdfcf23e3ee956"
- integrity sha512-gjI8/0U5Qe5ieaRW9Y7/a+QOePABgvp4zkUZCUdQKtjniJ3AMKpvppSORKIH0YJl1Uv+X/BY84MfjEnLYdB0AQ==
+"@nuxt/vue-renderer@2.10.2":
+ version "2.10.2"
+ resolved "https://registry.yarnpkg.com/@nuxt/vue-renderer/-/vue-renderer-2.10.2.tgz#6d5bb0e2fba28688065c5b3fc2d1337138947c25"
+ integrity sha512-nvgTlAPQ0gWAF8lXMGqjkbl54xunVX+v4he8CGqE+6S2ipdLxahmpbtxMRlJeAaGzOdv+rB6tF33O2PF9cL84w==
dependencies:
"@nuxt/devalue" "^1.2.4"
- "@nuxt/utils" "2.10.1"
+ "@nuxt/utils" "2.10.2"
consola "^2.10.1"
fs-extra "^8.1.0"
lru-cache "^5.1.1"
@@ -1329,18 +1747,18 @@
vue-meta "^2.3.1"
vue-server-renderer "^2.6.10"
-"@nuxt/webpack@2.10.1":
- version "2.10.1"
- resolved "https://registry.yarnpkg.com/@nuxt/webpack/-/webpack-2.10.1.tgz#515db338b5df1abc1fef1b196d21679ecc45b92e"
- integrity sha512-AH88HI8mJPj6EcMztgsVbfEwcUT46kcAkgFpYbVeMmucf7IxChyS+uf1ev9q4+wWvw1B8Hp9enAIZXBfEIjYTg==
+"@nuxt/webpack@2.10.2":
+ version "2.10.2"
+ resolved "https://registry.yarnpkg.com/@nuxt/webpack/-/webpack-2.10.2.tgz#8006c6a2240d026d6eb4b3d356f7af3871cef851"
+ integrity sha512-Hb/9VDORABVk4AFrMLWwoEk4UV4XL8W6Yp9PvuGZ0t4a82243gWEZ39veawQmRHRsO96fBJrzs4dzwKVnkLosg==
dependencies:
"@babel/core" "^7.6.4"
- "@nuxt/babel-preset-app" "2.10.1"
+ "@nuxt/babel-preset-app" "2.10.2"
"@nuxt/friendly-errors-webpack-plugin" "^2.5.0"
- "@nuxt/utils" "2.10.1"
+ "@nuxt/utils" "2.10.2"
babel-loader "^8.0.6"
cache-loader "^4.1.0"
- caniuse-lite "^1.0.30000999"
+ caniuse-lite "^1.0.30001002"
chalk "^2.4.2"
consola "^2.10.1"
css-loader "^3.2.0"
@@ -1348,7 +1766,7 @@
eventsource-polyfill "^0.9.6"
extract-css-chunks-webpack-plugin "^4.6.0"
file-loader "^4.2.0"
- glob "^7.1.4"
+ glob "^7.1.5"
hard-source-webpack-plugin "^0.13.1"
hash-sum "^2.0.0"
html-webpack-plugin "^3.2.0"
@@ -1357,7 +1775,7 @@
pify "^4.0.1"
postcss "^7.0.18"
postcss-import "^12.0.1"
- postcss-import-resolver "^1.2.3"
+ postcss-import-resolver "^2.0.0"
postcss-loader "^3.0.0"
postcss-preset-env "^6.7.0"
postcss-url "^8.0.0"
@@ -1369,19 +1787,19 @@
time-fix-plugin "^2.0.6"
url-loader "^2.2.0"
vue-loader "^15.7.1"
- webpack "^4.41.0"
- webpack-bundle-analyzer "^3.5.2"
+ webpack "^4.41.2"
+ webpack-bundle-analyzer "^3.6.0"
webpack-dev-middleware "^3.7.2"
webpack-hot-middleware "^2.25.0"
webpack-node-externals "^1.7.2"
webpackbar "^4.0.0"
-"@nuxtjs/google-analytics@^2.2.0":
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/@nuxtjs/google-analytics/-/google-analytics-2.2.0.tgz#4b2072824961974109eb0bff6a95591fea92c6d9"
- integrity sha512-Ds166zi7KAwc23gHOkKHovSdMEDJS55UJGkowT4IfVAOCE00l65J3fKI9t2P9+O5cdokXTadNiMLGZV5QM731Q==
+"@nuxtjs/google-analytics@^2.2.1":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/@nuxtjs/google-analytics/-/google-analytics-2.2.1.tgz#c5bcf486fe04168d4bb044e6f3fe317d7a3a8d50"
+ integrity sha512-li2Xd9G1v6+wdAiAM+G7USTrQ+/ND/fmf02cKs5IRLbKxba+RHDePKu4s5kvWyrgeczgZRaL+Tm4s24mGDYS6g==
dependencies:
- vue-analytics "^5.16.2"
+ vue-analytics "^5.17.2"
"@nuxtjs/pwa@^3.0.0-beta.19":
version "3.0.0-beta.19"
@@ -1535,22 +1953,25 @@
dependencies:
"@types/yargs-parser" "*"
-"@typescript-eslint/experimental-utils@^1.13.0":
- version "1.13.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz#b08c60d780c0067de2fb44b04b432f540138301e"
- integrity sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==
+"@typescript-eslint/experimental-utils@^2.5.0":
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.5.0.tgz#383a97ded9a7940e5053449f6d73995e782b8fb1"
+ integrity sha512-UgcQGE0GKJVChyRuN1CWqDW8Pnu7+mVst0aWrhiyuUD1J9c+h8woBdT4XddCvhcXDodTDVIfE3DzGHVjp7tUeQ==
dependencies:
"@types/json-schema" "^7.0.3"
- "@typescript-eslint/typescript-estree" "1.13.0"
- eslint-scope "^4.0.0"
+ "@typescript-eslint/typescript-estree" "2.5.0"
+ eslint-scope "^5.0.0"
-"@typescript-eslint/typescript-estree@1.13.0":
- version "1.13.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz#8140f17d0f60c03619798f1d628b8434913dc32e"
- integrity sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==
+"@typescript-eslint/typescript-estree@2.5.0":
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.5.0.tgz#40ada624d6217ef092a3a79ed30d947ad4f212ce"
+ integrity sha512-AXURyF8NcA3IsnbjNX1v9qbwa0dDoY9YPcKYR2utvMHoUcu3636zrz0gRWtVAyxbPCkhyKuGg6WZIyi2Fc79CA==
dependencies:
+ debug "^4.1.1"
+ glob "^7.1.4"
+ is-glob "^4.0.1"
lodash.unescape "4.0.1"
- semver "5.5.0"
+ semver "^6.3.0"
"@vue/babel-helper-vue-jsx-merge-props@^1.0.0":
version "1.0.0"
@@ -1834,10 +2255,10 @@ acorn-jsx@^5.0.0:
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e"
integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==
-acorn-jsx@^5.0.2:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.2.tgz#84b68ea44b373c4f8686023a551f61a21b7c4a4f"
- integrity sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==
+acorn-jsx@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384"
+ integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==
acorn-walk@^6.0.1, acorn-walk@^6.1.1:
version "6.2.0"
@@ -1849,7 +2270,7 @@ acorn@^5.5.3:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
-acorn@^6.0.1, acorn@^6.0.2, acorn@^6.0.4, acorn@^6.0.7:
+acorn@^6.0.1, acorn@^6.0.4, acorn@^6.0.7:
version "6.2.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.2.0.tgz#67f0da2fc339d6cfb5d6fb244fd449f33cd8bbe3"
integrity sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw==
@@ -1859,11 +2280,6 @@ acorn@^6.2.1:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.2.1.tgz#3ed8422d6dec09e6121cc7a843ca86a330a86b51"
integrity sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q==
-acorn@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.0.0.tgz#26b8d1cd9a9b700350b71c0905546f64d1284e7a"
- integrity sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==
-
acorn@^7.1.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c"
@@ -2211,17 +2627,17 @@ autoprefixer@^9.6.1:
postcss "^7.0.17"
postcss-value-parser "^4.0.0"
-autoprefixer@^9.6.4:
- version "9.6.4"
- resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.6.4.tgz#e6453be47af316b2923eaeaed87860f52ad4b7eb"
- integrity sha512-Koz2cJU9dKOxG8P1f8uVaBntOv9lP4yz9ffWvWaicv9gHBPhpQB22nGijwd8gqW9CNT+UdkbQOQNLVI8jN1ZfQ==
+autoprefixer@^9.7.1:
+ version "9.7.1"
+ resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.1.tgz#9ffc44c55f5ca89253d9bb7186cefb01ef57747f"
+ integrity sha512-w3b5y1PXWlhYulevrTJ0lizkQ5CyqfeU6BIRDbuhsMupstHQOeb1Ur80tcB1zxSu7AwyY/qCQ7Vvqklh31ZBFw==
dependencies:
- browserslist "^4.7.0"
- caniuse-lite "^1.0.30000998"
+ browserslist "^4.7.2"
+ caniuse-lite "^1.0.30001006"
chalk "^2.4.2"
normalize-range "^0.1.2"
num2fraction "^1.2.2"
- postcss "^7.0.18"
+ postcss "^7.0.21"
postcss-value-parser "^4.0.2"
aws-sign2@~0.7.0:
@@ -2679,14 +3095,14 @@ browserslist@^4.6.4:
electron-to-chromium "^1.3.191"
node-releases "^1.1.25"
-browserslist@^4.7.0:
- version "4.7.0"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.0.tgz#9ee89225ffc07db03409f2fee524dc8227458a17"
- integrity sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==
+browserslist@^4.7.2:
+ version "4.7.2"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.2.tgz#1bb984531a476b5d389cedecb195b2cd69fb1348"
+ integrity sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==
dependencies:
- caniuse-lite "^1.0.30000989"
- electron-to-chromium "^1.3.247"
- node-releases "^1.1.29"
+ caniuse-lite "^1.0.30001004"
+ electron-to-chromium "^1.3.295"
+ node-releases "^1.1.38"
bser@^2.0.0:
version "2.1.0"
@@ -2966,15 +3382,20 @@ caniuse-lite@^1.0.30000984:
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz#b9193e293ccf7e4426c5245134b8f2a56c0ac4b9"
integrity sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==
-caniuse-lite@^1.0.30000989, caniuse-lite@^1.0.30000998:
- version "1.0.30000998"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000998.tgz#7227a8046841e7d01e156ae7227a504d065f6744"
- integrity sha512-8Tj5sPZR9kMHeDD9SZXIVr5m9ofufLLCG2Y4QwQrH18GIwG+kCc+zYdlR036ZRkuKjVVetyxeAgGA1xF7XdmzQ==
+caniuse-lite@^1.0.30001002:
+ version "1.0.30001002"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001002.tgz#ba999a737b1abd5bf0fd47efe43a09b9cadbe9b0"
+ integrity sha512-pRuxPE8wdrWmVPKcDmJJiGBxr6lFJq4ivdSeo9FTmGj5Rb8NX3Mby2pARG57MXF15hYAhZ0nHV5XxT2ig4bz3g==
+
+caniuse-lite@^1.0.30001004:
+ version "1.0.30001004"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001004.tgz#d879b73981b255488316da946c39327d8c00a586"
+ integrity sha512-3nfOR4O8Wa2RWoYfJkMtwRVOsK96TQ+eq57wd0iKaEWl8dwG4hKZ/g0MVBfCvysFvMLi9fQGR/DvozMdkEPl3g==
-caniuse-lite@^1.0.30000999:
- version "1.0.30000999"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000999.tgz#427253a69ad7bea4aa8d8345687b8eec51ca0e43"
- integrity sha512-1CUyKyecPeksKwXZvYw0tEoaMCo/RwBlXmEtN5vVnabvO0KPd9RQLcaAuR9/1F+KDMv6esmOFWlsXuzDk+8rxg==
+caniuse-lite@^1.0.30001006:
+ version "1.0.30001006"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001006.tgz#5b6e8288792cfa275f007b2819a00ccad7112655"
+ integrity sha512-MXnUVX27aGs/QINz+QG1sWSLDr3P1A3Hq5EUWoIt0T7K24DuvMxZEnh3Y5aHlJW6Bz2aApJdSewdYLd8zQnUuw==
capture-exit@^2.0.0:
version "2.0.0"
@@ -3076,10 +3497,10 @@ chokidar@^2.1.8:
optionalDependencies:
fsevents "^1.2.7"
-chokidar@^3.2.1:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.2.1.tgz#4634772a1924512d990d4505957bf3a510611387"
- integrity sha512-/j5PPkb5Feyps9e+jo07jUZGvkB5Aj953NrI4s8xSVScrAo/RHeILrtdb4uzR7N6aaFFxxJ+gt8mA8HfNpw76w==
+chokidar@^3.2.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.2.2.tgz#a433973350021e09f2b853a2287781022c0dc935"
+ integrity sha512-bw3pm7kZ2Wa6+jQWYP/c7bAZy3i4GwiIiMO2EeRjrE48l8vBqC/WvFhSF0xyM8fQiPEGvwMY/5bqDG7sSEOuhg==
dependencies:
anymatch "~3.1.1"
braces "~3.0.2"
@@ -3087,9 +3508,9 @@ chokidar@^3.2.1:
is-binary-path "~2.1.0"
is-glob "~4.0.1"
normalize-path "~3.0.0"
- readdirp "~3.1.3"
+ readdirp "~3.2.0"
optionalDependencies:
- fsevents "~2.1.0"
+ fsevents "~2.1.1"
chownr@^1.0.1, chownr@^1.1.1:
version "1.1.2"
@@ -3174,6 +3595,13 @@ cli-cursor@^2.1.0:
dependencies:
restore-cursor "^2.0.0"
+cli-cursor@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
+ integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
+ dependencies:
+ restore-cursor "^3.1.0"
+
cli-spinners@^1.0.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a"
@@ -3255,10 +3683,10 @@ codecov@^3.6.1:
teeny-request "^3.11.3"
urlgrey "^0.4.4"
-codemirror@^5.49.0:
- version "5.49.0"
- resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.49.0.tgz#adedbffcc81091e4a0334bcb96b1ae3b7ada5e3f"
- integrity sha512-Hyzr0HToBdZpLBN9dYFO/KlJAsKH37/cXVHPAqa+imml0R92tb9AkmsvjnXL+SluEvjjdfkDgRjc65NG5jnMYA==
+codemirror@^5.49.2:
+ version "5.49.2"
+ resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.49.2.tgz#c84fdaf11b19803f828b0c67060c7bc6d154ccad"
+ integrity sha512-dwJ2HRPHm8w51WB5YTF9J7m6Z5dtkqbU9ntMZ1dqXyFB9IpjoUFDj80ahRVEoVanfIp6pfASJbOlbWdEf8FOzQ==
codesandbox-import-util-types@^2.1.9:
version "2.1.9"
@@ -3695,6 +4123,13 @@ convert-source-map@^1.1.0, convert-source-map@^1.4.0:
dependencies:
safe-buffer "~5.1.1"
+convert-source-map@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
+ integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
+ dependencies:
+ safe-buffer "~5.1.1"
+
cookie-signature@1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
@@ -4499,10 +4934,10 @@ electron-to-chromium@^1.3.191:
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.238.tgz#6d6496e393a709b7b186823281d49b1a5d96a6cf"
integrity sha512-k+s6EIiSTgfOm7WiMlGBMMMtBQXSui8OfLN1sXU3RohJOuLGVq0lVm7hXyDIDBcbPM0MeZabAdIPQOSEZT3ZLg==
-electron-to-chromium@^1.3.247:
- version "1.3.274"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.274.tgz#0fb4624c63eeaabe5aa079da5c2a966f5c916de3"
- integrity sha512-9bWkiXxGylowqMXoF1ec7k6akmsL2nOa1kzZ4CKzBuwK9WVz0VauE1w/RVyYraE1LpJM7+8fNCsW9b7ZSoxWIg==
+electron-to-chromium@^1.3.295:
+ version "1.3.295"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.295.tgz#4727eabfa2642f9b21c43ec17d794c004724657b"
+ integrity sha512-KxlGE9GcZTv7xGwYJGMEABHJq2JuTMNF7jD8NwHk6sBY226mW+Dyp9kZmA2Od9tKHMCS7ltPnqFg+zq3jTWN7Q==
elliptic@^6.0.0:
version "6.5.0"
@@ -4556,16 +4991,6 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0:
dependencies:
once "^1.4.0"
-enhanced-resolve@^3.4.1:
- version "3.4.1"
- resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e"
- integrity sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=
- dependencies:
- graceful-fs "^4.1.2"
- memory-fs "^0.4.0"
- object-assign "^4.0.1"
- tapable "^0.2.7"
-
enhanced-resolve@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f"
@@ -4575,6 +5000,15 @@ enhanced-resolve@^4.1.0:
memory-fs "^0.4.0"
tapable "^1.0.0"
+enhanced-resolve@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66"
+ integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==
+ dependencies:
+ graceful-fs "^4.1.2"
+ memory-fs "^0.5.0"
+ tapable "^1.0.0"
+
entities@^1.1.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
@@ -4676,10 +5110,10 @@ escodegen@^1.11.0, escodegen@^1.9.1:
optionalDependencies:
source-map "~0.6.1"
-eslint-config-prettier@^6.4.0:
- version "6.4.0"
- resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.4.0.tgz#0a04f147e31d33c6c161b2dd0971418ac52d0477"
- integrity sha512-YrKucoFdc7SEko5Sxe4r6ixqXPDP1tunGw91POeZTTRKItf/AMFYt/YLEQtZMkR2LVpAVhcAcZgcWpm1oGPW7w==
+eslint-config-prettier@^6.5.0:
+ version "6.5.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.5.0.tgz#aaf9a495e2a816865e541bfdbb73a65cc162b3eb"
+ integrity sha512-cjXp8SbO9VFGW/Z7mbTydqS9to8Z58E5aYhj3e1+Hx7lS9s6gL5ILKNpCqZAFOVYRcSkWPFYljHrEh8QFEK5EQ==
dependencies:
get-stdin "^6.0.0"
@@ -4734,17 +5168,17 @@ eslint-plugin-import@^2.18.2:
read-pkg-up "^2.0.0"
resolve "^1.11.0"
-eslint-plugin-jest@^22.17.0:
- version "22.17.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.17.0.tgz#dc170ec8369cd1bff9c5dd8589344e3f73c88cf6"
- integrity sha512-WT4DP4RoGBhIQjv+5D0FM20fAdAUstfYAf/mkufLNTojsfgzc5/IYW22cIg/Q4QBavAZsROQlqppiWDpFZDS8Q==
+eslint-plugin-jest@^23.0.3:
+ version "23.0.3"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.0.3.tgz#d3f157f7791f97713372c13259ba1dfc436eb4c1"
+ integrity sha512-9cNxr66zeOyz1S9AkQL4/ouilR6QHpYj8vKOQZ60fu9hAt5PJWS4KqWqfr1aqN5NFEZSPjFOla2Azn+KTWiGwg==
dependencies:
- "@typescript-eslint/experimental-utils" "^1.13.0"
+ "@typescript-eslint/experimental-utils" "^2.5.0"
-eslint-plugin-markdown@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-markdown/-/eslint-plugin-markdown-1.0.0.tgz#2d381b44fcf367f1bb53ae166eccf111cd4e1174"
- integrity sha512-YIrClt3yLgyGov+rInjIoC/05zMxb/c6YXQZkyI9UKuBRFLgCrL37cxthj0JYWiTYtiHq0p8O0Nt0/HrvO48iQ==
+eslint-plugin-markdown@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-markdown/-/eslint-plugin-markdown-1.0.1.tgz#9705786310f84dad9cf800bea1eb5c4acafcc13a"
+ integrity sha512-nAUURNHJGPooBMZMP23FmTbh3LTdgoSqeFBv9FA3fYrJ+vDUJxrp6nKiQF4iDNAmnWQnmnrDvV61BmIF4X9QAQ==
dependencies:
object-assign "^4.0.1"
remark-parse "^5.0.0"
@@ -4779,12 +5213,12 @@ eslint-plugin-standard@^4.0.1:
resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz#ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4"
integrity sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==
-eslint-plugin-vue@^5.2.3:
- version "5.2.3"
- resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-5.2.3.tgz#3ee7597d823b5478804b2feba9863b1b74273961"
- integrity sha512-mGwMqbbJf0+VvpGR5Lllq0PMxvTdrZ/ZPjmhkacrCHbubJeJOt+T6E3HUzAifa2Mxi7RSdJfC9HFpOeSYVMMIw==
+eslint-plugin-vue@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-6.0.0.tgz#fc7a4116dff614a27be8639fb47973703dd332fa"
+ integrity sha512-+LxTJCd6nDt+AKQ1X+ySD48xJHft8OkeQmAhiq6UoAMxRFTiEKIDusiGgEUJLwKyiwGUGWbbqEbbWvupH5TSjg==
dependencies:
- vue-eslint-parser "^5.0.0"
+ vue-eslint-parser "^6.0.4"
eslint-scope@^4.0.0, eslint-scope@^4.0.3:
version "4.0.3"
@@ -4809,6 +5243,13 @@ eslint-utils@^1.4.2:
dependencies:
eslint-visitor-keys "^1.0.0"
+eslint-utils@^1.4.3:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f"
+ integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==
+ dependencies:
+ eslint-visitor-keys "^1.1.0"
+
eslint-visitor-keys@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d"
@@ -4819,10 +5260,10 @@ eslint-visitor-keys@^1.1.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
-eslint@^6.5.1:
- version "6.5.1"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.5.1.tgz#828e4c469697d43bb586144be152198b91e96ed6"
- integrity sha512-32h99BoLYStT1iq1v2P9uwpyznQ4M2jRiFB6acitKz52Gqn+vPaMDUTB1bYi1WN4Nquj2w+t+bimYUG83DC55A==
+eslint@^6.6.0:
+ version "6.6.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.6.0.tgz#4a01a2fb48d32aacef5530ee9c5a78f11a8afd04"
+ integrity sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g==
dependencies:
"@babel/code-frame" "^7.0.0"
ajv "^6.10.0"
@@ -4831,9 +5272,9 @@ eslint@^6.5.1:
debug "^4.0.1"
doctrine "^3.0.0"
eslint-scope "^5.0.0"
- eslint-utils "^1.4.2"
+ eslint-utils "^1.4.3"
eslint-visitor-keys "^1.1.0"
- espree "^6.1.1"
+ espree "^6.1.2"
esquery "^1.0.1"
esutils "^2.0.2"
file-entry-cache "^5.0.1"
@@ -4843,7 +5284,7 @@ eslint@^6.5.1:
ignore "^4.0.6"
import-fresh "^3.0.0"
imurmurhash "^0.1.4"
- inquirer "^6.4.1"
+ inquirer "^7.0.0"
is-glob "^4.0.0"
js-yaml "^3.13.1"
json-stable-stringify-without-jsonify "^1.0.1"
@@ -4867,22 +5308,22 @@ esm@^3.2.25:
resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10"
integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==
-espree@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/espree/-/espree-4.1.0.tgz#728d5451e0fd156c04384a7ad89ed51ff54eb25f"
- integrity sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==
+espree@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a"
+ integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==
dependencies:
- acorn "^6.0.2"
+ acorn "^6.0.7"
acorn-jsx "^5.0.0"
eslint-visitor-keys "^1.0.0"
-espree@^6.1.1:
- version "6.1.1"
- resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.1.tgz#7f80e5f7257fc47db450022d723e356daeb1e5de"
- integrity sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ==
+espree@^6.1.2:
+ version "6.1.2"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d"
+ integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==
dependencies:
- acorn "^7.0.0"
- acorn-jsx "^5.0.2"
+ acorn "^7.1.0"
+ acorn-jsx "^5.1.0"
eslint-visitor-keys "^1.1.0"
esprima@^3.1.3, esprima@~3.1.0:
@@ -4978,16 +5419,17 @@ execa@^1.0.0:
signal-exit "^3.0.0"
strip-eof "^1.0.0"
-execa@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/execa/-/execa-2.1.0.tgz#e5d3ecd837d2a60ec50f3da78fd39767747bbe99"
- integrity sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==
+execa@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-3.2.0.tgz#18326b79c7ab7fbd6610fd900c1b9e95fa48f90a"
+ integrity sha512-kJJfVbI/lZE1PZYDI5VPxp8zXPO9rtxOkhpZ0jMKha56AI9y2gGVC6bkukStQf0ka5Rh15BA5m7cCCH4jmHqkw==
dependencies:
cross-spawn "^7.0.0"
get-stream "^5.0.0"
+ human-signals "^1.1.1"
is-stream "^2.0.0"
merge-stream "^2.0.0"
- npm-run-path "^3.0.0"
+ npm-run-path "^4.0.0"
onetime "^5.1.0"
p-finally "^2.0.0"
signal-exit "^3.0.2"
@@ -5512,10 +5954,10 @@ fsevents@^1.2.7:
nan "^2.12.1"
node-pre-gyp "^0.12.0"
-fsevents@~2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.0.tgz#ce1a5f9ac71c6d75278b0c5bd236d7dfece4cbaa"
- integrity sha512-+iXhW3LuDQsno8dOIrCIT/CBjeBWuP7PXe8w9shnj9Lebny/Gx1ZjVBYwexLz36Ri2jKuXMNpV6CYNh8lHHgrQ==
+fsevents@~2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.1.tgz#74c64e21df71721845d0c44fe54b7f56b82995a9"
+ integrity sha512-4FRPXWETxtigtJW/gxzEDsX1LVbPAM93VleB83kZB+ellqbHMkyt2aJfuzNLRvFPnGi6bcE5SvfxgbXPeKteJw==
fstream@^1.0.0, fstream@^1.0.12:
version "1.0.12"
@@ -5751,6 +6193,18 @@ glob@7.x, glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@
once "^1.3.0"
path-is-absolute "^1.0.0"
+glob@^7.1.5:
+ version "7.1.5"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.5.tgz#6714c69bee20f3c3e64c4dd905553e532b40cdc0"
+ integrity sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
global-dirs@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445"
@@ -6012,10 +6466,10 @@ hex-color-regex@^1.1.0:
resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
-highlight.js@^9.15.10:
- version "9.15.10"
- resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.15.10.tgz#7b18ed75c90348c045eef9ed08ca1319a2219ad2"
- integrity sha512-RoV7OkQm0T3os3Dd2VHLNMoaoDVx77Wygln3n9l5YV172XonWG6rgQD3XnF/BuFFZw9A0TJgmMSO8FEWQgvcXw==
+highlight.js@^9.16.2:
+ version "9.16.2"
+ resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.16.2.tgz#68368d039ffe1c6211bcc07e483daf95de3e403e"
+ integrity sha512-feMUrVLZvjy0oC7FVJQcSQRqbBq9kwqnYE4+Kj9ZjbHh3g+BisiPgF49NyQbVLNdrL/qqZr3Ca9yOKwgn2i/tw==
hmac-drbg@^1.0.0:
version "1.0.1"
@@ -6194,6 +6648,11 @@ https-proxy-agent@^2.1.0, https-proxy-agent@^2.2.1:
agent-base "^4.3.0"
debug "^3.1.0"
+human-signals@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
+ integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
+
humanize-ms@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
@@ -6387,22 +6846,22 @@ inquirer@^6.2.2:
strip-ansi "^5.1.0"
through "^2.3.6"
-inquirer@^6.4.1:
- version "6.5.0"
- resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42"
- integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==
+inquirer@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a"
+ integrity sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==
dependencies:
- ansi-escapes "^3.2.0"
+ ansi-escapes "^4.2.1"
chalk "^2.4.2"
- cli-cursor "^2.1.0"
+ cli-cursor "^3.1.0"
cli-width "^2.0.0"
external-editor "^3.0.3"
- figures "^2.0.0"
- lodash "^4.17.12"
- mute-stream "0.0.7"
+ figures "^3.0.0"
+ lodash "^4.17.15"
+ mute-stream "0.0.8"
run-async "^2.2.0"
rxjs "^6.4.0"
- string-width "^2.1.0"
+ string-width "^4.1.0"
strip-ansi "^5.1.0"
through "^2.3.6"
@@ -7722,16 +8181,16 @@ lodash@4.x, lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.3, loda
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
-lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15:
- version "4.17.15"
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
- integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
-
lodash@^4.17.13:
version "4.17.14"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba"
integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==
+lodash@^4.17.14, lodash@^4.17.15:
+ version "4.17.15"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
+ integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
+
log-symbols@^2.1.0, log-symbols@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
@@ -7917,6 +8376,14 @@ memory-fs@^0.4.0, memory-fs@^0.4.1:
errno "^0.1.3"
readable-stream "^2.0.1"
+memory-fs@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c"
+ integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==
+ dependencies:
+ errno "^0.1.3"
+ readable-stream "^2.0.1"
+
meow@^3.3.0, meow@^3.7.0:
version "3.7.0"
resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
@@ -8234,6 +8701,11 @@ mute-stream@0.0.7:
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
+mute-stream@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
+ integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
+
nan@^2.12.1, nan@^2.13.2:
version "2.14.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
@@ -8422,10 +8894,10 @@ node-releases@^1.1.25:
dependencies:
semver "^5.3.0"
-node-releases@^1.1.29:
- version "1.1.34"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.34.tgz#ced4655ee1ba9c3a2c5dcbac385e19434155fd40"
- integrity sha512-fNn12JTEfniTuCqo0r9jXgl44+KxRH/huV7zM/KAGOKxDKrHr6EbT7SSs4B+DNxyBE2mks28AD+Jw6PkfY5uwA==
+node-releases@^1.1.38:
+ version "1.1.38"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.38.tgz#d81b365df2936654ba37f509ba2fbe91eff2578b"
+ integrity sha512-/5NZAaOyTj134Oy5Cp/J8mso8OD/D9CSuL+6TOXXsTKO8yjc5e4up75SRPCganCjwFKMj2jbp5tR0dViVdox7g==
dependencies:
semver "^6.3.0"
@@ -8440,10 +8912,10 @@ node-res@^5.0.1:
on-finished "^2.3.0"
vary "^1.1.2"
-node-sass@^4.12.0:
- version "4.12.0"
- resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.12.0.tgz#0914f531932380114a30cc5fa4fa63233a25f017"
- integrity sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==
+node-sass@^4.13.0:
+ version "4.13.0"
+ resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.13.0.tgz#b647288babdd6a1cb726de4545516b31f90da066"
+ integrity sha512-W1XBrvoJ1dy7VsvTAS5q1V45lREbTlZQqFbiHb3R3OTTCma0XBtuG6xZ6Z4506nR4lmHPTqVRwxT6KgtWC97CA==
dependencies:
async-foreach "^0.1.3"
chalk "^1.1.1"
@@ -8452,7 +8924,7 @@ node-sass@^4.12.0:
get-stdin "^4.0.1"
glob "^7.0.3"
in-publish "^2.0.0"
- lodash "^4.17.11"
+ lodash "^4.17.15"
meow "^3.7.0"
mkdirp "^0.5.1"
nan "^2.13.2"
@@ -8558,10 +9030,10 @@ npm-run-path@^2.0.0:
dependencies:
path-key "^2.0.0"
-npm-run-path@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-3.1.0.tgz#7f91be317f6a466efed3c9f2980ad8a4ee8b0fa5"
- integrity sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==
+npm-run-path@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.0.tgz#d644ec1bd0569187d2a52909971023a0a58e8438"
+ integrity sha512-8eyAOAH+bYXFPSnNnKr3J+yoybe8O87Is5rtAQ8qRczJz1ajcsjg8l2oZqP+Ppx15Ii3S1vUTjQN2h4YO2tWWQ==
dependencies:
path-key "^3.0.0"
@@ -8597,18 +9069,18 @@ number-is-nan@^1.0.0:
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
-nuxt@^2.10.1:
- version "2.10.1"
- resolved "https://registry.yarnpkg.com/nuxt/-/nuxt-2.10.1.tgz#d02237baea11bfaa63d65e45231c41c6a7c18d49"
- integrity sha512-75QQ3x1WAcoBb7krHLzSXVK2/TKUFCHfsskd0bbdAl1KI9Xweyd6SGtdgGsdjWOlaUhijsXFqrPnfPPmrpLMzQ==
+nuxt@^2.10.2:
+ version "2.10.2"
+ resolved "https://registry.yarnpkg.com/nuxt/-/nuxt-2.10.2.tgz#15ade22dfe281095865df18e6f6e861fcad1ff95"
+ integrity sha512-BDeio2WwwMrW4bctRYNHq1su+rwIJzuo87bAZv8Xs2/Gw5g4bPIGZTiKGx6tSZBjxnONsGDOxhFOWZ5JpQEtrQ==
dependencies:
- "@nuxt/builder" "2.10.1"
- "@nuxt/cli" "2.10.1"
- "@nuxt/core" "2.10.1"
- "@nuxt/generator" "2.10.1"
+ "@nuxt/builder" "2.10.2"
+ "@nuxt/cli" "2.10.2"
+ "@nuxt/core" "2.10.2"
+ "@nuxt/generator" "2.10.2"
"@nuxt/loading-screen" "^1.2.0"
"@nuxt/opencollective" "^0.3.0"
- "@nuxt/webpack" "2.10.1"
+ "@nuxt/webpack" "2.10.2"
nwsapi@^2.0.7, nwsapi@^2.1.3:
version "2.1.4"
@@ -8803,15 +9275,6 @@ osenv@0, osenv@^0.1.4:
os-homedir "^1.0.0"
os-tmpdir "^1.0.0"
-output-file-sync@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-2.0.1.tgz#f53118282f5f553c2799541792b723a4c71430c0"
- integrity sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ==
- dependencies:
- graceful-fs "^4.1.11"
- is-plain-obj "^1.1.0"
- mkdirp "^0.5.1"
-
p-defer@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c"
@@ -9208,10 +9671,10 @@ pn@^1.1.0:
resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==
-popper.js@^1.15.0:
- version "1.15.0"
- resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.15.0.tgz#5560b99bbad7647e9faa475c6b8056621f5a4ff2"
- integrity sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA==
+popper.js@^1.16.0:
+ version "1.16.0"
+ resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.0.tgz#2e1816bcbbaa518ea6c2e15a466f4cb9c6e2fbb3"
+ integrity sha512-+G+EkOPoE5S/zChTpmBSSDYmhXJ5PsW8eMhH8cP/CQHMFPBG/kC9Y5IIw6qNYgdJ+/COf0ddY2li28iHaZRSjw==
portal-vue@^2.1.6:
version "2.1.6"
@@ -9431,12 +9894,12 @@ postcss-image-set-function@^3.0.1:
postcss "^7.0.2"
postcss-values-parser "^2.0.0"
-postcss-import-resolver@^1.2.3:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/postcss-import-resolver/-/postcss-import-resolver-1.2.3.tgz#a7f8f034f2b1774c90ae768e5927816ee3d869d7"
- integrity sha512-7f+RZTagq9AjLYICk5TRLbjYAqGfOngRyNkKoV7MHcSew1FTatHliQuK/lg+eXuxppLy9wAfrFx15nxURMZmEg==
+postcss-import-resolver@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-import-resolver/-/postcss-import-resolver-2.0.0.tgz#95c61ac5489047bd93ff42a9cd405cfe9041e2c0"
+ integrity sha512-y001XYgGvVwgxyxw9J1a5kqM/vtmIQGzx34g0A0Oy44MFcy/ZboZw1hu/iN3VYFjSTRzbvd7zZJJz0Kh0AGkTw==
dependencies:
- enhanced-resolve "^3.4.1"
+ enhanced-resolve "^4.1.1"
postcss-import@^12.0.1:
version "12.0.1"
@@ -9914,6 +10377,15 @@ postcss@^7.0.18:
source-map "^0.6.1"
supports-color "^6.1.0"
+postcss@^7.0.21:
+ version "7.0.21"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17"
+ integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==
+ dependencies:
+ chalk "^2.4.2"
+ source-map "^0.6.1"
+ supports-color "^6.1.0"
+
prelude-ls@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
@@ -10299,10 +10771,10 @@ readdirp@^2.2.1:
micromatch "^3.1.10"
readable-stream "^2.0.2"
-readdirp@~3.1.3:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.1.3.tgz#d6e011ed5b9240a92f08651eeb40f7942ceb6cc1"
- integrity sha512-ZOsfTGkjO2kqeR5Mzr5RYDbTGYneSkdNKX2fOX2P5jF7vMrd/GNnIAUtDldeHHumHUCQ3V05YfWUdxMPAsRu9Q==
+readdirp@~3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839"
+ integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==
dependencies:
picomatch "^2.0.4"
@@ -10624,6 +11096,14 @@ restore-cursor@^2.0.0:
onetime "^2.0.0"
signal-exit "^3.0.2"
+restore-cursor@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
+ integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
+ dependencies:
+ onetime "^5.1.0"
+ signal-exit "^3.0.2"
+
ret@~0.1.10:
version "0.1.15"
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
@@ -10708,10 +11188,10 @@ rollup-pluginutils@^2.8.1:
dependencies:
estree-walker "^0.6.1"
-rollup@^1.23.1:
- version "1.23.1"
- resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.23.1.tgz#0315a0f5d0dfb056e6363e1dff05b89ac2da6b8e"
- integrity sha512-95C1GZQpr/NIA0kMUQmSjuMDQ45oZfPgDBcN0yZwBG7Kee//m7H68vgIyg+SPuyrTZ5PrXfyLK80OzXeKG5dAA==
+rollup@^1.27.0:
+ version "1.27.0"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.27.0.tgz#7afe0da89c967cec5ccea7e919da6c89a1a68666"
+ integrity sha512-yaMna4MJ8LLEHhHl1ilgHakylf0LKeQctDxhngZLQ+W57GnXa5vtH7XKaK8zlAhNEhlWiH5YFVFt+QCDPUmNkw==
dependencies:
"@types/estree" "*"
"@types/node" "*"
@@ -10863,11 +11343,6 @@ semver-diff@^2.0.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b"
integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==
-semver@5.5.0:
- version "5.5.0"
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
- integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==
-
semver@6.3.0, semver@^6.2.0, semver@^6.3.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
@@ -11593,11 +12068,6 @@ table@^5.2.3:
slice-ansi "^2.1.0"
string-width "^3.0.0"
-tapable@^0.2.7:
- version "0.2.9"
- resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.9.tgz#af2d8bbc9b04f74ee17af2b4d9048f807acd18a8"
- integrity sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==
-
tapable@^1.0.0, tapable@^1.0.0-beta.5, tapable@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
@@ -11716,6 +12186,15 @@ terser@^4.3.8:
source-map "~0.6.1"
source-map-support "~0.5.12"
+terser@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-4.4.0.tgz#22c46b4817cf4c9565434bfe6ad47336af259ac3"
+ integrity sha512-oDG16n2WKm27JO8h4y/w3iqBGAOSCtq7k8dRmrn4Wf9NouL0b2WpMHGChFGZq4nFAQy1FsNJrVQHfurXOSTmOA==
+ dependencies:
+ commander "^2.20.0"
+ source-map "~0.6.1"
+ source-map-support "~0.5.12"
+
test-exclude@^5.2.3:
version "5.2.3"
resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0"
@@ -12364,25 +12843,25 @@ vm-browserify@^1.0.1:
resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019"
integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==
-vue-analytics@^5.16.2:
- version "5.17.0"
- resolved "https://registry.yarnpkg.com/vue-analytics/-/vue-analytics-5.17.0.tgz#c9530b82b9b4acd111c9cba7d249adf4089746b3"
- integrity sha512-1Cn/v06cGjmGDfRlG2hc0RF0sc2rNC88shOeLGNIlllSFv5GDZ9kLXGTPB9z9I+WyvFewyUONPIdQnpOls6h6w==
+vue-analytics@^5.17.2:
+ version "5.17.2"
+ resolved "https://registry.yarnpkg.com/vue-analytics/-/vue-analytics-5.17.2.tgz#5a43cbd907a8b5d2c27e3df5046245604fa8c83e"
+ integrity sha512-Vfbn5laOG8OVetrBNRfV64y/N5VVyw1PPC4LiowZFh58UOsfsGH8w+ZZn0pyMelSZmz9uxkgG5dNnce4bwJ6jg==
vue-client-only@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/vue-client-only/-/vue-client-only-2.0.0.tgz#ddad8d675ee02c761a14229f0e440e219de1da1c"
integrity sha512-arhk1wtWAfLsJyxGMoEYhoBowM87/i6HLSG2LH/03Yog6i2d9JEN1peMP0Ceis+/n9DxdenGYZZTxbPPJyHciA==
-vue-eslint-parser@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-5.0.0.tgz#00f4e4da94ec974b821a26ff0ed0f7a78402b8a1"
- integrity sha512-JlHVZwBBTNVvzmifwjpZYn0oPWH2SgWv5dojlZBsrhablDu95VFD+hriB1rQGwbD+bms6g+rAFhQHk6+NyiS6g==
+vue-eslint-parser@^6.0.4:
+ version "6.0.4"
+ resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-6.0.4.tgz#56ff47e2c2644bff39951d5a284982c7ecd6f7fa"
+ integrity sha512-GYsDsDWwKaGtnkW4nGUxr01wqIO2FB9/QHQTW1Gl5SUr5OyQvpnR90/D+Gq2cIxURX7aJ7+VyD+37Yx9eFwTgw==
dependencies:
- debug "^4.1.0"
+ debug "^4.1.1"
eslint-scope "^4.0.0"
eslint-visitor-keys "^1.0.0"
- espree "^4.1.0"
+ espree "^5.0.0"
esquery "^1.0.1"
lodash "^4.17.11"
@@ -12527,10 +13006,10 @@ webidl-conversions@^4.0.2:
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==
-webpack-bundle-analyzer@^3.5.2:
- version "3.5.2"
- resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.5.2.tgz#ac02834f4b31de8e27d71e6c7a612301ebddb79f"
- integrity sha512-g9spCNe25QYUVqHRDkwG414GTok2m7pTTP0wr6l0J50Z3YLS04+BGodTqqoVBL7QfU/U/9p/oiI5XFOyfZ7S/A==
+webpack-bundle-analyzer@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.6.0.tgz#39b3a8f829ca044682bc6f9e011c95deb554aefd"
+ integrity sha512-orUfvVYEfBMDXgEKAKVvab5iQ2wXneIEorGNsyuOyVYpjYrI7CUOhhXNDd3huMwQ3vNNWWlGP+hzflMFYNzi2g==
dependencies:
acorn "^6.0.7"
acorn-walk "^6.1.1"
@@ -12606,10 +13085,10 @@ webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3:
source-list-map "^2.0.0"
source-map "~0.6.1"
-webpack@^4.41.0:
- version "4.41.0"
- resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.0.tgz#db6a254bde671769f7c14e90a1a55e73602fc70b"
- integrity sha512-yNV98U4r7wX1VJAj5kyMsu36T8RPPQntcb5fJLOsMz/pt/WrKC0Vp1bAlqPLkA1LegSwQwf6P+kAbyhRKVQ72g==
+webpack@^4.41.2:
+ version "4.41.2"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.2.tgz#c34ec76daa3a8468c9b61a50336d8e3303dce74e"
+ integrity sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A==
dependencies:
"@webassemblyjs/ast" "1.8.5"
"@webassemblyjs/helper-module-context" "1.8.5"
|