named_placeholders

compiles "select foo where foo.id = :bar and foo.baz < :baz" into "select foo where foo.id = ? and foo.baz < ?" + ["bar", "baz"]

usage

import { createCompiler, toNumbered } from "https://deno.land/x/named_placeholders@v1.0.0/mod.ts";
import { assert, assertEquals } from "https://deno.land/std@0.139.0/testing/asserts.ts";

Deno.test("compile", function() {
  const query = 'select users.json,EXISTS(select 1 from moderators where moderators.id = :id) as is_moderator from users where users.id = :id and users.status = :status and users.complete_status = :complete_status';
  const compile = createCompiler();
  const [ sql, args ] = compile(query, { id: 123, status: 'Yes!', complete_status: 'No!' });
  assert(sql, "select users.json,EXISTS(select 1 from moderators where moderators.id = ?) as is_moderator from users where users.id = ? and users.status = ? and users.complete_status = ?");
  assertEquals(args, [ 123, 123, 'Yes!', 'No!' ]);
});

Deno.test("toNumbered", function() {
  const query = 'select users.json,EXISTS(select 1 from moderators where moderators.id = :id) as is_moderator from users where users.id = :id and users.status = :status and users.complete_status = :complete_status';
  const [ sql, args ] = toNumbered(query, { id: 123, status: 'Yes!', complete_status: 'No!' });
  assert(sql, "select users.json,EXISTS(select 1 from moderators where moderators.id = $1) as is_moderator from users where users.id = $1 and users.status = $2 and users.complete_status = $3");
  assertEquals(args, [ 123, 'Yes!', 'No!' ]);
});

credits

parser is based on @mscdex code of his excellent node-mariasql library