├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── example.js ├── index.js ├── lib └── flatten.js ├── package-lock.json ├── package.json └── test ├── index.js ├── node-modules ├── .gitignore ├── node_modules │ └── isarray │ │ └── package.json └── package.json ├── nsolid.json ├── react ├── package.json └── yarn.lock └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .nyc_output 3 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | language: node_js 3 | node_js: 4 | - node 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 NodeSource 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # universal-module-tree 2 | 3 | [![Build Status](https://travis-ci.org/nodesource/universal-module-tree.svg?branch=master)](https://travis-ci.org/nodesource/universal-module-tree) 4 | 5 | Get a full module tree from `package-lock.json`, `yarn.lock` or `node_modules/**`. 6 | 7 | ## Usage 8 | 9 | ```js 10 | const getTree = require('universal-module-tree') 11 | 12 | const tree = await getTree(__dirname) 13 | console.log(JSON.stringify(tree, null, 2)) 14 | ``` 15 | 16 | ```bash 17 | $ node example.js | head -n25 18 | { 19 | "children": [ 20 | { 21 | "data": { 22 | "name": "@yarnpkg/lockfile", 23 | "version": "1.1.0" 24 | }, 25 | "children": [] 26 | }, 27 | { 28 | "data": { 29 | "name": "read-package-tree", 30 | "version": "5.2.1" 31 | }, 32 | "children": [ 33 | { 34 | "data": { 35 | "name": "debuglog", 36 | "version": "1.0.1" 37 | }, 38 | "children": [] 39 | }, 40 | { 41 | "data": { 42 | "name": "dezalgo", 43 | 44 | ``` 45 | 46 | Or with [NSolid](https://nodesource.com/products/nsolid): 47 | 48 | ```js 49 | const getTree = require('universal-module-tree') 50 | 51 | nsolid.packages((err, packages) => { 52 | if (err) throw err 53 | const tree = getTree.fromNSolid(packages) 54 | console.log(JSON.stringify(tree, null, 2)) 55 | }) 56 | ``` 57 | 58 | ## Installation 59 | 60 | ```bash 61 | $ npm install universal-module-tree 62 | ``` 63 | 64 | ## API 65 | 66 | ### getTree(dir, { noDev = false }) => `Promise` 67 | ### getTree.fromPackageLock({ packageLock, packageJSON, noDev = false }) => `Object` 68 | ### getTree.fromYarnLock({ yarnLock, packageJSON, noDev = false }) => `Object` 69 | ### getTree.fromNodeModules(path, { noDev = false }) => `Promise` 70 | ### getTree.fromNSolid(packages) => `Object` 71 | ### getTree.flatten(tree) => `Array` 72 | 73 | ### Options 74 | 75 | - `noDev`: exclude `devDependencies` 76 | 77 | ## License & copyright 78 | 79 | Copyright © NodeSource. 80 | 81 | Licensed under the MIT open source license, see the LICENSE file for details. 82 | -------------------------------------------------------------------------------- /example.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const getTree = require('.') 4 | const stringify = require('json-stringify-safe') 5 | const minimist = require('minimist') 6 | 7 | const main = async () => { 8 | const argv = minimist(process.argv.slice(2)) 9 | const dir = argv._[0] || __dirname 10 | const tree = await getTree(dir, argv) 11 | console.log(stringify(tree, null, 2)) 12 | } 13 | 14 | main().catch(console.error) 15 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const fs = require('fs') 4 | const { promisify } = require('util') 5 | const lockfile = require('@yarnpkg/lockfile') 6 | const readPackageTree = require('read-package-tree') 7 | const flatten = require('./lib/flatten') 8 | const { join } = require('path') 9 | const debug = require('debug')('universal-module-tree') 10 | 11 | class Node { 12 | constructor (data) { 13 | this.data = data 14 | this.children = [] 15 | } 16 | } 17 | 18 | const getTree = async (dir, opts = {}) => 19 | await exists(`${dir}/package-lock.json`) 20 | ? getTreeFromPackageLock({ 21 | packageLock: await readJSON(`${dir}/package-lock.json`), 22 | packageJSON: await readJSON(`${dir}/package.json`), 23 | ...opts 24 | }) 25 | : await exists(`${dir}/yarn.lock`) 26 | ? getTreeFromYarnLock({ 27 | yarnLock: await promisify(fs.readFile)(`${dir}/yarn.lock`, 'utf8'), 28 | packageJSON: await readJSON(`${dir}/package.json`), 29 | ...opts 30 | }) 31 | : getTreeFromNodeModules(dir, opts) 32 | 33 | const getTreeFromPackageLock = ({ packageLock, packageJSON, noDev }) => { 34 | debug('get tree from package-lock.json') 35 | const tree = new Node() 36 | const pkgs = new Map() 37 | 38 | const walk = (treeNode, packageLockNode) => { 39 | for (const name of Object.keys(packageLockNode.requires || {})) { 40 | let dependenciesNode = packageLockNode 41 | while (!(dependenciesNode.dependencies || {})[name]) { 42 | dependenciesNode = dependenciesNode.parent 43 | } 44 | const dependencyNode = dependenciesNode.dependencies[name] 45 | dependencyNode.name = name 46 | if (!dependencyNode.parent) dependencyNode.parent = packageLockNode 47 | 48 | const id = `${name}@${dependencyNode.version}` 49 | let treeChild 50 | if (pkgs.has(id)) { 51 | treeChild = pkgs.get(id) 52 | treeNode.children.push(treeChild) 53 | } else { 54 | treeChild = new Node({ 55 | name, 56 | version: dependencyNode.version 57 | }) 58 | pkgs.set(id, treeChild) 59 | treeNode.children.push(treeChild) 60 | walk(treeChild, dependencyNode) 61 | } 62 | } 63 | } 64 | 65 | for (const [name] of getAllDependencies(packageJSON, { noDev })) { 66 | const packageLockNode = packageLock.dependencies[name] 67 | if (!packageLockNode) continue 68 | packageLockNode.name = name 69 | packageLockNode.parent = packageLock 70 | const treeNode = new Node({ 71 | name, 72 | version: packageLockNode.version 73 | }) 74 | tree.children.push(treeNode) 75 | walk(treeNode, packageLockNode, packageLock) 76 | } 77 | 78 | return tree 79 | } 80 | 81 | const getTreeFromYarnLock = ({ yarnLock: yarnLockString, packageJSON, noDev }) => { 82 | debug('get tree from yarn.lock') 83 | const yarnLock = lockfile.parse(yarnLockString) 84 | const tree = new Node() 85 | const pkgs = new Map() 86 | 87 | const walk = treeNode => { 88 | const id = `${treeNode.data.name}@${treeNode.data.semver}` 89 | const yarnLockNode = yarnLock.object[id] 90 | const dependencies = yarnLockNode.dependencies || {} 91 | 92 | for (const [name, semver] of Object.entries(dependencies)) { 93 | const id = `${name}@${semver}` 94 | const dependencyNode = yarnLock.object[id] 95 | dependencyNode.name = name 96 | 97 | let treeChild 98 | if (pkgs.has(id)) { 99 | treeChild = pkgs.get(id) 100 | treeNode.children.push(treeChild) 101 | } else { 102 | treeChild = new Node({ 103 | name, 104 | version: dependencyNode.version, 105 | semver 106 | }) 107 | pkgs.set(id, treeChild) 108 | treeNode.children.push(treeChild) 109 | walk(treeChild) 110 | } 111 | } 112 | } 113 | 114 | for (const [name, semver] of getAllDependencies(packageJSON, { noDev })) { 115 | if (/^link:/.test(semver)) continue 116 | if (!yarnLock.object[`${name}@${semver}`]) { 117 | const err = new Error('yarn.lock and package.json out of sync') 118 | err.code = 'YARN_LOCK_OUT_OF_SYNC' 119 | throw err 120 | } 121 | const treeNode = new Node({ 122 | name, 123 | version: yarnLock.object[`${name}@${semver}`].version, 124 | semver 125 | }) 126 | tree.children.push(treeNode) 127 | walk(treeNode) 128 | } 129 | 130 | return tree 131 | } 132 | 133 | const getTreeFromNodeModules = async (dir, { noDev } = {}) => { 134 | debug('get tree from node_modules/') 135 | const tree = new Node() 136 | const data = await promisify(readPackageTree)(dir) 137 | const pkgs = new Map() 138 | 139 | const walk = (treeNode, dataNode) => { 140 | const dependencies = dataNode === data 141 | ? getAllDependencies(dataNode.package) 142 | : Object.entries(dataNode.package.dependencies || {}) 143 | for (const [name] of dependencies) { 144 | let dependenciesNode = dataNode 145 | while (!dependenciesNode.children.find(c => c.package.name === name)) { 146 | dependenciesNode = dependenciesNode.parent 147 | } 148 | const dependencyNode = dependenciesNode.children.find(c => c.package.name === name) 149 | 150 | const id = `${name}@${dependencyNode.package.version}` 151 | let treeChild 152 | if (pkgs.has(id)) { 153 | treeChild = pkgs.get(id) 154 | treeNode.children.push(treeChild) 155 | } else { 156 | treeChild = new Node({ 157 | name, 158 | version: dependencyNode.package.version 159 | }) 160 | pkgs.set(id, treeChild) 161 | treeNode.children.push(treeChild) 162 | walk(treeChild, dependencyNode) 163 | } 164 | } 165 | } 166 | 167 | for (const [name] of await getAllDependencies(await readJSON(`${dir}/package.json`), { noDev })) { 168 | const dataNode = data.children.find(c => c.package.name === name) 169 | if (!dataNode) { 170 | const err = new Error('Please run `npm install` first') 171 | err.code = 'NO_NODE_MODULES' 172 | throw err 173 | } 174 | const treeNode = new Node({ 175 | name, 176 | version: dataNode.package.version 177 | }) 178 | tree.children.push(treeNode) 179 | walk(treeNode, dataNode, data) 180 | } 181 | 182 | return tree 183 | } 184 | 185 | const getTreeFromNSolid = packages => { 186 | debug('get tree from NSolid') 187 | const tree = new Node() 188 | const pkgs = new Map() 189 | 190 | const walk = (treeNode, packagesNode) => { 191 | const dependencies = packagesNode.dependencies 192 | for (const dependencyPathRel of dependencies) { 193 | const dependencyPathAbs = join(packagesNode.path, dependencyPathRel) 194 | const dependencyNode = packages.find(pkg => pkg.path === dependencyPathAbs) 195 | 196 | const id = `${dependencyNode.name}@${dependencyNode.version}` 197 | let treeChild 198 | if (pkgs.has(id)) { 199 | treeChild = pkgs.get(id) 200 | treeNode.children.push(treeChild) 201 | } else { 202 | treeChild = new Node({ 203 | name: dependencyNode.name, 204 | version: dependencyNode.version 205 | }) 206 | pkgs.set(id, treeChild) 207 | treeNode.children.push(treeChild) 208 | walk(treeChild, dependencyNode) 209 | } 210 | } 211 | } 212 | if (packages.length) { 213 | walk(tree, packages[0]) 214 | } 215 | 216 | return tree 217 | } 218 | 219 | const getAllDependencies = (pkg, { noDev } = {}) => 220 | new Set([ 221 | ...Object.entries(pkg.dependencies || {}), 222 | ...Object.entries((!noDev && pkg.devDependencies) || {}), 223 | ...Object.entries(pkg.optionalDependencies || {}) 224 | ]) 225 | 226 | const readJSON = async file => { 227 | const buf = await promisify(fs.readFile)(file) 228 | return JSON.parse(buf.toString()) 229 | } 230 | 231 | const exists = async file => { 232 | try { 233 | await promisify(fs.stat)(file) 234 | return true 235 | } catch (_) { 236 | return false 237 | } 238 | } 239 | 240 | module.exports = getTree 241 | module.exports.fromPackageLock = getTreeFromPackageLock 242 | module.exports.fromYarnLock = getTreeFromYarnLock 243 | module.exports.fromNodeModules = getTreeFromNodeModules 244 | module.exports.fromNSolid = getTreeFromNSolid 245 | module.exports.flatten = flatten 246 | -------------------------------------------------------------------------------- /lib/flatten.js: -------------------------------------------------------------------------------- 1 | const id = node => `${node.data.name}@${node.data.version}` 2 | 3 | const flatten = tree => { 4 | const pkgs = {} 5 | 6 | const walk = (node, path) => { 7 | let pkgObj 8 | if (pkgs[id(node)]) { 9 | pkgObj = pkgs[id(node)] 10 | pkgObj.paths.push(path) 11 | } else { 12 | pkgObj = { 13 | name: node.data.name, 14 | version: node.data.version, 15 | paths: [path] 16 | } 17 | pkgs[id(node)] = pkgObj 18 | for (const child of node.children) { 19 | walk(child, [...path, node]) 20 | } 21 | } 22 | } 23 | 24 | for (const child of tree.children) { 25 | walk(child, []) 26 | } 27 | 28 | return Object.values(pkgs) 29 | } 30 | 31 | module.exports = flatten 32 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "universal-module-tree", 3 | "version": "4.0.0", 4 | "license": "MIT", 5 | "repository": "nodesource/universal-module-tree", 6 | "description": "Get a module tree from package-lock.json / yarn.lock / node_modules", 7 | "scripts": { 8 | "test": "standard && npm run test:deps && nyc --lines 100 -- tap test/*.js", 9 | "test:deps": "dependency-check . --quiet && dependency-check . --quiet --unused --no-dev" 10 | }, 11 | "devDependencies": { 12 | "dependency-check": "^3.2.1", 13 | "json-stringify-safe": "^5.0.1", 14 | "minimist": "^1.2.0", 15 | "nyc": "^14.1.1", 16 | "standard": "^12.0.1", 17 | "tap": "^14.2.3" 18 | }, 19 | "dependencies": { 20 | "@yarnpkg/lockfile": "^1.1.0", 21 | "debug": "^4.1.1", 22 | "read-package-tree": "^5.2.1" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | const { test } = require('tap') 2 | const getTree = require('..') 3 | const fs = require('fs') 4 | 5 | test('getTree(dir)', async t => { 6 | const tree = await getTree(`${__dirname}/..`) 7 | t.ok(tree.children.length > 0, 'found dependencies') 8 | 9 | await t.test('noDev', async t => { 10 | const treeNoDev = await getTree(`${__dirname}/..`, { noDev: true }) 11 | t.ok(tree.children.length > 0, 'found dependencies') 12 | t.ok(treeNoDev.children.length < tree.children.length, 'less dependencies') 13 | }) 14 | 15 | await t.test('yarn', async t => { 16 | const tree = await getTree(`${__dirname}/react`) 17 | t.ok(tree.children.length > 0, 'found dependencies') 18 | }) 19 | 20 | await t.test('node_modules', async t => { 21 | const tree = await getTree(`${__dirname}/node-modules`) 22 | t.ok(tree.children.length > 0, 'found dependencies') 23 | }) 24 | }) 25 | 26 | test('getTree.fromPackageJSON', async t => { 27 | const tree = getTree.fromPackageLock({ 28 | packageJSON: require('../package'), 29 | packageLock: require('../package-lock') 30 | }) 31 | t.ok(tree.children.length > 0, 'found dependencies') 32 | 33 | await t.test('noDev', async t => { 34 | const treeNoDev = getTree.fromPackageLock({ 35 | packageJSON: require('../package'), 36 | packageLock: require('../package-lock'), 37 | noDev: true 38 | }) 39 | t.ok(tree.children.length > 0, 'found dependencies') 40 | t.ok(treeNoDev.children.length < tree.children.length, 'less dependencies') 41 | }) 42 | }) 43 | 44 | test('getTree.fromNodeModules', async t => { 45 | const tree = await getTree.fromNodeModules(`${__dirname}/..`) 46 | t.ok(tree.children.length > 0, 'found dependencies') 47 | 48 | await t.test('noDev', async t => { 49 | const treeNoDev = await getTree.fromNodeModules(`${__dirname}/..`, { noDev: true }) 50 | t.ok(tree.children.length > 0, 'found dependencies') 51 | t.ok(treeNoDev.children.length < tree.children.length, 'less dependencies') 52 | }) 53 | }) 54 | 55 | test('getTree.fromYarnLock', async t => { 56 | await t.test('this project', async t => { 57 | const tree = getTree.fromYarnLock({ 58 | yarnLock: fs.readFileSync(`${__dirname}/yarn.lock`, 'utf8'), 59 | packageJSON: require('../package') 60 | }) 61 | t.ok(tree.children.length > 0, 'found dependencies') 62 | 63 | await t.test('noDev', async t => { 64 | const treeNoDev = getTree.fromYarnLock({ 65 | yarnLock: fs.readFileSync(`${__dirname}/yarn.lock`, 'utf8'), 66 | packageJSON: require('../package'), 67 | noDev: true 68 | }) 69 | t.ok(tree.children.length > 0, 'found dependencies') 70 | t.ok(treeNoDev.children.length < tree.children.length, 'less dependencies') 71 | }) 72 | 73 | await t.test('out of sync with package.json', async t => { 74 | const pkg = require('../package') 75 | const err = new Error('yarn.lock and package.json out of sync') 76 | err.code = 'YARN_LOCK_OUT_OF_SYNC' 77 | t.throws(() => { 78 | getTree.fromYarnLock({ 79 | yarnLock: fs.readFileSync(`${__dirname}/yarn.lock`, 'utf8'), 80 | packageJSON: { 81 | ...pkg, 82 | dependencies: { 83 | ...pkg.dependencies, 84 | bloop: '1.0.0' 85 | } 86 | } 87 | }) 88 | }, err) 89 | }) 90 | }) 91 | await t.test('react', async t => { 92 | const tree = getTree.fromYarnLock({ 93 | yarnLock: fs.readFileSync(`${__dirname}/react/yarn.lock`, 'utf8'), 94 | packageJSON: require('./react/package') 95 | }) 96 | t.ok(tree.children.length > 0, 'found dependencies') 97 | 98 | await t.test('noDev', async t => { 99 | const treeNoDev = getTree.fromYarnLock({ 100 | yarnLock: fs.readFileSync(`${__dirname}/react/yarn.lock`, 'utf8'), 101 | packageJSON: require('./react/package'), 102 | noDev: true 103 | }) 104 | t.ok(tree.children.length > 0, 'found dependencies') 105 | t.ok(treeNoDev.children.length < tree.children.length, 'less dependencies') 106 | }) 107 | }) 108 | }) 109 | 110 | test('getTree.fromNSolid', async t => { 111 | await t.test('subfs', async t => { 112 | const tree = getTree.fromNSolid(require('./nsolid')) 113 | t.ok(tree.children.length > 0, 'found dependencies') 114 | }) 115 | await t.test('no dependencies', async t => { 116 | const tree = getTree.fromNSolid([]) 117 | t.ok(tree.children.length === 0, 'found no dependencies') 118 | }) 119 | }) 120 | 121 | test('getTree.flatten', async t => { 122 | let nodeB 123 | const nodeA = { 124 | data: { 125 | name: 'a', 126 | version: '0' 127 | }, 128 | children: [ 129 | nodeB = { 130 | data: { 131 | name: 'b', 132 | version: '0' 133 | }, 134 | children: [] 135 | } 136 | ] 137 | } 138 | nodeB.children.push(nodeA) 139 | t.deepEqual(getTree.flatten({ 140 | children: [nodeA] 141 | }), [ 142 | { 143 | name: 'a', 144 | version: '0', 145 | paths: [[], [nodeA, nodeB]] 146 | }, 147 | { 148 | name: 'b', 149 | version: '0', 150 | paths: [[nodeA]] 151 | } 152 | ]) 153 | }) 154 | -------------------------------------------------------------------------------- /test/node-modules/.gitignore: -------------------------------------------------------------------------------- 1 | !node_modules -------------------------------------------------------------------------------- /test/node-modules/node_modules/isarray/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "_from": "isarray", 3 | "_id": "isarray@2.0.4", 4 | "_inBundle": false, 5 | "_integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==", 6 | "_location": "/isarray", 7 | "_phantomChildren": {}, 8 | "_requested": { 9 | "type": "tag", 10 | "registry": true, 11 | "raw": "isarray", 12 | "name": "isarray", 13 | "escapedName": "isarray", 14 | "rawSpec": "", 15 | "saveSpec": null, 16 | "fetchSpec": "latest" 17 | }, 18 | "_requiredBy": [ 19 | "#USER", 20 | "/" 21 | ], 22 | "_resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz", 23 | "_shasum": "38e7bcbb0f3ba1b7933c86ba1894ddfc3781bbb7", 24 | "_spec": "isarray", 25 | "_where": "/Users/julian/dev/nodesource/universal-module-tree/test/node-modules", 26 | "author": { 27 | "name": "Julian Gruber", 28 | "email": "mail@juliangruber.com", 29 | "url": "http://juliangruber.com" 30 | }, 31 | "bugs": { 32 | "url": "https://github.com/juliangruber/isarray/issues" 33 | }, 34 | "bundleDependencies": false, 35 | "dependencies": {}, 36 | "deprecated": false, 37 | "description": "Array#isArray for older browsers", 38 | "devDependencies": { 39 | "tape": "~2.13.4" 40 | }, 41 | "files": [ 42 | "index.js" 43 | ], 44 | "homepage": "https://github.com/juliangruber/isarray", 45 | "keywords": [ 46 | "browser", 47 | "isarray", 48 | "array" 49 | ], 50 | "license": "MIT", 51 | "main": "index.js", 52 | "name": "isarray", 53 | "repository": { 54 | "type": "git", 55 | "url": "git://github.com/juliangruber/isarray.git" 56 | }, 57 | "scripts": { 58 | "test": "tape test.js" 59 | }, 60 | "testling": { 61 | "files": "test.js", 62 | "browsers": [ 63 | "ie/8..latest", 64 | "firefox/17..latest", 65 | "firefox/nightly", 66 | "chrome/22..latest", 67 | "chrome/canary", 68 | "opera/12..latest", 69 | "opera/next", 70 | "safari/5.1..latest", 71 | "ipad/6.0..latest", 72 | "iphone/6.0..latest", 73 | "android-browser/4.2..latest" 74 | ] 75 | }, 76 | "version": "2.0.4" 77 | } 78 | -------------------------------------------------------------------------------- /test/node-modules/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "isarray": "^2.0.4" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /test/nsolid.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "path": "/Users/julian/dev/juliangruber/subfs", 4 | "name": "subfs", 5 | "main": "index.js", 6 | "version": "1.0.0", 7 | "dependencies": [ 8 | "node_modules/tap" 9 | ], 10 | "modules": [] 11 | }, 12 | { 13 | "path": "/Users/julian/dev/juliangruber/subfs/node_modules/bind-obj-methods", 14 | "name": "bind-obj-methods", 15 | "main": "bind-obj-methods.js", 16 | "version": "1.0.0", 17 | "dependencies": [], 18 | "modules": [ 19 | { 20 | "path": "bind-obj-methods.js", 21 | "shasum": "fb9753c2145f8566a6794675d0991fa3c6991b3f" 22 | } 23 | ] 24 | }, 25 | { 26 | "path": "/Users/julian/dev/juliangruber/subfs/node_modules/bluebird", 27 | "name": "bluebird", 28 | "main": "./js/release/bluebird.js", 29 | "version": "3.5.3", 30 | "dependencies": [ 31 | "" 32 | ], 33 | "modules": [ 34 | { 35 | "path": "js/release/any.js", 36 | "shasum": "424dfe2a1afeaad729ca2be5ccfd443311716c41" 37 | }, 38 | { 39 | "path": "js/release/async.js", 40 | "shasum": "f37a2ef4a85f402afa91d9c765bd48fcf00c4f74" 41 | }, 42 | { 43 | "path": "js/release/bind.js", 44 | "shasum": "6ba64f83e985a1cb7dcf945490e4c280460ccb25" 45 | }, 46 | { 47 | "path": "js/release/bluebird.js", 48 | "shasum": "f68f4e491f49be5a5a3c5d04fafcd8abaf02fc2a" 49 | }, 50 | { 51 | "path": "js/release/call_get.js", 52 | "shasum": "b53dcc39da361dbc72a49ced90d5290d94c70b80" 53 | }, 54 | { 55 | "path": "js/release/cancel.js", 56 | "shasum": "1a6c901863d671048f58095fe9b568b2a8407729" 57 | }, 58 | { 59 | "path": "js/release/catch_filter.js", 60 | "shasum": "cbdedec0db19fe2af76d5594ed8bf819000d7c79" 61 | }, 62 | { 63 | "path": "js/release/context.js", 64 | "shasum": "ea7eb1ab2c8231fa6bfa8446cf730736735396e0" 65 | }, 66 | { 67 | "path": "js/release/debuggability.js", 68 | "shasum": "70ddac209e9020fccfd268bfe7e76f2dc3669498" 69 | }, 70 | { 71 | "path": "js/release/direct_resolve.js", 72 | "shasum": "470ca4d9a7e387ceceb383bc2640202f5fa6bda2" 73 | }, 74 | { 75 | "path": "js/release/each.js", 76 | "shasum": "44949d491571dd38f6ffdd777cb44f96aebb5fc8" 77 | }, 78 | { 79 | "path": "js/release/errors.js", 80 | "shasum": "98deaaee17f36851937108257e028a7e237b3f5e" 81 | }, 82 | { 83 | "path": "js/release/es5.js", 84 | "shasum": "019c4e8b62031ea49aedc86dedd20318c6122698" 85 | }, 86 | { 87 | "path": "js/release/filter.js", 88 | "shasum": "a5f3aee4afbc67d372e5b4fbaeac047d0d9c779b" 89 | }, 90 | { 91 | "path": "js/release/finally.js", 92 | "shasum": "cc388e93ecc2e12145c080cc67b0d8517e481c13" 93 | }, 94 | { 95 | "path": "js/release/generators.js", 96 | "shasum": "6b334d17275b48548e44f74f477b2e8bd49da304" 97 | }, 98 | { 99 | "path": "js/release/join.js", 100 | "shasum": "5ab50e4fd76d09506700b47e7672c9d528816d4b" 101 | }, 102 | { 103 | "path": "js/release/map.js", 104 | "shasum": "4d96c67c999d7f8a155934d25bfe8cc4912ad469" 105 | }, 106 | { 107 | "path": "js/release/method.js", 108 | "shasum": "02a5a493c2cf2045fbb20b2751381e4b4e29dbe8" 109 | }, 110 | { 111 | "path": "js/release/nodeback.js", 112 | "shasum": "46fc87ede6ca68434439a5216fe8e6f89d8d8a1f" 113 | }, 114 | { 115 | "path": "js/release/nodeify.js", 116 | "shasum": "ebd75c010fcf1c4f709f4b444e62b80cfcde2a0f" 117 | }, 118 | { 119 | "path": "js/release/promise.js", 120 | "shasum": "7ea023ff37a245f9cfff4258f2abb2ab9be5a011" 121 | }, 122 | { 123 | "path": "js/release/promise_array.js", 124 | "shasum": "2b05f82b39c408715260b264dbeb886d080efc59" 125 | }, 126 | { 127 | "path": "js/release/promisify.js", 128 | "shasum": "3831be99120a57a3c07406f7012467f02346e92c" 129 | }, 130 | { 131 | "path": "js/release/props.js", 132 | "shasum": "d26e05c3860fd45b7ae9008995493c6d01c2f2e7" 133 | }, 134 | { 135 | "path": "js/release/queue.js", 136 | "shasum": "e6fddd439658a46c57132ec8d07dd04bf1d743e6" 137 | }, 138 | { 139 | "path": "js/release/race.js", 140 | "shasum": "5f5b5403be19793dec5658af27fe996173eb4990" 141 | }, 142 | { 143 | "path": "js/release/reduce.js", 144 | "shasum": "8f0d6b75ed5682d3a7e45254d76618258b45bb2a" 145 | }, 146 | { 147 | "path": "js/release/schedule.js", 148 | "shasum": "bad77d032baf76d04dd40cc5f01c5d4adebd4578" 149 | }, 150 | { 151 | "path": "js/release/settle.js", 152 | "shasum": "36f97c3732ae907af622fd4c859d29da1255fdfa" 153 | }, 154 | { 155 | "path": "js/release/some.js", 156 | "shasum": "b548ddd7eb6b35ae6e97d931e0a8ef6dd512b3b5" 157 | }, 158 | { 159 | "path": "js/release/synchronous_inspection.js", 160 | "shasum": "21be4c93fd5b93b07315c5edc930800e686e4dea" 161 | }, 162 | { 163 | "path": "js/release/thenables.js", 164 | "shasum": "b06e617f4b1e5c9c33c9c4e0baabe709550154b1" 165 | }, 166 | { 167 | "path": "js/release/timers.js", 168 | "shasum": "ad830b808b63bd4b291a3b23210bdaf850f1f818" 169 | }, 170 | { 171 | "path": "js/release/using.js", 172 | "shasum": "5b287a7d967647d38091aec63f880abc46caeb4f" 173 | }, 174 | { 175 | "path": "js/release/util.js", 176 | "shasum": "bf2665ce52c39c8ac3c85150791feb2d3ca0bc50" 177 | } 178 | ] 179 | }, 180 | { 181 | "path": "/Users/julian/dev/juliangruber/subfs/node_modules/clean-yaml-object", 182 | "name": "clean-yaml-object", 183 | "version": "0.1.0", 184 | "dependencies": [], 185 | "modules": [ 186 | { 187 | "path": "index.js", 188 | "shasum": "5c50bddd29ae0b777251f1f734105040faa05cc4" 189 | } 190 | ] 191 | }, 192 | { 193 | "path": "/Users/julian/dev/juliangruber/subfs/node_modules/deeper", 194 | "name": "deeper", 195 | "version": "2.1.0", 196 | "dependencies": [ 197 | "../tap" 198 | ], 199 | "modules": [ 200 | { 201 | "path": "index.js", 202 | "shasum": "9a236124000ffd500300fa588bb049a0889c361e" 203 | } 204 | ] 205 | }, 206 | { 207 | "path": "/Users/julian/dev/juliangruber/subfs/node_modules/function-loop", 208 | "name": "function-loop", 209 | "main": "index.js", 210 | "version": "1.0.1", 211 | "dependencies": [ 212 | "../tap" 213 | ], 214 | "modules": [ 215 | { 216 | "path": "index.js", 217 | "shasum": "c397784cac1abb102a9f15f64aae06cd9f497b7a" 218 | } 219 | ] 220 | }, 221 | { 222 | "path": "/Users/julian/dev/juliangruber/subfs/node_modules/js-yaml", 223 | "name": "js-yaml", 224 | "version": "3.12.1", 225 | "dependencies": [ 226 | "node_modules/esprima" 227 | ], 228 | "modules": [ 229 | { 230 | "path": "index.js", 231 | "shasum": "1782c208617a1e4a087c61d82da6efd86d04cb82" 232 | }, 233 | { 234 | "path": "lib/js-yaml.js", 235 | "shasum": "faf3ec71c84b29e43e20adc783933d3aaf2c03e0" 236 | }, 237 | { 238 | "path": "lib/js-yaml/common.js", 239 | "shasum": "f98f5657b7f32c09d39b720d18d07fab29b09c05" 240 | }, 241 | { 242 | "path": "lib/js-yaml/dumper.js", 243 | "shasum": "6aab7f86a7597757033a677c1dcbc8655e173a8d" 244 | }, 245 | { 246 | "path": "lib/js-yaml/exception.js", 247 | "shasum": "311052458bd357250b6809e33f1bfc66871abe1b" 248 | }, 249 | { 250 | "path": "lib/js-yaml/loader.js", 251 | "shasum": "5f98444a81c24dbbf31f9fdc02bb788c1cbb1cde" 252 | }, 253 | { 254 | "path": "lib/js-yaml/mark.js", 255 | "shasum": "9bf058de26980a50acf01c4d257f8c66060bbf99" 256 | }, 257 | { 258 | "path": "lib/js-yaml/schema.js", 259 | "shasum": "3bb3cc230b10b355700a9f60a029cc58e960b25d" 260 | }, 261 | { 262 | "path": "lib/js-yaml/schema/core.js", 263 | "shasum": "3942b19d860daad732f574c060535ef03e77bf4e" 264 | }, 265 | { 266 | "path": "lib/js-yaml/schema/default_full.js", 267 | "shasum": "f49d934b90306c570d932a837ff4d8b5620b65c8" 268 | }, 269 | { 270 | "path": "lib/js-yaml/schema/default_safe.js", 271 | "shasum": "4e6038ca3bd2862b87aeac97d58f72f13bd1dcb2" 272 | }, 273 | { 274 | "path": "lib/js-yaml/schema/failsafe.js", 275 | "shasum": "93b94b7577f2529bd0fbbb9115df58d994204b8f" 276 | }, 277 | { 278 | "path": "lib/js-yaml/schema/json.js", 279 | "shasum": "83b3938255db10353d6cb92bd8a8fc72490277fd" 280 | }, 281 | { 282 | "path": "lib/js-yaml/type.js", 283 | "shasum": "844dd1243c2b6a6cac723f50da8699c089ff14a5" 284 | }, 285 | { 286 | "path": "lib/js-yaml/type/binary.js", 287 | "shasum": "59c69683c084d982fd919bf1c49ee8b67cf2ac9c" 288 | }, 289 | { 290 | "path": "lib/js-yaml/type/bool.js", 291 | "shasum": "2524fe24d6dcd4e4a14b62696a5fd16e54d8f3f4" 292 | }, 293 | { 294 | "path": "lib/js-yaml/type/float.js", 295 | "shasum": "7949500ad6a0be9321f1e880c80af46a41ae88d3" 296 | }, 297 | { 298 | "path": "lib/js-yaml/type/int.js", 299 | "shasum": "ce6a30244a3ce017aaf98317d991379f2bc98ee0" 300 | }, 301 | { 302 | "path": "lib/js-yaml/type/js/function.js", 303 | "shasum": "495916644b7267794291ceb743aba58eab2b45be" 304 | }, 305 | { 306 | "path": "lib/js-yaml/type/js/regexp.js", 307 | "shasum": "fa2f404f30b0588703ca112e9ef53eee3d61ad6f" 308 | }, 309 | { 310 | "path": "lib/js-yaml/type/js/undefined.js", 311 | "shasum": "6ceced3a6cd321903999162508c5ba156a08d3f3" 312 | }, 313 | { 314 | "path": "lib/js-yaml/type/map.js", 315 | "shasum": "2c6bd8f6087b3ba90952279dc4b40e283a6a4b7d" 316 | }, 317 | { 318 | "path": "lib/js-yaml/type/merge.js", 319 | "shasum": "5b5d2be0a4ec4ca47376d88c872a2772bd876ffa" 320 | }, 321 | { 322 | "path": "lib/js-yaml/type/null.js", 323 | "shasum": "5a1ca7a1f393f1a831dac6021bec81614cf483cd" 324 | }, 325 | { 326 | "path": "lib/js-yaml/type/omap.js", 327 | "shasum": "27ae167ab147e1a9a155440eef86c78a6776999e" 328 | }, 329 | { 330 | "path": "lib/js-yaml/type/pairs.js", 331 | "shasum": "a62980f470f956a1102ddc33a533dd356d964342" 332 | }, 333 | { 334 | "path": "lib/js-yaml/type/seq.js", 335 | "shasum": "02deef81e8770ec42adf39e0ac93a8efcae87cf2" 336 | }, 337 | { 338 | "path": "lib/js-yaml/type/set.js", 339 | "shasum": "54bd5eec6a8a57a8792d540f30343513077fe7e8" 340 | }, 341 | { 342 | "path": "lib/js-yaml/type/str.js", 343 | "shasum": "efd9f046c952cd16f88e8b5dcdcf25f612f6974f" 344 | }, 345 | { 346 | "path": "lib/js-yaml/type/timestamp.js", 347 | "shasum": "1746736bdaee28bf5cb426370fd6d1d609721fdc" 348 | } 349 | ] 350 | }, 351 | { 352 | "path": "/Users/julian/dev/juliangruber/subfs/node_modules/js-yaml/node_modules/esprima", 353 | "name": "esprima", 354 | "main": "dist/esprima.js", 355 | "version": "4.0.1", 356 | "dependencies": [], 357 | "modules": [ 358 | { 359 | "path": "dist/esprima.js", 360 | "shasum": "c393489988d0261842c5c6ed4210efc5ad02dd5c" 361 | } 362 | ] 363 | }, 364 | { 365 | "path": "/Users/julian/dev/juliangruber/subfs/node_modules/only-shallow", 366 | "name": "only-shallow", 367 | "main": "index.js", 368 | "version": "1.2.0", 369 | "dependencies": [ 370 | "../tap" 371 | ], 372 | "modules": [ 373 | { 374 | "path": "index.js", 375 | "shasum": "41fe2e4f45030ea83db4d0b6b9e9479cef1fadac" 376 | } 377 | ] 378 | }, 379 | { 380 | "path": "/Users/julian/dev/juliangruber/subfs/node_modules/own-or", 381 | "name": "own-or", 382 | "main": "own-or.js", 383 | "version": "1.0.0", 384 | "dependencies": [], 385 | "modules": [ 386 | { 387 | "path": "own-or.js", 388 | "shasum": "1f05e933de58984ff00ea6ddf860be0b06d8d65b" 389 | } 390 | ] 391 | }, 392 | { 393 | "path": "/Users/julian/dev/juliangruber/subfs/node_modules/own-or-env", 394 | "name": "own-or-env", 395 | "main": "own-or-env.js", 396 | "version": "1.0.1", 397 | "dependencies": [ 398 | "../own-or", 399 | "../tap" 400 | ], 401 | "modules": [ 402 | { 403 | "path": "own-or-env.js", 404 | "shasum": "db313dfb0470966e419f916f9fd937ac2998c6ea" 405 | } 406 | ] 407 | }, 408 | { 409 | "path": "/Users/julian/dev/juliangruber/subfs/node_modules/signal-exit", 410 | "name": "signal-exit", 411 | "main": "index.js", 412 | "version": "3.0.2", 413 | "dependencies": [ 414 | "../tap" 415 | ], 416 | "modules": [ 417 | { 418 | "path": "index.js", 419 | "shasum": "4c79d6ab52a7473a4e5e096142c619e4fbbac3a6" 420 | }, 421 | { 422 | "path": "signals.js", 423 | "shasum": "6e1c2ff72044c1901590ffd119245461fb85a6bc" 424 | } 425 | ] 426 | }, 427 | { 428 | "path": "/Users/julian/dev/juliangruber/subfs/node_modules/source-map", 429 | "name": "source-map", 430 | "main": "./source-map.js", 431 | "version": "0.5.7", 432 | "dependencies": [], 433 | "modules": [ 434 | { 435 | "path": "lib/array-set.js", 436 | "shasum": "ad62f4ee15345ba799a00c59dd226690b4d1d1d2" 437 | }, 438 | { 439 | "path": "lib/base64-vlq.js", 440 | "shasum": "493d3d895198dfaefe88d2b066c272552ea35889" 441 | }, 442 | { 443 | "path": "lib/base64.js", 444 | "shasum": "269e8e4dcb82db12f6e2a6187e7be46bee604ab0" 445 | }, 446 | { 447 | "path": "lib/binary-search.js", 448 | "shasum": "b4333085d02fb4c091361de85d5cb368a3ce7632" 449 | }, 450 | { 451 | "path": "lib/mapping-list.js", 452 | "shasum": "68a9ed5c0a48a384f64efaec04444a464952509d" 453 | }, 454 | { 455 | "path": "lib/quick-sort.js", 456 | "shasum": "e4adf67561f701e7563d7db979e5c9ff8d60267b" 457 | }, 458 | { 459 | "path": "lib/source-map-consumer.js", 460 | "shasum": "bf1d511c205859d7f157c1e89fd71492fd61ad4b" 461 | }, 462 | { 463 | "path": "lib/source-map-generator.js", 464 | "shasum": "2e52163409a7d8e48e44e4da60e59e9ad2beae3b" 465 | }, 466 | { 467 | "path": "lib/source-node.js", 468 | "shasum": "731e14ee0e178a85c2db8b5e96aea97c635a29c2" 469 | }, 470 | { 471 | "path": "lib/util.js", 472 | "shasum": "91079da4160ce05a7760b1e2bdc5f3d2cca955b0" 473 | }, 474 | { 475 | "path": "source-map.js", 476 | "shasum": "54dd50c132e3a298bcad252861389300ac0ce265" 477 | } 478 | ] 479 | }, 480 | { 481 | "path": "/Users/julian/dev/juliangruber/subfs/node_modules/source-map-support", 482 | "name": "source-map-support", 483 | "main": "./source-map-support.js", 484 | "version": "0.4.18", 485 | "dependencies": [ 486 | "../source-map" 487 | ], 488 | "modules": [ 489 | { 490 | "path": "source-map-support.js", 491 | "shasum": "308ed3c862a6b7513bc68f27184c666f4196a764" 492 | } 493 | ] 494 | }, 495 | { 496 | "path": "/Users/julian/dev/juliangruber/subfs/node_modules/stack-utils", 497 | "name": "stack-utils", 498 | "version": "1.0.2", 499 | "dependencies": [ 500 | "../bluebird", 501 | "../tap" 502 | ], 503 | "modules": [ 504 | { 505 | "path": "index.js", 506 | "shasum": "63da69a3b5280cbfe8642183819c76e2d5e89b19" 507 | } 508 | ] 509 | }, 510 | { 511 | "path": "/Users/julian/dev/juliangruber/subfs/node_modules/tap", 512 | "name": "tap", 513 | "main": "lib/tap.js", 514 | "version": "10.2.2", 515 | "dependencies": [ 516 | "../bind-obj-methods", 517 | "../bluebird", 518 | "../clean-yaml-object", 519 | "../deeper", 520 | "../function-loop", 521 | "../js-yaml", 522 | "../only-shallow", 523 | "../own-or", 524 | "../own-or-env", 525 | "../signal-exit", 526 | "../source-map-support", 527 | "../stack-utils", 528 | "../tap-parser", 529 | "../tmatch", 530 | "../trivial-deferred", 531 | "../yapool" 532 | ], 533 | "modules": [ 534 | { 535 | "path": "lib/asserts.js", 536 | "shasum": "7d9b65bf73e9b5b76051909b77b32b25dd9c5aef" 537 | }, 538 | { 539 | "path": "lib/base.js", 540 | "shasum": "8d7464106982838e2a98af4e6733c4085bf8bac6" 541 | }, 542 | { 543 | "path": "lib/clean-yaml-object.js", 544 | "shasum": "f2a145c86115e2b49c9080b1f697e34145590029" 545 | }, 546 | { 547 | "path": "lib/diags.js", 548 | "shasum": "d59d9cd406c6b110d718028e717e3f760b199dda" 549 | }, 550 | { 551 | "path": "lib/extra-from-error.js", 552 | "shasum": "4cd74293608741b481886567b945c3190c9b3f41" 553 | }, 554 | { 555 | "path": "lib/mocha.js", 556 | "shasum": "c176dcadfd5b7c0e3e878010562f4e8a7022e33a" 557 | }, 558 | { 559 | "path": "lib/obj-to-yaml.js", 560 | "shasum": "0beb6c526380c70ed8b80e2f015a6321f46283e2" 561 | }, 562 | { 563 | "path": "lib/parse-test-args.js", 564 | "shasum": "9e8842f4e9840e42546cfafb695460a50567ba33" 565 | }, 566 | { 567 | "path": "lib/point.js", 568 | "shasum": "3beb42a2a04ccbb4ec398a5ec92aba0c8aee4aa7" 569 | }, 570 | { 571 | "path": "lib/spawn.js", 572 | "shasum": "e7341d4c394cd66a385cb263b8c37f83d16258b0" 573 | }, 574 | { 575 | "path": "lib/stack.js", 576 | "shasum": "95e71707c6ae481605d566d90ebf99043a56007b" 577 | }, 578 | { 579 | "path": "lib/stdin.js", 580 | "shasum": "f4f8b1f450dd6fe5b1ce1ca9cc4cab20dc90bf6c" 581 | }, 582 | { 583 | "path": "lib/synonyms.js", 584 | "shasum": "de659acc54cfdfcf6422ff72bd478a09608a582f" 585 | }, 586 | { 587 | "path": "lib/tap.js", 588 | "shasum": "9902080a8411b35318aa7798fc0b9aff2a2968e6" 589 | }, 590 | { 591 | "path": "lib/test.js", 592 | "shasum": "d299099e0ee047327f224f6b061dae8eb43e7ea0" 593 | } 594 | ] 595 | }, 596 | { 597 | "path": "/Users/julian/dev/juliangruber/subfs/node_modules/tap-parser", 598 | "name": "tap-parser", 599 | "main": "index.js", 600 | "version": "5.4.0", 601 | "dependencies": [ 602 | "../js-yaml", 603 | "../tap" 604 | ], 605 | "modules": [ 606 | { 607 | "path": "index.js", 608 | "shasum": "c0cd16359ed7efda34a1cc0271da8ae7a2a0f80e" 609 | } 610 | ] 611 | }, 612 | { 613 | "path": "/Users/julian/dev/juliangruber/subfs/node_modules/tmatch", 614 | "name": "tmatch", 615 | "main": "index.js", 616 | "version": "3.1.0", 617 | "dependencies": [ 618 | "../tap" 619 | ], 620 | "modules": [ 621 | { 622 | "path": "index.js", 623 | "shasum": "8f37db1f12d4f2d7a88ff0b6674f200007a5d95e" 624 | } 625 | ] 626 | }, 627 | { 628 | "path": "/Users/julian/dev/juliangruber/subfs/node_modules/trivial-deferred", 629 | "name": "trivial-deferred", 630 | "main": "index.js", 631 | "version": "1.0.1", 632 | "dependencies": [ 633 | "../tap" 634 | ], 635 | "modules": [ 636 | { 637 | "path": "index.js", 638 | "shasum": "4bc15a159fd8f7e68a0d3685e98681ea8935dddc" 639 | } 640 | ] 641 | }, 642 | { 643 | "path": "/Users/julian/dev/juliangruber/subfs/node_modules/yapool", 644 | "name": "yapool", 645 | "main": "index.js", 646 | "version": "1.0.0", 647 | "dependencies": [ 648 | "../tap" 649 | ], 650 | "modules": [ 651 | { 652 | "path": "index.js", 653 | "shasum": "8ce82c38a402f1a16f4c3afe77d4b68ca52dfa79" 654 | } 655 | ] 656 | } 657 | ] -------------------------------------------------------------------------------- /test/react/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "workspaces": [ 4 | "packages/*" 5 | ], 6 | "devDependencies": { 7 | "art": "^0.10.1", 8 | "babel-cli": "^6.6.5", 9 | "babel-code-frame": "^6.26.0", 10 | "babel-core": "^6.0.0", 11 | "babel-eslint": "^10.0.0", 12 | "babel-jest": "^23.0.1", 13 | "babel-plugin-check-es2015-constants": "^6.5.0", 14 | "babel-plugin-external-helpers": "^6.22.0", 15 | "babel-plugin-syntax-trailing-function-commas": "^6.5.0", 16 | "babel-plugin-transform-async-to-generator": "^6.22.0", 17 | "babel-plugin-transform-class-properties": "^6.11.5", 18 | "babel-plugin-transform-es2015-arrow-functions": "^6.5.2", 19 | "babel-plugin-transform-es2015-block-scoped-functions": "^6.5.0", 20 | "babel-plugin-transform-es2015-block-scoping": "^6.23.0", 21 | "babel-plugin-transform-es2015-classes": "^6.5.2", 22 | "babel-plugin-transform-es2015-computed-properties": "^6.5.2", 23 | "babel-plugin-transform-es2015-destructuring": "^6.5.0", 24 | "babel-plugin-transform-es2015-for-of": "^6.5.2", 25 | "babel-plugin-transform-es2015-literals": "^6.5.0", 26 | "babel-plugin-transform-es2015-modules-commonjs": "^6.5.2", 27 | "babel-plugin-transform-es2015-object-super": "^6.5.0", 28 | "babel-plugin-transform-es2015-parameters": "^6.5.0", 29 | "babel-plugin-transform-es2015-shorthand-properties": "^6.5.0", 30 | "babel-plugin-transform-es2015-spread": "^6.5.2", 31 | "babel-plugin-transform-es2015-template-literals": "^6.5.2", 32 | "babel-plugin-transform-object-rest-spread": "^6.6.5", 33 | "babel-plugin-transform-react-jsx-source": "^6.8.0", 34 | "babel-plugin-transform-regenerator": "^6.26.0", 35 | "babel-preset-react": "^6.5.0", 36 | "babel-traverse": "^6.9.0", 37 | "babylon": "6.18.0", 38 | "chalk": "^1.1.3", 39 | "cli-table": "^0.3.1", 40 | "coffee-script": "^1.8.0", 41 | "core-js": "^2.2.1", 42 | "coveralls": "^2.11.6", 43 | "create-react-class": "^15.6.3", 44 | "cross-env": "^5.1.1", 45 | "danger": "^3.0.4", 46 | "error-stack-parser": "^2.0.2", 47 | "eslint": "^4.1.0", 48 | "eslint-config-fbjs": "^1.1.1", 49 | "eslint-plugin-babel": "^3.3.0", 50 | "eslint-plugin-flowtype": "^2.25.0", 51 | "eslint-plugin-jest": "^21.6.1", 52 | "eslint-plugin-no-for-of-loops": "^1.0.0", 53 | "eslint-plugin-react": "^6.7.1", 54 | "eslint-plugin-react-internal": "link:./scripts/eslint-rules/", 55 | "fbjs-scripts": "^0.8.3", 56 | "filesize": "^3.5.6", 57 | "flow-bin": "^0.72.0", 58 | "glob": "^6.0.4", 59 | "glob-stream": "^6.1.0", 60 | "google-closure-compiler": "20190106.0.0", 61 | "gzip-size": "^3.0.0", 62 | "jasmine-check": "^1.0.0-rc.0", 63 | "jest": "^23.1.0", 64 | "jest-diff": "^23.0.1", 65 | "minimatch": "^3.0.4", 66 | "minimist": "^1.2.0", 67 | "mkdirp": "^0.5.1", 68 | "ncp": "^2.0.0", 69 | "object-assign": "^4.1.1", 70 | "prettier": "1.13.7", 71 | "prop-types": "^15.6.2", 72 | "random-seed": "^0.3.0", 73 | "react-lifecycles-compat": "^3.0.2", 74 | "rimraf": "^2.6.1", 75 | "rollup": "^0.52.1", 76 | "rollup-plugin-babel": "^3.0.1", 77 | "rollup-plugin-commonjs": "^8.2.6", 78 | "rollup-plugin-node-resolve": "^2.1.1", 79 | "rollup-plugin-prettier": "^0.3.0", 80 | "rollup-plugin-replace": "^2.0.0", 81 | "rollup-plugin-strip-banner": "^0.2.0", 82 | "semver": "^5.5.0", 83 | "targz": "^1.0.1", 84 | "through2": "^2.0.0", 85 | "tmp": "~0.0.28", 86 | "typescript": "~1.8.10", 87 | "@mattiasbuelens/web-streams-polyfill": "0.1.0" 88 | }, 89 | "devEngines": { 90 | "node": "8.x || 9.x || 10.x || 11.x" 91 | }, 92 | "jest": { 93 | "testRegex": "/scripts/jest/dont-run-jest-directly\\.js$" 94 | }, 95 | "scripts": { 96 | "build": "node ./scripts/rollup/build.js", 97 | "linc": "node ./scripts/tasks/linc.js", 98 | "lint": "node ./scripts/tasks/eslint.js", 99 | "lint-build": "node ./scripts/rollup/validate/index.js", 100 | "postinstall": "node node_modules/fbjs-scripts/node/check-dev-engines.js package.json && node ./scripts/flow/createFlowConfigs.js", 101 | "debug-test": "cross-env NODE_ENV=development node --inspect-brk node_modules/.bin/jest --config ./scripts/jest/config.source.js --runInBand", 102 | "test": "cross-env NODE_ENV=development jest --config ./scripts/jest/config.source.js", 103 | "test-persistent": "cross-env NODE_ENV=development jest --config ./scripts/jest/config.source-persistent.js", 104 | "test-fire": "cross-env NODE_ENV=development jest --config ./scripts/jest/config.source-fire.js", 105 | "test-prod": "cross-env NODE_ENV=production jest --config ./scripts/jest/config.source.js", 106 | "test-fire-prod": "cross-env NODE_ENV=production jest --config ./scripts/jest/config.source-fire.js", 107 | "test-prod-build": "yarn test-build-prod", 108 | "test-build": "cross-env NODE_ENV=development jest --config ./scripts/jest/config.build.js", 109 | "test-build-prod": "cross-env NODE_ENV=production jest --config ./scripts/jest/config.build.js", 110 | "flow": "node ./scripts/tasks/flow.js", 111 | "flow-ci": "node ./scripts/tasks/flow-ci.js", 112 | "prettier": "node ./scripts/prettier/index.js write-changed", 113 | "prettier-all": "node ./scripts/prettier/index.js write", 114 | "version-check": "node ./scripts/tasks/version-check.js" 115 | } 116 | } 117 | --------------------------------------------------------------------------------