libpg-query
Version:
The real PostgreSQL query parser
82 lines (81 loc) • 2.34 kB
JavaScript
export * from "@pgsql/types";
// @ts-ignore
import PgQueryModule from './libpg-query.js';
let wasmModule;
const initPromise = PgQueryModule().then((module) => {
wasmModule = module;
});
function ensureLoaded() {
if (!wasmModule)
throw new Error("WASM module not initialized. Call `loadModule()` first.");
}
export async function loadModule() {
if (!wasmModule) {
await initPromise;
}
}
function awaitInit(fn) {
return (async (...args) => {
await initPromise;
return fn(...args);
});
}
function stringToPtr(str) {
ensureLoaded();
if (typeof str !== 'string') {
throw new TypeError(`Expected a string, got ${typeof str}`);
}
const len = wasmModule.lengthBytesUTF8(str) + 1;
const ptr = wasmModule._malloc(len);
try {
wasmModule.stringToUTF8(str, ptr, len);
return ptr;
}
catch (error) {
wasmModule._free(ptr);
throw error;
}
}
function ptrToString(ptr) {
ensureLoaded();
if (typeof ptr !== 'number') {
throw new TypeError(`Expected a number, got ${typeof ptr}`);
}
return wasmModule.UTF8ToString(ptr);
}
export const parse = awaitInit(async (query) => {
const queryPtr = stringToPtr(query);
let resultPtr = 0;
try {
resultPtr = wasmModule._wasm_parse_query(queryPtr);
const resultStr = ptrToString(resultPtr);
if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
throw new Error(resultStr);
}
return JSON.parse(resultStr);
}
finally {
wasmModule._free(queryPtr);
if (resultPtr) {
wasmModule._wasm_free_string(resultPtr);
}
}
});
export function parseSync(query) {
const queryPtr = stringToPtr(query);
let resultPtr = 0;
try {
resultPtr = wasmModule._wasm_parse_query(queryPtr);
const resultStr = ptrToString(resultPtr);
if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
throw new Error(resultStr);
}
return JSON.parse(resultStr);
}
finally {
wasmModule._free(queryPtr);
if (resultPtr) {
wasmModule._wasm_free_string(resultPtr);
}
}
}