1*90c8c64dSAndroid Build Coastguard Workerimport { createRouter, createWebHistory } from 'vue-router' 2*90c8c64dSAndroid Build Coastguard Workerimport PackageAnalysis from '@/views/PackageAnalysis.vue' 3*90c8c64dSAndroid Build Coastguard Workerimport Demo from'@/views/Demo.vue' 4*90c8c64dSAndroid Build Coastguard Workerimport About from '@/views/About.vue' 5*90c8c64dSAndroid Build Coastguard Workerimport NotFound from '@/views/NotFound.vue' 6*90c8c64dSAndroid Build Coastguard Worker 7*90c8c64dSAndroid Build Coastguard Workerconst routes = [ 8*90c8c64dSAndroid Build Coastguard Worker { 9*90c8c64dSAndroid Build Coastguard Worker path: '/', 10*90c8c64dSAndroid Build Coastguard Worker name: 'Analysis', 11*90c8c64dSAndroid Build Coastguard Worker component: PackageAnalysis, 12*90c8c64dSAndroid Build Coastguard Worker meta: { 13*90c8c64dSAndroid Build Coastguard Worker title: 'Analyse OTA package - from AOSP' 14*90c8c64dSAndroid Build Coastguard Worker } 15*90c8c64dSAndroid Build Coastguard Worker }, 16*90c8c64dSAndroid Build Coastguard Worker { 17*90c8c64dSAndroid Build Coastguard Worker path: '/demo', 18*90c8c64dSAndroid Build Coastguard Worker name: 'Demo', 19*90c8c64dSAndroid Build Coastguard Worker component: Demo 20*90c8c64dSAndroid Build Coastguard Worker }, 21*90c8c64dSAndroid Build Coastguard Worker { 22*90c8c64dSAndroid Build Coastguard Worker path: '/about', 23*90c8c64dSAndroid Build Coastguard Worker name: 'About', 24*90c8c64dSAndroid Build Coastguard Worker component: About 25*90c8c64dSAndroid Build Coastguard Worker }, 26*90c8c64dSAndroid Build Coastguard Worker { 27*90c8c64dSAndroid Build Coastguard Worker path: '/:catchAll(.*)', 28*90c8c64dSAndroid Build Coastguard Worker name: 'Not Found', 29*90c8c64dSAndroid Build Coastguard Worker component: NotFound 30*90c8c64dSAndroid Build Coastguard Worker } 31*90c8c64dSAndroid Build Coastguard Worker] 32*90c8c64dSAndroid Build Coastguard Worker 33*90c8c64dSAndroid Build Coastguard Workerconst router = createRouter({ 34*90c8c64dSAndroid Build Coastguard Worker history: createWebHistory(process.env.BASE_URL), 35*90c8c64dSAndroid Build Coastguard Worker routes 36*90c8c64dSAndroid Build Coastguard Worker}) 37*90c8c64dSAndroid Build Coastguard Worker 38*90c8c64dSAndroid Build Coastguard Worker// This callback runs before every route change, including on page load. 39*90c8c64dSAndroid Build Coastguard Workerrouter.beforeEach((to, from, next) => { 40*90c8c64dSAndroid Build Coastguard Worker // This goes through the matched routes from last to first, finding the closest route with a title. 41*90c8c64dSAndroid Build Coastguard Worker // e.g., if we have `/some/deep/nested/route` and `/some`, `/deep`, and `/nested` have titles, 42*90c8c64dSAndroid Build Coastguard Worker // `/nested`'s will be chosen. 43*90c8c64dSAndroid Build Coastguard Worker const nearestWithTitle = to.matched.slice().reverse().find(r => r.meta && r.meta.title); 44*90c8c64dSAndroid Build Coastguard Worker 45*90c8c64dSAndroid Build Coastguard Worker // Find the nearest route element with meta tags. 46*90c8c64dSAndroid Build Coastguard Worker const nearestWithMeta = to.matched.slice().reverse().find(r => r.meta && r.meta.metaTags); 47*90c8c64dSAndroid Build Coastguard Worker 48*90c8c64dSAndroid Build Coastguard Worker const previousNearestWithMeta = from.matched.slice().reverse().find(r => r.meta && r.meta.metaTags); 49*90c8c64dSAndroid Build Coastguard Worker 50*90c8c64dSAndroid Build Coastguard Worker // If a route with a title was found, set the document (page) title to that value. 51*90c8c64dSAndroid Build Coastguard Worker if(nearestWithTitle) { 52*90c8c64dSAndroid Build Coastguard Worker document.title = nearestWithTitle.meta.title; 53*90c8c64dSAndroid Build Coastguard Worker } else if(previousNearestWithMeta) { 54*90c8c64dSAndroid Build Coastguard Worker document.title = previousNearestWithMeta.meta.title; 55*90c8c64dSAndroid Build Coastguard Worker } 56*90c8c64dSAndroid Build Coastguard Worker 57*90c8c64dSAndroid Build Coastguard Worker // Remove any stale meta tags from the document using the key attribute we set below. 58*90c8c64dSAndroid Build Coastguard Worker Array.from(document.querySelectorAll('[data-vue-router-controlled]')).map(el => el.parentNode.removeChild(el)); 59*90c8c64dSAndroid Build Coastguard Worker 60*90c8c64dSAndroid Build Coastguard Worker // Skip rendering meta tags if there are none. 61*90c8c64dSAndroid Build Coastguard Worker if(!nearestWithMeta) return next(); 62*90c8c64dSAndroid Build Coastguard Worker 63*90c8c64dSAndroid Build Coastguard Worker // Turn the meta tag definitions into actual elements in the head. 64*90c8c64dSAndroid Build Coastguard Worker nearestWithMeta.meta.metaTags.map(tagDef => { 65*90c8c64dSAndroid Build Coastguard Worker const tag = document.createElement('meta'); 66*90c8c64dSAndroid Build Coastguard Worker 67*90c8c64dSAndroid Build Coastguard Worker Object.keys(tagDef).forEach(key => { 68*90c8c64dSAndroid Build Coastguard Worker tag.setAttribute(key, tagDef[key]); 69*90c8c64dSAndroid Build Coastguard Worker }); 70*90c8c64dSAndroid Build Coastguard Worker 71*90c8c64dSAndroid Build Coastguard Worker // We use this to track which meta tags we create so we don't interfere with other ones. 72*90c8c64dSAndroid Build Coastguard Worker tag.setAttribute('data-vue-router-controlled', ''); 73*90c8c64dSAndroid Build Coastguard Worker 74*90c8c64dSAndroid Build Coastguard Worker return tag; 75*90c8c64dSAndroid Build Coastguard Worker }) 76*90c8c64dSAndroid Build Coastguard Worker // Add the meta tags to the document head. 77*90c8c64dSAndroid Build Coastguard Worker .forEach(tag => document.head.appendChild(tag)); 78*90c8c64dSAndroid Build Coastguard Worker 79*90c8c64dSAndroid Build Coastguard Worker next(); 80*90c8c64dSAndroid Build Coastguard Worker}); 81*90c8c64dSAndroid Build Coastguard Worker 82*90c8c64dSAndroid Build Coastguard Workerexport default router 83