Skip to content

Commit db32bec

Browse files
committed
lib: Replace lodash/isEqual with a custom function for comparing key definitions
1 parent 7fb5f64 commit db32bec

File tree

5 files changed

+249
-7
lines changed

5 files changed

+249
-7
lines changed

lib/TableDefinition.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const Operation = require('./Operation');
66
const arraysEqual = require('./utils/arraysEqual');
77
const cloneKeys = require('./utils/cloneKeys');
88
const diffKeys = require('./utils/diffKeys');
9-
const isEqual = require('lodash/isEqual');
9+
const isKeyEqual = require('./utils/isKeyEqual');
1010
const sqlToSchema = require('./sqlToSchema');
1111

1212
class TableDefinition {
@@ -167,7 +167,7 @@ class TableDefinition {
167167
const operations = [];
168168
const newSchema = this._schema;
169169

170-
if (!isEqual(newSchema.primaryKey, oldSchema.primaryKey)) {
170+
if (!isKeyEqual(newSchema.primaryKey, oldSchema.primaryKey)) {
171171
if (oldSchema.primaryKey) {
172172
operations.push(Operation.create(
173173
Operation.Types.DROP_KEY,
@@ -239,7 +239,7 @@ class TableDefinition {
239239
for (columnNames in oldForeignKeys) {
240240
const columnNamesArray = columnNames.split(',');
241241

242-
if (newForeignKeys && isEqual(oldForeignKeys[columnNames], newForeignKeys[columnNames])) {
242+
if (newForeignKeys && isKeyEqual(oldForeignKeys[columnNames], newForeignKeys[columnNames])) {
243243
if (!mustAvoidforeignKeyConflict(columnNamesArray, otherOperations)) {
244244
continue;
245245
}
@@ -255,7 +255,7 @@ class TableDefinition {
255255

256256
for (columnNames in newForeignKeys) {
257257
const newForeignKeyData = newForeignKeys[columnNames];
258-
if (!keysToAddBack.has(columnNames) && isEqual(newForeignKeyData, oldForeignKeys[columnNames])) {
258+
if (!keysToAddBack.has(columnNames) && isKeyEqual(newForeignKeyData, oldForeignKeys[columnNames])) {
259259
continue;
260260
}
261261
const keySQL = this._generateForeignKeySQL(columnNames, newForeignKeyData);

lib/utils/isKeyEqual.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/**
2+
* isKeyEqual
3+
*
4+
* Compares two key definitions and returns true if they are equal and false if they are not.
5+
*/
6+
7+
'use strict';
8+
9+
const arraysEqual = require('./arraysEqual');
10+
11+
function isKeyEqual(keyA, keyB) {
12+
if (!keyA) {
13+
return !keyB; // If both keys are falsy, they are equal
14+
}
15+
16+
if (!keyB) {
17+
return false;
18+
}
19+
20+
if (keyA instanceof Array) {
21+
return keyB instanceof Array
22+
? arraysEqual(keyA, keyB) // multi-column key
23+
: false;
24+
}
25+
26+
if (typeof keyA === 'object') {
27+
return typeof keyB === 'object'
28+
? isForeignKeyObjectEqual(keyA, keyB)
29+
: false;
30+
}
31+
32+
return keyA === keyB; // Both keys are strings
33+
}
34+
35+
function isForeignKeyObjectEqual(objA, objB) {
36+
if (
37+
objA.table !== objB.table ||
38+
objA.onDelete !== objB.onDelete ||
39+
objA.onUpdate !== objB.onUpdate
40+
) {
41+
return false;
42+
}
43+
44+
if (objA.column instanceof Array && objB.column instanceof Array) {
45+
return arraysEqual(objA.column, objB.column);
46+
}
47+
48+
return objA.column === objB.column;
49+
}
50+
51+
module.exports = isKeyEqual;

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
},
1818
"homepage": "https://github.com/nwoltman/node-mysql-plus#readme",
1919
"dependencies": {
20-
"lodash": "^4.17.2",
2120
"mysql": "^2.13.0"
2221
},
2322
"devDependencies": {

test/integration/MySQLPlus.test.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ describe('MySQLPlus', function() {
132132
const columnsTableName = 'columns_table';
133133
const columnsTableSchema = {
134134
columns: {
135-
id: ColTypes.int().unsigned().notNull().primaryKey().default(1),
135+
id: ColTypes.int().unsigned().notNull().default(1),
136136
uuid: ColTypes.char(44).unique(),
137137
email: ColTypes.char(255),
138138
fp: ColTypes.float(7, 4),
@@ -155,7 +155,6 @@ describe('MySQLPlus', function() {
155155
' `changeme` tinyint(4) DEFAULT NULL,\n' +
156156
' `neverchange` tinyint(4) DEFAULT NULL,\n' +
157157
' `norename` tinyint(4) DEFAULT NULL,\n' +
158-
' PRIMARY KEY (`id`),\n' +
159158
' UNIQUE KEY `unique_columns_table_uuid` (`uuid`),\n' +
160159
' KEY `index_columns_table_email` (`email`),\n' +
161160
' KEY `index_columns_table_id_email` (`id`,`email`)\n' +

test/unit/isKeyEqual.test.js

Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
'use strict';
2+
3+
const isKeyEqual = require('../../lib/utils/isKeyEqual');
4+
5+
describe('isKeyEqual()', () => {
6+
7+
it('should compare the equality of key definitions', () => {
8+
isKeyEqual(null, null).should.be.true();
9+
isKeyEqual(null, undefined).should.be.true();
10+
isKeyEqual(undefined, null).should.be.true();
11+
isKeyEqual(undefined, undefined).should.be.true();
12+
13+
isKeyEqual('a', 'a').should.be.true();
14+
isKeyEqual(['a'], ['a']).should.be.true();
15+
isKeyEqual(['a', 'b'], ['a', 'b']).should.be.true();
16+
17+
isKeyEqual({
18+
table: 'user',
19+
column: 'id',
20+
onDelete: 'CASCADE',
21+
onUpdate: 'NO ACTION',
22+
}, {
23+
table: 'user',
24+
column: 'id',
25+
onDelete: 'CASCADE',
26+
onUpdate: 'NO ACTION',
27+
}).should.be.true();
28+
29+
isKeyEqual({
30+
table: 'user',
31+
column: 'id',
32+
onDelete: 'CASCADE',
33+
onUpdate: 'NO ACTION',
34+
}, {
35+
onDelete: 'CASCADE',
36+
onUpdate: 'NO ACTION',
37+
table: 'user',
38+
column: 'id',
39+
}).should.be.true();
40+
41+
isKeyEqual({
42+
table: 'thing_table',
43+
column: ['one', 'two'],
44+
}, {
45+
table: 'thing_table',
46+
column: ['one', 'two'],
47+
}).should.be.true();
48+
49+
isKeyEqual({
50+
table: 'user',
51+
column: 'id',
52+
}, {
53+
table: 'user',
54+
column: 'id',
55+
undefCol: undefined,
56+
}).should.be.true();
57+
58+
isKeyEqual({
59+
table: 'user',
60+
column: 'id',
61+
randomVal: true,
62+
}, {
63+
table: 'user',
64+
column: 'id',
65+
}).should.be.true();
66+
67+
isKeyEqual('a', null).should.be.false();
68+
isKeyEqual(null, 'b').should.be.false();
69+
isKeyEqual('a', 'b').should.be.false();
70+
71+
isKeyEqual(['a'], null).should.be.false();
72+
isKeyEqual(null, ['b']).should.be.false();
73+
isKeyEqual(['a'], 'a').should.be.false();
74+
isKeyEqual('b', ['b']).should.be.false();
75+
isKeyEqual(['a'], ['b']).should.be.false();
76+
isKeyEqual(['a', 'b'], ['b']).should.be.false();
77+
isKeyEqual(['b'], ['a', 'b']).should.be.false();
78+
isKeyEqual(['a', 'b'], ['b', 'a']).should.be.false();
79+
isKeyEqual(['b', 'a'], ['a', 'b']).should.be.false();
80+
81+
isKeyEqual(
82+
{
83+
table: 'user',
84+
column: 'id',
85+
onDelete: 'CASCADE',
86+
},
87+
null
88+
).should.be.false();
89+
90+
isKeyEqual(
91+
null,
92+
{
93+
table: 'user',
94+
column: 'id',
95+
onDelete: 'CASCADE',
96+
}
97+
).should.be.false();
98+
99+
isKeyEqual(
100+
{
101+
table: 'user',
102+
column: 'id',
103+
onDelete: 'CASCADE',
104+
},
105+
'user.id'
106+
).should.be.false();
107+
108+
isKeyEqual(
109+
'user.id',
110+
{
111+
table: 'user',
112+
column: 'id',
113+
onDelete: 'CASCADE',
114+
}
115+
).should.be.false();
116+
117+
isKeyEqual({
118+
table: 'user',
119+
column: 'id',
120+
}, {
121+
table: 'person',
122+
column: 'id',
123+
}).should.be.false();
124+
125+
isKeyEqual({
126+
table: 'user',
127+
column: 'id',
128+
onDelete: 'CASCADE',
129+
}, {
130+
onDelete: 'RESTRICT',
131+
table: 'user',
132+
column: 'id',
133+
}).should.be.false();
134+
135+
isKeyEqual({
136+
table: 'user',
137+
column: 'id',
138+
onUpdate: 'CASCADE',
139+
}, {
140+
onUpdate: 'RESTRICT',
141+
table: 'user',
142+
column: 'id',
143+
}).should.be.false();
144+
145+
isKeyEqual({
146+
table: 'user',
147+
column: 'id',
148+
}, {
149+
table: 'user',
150+
column: 'name',
151+
}).should.be.false();
152+
153+
isKeyEqual({
154+
table: 'thing_table',
155+
column: 'id',
156+
}, {
157+
table: 'thing_table',
158+
column: ['one', 'two'],
159+
}).should.be.false();
160+
161+
isKeyEqual({
162+
table: 'thing_table',
163+
column: ['one', 'two'],
164+
}, {
165+
table: 'thing_table',
166+
column: 'id',
167+
}).should.be.false();
168+
169+
isKeyEqual({
170+
table: 'thing_table',
171+
column: ['one', 'two'],
172+
}, {
173+
table: 'thing_table',
174+
column: ['two', 'one'],
175+
}).should.be.false();
176+
177+
isKeyEqual({
178+
table: 'user',
179+
column: 'id',
180+
}, {
181+
table: 'user',
182+
}).should.be.false();
183+
184+
isKeyEqual({
185+
table: 'user',
186+
}, {
187+
table: 'user',
188+
column: 'id',
189+
}).should.be.false();
190+
191+
});
192+
193+
});

0 commit comments

Comments
 (0)