diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 4097624ddd3..d80fce45609 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -26,5 +26,4 @@ * [ ] :globe_with_meridians: Styleguidist demo is up-to-date (`yarn start`) * [ ] :arrow_left: renders as expected with reversed (RTL) direction * [ ] :guardsman: includes new unit and snapshot tests -* [ ] :ledger: any new files are included in the packages `src/index.js` export * [ ] :memo: tested in Chrome, Firefox, Safari, Edge, and IE11 diff --git a/packages/.template/src/index.spec.js b/packages/.template/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/.template/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/autocomplete/src/index.spec.js b/packages/autocomplete/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/autocomplete/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/avatars/src/index.spec.js b/packages/avatars/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/avatars/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/breadcrumbs/src/index.spec.js b/packages/breadcrumbs/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/breadcrumbs/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/buttons/src/index.spec.js b/packages/buttons/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/buttons/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/checkboxes/src/index.spec.js b/packages/checkboxes/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/checkboxes/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/chrome/src/index.spec.js b/packages/chrome/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/chrome/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/grid/src/index.spec.js b/packages/grid/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/grid/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/loaders/src/index.spec.js b/packages/loaders/src/index.spec.js new file mode 100644 index 00000000000..ec2acb847cf --- /dev/null +++ b/packages/loaders/src/index.spec.js @@ -0,0 +1,19 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ + globPath: '[A-Z]!(*.spec).js', + cwd: __dirname, + keys: Object.keys(rootIndex).sort() + }); + }); +}); diff --git a/packages/menus/src/index.spec.js b/packages/menus/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/menus/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/modals/src/index.spec.js b/packages/modals/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/modals/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/notifications/src/index.spec.js b/packages/notifications/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/notifications/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/pagination/src/index.spec.js b/packages/pagination/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/pagination/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/radios/src/index.spec.js b/packages/radios/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/radios/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/ranges/src/index.spec.js b/packages/ranges/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/ranges/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/select/src/index.spec.js b/packages/select/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/select/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/selection/src/index.spec.js b/packages/selection/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/selection/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/tables/src/index.spec.js b/packages/tables/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/tables/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/tabs/src/index.spec.js b/packages/tabs/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/tabs/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/tags/src/index.spec.js b/packages/tags/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/tags/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/testing/package.json b/packages/testing/package.json index bc285d8fc82..b8b842c81a9 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -14,10 +14,13 @@ "dist" ], "scripts": { - "build": "../../utils/scripts/build.sh", + "build": "../../utils/scripts/build-node.sh", "build:demo": "../../utils/scripts/build-demo.sh", "start": "../../utils/scripts/start.sh" }, + "dependencies": { + "glob": "7.1.3" + }, "peerDependencies": { "@zendeskgarden/react-theming": "^1.0.0 || ^2.0.0 || ^3.0.0", "enzyme": "^3.0.0", diff --git a/packages/testing/src/index.js b/packages/testing/src/index.js index dc5c976f8ac..afe73ca7413 100644 --- a/packages/testing/src/index.js +++ b/packages/testing/src/index.js @@ -8,3 +8,4 @@ export { default as mountWithTheme } from './utils/mountWithTheme.js'; export { default as renderWithTheme } from './utils/renderWithTheme.js'; export { default as shallowWithTheme } from './utils/shallowWithTheme.js'; +export { default as matchExports } from './utils/matchExports.js'; diff --git a/packages/testing/src/index.spec.js b/packages/testing/src/index.spec.js new file mode 100644 index 00000000000..1daa0a382f2 --- /dev/null +++ b/packages/testing/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import matchExports from './utils/matchExports'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/testing/src/utils/matchExports.js b/packages/testing/src/utils/matchExports.js new file mode 100644 index 00000000000..7fd36a8aaf5 --- /dev/null +++ b/packages/testing/src/utils/matchExports.js @@ -0,0 +1,49 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import glob from 'glob'; + +/** + * defaultFileMapper + * @param {*} files + */ +function defaultFileMapper(files) { + return files + .map(entry => + entry + .replace(/\.js$/u, '') + .split('/') + .pop() + ) + .sort(); +} + +/** + * matchExports + * @param {*} options + */ +function matchExports({ + globPath = '**/!(index|*.spec).js', + cwd, + keys, + fileMapper = defaultFileMapper +} = {}) { + return new Promise((resolve, reject) => { + glob(globPath, { cwd }, (error, files) => { + if (error) { + reject(error); + } + + const mappedFiles = fileMapper(files); + + expect(keys).toEqual(mappedFiles); + resolve(); + }); + }); +} + +export default matchExports; diff --git a/packages/textfields/src/index.spec.js b/packages/textfields/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/textfields/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/theming/src/index.spec.js b/packages/theming/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/theming/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/toggles/src/index.spec.js b/packages/toggles/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/toggles/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/tooltips/src/index.spec.js b/packages/tooltips/src/index.spec.js new file mode 100644 index 00000000000..d38fca6b8ae --- /dev/null +++ b/packages/tooltips/src/index.spec.js @@ -0,0 +1,31 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; +import * as gardenPlacements from './utils/gardenPlacements'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ + globPath: '**/[A-Z]!(*.spec).js', + cwd: __dirname, + keys: Object.keys(rootIndex).sort(), + fileMapper: files => { + return files + .map(entry => + entry + .replace(/\.js$/u, '') + .split('/') + .pop() + ) + .concat(Object.keys(gardenPlacements)) + .sort(); + } + }); + }); +}); diff --git a/packages/typography/src/index.spec.js b/packages/typography/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/typography/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/packages/utilities/src/index.spec.js b/packages/utilities/src/index.spec.js new file mode 100644 index 00000000000..16b7080b7b0 --- /dev/null +++ b/packages/utilities/src/index.spec.js @@ -0,0 +1,15 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +import { matchExports } from '@zendeskgarden/react-testing'; +import * as rootIndex from './'; + +describe('Index', () => { + it('exports all components and utilities', () => { + return matchExports({ cwd: __dirname, keys: Object.keys(rootIndex).sort() }); + }); +}); diff --git a/utils/build/webpack.node.js b/utils/build/webpack.node.js new file mode 100644 index 00000000000..c4a14dc2254 --- /dev/null +++ b/utils/build/webpack.node.js @@ -0,0 +1,19 @@ +/** + * Copyright Zendesk, Inc. + * + * Use of this source code is governed under the Apache License, Version 2.0 + * found at http://www.apache.org/licenses/LICENSE-2.0. + */ + +const path = require('path'); +const merge = require('webpack-merge'); +const baseConfig = require('./webpack.base'); + +module.exports = merge(baseConfig, { + target: 'node', + output: { + path: path.resolve('dist'), + filename: 'index.js', + libraryTarget: 'commonjs' + } +}); diff --git a/utils/scripts/build-node.sh b/utils/scripts/build-node.sh new file mode 100755 index 00000000000..c4a951322ca --- /dev/null +++ b/utils/scripts/build-node.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -x +set -e + +rimraf dist +webpack --config ../../utils/build/webpack.node.js --hide-modules diff --git a/utils/test/jest.config.js b/utils/test/jest.config.js index 8148d6dbc27..f81e1cfe142 100644 --- a/utils/test/jest.config.js +++ b/utils/test/jest.config.js @@ -26,10 +26,11 @@ module.exports = { '\\.(svg)$': '/utils/test/svg-mock.js' }, collectCoverageFrom: [ - '/packages/*/src/**/*.{js,jsx}', + '/packages/*!(.template)/src/**/*.{js,jsx}', '!/packages/*/src/index.js', '!**/node_modules/**', '!**/vendor/**' ], - coverageDirectory: '/demo/coverage' + coverageDirectory: '/demo/coverage', + testPathIgnorePatterns: ['/node_modules/', '/packages/.template'] }; diff --git a/yarn.lock b/yarn.lock index 9365f000d4f..d5082e6e4bf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5197,6 +5197,7 @@ glob-to-regexp@^0.3.0: glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.2: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4"