From 5bae10d8426b5838eb74f06aa533c2c3277e1a3d Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Fri, 19 Aug 2022 17:32:07 +0200 Subject: [PATCH] build: composables --- build/configs.js | 29 +- dist/composables.js | 87 ++++++ dist/composables.mjs | 81 +++++ examples/webpack.config.js | 2 +- package.json | 17 ++ src/{composables.js => composables/index.js} | 34 ++- src/entries/cjs.js | 3 + src/entries/esm.js | 10 + src/index.js | 295 +------------------ src/router.js | 294 ++++++++++++++++++ yarn.lock | 36 +-- 11 files changed, 566 insertions(+), 322 deletions(-) create mode 100644 dist/composables.js create mode 100644 dist/composables.mjs rename src/{composables.js => composables/index.js} (50%) create mode 100644 src/entries/cjs.js create mode 100644 src/entries/esm.js create mode 100644 src/router.js diff --git a/build/configs.js b/build/configs.js index 33117a641..0910f9c0f 100644 --- a/build/configs.js +++ b/build/configs.js @@ -5,8 +5,7 @@ const cjs = require('@rollup/plugin-commonjs') const node = require('@rollup/plugin-node-resolve').nodeResolve const replace = require('rollup-plugin-replace') const version = process.env.VERSION || require('../package.json').version -const banner = -`/*! +const banner = `/*! * vue-router v${version} * (c) ${new Date().getFullYear()} Evan You * @license MIT @@ -31,27 +30,40 @@ module.exports = [ format: 'cjs' }, { + input: resolve('src/entries/esm.js'), file: resolve('dist/vue-router.esm.js'), format: 'es' }, { + input: resolve('src/entries/esm.js'), file: resolve('dist/vue-router.esm.browser.js'), format: 'es', env: 'development', transpile: false }, { + input: resolve('src/entries/esm.js'), file: resolve('dist/vue-router.esm.browser.min.js'), format: 'es', env: 'production', transpile: false + }, + { + input: resolve('src/composables/index.js'), + file: resolve('./dist/composables.mjs'), + format: 'es' + }, + { + input: resolve('src/composables/index.js'), + file: resolve('./dist/composables.js'), + format: 'cjs' } ].map(genConfig) function genConfig (opts) { const config = { input: { - input: resolve('src/index.js'), + input: opts.input || resolve('src/index.js'), plugins: [ flow(), node(), @@ -59,7 +71,8 @@ function genConfig (opts) { replace({ __VERSION__: version }) - ] + ], + external: ['vue'] }, output: { file: opts.file, @@ -70,9 +83,11 @@ function genConfig (opts) { } if (opts.env) { - config.input.plugins.unshift(replace({ - 'process.env.NODE_ENV': JSON.stringify(opts.env) - })) + config.input.plugins.unshift( + replace({ + 'process.env.NODE_ENV': JSON.stringify(opts.env) + }) + ) } if (opts.transpile !== false) { diff --git a/dist/composables.js b/dist/composables.js new file mode 100644 index 000000000..2f1c92291 --- /dev/null +++ b/dist/composables.js @@ -0,0 +1,87 @@ +/*! + * vue-router v3.5.4 + * (c) 2022 Evan You + * @license MIT + */ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var vue = require('vue'); + +function useRouter () { + var i = vue.getCurrentInstance(); + if (process.env.NODE_ENV !== 'production' && !i) { + throwNoCurrentInstance('useRouter'); + } + + return i.proxy.$root.$router +} + +function useRoute () { + var i = vue.getCurrentInstance(); + if (process.env.NODE_ENV !== 'production' && !i) { + throwNoCurrentInstance('useRoute'); + } + + var root = i.proxy.$root; + if (!root._$route) { + var route = vue.effectScope(true).run( + function () { return vue.shallowReactive(Object.assign({}, root.$router.currentRoute)); } + ); + root._$route = route; + + root.$router.afterEach(function (to) { + Object.assign(route, to); + }); + } + + return root._$route +} + +// TODO: +// export function useLink () {} + +function onBeforeRouteUpdate (guard) { + var i = vue.getCurrentInstance(); + if (process.env.NODE_ENV !== 'production' && !i) { + throwNoCurrentInstance('onBeforeRouteUpdate'); + } + + var router = useRouter(); + + var target = i.proxy; + // find the nearest routerview to know the depth + while (target && target.$vnode && target.$vnode.data && target.$vnode.data.routerViewDepth == null) { + target = target.$parent; + } + + var depth = target && target.$vnode && target.$vnode.data ? target.$vnode.data.routerViewDepth : null; + + console.log('found depth', depth); + + // TODO: allow multiple guards? + i.proxy.$options.beforeRouteUpdate = guard; + + var removeGuard = router.beforeEach(function (to, from, next) { + // TODO: check it's an update + return guard(to, from, next) + }); + + vue.onUnmounted(removeGuard); + + return removeGuard +} + +// TODO: +// export function onBeforeRouteLeave () {} + +function throwNoCurrentInstance (method) { + throw new Error( + ("[vue-router]: Missing current instance. " + method + "() must be called inside