# resolve-tree

> Recursively resolve node.js modules and its dependencies looking in node_modules trees

Latest version **0.1.14** (published 2019-07-08) · MIT license · 0 weekly downloads

## Install

```sh
npm install resolve-tree
pnpm add resolve-tree
yarn add resolve-tree
bun add resolve-tree
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.1.14 |
| Published | 2019-07-08 |
| First published | 2015-11-29 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Node | >= 0.12 |
| Dependencies | 3 |
| Unpacked size | 23.4 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 9 |
| Author | Tomas Aparicio |
| Maintainers | h2non |
| Keywords | resolve |

## Links

- npm: https://www.npmjs.com/package/resolve-tree
- Repository: https://github.com/h2non/resolve-tree
- Homepage: https://github.com/h2non/resolve-tree#readme
- Issues: https://github.com/h2non/resolve-tree/issues
- npm.io page: https://npm.io/package/resolve-tree

## Dependencies (3)

- [fw](https://npm.io/package/fw.md) ^0.1.2
- [resolve](https://npm.io/package/resolve.md) ^1.1.6
- [object-assign](https://npm.io/package/object-assign.md) ^4.0.1

## Alternatives

- [base64url](https://npm.io/package/base64url.md) — 6.1M weekly downloads
- [get-installed-path](https://npm.io/package/get-installed-path.md) — 502.9K weekly downloads
- [@uppy/url](https://npm.io/package/@uppy/url.md) — 185.8K weekly downloads
- [@d3fc/d3fc-shape](https://npm.io/package/@d3fc/d3fc-shape.md) — 16.2K weekly downloads
- [localizer](https://npm.io/package/localizer.md) — 226 weekly downloads

## Recent versions

- 0.1.14 (latest) — 2019-07-08
- 0.1.13 — 2016-07-18
- 0.1.12 — 2016-07-18
- 0.1.11 — 2016-05-07
- 0.1.10 — 2016-04-06
- 0.1.9 — 2016-03-05
- 0.1.8 — 2016-02-26
- 0.1.7 — 2016-02-10
- 0.1.6 — 2016-01-16
- 0.1.5 — 2016-01-14
- 0.1.4 — 2016-01-13
- 0.1.3 — 2016-01-13
- 0.1.2 — 2016-01-13
- 0.1.1 — 2015-11-29
- 0.1.0 — 2015-11-29

## README

# resolve-tree [![Build Status](https://api.travis-ci.org/h2non/resolve-tree.svg?branch=master&style=flat)](https://travis-ci.org/h2non/resolve-tree) [![Code Climate](https://codeclimate.com/github/h2non/resolve-tree/badges/gpa.svg)](https://codeclimate.com/github/h2non/resolve-tree) [![NPM](https://img.shields.io/npm/v/resolve-tree.svg)](https://www.npmjs.org/package/resolve-tree) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com)

Recursively resolve node.js modules and its dependencies looking in `node_modules` trees.

The module resolution algorithm behavies like [`require.resolve`](https://nodejs.org/docs/v0.4.8/api/all.html#all_Together...) in node.js.
It also mimics the recursive module resolution behavior used by `npm`.

## Features

- Recursively resolves a node_modules dependency tree
- Proper error reporting if some package cannot be resolved or is missing
- Detects repeated and circular dependencies across nested dependency trees.
- Module lookup algorithm behavies like [`require.resolve`](https://nodejs.org/docs/v0.4.8/api/all.html#all_Together...)
- Produces a detailed abstract dependency tree representation
- Provides convenient helpers that you will love
- Almost dependency free (only uses some stable tiny modules)
- Fast: all the I/O operations are executed asynchronously in parallel

## Not supported yet

- Semantic version operator based resolution

## Installation

```bash
npm install resolve-tree
```

## Usage

```js
const resolve = require('resolve-tree')

// Names of the packages to resolve
const names = ['foo', 'bar']

// Custom optional params for the resolution
const opts = {
  basedir: process.cwd(),
  lookups: ['dependencies', 'devDependencies']
}

resolve.packages(names, opts, function (err, tree) {
  if (err) return console.error(err)

  const json = JSON.stringify(tree, null, 2)
  console.log(json)
})
```

The resolved dependency tree serialized to JSON looks like this:
```json
[{
  "name": "foo",
  "manifest": "/Users/h2non/Projects/resolve-tree/fixtures/simple/node_modules/foo/package.json",
  "basedir": "/Users/h2non/Projects/resolve-tree/fixtures/simple",
  "main": "/Users/h2non/Projects/resolve-tree/fixtures/simple/node_modules/foo/index.js",
  "root": "/Users/h2non/Projects/resolve-tree/fixtures/simple/node_modules/foo",
  "version": "0.1.0",
  "meta": {
    "name": "foo",
    "dependencies": {
      "baz": "~0.1.0",
      "bar": "~0.1.0",
      "quz": "~0.1.0"
    }
  },
  "dependencies": [{
    "name": "baz",
    "manifest": "/Users/h2non/Projects/resolve-tree/fixtures/simple/node_modules/baz/package.json",
    "basedir": "/Users/h2non/Projects/resolve-tree/fixtures/simple/node_modules/foo",
    "main": "/Users/h2non/Projects/resolve-tree/fixtures/simple/node_modules/baz/index.js",
    "root": "/Users/h2non/Projects/resolve-tree/fixtures/simple/node_modules/baz",
    "version": "0.1.0",
    "meta": {
      "name": "baz"
    }
  }, {
    "name": "bar",
    "manifest": "/Users/h2non/Projects/resolve-tree/fixtures/simple/node_modules/bar/package.json",
    "basedir": "/Users/h2non/Projects/resolve-tree/fixtures/simple/node_modules/foo",
    "main": "/Users/h2non/Projects/resolve-tree/fixtures/simple/node_modules/bar/index.js",
    "root": "/Users/h2non/Projects/resolve-tree/fixtures/simple/node_modules/bar",
    "version": "0.1.0",
    "meta": {
      "name": "bar",
      "dependencies": {
        "baz": "~0.1.0"
      }
    },
    "dependencies": [{
      "name": "baz",
      "manifest": "/Users/h2non/Projects/resolve-tree/fixtures/simple/node_modules/baz/package.json",
      "basedir": "/Users/h2non/Projects/resolve-tree/fixtures/simple/node_modules/bar",
      "main": "/Users/h2non/Projects/resolve-tree/fixtures/simple/node_modules/baz/index.js",
      "root": "/Users/h2non/Projects/resolve-tree/fixtures/simple/node_modules/baz",
      "version": "0.1.0",
      "meta": {
        "name": "baz"
      }
    }]
  }, {
    "name": "quz",
    "manifest": "/Users/h2non/Projects/resolve-tree/fixtures/simple/node_modules/foo/node_modules/quz/package.json",
    "basedir": "/Users/h2non/Projects/resolve-tree/fixtures/simple/node_modules/foo",
    "main": "/Users/h2non/Projects/resolve-tree/fixtures/simple/node_modules/foo/node_modules/quz/index.js",
    "root": "/Users/h2non/Projects/resolve-tree/fixtures/simple/node_modules/foo/node_modules/quz",
    "version": "0.1.0",
    "meta": {
      "name": "quz",
      "dependencies": {
        "baz": "~0.0.1"
      }
    },
    "dependencies": [{
      "name": "baz",
      "manifest": "/Users/h2non/Projects/resolve-tree/fixtures/simple/node_modules/foo/node_modules/quz/node_modules/baz/package.json",
      "basedir": "/Users/h2non/Projects/resolve-tree/fixtures/simple/node_modules/foo/node_modules/quz",
      "main": "/Users/h2non/Projects/resolve-tree/fixtures/simple/node_modules/foo/node_modules/quz/node_modules/baz/index.js",
      "root": "/Users/h2non/Projects/resolve-tree/fixtures/simple/node_modules/foo/node_modules/quz/node_modules/baz",
      "version": "0.1.0",
      "meta": {
        "name": "baz",
        "version": "0.0.1"
      }
    }]
  }]
}]
```

## API

### Supported options

- **basedir** `string` - Base directory path to start lookups. Default to `process.cwd()`.
- **lookups** `array<string>` - Dependency types to lookup. Allowed values are: `dependencies`, `devDependencies`, `peerDependencies`. Defaults to: `dependencies`

### resolve.packages(names, [ opts, ] cb)
Alias: `byName()`

Find and resolve modules and its dependencies recursively looking by package name.

### resolve.manifest(pkgManifest, [ opts, ] cb)

Resolve dependencies recursively reading the `package.json` metadata.

### resolve.flatten(tree) => `array<pkg>`

Flatten dependency tree to one level structure tree.

### resolve.flattenMap(tree, [ field ]) => `array<mixed>`

Flatten the given dependency tree mapping by dependency value field or custom mapper function.

### resolve.resolutions = `object`

Map of packages resolution mappings.

```js
{
  'mz': 'mz/fs'
}
```

### resolve.packagesSync(names, [ opts ])
Alias: `byNameSync`

Synchronous version of `packages`.
Find and resolve modules and its dependencies recursively looking by package name.

### resolve.manifestSync(pkgManifest, [ opts ])

Synchronous version of `manifest`.
Resolve dependencies recursively reading the `package.json` metadata.

## License

MIT - Tomas Aparicio

---
_Source: https://npm.io/package/resolve-tree · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
