# @semrel-extra/topo

> Helpers to assist monorepo dependencies traversals

Latest version **1.14.1** (published 2023-12-18) · MIT license · 0 weekly downloads

## Install

```sh
npm install @semrel-extra/topo
pnpm add @semrel-extra/topo
yarn add @semrel-extra/topo
bun add @semrel-extra/topo
```

## Health

**Score 45/100 (D)** — status: abandoned.

Positive: has types; esm support; no vulnerabilities; high maintenance score; high quality score.

Warnings: low downloads.

Negative: abandoned.

## Facts

| | |
|---|---|
| Version | 1.14.1 |
| Published | 2023-12-18 |
| First published | 2021-12-25 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Dependencies | 3 |
| Unpacked size | 31.8 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 6 |
| Author | Anton Golub |
| Maintainers | dhoulb, semrel-extra-bot, antongolub |
| Keywords | topo, graph, monorepo |

## Links

- npm: https://www.npmjs.com/package/@semrel-extra/topo
- Repository: https://github.com/semrel-extra/topo
- Homepage: https://github.com/semrel-extra/topo#readme
- Issues: https://github.com/semrel-extra/topo/issues
- npm.io page: https://npm.io/package/@semrel-extra/topo

## Dependencies (3)

- [js-yaml](https://npm.io/package/js-yaml.md) ^4.1.0
- [fast-glob](https://npm.io/package/fast-glob.md) ^3.3.2
- [toposource](https://npm.io/package/toposource.md) ^1.2.0

## Alternatives

- [apollo-link-http-common](https://npm.io/package/apollo-link-http-common.md) — 879.0K weekly downloads
- [react-relay](https://npm.io/package/react-relay.md) — 336.8K weekly downloads
- [relay-test-utils](https://npm.io/package/relay-test-utils.md) — 181.6K weekly downloads
- [@vendure/core](https://npm.io/package/@vendure/core.md) — 14.8K weekly downloads
- [@pnpm/deps.graph-sequencer](https://npm.io/package/@pnpm/deps.graph-sequencer.md) — 13.4K weekly downloads

## Recent versions

- 1.14.1 (latest) — 2023-12-18
- 1.14.0 — 2023-08-14
- 1.13.1 — 2023-08-14
- 1.13.0 — 2023-05-25
- 1.12.1 — 2023-05-24
- 1.12.0 — 2023-05-24
- 1.11.0 — 2023-05-24
- 1.10.0 — 2023-04-08
- 1.9.2 — 2023-04-03
- 1.9.1 — 2023-04-02
- 1.9.0 — 2023-04-02
- 1.8.1 — 2023-04-01
- 1.8.0 — 2023-04-01
- 1.7.0 — 2023-03-28
- 1.6.0 — 2023-03-16
- … 11 more at https://npm.io/package/@semrel-extra/topo/versions

## README

# @semrel-extra/topo

[![CI](https://github.com/semrel-extra/topo/workflows/CI/badge.svg)](https://github.com/semrel-extra/topo/actions)
[![Maintainability](https://api.codeclimate.com/v1/badges/48b31cd38b905b729beb/maintainability)](https://codeclimate.com/github/semrel-extra/topo/maintainability)
[![Test Coverage](https://api.codeclimate.com/v1/badges/48b31cd38b905b729beb/test_coverage)](https://codeclimate.com/github/semrel-extra/topo/test_coverage)

> Helpers to assist monorepo dependencies traversals

## Install
```shell
yarn add @semrel-extra/topo
```

## Usage
```ts
import { topo } from '@semrel-extra/topo'

const graph = topo({
  workspaces: ['packages/*'],
  cwd: '/path/to/project/root'
})

{
  queue: ['pkg-a', 'pkg-b', 'pkg-z', 'pkg-y', 'pkg-x'],
  nodes: ['pkg-a', 'pkg-b', 'pkg-x', 'pkg-y', 'pkg-z'],
  edges: [
    ['pkg-a', 'pkg-b'],
    ['pkg-z', 'pkg-y'],
    ['pkg-y', 'pkg-x'],
  ],
  // packages entries map
  packages: {
    'pkg-a': {
      manifest: {
        name: 'pkg-a',
        dependencies: {}
      },
      manifestPath: '/path/to/project/root/packages/a/package.json',
      path: 'packages/a', // legacy
      relPath: 'packages/a',
      absPath: '/path/to/project/root/packages/a'
    },
    'pkg-b': {...},
    ...
  }
}
```

### `pkgFilter() / filter()`
Filter option is a function: gets `IPackageEntry` as argument, returns `boolean`
```ts
const graph = topo({
  workspaces: ['packages/*'],
  cwd: '/path/to/project/root',
  filter: ({manifest}) => !manifest.private // to omit private packages from graph
})
```

### `depFilter()`
Applies filter to any kind of pkg dependencies to omit them from the graph.
```ts
const gpaph = topo({
  workspaces: ['packages/*'],
  cwd: '/path/to/project/root',
  depFilter: ({version}) => version.startsWith('workspace:') // include only workspace deps
})
```

### `workspacesExtra`
Injects extra pattern to the resolved `workspaces` value from `package.json` / `pnpm-workspace.yaml`
```ts
const gpaph = topo({
  workspacesExtra: ['!packages/foo'],
  cwd: '/path/to/project/root'
})

```

### `traverseDeps()`
Iterates up to the pkg deps graph.
```ts
import {topo, traverseDeps} from '@semrel-extra/topo'

const {packages} = topo({
  workspaces: ['packages/*'],
  cwd: '/path/to/project/root'
})
const pkg = packages['pkg-a']
const cb = async ({name, pkg}: IDepEntry) => {
  await traverseDeps({pkg, packages, cb})
}

await traverseDeps({packages, pkg, cb})
```

### `traverseQueue()`
Iterates over the queue of packages in the order of their dependencies.
```ts
import {topo, traverseQueue} from '@semrel-extra/topo'

const {queue, prev} = await topo({
  workspaces: ['packages/*'],
  cwd: '/path/to/project/root'
})
const cb = async (name: string) => {
  // some async action
}
await traverseQueue({ queue, prev, cb })
```

### `iterateDeps()`
Walks through the package dependencies and applies the `cb()` for each.
```ts
const results: any[] = []
const manifest = {
  name: 'foo',
  version: '0.0.0',
  dependencies: {
    bar: '1.0.0'
  },
  devDependencies: {
    baz: '2.0.0'
  }
}

iterateDeps(manifest, ({ name, version, scope, deps }) => {
  results.push({ name, version, scope, deps })
})
```

## License
[MIT](./LICENSE)

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