npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

search-parser

v0.1.19

Published

Parse and create predicate from query expression. Supports boolean operators and keywords.

Downloads

24

Readme

Search Parser

Allow parsing search queries, using free-text, keywords and boolean operators.

npm version Build Status codecov

Installation

Using yarn:

yarn add search-parser

Using npm:

npm instal search-parser --save

Usage

import { parse, parseToPredicate } from 'search-parser'

API

parse(query)

Convert a query string into an array of arrays of expression objects. Support freetext, keywords (key:value), boolean operators (AND, OR, NOT) and parenthesis. For more information on the shape of the nested arrays, read the documentation at boolean-parser-js.

Each expression object is in the form:

{
  key: { condition: value }
}

Where key is the keyword or 'freetext' in case no given keyword.
condition is either 'include' or 'exclude' (when using NOT operator).
And value is the term to search.

Sample test case:

test('Parse expression with keywords, freetext and boolean operators', () => {
  const expected = [
    [{ "name": { "include": "aviv" } }, { "last": { "include": "rosental" } }],
    [{ "freetext": { "include": "any other contibuter" } }]
  ];
  expect(parse('name:aviv and last:rosental or any other contibuter')).toEqual(expected);
});

parseToPredicate(query, searchFn)

Parse the query string and convert it into a unified predicate which represent the given query. When executed on an item, the predicate will call the given searchFn and pass it (item, textToSearch, keyword).

Sample test case:

const shows = [ 
  { name: 'iron-fist', year: '2017', rating: '7.6' },
  { name: 'the walking dead', year: '2010', rating: '8.5' },
  { name: 'legion', year: '2017', rating: '8.8' },
  { name: 'game of thrones', year: '2011', rating: '9.5' } 
];

function search(item, textToSearch, keyword) {
  if (keyword === 'freetext') {
    return Object.values(item).map(value => value.toLowerCase()).some(value => value.toLowerCase().includes(textToSearch.toLowerCase())) 
  }
  return item && item[keyword.toLowerCase()] && item[keyword.toLowerCase()].toLowerCase().includes(textToSearch.toLowerCase());
}

test('Search collection with keywords return multiple results', () => {
  const predicate = parseToPredicate('year:2017', search);
  const results = shows.filter(predicate);
  expect(results).toEqual([{ name: 'iron-fist', year: '2017', rating: '7.6' }, { name: 'legion', year: '2017', rating: '8.8' }]);
});

For more examples, see the src/tests folder

Notes

This library depends on boolean-parser-js to parse the expressions using boolean operators (AND, OR).