# @mizu-mizu/array-matcher

> Array matching utilities.

Latest version **1.1.4** (published 2020-04-29) · MIT license · 0 weekly downloads

## Install

```sh
npm install @mizu-mizu/array-matcher
pnpm add @mizu-mizu/array-matcher
yarn add @mizu-mizu/array-matcher
bun add @mizu-mizu/array-matcher
```

## Health

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

Positive: esm support; no vulnerabilities.

Warnings: low downloads; no types.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.1.4 |
| Published | 2020-04-29 |
| First published | 2019-01-01 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | ESM + CommonJS |
| Dependencies | 0 |
| Unpacked size | 27.1 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 0 |
| Author | mizu-mizu |
| Maintainers | mizu-mizu |
| Keywords | matcher, match, array, es6, glob |

## Links

- npm: https://www.npmjs.com/package/@mizu-mizu/array-matcher
- Repository: https://github.com/uiui611/array-matcher
- Homepage: https://github.com/uiui611/array-matcher#readme
- Issues: https://github.com/uiui611/array-matcher/issues
- npm.io page: https://npm.io/package/@mizu-mizu/array-matcher

## Recent versions

- 1.1.4 (latest) — 2020-04-29
- 1.1.3 — 2019-08-27
- 1.1.2 — 2019-06-14
- 1.1.1 — 2019-01-13
- 1.1.0 — 2019-01-05
- 1.0.0 — 2019-01-01

## README

# @mizu-mizu/array-matcher

The matcher JavaScript library for array.

This script works in modern browsers and Node.JS .

## Installation
In a browser:

Download the file as 'array-matcher.js' from 
[github | master](https://raw.githubusercontent.com/uiui611/array-matcher/master/dist/array-matcher.mjs)
next to the html, and insert `import` in the script tag.
```html
<script type="module">
    import * as arrayMatcher from './array-matcher.js';
</script>
```

In a Node.JS:
```
npm install --save @mizu-mizu/array-matcher
```
```javascript
const arrayMatcher = require('@mizu-mizu/array-matcher');
```

## Features
Some tiny matcher generators are provided, and also, you can implement your own matcher.
### Glob matching (string array)
```javascript
import {glob} from './array-matcher.js';
const matcher = glob('root/**/*.txt');
matcher(['root', 'parent', 'child.txt']);  // => true
matcher(['root', 'parent', 'child.json']); // => false
```
Supports:
- `**` : match 0 or more items.
- `*`  : match 0 or more characters.
- `?`  : match any single character.
- `[abc]` : match 'a' or 'b' or 'c'
- `[a-z]` : match 'a' to 'z'

### Css-like matching (object array)
```javascript
import {querySelector} from './array-matcher.js';
const matcher = querySelector('#target');
matcher([
    {tagName: 'body'},
    {tagName: 'main'},
    {tagName: 'span', id:'target'}
]); // => true
```
Supports:
- `tagname`: match whose `tagName` property is the same to 'tagname'.
- `.class-selector`: match whose classList contains 'class-selector' as an array, or it's contains('class-selector') method returns true.
- `#id` : match whose `id` property is the same to 'id'.
- `>` : separator to it's child.
- ` ` : separator to it's descendant.
- `,` : separator match for either left part or right part.

### Create your own matcher
Using matcher functions list:
```javascript
import {matchResult, match} from './array-matcher.js';
/*
 * Prepare an array of matching functions.
 * This example matches all array whose first element is 'first'
 *   (not depends on it's letter case).
 */
const matcherList = [
    str=>str.toLowerCase() === 'first' ? matchResult.OK : matchResult.FAIL,
    ()=>matchResult.ANY_CONSUME
];
match(matcherList, ['first', 'second']); // => true
match(matcherList, ['FIRST', 'SECOND']); // => true
match(matcherList, ['illegal', 'first', 'second']); // => false
```

Implements the CompilerBase class:
```javascript
import {CompilerBase, matchResult} from './array-matcher.js';
/*
 * Implements the CompilerBase and override some methods.
 */
class OriginalMatcherCompiler extends CompilerBase{
    /*
     * If you provide a string in the argument array of this#compile(),
     *   this method is called.
     * This method should return a matching function.
     */
    acceptString(str) {
        /* To support glob-like recursive match. */
        if(str==='**') return ()=>matchResult.ANY_CONSUME;
        return target=>(target&& target.toLowerCase())===str 
                ? matchResult.OK : matchResult.FAIL;
    }
}
const matcher = new OriginalMatcherCompiler().compile(
    ['first', '**']
);
matcher(['first', 'second']); // => true
matcher(['FIRST', 'SECOND']); // => true
matcher(['illegal', 'first', 'second']); // => false
```

## Documents

You can check the detail document by running commands below (JSDoc).
```cmd
git clone https://github.com/uiui611/array-matcher.git
cd array-matcher
npm install
npm run jsdoc
start jsdoc/index.html
```

Also, you can check the examples at ['{project-root}/examples/'](https://github.com/uiui611/array-matcher/tree/master/examples).

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