Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

jora

Package Overview
Dependencies
Maintainers
1
Versions
26
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

jora

JavaScript object query engine

  • 1.0.0-alpha.7
  • Source
  • npm
  • Socket score

Version published
Weekly downloads
62K
decreased by-59.26%
Maintainers
1
Weekly downloads
 
Created
Source

Jora

NPM version Build Status Coverage Status

JavaScript object query engine

STATUS: A proof of concept

API

const jora = require('jora');

// create a query
const query = jora('foo.bar') ;
// or with custom methods
const query = jora('foo.myMethod()', {
    methods: {
        myMethod(current) { /* do something and return a new value */ }
    }
});

// perform a query
const result = query(data, context);

Options:

  • methods

    Type: Object
    Default: undefined

    Additional methods for using in query passed as an object, where a key is a method name and a value is a function to perform an action. It can override build-in methods.

  • debug

    Type: Boolean
    Default: false

    Enables debug output.

  • tolerant

    Type: Boolean
    Default: false

    Enables tolerant parsing mode. This mode supresses parsing errors when possible.

  • stat

    Type: Boolean
    Default: false

    Enables stat mode. When mode is enabled a query stat interface is returning instead of resulting data.

Syntax

Primitives

JoraDescription
42
4.222
-12.34e56
Numbers
"string"
'string'
Strings
/regexp/
/regexp/i
A JavaScript regexp, only i flag supported
{ }Object initializer/literal syntax. You can use spread operator ..., e.g. { a: 1, ..., ...foo, ...bar } (... with no expression on right side the same as ...$)
[ ]Array initializer/literal syntax
< >A function
NOTE: Syntax will be changed

Keywords

The follow keyword can be used as in JavaScript:

  • true
  • false
  • null
  • undefined

Comparisons

JoraDescription
x = yEquals (as === in JS)
x != yNot equals (as !== in JS)
x < yLess than
x <= yLess than or equal to
x > yGreater than
x >= yGreater than or equal to
x ~= yRegular expression match
x in [a, b, c]Equivalent to x === a or x === b or x === c
x not in [a, b, c]Equivalent to x !== a and x !== b and x !== c

Boolean logic

JoraDescription
x or yBoolean or (as || in JS)
x and yBoolean and (as && in JS)
not xBoolean not (a ! in JS)
x ? y : zIf x is truthy than return y else return z
( x )Explicity operator precedence

Operators

JoraDescription
x + yAdd
x - ySubtract
x * yMultiply
x / yDivide
x % yModulo

Special variables

JoraDescription
@The root data object
$The current data object, depends on scope
#The context

A block

A block contains of a definition list (should comes first) and an expression. Both are optional. When an expression is empty a current value (i.e. $) returns.

The syntax of definition (white spaces between any part are optional):

$ SYMBOL ;
$ SYMBOL : expression ;

For example:

$foo:123;          // Define `$foo` variable
$bar;              // The same as `$bar:$.bar;` or `$a:bar;`
$baz: $foo + $bar; // Variables can be used inside an expression after its definition 

A block creates a new scope. Variables can't be redefined in the same and nested scopes, otherwise it cause to error.

Path chaining

joraDescription
SYMBOLThe same as $.SYMBOL
.SYMBOLChild member operator (example: foo.bar.baz, #.foo['use any symbols for name'])
..SYMBOL
..( block )
Recursive descendant operator (example: ..deps, ..(deps + dependants))
.[ block ]Filter a current data. Equivalent to a .filter(<block>)
.( block )Map a current data. Equivalent to a .map(<block>)
.method()Invoke a method to current data, or each element of current data if it is an array
path[e]Array-like notation to access properties. It works like in JS for everything with exception for arrays, where it equivalents to array.map(e => e[key]). Use pick() method to get an element by index in array.

Build-in methods

joraDescription
bool()The same as Boolean() in JS, with exception that empty arrays and objects with no keys treats as false
keys()The same as Object.keys() in JS
values()The same as Object.values() in JS
entries()The same as Object.entries() in JS
mapToArray("key"[, "value"])Converts an object to an array, and store object key as "key"
pick("key")
pick(fn)
Get a value by a key, an index or a function. Useful for arrays, e.g. since array[5] applies [5] for each element in an array (equivalent to array.map(e => e[5])), array.pick(5) should be used instead.
size()Returns count of keys if current data is object, otherwise returns length value or 0 when field is absent
sort(<fn>)Sort an array by a value fetched with getter
reverse()Reverse order of items
group(<fn>[, <fn>])Group an array items by a value fetched with first getter.
filter(<fn>)The same as Array#filter() in JS
map(<fn>)The same as Array#map() in JS

Quick demo

Get npm dependency paths (as a tree) that have packages with more than one version:

const jora = require('../src');

function printTree() {
    // see implementation in examples/npm-ls.js
}

require('child_process')
    .exec('npm ls --json', (error, stdout) => {
        if (error) {
            return;
        }

        const npmTree = JSON.parse(stdout);
        const multipleVersionPackages = jora(`
            ..(dependencies.mapToArray("name"))
            .group(<name>, <version>)
            .({ name: key, versions: value })
            [versions.size() > 1]
        `)(npmTree);

        const depsPathsToMultipleVersionPackages = jora(`
            .({
                name,
                version,
                otherVersions: #[name=@.name].versions - version,
                dependencies: dependencies
                    .mapToArray("name")
                    .map(::self)
                    [name in #.name or dependencies]
            })
        `)(npmTree, multipleVersionPackages);

        printTree(depsPathsToMultipleVersionPackages);
    });

Example of output:

jora@1.0.0
├─ browserify@16.2.2
│  ├─ assert@1.4.1
│  │  └─ util@0.10.3 [other versions: 0.10.4]
│  │     └─ inherits@2.0.1 [other versions: 2.0.3]
│  ├─ browser-pack@6.1.0
│  │  └─ combine-source-map@0.8.0
│  │     ├─ source-map@0.5.7 [other versions: 0.6.1, 0.4.4, 0.2.0, 0.1.43]
│  │     └─ inline-source-map@0.6.2
│  │        └─ source-map@0.5.7 [other versions: 0.6.1, 0.4.4, 0.2.0, 0.1.43]
│  ├─ browser-resolve@1.11.3
│  │  └─ resolve@1.1.7 [other versions: 1.8.1]
│  ├─ concat-stream@1.6.2
│  │  └─ inherits@2.0.3 [other versions: 2.0.1]
│  ├─ crypto-browserify@3.12.0
│  │  ├─ browserify-cipher@1.0.1
│  │  │  ├─ browserify-aes@1.2.0
│  │  │  │  └─ inherits@2.0.3 [other versions: 2.0.1]
│  │  │  └─ browserify-des@1.0.2
│  │  │     ├─ des.js@1.0.0
│  │  │     │  └─ inherits@2.0.3 [other versions: 2.0.1]
│  │  │     └─ inherits@2.0.3 [other versions: 2.0.1]
│  │  ├─ browserify-sign@4.0.4
...

License

MIT

FAQs

Package last updated on 25 Dec 2018

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc