# escallmatch

> ECMAScript CallExpression matcher made from function/method signature

Latest version **1.5.0** (published 2016-08-20) · MIT license · 0 weekly downloads

## Install

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

## Health

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

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.5.0 |
| Published | 2016-08-20 |
| First published | 2014-07-31 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 2 |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Author | Takuto Wada |
| Maintainers | twada |
| Keywords | ecmascript, ast |

## Links

- npm: https://www.npmjs.com/package/escallmatch
- Repository: https://github.com/twada/escallmatch
- Issues: https://github.com/twada/escallmatch/issues
- npm.io page: https://npm.io/package/escallmatch

## Dependencies (2)

- [esprima](https://npm.io/package/esprima.md) ^2.0.0
- [call-matcher](https://npm.io/package/call-matcher.md) ^1.0.0

## Alternatives

- [update-check](https://npm.io/package/update-check.md) — 4.0M weekly downloads
- [react-native-onesignal](https://npm.io/package/react-native-onesignal.md) — 134.5K weekly downloads
- [react-redux-toastr](https://npm.io/package/react-redux-toastr.md) — 33.7K weekly downloads
- [@nocobase/plugin-notification-manager](https://npm.io/package/@nocobase/plugin-notification-manager.md) — 2.0K weekly downloads
- [react-simple-toasts](https://npm.io/package/react-simple-toasts.md) — 1.9K weekly downloads

## Recent versions

- 1.5.0 (latest) — 2016-08-20
- 1.4.2 — 2015-06-05
- 1.4.1 — 2015-05-22
- 1.4.0 — 2015-04-27
- 1.3.2 — 2015-04-24
- 1.3.1 — 2015-04-17
- 1.3.0 — 2015-04-15
- 1.2.0 — 2015-04-12
- 1.1.0 — 2015-02-25
- 1.0.1 — 2014-11-27
- 1.0.0 — 2014-11-04
- 0.3.1 — 2014-08-18
- 0.3.0 — 2014-08-08
- 0.2.0 — 2014-08-04
- 0.1.1 — 2014-08-01
- … 1 more at https://npm.io/package/escallmatch/versions

## README

escallmatch
================================

ECMAScript CallExpression matcher made from function/method signature

[![Build Status][travis-image]][travis-url]
[![NPM version][npm-image]][npm-url]
[![Dependency Status][depstat-image]][depstat-url]
[![License][license-image]][license-url]


EXAMPLE
---------------------------------------

Creating CallExpression matcher for method signature `'assert.equal(actual, expected, [message])'`.

Then match against `path/to/some_test.js`.

```javascript
var escallmatch = require('escallmatch');
var esprima = require('esprima');
var estraverse = require('estraverse');
var fs = require('fs');

var matcher = escallmatch('assert.equal(actual, expected, [message])');

estraverse.traverse(esprima.parse(fs.readFileSync('path/to/some_test.js')), {
    enter: function (currentNode, parentNode) {
        if (matcher.test(currentNode)) {
            // currentNode is a CallExpression that matches to the signature
        }
        var argMatched = matcher.matchArgument(currentNode, parentNode);
        if (argMatched) {
            if (argMatched.kind === 'mandatory') {
                // mandatory arg (in this case, `actual` or `expected`)
            } else if (argMatched.kind === 'optional') {
                // optional arg (in this case, `message`)
            }
        }
    }
});
```

where content of `path/to/some_test.js` is:

```javascript
var assert = require('assert');
var anotherAssert = assert;
var equal = assert.equal.bind(assert);
var foo = '2';
var bar = 2;

assert.equal(foo, bar);  // matches
assert.equal(bar, foo);  // matches
assert.equal(foo, bar, 'foo shoule be equal to bar');  // matches (with optional arg)

assert.equal();  // does not match (less args)
assert.equal(foo);  // does not match (less args)
assert.equal(foo, bar, 'hoge', 'fuga');  // does not match (too much args)

assert.notEqual(foo, bar);  // does not match (callee method name differs)
anotherAssert.equal(foo, bar);  // does not match (callee object name differs)
equal(foo, bar);  // does not match (callee does not match)
```

`escallmatch` is a spin-off product of [power-assert](http://github.com/twada/power-assert) project.

Pull-requests, issue reports and patches are always welcomed.


API
---------------------------------------

### var matcher = escallmatch(signatureStr, [options])

Create matcher object for a given function/method signature string.

```javascript
var matcher = escallmatch('assert.equal(actual, expected, [message])');
```

Any arguments enclosed in bracket (for example, `[message]`) means optional parameters. Without bracket means mandatory parameters.

Returns `matcher` object having four methods, `test`, `matchArgument`, `calleeAst`, and `argumentSignatures`.


#### options

an `object` for configuration options. If not passed, default options will be used.


#### options.visitorKeys

| type     | default value |
|:---------|:--------------|
| `object` | (return value of `estraverse.VisitorKeys`)   |

VisitorKeys for AST traversal. See [estraverse.VisitorKeys](https://github.com/estools/estraverse/blob/4.0.0/estraverse.js#L217-L288) and [babel.types.VISITOR_KEYS](https://github.com/babel/babel/blob/v5.1.11/src/babel/types/visitor-keys.json).


#### options.astWhiteList

| type     | default value |
|:---------|:--------------|
| `object` | N/A           |

Type and property whitelist on creating AST clone. `astWhiteList` is an object containing NodeType as keys and properties as values.

```js
{
    ArrayExpression: ['type', 'elements'],
    ArrayPattern: ['type', 'elements'],
    ArrowFunctionExpression: ['type', 'id', 'params', 'body', 'generator', 'expression'],
    AssignmentExpression: ['type', 'operator', 'left', 'right'],
    ...
```


### var isMatched = matcher.test(node)

Tests whether `node` matches the signature or not.

 - Returns `true` if matched.
 - Returns `false` if not matched.

`node` should be an AST node object defined in [Mozilla JavaScript AST spec](https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API).


### var argMatched = matcher.matchArgument(node, parentNode)

Returns match result object representing whether `node` (and its `parentNode`) matches some argument of the signature or not.

 - Returns `null` if not matched.
 - If matched, returns object like `{name: 'actual', kind: 'mandatory'}`, whose `name` is an argument name in the signature and `kind` is `'mandatory'` or `'optional'`.

`node` and `parentNode` should be AST node objects defined in [Mozilla JavaScript AST spec](https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API).


### var calleeAst = matcher.calleeAst()

Returns clone of callee AST object based on signature passed to `escallmatch` function. Returned tree is one of AST node objects defined in [Mozilla JavaScript AST spec](https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API) (in most cases, `Identifier` or `MemberExpression`).


### var argSigs = matcher.argumentSignatures()

Returns array of argument signature objects based on signature passed to `escallmatch` function. Returns array of objects like `[{name: 'actual', kind: 'mandatory'}]`, whose `name` is an argument name in the signature and `kind` is `'mandatory'` or `'optional'`.



INSTALL
---------------------------------------

### via npm

Install

    $ npm install --save escallmatch


### via bower

Install

    $ bower install --save escallmatch

Then load (`escallmatch` function is exported)

    <script type="text/javascript" src="./path/to/bower_components/escallmatch/build/escallmatch.js"></script>



CHANGELOG
---------------------------------------
See [CHANGELOG](https://github.com/twada/escallmatch/blob/master/CHANGELOG.md)


AUTHOR
---------------------------------------
* [Takuto Wada](http://github.com/twada)



LICENSE
---------------------------------------
Licensed under the [MIT](https://github.com/twada/escallmatch/blob/master/LICENSE) license.


[npm-url]: https://npmjs.org/package/escallmatch
[npm-image]: https://badge.fury.io/js/escallmatch.svg

[travis-url]: http://travis-ci.org/twada/escallmatch
[travis-image]: https://secure.travis-ci.org/twada/escallmatch.svg?branch=master

[depstat-url]: https://gemnasium.com/twada/escallmatch
[depstat-image]: https://gemnasium.com/twada/escallmatch.svg

[license-url]: https://github.com/twada/escallmatch/blob/master/LICENSE
[license-image]: http://img.shields.io/badge/license-MIT-brightgreen.svg

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