const { columnize } = require('./wrappingFormatter'); function replaceRawArrBindings(raw, client) { const bindingsHolder = { bindings: [], }; const builder = raw; const expectedBindings = raw.bindings.length; const values = raw.bindings; let index = 0; const sql = raw.sql.replace(/\\?\?\??/g, function (match) { if (match === '\\?') { return match; } const value = values[index++]; if (match === '??') { return columnize(value, builder, client, bindingsHolder); } return client.parameter(value, builder, bindingsHolder); }); if (expectedBindings !== index) { throw new Error(`Expected ${expectedBindings} bindings, saw ${index}`); } return { method: 'raw', sql, bindings: bindingsHolder.bindings, }; } function replaceKeyBindings(raw, client) { const bindingsHolder = { bindings: [], }; const builder = raw; const values = raw.bindings; const regex = /\\?(:(\w+):(?=::)|:(\w+):(?!:)|:(\w+))/g; const sql = raw.sql.replace(regex, function (match, p1, p2, p3, p4) { if (match !== p1) { return p1; } const part = p2 || p3 || p4; const key = match.trim(); const isIdentifier = key[key.length - 1] === ':'; const value = values[part]; if (value === undefined) { if (Object.prototype.hasOwnProperty.call(values, part)) { bindingsHolder.bindings.push(value); } return match; } if (isIdentifier) { return match.replace( p1, columnize(value, builder, client, bindingsHolder) ); } return match.replace(p1, client.parameter(value, builder, bindingsHolder)); }); return { method: 'raw', sql, bindings: bindingsHolder.bindings, }; } module.exports = { replaceKeyBindings, replaceRawArrBindings, };