Awesome
Babel plugin DataScript
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 defaultdatascript-mori
- tag: Tag used for marking DataScript query(plugin use TemplateTagLiteral from Ecmascript 2015). By default
Datalog
. Also plugin reserved all tag likeTAG.ANYTHING
(i.eDatalog.Pull
,Datalog.Q
etc.) - cache: If
cache
istrue
then for dynamic queries will be usedmemoized_parse
fromdatascript-mori
. By defaultfalse
. Not allowed to use withlibrary=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