# dynamic-dedupe

Dedupes node modules as they are being required which works even when dependencies are linked via ln -s or npm link.

### Not deduped

Loads `foo.js` module only twice.

```js
var foo1 = require('./pack1/common/dep-uno/foo');
var foo2 = require('./pack2/common/dep-uno/foo');

console.log(foo1.foo);
console.log(foo2.foo);

console.log(foo1 === foo2);

// =>
// loading foo from /Users/thlorenz/dev/projects/dynamic-dedupe/example/pack1/common/dep-uno
// loading foo from /Users/thlorenz/dev/projects/dynamic-dedupe/example/pack2/common/dep-uno
// foobiloo
// foobiloo
// false
```

### Deduped

Loads `foo.js` module only once.

```js
var dedupe = require('../');
dedupe.activate();

var foo1 = require('./pack1/dep-uno/foo');
var foo2 = require('./pack2/dep-uno/foo');

console.log(foo1.foo);
console.log(foo2.foo);

console.log(foo1 === foo2);

// =>
// loading foo from /Users/thlorenz/dev/projects/dynamic-dedupe/example/pack1/common/dep-uno
// foobiloo
// foobiloo
// true
```

Here instead of loading `pack2/dep-uno/foo1.js` we will get a reference to the exports of `pack1/dep-uno/foo`.js\` returned.

## Why?

In some cases an app may be split into multiple parts that need to get the same instance of a common dependency (i.e. Handlebars). This will work once you run `npm dedupe` from the main package. However once you try linking to a dependency via `npm link` or just `ln -s` it breaks.

This is where dynamic-dedupe comes in since it dedupes your modules as they are being required. Just **make sure that you are using the exact same version** of the packages whose modules you dedupe in order for this to work reliably.

## Installation

```
npm install dynamic-dedupe
```

## API

\###*dedupe.activate(\[ext, subdirs])*

```
/**
 * Activates deduping for files with the given extension.
 * 
 * @name activate
 * @function
 * @param ext {String} (optional) extension for which to activate deduping (default: '.js')
 * @param subdirs {Number} (optional) how many subdirs right above the module
 *    have to be the same in order for it to be considered identical  (default: 2)
 *
 *  Example: sudirs: 2 -- x/foo/bar/main.js === y/foo/bar/main.js
 *                        x/boo/bar/main.js !== y/foo/bar/main.js
 */
```

\###*dedupe.deactivate(\[ext])*

```
/**
 * Deactivates deduping files with the given extension.
 * 
 * @name deactivate
 * @function
 * @param ext {String} (optional) extension for which to activate deduping (default: '.js')
 */
```

\###*dedupe.reset()*

```
/**
 * Clears the registry that contains previously loaded modules.
 * 
 * @name reset
 * @function
 */
```

## License

MIT


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.mediamagic.dev/product-docs/services/graphql-gateway/node_modules/dynamic-dedupe.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
