babel-plugin-datascript
v0.2.0
Published
Babel plugin for compile and check DataScript query
Downloads
14
Maintainers
Readme
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.)
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