Comparing version 0.4.0 to 0.5.0
{ | ||
"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" | ||
} | ||
} |
175
README.md
# 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
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
0
176
10479
5
114
- Removedreconstruct-descriptors@^0.3.0
- Removedobject-assign@4.1.1(transitive)
- Removedobject-descriptors@0.1.0(transitive)
- Removedreconstruct@0.3.0(transitive)
- Removedreconstruct-descriptors@0.3.0(transitive)