New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

uncouple

Package Overview
Dependencies
Maintainers
1
Versions
7
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

uncouple - npm Package Compare versions

Comparing version 0.4.0 to 0.5.0

dist/index.js

33

package.json
{
"name": "uncouple",
"version": "0.4.0",
"description": "Uncouple prototype methods.",
"cdn": "dist/uncouple.js",
"main": "dist/uncouple.cjs.js",
"version": "0.5.0",
"description": "Uncouple constructors and classes methods into functions.",
"cdn": "dist/index.umd.min.js",
"main": "dist/index.js",
"types": "types/index.d.ts",
"unpkg": "dist/uncouple.js",
"module": "dist/uncouple.es.js",
"jsdelivr": "dist/uncouple.js",
"umd:main": "dist/uncouple.js",
"unpkg": "dist/index.umd.min.js",
"module": "dist/index.mjs",
"jsdelivr": "dist/index.umd.min.js",
"umd:main": "dist/index.umd.js",
"files": [
"dist/",
"types/",
"LICENSE",
"README.md"
"types/"
],

@@ -21,3 +19,3 @@ "scripts": {

"test": "ava --no-cache",
"build": "tsc && bili src/index.js --formats es,cjs,umd --js buble --banner",
"build": "bili",
"prepare": "npm test"

@@ -47,9 +45,8 @@ },

"devDependencies": {
"ava": "^0.25.0",
"bili": "^3.1.2",
"typescript": "^3.0.1"
},
"dependencies": {
"reconstruct-descriptors": "^0.3.0"
"ava": "^1.3.1",
"bili": "^4.7.1",
"rollup-plugin-typescript2": "^0.20.1",
"ts-node": "^8.0.3",
"typescript": "^3.3.4000"
}
}
# Uncouple
[![Build Status][ci-status-badge]][ci-status]
[![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)
[![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 prototype methods.
Uncouple constructors and classes methods into functions.
## Getting Started
## Installation
Install with NPM / Yarn.
This library is published in the NPM registry and can be installed using any compatible package manager.
```sh
npm i uncouple
# yarn add uncouple
npm install uncouple --save
# For Yarn, use the command below.
yarn add uncouple
```
Uncouple module provides a function to uncouple all prototype methods.
### 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 { hasOwnProperty: has } = uncouple(Object.prototype);
const O = uncouple(Object);
// => {
// hasOwnProperty: ƒ ()
// isPrototypeOf: ƒ ()
// propertyIsEnumerable: ƒ ()
// toLocaleString: ƒ ()
// toString: ƒ ()
// valueOf: ƒ ()
// }
const o = Object.create(null);
const hasFetch = O.hasOwnProperty(window, 'fetch');
// => true
```
has(o, 'name');
// => false
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'
```
I'm also exporting a type to improve your JSDocs and TypeScript modules.
It also works for Function constructors and classes.
```ts
import uncouple, { Uncouple } from 'uncouple';
```js
function User(name) {
this.name = name;
}
// Uses Array methods as functions for any Iterable.
const A: Uncouple<typeof Array.prototype> = uncouple(Array.prototype);
User.prototype.getName = function () {
console.log(this.name);
};
A.filter(document.querySelectorAll('*'), (e) => e.tagName === 'A');
// => [ <a href="" />, ... ]
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. You can see it [here][license].
<!-- Links -->
[license]: ./LICENSE
[ci-status]: https://travis-ci.org/VitorLuizC/uncouple
[ci-status-badge]: https://travis-ci.org/VitorLuizC/uncouple.svg?branch=master
Released under [MIT License](./LICENSE).
/**
* Type definition to match every method or function.
* Property name from `T`.
*/
declare type Method = (...args: any[]) => any;
declare type PropertyNameOf<T> = Extract<keyof T, string>;
/**
* A hi-order type definition to type an uncoupled function.
* Uncoupled methods from `T`.
*/
declare type Uncoupled<T, F> = F extends (...args: infer A) => infer R ? (instance: T, ...args: A) => R : never;
declare type UncoupledMethodsOf<T> = {
[K in PropertyNameOf<T>]: T[K] extends (...args: any[]) => any ? (instance: T, ...args: Parameters<T[K]>) => ReturnType<T[K]> : never;
};
/**
* Uncouple object methods into functions that receives instance and method arguments.
* Constructor (class) with generic prototype `T`.
*/
export declare type Uncouple<T> = {
[K in keyof T]: T[K] extends Method ? Uncoupled<T, T[K]> : never;
declare type Constructor<T> = (new (...args: any[]) => any) & {
prototype: T;
};
/**
* Uncouple object methods.
* Uncouple methods from constructor (class) into functions.
* @example ```js
* const { filter } = uncouple(Array.prototype);
* const { filter } = uncouple(Array);
* filter([ 1, 2, 3, 4 ], (value) => value % 2 === 0);
* //=> [ 2, 4 ]
* ```
* @param object - A prototype, namespace of object with methods.
* @param constructor - A constructor (class) to be uncoupled into functions.
*/
declare function uncouple<T extends object>(object: T): Uncouple<T>;
declare const uncouple: <T>({ prototype }: Constructor<T>) => UncoupledMethodsOf<T>;
export default uncouple;

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc