├── .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 |
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 | }
--------------------------------------------------------------------------------