Skip to content

Commit db07c30

Browse files
yannvgnlucleray
authored andcommitted
fix interference when expressions are json objects (#2)
1 parent be6c2fd commit db07c30

3 files changed

Lines changed: 25 additions & 3 deletions

File tree

sql.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const sqlText = (count, chains, expressions) => {
88
if (expression === undefined) {
99
// if expression is undefined, just skip it
1010
text += chains[i + 1]
11-
} else if (expression && expression._sql) {
11+
} else if (expression && expression._sql instanceof SqlContainer) {
1212
// if expression is a sub `sql` template literal
1313
const { text: _text, values: _values } = sqlText(
1414
count,
@@ -26,7 +26,7 @@ const sqlText = (count, chains, expressions) => {
2626
}
2727

2828
return {
29-
_sql: { chains, expressions },
29+
_sql: new SqlContainer(chains, expressions),
3030
text,
3131
values
3232
}
@@ -48,4 +48,11 @@ const sql = (chains, ...expressions) => {
4848
return sqlText(1, chains, expressions)
4949
}
5050

51+
class SqlContainer {
52+
constructor(chains, expressions) {
53+
this.chains = chains
54+
this.expressions = expressions
55+
}
56+
}
57+
5158
module.exports = sql

test/sql.test.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,12 @@ test('shorthand for node-postgres', async () => {
9191
const books = await sql(db)`select * from books`
9292
expect(books).toBe(sampleBooks)
9393
})
94+
95+
test('json as query parameter', () => {
96+
const jsonValue = { _sql: { some: 'data' }, item: 'value' }
97+
const query = sql`select obj from movies where obj = ${jsonValue}`
98+
99+
expect(trimSpaces(query.text)).toBe('select obj from movies where obj = $1')
100+
expect(query.values).toHaveLength(1)
101+
expect(query.values[0]).toBe(jsonValue)
102+
})

types/index.d.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,14 @@ declare function sql(
1717

1818
declare namespace sql {
1919
interface QueryConfig {
20-
_sql?: { chains: ReadonlyArray<string>; expressions: any[] }
20+
_sql?: SqlContainer
2121
text: string
2222
values: any[]
2323
}
2424
}
25+
26+
declare class SqlContainer {
27+
constructor(chains: ReadonlyArray<string>, expressions: any[])
28+
readonly chains: ReadonlyArray<string>
29+
readonly expressions: any[]
30+
}

0 commit comments

Comments
 (0)