prql-js
JavaScript bindings for prqlc
.
Installation
npm install prql-js
Usage
Currently these functions are exposed
function compile(prql_query: string, options?: CompileOptions): string;
function prql_to_pl(prql_query: string): string;
function pl_to_prql(pl_json: string): string;
function pl_to_rq(pl_json: string): string;
function rq_to_sql(rq_json: string): string;
From Node.js
Direct usage
const prqljs = require("prql-js");
const sql = prqljs.compile(`from employees | select first_name`);
console.log(sql);
Options
const opts = new prql.CompileOptions();
opts.target = "sql.mssql";
opts.format = false;
opts.signature_comment = false;
const sql = prqljs.compile(`from employees | take 10`, opts);
console.log(sql);
Template literal
const prqljs = require("prql-js");
const prql = (string) => prqljs.compile(string[0] || "");
const sql = prql`from employees | select first_name`;
console.log(sql);
Template literal with newlines
const prqljs = require("prql-js");
const prql = (string) => prqljs.compile(string[0] || "");
const sql = prql`
from employees
select first_name
`;
console.log(sql);
From a browser
<html>
<head>
<script type="module">
import init, { compile } from "./dist/web/prql_js.js";
await init();
const sql = compile("from employees | select first_name");
console.log(sql);
</script>
</head>
<body></body>
</html>
From a framework or a bundler
import compile from "prql-js/dist/bundler";
const sql = compile(`from employees | select first_name`);
console.log(sql);
Errors
Errors are returned as following object, serialized as a JSON array:
interface ErrorMessage {
kind: "Error" | "Warning" | "Lint";
code: string | null;
reason: string;
hint: string | null;
span: [number, number] | null;
display: string | null;
location: SourceLocation | null;
}
interface SourceLocation {
start: [number, number];
end: [number, number];
}
These errors can be caught as such:
try {
const sql = prqlJs.compile(`from employees | foo first_name`);
} catch (error) {
const errorMessages = JSON.parse(error.message).inner;
console.log(errorMessages[0].display);
console.log(errorMessages[0].location);
}
Development
Build:
npm run build
This builds Node, bundler and web packages in the dist
path.
Test:
npm test
By default the wasm
binaries are optimized on each run, even if the underlying
code hasn't changed, which can be slow. For a lower-latency dev loop, pass
--profile=dev
to npm install
for a faster, less optimized build.
npm install prql-js --profile=dev
Notes
- This uses
wasm-pack
to
generate bindings1.
- We've added an
npm
layer on top of the usual approach of just using
wasm-pack
, so we can distribute a single package with targets of node
,
bundler
and no-modules
— somewhat inverting the approach recommended by
wasm-pack
. The build instruction goes in a build
script, rather than a
pack
script.
0.12.1 — 2024-06-09
0.12.1 is a tiny hotfix release which fixes how intra-prql crate dependencies
were specified.