diff --git a/.babelrc b/.babelrc deleted file mode 100644 index ab88026..0000000 --- a/.babelrc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "presets": [ - [ - "@babel/preset-env", - { - "targets": "last 3 versions" - } - ] - ] -} \ No newline at end of file diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..9a46be1 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: ["@babel/preset-env"], +}; diff --git a/package.json b/package.json index 294df73..aabfe42 100644 --- a/package.json +++ b/package.json @@ -79,12 +79,11 @@ }, "homepage": "https://github.com/MatteoGabriele/vue-gtag#readme", "peerDependencies": { - "vue": "^2.0.0" + "vue": "^3.0.0" }, "devDependencies": { "@babel/core": "^7.7.2", "@babel/preset-env": "^7.7.1", - "@vue/test-utils": "^1.0.0-beta.29", "babel-eslint": "^10.0.3", "bili": "^5.0.5", "commitizen": "^4.0.3", @@ -105,8 +104,8 @@ "rollup-plugin-alias": "^2.2.0", "rollup-plugin-resolve": "^0.0.1-predev.1", "semantic-release": "^15.13.31", - "vue": "^2.6.12", - "vue-router": "^3.1.3", + "vue": "^3.0.0", + "vue-router": "^4.0.6", "vue-template-compiler": "^2.6.10" } } diff --git a/src/add-routes-tracker.js b/src/add-routes-tracker.js index 1b5fdb9..cc9dd13 100644 --- a/src/add-routes-tracker.js +++ b/src/add-routes-tracker.js @@ -1,4 +1,4 @@ -import Vue from "vue"; +import { nextTick } from "vue"; import { isFn } from "@/utils"; import { getRouter } from "@/router"; import { getOptions } from "@/options"; @@ -14,21 +14,21 @@ export default () => { const { onBeforeTrack, onAfterTrack } = getOptions(); const router = getRouter(); - router.onReady(() => { - Vue.nextTick().then(() => { + router.isReady().then(() => { + nextTick().then(() => { const { currentRoute } = router; addConfiguration(); - if (isRouteExcluded(currentRoute)) { + if (isRouteExcluded(currentRoute.value)) { return; } - track(currentRoute); + track(currentRoute.value); }); router.afterEach((to, from) => { - Vue.nextTick().then(() => { + nextTick().then(() => { if (isRouteExcluded(to)) { return; } diff --git a/src/attach-api.js b/src/attach-api.js index 82706f3..8cfbeb8 100644 --- a/src/attach-api.js +++ b/src/attach-api.js @@ -1,5 +1,7 @@ import * as api from "@/api"; -const attachApi = (Vue) => (Vue.$gtag = Vue.prototype.$gtag = api); +const attachApi = (app) => { + app.config.globalProperties.$gtag = api; +}; export default attachApi; diff --git a/src/index.js b/src/index.js index d805b64..221c331 100644 --- a/src/index.js +++ b/src/index.js @@ -3,8 +3,8 @@ import { setOptions, getOptions } from "@/options"; import bootstrap from "@/bootstrap"; import { setRouter } from "@/router"; -const install = (Vue, options = {}, router) => { - attachApi(Vue); +const install = (app, options = {}, router) => { + attachApi(app); setOptions(options); setRouter(router); diff --git a/test/__mocks__/vue/index.js b/test/__mocks__/vue/index.js deleted file mode 100644 index c876a19..0000000 --- a/test/__mocks__/vue/index.js +++ /dev/null @@ -1,6 +0,0 @@ -import Vue from "vue"; - -Vue.config.productionTip = false; -Vue.config.devtools = false; - -export default Vue; diff --git a/test/add-configuration.spec.js b/test/add-configuration.spec.js index 910d8cc..32cfea3 100644 --- a/test/add-configuration.spec.js +++ b/test/add-configuration.spec.js @@ -1,4 +1,4 @@ -import { createLocalVue } from "@vue/test-utils"; +import { createApp } from "vue"; import VueGtag from "@/index"; import * as api from "@/api"; @@ -10,9 +10,9 @@ describe("add-configuration", () => { }); test("fires a configuration for the main domain", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { config: { id: 1, }, @@ -25,9 +25,9 @@ describe("add-configuration", () => { }); test("fires a configuration for multiple domains", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { includes: [ { id: 2, diff --git a/test/add-routes-tracker.spec.js b/test/add-routes-tracker.spec.js index 2df4d69..fde4f57 100644 --- a/test/add-routes-tracker.spec.js +++ b/test/add-routes-tracker.spec.js @@ -1,6 +1,6 @@ -import { mount, createLocalVue } from "@vue/test-utils"; +import { createApp } from "vue"; import flushPromises from "flush-promises"; -import VueRouter from "vue-router"; +import { createMemoryHistory, createRouter } from "vue-router"; import VueGtag from "@/index"; import * as api from "@/api"; import * as utils from "@/utils"; @@ -11,7 +11,9 @@ jest.mock("@/track"); jest.mock("@/api"); jest.mock("@/add-configuration"); -const App = { template: "
app
" }; +const Home = { template: "
" }; +const About = { template: "
" }; +const Contact = { template: "
" }; describe("page-tracker", () => { const { location } = window; @@ -30,11 +32,11 @@ describe("page-tracker", () => { }); beforeEach(() => { - router = new VueRouter({ - mode: "abstract", + router = createRouter({ + history: createMemoryHistory(), routes: [ - { name: "home", path: "/" }, - { name: "about", path: "/about" }, + { name: "home", path: "/", component: Home }, + { name: "about", path: "/about", component: About }, ], }); @@ -47,13 +49,13 @@ describe("page-tracker", () => { }); test("waits router ready before start tracking", async () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueRouter); + app.use(router); - jest.spyOn(router, "onReady").mockResolvedValue(); + jest.spyOn(router, "isReady").mockResolvedValue(); - localVue.use( + app.use( VueGtag, { config: { @@ -63,20 +65,18 @@ describe("page-tracker", () => { router ); - mount(App, { router, localVue }); - router.push("/"); await flushPromises(); - expect(router.onReady).toHaveBeenCalledBefore(api.config); + expect(router.isReady).toHaveBeenCalledBefore(api.config); }); test("fires the config hit", async () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueRouter); + app.use(router); - localVue.use( + app.use( VueGtag, { config: { @@ -86,23 +86,21 @@ describe("page-tracker", () => { router ); - mount(App, { router, localVue }); - router.push("/"); await flushPromises(); expect(addConfiguration).toHaveBeenCalled(); - expect(track).toHaveBeenCalledWith(router.currentRoute); + expect(track).toHaveBeenCalledWith(router.currentRoute.value); expect(track).toHaveBeenCalledTimes(1); }); test("fires track after each route change", async () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueRouter); + app.use(router); - localVue.use( + app.use( VueGtag, { config: { @@ -112,8 +110,6 @@ describe("page-tracker", () => { router ); - mount(App, { router, localVue }); - router.push("/"); await flushPromises(); @@ -159,12 +155,12 @@ describe("page-tracker", () => { }); test("fires the onBeforeTrack method", async () => { - const localVue = createLocalVue(); + const app = createApp(); const onBeforeTrackSpy = jest.fn(); - localVue.use(VueRouter); + app.use(router); - localVue.use( + app.use( VueGtag, { onBeforeTrack: onBeforeTrackSpy, @@ -175,8 +171,6 @@ describe("page-tracker", () => { router ); - mount(App, { router, localVue }); - router.push("/"); await flushPromises(); @@ -198,12 +192,12 @@ describe("page-tracker", () => { }); test("fires the onAfterTrack method", async () => { - const localVue = createLocalVue(); + const app = createApp(); const onAfterTrackSpy = jest.fn(); - localVue.use(VueRouter); + app.use(router); - localVue.use( + app.use( VueGtag, { onAfterTrack: onAfterTrackSpy, @@ -214,8 +208,6 @@ describe("page-tracker", () => { router ); - mount(App, { router, localVue }); - router.push("/"); await flushPromises(); @@ -237,20 +229,20 @@ describe("page-tracker", () => { }); test("remove routes from tracking based on path", async () => { - const localVue = createLocalVue(); + const app = createApp(); const onAfterTrackSpy = jest.fn(); - const router = new VueRouter({ - mode: "abstract", + const router = createRouter({ + history: createMemoryHistory(), routes: [ - { name: "home", path: "/" }, - { path: "/about" }, - { name: "contacts", path: "/contacts" }, + { name: "home", path: "/", component: Home }, + { path: "/about", component: About }, + { name: "contacts", path: "/contacts", component: Contact }, ], }); - localVue.use(VueRouter); + app.use(router); - localVue.use( + app.use( VueGtag, { pageTrackerExcludedRoutes: ["/about", "contacts"], @@ -262,8 +254,6 @@ describe("page-tracker", () => { router ); - mount(App, { router, localVue }); - router.push("/"); await flushPromises(); diff --git a/test/api/disable.spec.js b/test/api/disable.spec.js index e67ea51..6843cd1 100644 --- a/test/api/disable.spec.js +++ b/test/api/disable.spec.js @@ -1,4 +1,4 @@ -import { createLocalVue } from "@vue/test-utils"; +import { createApp } from "vue"; import disable from "@/api/disable"; import VueGtag from "@/index"; @@ -8,9 +8,9 @@ describe("disable", () => { }); test("turns off tracking", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { config: { id: 1, }, @@ -22,9 +22,9 @@ describe("disable", () => { }); test("turns on tracking", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { config: { id: 1, }, @@ -36,9 +36,9 @@ describe("disable", () => { }); test("turns off tracking for multiple domains", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { includes: [{ id: 2 }, { id: 3 }], config: { id: 1, @@ -53,9 +53,9 @@ describe("disable", () => { }); test("turns on tracking for multiple domains", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { includes: [{ id: 2 }, { id: 3 }], config: { id: 1, diff --git a/test/api/event.spec.js b/test/api/event.spec.js index 9ab7a43..95adc84 100644 --- a/test/api/event.spec.js +++ b/test/api/event.spec.js @@ -1,4 +1,4 @@ -import { createLocalVue } from "@vue/test-utils"; +import { createApp } from "vue"; import event from "@/api/event"; import query from "@/api/query"; import VueGtag from "@/index"; @@ -11,9 +11,9 @@ describe("event", () => { }); test("fires an event", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { config: { id: 1, }, @@ -25,9 +25,9 @@ describe("event", () => { }); test("attaches send_to to assign the event to multiple domains", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { includes: [{ id: 2 }], config: { id: 1, @@ -43,9 +43,9 @@ describe("event", () => { }); test("do not overwrite send_to if already set", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { includes: [{ id: 2 }], config: { id: 1, @@ -61,9 +61,9 @@ describe("event", () => { }); test("when using send_to, default group name can be customized", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { includes: [{ id: 2 }], defaultGroupName: "custom_default_group_value", config: { diff --git a/test/api/pageview.spec.js b/test/api/pageview.spec.js index 55bd6cb..58073d4 100644 --- a/test/api/pageview.spec.js +++ b/test/api/pageview.spec.js @@ -1,5 +1,5 @@ -import { createLocalVue } from "@vue/test-utils"; -import VueRouter from "vue-router"; +import { createApp } from "vue"; +import { createRouter, createMemoryHistory } from "vue-router"; import VueGtag from "@/index"; import pageview from "@/api/pageview"; import event from "@/api/event"; @@ -7,6 +7,9 @@ import flushPromises from "flush-promises"; jest.mock("@/api/event"); +const Home = { template: "
" }; +const About = { template: "
" }; + describe("pageview", () => { const _window = window; const { location } = window; @@ -57,19 +60,19 @@ describe("pageview", () => { }); test("pass page as a route", async () => { - const localVue = createLocalVue(); - const router = new VueRouter({ - mode: "abstract", - routes: [{ name: "home", path: "/" }], + const app = createApp(); + const router = createRouter({ + history: createMemoryHistory(), + routes: [{ name: "home", path: "/", component: Home }], }); - localVue.use(VueRouter); + app.use(router); router.push("/"); await flushPromises(); - pageview(router.currentRoute); + pageview(router.currentRoute.value); expect(event).toHaveBeenCalledWith("page_view", { send_page_view: true, @@ -80,9 +83,9 @@ describe("pageview", () => { }); test("track pageview without window", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { config: { id: 1 }, }); @@ -95,25 +98,25 @@ describe("pageview", () => { describe("pageTrackerUseFullPath", () => { test("tracks using router `path` property", async () => { - const localVue = createLocalVue(); - const router = new VueRouter({ - mode: "abstract", - routes: [{ name: "home", path: "/" }], + const app = createApp(); + const router = createRouter({ + history: createMemoryHistory(), + routes: [{ path: "/" }, { path: "/about", component: About }], }); - localVue.use(VueGtag, { + app.use(VueGtag, { config: { id: 1, }, }); - localVue.use(VueRouter); + app.use(router); router.push("/about?foo=bar"); await flushPromises(); - pageview(router.currentRoute); + pageview(router.currentRoute.value); expect(event).toHaveBeenCalledWith("page_view", { send_page_view: true, @@ -123,27 +126,27 @@ describe("pageview", () => { }); test("tracks using router `fullPath` property", async () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { pageTrackerUseFullPath: true, config: { id: 1, }, }); - const router = new VueRouter({ - mode: "abstract", - routes: [{ name: "home", path: "/" }], + const router = createRouter({ + history: createMemoryHistory(), + routes: [{ path: "/" }, { path: "/about", component: About }], }); - localVue.use(VueRouter); + app.use(router); router.push("/about?foo=bar"); await flushPromises(); - pageview(router.currentRoute); + pageview(router.currentRoute.value); expect(event).toHaveBeenCalledWith("page_view", { send_page_view: true, @@ -155,15 +158,18 @@ describe("pageview", () => { describe("router base path", () => { test("use with router installed", async () => { - const localVue = createLocalVue(); - const router = new VueRouter({ - mode: "abstract", + const app = createApp(); + const router = createRouter({ + history: createMemoryHistory(), base: "/app/", - routes: [{ path: "/" }, { path: "/about" }], + routes: [ + { path: "/", component: Home }, + { path: "/about", component: About }, + ], }); - localVue.use(VueRouter); - localVue.use( + app.use(router); + app.use( VueGtag, { pageTrackerPrependBase: true, @@ -178,7 +184,7 @@ describe("pageview", () => { await flushPromises(); - pageview(router.currentRoute); + pageview(router.currentRoute.value); expect(event).toHaveBeenCalledWith("page_view", { send_page_view: true, @@ -188,15 +194,18 @@ describe("pageview", () => { }); test("use without router installed", async () => { - const localVue = createLocalVue(); - const router = new VueRouter({ - mode: "abstract", + const app = createApp(); + const router = createRouter({ + history: createMemoryHistory(), base: "/app/", - routes: [{ path: "/" }, { path: "/about" }], + routes: [ + { path: "/", component: Home }, + { path: "/about", component: About }, + ], }); - localVue.use(VueRouter); - localVue.use(VueGtag, { + app.use(router); + app.use(VueGtag, { pageTrackerPrependBase: true, config: { id: 1, @@ -207,7 +216,7 @@ describe("pageview", () => { await flushPromises(); - pageview(router.currentRoute); + pageview(router.currentRoute.value); expect(event).toHaveBeenCalledWith("page_view", { send_page_view: true, diff --git a/test/api/query.spec.js b/test/api/query.spec.js index a098663..2a2a924 100644 --- a/test/api/query.spec.js +++ b/test/api/query.spec.js @@ -1,4 +1,4 @@ -import { createLocalVue } from "@vue/test-utils"; +import { createApp } from "vue"; import VueGtag from "@/index"; import query from "@/api/query"; @@ -15,9 +15,9 @@ describe("query", () => { }); test("passes argumemets to the gtag instance", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag); + app.use(VueGtag); jest.spyOn(window, "gtag").mockReturnValue(); @@ -27,9 +27,9 @@ describe("query", () => { }); test("passes argumemets to the custom named instance", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { globalObjectName: "foo", }); @@ -41,9 +41,9 @@ describe("query", () => { }); test("use query with gtag disabled", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { bootstrap: false, config: { id: 1, diff --git a/test/api/screenview.spec.js b/test/api/screenview.spec.js index d8ee3c0..d9c9513 100644 --- a/test/api/screenview.spec.js +++ b/test/api/screenview.spec.js @@ -1,4 +1,4 @@ -import { createLocalVue } from "@vue/test-utils"; +import { createApp } from "vue"; import VueGtag from "@/index"; import screenview from "@/api/screenview"; import event from "@/api/event"; @@ -11,9 +11,9 @@ describe("screenview", () => { }); test("fires a screenview as string", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { appName: "MyApp", config: { id: 1, @@ -29,9 +29,9 @@ describe("screenview", () => { }); test("fires a screenview as object", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { appName: "MyApp", config: { id: 1, @@ -49,9 +49,9 @@ describe("screenview", () => { }); test("uses a custom app_name", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { appName: "MyApp", config: { id: 1, diff --git a/test/basic.spec.js b/test/basic.spec.js index 887b2c1..1a58dc3 100644 --- a/test/basic.spec.js +++ b/test/basic.spec.js @@ -1,4 +1,4 @@ -import { createLocalVue } from "@vue/test-utils"; +import { createApp } from "vue"; import VueGtag from "@/index"; import bootstrap from "@/bootstrap"; @@ -10,13 +10,12 @@ describe("basic", () => { }); test("installs plugin", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag); + app.use(VueGtag); - expect(localVue.$gtag).toBeDefined(); - expect(localVue.prototype.$gtag).toBeDefined(); - expect(Object.keys(localVue.$gtag)).toMatchInlineSnapshot(` + expect(Object.keys(app.config.globalProperties.$gtag)) + .toMatchInlineSnapshot(` Array [ "query", "config", @@ -37,39 +36,27 @@ describe("basic", () => { }); test("installs plugin without window object", () => { - const localVue = createLocalVue(); + const app = createApp(); delete global.window; expect(() => { - localVue.use(VueGtag); - }).not.toThrow(); - }); - - test("can use API without window object", () => { - const localVue = createLocalVue(); - - localVue.use(VueGtag); - - delete global.window; - - expect(() => { - localVue.$gtag.query(); + app.use(VueGtag); }).not.toThrow(); }); test("bootstraps the plugin", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag); + app.use(VueGtag); expect(bootstrap).toHaveBeenCalled(); }); test("bootstrap is disabled", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { bootstrap: false, }); diff --git a/test/bootstrap.spec.js b/test/bootstrap.spec.js index 2155b25..cacc366 100644 --- a/test/bootstrap.spec.js +++ b/test/bootstrap.spec.js @@ -1,7 +1,7 @@ -import { createLocalVue } from "@vue/test-utils"; +import { createApp } from "vue"; import VueGtag from "@/index"; import MockDate from "mockdate"; -import VueRouter from "vue-router"; +import { createMemoryHistory, createRouter } from "vue-router"; import flushPromises from "flush-promises"; import registerGlobals from "@/register-globals"; import addRoutesTracker from "@/add-routes-tracker"; @@ -27,9 +27,9 @@ describe("boostrap", () => { }); test("loads gtag script", async () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { config: { id: 1, }, @@ -44,9 +44,9 @@ describe("boostrap", () => { }); test("loads gtag script with custom source", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { customResourceURL: "foo.com", config: { id: 1, @@ -60,9 +60,9 @@ describe("boostrap", () => { }); test("loads gtag script with custom preconnect origin", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { customPreconnectOrigin: "bar.com", config: { id: 1, @@ -76,9 +76,9 @@ describe("boostrap", () => { }); test("loads gtag script with defer script", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { deferScriptLoad: true, config: { id: 1, @@ -92,17 +92,17 @@ describe("boostrap", () => { }); test("attaches library to window scope", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag); + app.use(VueGtag); expect(registerGlobals).toHaveBeenCalledBefore(addConfiguration); }); test("fires a configuration hit on install", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { config: { id: 1, }, @@ -113,16 +113,16 @@ describe("boostrap", () => { }); test("enables automatic page tracker", () => { - const localVue = createLocalVue(); - const router = new VueRouter({ - mode: "abstract", + const app = createApp(); + const router = createRouter({ + history: createMemoryHistory(), routes: [ { name: "home", path: "/" }, { name: "about", path: "/about" }, ], }); - localVue.use( + app.use( VueGtag, { config: { @@ -137,9 +137,9 @@ describe("boostrap", () => { }); test("prevents script loading", async () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { disableScriptLoad: true, config: { id: 1, @@ -150,14 +150,14 @@ describe("boostrap", () => { }); test("uses onReady callback after script is loaded", async () => { - const localVue = createLocalVue(); + const app = createApp(); const spy = jest.fn(); Object.defineProperty(window, "gtag", { get: () => "global_registerd_value", }); - localVue.use(VueGtag, { + app.use(VueGtag, { onReady: spy, config: { id: 1, @@ -170,13 +170,13 @@ describe("boostrap", () => { }); test("uses onError callback after script failed loading", async () => { - const localVue = createLocalVue(); + const app = createApp(); const spy = jest.fn(); const error = new Error("error_value"); utils.load.mockRejectedValue(error); - localVue.use(VueGtag, { + app.use(VueGtag, { onError: spy, config: { id: 1, @@ -189,9 +189,9 @@ describe("boostrap", () => { }); test("bootstrap manually", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { bootstrap: false, config: { id: 1, diff --git a/test/register-globals.spec.js b/test/register-globals.spec.js index d7b9148..e32f828 100644 --- a/test/register-globals.spec.js +++ b/test/register-globals.spec.js @@ -1,4 +1,4 @@ -import { createLocalVue } from "@vue/test-utils"; +import { createApp } from "vue"; import VueGtag from "@/index"; import flushPromises from "flush-promises"; import * as api from "@/api"; @@ -19,9 +19,9 @@ describe("registerGlobals", () => { }); test("register global dataLayer and globalObject", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { config: { id: 1, }, @@ -32,9 +32,9 @@ describe("registerGlobals", () => { }); test("register globalObject with custom name", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { globalObjectName: "foo", config: { id: 1, @@ -46,9 +46,9 @@ describe("registerGlobals", () => { }); test("register dataLayer with custom name", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { globalDataLayerName: "bar", config: { id: 1, @@ -60,9 +60,9 @@ describe("registerGlobals", () => { }); test("first hit is current date", () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { config: { id: 1, }, @@ -72,9 +72,9 @@ describe("registerGlobals", () => { }); test("optOut when disabled", async () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueGtag, { + app.use(VueGtag, { enabled: false, config: { id: 1, diff --git a/test/track.spec.js b/test/track.spec.js index e3e8085..07c4c98 100644 --- a/test/track.spec.js +++ b/test/track.spec.js @@ -1,13 +1,14 @@ -import { mount, createLocalVue } from "@vue/test-utils"; +import { createApp } from "vue"; import VueGtag from "@/index"; -import VueRouter from "vue-router"; +import { createMemoryHistory, createRouter } from "vue-router"; import flushPromises from "flush-promises"; import * as api from "@/api"; import * as utils from "@/utils"; jest.mock("@/api"); -const App = { template: "
app
" }; +const Home = { template: "
" }; +const About = { template: "
" }; describe("track", () => { const { location } = window; @@ -26,9 +27,12 @@ describe("track", () => { }); beforeEach(() => { - router = new VueRouter({ - mode: "abstract", - routes: [{ name: "home", path: "/" }, { path: "/about" }], + router = createRouter({ + history: createMemoryHistory(), + routes: [ + { name: "home", path: "/", component: Home }, + { path: "/about", component: About }, + ], }); jest.spyOn(window.console, "warn").mockReturnValue(); @@ -41,10 +45,10 @@ describe("track", () => { describe("pageview", () => { test("tracks route with name", async () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueRouter); - localVue.use( + app.use(router); + app.use( VueGtag, { config: { @@ -54,8 +58,6 @@ describe("track", () => { router ); - mount(App, { router, localVue }); - router.push("/"); await flushPromises(); @@ -68,10 +70,10 @@ describe("track", () => { }); test("tracks route without name", async () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueRouter); - localVue.use( + app.use(router); + app.use( VueGtag, { config: { @@ -81,8 +83,6 @@ describe("track", () => { router ); - mount(App, { router, localVue }); - router.push("/about"); await flushPromises(); @@ -96,11 +96,11 @@ describe("track", () => { describe("screenview", () => { test("tracks route with screenview", async () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueRouter); + app.use(router); - localVue.use( + app.use( VueGtag, { pageTrackerScreenviewEnabled: true, @@ -112,8 +112,6 @@ describe("track", () => { router ); - mount(App, { router, localVue }); - router.push("/"); await flushPromises(); @@ -125,10 +123,10 @@ describe("track", () => { }); test("warns when no appName is provided", async () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueRouter); - localVue.use( + app.use(router); + app.use( VueGtag, { pageTrackerScreenviewEnabled: true, @@ -139,8 +137,6 @@ describe("track", () => { router ); - mount(App, { localVue, router }); - router.push("/"); await flushPromises(); @@ -151,10 +147,10 @@ describe("track", () => { }); test("warns when no route name is provided", async () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueRouter); - localVue.use( + app.use(router); + app.use( VueGtag, { appName: "MyApp", @@ -166,8 +162,6 @@ describe("track", () => { router ); - mount(App, { localVue, router }); - router.push("/about"); await flushPromises(); @@ -180,11 +174,11 @@ describe("track", () => { describe("pageTrackerTemplate", () => { test("tracks pageview", async () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueRouter); + app.use(router); - localVue.use( + app.use( VueGtag, { pageTrackerTemplate: (to, from) => ({ @@ -198,8 +192,6 @@ describe("track", () => { router ); - mount(App, { router, localVue }); - router.push("/"); await flushPromises(); @@ -213,11 +205,11 @@ describe("track", () => { }); test("tracks screenview", async () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueRouter); + app.use(router); - localVue.use( + app.use( VueGtag, { pageTrackerScreenviewEnabled: true, @@ -232,8 +224,6 @@ describe("track", () => { router ); - mount(App, { router, localVue }); - router.push("/"); await flushPromises(); @@ -251,11 +241,11 @@ describe("track", () => { describe("pageTrackerSkipSamePath", () => { test("tracks the same path twice", async () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueRouter); + app.use(router); - localVue.use( + app.use( VueGtag, { pageTrackerSkipSamePath: false, @@ -266,8 +256,6 @@ describe("track", () => { router ); - mount(App, { router, localVue }); - router.push("/about"); await flushPromises(); @@ -290,11 +278,11 @@ describe("track", () => { }); test("tracks the same path once", async () => { - const localVue = createLocalVue(); + const app = createApp(); - localVue.use(VueRouter); + app.use(router); - localVue.use( + app.use( VueGtag, { config: { @@ -304,8 +292,6 @@ describe("track", () => { router ); - mount(App, { router, localVue }); - router.push("/about"); await flushPromises(); diff --git a/yarn.lock b/yarn.lock index a403371..8d7648c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -457,6 +457,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.4.tgz#9eedf27e1998d87739fb5028a5120557c06a1a64" integrity sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA== +"@babel/parser@^7.12.0": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.1.tgz#1bd644b5db3f5797c4479d89ec1817fe02b84c47" + integrity sha512-muUGEKu8E/ftMTPlNp+mc6zL3E9zKWmF5sDHZ5MSsoTP9Wyz64AhEf9kD08xYJ7w6Hdcu8H550ircnPyWSIF0Q== + "@babel/parser@^7.12.13", "@babel/parser@^7.14.0": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.0.tgz#2f0ebfed92bcddcc8395b91f1895191ce2760380" @@ -1319,6 +1324,14 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.12.0": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.1.tgz#095bd12f1c08ab63eff6e8f7745fa7c9cc15a9db" + integrity sha512-S13Qe85fzLs3gYRUnrpyeIrBJIMYv33qSTg1qoBwiG6nPKwUWAD9odSzWhEedpwOIzSEI6gbdQIWEMiCI42iBA== + dependencies: + "@babel/helper-validator-identifier" "^7.14.0" + to-fast-properties "^2.0.0" + "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.14", "@babel/types@^7.13.16", "@babel/types@^7.13.17", "@babel/types@^7.14.0", "@babel/types@^7.4.4": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.0.tgz#3fc3fc74e0cdad878182e5f66cc6bcab1915a802" @@ -2072,14 +2085,53 @@ "@typescript-eslint/types" "4.22.1" eslint-visitor-keys "^2.0.0" -"@vue/test-utils@^1.0.0-beta.29": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-1.2.0.tgz#3bc8c17ed549157275f0aec6b95da40887f7297f" - integrity sha512-poBTLqeJYNq1TXVhtVfnY8vELUVOFdJY8KZZoUuaAkIqPTWsxonU1M8nMWpZT+xEMrM+49+YcuEqtMHVD9Q9gw== +"@vue/compiler-core@3.0.11": + version "3.0.11" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.0.11.tgz#5ef579e46d7b336b8735228758d1c2c505aae69a" + integrity sha512-6sFj6TBac1y2cWCvYCA8YzHJEbsVkX7zdRs/3yK/n1ilvRqcn983XvpBbnN3v4mZ1UiQycTvOiajJmOgN9EVgw== dependencies: - dom-event-types "^1.0.0" - lodash "^4.17.15" - pretty "^2.0.0" + "@babel/parser" "^7.12.0" + "@babel/types" "^7.12.0" + "@vue/shared" "3.0.11" + estree-walker "^2.0.1" + source-map "^0.6.1" + +"@vue/compiler-dom@3.0.11": + version "3.0.11" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.0.11.tgz#b15fc1c909371fd671746020ba55b5dab4a730ee" + integrity sha512-+3xB50uGeY5Fv9eMKVJs2WSRULfgwaTJsy23OIltKgMrynnIj8hTYY2UL97HCoz78aDw1VDXdrBQ4qepWjnQcw== + dependencies: + "@vue/compiler-core" "3.0.11" + "@vue/shared" "3.0.11" + +"@vue/reactivity@3.0.11": + version "3.0.11" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.0.11.tgz#07b588349fd05626b17f3500cbef7d4bdb4dbd0b" + integrity sha512-SKM3YKxtXHBPMf7yufXeBhCZ4XZDKP9/iXeQSC8bBO3ivBuzAi4aZi0bNoeE2IF2iGfP/AHEt1OU4ARj4ao/Xw== + dependencies: + "@vue/shared" "3.0.11" + +"@vue/runtime-core@3.0.11": + version "3.0.11" + resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.0.11.tgz#c52dfc6acf3215493623552c1c2919080c562e44" + integrity sha512-87XPNwHfz9JkmOlayBeCCfMh9PT2NBnv795DSbi//C/RaAnc/bGZgECjmkD7oXJ526BZbgk9QZBPdFT8KMxkAg== + dependencies: + "@vue/reactivity" "3.0.11" + "@vue/shared" "3.0.11" + +"@vue/runtime-dom@3.0.11": + version "3.0.11" + resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.0.11.tgz#7a552df21907942721feb6961c418e222a699337" + integrity sha512-jm3FVQESY3y2hKZ2wlkcmFDDyqaPyU3p1IdAX92zTNeCH7I8zZ37PtlE1b9NlCtzV53WjB4TZAYh9yDCMIEumA== + dependencies: + "@vue/runtime-core" "3.0.11" + "@vue/shared" "3.0.11" + csstype "^2.6.8" + +"@vue/shared@3.0.11": + version "3.0.11" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.0.11.tgz#20d22dd0da7d358bb21c17f9bde8628152642c77" + integrity sha512-b+zB8A2so8eCE0JsxjL24J7vdGl8rzPQ09hZNhystm+KqSbKcAej1A+Hbva1rCMmTTqA+hFnUSDc5kouEo0JzA== JSONStream@^1.0.4, JSONStream@^1.3.4, JSONStream@^1.3.5: version "1.3.5" @@ -3193,7 +3245,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.19.0, commander@^2.20.0, commander@~2.20.3: +commander@^2.20.0, commander@~2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -3258,15 +3310,6 @@ concat-with-sourcemaps@^1.1.0: dependencies: source-map "^0.6.1" -condense-newlines@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/condense-newlines/-/condense-newlines-0.2.1.tgz#3de985553139475d32502c83b02f60684d24c55f" - integrity sha1-PemFVTE5R10yUCyDsC9gaE0kxV8= - dependencies: - extend-shallow "^2.0.1" - is-whitespace "^0.3.0" - kind-of "^3.0.2" - config-chain@^1.1.12: version "1.1.12" resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" @@ -3632,6 +3675,11 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" +csstype@^2.6.8: + version "2.6.17" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.17.tgz#4cf30eb87e1d1a005d8b6510f95292413f6a1c0e" + integrity sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A== + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -3916,11 +3964,6 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-event-types@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dom-event-types/-/dom-event-types-1.0.0.tgz#5830a0a29e1bf837fe50a70cd80a597232813cae" - integrity sha512-2G2Vwi2zXTHBGqXHsJ4+ak/iP0N8Ar+G8a7LiD2oup5o4sQWytwqqrZu/O6hIMV0KMID2PL69OhpshLO0n7UJQ== - dom-serializer@0: version "0.2.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" @@ -4015,16 +4058,6 @@ editor@~1.0.0: resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742" integrity sha1-YMf4e9YrzGqJT6jM1q+3gjok90I= -editorconfig@^0.15.3: - version "0.15.3" - resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5" - integrity sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g== - dependencies: - commander "^2.19.0" - lru-cache "^4.1.5" - semver "^5.6.0" - sigmund "^1.0.1" - electron-to-chromium@^1.3.488: version "1.3.712" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.712.tgz#ae467ffe5f95961c6d41ceefe858fc36eb53b38f" @@ -4346,6 +4379,11 @@ estree-walker@^1.0.1: resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== +estree-walker@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -5876,11 +5914,6 @@ is-utf8@^0.2.1: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= -is-whitespace@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f" - integrity sha1-Fjnssb4DauxppUy7QBz77XEUq38= - is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -6440,17 +6473,6 @@ joycon@^2.2.5: resolved "https://registry.yarnpkg.com/joycon/-/joycon-2.2.5.tgz#8d4cf4cbb2544d7b7583c216fcdfec19f6be1615" integrity sha512-YqvUxoOcVPnCp0VU1/56f+iKSdvIRJYPznH22BdXV3xMk75SFXhWeJkZ8C9XxUWt1b5x2X1SxuFygW1U0FmkEQ== -js-beautify@^1.6.12: - version "1.13.13" - resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.13.13.tgz#756907d1728f329f2b84c42efd56ad17514620bf" - integrity sha512-oH+nc0U5mOAqX8M5JO1J0Pw/7Q35sAdOsM5W3i87pir9Ntx6P/5Gx1xLNoK+MGyvHk4rqqRCE4Oq58H6xl2W7A== - dependencies: - config-chain "^1.1.12" - editorconfig "^0.15.3" - glob "^7.1.3" - mkdirp "^1.0.4" - nopt "^5.0.0" - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -6999,7 +7021,7 @@ lowercase-keys@^1.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== -lru-cache@^4.0.1, lru-cache@^4.1.5: +lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== @@ -7341,11 +7363,6 @@ mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.0, mkdirp@~0.5.1: dependencies: minimist "^1.2.5" -mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - mockdate@^3.0.5: version "3.0.5" resolved "https://registry.yarnpkg.com/mockdate/-/mockdate-3.0.5.tgz#789be686deb3149e7df2b663d2bc4392bc3284fb" @@ -7503,13 +7520,6 @@ nopt@^4.0.1, nopt@^4.0.3: abbrev "1" osenv "^0.1.4" -nopt@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" - integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== - dependencies: - abbrev "1" - normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -8714,15 +8724,6 @@ pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" -pretty@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pretty/-/pretty-2.0.0.tgz#adbc7960b7bbfe289a557dc5f737619a220d06a5" - integrity sha1-rbx5YLe7/iiaVX3F9zdhmiINBqU= - dependencies: - condense-newlines "^0.2.1" - extend-shallow "^2.0.1" - js-beautify "^1.6.12" - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -9651,11 +9652,6 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== -sigmund@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" - integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= - signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" @@ -10765,10 +10761,10 @@ vue-eslint-parser@^7.6.0: esquery "^1.4.0" lodash "^4.17.15" -vue-router@^3.1.3: - version "3.5.1" - resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.5.1.tgz#edf3cf4907952d1e0583e079237220c5ff6eb6c9" - integrity sha512-RRQNLT8Mzr8z7eL4p7BtKvRaTSGdCbTy2+Mm5HTJvLGYSSeG9gDzNasJPP/yOYKLy+/cLG/ftrqq5fvkFwBJEw== +vue-router@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.0.6.tgz#91750db507d26642f225b0ec6064568e5fe448d6" + integrity sha512-Y04llmK2PyaESj+N33VxLjGCUDuv9t4q2OpItEGU7POZiuQZaugV6cJpE6Qm1sVFtxufodLKN2y2dQl9nk0Reg== vue-template-compiler@^2.6.10: version "2.6.12" @@ -10778,10 +10774,14 @@ vue-template-compiler@^2.6.10: de-indent "^1.0.2" he "^1.1.0" -vue@^2.6.12: - version "2.6.12" - resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.12.tgz#f5ebd4fa6bd2869403e29a896aed4904456c9123" - integrity sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg== +vue@^3.0.11: + version "3.0.11" + resolved "https://registry.yarnpkg.com/vue/-/vue-3.0.11.tgz#c82f9594cbf4dcc869241d4c8dd3e08d9a8f4b5f" + integrity sha512-3/eUi4InQz8MPzruHYSTQPxtM3LdZ1/S/BvaU021zBnZi0laRUyH6pfuE4wtUeLvI8wmUNwj5wrZFvbHUXL9dw== + dependencies: + "@vue/compiler-dom" "3.0.11" + "@vue/runtime-dom" "3.0.11" + "@vue/shared" "3.0.11" w3c-hr-time@^1.0.2: version "1.0.2"