Skip to content

Commit 69b1731

Browse files
committed
fix: support sequelize 5/6
1 parent 2217436 commit 69b1731

File tree

5 files changed

+95
-161
lines changed

5 files changed

+95
-161
lines changed

README.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ const User = sequelize.define('User', {
3939

4040
const lock = true
4141

42-
sequelize.query(...sql`SELECT ${User.attributes.name} FROM ${User}
43-
WHERE ${User.attributes.birthday} = ${new Date('2346-7-11')} AND
44-
${User.attributes.active} = ${true}
42+
sequelize.query(...sql`SELECT ${User.rawAttributes.name} FROM ${User}
43+
WHERE ${User.rawAttributes.birthday} = ${new Date('2346-7-11')} AND
44+
${User.rawAttributes.active} = ${true}
4545
${lock ? sql`FOR UPDATE` : sql``}then(console.log);
4646
// => [ [ { name: 'Jimbob' } ], Statement { sql: 'SELECT "name" FROM "Users" WHERE "birthday" = $1 AND "active" = $2 FOR UPDATE' } ]
4747
```
@@ -74,9 +74,9 @@ async function getUsersInOrganization(organizationId, where = {}) {
7474
// Using a sequelize include clause to do this kind of sucks tbh
7575
id: {
7676
[Op.in]: Sequelize.literal(sql.escape`
77-
SELECT ${OrganizationMember.attributes.userId}
77+
SELECT ${OrganizationMember.rawAttributes.userId}
7878
FROM ${OrganizationMember}
79-
WHERE ${OrganizationMember.attributes.organizationId} = ${organizationId}
79+
WHERE ${OrganizationMember.rawAttributes.organizationId} = ${organizationId}
8080
`),
8181
},
8282
// SELECT "userId" FROM "OrganizationMembers" WHERE "organizationId" = 2
@@ -97,7 +97,7 @@ Creates arguments for `sequelize.query`.
9797

9898
Will be interpolated to the model's `tableName`.
9999
100-
#### Model attribute (e.g. `User.attributes.id`)
100+
#### Model attribute (e.g. `User.rawAttributes.id`)
101101
102102
Will be interpolated to the column name for the attribute
103103
@@ -131,7 +131,7 @@ Creates a raw SQL string with all expressions in the template escaped.
131131
132132
Will be interpolated to the model's `tableName`.
133133

134-
#### Model attribute (e.g. `User.attributes.id`)
134+
#### Model attribute (e.g. `User.rawAttributes.id`)
135135

136136
Will be interpolated to the column name for the attribute
137137

@@ -180,7 +180,7 @@ const users = [
180180
const { escape, values } = sql.with(sequelize)
181181
escape`
182182
INSERT INTO ${User}
183-
${User.attributes.name}, ${User.attributes.birthday}
183+
${User.rawAttributes.name}, ${User.rawAttributes.birthday}
184184
VALUES ${users.map(({ name, birthday }) => values`(${name}, ${birthday})`)}
185185
`
186186
// returns `INSERT INTO "Users" "name", "birthday" VALUES ('Jim', 'Jan 1 2020'), ('Bob', 'Jan 2 1986')`
@@ -209,7 +209,7 @@ const User = sequelize.define('User', {
209209
async function insertUser(user) {
210210
const { query } = sql.with(sequelize)
211211
await query`
212-
INSERT INTO ${User} ${User.attributes.name} VALUES (${user.name});
212+
INSERT INTO ${User} ${User.rawAttributes.name} VALUES (${user.name});
213213
`({ transaction })
214214
}
215215
```

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@
120120
"prettier-eslint": "^8.8.2",
121121
"rimraf": "^2.6.0",
122122
"semantic-release": "^17.1.1",
123-
"sequelize": "^4.39.0"
123+
"sequelize": "^6.3.5"
124124
},
125125
"dependencies": {
126126
"@babel/runtime": "^7.1.5"
@@ -144,6 +144,6 @@
144144
}
145145
},
146146
"peerDependencies": {
147-
"sequelize": "^4.39.0"
147+
"sequelize": "^4.39.0 || ^5.0.0 || ^6.0.0"
148148
}
149149
}

src/index.js

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,13 @@ class ValuesRow {
1515
}
1616
}
1717

18+
function getQueryGeneratorCompat(value: any): QueryGenerator {
19+
const { queryGenerator, QueryGenerator } = value
20+
if (queryGenerator) return queryGenerator
21+
if (QueryGenerator) return QueryGenerator
22+
throw new Error(`failed to get queryGenerator on ${value}`)
23+
}
24+
1825
function isValuesArray(expression: any): boolean {
1926
if (!Array.isArray(expression)) return false
2027
for (let i = 0; i < expression.length; i++) {
@@ -50,16 +57,13 @@ function sql(
5057
)
5158
if (Array.isArray(options.bind)) bind.push(...options.bind)
5259
} else if (expression && expression.prototype instanceof Model) {
53-
const { QueryGenerator, tableName } = (expression: any)
54-
queryGenerator = QueryGenerator
55-
parts.push(QueryGenerator.quoteTable(tableName))
60+
const { tableName } = (expression: any)
61+
queryGenerator = getQueryGeneratorCompat(expression)
62+
parts.push(queryGenerator.quoteTable(tableName))
5663
} else if (expression && expression.type instanceof Sequelize.ABSTRACT) {
57-
const {
58-
field,
59-
Model: { QueryGenerator },
60-
} = (expression: any)
61-
queryGenerator = QueryGenerator
62-
parts.push(QueryGenerator.quoteIdentifier(field))
64+
const { field, Model } = (expression: any)
65+
queryGenerator = getQueryGeneratorCompat(Model)
66+
parts.push(queryGenerator.quoteIdentifier(field))
6367
} else {
6468
bind.push(expression)
6569
parts.push(`$${bind.length}`)
@@ -89,11 +93,11 @@ function findQueryGenerator(
8993
) {
9094
return (expression: any)[queryGeneratorSymbol]
9195
} else if (expression && expression.prototype instanceof Model) {
92-
return (expression: any).QueryGenerator
96+
return getQueryGeneratorCompat(expression)
9397
} else if (expression && expression.type instanceof Sequelize.ABSTRACT) {
94-
return (expression: any).Model.QueryGenerator
98+
return getQueryGeneratorCompat((expression: any).Model)
9599
} else if (expression instanceof Sequelize) {
96-
return expression.getQueryInterface().QueryGenerator
100+
return getQueryGeneratorCompat(expression.getQueryInterface())
97101
}
98102
}
99103
throw new Error(
@@ -177,7 +181,7 @@ sql.with = (sequelize: Sequelize) => ({
177181
strings: $ReadOnlyArray<string>,
178182
...expressions: $ReadOnlyArray<mixed>
179183
): string =>
180-
escapeSql(() => sequelize.getQueryInterface().QueryGenerator)(
184+
escapeSql(() => getQueryGeneratorCompat(sequelize.getQueryInterface()))(
181185
strings,
182186
...expressions
183187
),
@@ -186,7 +190,7 @@ sql.with = (sequelize: Sequelize) => ({
186190
...expressions: $ReadOnlyArray<mixed>
187191
): ValuesRow =>
188192
new ValuesRow(
189-
escapeSql(() => sequelize.getQueryInterface().QueryGenerator)(
193+
escapeSql(() => getQueryGeneratorCompat(sequelize.getQueryInterface()))(
190194
strings,
191195
...expressions
192196
)
@@ -196,7 +200,7 @@ sql.with = (sequelize: Sequelize) => ({
196200
...expressions: $ReadOnlyArray<mixed>
197201
): Literal =>
198202
Sequelize.literal(
199-
escapeSql(() => sequelize.getQueryInterface().QueryGenerator)(
203+
escapeSql(() => getQueryGeneratorCompat(sequelize.getQueryInterface()))(
200204
strings,
201205
...expressions
202206
)

test/index.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ describe(`sql`, function() {
1818

1919
it(`works`, function() {
2020
expect(sql`
21-
SELECT ${User.attributes.name} ${Sequelize.literal('FROM')} ${User}
22-
WHERE ${User.attributes.birthday} = ${new Date('2346-7-11')} AND
23-
${sql`${User.attributes.name} LIKE ${'a%'} AND`}${sql``}
24-
${User.attributes.id} = ${1}
21+
SELECT ${User.rawAttributes.name} ${Sequelize.literal('FROM')} ${User}
22+
WHERE ${User.rawAttributes.birthday} = ${new Date('2346-7-11')} AND
23+
${sql`${User.rawAttributes.name} LIKE ${'a%'} AND`}${sql``}
24+
${User.rawAttributes.id} = ${1}
2525
`).to.deep.equal([
2626
`SELECT "name" FROM "Users" WHERE "birthday" = $1 AND "name" LIKE $2 AND "id" = $3`,
2727
{
@@ -48,7 +48,7 @@ WHERE ${User.attributes.birthday} = ${new Date('2346-7-11')} AND
4848
]
4949
expect(sql`
5050
INSERT INTO ${User}
51-
${User.attributes.name}, ${User.attributes.birthday}
51+
${User.rawAttributes.name}, ${User.rawAttributes.birthday}
5252
VALUES ${users.map(
5353
({ name, birthday }) => values`(${name}, ${birthday})`
5454
)}
@@ -71,10 +71,10 @@ describe(`sql.escape`, function() {
7171
})
7272

7373
expect(sql.escape`
74-
SELECT ${User.attributes.id} ${Sequelize.literal('FROM')} ${User}
75-
WHERE ${User.attributes.name} LIKE ${'and%'} AND
76-
${sql`${User.attributes.name} LIKE ${'a%'} AND`}${sql``}
77-
${User.attributes.id} = ${1}
74+
SELECT ${User.rawAttributes.id} ${Sequelize.literal('FROM')} ${User}
75+
WHERE ${User.rawAttributes.name} LIKE ${'and%'} AND
76+
${sql`${User.rawAttributes.name} LIKE ${'a%'} AND`}${sql``}
77+
${User.rawAttributes.id} = ${1}
7878
`).to.deep.equal(`SELECT "id" FROM "Users"
7979
WHERE "name" LIKE 'and%' AND
8080
"name" LIKE 'a%' AND

0 commit comments

Comments
 (0)