From 56f0b61d1b0e8787245640fe4136bfda0b14ab5d Mon Sep 17 00:00:00 2001 From: pimlie Date: Wed, 20 Feb 2019 17:05:51 +0100 Subject: [PATCH] feat: add es build fix: add global window detection chore: update deps --- .gitignore | 1 + package.json | 6 +- scripts/rollup.config.js | 3 +- src/client/batchUpdate.js | 6 +- src/client/refresh.js | 10 ++- src/server/inject.js | 11 +++- src/shared/getMetaInfo.js | 22 +------ src/shared/mixin.js | 63 +++--------------- src/shared/typeof.js | 1 - test/plugin-browser.test.js | 9 ++- yarn.lock | 124 +++++++++++++++++++++++++++++++++++- 11 files changed, 165 insertions(+), 91 deletions(-) diff --git a/.gitignore b/.gitignore index 5b49ade..003e265 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,7 @@ package-lock.json # built code lib +es # examples yarn lock examples/yarn.lock diff --git a/package.json b/package.json index ebc3efb..3da4457 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "author": "Declan de Wet ", "bugs": "https://github.com/nuxt/vue-meta/issues", "scripts": { - "build": "rimraf lib && rollup -c scripts/rollup.config.js", + "build": "scripts/build.sh", "codecov": "codecov", "deploy": "npm version", "dev": "cd examples && npm run dev && cd ..", @@ -28,6 +28,7 @@ "vue-hooks": "^0.3.2" }, "devDependencies": { + "@babel/cli": "^7.2.3", "@babel/core": "^7.3.3", "@babel/node": "^7.2.2", "@babel/preset-env": "^7.3.1", @@ -67,6 +68,7 @@ }, "files": [ "lib", + "es", "types/index.d.ts", "types/vue.d.ts" ], @@ -88,7 +90,7 @@ "license": "MIT", "main": "lib/vue-meta.common.js", "web": "lib/vue-meta.js", - "module": "src/index.js", + "module": "es/index.js", "typings": "types/index.d.ts", "repository": { "url": "git@github.com/nuxt/vue-meta.git", diff --git a/scripts/rollup.config.js b/scripts/rollup.config.js index 04c184d..e6a2d0f 100644 --- a/scripts/rollup.config.js +++ b/scripts/rollup.config.js @@ -48,8 +48,7 @@ export default [{ output: { ...baseConfig.output, file: pkg.main, - format: 'cjs', - intro: 'var window' + format: 'cjs' }, external: Object.keys(pkg.dependencies) }] diff --git a/src/client/batchUpdate.js b/src/client/batchUpdate.js index 765a92b..909000d 100644 --- a/src/client/batchUpdate.js +++ b/src/client/batchUpdate.js @@ -1,8 +1,8 @@ -import { isUndefined } from '../shared/typeof' +import { hasGlobalWindow } from '../shared/window' // fallback to timers if rAF not present -const stopUpdate = (!isUndefined(window) ? window.cancelAnimationFrame : null) || clearTimeout -const startUpdate = (!isUndefined(window) ? window.requestAnimationFrame : null) || (cb => setTimeout(cb, 0)) +const stopUpdate = (hasGlobalWindow ? window.cancelAnimationFrame : null) || clearTimeout +const startUpdate = (hasGlobalWindow ? window.requestAnimationFrame : null) || (cb => setTimeout(cb, 0)) /** * Performs a batched update. Uses requestAnimationFrame to prevent diff --git a/src/client/refresh.js b/src/client/refresh.js index c6b5354..cabc8da 100644 --- a/src/client/refresh.js +++ b/src/client/refresh.js @@ -3,6 +3,14 @@ import { isFunction } from '../shared/typeof' import updateClientMetaInfo from './updateClientMetaInfo' export default function _refresh(options = {}) { + const escapeSequences = [ + [/&/g, '\u0026'], + [//g, '\u003e'], + [/"/g, '\u0022'], + [/'/g, '\u0027'] + ] + /** * When called, will update the current meta info with new meta info. * Useful when updating meta info as the result of an asynchronous @@ -14,7 +22,7 @@ export default function _refresh(options = {}) { * @return {Object} - new meta info */ return function refresh() { - const metaInfo = getMetaInfo(options, this.$root) + const metaInfo = getMetaInfo(options, this.$root, escapeSequences) const tags = updateClientMetaInfo(options, metaInfo) // emit "event" with new info diff --git a/src/server/inject.js b/src/server/inject.js index 1245cba..f094198 100644 --- a/src/server/inject.js +++ b/src/server/inject.js @@ -3,6 +3,14 @@ import { metaInfoOptionKeys } from '../shared/constants' import generateServerInjector from './generateServerInjector' export default function _inject(options = {}) { + const escapeSequences = [ + [/&/g, '&'], + [//g, '>'], + [/"/g, '"'], + [/'/g, '''] + ] + /** * Converts the state of the meta info object such that each item * can be compiled to a tag string on the server @@ -10,10 +18,9 @@ export default function _inject(options = {}) { * @this {Object} - Vue instance - ideally the root component * @return {Object} - server meta info with `toString` methods */ - return function inject() { // get meta info with sensible defaults - const metaInfo = getMetaInfo(options, this.$root) + const metaInfo = getMetaInfo(options, this.$root, escapeSequences) // generate server injectors for (const key in metaInfo) { diff --git a/src/shared/getMetaInfo.js b/src/shared/getMetaInfo.js index 9119ffe..08f8eaa 100644 --- a/src/shared/getMetaInfo.js +++ b/src/shared/getMetaInfo.js @@ -1,25 +1,9 @@ import deepmerge from 'deepmerge' import isPlainObject from 'lodash.isplainobject' -import { isUndefined, isFunction, isString } from '../shared/typeof' +import { isFunction, isString } from './typeof' import isArray from './isArray' import getComponentOption from './getComponentOption' -const escapeHTML = str => isUndefined(window) - // server-side escape sequence - ? String(str) - .replace(/&/g, '&') - .replace(//g, '>') - .replace(/"/g, '"') - .replace(/'/g, ''') - // client-side escape sequence - : String(str) - .replace(/&/g, '\u0026') - .replace(//g, '\u003e') - .replace(/"/g, '\u0022') - .replace(/'/g, '\u0027') - const applyTemplate = (component, template, chunk) => isFunction(template) ? template.call(component, chunk) : template.replace(/%s/g, chunk) @@ -30,7 +14,7 @@ const applyTemplate = (component, template, chunk) => * @param {Object} component - the Vue instance to get meta info from * @return {Object} - returned meta info */ -export default function getMetaInfo({ keyName, tagIDKeyName, metaTemplateKeyName, contentKeyName } = {}, component) { +export default function getMetaInfo({ keyName, tagIDKeyName, metaTemplateKeyName, contentKeyName } = {}, component, escapeSequences = []) { // set some sane defaults const defaultInfo = { title: '', @@ -139,7 +123,7 @@ export default function getMetaInfo({ keyName, tagIDKeyName, metaTemplateKeyName if (!isDisabled) { if (isString(val)) { - escaped[key] = escapeHTML(val) + escaped[key] = escapeSequences.reduce((val, [v, r]) => val.replace(v, r), val) } else if (isPlainObject(val)) { escaped[key] = escape(val) } else if (isArray(val)) { diff --git a/src/shared/mixin.js b/src/shared/mixin.js index 4976ff0..59225a9 100644 --- a/src/shared/mixin.js +++ b/src/shared/mixin.js @@ -1,6 +1,6 @@ import triggerUpdate from '../client/triggerUpdate' -import { isUndefined, isFunction } from '../shared/typeof' -import { ensuredPush } from '../shared/ensure' +import { isUndefined, isFunction } from './typeof' +import { ensuredPush } from './ensure' export default function createMixin(options) { // for which Vue lifecycle hooks should the metaInfo be refreshed @@ -35,10 +35,6 @@ export default function createMixin(options) { } } - updateOnLifecycleHook.forEach((lifecycleHook) => { - ensuredPush(this.$options, lifecycleHook, () => triggerUpdate(this, lifecycleHook)) - }) - // force an initial refresh on page load and prevent other lifecycleHooks // to triggerUpdate until this initial refresh is finished // this is to make sure that when a page is opened in an inactive tab which @@ -49,6 +45,7 @@ export default function createMixin(options) { if (!this.$root._vueMetaInitialized) { ensuredPush(this.$options, 'mounted', () => { if (!this.$root._vueMetaInitialized) { + // refresh meta in nextTick so all child components have loaded this.$nextTick(function () { this.$root.$meta().refresh() this.$root._vueMetaInitialized = true @@ -60,6 +57,11 @@ export default function createMixin(options) { // do not trigger refresh on the server side if (!this.$isServer) { + // no need to add this hooks on server side, there we only need the mounted hook above + updateOnLifecycleHook.forEach((lifecycleHook) => { + ensuredPush(this.$options, lifecycleHook, () => triggerUpdate(this, lifecycleHook)) + }) + // re-render meta data when returning from a child component to parent ensuredPush(this.$options, 'destroyed', () => { // Wait that element is hidden before refreshing meta tags (to support animations) @@ -80,54 +82,5 @@ export default function createMixin(options) { } } } - /* Not yet removed - created() { - // if computed $metaInfo exists, watch it for updates & trigger a refresh - // when it changes (i.e. automatically handle async actions that affect metaInfo) - // credit for this suggestion goes to [Sébastien Chopin](https://github.com/Atinux) - if (!this.$isServer && this.$metaInfo) { - this.$watch('$metaInfo', () => triggerUpdate(this)) - } - - }, - activated() { - if (this._hasMetaInfo) { - triggerUpdate(this) - } - }, - deactivated() { - if (this._hasMetaInfo) { - triggerUpdate(this) - } - }, - beforeMount() { - if (this._hasMetaInfo) { - triggerUpdate(this) - } - }, - destroyed() { - // do not trigger refresh on the server side - if (this.$isServer) { - return - } - - // re-render meta data when returning from a child component to parent - if (this._hasMetaInfo) { - // Wait that element is hidden before refreshing meta tags (to support animations) - const interval = setInterval(() => { - if (this.$el && this.$el.offsetParent !== null) { - return - } - - clearInterval(interval) - - if (!this.$parent) { - return - } - - triggerUpdate(this) - }, 50) - } - }/**/ } } diff --git a/src/shared/typeof.js b/src/shared/typeof.js index 6d796fc..c6b39b2 100644 --- a/src/shared/typeof.js +++ b/src/shared/typeof.js @@ -1,4 +1,3 @@ - export function isUndefined(arg) { return typeof arg === 'undefined' } diff --git a/test/plugin-browser.test.js b/test/plugin-browser.test.js index 59f84c9..b8caedd 100644 --- a/test/plugin-browser.test.js +++ b/test/plugin-browser.test.js @@ -43,7 +43,10 @@ describe('plugin', () => { test('updates can be paused and resumed', async () => { const _triggerUpdate = jest.requireActual('../src/client/triggerUpdate').default + const _batchUpdate = jest.requireActual('../src/client/batchUpdate').default + const triggerUpdateSpy = triggerUpdate.mockImplementation(_triggerUpdate) + const batchUpdateSpy = batchUpdate.mockImplementation(_batchUpdate) const Component = Vue.component('test-component', { metaInfo() { @@ -72,7 +75,7 @@ describe('plugin', () => { expect(wrapper.vm.$root._vueMetaInitialized).toBe(false) expect(wrapper.vm.$root._vueMetaPaused).toBeFalsy() expect(triggerUpdateSpy).toHaveBeenCalledTimes(1) - expect(batchUpdate).not.toHaveBeenCalled() + expect(batchUpdateSpy).not.toHaveBeenCalled() jest.clearAllMocks() await vmTick(wrapper.vm) @@ -83,7 +86,7 @@ describe('plugin', () => { expect(wrapper.vm.$root._vueMetaInitialized).toBe(true) expect(wrapper.vm.$root._vueMetaPaused).toBeFalsy() expect(triggerUpdateSpy).toHaveBeenCalledTimes(1) - expect(batchUpdate).toHaveBeenCalledTimes(1) + expect(batchUpdateSpy).toHaveBeenCalledTimes(1) jest.clearAllMocks() wrapper.vm.$meta().pause() @@ -94,7 +97,7 @@ describe('plugin', () => { expect(wrapper.vm.$root._vueMetaInitialized).toBe(true) expect(wrapper.vm.$root._vueMetaPaused).toBe(true) expect(triggerUpdateSpy).toHaveBeenCalledTimes(1) - expect(batchUpdate).not.toHaveBeenCalled() + expect(batchUpdateSpy).not.toHaveBeenCalled() jest.clearAllMocks() const metaInfo = wrapper.vm.$meta().resume() diff --git a/yarn.lock b/yarn.lock index 1a99a7f..252ef30 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,23 @@ # yarn lockfile v1 +"@babel/cli@^7.2.3": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.2.3.tgz#1b262e42a3e959d28ab3d205ba2718e1923cfee6" + integrity sha512-bfna97nmJV6nDJhXNPeEfxyMjWnt6+IjUAaDPiYRTBlm8L41n8nvw6UAqUCbvpFfU246gHPxW7sfWwqtF4FcYA== + dependencies: + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.1.0" + glob "^7.0.0" + lodash "^4.17.10" + mkdirp "^0.5.1" + output-file-sync "^2.0.0" + slash "^2.0.0" + source-map "^0.5.0" + optionalDependencies: + chokidar "^2.0.3" + "@babel/code-frame@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" @@ -930,6 +947,11 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +async-each@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + integrity sha1-GdOGodntxufByF04iu28xW0zYC0= + async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" @@ -1139,6 +1161,11 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== +binary-extensions@^1.0.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.0.tgz#9523e001306a32444b907423f1de2164222f6ab1" + integrity sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw== + boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -1166,7 +1193,7 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" -braces@^2.3.1: +braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -1326,6 +1353,25 @@ cheerio@^1.0.0-rc.2: lodash "^4.15.0" parse5 "^3.0.1" +chokidar@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.2.tgz#9c23ea40b01638439e0513864d362aeacc5ad058" + integrity sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.0" + optionalDependencies: + fsevents "^1.2.7" + chownr@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" @@ -2390,12 +2436,17 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.2.1" +fs-readdir-recursive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.3: +fsevents@^1.2.3, fsevents@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== @@ -2466,7 +2517,15 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -2788,6 +2847,13 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + is-buffer@^1.1.4, is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -2876,6 +2942,11 @@ is-extglob@^1.0.0: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" @@ -2900,6 +2971,20 @@ is-glob@^2.0.0, is-glob@^2.0.1: dependencies: is-extglob "^1.0.0" +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= + dependencies: + is-extglob "^2.1.1" + is-hexadecimal@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.2.tgz#b6e710d7d07bb66b98cb8cece5c9b4921deeb835" @@ -4074,6 +4159,11 @@ normalize-path@^2.0.1, normalize-path@^2.1.1: dependencies: remove-trailing-separator "^1.0.1" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + npm-bundled@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" @@ -4236,6 +4326,15 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +output-file-sync@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-2.0.1.tgz#f53118282f5f553c2799541792b723a4c71430c0" + integrity sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ== + dependencies: + graceful-fs "^4.1.11" + is-plain-obj "^1.1.0" + mkdirp "^0.5.1" + p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -4372,6 +4471,11 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -4611,6 +4715,15 @@ readable-stream@^3.0.6: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + realpath-native@^1.0.0, realpath-native@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.2.tgz#cd51ce089b513b45cf9b1516c82989b51ccc6560" @@ -5636,6 +5749,11 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +upath@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" + integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== + update-section@^0.3.0, update-section@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/update-section/-/update-section-0.3.3.tgz#458f17820d37820dc60e20b86d94391b00123158"