@libpg-query/parser
Version:
The real PostgreSQL query parser
322 lines (321 loc) • 11 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.scan = exports.normalize = exports.fingerprint = exports.parsePlPgSQL = exports.deparse = exports.parse = void 0;
exports.loadModule = loadModule;
exports.parseSync = parseSync;
exports.deparseSync = deparseSync;
exports.parsePlPgSQLSync = parsePlPgSQLSync;
exports.fingerprintSync = fingerprintSync;
exports.normalizeSync = normalizeSync;
exports.scanSync = scanSync;
__exportStar(require("@pgsql/types"), exports);
// @ts-ignore
const libpg_query_js_1 = __importDefault(require("./libpg-query.js"));
// @ts-ignore
const proto_js_1 = require("../proto.js");
let wasmModule;
const initPromise = (0, libpg_query_js_1.default)().then((module) => {
wasmModule = module;
});
function ensureLoaded() {
if (!wasmModule)
throw new Error("WASM module not initialized. Call `loadModule()` first.");
}
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);
}
exports.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.startsWith('ERROR')) {
throw new Error(resultStr);
}
return JSON.parse(resultStr);
}
finally {
wasmModule._free(queryPtr);
if (resultPtr) {
wasmModule._wasm_free_string(resultPtr);
}
}
});
exports.deparse = awaitInit(async (parseTree) => {
if (!parseTree || typeof parseTree !== 'object' || !Array.isArray(parseTree.stmts) || parseTree.stmts.length === 0) {
throw new Error('No parseTree provided');
}
const msg = proto_js_1.pg_query.ParseResult.fromObject(parseTree);
const data = proto_js_1.pg_query.ParseResult.encode(msg).finish();
const dataPtr = wasmModule._malloc(data.length);
let resultPtr = 0;
try {
wasmModule.HEAPU8.set(data, dataPtr);
resultPtr = wasmModule._wasm_deparse_protobuf(dataPtr, data.length);
const resultStr = ptrToString(resultPtr);
if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.startsWith('ERROR')) {
throw new Error(resultStr);
}
return resultStr;
}
finally {
wasmModule._free(dataPtr);
if (resultPtr) {
wasmModule._wasm_free_string(resultPtr);
}
}
});
exports.parsePlPgSQL = awaitInit(async (query) => {
const queryPtr = stringToPtr(query);
let resultPtr = 0;
try {
resultPtr = wasmModule._wasm_parse_plpgsql(queryPtr);
const resultStr = ptrToString(resultPtr);
if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.startsWith('ERROR')) {
throw new Error(resultStr);
}
return JSON.parse(resultStr);
}
finally {
wasmModule._free(queryPtr);
if (resultPtr) {
wasmModule._wasm_free_string(resultPtr);
}
}
});
exports.fingerprint = awaitInit(async (query) => {
const queryPtr = stringToPtr(query);
let resultPtr = 0;
try {
resultPtr = wasmModule._wasm_fingerprint(queryPtr);
const resultStr = ptrToString(resultPtr);
if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.startsWith('ERROR')) {
throw new Error(resultStr);
}
return resultStr;
}
finally {
wasmModule._free(queryPtr);
if (resultPtr) {
wasmModule._wasm_free_string(resultPtr);
}
}
});
exports.normalize = awaitInit(async (query) => {
const queryPtr = stringToPtr(query);
let resultPtr = 0;
try {
resultPtr = wasmModule._wasm_normalize_query(queryPtr);
const resultStr = ptrToString(resultPtr);
if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.startsWith('ERROR')) {
throw new Error(resultStr);
}
return resultStr;
}
finally {
wasmModule._free(queryPtr);
if (resultPtr) {
wasmModule._wasm_free_string(resultPtr);
}
}
});
// Sync versions
function parseSync(query) {
if (!wasmModule) {
throw new Error('WASM module not initialized. Call loadModule() first.');
}
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.startsWith('ERROR')) {
throw new Error(resultStr);
}
return JSON.parse(resultStr);
}
finally {
wasmModule._free(queryPtr);
if (resultPtr) {
wasmModule._wasm_free_string(resultPtr);
}
}
}
function deparseSync(parseTree) {
if (!wasmModule) {
throw new Error('WASM module not initialized. Call loadModule() first.');
}
if (!parseTree || typeof parseTree !== 'object' || !Array.isArray(parseTree.stmts) || parseTree.stmts.length === 0) {
throw new Error('No parseTree provided');
}
const msg = proto_js_1.pg_query.ParseResult.fromObject(parseTree);
const data = proto_js_1.pg_query.ParseResult.encode(msg).finish();
const dataPtr = wasmModule._malloc(data.length);
let resultPtr = 0;
try {
wasmModule.HEAPU8.set(data, dataPtr);
resultPtr = wasmModule._wasm_deparse_protobuf(dataPtr, data.length);
const resultStr = ptrToString(resultPtr);
if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.startsWith('ERROR')) {
throw new Error(resultStr);
}
return resultStr;
}
finally {
wasmModule._free(dataPtr);
if (resultPtr) {
wasmModule._wasm_free_string(resultPtr);
}
}
}
function parsePlPgSQLSync(query) {
if (!wasmModule) {
throw new Error('WASM module not initialized. Call loadModule() first.');
}
const queryPtr = stringToPtr(query);
let resultPtr = 0;
try {
resultPtr = wasmModule._wasm_parse_plpgsql(queryPtr);
const resultStr = ptrToString(resultPtr);
if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.startsWith('ERROR')) {
throw new Error(resultStr);
}
return JSON.parse(resultStr);
}
finally {
wasmModule._free(queryPtr);
if (resultPtr) {
wasmModule._wasm_free_string(resultPtr);
}
}
}
function fingerprintSync(query) {
if (!wasmModule) {
throw new Error('WASM module not initialized. Call loadModule() first.');
}
const queryPtr = stringToPtr(query);
let resultPtr = 0;
try {
resultPtr = wasmModule._wasm_fingerprint(queryPtr);
const resultStr = ptrToString(resultPtr);
if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.startsWith('ERROR')) {
throw new Error(resultStr);
}
return resultStr;
}
finally {
wasmModule._free(queryPtr);
if (resultPtr) {
wasmModule._wasm_free_string(resultPtr);
}
}
}
function normalizeSync(query) {
if (!wasmModule) {
throw new Error('WASM module not initialized. Call loadModule() first.');
}
const queryPtr = stringToPtr(query);
let resultPtr = 0;
try {
resultPtr = wasmModule._wasm_normalize_query(queryPtr);
const resultStr = ptrToString(resultPtr);
if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.startsWith('ERROR')) {
throw new Error(resultStr);
}
return resultStr;
}
finally {
wasmModule._free(queryPtr);
if (resultPtr) {
wasmModule._wasm_free_string(resultPtr);
}
}
}
exports.scan = awaitInit(async (query) => {
const queryPtr = stringToPtr(query);
let resultPtr = 0;
try {
resultPtr = wasmModule._wasm_scan(queryPtr);
const resultStr = ptrToString(resultPtr);
if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.startsWith('ERROR')) {
throw new Error(resultStr);
}
return JSON.parse(resultStr);
}
finally {
wasmModule._free(queryPtr);
if (resultPtr) {
wasmModule._wasm_free_string(resultPtr);
}
}
});
function scanSync(query) {
if (!wasmModule) {
throw new Error('WASM module not initialized. Call loadModule() first.');
}
const queryPtr = stringToPtr(query);
let resultPtr = 0;
try {
resultPtr = wasmModule._wasm_scan(queryPtr);
const resultStr = ptrToString(resultPtr);
if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.startsWith('ERROR')) {
throw new Error(resultStr);
}
return JSON.parse(resultStr);
}
finally {
wasmModule._free(queryPtr);
if (resultPtr) {
wasmModule._wasm_free_string(resultPtr);
}
}
}