Coder Social home page Coder Social logo

ehmicky / wild-wild-parser Goto Github PK

View Code? Open in Web Editor NEW
12.0 3.0 0.0 9.88 MB

🀠 Parser for object property paths with wildcards and regexps 🌡

License: Apache License 2.0

JavaScript 94.41% TypeScript 5.59%
algorithm data-structures javascript json library nodejs parsing typescript wildcard glob

wild-wild-parser's Introduction

wild-wild-parser logo

Node Browsers TypeScript Codecov Minified size Mastodon Medium

🀠 Parser for object property paths with wildcards and regexps. 🌡

wild-wild-path is a library which gets/sets object properties using dot-delimited paths, wildcards, regexps, slices and unions. wild-wild-parser allows manipulating its query format:

Hire me

Please reach out if you're looking for a Node.js API or CLI engineer (11 years of experience). Most recently I have been Netlify Build's and Netlify Plugins' technical lead for 2.5 years. I am available for full-time remote positions.

Install

npm install wild-wild-parser

This package works in both Node.js >=18.18.0 and browsers.

This is an ES module. It must be loaded using an import or import() statement, not require(). If TypeScript is used, it must be configured to output ES modules, not CommonJS.

API

parseQuery(queryString)

queryString QueryString
Return value: QueryArray

Convert a query string into a query array.

parseQuery('users.0.*') // [['users', 0, { type: 'any' }]]
parseQuery('users admins') // [['users'], ['admins']]
parseQuery('users./[/') // Throws: invalid RegExp

serializeQuery(queryArray)

queryArray QueryArray
Return value: QueryString

Convert a query array into a query string.

serializeQuery(['users', 0, { type: 'any' }]) // 'users.0.*'
serializeQuery([['users'], ['admins']]) // 'users admins'
serializeQuery([true]) // Throws: `true` is not a valid query

normalizeQuery(query)

query Query
Return value: QueryArray

If the query is a query string, convert it into a query array. If it is already a query array, normalize it to a canonical form.

normalizeQuery('users.0.*') // [['users', 0, { type: 'any' }]]
normalizeQuery(['users']) // [['users']]
normalizeQuery([['users'], ['admins']]) // [['users'], ['admins']]
normalizeQuery([{ type: 'slice' }]) // [[{ type: 'slice', from: 0 }]]
normalizeQuery('users./[/') // Throws: invalid RegExp
normalizeQuery([true]) // Throws: `true` is not a valid query

parsePath(pathString)

pathString PathString
Return value: PathArray

Same as parseQuery() but only for a path query.

parsePath('users.0') // ['users', 0]
parsePath('*') // Throws: this is a valid query but not a path
parsePath('users./[/') // Throws: invalid RegExp

serializePath(pathArray)

pathArray PathArray
Return value: PathString

Same as serializeQuery() but only for a path query.

serializePath(['users', 0]) // 'users.0'
serializePath([{ type: 'any' }]) // Throws: this is a valid query but not a path
serializePath([true]) // Throws: `true` is not a valid query

normalizePath(path)

path Path
Return value: PathArray

Same as normalizeQuery() but only for a path query.

normalizePath('users.0') // ['users', 0]
normalizePath(['users', 0]) // ['users', 0]
normalizePath('*') // Throws: `*` is a valid query but not a path
normalizePath([true]) // Throws: `true` is not a valid query

isSameQuery(firstQuery, secondQuery)

firstQuery Query
secondQuery Query
Return value: boolean

Return true if both queries are the same, even if they use different formats (string or array) or if they are syntactically different but semantically identical.

isSameQuery('users.0.*', 'users.0.*') // true
isSameQuery('users.0.*', ['users', 0, { type: 'any' }]) // true
isSameQuery(['users', 0, { type: 'any' }], ['users', 0, { type: 'any' }]) // true
isSameQuery('users.0.*', 'users.1.*') // false
isSameQuery('0:2', ':2') // true
isSameQuery([['user']], ['user']) // true
isSameQuery([true], 'user') // Throws: `true` is not a valid query

isSamePath(firstPath, secondPath)

firstPath Path
secondPath Path
Return value: boolean

Same as isSameQuery() but only for a path query.

isSamePath('user.name', 'user.name') // true
isSamePath('user.name', ['user', 'name']) // true
isSamePath(['user', 'name'], ['user', 'name']) // true
isSamePath('user.name', 'user.lastName') // false
isSamePath('*', 'user.name') // Throws: `*` is a valid query but not a path
isSamePath([true], 'user.name') // Throws: `true` is not a valid query

isParentPath(parentPath, childPath)

parentPath Path
childPath Path
Return value: boolean

Return true if the first argument is a parent path to the second. Queries that are not paths cannot be used.

isParentPath('user', 'user.name') // true
isParentPath('user', 'user.settings.name') // true
isParentPath('user', ['user', 'settings', 'name']) // true
isParentPath(['user'], ['user', 'settings', 'name']) // true
isParentPath('user', 'user') // false
isParentPath('user.name', 'user') // false
isParentPath('user.name', 'user.settings') // false
isParentPath('*', 'user.name') // Throws: `*` is valid query but not a path
isParentPath([true], 'user.name') // Throws: `true` is not a valid query

isSameToken(firstToken, secondToken)

firstToken Token
secondToken Token
Return value: boolean

Same as isSameQuery() but only for query array individual tokens.

isSameToken('user', 'user') // true
isSameToken('user', 'users') // false
isSameToken(2, 2) // true
isSameToken(0, -0) // false
isSameToken(/Name/, /Name/) // true
isSameToken(/Name/, /name/i) // false
isSameToken({ type: 'slice' }, { type: 'slice', from: 0 }) // true
isSameToken('user', true) // Throws: invalid token `true`

getTokenType(token)

token Token
Return value: string

Retrieve the type of a query array individual token among: "prop", "index", "slice", "regExp", "any" or "anyDeep". "unknown" is returned if the token is invalid.

getTokenType('user') // "prop"
getTokenType(0) // "index"
getTokenType(/Name/) // "regExp"
getTokenType({ type: 'slice', from: 0, to: 2 }) // "slice"
getTokenType({ type: 'any' }) // "any"
getTokenType({ type: 'anyDeep' }) // "anyDeep"
getTokenType(true) // "unknown"

Related projects

Support

For any question, don't hesitate to submit an issue on GitHub.

Everyone is welcome regardless of personal background. We enforce a Code of conduct in order to promote a positive and inclusive environment.

Contributing

This project was made with ❀️. The simplest way to give back is by starring and sharing it online.

If the documentation is unclear or has a typo, please click on the page's Edit button (pencil icon) and suggest a correction.

If you would like to help us fix a bug or add a new feature, please check our guidelines. Pull requests are welcome!

wild-wild-parser's People

Contributors

dependabot[bot] avatar ehmicky avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

wild-wild-parser's Issues

Doesn't parse path users[0].name as expected

Guidelines

  • Please search other issues to make sure this bug has not already been reported.
  • If this is related to a typo or the documentation being unclear, please click on the relevant page's Edit button (pencil icon) and suggest a correction instead.

Describe the bug

Doesn't parse path users[0].name as expected.

Steps to reproduce

parsePath(users[0].name) expecting ['users', 0, 'name'], receiving ['users[0]', 'name']

Configuration

no configuration

Environment

  System:
    OS: macOS 12.5.1
    CPU: (10) x64 Apple M1 Pro
    Memory: 23.41 MB / 32.00 GB
    Shell: 5.8.1 - /bin/zsh
  Binaries:
    Node: 16.13.1 - ~/.volta/tools/image/node/16.13.1/bin/node
    Yarn: 1.22.17 - ~/.volta/tools/image/yarn/1.22.17/bin/yarn
    npm: 8.1.2 - ~/.volta/tools/image/node/16.13.1/bin/npm
  Browsers:
    Chrome: 107.0.5304.110
    Firefox: 103.0.2
    Safari: 15.6.1
  npmPackages:
    wild-wild-parser: ^3.4.0 => 3.4.0

Pull request (optional)

  • I can submit a pull request.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.