diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fc6b5425aef..5fac9ba76a7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,7 +24,7 @@ jobs: uses: actions/checkout@v2 - name: Set Node.js version - uses: actions/setup-node@v2.1.2 + uses: actions/setup-node@v2.1.3 with: node-version: ${{ matrix.node }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index eb24fe4f135..5fd947f56d7 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -24,7 +24,7 @@ jobs: uses: actions/checkout@v2 - name: Set Node.js version - uses: actions/setup-node@v2.1.2 + uses: actions/setup-node@v2.1.3 with: node-version: ${{ matrix.node }} @@ -61,7 +61,7 @@ jobs: uses: actions/checkout@v2 - name: Set Node.js version - uses: actions/setup-node@v2.1.2 + uses: actions/setup-node@v2.1.3 with: node-version: ${{ matrix.node }} @@ -98,7 +98,7 @@ jobs: uses: actions/checkout@v2 - name: Set Node.js version - uses: actions/setup-node@v2.1.2 + uses: actions/setup-node@v2.1.3 with: node-version: ${{ matrix.node }} diff --git a/CHANGELOG.md b/CHANGELOG.md index bc73ccdedc5..52fd612fa85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,27 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + + +## [v2.21.1](https://github.com/bootstrap-vue/bootstrap-vue/compare/v2.21.0...v2.21.1) + +Released: 2020-12-16 + +### Bug Fixes v2.21.1 + +- **b-badge:** attribute inheritance + ([#6217](https://github.com/bootstrap-vue/bootstrap-vue/issues/6217)) + ([2d31f31](https://github.com/bootstrap-vue/bootstrap-vue/commit/2d31f31909c002faa2a9d8bd8620115ddf8ce603)) +- **b-dropdown:** root events ([#6198](https://github.com/bootstrap-vue/bootstrap-vue/issues/6198)) + ([6dcd233](https://github.com/bootstrap-vue/bootstrap-vue/commit/6dcd23334f2870220ed5c4d8b30bd556e57c03d5)) +- **b-pagination:** don't set initial page count twice + ([#6200](https://github.com/bootstrap-vue/bootstrap-vue/issues/6200)) + ([d7394e3](https://github.com/bootstrap-vue/bootstrap-vue/commit/d7394e3426e5b06797caef070137ec47b25ef62a)) +- **b-tabs:** restore correct active tab detection logic (closes + [#6205](https://github.com/bootstrap-vue/bootstrap-vue/issues/6205)) + ([#6208](https://github.com/bootstrap-vue/bootstrap-vue/issues/6208)) + ([6d92a43](https://github.com/bootstrap-vue/bootstrap-vue/commit/6d92a4376c227a02a7c24e19c04e437bb8909c1c)) + ## [v2.21.0](https://github.com/bootstrap-vue/bootstrap-vue/compare/v2.20.1...v2.21.0) diff --git a/package.json b/package.json index 6402913981d..e42be362868 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bootstrap-vue", - "version": "2.21.0", + "version": "2.21.1", "description": "With more than 85 components, over 45 available plugins, several directives, and 1000+ icons, BootstrapVue provides one of the most comprehensive implementations of the Bootstrap v4 component and grid system available for Vue.js v2.6, complete with extensive and automated WAI-ARIA accessibility markup.", "main": "dist/bootstrap-vue.common.js", "web": "dist/bootstrap-vue.js", @@ -95,8 +95,8 @@ "@babel/core": "^7.12.10", "@babel/plugin-transform-modules-commonjs": "^7.12.1", "@babel/plugin-transform-runtime": "^7.12.10", - "@babel/preset-env": "^7.12.10", - "@babel/standalone": "^7.12.10", + "@babel/preset-env": "^7.12.11", + "@babel/standalone": "^7.12.11", "@nuxt/content": "^1.11.1", "@nuxtjs/google-analytics": "^2.4.0", "@nuxtjs/pwa": "^3.3.2", @@ -126,7 +126,7 @@ "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^3.3.0", "eslint-plugin-promise": "^4.2.1", - "eslint-plugin-vue": "^7.2.0", + "eslint-plugin-vue": "^7.3.0", "esm": "^3.2.25", "execa": "^5.0.0", "highlight.js": "^10.4.1", @@ -137,13 +137,13 @@ "lint-staged": "^10.5.3", "loader-utils": "^2.0.0", "lodash": "^4.17.20", - "marked": "^1.2.6", + "marked": "^1.2.7", "nuxt": "^2.14.11", "postcss": "^8.2.1", "postcss-cli": "^8.3.1", "prettier": "1.14.3", "require-context": "^1.1.0", - "rollup": "^2.35.0", + "rollup": "^2.35.1", "rollup-plugin-babel": "^4.4.0", "rollup-plugin-commonjs": "^10.1.0", "rollup-plugin-node-resolve": "^5.2.0", diff --git a/src/components/badge/badge.js b/src/components/badge/badge.js index 4be4a60249a..bff564a3fa4 100644 --- a/src/components/badge/badge.js +++ b/src/components/badge/badge.js @@ -1,10 +1,9 @@ -import { Vue } from '../../vue' +import { Vue, mergeData } from '../../vue' import { NAME_BADGE } from '../../constants/components' import { PROP_TYPE_BOOLEAN, PROP_TYPE_STRING } from '../../constants/props' import { omit, sortKeys } from '../../utils/object' import { makeProp, makePropsConfigurable, pluckProps } from '../../utils/props' import { isLink } from '../../utils/router' -import { normalizeSlotMixin } from '../../mixins/normalize-slot' import { BLink, props as BLinkProps } from '../link/link' // --- Props --- @@ -28,28 +27,29 @@ export const props = makePropsConfigurable( // @vue/component export const BBadge = /*#__PURE__*/ Vue.extend({ name: NAME_BADGE, - mixins: [normalizeSlotMixin], + functional: true, props, - render(h) { - const { variant, $props } = this - const link = isLink($props) - const tag = link ? BLink : this.tag + render(h, { props, data, children }) { + const { active, disabled } = props + const link = isLink(props) + const tag = link ? BLink : props.tag + const variant = props.variant || 'secondary' return h( tag, - { + mergeData(data, { staticClass: 'badge', class: [ - variant ? `badge-${variant}` : 'badge-secondary', + `badge-${variant}`, { - 'badge-pill': this.pill, - active: this.active, - disabled: this.disabled + 'badge-pill': props.pill, + active, + disabled } ], - props: link ? pluckProps(linkProps, $props) : {} - }, - this.normalizeSlot() + props: link ? pluckProps(linkProps, props) : {} + }), + children ) } }) diff --git a/src/components/form-timepicker/README.md b/src/components/form-timepicker/README.md index 42d0b41cc74..7a606fcb9c2 100644 --- a/src/components/form-timepicker/README.md +++ b/src/components/form-timepicker/README.md @@ -251,7 +251,7 @@ In the following simple example, we are placing the timepicker (button only mode locale="en" aria-controls="example-input" > - +

Value: '{{ value }}'

diff --git a/src/components/modal/modal.js b/src/components/modal/modal.js index fd72a0353c7..90dcb40f529 100644 --- a/src/components/modal/modal.js +++ b/src/components/modal/modal.js @@ -588,13 +588,12 @@ export const BModal = /*#__PURE__*/ Vue.extend({ this.emitEvent(this.buildEvent(EVENT_NAME_HIDDEN)) }) }, - // Event emitter - emitEvent(bvModalEvt) { - const type = bvModalEvt.type - // We emit on root first incase a global listener wants to cancel + emitEvent(bvEvent) { + const { type } = bvEvent + // We emit on `$root` first in case a global listener wants to cancel // the event first before the instance emits its event - this.emitOnRoot(getRootEventName(NAME_MODAL, type), bvModalEvt, bvModalEvt.componentId) - this.$emit(type, bvModalEvt) + this.emitOnRoot(getRootEventName(NAME_MODAL, type), bvEvent, bvEvent.componentId) + this.$emit(type, bvEvent) }, // UI event handlers onDialogMousedown() { diff --git a/src/components/pagination/pagination.js b/src/components/pagination/pagination.js index eefbe1dee1c..b9ccf2d5a0e 100644 --- a/src/components/pagination/pagination.js +++ b/src/components/pagination/pagination.js @@ -49,8 +49,8 @@ export const BPagination = /*#__PURE__*/ Vue.extend({ const result = mathCeil(sanitizeTotalRows(this.totalRows) / sanitizePerPage(this.perPage)) return result < 1 ? 1 : result }, + // Used for watching changes to `perPage` and `numberOfPages` pageSizeNumberOfPages() { - // Used for watching changes to `perPage` and `numberOfPages` return { perPage: sanitizePerPage(this.perPage), totalRows: sanitizeTotalRows(this.totalRows), @@ -91,10 +91,6 @@ export const BPagination = /*#__PURE__*/ Vue.extend({ }) } }, - mounted() { - // Set the initial page count - this.localNumberOfPages = this.numberOfPages - }, methods: { // These methods are used by the render function onClick(event, pageNumber) { diff --git a/src/components/tabs/tabs.js b/src/components/tabs/tabs.js index cc7faafdc34..665189cd362 100644 --- a/src/components/tabs/tabs.js +++ b/src/components/tabs/tabs.js @@ -33,7 +33,7 @@ import { } from '../../constants/slots' import { arrayIncludes } from '../../utils/array' import { BvEvent } from '../../utils/bv-event.class' -import { attemptFocus, selectAll } from '../../utils/dom' +import { attemptFocus, selectAll, requestAF } from '../../utils/dom' import { stopEvent } from '../../utils/events' import { identity } from '../../utils/identity' import { isEvent } from '../../utils/inspect' @@ -280,14 +280,14 @@ export const BTabs = /*#__PURE__*/ Vue.extend({ // Update the v-model this.$emit(MODEL_EVENT_NAME, index) }, + // If tabs added, removed, or re-ordered, we emit a `changed` event tabs(newValue, oldValue) { - // If tabs added, removed, or re-ordered, we emit a `changed` event - // We use `tab._uid` instead of `tab.safeId()`, as the later is changed - // in a `$nextTick()` if no explicit ID is provided, causing duplicate emits + // We use `_uid` instead of `safeId()`, as the later is changed in a `$nextTick()` + // if no explicit ID is provided, causing duplicate emits if ( !looseEqual( - newValue.map(t => t[COMPONENT_UID_KEY]), - oldValue.map(t => t[COMPONENT_UID_KEY]) + newValue.map($tab => $tab[COMPONENT_UID_KEY]), + oldValue.map($tab => $tab[COMPONENT_UID_KEY]) ) ) { // In a `$nextTick()` to ensure `currentTab` has been set first @@ -298,6 +298,9 @@ export const BTabs = /*#__PURE__*/ Vue.extend({ }) } }, + // Each `` will register/unregister itself + // We use this to detect when tabs are added/removed + // to trigger the update of the tabs registeredTabs() { this.updateTabs() } @@ -332,7 +335,9 @@ export const BTabs = /*#__PURE__*/ Vue.extend({ /* istanbul ignore next: difficult to test mutation observer in JSDOM */ const handler = () => { this.$nextTick(() => { - this.updateTabs() + requestAF(() => { + this.updateTabs() + }) }) } @@ -352,8 +357,9 @@ export const BTabs = /*#__PURE__*/ Vue.extend({ // DOM Order of Tabs let order = [] + /* istanbul ignore next: too difficult to test */ if (IS_BROWSER && $tabs.length > 0) { - // We rely on the DOM when mounted to get the 'true' order of the `` children + // We rely on the DOM when mounted to get the "true" order of the `` children // `querySelectorAll()` always returns elements in document order, regardless of // order specified in the selector const selector = $tabs.map($tab => `#${$tab.safeId()}`).join(', ') @@ -369,29 +375,44 @@ export const BTabs = /*#__PURE__*/ Vue.extend({ updateTabs() { const $tabs = this.getTabs() - // Normalize `currentTab` - let { currentTab } = this - const $tab = $tabs[currentTab] - if (!$tab || $tab.disabled) { - currentTab = $tabs.indexOf( - $tabs - .slice() - .reverse() - .find($tab => $tab.localActive && !$tab.disabled) - ) + // Find last active non-disabled tab in current tabs + // We trust tab state over `currentTab`, in case tabs were added/removed/re-ordered + let tabIndex = $tabs.indexOf( + $tabs + .slice() + .reverse() + .find($tab => $tab.localActive && !$tab.disabled) + ) - if (currentTab === -1) { - currentTab = $tabs.indexOf($tabs.find(notDisabled)) + // Else try setting to `currentTab` + if (tabIndex < 0) { + const { currentTab } = this + if (currentTab >= $tabs.length) { + // Handle last tab being removed, so find the last non-disabled tab + tabIndex = $tabs.indexOf( + $tabs + .slice() + .reverse() + .find(notDisabled) + ) + } else if ($tabs[currentTab] && !$tabs[currentTab].disabled) { + // Current tab is not disabled + tabIndex = currentTab } } + // Else find first non-disabled tab in current tabs + if (tabIndex < 0) { + tabIndex = $tabs.indexOf($tabs.find(notDisabled)) + } + // Ensure only one tab is active at a time $tabs.forEach(($tab, index) => { - $tab.localActive = index === currentTab + $tab.localActive = index === tabIndex }) this.tabs = $tabs - this.currentTab = currentTab + this.currentTab = tabIndex }, // Find a button that controls a tab, given the tab reference // Returns the button vm instance diff --git a/src/components/tabs/tabs.spec.js b/src/components/tabs/tabs.spec.js index 7e4983e264a..ddedb7b72b6 100644 --- a/src/components/tabs/tabs.spec.js +++ b/src/components/tabs/tabs.spec.js @@ -111,18 +111,18 @@ describe('tabs', () => { await waitNT(wrapper.vm) - const tabs = wrapper.findComponent(BTabs) - expect(tabs).toBeDefined() - expect(tabs.findAllComponents(BTab).length).toBe(3) + const $tabs = wrapper.findComponent(BTabs) + expect($tabs).toBeDefined() + expect($tabs.findAllComponents(BTab).length).toBe(3) // Expect 2nd tab (index 1) to be active - expect(tabs.vm.currentTab).toBe(1) - expect(tabs.vm.tabs[1].localActive).toBe(true) + expect($tabs.vm.currentTab).toBe(1) + expect($tabs.vm.tabs[1].localActive).toBe(true) - expect(tabs.emitted('input')).toBeDefined() - expect(tabs.emitted('input').length).toBe(1) + expect($tabs.emitted('input')).toBeDefined() + expect($tabs.emitted('input').length).toBe(1) // Should emit index of 1 (2nd tab) - expect(tabs.emitted('input')[0][0]).toBe(1) + expect($tabs.emitted('input')[0][0]).toBe(1) wrapper.destroy() }) @@ -142,18 +142,18 @@ describe('tabs', () => { await waitNT(wrapper.vm) - const tabs = wrapper.findComponent(BTabs) - expect(tabs).toBeDefined() - expect(tabs.findAllComponents(BTab).length).toBe(3) + const $tabs = wrapper.findComponent(BTabs) + expect($tabs).toBeDefined() + expect($tabs.findAllComponents(BTab).length).toBe(3) // Expect 2nd tab (index 1) to be active - expect(tabs.vm.currentTab).toBe(1) - expect(tabs.vm.tabs[1].localActive).toBe(true) + expect($tabs.vm.currentTab).toBe(1) + expect($tabs.vm.tabs[1].localActive).toBe(true) - expect(tabs.emitted('input')).toBeDefined() - expect(tabs.emitted('input').length).toBe(1) + expect($tabs.emitted('input')).toBeDefined() + expect($tabs.emitted('input').length).toBe(1) // Should emit index of 1 (2nd tab) - expect(tabs.emitted('input')[0][0]).toBe(1) + expect($tabs.emitted('input')[0][0]).toBe(1) wrapper.destroy() }) @@ -172,34 +172,34 @@ describe('tabs', () => { expect(wrapper).toBeDefined() await waitNT(wrapper.vm) - const tabs = wrapper.findComponent(BTabs) - expect(tabs).toBeDefined() - expect(tabs.findAllComponents(BTab).length).toBe(3) + const $tabs = wrapper.findComponent(BTabs) + expect($tabs).toBeDefined() + expect($tabs.findAllComponents(BTab).length).toBe(3) // Expect 2nd tab (index 1) to be active - expect(tabs.vm.currentTab).toBe(1) - expect(tabs.findAllComponents(BTab).at(0).vm.localActive).toBe(false) - expect(tabs.findAllComponents(BTab).at(1).vm.localActive).toBe(true) - expect(tabs.findAllComponents(BTab).at(2).vm.localActive).toBe(false) + expect($tabs.vm.currentTab).toBe(1) + expect($tabs.findAllComponents(BTab).at(0).vm.localActive).toBe(false) + expect($tabs.findAllComponents(BTab).at(1).vm.localActive).toBe(true) + expect($tabs.findAllComponents(BTab).at(2).vm.localActive).toBe(false) - expect(tabs.emitted('input')).toBeDefined() - expect(tabs.emitted('input').length).toBe(1) + expect($tabs.emitted('input')).toBeDefined() + expect($tabs.emitted('input').length).toBe(1) // Should emit index of 1 (2nd tab) - expect(tabs.emitted('input')[0][0]).toBe(1) + expect($tabs.emitted('input')[0][0]).toBe(1) // Deactivate current tab (BTab 2, index 1) - await tabs + await $tabs .findAllComponents(BTab) .at(1) .setProps({ active: false }) // Expect last tab (index 2) to be active - expect(tabs.vm.currentTab).toBe(2) - expect(tabs.findAllComponents(BTab).at(0).vm.localActive).toBe(false) - expect(tabs.findAllComponents(BTab).at(1).vm.localActive).toBe(false) - expect(tabs.findAllComponents(BTab).at(2).vm.localActive).toBe(true) - expect(tabs.emitted('input').length).toBe(2) - expect(tabs.emitted('input')[1][0]).toBe(2) + expect($tabs.vm.currentTab).toBe(2) + expect($tabs.findAllComponents(BTab).at(0).vm.localActive).toBe(false) + expect($tabs.findAllComponents(BTab).at(1).vm.localActive).toBe(false) + expect($tabs.findAllComponents(BTab).at(2).vm.localActive).toBe(true) + expect($tabs.emitted('input').length).toBe(2) + expect($tabs.emitted('input')[1][0]).toBe(2) wrapper.destroy() }) @@ -218,29 +218,29 @@ describe('tabs', () => { expect(wrapper).toBeDefined() await waitNT(wrapper.vm) - const tabs = wrapper.findComponent(BTabs) - expect(tabs).toBeDefined() - expect(tabs.findAllComponents(BTab).length).toBe(3) + const $tabs = wrapper.findComponent(BTabs) + expect($tabs).toBeDefined() + expect($tabs.findAllComponents(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.vm.currentTab).toBe(0) + expect($tabs.vm.tabs[0].localActive).toBe(true) // It should not emit an input event as the value is the same - expect(tabs.emitted('input')).toBeUndefined() + expect($tabs.emitted('input')).toBeUndefined() // Set 2nd BTab to be active - await tabs.setProps({ value: 1 }) - expect(tabs.vm.currentTab).toBe(1) - expect(tabs.emitted('input').length).toBe(1) + await $tabs.setProps({ value: 1 }) + expect($tabs.vm.currentTab).toBe(1) + expect($tabs.emitted('input').length).toBe(1) // Should emit index of 1 (2nd tab) - expect(tabs.emitted('input')[0][0]).toBe(1) + expect($tabs.emitted('input')[0][0]).toBe(1) // Set 3rd BTab to be active - await tabs.setProps({ value: 2 }) - expect(tabs.vm.currentTab).toBe(2) - expect(tabs.emitted('input').length).toBe(2) + await $tabs.setProps({ value: 2 }) + expect($tabs.vm.currentTab).toBe(2) + expect($tabs.emitted('input').length).toBe(2) // Should emit index of 2 (3rd tab) - expect(tabs.emitted('input')[1][0]).toBe(2) + expect($tabs.emitted('input')[1][0]).toBe(2) wrapper.destroy() }) @@ -259,32 +259,32 @@ describe('tabs', () => { expect(wrapper).toBeDefined() await waitNT(wrapper.vm) - const tabs = wrapper.findComponent(BTabs) - expect(tabs).toBeDefined() - expect(tabs.findAllComponents(BTab).length).toBe(3) + const $tabs = wrapper.findComponent(BTabs) + expect($tabs).toBeDefined() + expect($tabs.findAllComponents(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')).toBeUndefined() + expect($tabs.vm.currentTab).toBe(0) + expect($tabs.vm.tabs[0].localActive).toBe(true) + expect($tabs.emitted('input')).toBeUndefined() // Try to set 2nd (disabled) BTab to be active - await tabs.setProps({ value: 1 }) + await $tabs.setProps({ value: 1 }) // Will try activate next non-disabled tab instead (3rd tab, index 2) - expect(tabs.vm.currentTab).toBe(2) - expect(tabs.emitted('input').length).toBe(1) + expect($tabs.vm.currentTab).toBe(2) + expect($tabs.emitted('input').length).toBe(1) // Should emit index of 2 (3rd tab) - expect(tabs.emitted('input')[0][0]).toBe(2) + expect($tabs.emitted('input')[0][0]).toBe(2) // Needed for test since value not bound to actual v-model on App - await tabs.setProps({ value: 2 }) + await $tabs.setProps({ value: 2 }) // Try and set 2nd BTab to be active - await tabs.setProps({ value: 1 }) + await $tabs.setProps({ value: 1 }) // Will find the previous non-disabled tab (1st tab, index 0) - expect(tabs.vm.currentTab).toBe(0) - expect(tabs.emitted('input').length).toBe(2) + expect($tabs.vm.currentTab).toBe(0) + expect($tabs.emitted('input').length).toBe(2) // Should emit index of 0 (1st tab) - expect(tabs.emitted('input')[1][0]).toBe(0) + expect($tabs.emitted('input')[1][0]).toBe(0) wrapper.destroy() }) @@ -311,41 +311,41 @@ describe('tabs', () => { expect(wrapper).toBeDefined() await waitNT(wrapper.vm) - const tabs = wrapper.findComponent(BTabs) - expect(tabs).toBeDefined() - expect(tabs.findAllComponents(BTab).length).toBe(3) + const $tabs = wrapper.findComponent(BTabs) + expect($tabs).toBeDefined() + expect($tabs.findAllComponents(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')).toBeUndefined() - expect(tabs.emitted('activate-tab')).toBeUndefined() + expect($tabs.vm.currentTab).toBe(0) + expect($tabs.vm.tabs[0].localActive).toBe(true) + expect($tabs.emitted('input')).toBeUndefined() + expect($tabs.emitted('activate-tab')).toBeUndefined() // Set 2nd BTab to be active - await tabs.setProps({ value: 1 }) - 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) + await $tabs.setProps({ value: 1 }) + 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 - await tabs.setProps({ value: 2 }) - 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) + await $tabs.setProps({ value: 2 }) + 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() }) @@ -364,19 +364,19 @@ describe('tabs', () => { expect(wrapper).toBeDefined() await waitNT(wrapper.vm) - const tabs = wrapper.findComponent(BTabs) - expect(tabs).toBeDefined() - expect(tabs.findAllComponents(BTab).length).toBe(3) + const $tabs = wrapper.findComponent(BTabs) + expect($tabs).toBeDefined() + expect($tabs.findAllComponents(BTab).length).toBe(3) - const tab1 = tabs.findAllComponents(BTab).at(0) - const tab2 = tabs.findAllComponents(BTab).at(1) - const tab3 = tabs.findAllComponents(BTab).at(2) + const tab1 = $tabs.findAllComponents(BTab).at(0) + const tab2 = $tabs.findAllComponents(BTab).at(1) + const tab3 = $tabs.findAllComponents(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($tabs.vm.currentTab).toBe(0) expect(tab1.vm.localActive).toBe(true) expect(tab2.vm.localActive).toBe(false) expect(tab3.vm.localActive).toBe(false) @@ -387,7 +387,7 @@ describe('tabs', () => { .findAll('.nav-link') .at(1) .trigger('click') - expect(tabs.vm.currentTab).toBe(1) + expect($tabs.vm.currentTab).toBe(1) expect(tab1.vm.localActive).toBe(false) expect(tab2.vm.localActive).toBe(true) expect(tab3.vm.localActive).toBe(false) @@ -399,7 +399,7 @@ describe('tabs', () => { .findAll('.nav-link') .at(2) .trigger('click') - expect(tabs.vm.currentTab).toBe(2) + expect($tabs.vm.currentTab).toBe(2) expect(tab1.vm.localActive).toBe(false) expect(tab2.vm.localActive).toBe(false) expect(tab3.vm.localActive).toBe(true) @@ -411,7 +411,7 @@ describe('tabs', () => { .findAll('.nav-link') .at(0) .trigger('keydown.space') - expect(tabs.vm.currentTab).toBe(0) + expect($tabs.vm.currentTab).toBe(0) expect(tab1.vm.localActive).toBe(true) expect(tab2.vm.localActive).toBe(false) expect(tab3.vm.localActive).toBe(false) @@ -434,19 +434,19 @@ describe('tabs', () => { expect(wrapper).toBeDefined() await waitNT(wrapper.vm) - const tabs = wrapper.findComponent(BTabs) - expect(tabs).toBeDefined() - expect(tabs.findAllComponents(BTab).length).toBe(3) + const $tabs = wrapper.findComponent(BTabs) + expect($tabs).toBeDefined() + expect($tabs.findAllComponents(BTab).length).toBe(3) - const tab1 = tabs.findAllComponents(BTab).at(0) - const tab2 = tabs.findAllComponents(BTab).at(1) - const tab3 = tabs.findAllComponents(BTab).at(2) + const tab1 = $tabs.findAllComponents(BTab).at(0) + const tab2 = $tabs.findAllComponents(BTab).at(1) + const tab3 = $tabs.findAllComponents(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($tabs.vm.currentTab).toBe(0) expect(tab1.vm.localActive).toBe(true) expect(tab2.vm.localActive).toBe(false) expect(tab3.vm.localActive).toBe(false) @@ -457,7 +457,7 @@ describe('tabs', () => { .findAll('.nav-link') .at(1) .trigger('keydown.space') - expect(tabs.vm.currentTab).toBe(1) + expect($tabs.vm.currentTab).toBe(1) expect(tab1.vm.localActive).toBe(false) expect(tab2.vm.localActive).toBe(true) expect(tab3.vm.localActive).toBe(false) @@ -469,7 +469,7 @@ describe('tabs', () => { .findAll('.nav-link') .at(2) .trigger('keydown.space') - expect(tabs.vm.currentTab).toBe(2) + expect($tabs.vm.currentTab).toBe(2) expect(tab1.vm.localActive).toBe(false) expect(tab2.vm.localActive).toBe(false) expect(tab3.vm.localActive).toBe(true) @@ -481,7 +481,7 @@ describe('tabs', () => { .findAll('.nav-link') .at(0) .trigger('keydown.space') - expect(tabs.vm.currentTab).toBe(0) + expect($tabs.vm.currentTab).toBe(0) expect(tab1.vm.localActive).toBe(true) expect(tab2.vm.localActive).toBe(false) expect(tab3.vm.localActive).toBe(false) @@ -504,19 +504,19 @@ describe('tabs', () => { expect(wrapper).toBeDefined() await waitNT(wrapper.vm) - const tabs = wrapper.findComponent(BTabs) - expect(tabs).toBeDefined() - expect(tabs.findAllComponents(BTab).length).toBe(3) + const $tabs = wrapper.findComponent(BTabs) + expect($tabs).toBeDefined() + expect($tabs.findAllComponents(BTab).length).toBe(3) - const tab1 = tabs.findAllComponents(BTab).at(0) - const tab2 = tabs.findAllComponents(BTab).at(1) - const tab3 = tabs.findAllComponents(BTab).at(2) + const tab1 = $tabs.findAllComponents(BTab).at(0) + const tab2 = $tabs.findAllComponents(BTab).at(1) + const tab3 = $tabs.findAllComponents(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($tabs.vm.currentTab).toBe(0) expect(tab1.vm.localActive).toBe(true) expect(tab2.vm.localActive).toBe(false) expect(tab3.vm.localActive).toBe(false) @@ -526,7 +526,7 @@ describe('tabs', () => { .findAllComponents(BLink) .at(0) .trigger('keydown.right') - expect(tabs.vm.currentTab).toBe(1) + expect($tabs.vm.currentTab).toBe(1) expect(tab1.vm.localActive).toBe(false) expect(tab2.vm.localActive).toBe(true) expect(tab3.vm.localActive).toBe(false) @@ -536,7 +536,7 @@ describe('tabs', () => { .findAllComponents(BLink) .at(1) .trigger('keydown.end') - expect(tabs.vm.currentTab).toBe(2) + expect($tabs.vm.currentTab).toBe(2) expect(tab1.vm.localActive).toBe(false) expect(tab2.vm.localActive).toBe(false) expect(tab3.vm.localActive).toBe(true) @@ -546,7 +546,7 @@ describe('tabs', () => { .findAllComponents(BLink) .at(2) .trigger('keydown.left') - expect(tabs.vm.currentTab).toBe(1) + expect($tabs.vm.currentTab).toBe(1) expect(tab1.vm.localActive).toBe(false) expect(tab2.vm.localActive).toBe(true) expect(tab3.vm.localActive).toBe(false) @@ -556,7 +556,7 @@ describe('tabs', () => { .findAllComponents(BLink) .at(1) .trigger('keydown.home') - expect(tabs.vm.currentTab).toBe(0) + expect($tabs.vm.currentTab).toBe(0) expect(tab1.vm.localActive).toBe(true) expect(tab2.vm.localActive).toBe(false) expect(tab3.vm.localActive).toBe(false) @@ -578,16 +578,16 @@ describe('tabs', () => { expect(wrapper).toBeDefined() await waitNT(wrapper.vm) - const tabs = wrapper.findComponent(BTabs) - expect(tabs).toBeDefined() - expect(tabs.findAllComponents(BTab).length).toBe(3) + const $tabs = wrapper.findComponent(BTabs) + expect($tabs).toBeDefined() + expect($tabs.findAllComponents(BTab).length).toBe(3) - const tab1 = tabs.findAllComponents(BTab).at(0) - const tab2 = tabs.findAllComponents(BTab).at(1) - const tab3 = tabs.findAllComponents(BTab).at(2) + const tab1 = $tabs.findAllComponents(BTab).at(0) + const tab2 = $tabs.findAllComponents(BTab).at(1) + const tab3 = $tabs.findAllComponents(BTab).at(2) // Expect 3rd tab (index 2) to be active - expect(tabs.vm.currentTab).toBe(2) + expect($tabs.vm.currentTab).toBe(2) expect(tab1.vm.localActive).toBe(false) expect(tab2.vm.localActive).toBe(false) expect(tab3.vm.localActive).toBe(true) @@ -596,7 +596,7 @@ describe('tabs', () => { await tab3.setProps({ disabled: true }) // Expect 1st tab to be active - expect(tabs.vm.currentTab).toBe(0) + expect($tabs.vm.currentTab).toBe(0) expect(tab1.vm.localActive).toBe(true) expect(tab2.vm.localActive).toBe(false) expect(tab3.vm.localActive).toBe(false) @@ -606,7 +606,7 @@ describe('tabs', () => { await tab1.setProps({ disabled: true }) // Expect 2nd tab to be active - expect(tabs.vm.currentTab).toBe(1) + expect($tabs.vm.currentTab).toBe(1) expect(tab1.vm.localActive).toBe(false) expect(tab2.vm.localActive).toBe(true) expect(tab3.vm.localActive).toBe(false) @@ -626,9 +626,9 @@ describe('tabs', () => { expect(wrapper).toBeDefined() await waitNT(wrapper.vm) - const tabs = wrapper.findComponent(BTabs) - expect(tabs).toBeDefined() - expect(tabs.findAllComponents(BTab).length).toBe(1) + const $tabs = wrapper.findComponent(BTabs) + expect($tabs).toBeDefined() + expect($tabs.findAllComponents(BTab).length).toBe(1) // Expect tab button content to be `original` expect(wrapper.find('.nav-link').text()).toBe('original') @@ -663,26 +663,26 @@ describe('tabs', () => { expect(wrapper).toBeDefined() await waitNT(wrapper.vm) - const tabs = wrapper.findComponent(BTabs) - expect(tabs).toBeDefined() - expect(tabs.findAllComponents(BTab).length).toBe(3) + const $tabs = wrapper.findComponent(BTabs) + expect($tabs).toBeDefined() + expect($tabs.findAllComponents(BTab).length).toBe(3) const getNavItemByTab = tab => wrapper.find(`#${tab.$el.id}___BV_tab_button__`) // Expect 1st tab (index 0) to be active - expect(tabs.vm.currentTab).toBe(0) - expect(tabs.vm.tabs[0].localActive).toBe(true) + expect($tabs.vm.currentTab).toBe(0) + expect($tabs.vm.tabs[0].localActive).toBe(true) // Expect 1st tabs nav item to have "active-nav-item-class" applied - expect(getNavItemByTab(tabs.vm.tabs[0]).classes(activeNavItemClass)).toBe(true) + expect(getNavItemByTab($tabs.vm.tabs[0]).classes(activeNavItemClass)).toBe(true) // Set 2nd tab to be active - tabs.setProps({ value: 1 }) + $tabs.setProps({ value: 1 }) await waitNT(wrapper.vm) - expect(tabs.vm.currentTab).toBe(1) + expect($tabs.vm.currentTab).toBe(1) // Expect 2nd tabs nav item to have "active-nav-item-class" applied - expect(getNavItemByTab(tabs.vm.tabs[1]).classes(activeNavItemClass)).toBe(true) + expect(getNavItemByTab($tabs.vm.tabs[1]).classes(activeNavItemClass)).toBe(true) // Expect 1st tabs nav item to don't have "active-nav-item-class" applied anymore - expect(getNavItemByTab(tabs.vm.tabs[0]).classes(activeNavItemClass)).toBe(false) + expect(getNavItemByTab($tabs.vm.tabs[0]).classes(activeNavItemClass)).toBe(false) wrapper.destroy() }) @@ -702,23 +702,69 @@ describe('tabs', () => { expect(wrapper).toBeDefined() await waitNT(wrapper.vm) - const tabs = wrapper.findComponent(BTabs) - expect(tabs).toBeDefined() - expect(tabs.findAllComponents(BTab).length).toBe(3) + const $tabs = wrapper.findComponent(BTabs) + expect($tabs).toBeDefined() + expect($tabs.findAllComponents(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.vm.currentTab).toBe(0) + expect($tabs.vm.tabs[0].localActive).toBe(true) // Expect 1st tab to have "active-tab-class" applied - expect(tabs.vm.tabs[0].$el.classList.contains(activeTabClass)).toBe(true) + expect($tabs.vm.tabs[0].$el.classList.contains(activeTabClass)).toBe(true) // Set 2nd tab to be active - await tabs.setProps({ value: 1 }) - expect(tabs.vm.currentTab).toBe(1) + await $tabs.setProps({ value: 1 }) + expect($tabs.vm.currentTab).toBe(1) // Expect 2nd tab to have "active-tab-class" applied - expect(tabs.vm.tabs[1].$el.classList.contains(activeTabClass)).toBe(true) + expect($tabs.vm.tabs[1].$el.classList.contains(activeTabClass)).toBe(true) // Expect 1st tab to don't have "active-tab-class" applied anymore - expect(tabs.vm.tabs[0].$el.classList.contains(activeTabClass)).toBe(false) + expect($tabs.vm.tabs[0].$el.classList.contains(activeTabClass)).toBe(false) + + wrapper.destroy() + }) + + it('emits "changed" event when tabs change', async () => { + const App = { + props: { + tabs: { + type: Array, + default: () => ['Tab 1', 'Tab 2', 'Tab 3'] + } + }, + render(h) { + return h(BTabs, this.tabs.map(tab => h(BTab, tab))) + } + } + const wrapper = mount(App) + expect(wrapper).toBeDefined() + + await waitNT(wrapper.vm) + + const $tabs = wrapper.findComponent(BTabs) + expect($tabs).toBeDefined() + expect($tabs.findAllComponents(BTab).length).toBe(3) + expect($tabs.emitted('changed')).toBeDefined() + expect($tabs.emitted('changed').length).toBe(1) + expect($tabs.emitted('changed')[0][0].length).toBe(3) + expect($tabs.emitted('changed')[0][1].length).toBe(0) + + // Add a tab + await wrapper.setProps({ tabs: ['Tab 1', 'Tab 2', 'Tab 3', 'Tab 4'] }) + await waitNT(wrapper.vm) + expect($tabs.findAllComponents(BTab).length).toBe(4) + expect($tabs.emitted('changed')).toBeDefined() + expect($tabs.emitted('changed').length).toBe(2) + expect($tabs.emitted('changed')[1][0].length).toBe(4) + expect($tabs.emitted('changed')[1][1].length).toBe(3) + + // Remove a tabs + await wrapper.setProps({ tabs: ['Tab 1', 'Tab 2'] }) + await waitNT(wrapper.vm) + expect($tabs.findAllComponents(BTab).length).toBe(2) + expect($tabs.emitted('changed')).toBeDefined() + expect($tabs.emitted('changed').length).toBe(3) + expect($tabs.emitted('changed')[2][0].length).toBe(2) + expect($tabs.emitted('changed')[2][1].length).toBe(4) wrapper.destroy() }) diff --git a/src/components/tooltip/helpers/bv-tooltip.js b/src/components/tooltip/helpers/bv-tooltip.js index a2a9c99e458..2fe03791d26 100644 --- a/src/components/tooltip/helpers/bv-tooltip.js +++ b/src/components/tooltip/helpers/bv-tooltip.js @@ -63,6 +63,7 @@ import { toInteger } from '../../../utils/number' import { keys } from '../../../utils/object' import { warn } from '../../../utils/warn' import { BvEvent } from '../../../utils/bv-event.class' +import { listenOnRootMixin } from '../../../mixins/listen-on-root' import { BVTooltipTemplate } from './bv-tooltip-template' // --- Constants --- @@ -138,6 +139,7 @@ const templateData = { // @vue/component export const BVTooltip = /*#__PURE__*/ Vue.extend({ name: NAME_TOOLTIP_HELPER, + mixins: [listenOnRootMixin], data() { return { // BTooltip/BPopover/VBTooltip/VBPopover will update this data @@ -681,14 +683,9 @@ export const BVTooltip = /*#__PURE__*/ Vue.extend({ }) }, emitEvent(bvEvent) { - // Emits a BvEvent on $root and this instance - const eventName = bvEvent.type - const $root = this.$root - if ($root && $root.$emit) { - // Emit an event on $root - $root.$emit(getRootEventName(this.templateType, eventName), bvEvent) - } - this.$emit(eventName, bvEvent) + const { type } = bvEvent + this.emitOnRoot(getRootEventName(this.templateType, type), bvEvent) + this.$emit(type, bvEvent) }, // --- Event handler setup methods --- listen() { diff --git a/src/mixins/dropdown.js b/src/mixins/dropdown.js index 865dd278f8d..5d3ab618d34 100644 --- a/src/mixins/dropdown.js +++ b/src/mixins/dropdown.js @@ -184,8 +184,8 @@ export const dropdownMixin = Vue.extend({ // Event emitter emitEvent(bvEvent) { const { type } = bvEvent + this.emitOnRoot(getRootEventName(NAME_DROPDOWN, type), bvEvent) this.$emit(type, bvEvent) - this.emitOnRoot(getRootEventName(NAME_DROPDOWN, type)) }, showMenu() { if (this.disabled) { diff --git a/yarn.lock b/yarn.lock index 870a1bd2e69..3f03930380e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -230,10 +230,15 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== -"@babel/helper-validator-option@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz#175567380c3e77d60ff98a54bb015fe78f2178d9" - integrity sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A== +"@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + +"@babel/helper-validator-option@^7.12.1", "@babel/helper-validator-option@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz#d66cb8b7a3e7fe4c6962b32020a131ecf0847f4f" + integrity sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw== "@babel/helper-wrap-function@^7.10.4": version "7.12.3" @@ -519,10 +524,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-block-scoping@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz#f0ee727874b42a208a48a586b84c3d222c2bbef1" - integrity sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w== +"@babel/plugin-transform-block-scoping@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.11.tgz#83ae92a104dbb93a7d6c6dd1844f351083c46b4f" + integrity sha512-atR1Rxc3hM+VPg/NvNvfYw0npQEAcHuJ+MGZnFn6h3bo+1U3BWXMdFMlvVRApBTWKQMX7SOwRJZA5FBF/JQbvA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" @@ -754,16 +759,16 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/preset-env@^7.12.10", "@babel/preset-env@^7.12.7": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.10.tgz#ca981b95f641f2610531bd71948656306905e6ab" - integrity sha512-Gz9hnBT/tGeTE2DBNDkD7BiWRELZt+8lSysHuDwmYXUIvtwZl0zI+D6mZgXZX0u8YBlLS4tmai9ONNY9tjRgRA== +"@babel/preset-env@^7.12.11", "@babel/preset-env@^7.12.7": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.11.tgz#55d5f7981487365c93dbbc84507b1c7215e857f9" + integrity sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw== dependencies: "@babel/compat-data" "^7.12.7" "@babel/helper-compilation-targets" "^7.12.5" "@babel/helper-module-imports" "^7.12.5" "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-validator-option" "^7.12.1" + "@babel/helper-validator-option" "^7.12.11" "@babel/plugin-proposal-async-generator-functions" "^7.12.1" "@babel/plugin-proposal-class-properties" "^7.12.1" "@babel/plugin-proposal-dynamic-import" "^7.12.1" @@ -792,7 +797,7 @@ "@babel/plugin-transform-arrow-functions" "^7.12.1" "@babel/plugin-transform-async-to-generator" "^7.12.1" "@babel/plugin-transform-block-scoped-functions" "^7.12.1" - "@babel/plugin-transform-block-scoping" "^7.12.1" + "@babel/plugin-transform-block-scoping" "^7.12.11" "@babel/plugin-transform-classes" "^7.12.1" "@babel/plugin-transform-computed-properties" "^7.12.1" "@babel/plugin-transform-destructuring" "^7.12.1" @@ -822,7 +827,7 @@ "@babel/plugin-transform-unicode-escapes" "^7.12.1" "@babel/plugin-transform-unicode-regex" "^7.12.1" "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.12.10" + "@babel/types" "^7.12.11" core-js-compat "^3.8.0" semver "^5.5.0" @@ -852,10 +857,10 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/standalone@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/standalone/-/standalone-7.12.10.tgz#f77f6750d0ab88c7c23234dd2d2f3800f170a573" - integrity sha512-e3sJ7uwwjiGWv7qeATKrP+Mjltr6JEurPh3yR0dBb9ie2YDnKl52lO82f+Ha+HAtyxTHfsPIXwgFmWKsCT2zOQ== +"@babel/standalone@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/standalone/-/standalone-7.12.11.tgz#ed6ec8758995d60ba702af6c39465f9bca18ac99" + integrity sha512-z+iFopDt0/8PUB8D0p7+95wYgXisRX6xi64fXCkpIRbkrA0nCf8t4yBBkSQ5YW/o9jPmmNhmX13OqsirloqdKQ== "@babel/template@^7.10.4", "@babel/template@^7.12.7", "@babel/template@^7.3.3": version "7.12.7" @@ -881,12 +886,12 @@ globals "^11.1.0" lodash "^4.17.19" -"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.10", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.10.tgz#7965e4a7260b26f09c56bcfcb0498af1f6d9b260" - integrity sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw== +"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.11.tgz#a86e4d71e30a9b6ee102590446c98662589283ce" + integrity sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" + "@babel/helper-validator-identifier" "^7.12.11" lodash "^4.17.19" to-fast-properties "^2.0.0" @@ -5570,15 +5575,15 @@ eslint-plugin-promise@^4.2.1: resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a" integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw== -eslint-plugin-vue@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-7.2.0.tgz#dd8323fe7ca28fe9377ce3f5f6cf17afe2686f2a" - integrity sha512-4mt0yIv6rBDNtvis/g22a0ozJ12GfcdEzX77u0ICYjKlxOVtGrKGEvo0cbOObHaKDg9a9kJcoaNodqE4TPfS2A== +eslint-plugin-vue@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-7.3.0.tgz#0faf0fcf0e1b1052bf800d4dee42d64f50679cb0" + integrity sha512-4rc9xrZgwT4aLz3XE6lrHu+FZtDLWennYvtzVvvS81kW9c65U4DUzQQWAFjDCgCFvN6HYWxi7ueEtxZVSB+f0g== dependencies: eslint-utils "^2.1.0" natural-compare "^1.4.0" semver "^7.3.2" - vue-eslint-parser "^7.2.0" + vue-eslint-parser "^7.3.0" eslint-scope@^4.0.3: version "4.0.3" @@ -8996,10 +9001,10 @@ markdown-table@^2.0.0: dependencies: repeat-string "^1.0.0" -marked@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/marked/-/marked-1.2.6.tgz#fa55cf38ab3585005c9fb3c1ebfb3d4590c29fdc" - integrity sha512-7vVuSEZ8g/HH3hK/BH/+7u/NJj7x9VY4EHzujLDcqAQLiOUeFJYAsfSAyoWtR17lKrx7b08qyIno4lffwrzTaA== +marked@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/marked/-/marked-1.2.7.tgz#6e14b595581d2319cdcf033a24caaf41455a01fb" + integrity sha512-No11hFYcXr/zkBvL6qFmAp1z6BKY3zqLMHny/JN/ey+al7qwCM2+CMBL9BOgqMxZU36fz4cCWfn2poWIf7QRXA== md5.js@^1.3.4: version "1.3.5" @@ -12242,10 +12247,10 @@ rollup-pluginutils@^2.8.1: dependencies: estree-walker "^0.6.1" -rollup@^2.35.0: - version "2.35.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.35.0.tgz#47b77827b122fbeca6a2c494fb2258db73d04fa9" - integrity sha512-AkiRsGBlHbP+bnAcOgiCRp6jm0BEGHXJk7TGZ+GpKyTL3EiSv+v+zEHlaB1gy1Ql2zyblBhzo5X346bCL45OAg== +rollup@^2.35.1: + version "2.35.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.35.1.tgz#e6bc8d10893556a638066f89e8c97f422d03968c" + integrity sha512-q5KxEyWpprAIcainhVy6HfRttD9kutQpHbeqDTWnqAFNJotiojetK6uqmcydNMymBEtC4I8bCYR+J3mTMqeaUA== optionalDependencies: fsevents "~2.1.2" @@ -14195,10 +14200,10 @@ vue-client-only@^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@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.2.0.tgz#1e17ae94ca71e617025e05143c8ac5593aacb6ef" - integrity sha512-uVcQqe8sUNzdHGcRHMd2Z/hl6qEaWrAmglTKP92Fnq9TYU9un8xsyFgEdFJaXh/1rd7h8Aic1GaiQow5nVneow== +vue-eslint-parser@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.3.0.tgz#894085839d99d81296fa081d19643733f23d7559" + integrity sha512-n5PJKZbyspD0+8LnaZgpEvNCrjQx1DyDHw8JdWwoxhhC+yRip4TAvSDpXGf9SWX6b0umeB5aR61gwUo6NVvFxw== dependencies: debug "^4.1.1" eslint-scope "^5.0.0"