/babel-plugin-datascript

Babel plugin for compile and check DataScript query

Primary LanguageJavaScript

Babel plugin DataScript Build Status

Plugin for precompile static DataScript query to Mori structs. Also plugin checks query in compile-time with Datascript parse-query API.

Example

Input:

var Datalog = Datalog.Q`[:find  ?e ?email
                          :in    $ [[?n ?email]]
                          :where [?e :name ?n]]`;

Output:

import { mori as _mori } from 'datascript-mori';
var Datalog = _mori.vector(_mori.keyword('find'), _mori.symbol('?e'), _mori.symbol('?email'), _mori.keyword('in'), _mori.symbol('$'), _mori.vector(_mori.vector(_mori.symbol('?n'), _mori.symbol('?email'))), _mori.keyword('where'), _mori.vector(_mori.symbol('?e'), _mori.keyword('name'), _mori.symbol('?n')));

Options

  • library: datascript-mori or mori. Used for automatic add import in file with queries. By default datascript-mori
  • tag: Tag used for marking DataScript query(plugin use TemplateTagLiteral from Ecmascript 2015). By default Datalog. Also plugin reserved all tag like TAG.ANYTHING (i.e Datalog.Pull, Datalog.Q etc.)
  • cache: If cache is true then for dynamic queries will be used memoized_parse from datascript-mori. By default false. Not allowed to use with library=mori.

Why?

Datalog query is a ClojureScript data structures, not a string. In JS API Datalog query is a string which convert to CLJS data structures in runtime Babel-plugin transfers this convertaion in compile-time. Conversion in compile-time has two advantages:

  • check query during compilation. Example:
var q1 = Datalog`[ :find (sum ?heads)
             :with ?monster
             :in   [[?monster ?heads]]`;

This code doesnt compile because in EDN string missing closing bracket ]. Also query with tag Datalog.Q and Datalog.Pull checks with parse-query and parse-pull API.

var q1 = Datalog.Q`[:find ?e :with ?f :where [?e]]`;;

This code doesnt compile because in query variable ?f is unknown.

  • minimize runtime overhead of parse string to EDN in runtime