diff --git a/.quasar/app.js b/.quasar/app.js index 98059068b..3458ef923 100644 --- a/.quasar/app.js +++ b/.quasar/app.js @@ -10,30 +10,44 @@ * Boot files are your "main.js" **/ -import { Quasar } from 'quasar'; -import RootComponent from 'app/src/App.vue'; -import createRouter from 'app/src/router/index'; + +import { Quasar } from 'quasar' +import RootComponent from 'app/src/App.vue' + + +import createRouter from 'app/src/router/index' + + + + export default async function (createAppFn, quasarUserOptions) { - // create store and router instances + // create store and router instances + + const router = typeof createRouter === 'function' + ? await createRouter({}) + : createRouter + - const router = typeof createRouter === 'function' ? await createRouter({}) : createRouter; + // Create the app instance. + // Here we inject into it the Quasar UI, the router & possibly the store. + const app = createAppFn(RootComponent) - // Create the app instance. - // Here we inject into it the Quasar UI, the router & possibly the store. - const app = createAppFn(RootComponent); + + app.config.devtools = true + - app.config.devtools = true; + app.use(Quasar, quasarUserOptions) - app.use(Quasar, quasarUserOptions); + - // Expose the app, the router and the store. - // Note that we are not mounting the app here, since bootstrapping will be - // different depending on whether we are in a browser or on the server. - return { - app, - - router, - }; + // Expose the app, the router and the store. + // Note that we are not mounting the app here, since bootstrapping will be + // different depending on whether we are in a browser or on the server. + return { + app, + + router + } } diff --git a/.quasar/client-entry.js b/.quasar/client-entry.js index 347747d8d..f66da2ed1 100644 --- a/.quasar/client-entry.js +++ b/.quasar/client-entry.js @@ -10,91 +10,140 @@ * Boot files are your "main.js" **/ -import { createApp } from 'vue'; -import '@quasar/extras/roboto-font/roboto-font.css'; +import { createApp } from 'vue' + + + + + + + +import '@quasar/extras/roboto-font/roboto-font.css' + +import '@quasar/extras/material-icons/material-icons.css' + + -import '@quasar/extras/material-icons/material-icons.css'; // We load Quasar stylesheet file -import 'quasar/dist/quasar.sass'; +import 'quasar/dist/quasar.sass' -import 'src/css/app.scss'; -import createQuasarApp from './app.js'; -import quasarUserOptions from './quasar-user-options.js'; -console.info('[Quasar] Running SPA.'); -const publicPath = ``; +import 'src/css/app.scss' -async function start({ app, router }, bootFiles) { - let hasRedirected = false; - const getRedirectUrl = (url) => { - try { - return router.resolve(url).href; - } catch (err) {} - return Object(url) === url ? null : url; - }; - const redirect = (url) => { - hasRedirected = true; +import createQuasarApp from './app.js' +import quasarUserOptions from './quasar-user-options.js' - if (typeof url === 'string' && /^https?:\/\//.test(url)) { - window.location.href = url; - return; - } - const href = getRedirectUrl(url); - // continue if we didn't fail to resolve the url - if (href !== null) { - window.location.href = href; - window.location.reload(); - } - }; - const urlPath = window.location.href.replace(window.location.origin, ''); - for (let i = 0; hasRedirected === false && i < bootFiles.length; i++) { - try { - await bootFiles[i]({ - app, - router, - ssrContext: null, - redirect, - urlPath, - publicPath, - }); - } catch (err) { - if (err && err.url) { - redirect(err.url); - return; - } +console.info('[Quasar] Running SPA.') - console.error('[Quasar] boot error:', err); - return; - } + + + + +const publicPath = `` + + +async function start ({ app, router }, bootFiles) { + + + + let hasRedirected = false + const getRedirectUrl = url => { + try { return router.resolve(url).href } + catch (err) {} + + return Object(url) === url + ? null + : url + } + const redirect = url => { + hasRedirected = true + + if (typeof url === 'string' && /^https?:\/\//.test(url)) { + window.location.href = url + return } - if (hasRedirected === true) { - return; + const href = getRedirectUrl(url) + + // continue if we didn't fail to resolve the url + if (href !== null) { + window.location.href = href + window.location.reload() } + } - app.use(router); + const urlPath = window.location.href.replace(window.location.origin, '') + + for (let i = 0; hasRedirected === false && i < bootFiles.length; i++) { + try { + await bootFiles[i]({ + app, + router, + + ssrContext: null, + redirect, + urlPath, + publicPath + }) + } + catch (err) { + if (err && err.url) { + redirect(err.url) + return + } + + console.error('[Quasar] boot error:', err) + return + } + } + + if (hasRedirected === true) { + return + } + + + app.use(router) + + + + + + + + app.mount('#q-app') + + + + + - app.mount('#q-app'); } -createQuasarApp(createApp, quasarUserOptions).then((app) => { +createQuasarApp(createApp, quasarUserOptions) + + .then(app => { return Promise.all([ - import(/* webpackMode: "eager" */ 'boot/i18n'), + + import(/* webpackMode: "eager" */ 'boot/i18n'), + + import(/* webpackMode: "eager" */ 'boot/axios') + + ]).then(bootFiles => { + const boot = bootFiles + .map(entry => entry.default) + .filter(entry => typeof entry === 'function') - import(/* webpackMode: "eager" */ 'boot/axios'), - ]).then((bootFiles) => { - const boot = bootFiles.map((entry) => entry.default).filter((entry) => typeof entry === 'function'); + start(app, boot) + }) + }) - start(app, boot); - }); -}); diff --git a/.quasar/client-prefetch.js b/.quasar/client-prefetch.js index d8a377bc6..adc068154 100644 --- a/.quasar/client-prefetch.js +++ b/.quasar/client-prefetch.js @@ -10,104 +10,104 @@ * Boot files are your "main.js" **/ -import App from 'app/src/App.vue'; -let appPrefetch = - typeof App.preFetch === 'function' - ? App.preFetch - : // Class components return the component options (and the preFetch hook) inside __c property - App.__c !== void 0 && typeof App.__c.preFetch === 'function' - ? App.__c.preFetch - : false; -function getMatchedComponents(to, router) { - const route = to ? (to.matched ? to : router.resolve(to).route) : router.currentRoute; - if (!route) { - return []; + + +import App from 'app/src/App.vue' +let appPrefetch = typeof App.preFetch === 'function' + ? App.preFetch + : ( + // Class components return the component options (and the preFetch hook) inside __c property + App.__c !== void 0 && typeof App.__c.preFetch === 'function' + ? App.__c.preFetch + : false + ) + + +function getMatchedComponents (to, router) { + const route = to + ? (to.matched ? to : router.resolve(to).route) + : router.currentRoute + + if (!route) { return [] } + + return Array.prototype.concat.apply([], route.matched.map(m => { + return Object.keys(m.components).map(key => { + const comp = m.components[key] + return { + path: m.path, + c: comp + } + }) + })) +} + +export function addPreFetchHooks (router, publicPath) { + // Add router hook for handling preFetch. + // Doing it after initial route is resolved so that we don't double-fetch + // the data that we already have. Using router.beforeResolve() so that all + // async components are resolved. + router.beforeResolve((to, from, next) => { + const + urlPath = window.location.href.replace(window.location.origin, ''), + matched = getMatchedComponents(to, router), + prevMatched = getMatchedComponents(from, router) + + let diffed = false + const preFetchList = matched + .filter((m, i) => { + return diffed || (diffed = ( + !prevMatched[i] || + prevMatched[i].c !== m.c || + m.path.indexOf('/:') > -1 // does it has params? + )) + }) + .filter(m => m.c !== void 0 && ( + typeof m.c.preFetch === 'function' + // Class components return the component options (and the preFetch hook) inside __c property + || (m.c.__c !== void 0 && typeof m.c.__c.preFetch === 'function') + )) + .map(m => m.c.__c !== void 0 ? m.c.__c.preFetch : m.c.preFetch) + + + if (appPrefetch !== false) { + preFetchList.unshift(appPrefetch) + appPrefetch = false + } + + + if (preFetchList.length === 0) { + return next() } - return Array.prototype.concat.apply( - [], - route.matched.map((m) => { - return Object.keys(m.components).map((key) => { - const comp = m.components[key]; - return { - path: m.path, - c: comp, - }; - }); - }) - ); -} - -export function addPreFetchHooks(router, publicPath) { - // Add router hook for handling preFetch. - // Doing it after initial route is resolved so that we don't double-fetch - // the data that we already have. Using router.beforeResolve() so that all - // async components are resolved. - router.beforeResolve((to, from, next) => { - const urlPath = window.location.href.replace(window.location.origin, ''), - matched = getMatchedComponents(to, router), - prevMatched = getMatchedComponents(from, router); - - let diffed = false; - const preFetchList = matched - .filter((m, i) => { - return ( - diffed || - (diffed = - !prevMatched[i] || prevMatched[i].c !== m.c || m.path.indexOf('/:') > -1) // does it has params? - ); - }) - .filter( - (m) => - m.c !== void 0 && - (typeof m.c.preFetch === 'function' || - // Class components return the component options (and the preFetch hook) inside __c property - (m.c.__c !== void 0 && typeof m.c.__c.preFetch === 'function')) - ) - .map((m) => (m.c.__c !== void 0 ? m.c.__c.preFetch : m.c.preFetch)); - - if (appPrefetch !== false) { - preFetchList.unshift(appPrefetch); - appPrefetch = false; - } - - if (preFetchList.length === 0) { - return next(); - } - - let hasRedirected = false; - const redirect = (url) => { - hasRedirected = true; - next(url); - }; - const proceed = () => { - if (hasRedirected === false) { - next(); - } - }; - - preFetchList - .reduce( - (promise, preFetch) => - promise.then( - () => - hasRedirected === false && - preFetch({ - currentRoute: to, - previousRoute: from, - redirect, - urlPath, - publicPath, - }) - ), - Promise.resolve() - ) - .then(proceed) - .catch((e) => { - console.error(e); - proceed(); - }); - }); + let hasRedirected = false + const redirect = url => { + hasRedirected = true + next(url) + } + const proceed = () => { + + if (hasRedirected === false) { next() } + } + + + + preFetchList.reduce( + (promise, preFetch) => promise.then(() => hasRedirected === false && preFetch({ + + currentRoute: to, + previousRoute: from, + redirect, + urlPath, + publicPath + })), + Promise.resolve() + ) + .then(proceed) + .catch(e => { + console.error(e) + proceed() + }) + }) } diff --git a/.quasar/quasar-user-options.js b/.quasar/quasar-user-options.js index 2067ab15e..b7701a094 100644 --- a/.quasar/quasar-user-options.js +++ b/.quasar/quasar-user-options.js @@ -10,6 +10,11 @@ * Boot files are your "main.js" **/ -import { Notify } from 'quasar'; -export default { config: {}, plugins: { Notify } }; + +import {Notify} from 'quasar' + + + +export default { config: {},plugins: {Notify} } +