# uncouple

> Uncouple constructors and classes methods into functions.

Latest version **0.6.0** (published 2020-03-17) · MIT license · 0 weekly downloads

## Install

```sh
npm install uncouple
pnpm add uncouple
yarn add uncouple
bun add uncouple
```

## Health

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

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

Warnings: low downloads; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.6.0 |
| Published | 2020-03-17 |
| First published | 2018-01-22 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Dependencies | 0 |
| Unpacked size | 23 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 14 |
| Author | Vitor Luiz Cavalcanti |
| Maintainers | vitorluizc |
| Keywords | uncouple, prototype, duck-typing, functional, functional-programming |

## Links

- npm: https://www.npmjs.com/package/uncouple
- Repository: https://github.com/VitorLuizC/uncouple
- Homepage: https://github.com/VitorLuizC/uncouple#readme
- Issues: https://github.com/VitorLuizC/uncouple/issues
- npm.io page: https://npm.io/package/uncouple

## Recent versions

- 0.6.0 (latest) — 2020-03-17
- 0.5.0 — 2019-03-23
- 0.4.0 — 2018-08-09
- 0.3.1 — 2018-07-17
- 0.3.0 — 2018-07-17
- 0.2.0 — 2018-01-22
- 0.1.0 — 2018-01-22

## README

# Uncouple

[![Build Status](https://travis-ci.org/VitorLuizC/uncouple.svg?branch=master)](https://travis-ci.org/VitorLuizC/uncouple)
[![License](https://badgen.net/github/license/VitorLuizC/uncouple)](./LICENSE)
[![Install size](https://packagephobia.now.sh/badge?p=uncouple)](https://packagephobia.now.sh/result?p=uncouple)
[![Library minified size](https://badgen.net/bundlephobia/min/uncouple)](https://bundlephobia.com/result?p=uncouple)
[![Library minified + gzipped size](https://badgen.net/bundlephobia/minzip/uncouple)](https://bundlephobia.com/result?p=uncouple)

Uncouple constructors and classes methods into functions.

## Installation

This library is published in the NPM registry and can be installed using any compatible package manager.

```sh
npm install uncouple --save

# For Yarn, use the command below.
yarn add uncouple
```

### Installation from CDN

This module has an UMD bundle available through JSDelivr and Unpkg CDNs.

```html
<!-- For UNPKG use the code below. -->
<script src="https://unpkg.com/uncouple"></script>

<!-- For JSDelivr use the code below. -->
<script src="https://cdn.jsdelivr.net/npm/uncouple"></script>

<script>
  // UMD module is exposed through the "uncouple" global function.
  console.log(uncouple);

  var O = uncouple(Object);
  var isFetchDefined = O.hasOwnProperty(window, 'fetch');
</script>
```

## Usage

Module default exports uncouple function.

`uncouple` receives a constructor or a class as argument and returns an object with its uncoupled methods.

```js
import uncouple from 'uncouple';

const O = uncouple(Object);
// => {
//   hasOwnProperty: ƒ ()
//   isPrototypeOf: ƒ ()
//   propertyIsEnumerable: ƒ ()
//   toLocaleString: ƒ ()
//   toString: ƒ ()
//   valueOf: ƒ ()
// }

const hasFetch = O.hasOwnProperty(window, 'fetch');
// => true
```

All uncoupled methods receives an instance as first argument followed by method arguments.

```js
const { trim, substr } = uncouple(String);

trim('   Okay    ');
//=> 'Okay'

substr('ABCDEF', -3);
//=> 'CDF'
```

It also works for Function constructors and classes.

```js
function User(name) {
  this.name = name;
}

User.prototype.getName = function() {
  console.log(this.name);
};

const { getName } = uncouple(User);

getName(new User('João'));
//=> 'João'

class Car {
  speed = 0;

  acelerate(speed) {
    this.speed += speed;
  }
}

const { acelerate } = uncouple(Car);

const uno = new Car();

acelerate(uno, 120);
acelerate(uno, 60);

uno.speed;
//=> 180
```

## Use cases

You can reuse methods with duck types, like Array.prototype.filter in a NodeList.

```js
const { filter } = uncouple(Array);

const anchors = document.getElementsByTagName('a');
//=> NodeListOf<HTMLAnchorElement>

const isLink = anchor => /^https?:\/\//.test(anchor.href);

const links = filter(anchors, isLink);
//=> Array<HTMLAnchorElement>
```

Compositions and smart pipelines became pretty and readable with uncoupled methods.

```js
const {
  trim,
  replace,
  normalize,
  toLocaleLowerCase
} = uncouple(String);

" Olá, como vai  vocÊ?"
|> normalize(#, 'NFKD')
|> replace(#, /[\u0080-\uF8FF]/g, '')
|> trim
|> replace(#, /\s+/g, ' ')
|> toLocaleLowerCase
//=> 'ola, como vai voce?'

const normalize = compose(
  toLocaleLowerCase,
  (value) => replace(value, /\s+/g, ' '),
  trim,
  (value) => replace(value, /[\u0080-\uF8FF]/g, '')
  (value) => normalize(value, 'NFKD'),
);

normalize(' Meu nome é Vitor   , meus bons')
//=> 'meu nome e vitor, meus bons'
```

With `uncouple` you can call `Object` methods with `Object.create(null)`, which returns an empty object without prototype.

```js
const user = Object.create(null);

user.name = '@VitorLuizC';

user.hasOwnProperty('name');
//=> throws TypeError: user.hasOwnProperty is not a function

const { hasOwnProperty: has } = uncouple(Object);

has(user, 'name');
//=> true
```

## License

Released under [MIT License](./LICENSE).

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