Skip to content

Commit 52eed0d

Browse files
committed
Convert to ESM, add type definition, drop tape for testing
Thank you Cursor
1 parent 43929d4 commit 52eed0d

12 files changed

+582
-586
lines changed

build-logic.js

+4-6
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
const constants = require(`./constants`)
1+
import { clauseOrder, clauseKeyToString } from './constants.js'
22

33
function build(clauses, joinedBy = `\n`) {
4-
const built = constants.clauseOrder.map(
4+
const built = clauseOrder.map(
55
key => ({
66
key,
77
ary: clauses[key],
88
}),
99
)
1010
.filter(clause => clause.ary && clause.ary.length > 0)
11-
.map(clause => reduceClauseArray(clause.ary, constants.clauseKeyToString[clause.key]))
11+
.map(clause => reduceClauseArray(clause.ary, clauseKeyToString[clause.key]))
1212
.reduce((part1, part2) => combine(joinedBy, part1, part2))
1313

1414
return {
@@ -46,6 +46,4 @@ function combine(joinCharacter, part1, part2) {
4646
}
4747
}
4848

49-
module.exports = {
50-
build,
51-
}
49+
export { build }

changelog.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
# 4.0.0
2+
3+
- breaking: convert to ESM
4+
- feature: add type definition
5+
16
# 3.1.0
27

38
- feature: add `union` and `unionAll` methods [#28](https://github.com/TehShrike/sql-concat/pull/28)

clause-handlers.js

+111-102
Original file line numberDiff line numberDiff line change
@@ -1,105 +1,3 @@
1-
module.exports = {
2-
staticText(text) {
3-
return {
4-
sql: text,
5-
}
6-
},
7-
whateverTheyPutIn(clausePartsJoinedBy, partsJoinedBy, ...expressions) {
8-
const { sql, values } = joinExpressions(expressions, partsJoinedBy)
9-
return {
10-
sql,
11-
values,
12-
joinedBy: clausePartsJoinedBy,
13-
}
14-
},
15-
tableNameOrSubquery(table, alias) {
16-
if (hasABuildFunction(table)) {
17-
const result = table.build(`\n\t`)
18-
19-
return {
20-
sql: combineWithAlias(`(\n\t${ result.sql }\n)`, alias),
21-
values: result.values,
22-
}
23-
} else {
24-
return {
25-
sql: combineWithAlias(table, alias),
26-
}
27-
}
28-
},
29-
columnParam(joinedBy, opts, expression, comparator, value) {
30-
opts = opts || {}
31-
32-
const expressionObject = expressionToObject(expression)
33-
34-
if (comparator === undefined) {
35-
if (opts.like) {
36-
throw new Error(`You can't use a "like" comparison without passing in a value`)
37-
}
38-
return { joinedBy, ...expressionObject }
39-
} else if (value === undefined) {
40-
value = comparator
41-
comparator = undefined
42-
}
43-
44-
const valueIsObject = (value && typeof value === `object` && value.values && typeof value.values === `object`)
45-
46-
const valueParams = valueIsObject
47-
? value.values
48-
: [ value ]
49-
50-
const values = [ ...expressionObject.values, ...valueParams ]
51-
52-
const comparatorAndValue = valueIsObject
53-
? getComparison(opts.like, comparator) + ` ` + value.sql
54-
: getComparisonAndParameterString(value, opts.like, comparator)
55-
56-
return {
57-
sql: `${ expressionObject.sql } ${ comparatorAndValue }`,
58-
values,
59-
joinedBy,
60-
}
61-
},
62-
joinClauseHandler(type, table, alias, on) {
63-
if (!on) {
64-
on = alias
65-
alias = undefined
66-
}
67-
68-
function joinString() {
69-
return `${ type }JOIN `
70-
}
71-
72-
let onParams = []
73-
let onString = ``
74-
75-
if (on) {
76-
if (on.values) {
77-
onParams = on.values
78-
onString = makeOn(on.sql)
79-
} else {
80-
onString = makeOn(on)
81-
}
82-
}
83-
84-
85-
if (hasABuildFunction(table)) {
86-
const result = table.build(`\n\t`)
87-
88-
return {
89-
sql: joinString() + combineWithAlias(`(\n\t${ result.sql }\n)`, alias) + onString,
90-
values: [ ...result.values, ...onParams ],
91-
joinedBy: `\n`,
92-
}
93-
} else {
94-
return {
95-
sql: joinString() + combineWithAlias(table, alias) + onString,
96-
values: onParams,
97-
joinedBy: `\n`,
98-
}
99-
}
100-
},
101-
}
102-
1031
const makeOn = on => on ? ` ON ${ on }` : ``
1042

1053
const expressionToObject = expression => {
@@ -147,3 +45,114 @@ function hasABuildFunction(q) {
14745
function combineWithAlias(str, alias) {
14846
return alias ? (`${ str } AS ${ alias }`) : str
14947
}
48+
49+
export {
50+
staticText,
51+
whateverTheyPutIn,
52+
tableNameOrSubquery,
53+
columnParam,
54+
joinClauseHandler,
55+
}
56+
57+
function staticText(text) {
58+
return {
59+
sql: text,
60+
}
61+
}
62+
63+
function whateverTheyPutIn(clausePartsJoinedBy, partsJoinedBy, ...expressions) {
64+
const { sql, values } = joinExpressions(expressions, partsJoinedBy)
65+
return {
66+
sql,
67+
values,
68+
joinedBy: clausePartsJoinedBy,
69+
}
70+
}
71+
72+
function tableNameOrSubquery(table, alias) {
73+
if (hasABuildFunction(table)) {
74+
const result = table.build(`\n\t`)
75+
76+
return {
77+
sql: combineWithAlias(`(\n\t${ result.sql }\n)`, alias),
78+
values: result.values,
79+
}
80+
} else {
81+
return {
82+
sql: combineWithAlias(table, alias),
83+
}
84+
}
85+
}
86+
87+
function columnParam(joinedBy, opts, expression, comparator, value) {
88+
opts = opts || {}
89+
90+
const expressionObject = expressionToObject(expression)
91+
92+
if (comparator === undefined) {
93+
if (opts.like) {
94+
throw new Error(`You can't use a "like" comparison without passing in a value`)
95+
}
96+
return { joinedBy, ...expressionObject }
97+
} else if (value === undefined) {
98+
value = comparator
99+
comparator = undefined
100+
}
101+
102+
const valueIsObject = (value && typeof value === `object` && value.values && typeof value.values === `object`)
103+
104+
const valueParams = valueIsObject
105+
? value.values
106+
: [ value ]
107+
108+
const values = [ ...expressionObject.values, ...valueParams ]
109+
110+
const comparatorAndValue = valueIsObject
111+
? getComparison(opts.like, comparator) + ` ` + value.sql
112+
: getComparisonAndParameterString(value, opts.like, comparator)
113+
114+
return {
115+
sql: `${ expressionObject.sql } ${ comparatorAndValue }`,
116+
values,
117+
joinedBy,
118+
}
119+
}
120+
121+
function joinClauseHandler(type, table, alias, on) {
122+
if (!on) {
123+
on = alias
124+
alias = undefined
125+
}
126+
127+
function joinString() {
128+
return `${ type }JOIN `
129+
}
130+
131+
let onParams = []
132+
let onString = ``
133+
134+
if (on) {
135+
if (on.values) {
136+
onParams = on.values
137+
onString = makeOn(on.sql)
138+
} else {
139+
onString = makeOn(on)
140+
}
141+
}
142+
143+
if (hasABuildFunction(table)) {
144+
const result = table.build(`\n\t`)
145+
146+
return {
147+
sql: joinString() + combineWithAlias(`(\n\t${ result.sql }\n)`, alias) + onString,
148+
values: [ ...result.values, ...onParams ],
149+
joinedBy: `\n`,
150+
}
151+
} else {
152+
return {
153+
sql: joinString() + combineWithAlias(table, alias) + onString,
154+
values: onParams,
155+
joinedBy: `\n`,
156+
}
157+
}
158+
}

combinable-logic.js

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const sqlString = require(`sqlstring`)
2-
const { build } = require(`./build-logic.js`)
1+
import sqlString from 'sqlstring'
2+
import { build } from './build-logic.js'
33

44
const combinableType = {
55
text: `text`,
@@ -55,6 +55,4 @@ const combineClauses = (clausesA, combineText, clausesB) => makeCombinableQuerie
5555
{ clauses: clausesB, type: combinableType.clauses },
5656
])
5757

58-
module.exports = {
59-
combineClauses,
60-
}
58+
export { combineClauses }

constants.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ const startingClauses = {
5252
lock: [],
5353
}
5454

55-
module.exports = {
55+
export {
5656
clauseOrder,
5757
clauseKeyToString,
5858
startingClauses,

index.d.ts

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
declare module 'sql-concat' {
2+
type Buildable = {
3+
build(): { sql: string, values: Value[] }
4+
toString(): string
5+
}
6+
7+
type StringOrSubquery = string | Buildable
8+
9+
type Unionable = {
10+
union(query: Buildable): Unionable
11+
unionAll(query: Buildable): Unionable
12+
} & Buildable
13+
14+
type Value = string | number | null | object
15+
16+
type Tag = (sql: TemplateStringsArray, ...values: any[]) => string
17+
18+
export type Query = {
19+
select(...sql_expression: string[]): Query
20+
from(string_or_subquery: StringOrSubquery, alias?: string): Query
21+
join(string_or_subquery: StringOrSubquery, on_expression: string): Query
22+
join(string_or_subquery: StringOrSubquery, alias: string, on_expression: string): Query
23+
leftJoin(string_or_subquery: StringOrSubquery, on_expression: string): Query
24+
leftJoin(string_or_subquery: StringOrSubquery, alias: string, on_expression: string): Query
25+
where(sql_expression: string): Query
26+
where(sql_expression: string, value: Value): Query
27+
where(sql_expression: string, comparator: string, value: Value): Query
28+
orWhere(sql_expression: string): Query
29+
orwhere(sql_expression: string, value: Value): Query
30+
orWhere(sql_expression: string, comparator: string, value: Value): Query
31+
whereLike(sql_expression: string, value: Value): Query
32+
orWhereLike(sql_expression: string, value: Value): Query
33+
having(sql_expression: string): Query
34+
having(sql_expression: string, value: Value): Query
35+
having(sql_expression: string, comparator: string, value: Value): Query
36+
orHaving(sql_expression: string): Query
37+
orHaving(sql_expression: string, value: Value): Query
38+
orHaving(sql_expression: string, comparator: string, value: Value): Query
39+
groupBy(...sql_expression: string[]): Query
40+
orderBy(...sql_expression: string[]): Query
41+
limit(row_count: number): Query
42+
limit(offset: number, row_count: number): Query
43+
forUpdate(): Query
44+
lockInShareMode(): Query
45+
} & Buildable & Unionable & Tag
46+
47+
const query: Query
48+
49+
export default query
50+
}

index.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
const q = require(`./query-object`)
2-
const { startingClauses } = require(`./constants`)
3-
const taggedTemplate = require(`./tagged-template.js`)
1+
import q from './query-object.js'
2+
import { startingClauses } from './constants.js'
3+
import taggedTemplate from './tagged-template.js'
44

5-
module.exports = Object.assign(taggedTemplate, q(startingClauses))
5+
export default Object.assign(taggedTemplate, q(startingClauses))

0 commit comments

Comments
 (0)