├── .yarnrc ├── sources ├── bad-file.js ├── fibonacci.js ├── index.js └── __tests__ │ └── fibonacci.js ├── .gitignore ├── jest.config.js ├── .prettierrc ├── all.sh ├── .babelrc ├── rollup.config.js ├── scripts ├── bench-size.sh └── eslint-resolver.js ├── gulpfile.js ├── .eslintrc.js ├── webpack.config.js ├── README.md ├── pnp-name-maps.js ├── package.json └── package-name-maps.json /.yarnrc: -------------------------------------------------------------------------------- 1 | yarn-path "./yarn.js" 2 | -------------------------------------------------------------------------------- /sources/bad-file.js: -------------------------------------------------------------------------------- 1 | import 'this-package-doesnt-exists'; 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | yarn-error.log 4 | .pnp* 5 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | resolver: require.resolve(`jest-pnp-resolver`) 3 | }; 4 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "all", 4 | "bracketSpacing": false, 5 | "printWidth": 120 6 | } 7 | -------------------------------------------------------------------------------- /all.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e 4 | 5 | yarn 6 | yarn webpack 7 | yarn jest 8 | yarn prettier 9 | yarn rollup 10 | yarn gulp 11 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["react", ["env", { 3 | "targets": { 4 | "browsers": ["last 2 versions"] 5 | } 6 | }]], 7 | "plugins": [ 8 | "transform-class-properties", 9 | "transform-decorators-legacy", 10 | "transform-runtime" 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | const commonjs = require(`rollup-plugin-commonjs`); 2 | const resolve = require(`rollup-plugin-pnp-resolve`); 3 | 4 | module.exports = { 5 | input: `sources/fibonacci.js`, 6 | output: { 7 | file: `dist/fibonacci-as-lib.js`, 8 | format: `cjs`, 9 | }, 10 | plugins: [ 11 | commonjs(), 12 | resolve(), 13 | ] 14 | }; 15 | -------------------------------------------------------------------------------- /scripts/bench-size.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | export YARN_PLUGNPLAY_OVERRIDE=false 4 | ./yarn.js install >/dev/null 5 | ./yarn.js build >/dev/null 6 | 7 | echo Before: 8 | ls -lh ./dist/app.js 9 | 10 | export YARN_PLUGNPLAY_OVERRIDE=true 11 | ./yarn.js install >/dev/null 12 | ./yarn.js build >/dev/null 13 | 14 | echo After: 15 | ls -lh ./dist/app.js 16 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | const gulp = require(`gulp`); 2 | const gulpif = require(`gulp-if`); 3 | const uglify = require(`gulp-uglify`); 4 | const webpack = require(`webpack-stream`); 5 | 6 | gulp.task('default', function() { 7 | 8 | return gulp.src(`src/app.js`) 9 | .pipe(webpack(require(`./webpack.config.js`), require(`webpack`))) 10 | .pipe(gulpif(/\.js$/, uglify())) 11 | .pipe(gulp.dest(`dist/`)); 12 | 13 | }); 14 | -------------------------------------------------------------------------------- /scripts/eslint-resolver.js: -------------------------------------------------------------------------------- 1 | let pnp; 2 | 3 | try { 4 | pnp = require(`../.pnp.js`); 5 | } catch (error) { 6 | // not a problem 7 | } 8 | 9 | const NOTFOUND = {found: false}; 10 | 11 | module.exports = { 12 | interfaceVersion: 2, 13 | resolve: (source, file) => { 14 | if (!pnp) { 15 | throw new Error(`This resolver is meant to be used with pnp, but no pnp file was found`); 16 | } 17 | 18 | try { 19 | return {found: true, path: pnp.resolveRequest(source, file)}; 20 | } catch (error) { 21 | return NOTFOUND; 22 | } 23 | }, 24 | }; 25 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "env": { 3 | "browser": true, 4 | "jest/globals": true, 5 | "node": true 6 | }, 7 | "extends": [ 8 | "eslint:recommended", 9 | "plugin:import/errors", 10 | "plugin:react/recommended", 11 | "prettier" 12 | ], 13 | "parser": "babel-eslint", 14 | "plugins": [ 15 | "import", 16 | "jest", 17 | "prettier", 18 | "react" 19 | ], 20 | "settings": { 21 | "import/resolver": { 22 | [require.resolve('./scripts/eslint-resolver.js')]: {} 23 | } 24 | } 25 | }; 26 | -------------------------------------------------------------------------------- /sources/fibonacci.js: -------------------------------------------------------------------------------- 1 | import {from} from 'rxjs/observable/from'; 2 | 3 | export function fibonacci(n) { 4 | if (n === -Infinity) return -Infinity; 5 | 6 | if (n === +Infinity) return +Infinity; 7 | 8 | if (n === 0) return 0; 9 | 10 | let A = (1 + Math.sqrt(5)) / 2; 11 | let B = (1 - Math.sqrt(5)) / 2; 12 | 13 | let res = Math.ceil((Math.pow(A, n) - Math.pow(B, n)) / Math.sqrt(5)); 14 | 15 | if (res <= 0) res -= 1; 16 | 17 | return res; 18 | } 19 | 20 | export function* fibonacciGenerator(startingFrom) { 21 | let nM1 = fibonacci(startingFrom - 1); 22 | let nM0 = fibonacci(startingFrom); 23 | 24 | while (true) { 25 | let pM1 = nM1; 26 | nM1 = nM0; 27 | nM0 = nM0 + pM1; 28 | yield nM1; 29 | } 30 | } 31 | 32 | export function fibonacciObservable(startingFrom) { 33 | return from(fibonacciGenerator(startingFrom)); 34 | } 35 | -------------------------------------------------------------------------------- /sources/index.js: -------------------------------------------------------------------------------- 1 | import {autobind} from 'core-decorators'; 2 | import React from 'react'; 3 | import ReactDOM from 'react-dom'; 4 | 5 | import {fibonacci} from './fibonacci'; 6 | 7 | class Application extends React.PureComponent { 8 | state = { 9 | n: `1`, 10 | }; 11 | 12 | @autobind 13 | handleChange(e) { 14 | this.setState({ 15 | n: e.target.value, 16 | }); 17 | } 18 | 19 | render() { 20 | return ( 21 |
22 | Everything is working just fine! And as a bonus, here′s a fibonacci number calculator: 23 |
24 | 25 | 26 |
27 |
28 | ); 29 | } 30 | } 31 | 32 | ReactDOM.render(, document.body); 33 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const HtmlWebpackPlugin = require(`html-webpack-plugin`); 2 | const PnpWebpackPlugin = require(`pnp-webpack-plugin`); 3 | const WebpackAnalyzerPlugin = require(`webpack-bundle-analyzer`).BundleAnalyzerPlugin; 4 | 5 | module.exports = { 6 | 7 | mode: `production`, 8 | 9 | entry: { 10 | [`app`]: `./sources/index.js`, 11 | }, 12 | 13 | output: { 14 | filename: `[name].js`, 15 | }, 16 | 17 | 18 | module: { 19 | rules: [{ 20 | test: /\.js$/, 21 | exclude: /node_modules/, 22 | loader: 'babel-loader', 23 | options: {}, 24 | }] 25 | }, 26 | 27 | resolve: { 28 | plugins: [ 29 | PnpWebpackPlugin, 30 | ] 31 | }, 32 | 33 | resolveLoader: { 34 | plugins: [ 35 | PnpWebpackPlugin.moduleLoader(module), 36 | ] 37 | }, 38 | 39 | plugins: [ 40 | new HtmlWebpackPlugin(), 41 | // new WebpackAnalyzerPlugin(), 42 | ] 43 | 44 | }; 45 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Plug'n'play sample app 2 | 3 | This app showcase a wide range of popular packages, and show that Plug'n'play has no issue working with them. Feel free to open PRs to add more, even if they would make little sense in a classic application! 4 | 5 | ## Usage 6 | 7 | Running `yarn install` in the root directory will automatically use the Plug'n'Play-enabled build checked inside the repository. To try out the project without Plug'n'Play enabled, just run `YARN_PLUGNPLAY_OVERRIDE=0 yarn install` instead. 8 | 9 | ## Plugins 10 | 11 | A few plugins are needed for various build tools to properly understand how to resolve files. Those are the ones we use: 12 | 13 | - [jest-pnp-resolver](https://github.com/arcanis/jest-pnp-resolver) 14 | - [rollup-plugin-pnp-resolve](https://github.com/arcanis/rollup-plugin-pnp-resolve) 15 | - [pnp-webpack-plugin](https://github.com/arcanis/pnp-webpack-plugin) 16 | 17 | ## Packages 18 | 19 | The packages currently configured are: 20 | 21 | - Babel 22 | - ESLint 23 | - Gulp 24 | - Http-server 25 | - Jest 26 | - Prettier 27 | - React 28 | - Uglifyjs 29 | - Webpack 30 | - Webpack-dev-server 31 | 32 | ## Known Issues 33 | 34 | - ESLint doesn't work w/ eslint-plugin-import because of https://github.com/babel/babel-eslint/issues/680 35 | -------------------------------------------------------------------------------- /sources/__tests__/fibonacci.js: -------------------------------------------------------------------------------- 1 | import 'rxjs/add/operator/take'; 2 | import 'rxjs/add/operator/toArray'; 3 | 4 | // eslint-disable-next-line 5 | import {toPromise} from 'rxjs/operators'; 6 | import {fibonacci, fibonacciObservable} from '../fibonacci'; 7 | 8 | describe(`fibonacci`, () => { 9 | it(`should work for negative values`, () => { 10 | expect(fibonacci(-10)).toEqual(-55); 11 | expect(fibonacci(-9)).toEqual(34); 12 | expect(fibonacci(-8)).toEqual(-21); 13 | expect(fibonacci(-7)).toEqual(13); 14 | expect(fibonacci(-6)).toEqual(-8); 15 | expect(fibonacci(-5)).toEqual(5); 16 | expect(fibonacci(-4)).toEqual(-3); 17 | expect(fibonacci(-3)).toEqual(2); 18 | expect(fibonacci(-2)).toEqual(-1); 19 | expect(fibonacci(-1)).toEqual(1); 20 | }); 21 | 22 | it(`should work for zero values`, () => { 23 | expect(fibonacci(-0)).toEqual(0); 24 | expect(fibonacci(+0)).toEqual(0); 25 | }); 26 | 27 | it(`should work for positive values`, () => { 28 | expect(fibonacci(+1)).toEqual(1); 29 | expect(fibonacci(+2)).toEqual(1); 30 | expect(fibonacci(+5)).toEqual(5); 31 | expect(fibonacci(+10)).toEqual(55); 32 | }); 33 | 34 | it(`should return -Infinity for -Infinity`, () => { 35 | expect(fibonacci(-Infinity)).toEqual(-Infinity); 36 | }); 37 | 38 | it(`should return +Infinity for +Infinity`, () => { 39 | expect(fibonacci(+Infinity)).toEqual(+Infinity); 40 | }); 41 | }); 42 | 43 | describe(`fibonacciObservable`, () => { 44 | it(`should return the initial term as first value`, async () => { 45 | await expect( 46 | fibonacciObservable(10) 47 | .take(1) 48 | .toPromise(), 49 | ).resolves.toEqual(55); 50 | }); 51 | 52 | it(`should work with multiple terms`, async () => { 53 | await expect( 54 | fibonacciObservable(1) 55 | .take(6) 56 | .toArray() 57 | .toPromise(), 58 | ).resolves.toEqual([1, 1, 2, 3, 5, 8]); 59 | }); 60 | }); 61 | -------------------------------------------------------------------------------- /pnp-name-maps.js: -------------------------------------------------------------------------------- 1 | const {relative, resolve} = require(`path`); 2 | 3 | const pnp = require(process.argv[2] || `pnpapi`); 4 | const packageNameMaps = {path_prefix: `/`, packages: {}, scopes: {}}; 5 | 6 | function traverseDependencyTree(pnp, cb) { 7 | const traversed = new Set(); 8 | 9 | function traversePackage(locator) { 10 | const packageInformation = pnp.getPackageInformation(locator); 11 | 12 | // Skip packages that haven't been installed 13 | if (!packageInformation.packageLocation) 14 | return; 15 | 16 | // Skip packages that have already been traversed 17 | if (traversed.has(packageInformation)) 18 | return; 19 | 20 | traversed.add(packageInformation); 21 | cb(locator, packageInformation); 22 | 23 | for (const [name, reference] of packageInformation.packageDependencies.entries()) { 24 | traversePackage({name, reference}); 25 | } 26 | } 27 | 28 | traversePackage(pnp.topLevel); 29 | } 30 | 31 | function addPackages(pnp, packages, parentInformation, parentDependencies) { 32 | for (const [name, reference] of parentDependencies.entries()) { 33 | const dependencyInformation = pnp.getPackageInformation({name, reference}); 34 | const dependencyLocation = dependencyInformation.packageLocation; 35 | 36 | if (!dependencyLocation) 37 | continue; 38 | 39 | const path = relative(parentInformation.packageLocation, dependencyLocation) || `./`; 40 | const pkgJson = require(resolve(dependencyLocation, `package.json`)); 41 | const main = pkgJson.browser || pkgJson.main; 42 | 43 | packages[name] = {path, main}; 44 | } 45 | } 46 | 47 | const topLevelInformation = pnp.getPackageInformation(pnp.topLevel); 48 | 49 | traverseDependencyTree(pnp, (locator, packageInformation, packageDependencies) => { 50 | if (locator.name === null) 51 | return addPackages(pnp, packageNameMaps.packages, topLevelInformation, packageDependencies); 52 | 53 | const scope = relative(topLevelInformation.packageLocation, packageInformation.packageLocation); 54 | packageNameMaps.scopes[scope] = {packages:{}}; 55 | 56 | addPackages(pnp, packageNameMaps.scopes[scope].packages, packageInformation, packageDependencies); 57 | }); 58 | 59 | console.log(JSON.stringify(packageNameMaps, null, 2)); 60 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "dependencies": { 4 | "babel-runtime": "^6.26.0", 5 | "core-decorators": "^0.20.0", 6 | "lodash": "^4.17.13", 7 | "react": "^16.2.0", 8 | "react-dom": "^16.3.3" 9 | }, 10 | "devDependencies": { 11 | "babel-core": "^6.4.1", 12 | "babel-eslint": "^8.2.2", 13 | "babel-loader": "^7.1.4", 14 | "babel-plugin-transform-class-properties": "^6.24.1", 15 | "babel-plugin-transform-decorators-legacy": "^1.3.4", 16 | "babel-plugin-transform-runtime": "^6.23.0", 17 | "babel-preset-env": "^1.6.1", 18 | "babel-preset-react": "^6.24.1", 19 | "build-pnm": "^0.1.0", 20 | "eslint": "^5.5.0", 21 | "eslint-config-prettier": "^3.0.1", 22 | "eslint-plugin-import": "^2.14.0", 23 | "eslint-plugin-jest": "^21.22.0", 24 | "eslint-plugin-prettier": "^2.6.0", 25 | "eslint-plugin-react": "^7.7.0", 26 | "gulp": "^3.9.1", 27 | "gulp-if": "^2.0.2", 28 | "gulp-uglify": "^3.0.0", 29 | "html-webpack-plugin": "^3.1.0", 30 | "http-server": "^0.11.1", 31 | "is-pnp": "^1.0.2", 32 | "jest": "^23.4.0", 33 | "jest-environment-jsdom": "^23.4.0", 34 | "jest-pnp-resolver": "^1.0.0", 35 | "jest-resolve": "^23.4.0", 36 | "pnp-webpack-plugin": "^1.0.0", 37 | "prettier": "^1.12.0", 38 | "regenerator-runtime": "^0.11.1", 39 | "rollup": "^0.65.0", 40 | "rollup-plugin-commonjs": "^9.1.6", 41 | "rollup-plugin-pnp-resolve": "^1.0.0", 42 | "rxjs": "^5.5.10", 43 | "webpack": "^4.4.1", 44 | "webpack-bundle-analyzer": "^2.11.1", 45 | "webpack-cli": "^2.0.13", 46 | "webpack-dev-server": "^3.1.11", 47 | "webpack-stream": "^4.0.3" 48 | }, 49 | "scripts": { 50 | "bench:size": "./scripts/bench-size.sh", 51 | "eslint": "eslint sources scripts", 52 | "gulp": "gulp", 53 | "postinstall": "is-pnp && build-pnm || true", 54 | "prettier": "prettier --write sources/**/*.js scripts/**/*.js", 55 | "rollup": "rollup -c", 56 | "serve": "http-server -c-1 dist", 57 | "webpack": "webpack" 58 | }, 59 | "resolutions": { 60 | "fsevents": "npm:dummypkg-a@1.0.0" 61 | }, 62 | "installConfig": { 63 | "pnp": true 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /package-name-maps.json: -------------------------------------------------------------------------------- 1 | { 2 | "path_prefix": "/", 3 | "packages": { 4 | "babel-runtime": { 5 | "path": "../Library/Caches/Yarn/v3/npm-babel-runtime-6.26.0-965c7058668e82b55d7bfe04ff2337bc8b5647fe/node_modules/babel-runtime" 6 | }, 7 | "core-decorators": { 8 | "path": "../Library/Caches/Yarn/v3/npm-core-decorators-0.20.0-605896624053af8c28efbe735c25a301a61c65c5/node_modules/core-decorators", 9 | "main": "lib/core-decorators.js" 10 | }, 11 | "lodash": { 12 | "path": "../Library/Caches/Yarn/v3/npm-lodash-4.17.5-99a92d65c0272debe8c96b6057bc8fbfa3bed511/node_modules/lodash", 13 | "main": "lodash.js" 14 | }, 15 | "react": { 16 | "path": "../Library/Caches/Yarn/v3/npm-react-16.3.2-fdc8420398533a1e58872f59091b272ce2f91ea9/node_modules/react", 17 | "main": "index.js" 18 | }, 19 | "react-dom": { 20 | "path": "../Library/Caches/Yarn/v3/npm-react-dom-16.3.2-cb90f107e09536d683d84ed5d4888e9640e0e4df/node_modules/react-dom", 21 | "main": { 22 | "./server.js": "./server.browser.js" 23 | } 24 | } 25 | }, 26 | "scopes": { 27 | "../Library/Caches/Yarn/v3/npm-babel-runtime-6.26.0-965c7058668e82b55d7bfe04ff2337bc8b5647fe/node_modules/babel-runtime": { 28 | "packages": { 29 | "core-js": { 30 | "path": "../../../npm-core-js-2.5.5-b14dde936c640c0579a6b50cabcc132dd6127e3b/node_modules/core-js", 31 | "main": "index.js" 32 | }, 33 | "regenerator-runtime": { 34 | "path": "../../../npm-regenerator-runtime-0.11.1-be05ad7f9bf7d22e056f9726cee5017fbf19e2e9/node_modules/regenerator-runtime", 35 | "main": "runtime-module.js" 36 | }, 37 | "babel-runtime": { 38 | "path": "./" 39 | } 40 | } 41 | }, 42 | "../Library/Caches/Yarn/v3/npm-core-js-2.5.5-b14dde936c640c0579a6b50cabcc132dd6127e3b/node_modules/core-js": { 43 | "packages": { 44 | "core-js": { 45 | "path": "./", 46 | "main": "index.js" 47 | } 48 | } 49 | }, 50 | "../Library/Caches/Yarn/v3/npm-regenerator-runtime-0.11.1-be05ad7f9bf7d22e056f9726cee5017fbf19e2e9/node_modules/regenerator-runtime": { 51 | "packages": { 52 | "regenerator-runtime": { 53 | "path": "./", 54 | "main": "runtime-module.js" 55 | } 56 | } 57 | }, 58 | "../Library/Caches/Yarn/v3/npm-core-decorators-0.20.0-605896624053af8c28efbe735c25a301a61c65c5/node_modules/core-decorators": { 59 | "packages": { 60 | "core-decorators": { 61 | "path": "./", 62 | "main": "lib/core-decorators.js" 63 | } 64 | } 65 | }, 66 | "../Library/Caches/Yarn/v3/npm-lodash-4.17.5-99a92d65c0272debe8c96b6057bc8fbfa3bed511/node_modules/lodash": { 67 | "packages": { 68 | "lodash": { 69 | "path": "./", 70 | "main": "lodash.js" 71 | } 72 | } 73 | }, 74 | "../Library/Caches/Yarn/v3/npm-react-16.3.2-fdc8420398533a1e58872f59091b272ce2f91ea9/node_modules/react": { 75 | "packages": { 76 | "fbjs": { 77 | "path": "../../../npm-fbjs-0.8.16-5e67432f550dc41b572bf55847b8aca64e5337db/node_modules/fbjs", 78 | "main": "index.js" 79 | }, 80 | "loose-envify": { 81 | "path": "../../../npm-loose-envify-1.3.1-d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848/node_modules/loose-envify", 82 | "main": "index.js" 83 | }, 84 | "object-assign": { 85 | "path": "../../../npm-object-assign-4.1.1-2109adc7965887cfc05cbbd442cac8bfbb360863/node_modules/object-assign" 86 | }, 87 | "prop-types": { 88 | "path": "../../../npm-prop-types-15.6.1-36644453564255ddda391191fb3a125cbdf654ca/node_modules/prop-types", 89 | "main": "index.js" 90 | }, 91 | "react": { 92 | "path": "./", 93 | "main": "index.js" 94 | } 95 | } 96 | }, 97 | "../Library/Caches/Yarn/v3/npm-fbjs-0.8.16-5e67432f550dc41b572bf55847b8aca64e5337db/node_modules/fbjs": { 98 | "packages": { 99 | "core-js": { 100 | "path": "../../../npm-core-js-1.2.7-652294c14651db28fa93bd2d5ff2983a4f08c636/node_modules/core-js", 101 | "main": "index.js" 102 | }, 103 | "isomorphic-fetch": { 104 | "path": "../../../npm-isomorphic-fetch-2.2.1-611ae1acf14f5e81f729507472819fe9733558a9/node_modules/isomorphic-fetch", 105 | "main": "fetch-npm-browserify.js" 106 | }, 107 | "loose-envify": { 108 | "path": "../../../npm-loose-envify-1.3.1-d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848/node_modules/loose-envify", 109 | "main": "index.js" 110 | }, 111 | "object-assign": { 112 | "path": "../../../npm-object-assign-4.1.1-2109adc7965887cfc05cbbd442cac8bfbb360863/node_modules/object-assign" 113 | }, 114 | "promise": { 115 | "path": "../../../npm-promise-7.3.1-064b72602b18f90f29192b8b1bc418ffd1ebd3bf/node_modules/promise", 116 | "main": "index.js" 117 | }, 118 | "setimmediate": { 119 | "path": "../../../npm-setimmediate-1.0.5-290cbb232e306942d7d7ea9b83732ab7856f8285/node_modules/setimmediate", 120 | "main": "setImmediate.js" 121 | }, 122 | "ua-parser-js": { 123 | "path": "../../../npm-ua-parser-js-0.7.17-e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac/node_modules/ua-parser-js", 124 | "main": "src/ua-parser.js" 125 | }, 126 | "fbjs": { 127 | "path": "./", 128 | "main": "index.js" 129 | } 130 | } 131 | }, 132 | "../Library/Caches/Yarn/v3/npm-core-js-1.2.7-652294c14651db28fa93bd2d5ff2983a4f08c636/node_modules/core-js": { 133 | "packages": { 134 | "core-js": { 135 | "path": "./", 136 | "main": "index.js" 137 | } 138 | } 139 | }, 140 | "../Library/Caches/Yarn/v3/npm-isomorphic-fetch-2.2.1-611ae1acf14f5e81f729507472819fe9733558a9/node_modules/isomorphic-fetch": { 141 | "packages": { 142 | "node-fetch": { 143 | "path": "../../../npm-node-fetch-1.7.3-980f6f72d85211a5347c6b2bc18c5b84c3eb47ef/node_modules/node-fetch", 144 | "main": "index.js" 145 | }, 146 | "whatwg-fetch": { 147 | "path": "../../../npm-whatwg-fetch-2.0.4-dde6a5df315f9d39991aa17621853d720b85566f/node_modules/whatwg-fetch", 148 | "main": "fetch.js" 149 | }, 150 | "isomorphic-fetch": { 151 | "path": "./", 152 | "main": "fetch-npm-browserify.js" 153 | } 154 | } 155 | }, 156 | "../Library/Caches/Yarn/v3/npm-node-fetch-1.7.3-980f6f72d85211a5347c6b2bc18c5b84c3eb47ef/node_modules/node-fetch": { 157 | "packages": { 158 | "encoding": { 159 | "path": "../../../npm-encoding-0.1.12-538b66f3ee62cd1ab51ec323829d1f9480c74beb/node_modules/encoding", 160 | "main": "lib/encoding.js" 161 | }, 162 | "is-stream": { 163 | "path": "../../../npm-is-stream-1.1.0-12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44/node_modules/is-stream" 164 | }, 165 | "node-fetch": { 166 | "path": "./", 167 | "main": "index.js" 168 | } 169 | } 170 | }, 171 | "../Library/Caches/Yarn/v3/npm-encoding-0.1.12-538b66f3ee62cd1ab51ec323829d1f9480c74beb/node_modules/encoding": { 172 | "packages": { 173 | "iconv-lite": { 174 | "path": "../../../npm-iconv-lite-0.4.21-c47f8733d02171189ebc4a400f3218d348094798/node_modules/iconv-lite", 175 | "main": { 176 | "./lib/extend-node": false, 177 | "./lib/streams": false 178 | } 179 | }, 180 | "encoding": { 181 | "path": "./", 182 | "main": "lib/encoding.js" 183 | } 184 | } 185 | }, 186 | "../Library/Caches/Yarn/v3/npm-iconv-lite-0.4.21-c47f8733d02171189ebc4a400f3218d348094798/node_modules/iconv-lite": { 187 | "packages": { 188 | "safer-buffer": { 189 | "path": "../../../npm-safer-buffer-2.1.2-44fa161b0187b9549dd84bb91802f9bd8385cd6a/node_modules/safer-buffer", 190 | "main": "safer.js" 191 | }, 192 | "iconv-lite": { 193 | "path": "./", 194 | "main": { 195 | "./lib/extend-node": false, 196 | "./lib/streams": false 197 | } 198 | } 199 | } 200 | }, 201 | "../Library/Caches/Yarn/v3/npm-safer-buffer-2.1.2-44fa161b0187b9549dd84bb91802f9bd8385cd6a/node_modules/safer-buffer": { 202 | "packages": { 203 | "safer-buffer": { 204 | "path": "./", 205 | "main": "safer.js" 206 | } 207 | } 208 | }, 209 | "../Library/Caches/Yarn/v3/npm-is-stream-1.1.0-12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44/node_modules/is-stream": { 210 | "packages": { 211 | "is-stream": { 212 | "path": "./" 213 | } 214 | } 215 | }, 216 | "../Library/Caches/Yarn/v3/npm-whatwg-fetch-2.0.4-dde6a5df315f9d39991aa17621853d720b85566f/node_modules/whatwg-fetch": { 217 | "packages": { 218 | "whatwg-fetch": { 219 | "path": "./", 220 | "main": "fetch.js" 221 | } 222 | } 223 | }, 224 | "../Library/Caches/Yarn/v3/npm-loose-envify-1.3.1-d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848/node_modules/loose-envify": { 225 | "packages": { 226 | "js-tokens": { 227 | "path": "../../../npm-js-tokens-3.0.2-9866df395102130e38f7f996bceb65443209c25b/node_modules/js-tokens" 228 | }, 229 | "loose-envify": { 230 | "path": "./", 231 | "main": "index.js" 232 | } 233 | } 234 | }, 235 | "../Library/Caches/Yarn/v3/npm-js-tokens-3.0.2-9866df395102130e38f7f996bceb65443209c25b/node_modules/js-tokens": { 236 | "packages": { 237 | "js-tokens": { 238 | "path": "./" 239 | } 240 | } 241 | }, 242 | "../Library/Caches/Yarn/v3/npm-object-assign-4.1.1-2109adc7965887cfc05cbbd442cac8bfbb360863/node_modules/object-assign": { 243 | "packages": { 244 | "object-assign": { 245 | "path": "./" 246 | } 247 | } 248 | }, 249 | "../Library/Caches/Yarn/v3/npm-promise-7.3.1-064b72602b18f90f29192b8b1bc418ffd1ebd3bf/node_modules/promise": { 250 | "packages": { 251 | "asap": { 252 | "path": "../../../npm-asap-2.0.6-e50347611d7e690943208bbdafebcbc2fb866d46/node_modules/asap", 253 | "main": { 254 | "./asap": "./browser-asap.js", 255 | "./asap.js": "./browser-asap.js", 256 | "./raw": "./browser-raw.js", 257 | "./raw.js": "./browser-raw.js", 258 | "./test/domain.js": "./test/browser-domain.js" 259 | } 260 | }, 261 | "promise": { 262 | "path": "./", 263 | "main": "index.js" 264 | } 265 | } 266 | }, 267 | "../Library/Caches/Yarn/v3/npm-asap-2.0.6-e50347611d7e690943208bbdafebcbc2fb866d46/node_modules/asap": { 268 | "packages": { 269 | "asap": { 270 | "path": "./", 271 | "main": { 272 | "./asap": "./browser-asap.js", 273 | "./asap.js": "./browser-asap.js", 274 | "./raw": "./browser-raw.js", 275 | "./raw.js": "./browser-raw.js", 276 | "./test/domain.js": "./test/browser-domain.js" 277 | } 278 | } 279 | } 280 | }, 281 | "../Library/Caches/Yarn/v3/npm-setimmediate-1.0.5-290cbb232e306942d7d7ea9b83732ab7856f8285/node_modules/setimmediate": { 282 | "packages": { 283 | "setimmediate": { 284 | "path": "./", 285 | "main": "setImmediate.js" 286 | } 287 | } 288 | }, 289 | "../Library/Caches/Yarn/v3/npm-ua-parser-js-0.7.17-e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac/node_modules/ua-parser-js": { 290 | "packages": { 291 | "ua-parser-js": { 292 | "path": "./", 293 | "main": "src/ua-parser.js" 294 | } 295 | } 296 | }, 297 | "../Library/Caches/Yarn/v3/npm-prop-types-15.6.1-36644453564255ddda391191fb3a125cbdf654ca/node_modules/prop-types": { 298 | "packages": { 299 | "fbjs": { 300 | "path": "../../../npm-fbjs-0.8.16-5e67432f550dc41b572bf55847b8aca64e5337db/node_modules/fbjs", 301 | "main": "index.js" 302 | }, 303 | "loose-envify": { 304 | "path": "../../../npm-loose-envify-1.3.1-d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848/node_modules/loose-envify", 305 | "main": "index.js" 306 | }, 307 | "object-assign": { 308 | "path": "../../../npm-object-assign-4.1.1-2109adc7965887cfc05cbbd442cac8bfbb360863/node_modules/object-assign" 309 | }, 310 | "prop-types": { 311 | "path": "./", 312 | "main": "index.js" 313 | } 314 | } 315 | }, 316 | "../Library/Caches/Yarn/v3/npm-react-dom-16.3.2-cb90f107e09536d683d84ed5d4888e9640e0e4df/node_modules/react-dom": { 317 | "packages": { 318 | "fbjs": { 319 | "path": "../../../npm-fbjs-0.8.16-5e67432f550dc41b572bf55847b8aca64e5337db/node_modules/fbjs", 320 | "main": "index.js" 321 | }, 322 | "loose-envify": { 323 | "path": "../../../npm-loose-envify-1.3.1-d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848/node_modules/loose-envify", 324 | "main": "index.js" 325 | }, 326 | "object-assign": { 327 | "path": "../../../npm-object-assign-4.1.1-2109adc7965887cfc05cbbd442cac8bfbb360863/node_modules/object-assign" 328 | }, 329 | "prop-types": { 330 | "path": "../../../npm-prop-types-15.6.1-36644453564255ddda391191fb3a125cbdf654ca/node_modules/prop-types", 331 | "main": "index.js" 332 | }, 333 | "react": { 334 | "path": "../../../npm-react-16.3.2-fdc8420398533a1e58872f59091b272ce2f91ea9/node_modules/react", 335 | "main": "index.js" 336 | }, 337 | "react-dom": { 338 | "path": "./", 339 | "main": { 340 | "./server.js": "./server.browser.js" 341 | } 342 | } 343 | } 344 | } 345 | } 346 | } --------------------------------------------------------------------------------