Skip to content

Commit

Permalink
Merge 08fc09b into b9de49b
Browse files Browse the repository at this point in the history
  • Loading branch information
Sharaal committed Nov 21, 2019
2 parents b9de49b + 08fc09b commit 91c9b78
Show file tree
Hide file tree
Showing 11 changed files with 95 additions and 16 deletions.
2 changes: 1 addition & 1 deletion README.md
Expand Up @@ -103,7 +103,7 @@ const users = await sql.any(
)
```

There are a lot more Tag Helpers available like `.identifier`, `.table`, `.column(s)`, `.value(s)`, `.valuesList`, `.assignments`, `.conditions`, `.limit`, `.offset`, `.pagination` and `.if`.
There are a lot more Tag Helpers available like `.identifier`, `.table`, `.column(s)`, `.value(s)`, `.valuesList`, `.assignments`, `.conditions`, `.limit`, `.offset`, `.pagination`, `.if`, `.jsonColumnObject` and `.jsonColumnText`.

## More

Expand Down
2 changes: 2 additions & 0 deletions src/sql.js
Expand Up @@ -41,6 +41,8 @@ module.exports = (options = {}) => {
'./tag-helpers/sql.conditions.js',
'./tag-helpers/sql.identifier.js',
'./tag-helpers/sql.if.js',
'./tag-helpers/sql.jsonColumnObject.js',
'./tag-helpers/sql.jsonColumnText.js',
'./tag-helpers/sql.limit.js',
'./tag-helpers/sql.offset.js',
'./tag-helpers/sql.pagination.js',
Expand Down
12 changes: 12 additions & 0 deletions src/tag-helpers/jsonColumnByOperator.js
@@ -0,0 +1,12 @@
module.exports = sql => (jsonColumn, lastOperator) => {
const [column, ...keys] = jsonColumn
return () => ({
text: sql.column(column)().text +
keys.reduce(
(text, key, index) =>
text + (index === keys.length - 1 ? lastOperator : '->') + "'" + key.replace(/'/g, "''") + "'",
''
),
values: []
})
}
9 changes: 8 additions & 1 deletion src/tag-helpers/sql.columns.js
Expand Up @@ -4,7 +4,14 @@ module.exports = sql => {
columns = Object.keys(columns)
}
return () => ({
text: columns.map(column => sql.identifier(column)().text).join(', '),
text: columns
.map(column => {
if (typeof column !== 'function') {
column = sql.identifier(column)
}
return column().text
})
.join(', '),
values: []
})
}
Expand Down
5 changes: 5 additions & 0 deletions src/tag-helpers/sql.jsonColumnObject.js
@@ -0,0 +1,5 @@
module.exports = sql => {
const jsonColumnByOperator = require('./jsonColumnByOperator')(sql)

sql.jsonColumnObject = jsonColumn => jsonColumnByOperator(jsonColumn, '->')
}
5 changes: 5 additions & 0 deletions src/tag-helpers/sql.jsonColumnText.js
@@ -0,0 +1,5 @@
module.exports = sql => {
const jsonColumnByOperator = require('./jsonColumnByOperator')(sql)

sql.jsonColumnText = jsonColumn => jsonColumnByOperator(jsonColumn, '->>')
}
24 changes: 17 additions & 7 deletions test/unit/tag-helpers/sql.column.js
@@ -1,22 +1,32 @@
const sql = require('../../../')()
const { testTagHelper } = require('../test')

describe('sql.identifier', () => {
it('escapes the given identifier', () => {
describe('sql.column', () => {
it('escapes the given column', () => {
testTagHelper(
sql.identifier('identifier'),
sql.column('column'),
{
text: '"identifier"',
text: '"column"',
values: []
}
)
})

it('escapes the given unsecure identifier', () => {
it('escapes the given unsecure column', () => {
testTagHelper(
sql.identifier('identifier"identifier'),
sql.column('column"column'),
{
text: '"identifier""identifier"',
text: '"column""column"',
values: []
}
)
})

it('use the tag helper if given as column', () => {
testTagHelper(
sql.column(() => ({ text: '"column"' })),
{
text: '"column"',
values: []
}
)
Expand Down
10 changes: 10 additions & 0 deletions test/unit/tag-helpers/sql.columns.js
Expand Up @@ -31,4 +31,14 @@ describe('sql.columns', () => {
}
)
})

it('use the tag helper if given as column', () => {
testTagHelper(
sql.columns(['column1', () => ({ text: '"column2"' }), 'column3']),
{
text: '"column1", "column2", "column3"',
values: []
}
)
})
})
14 changes: 7 additions & 7 deletions test/unit/tag-helpers/sql.identifier.js
@@ -1,22 +1,22 @@
const sql = require('../../../')()
const { testTagHelper } = require('../test')

describe('sql.column', () => {
it('escapes the given column', () => {
describe('sql.identifier', () => {
it('escapes the given identifier', () => {
testTagHelper(
sql.column('column'),
sql.identifier('identifier'),
{
text: '"column"',
text: '"identifier"',
values: []
}
)
})

it('escapes the given unsecure column', () => {
it('escapes the given unsecure identifier', () => {
testTagHelper(
sql.column('column"column'),
sql.column('identifier"identifier'),
{
text: '"column""column"',
text: '"identifier""identifier"',
values: []
}
)
Expand Down
14 changes: 14 additions & 0 deletions test/unit/tag-helpers/sql.jsonColumnObject.js
@@ -0,0 +1,14 @@
const sql = require('../../../')()
const { testTagHelper } = require('../test')

describe('sql.jsonColumnObject', () => {
it('use the column and keys to build a chain access a JSON object', () => {
testTagHelper(
sql.jsonColumnObject(['column', 'keyA', 'keyB', 'keyC']),
{
text: '"column"->\'keyA\'->\'keyB\'->\'keyC\'',
values: []
}
)
})
})
14 changes: 14 additions & 0 deletions test/unit/tag-helpers/sql.jsonColumnText.js
@@ -0,0 +1,14 @@
const sql = require('../../../')()
const { testTagHelper } = require('../test')

describe('sql.jsonColumnObject', () => {
it('use the column and keys to build a chain access a text', () => {
testTagHelper(
sql.jsonColumnText(['column', 'keyA', 'keyB', 'keyC']),
{
text: '"column"->\'keyA\'->\'keyB\'->>\'keyC\'',
values: []
}
)
})
})

0 comments on commit 91c9b78

Please sign in to comment.