Skip to content

Commit 44450e7

Browse files
committed
feat(#4): start of mysql support, errors at sql arrays
1 parent 41921e6 commit 44450e7

File tree

6 files changed

+152
-4
lines changed

6 files changed

+152
-4
lines changed

.github/workflows/main.yml

+14
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,15 @@ jobs:
2626
ports:
2727
- 5432/tcp
2828
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
29+
mysql:
30+
image: mysql:8
31+
env:
32+
MYSQL_USER: mysql
33+
MYSQL_PASSWORD: mysql
34+
MYSQL_DATABASE: mysql
35+
MYSQL_RANDOM_ROOT_PASSWORD: yes
36+
ports:
37+
- 3306/tcp
2938

3039
steps:
3140
- uses: actions/checkout@v2
@@ -43,6 +52,11 @@ jobs:
4352
POSTGRES_DB: postgres
4453
POSTGRES_HOST: localhost
4554
POSTGRES_PORT: ${{ job.services.postgres.ports[5432] }}
55+
MYSQL_USER: mysql
56+
MYSQL_PASSWORD: mysql
57+
MYSQL_DATABASE: mysql
58+
MYSQL_HOST: localhost
59+
MYSQL_PORT: ${{ job.services.mysql.ports[3306] }}
4660

4761
- uses: codecov/codecov-action@v1
4862
if: ${{ matrix.os == 'ubuntu-latest' && matrix.node-version == '14.x' }}

germinator-cli/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
"debug": "4",
4141
"knex": "0.21",
4242
"lodash.debounce": "4",
43+
"mysql2": "2",
4344
"pg": "8",
4445
"yargs": "16"
4546
},

germinator-cli/src/index.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ const cliOptions = {
7474
client: {
7575
alias: 'c',
7676
type: 'string',
77-
choices: ['postgres', 'sqlite3'],
77+
choices: ['postgres', 'mysql', 'sqlite3'],
7878
description: 'What kind of database to connect to',
7979
},
8080
hostname: {
@@ -132,10 +132,18 @@ function runSeedsOptions(opts: {
132132
opts.client = 'sqlite3';
133133
}
134134

135+
if (opts.client === 'mysql') {
136+
opts.client = 'mysql2';
137+
}
138+
135139
if (opts.client === 'postgres' && !opts.port) {
136140
opts.port = 5432;
137141
}
138142

143+
if (opts.client === 'mysql2' && !opts.port) {
144+
opts.port = 3306;
145+
}
146+
139147
switch (opts.client) {
140148
case undefined:
141149
throw new GerminatorError('database client is required');

germinator-core/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
"@types/object-hash": "1",
5454
"@types/to-snake-case": "1",
5555
"knex": "0.21",
56+
"mysql2": "2",
5657
"pg": "8",
5758
"sqlite3": "5"
5859
},

germinator-core/src/test-util.ts

+48-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export function connect({
88
client,
99
}: {
1010
config: StaticConnectionConfig;
11-
client: 'sqlite3' | 'postgresql';
11+
client: 'sqlite3' | 'postgresql' | 'mysql2';
1212
}) {
1313
return setupDatabase(
1414
Knex({
@@ -40,9 +40,11 @@ export const withSqlite = async (callback: (kx: Knex) => Promise<void>) => {
4040
};
4141

4242
let psqlConnection: Promise<Knex> | undefined;
43+
let mysqlConnection: Promise<Knex> | undefined;
4344

4445
afterAll(() => {
4546
psqlConnection?.then((kx) => kx.destroy()).catch(() => {});
47+
mysqlConnection?.then((kx) => kx.destroy()).catch(() => {});
4648
});
4749

4850
export const postgresTest = (name: string, callback: (kx: Knex) => Promise<void>): void => {
@@ -75,22 +77,66 @@ export const postgresTest = (name: string, callback: (kx: Knex) => Promise<void>
7577
console.log(`Running tests against postgres instance on port ${port}`);
7678

7779
psqlConnection = connect({
80+
client: 'postgresql',
7881
config: {
7982
user,
8083
password,
8184
database,
8285
host,
8386
port: Number(port),
8487
},
85-
client: 'postgresql',
8688
});
8789

8890
postgresTest(name, callback);
8991
};
9092

93+
export const mysqlTest = (name: string, callback: (kx: Knex) => Promise<void>): void => {
94+
if (mysqlConnection) {
95+
test(name, async () => {
96+
const kx = await mysqlConnection!;
97+
98+
await kx
99+
.transaction((trx) => callback(trx).then(() => trx.rollback()))
100+
.catch((err: Error) => {
101+
if (err.message !== 'Transaction rejected with non-error: undefined') {
102+
throw err;
103+
}
104+
});
105+
});
106+
107+
return;
108+
}
109+
110+
const user = process.env.MYSQL_USER;
111+
const password = process.env.MYSQL_PASSWORD;
112+
const database = process.env.MYSQL_DATABASE;
113+
const host = process.env.MYSQL_HOST;
114+
const port = process.env.MYSQL_PORT;
115+
116+
if (!user || !password || !database || !host || !port) {
117+
return;
118+
}
119+
120+
console.log(`Running tests against mysql instance on port ${port}`);
121+
122+
mysqlConnection = connect({
123+
client: 'mysql2',
124+
config: {
125+
user,
126+
password,
127+
database,
128+
host,
129+
port: Number(port),
130+
},
131+
});
132+
133+
mysqlTest(name, callback);
134+
};
135+
91136
export const anyDbTest = (name: string, callback: (kx: Knex, client: string) => Promise<void>) => {
92137
describe(name, () => {
93138
postgresTest('postgres', (kx) => callback(kx, 'postgres'));
139+
mysqlTest('mysql', (kx) => callback(kx, 'mysql'));
94140
test('sqlite', () => withSqlite((kx) => callback(kx, 'sqlite')));
95141
});
96142
};

yarn.lock

+79-1
Original file line numberDiff line numberDiff line change
@@ -2172,6 +2172,11 @@ delegates@^1.0.0:
21722172
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
21732173
integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
21742174

2175+
denque@^1.4.1:
2176+
version "1.5.0"
2177+
resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.0.tgz#773de0686ff2d8ec2ff92914316a47b73b1c73de"
2178+
integrity sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==
2179+
21752180
detect-file@^1.0.0:
21762181
version "1.0.0"
21772182
resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
@@ -2925,6 +2930,13 @@ gauge@~2.7.3:
29252930
strip-ansi "^3.0.1"
29262931
wide-align "^1.1.0"
29272932

2933+
generate-function@^2.3.1:
2934+
version "2.3.1"
2935+
resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f"
2936+
integrity sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==
2937+
dependencies:
2938+
is-property "^1.0.2"
2939+
29282940
gensync@^1.0.0-beta.1:
29292941
version "1.0.0-beta.2"
29302942
resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
@@ -3348,6 +3360,13 @@ iconv-lite@0.4.24, iconv-lite@^0.4.4:
33483360
dependencies:
33493361
safer-buffer ">= 2.1.2 < 3"
33503362

3363+
iconv-lite@^0.6.2:
3364+
version "0.6.2"
3365+
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01"
3366+
integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==
3367+
dependencies:
3368+
safer-buffer ">= 2.1.2 < 3.0.0"
3369+
33513370
ignore-walk@^3.0.1:
33523371
version "3.0.3"
33533372
resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37"
@@ -3644,6 +3663,11 @@ is-potential-custom-element-name@^1.0.0:
36443663
resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397"
36453664
integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c=
36463665

3666+
is-property@^1.0.2:
3667+
version "1.0.2"
3668+
resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
3669+
integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=
3670+
36473671
is-regex@^1.1.1:
36483672
version "1.1.1"
36493673
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9"
@@ -4526,13 +4550,26 @@ logging-helpers@^1.0.0:
45264550
isobject "^3.0.0"
45274551
log-utils "^0.2.1"
45284552

4553+
long@^4.0.0:
4554+
version "4.0.0"
4555+
resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"
4556+
integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==
4557+
45294558
loose-envify@^1.4.0:
45304559
version "1.4.0"
45314560
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
45324561
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
45334562
dependencies:
45344563
js-tokens "^3.0.0 || ^4.0.0"
45354564

4565+
lru-cache@^4.1.3:
4566+
version "4.1.5"
4567+
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
4568+
integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
4569+
dependencies:
4570+
pseudomap "^1.0.2"
4571+
yallist "^2.1.2"
4572+
45364573
lru-cache@^6.0.0:
45374574
version "6.0.0"
45384575
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
@@ -4740,6 +4777,27 @@ ms@^2.1.1:
47404777
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
47414778
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
47424779

4780+
mysql2@2:
4781+
version "2.2.5"
4782+
resolved "https://registry.yarnpkg.com/mysql2/-/mysql2-2.2.5.tgz#72624ffb4816f80f96b9c97fedd8c00935f9f340"
4783+
integrity sha512-XRqPNxcZTpmFdXbJqb+/CtYVLCx14x1RTeNMD4954L331APu75IC74GDqnZMEt1kwaXy6TySo55rF2F3YJS78g==
4784+
dependencies:
4785+
denque "^1.4.1"
4786+
generate-function "^2.3.1"
4787+
iconv-lite "^0.6.2"
4788+
long "^4.0.0"
4789+
lru-cache "^6.0.0"
4790+
named-placeholders "^1.1.2"
4791+
seq-queue "^0.0.5"
4792+
sqlstring "^2.3.2"
4793+
4794+
named-placeholders@^1.1.2:
4795+
version "1.1.2"
4796+
resolved "https://registry.yarnpkg.com/named-placeholders/-/named-placeholders-1.1.2.tgz#ceb1fbff50b6b33492b5cf214ccf5e39cef3d0e8"
4797+
integrity sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==
4798+
dependencies:
4799+
lru-cache "^4.1.3"
4800+
47434801
nanomatch@^1.2.9:
47444802
version "1.2.13"
47454803
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
@@ -5490,6 +5548,11 @@ prop-types@^15.7.2:
54905548
object-assign "^4.1.1"
54915549
react-is "^16.8.1"
54925550

5551+
pseudomap@^1.0.2:
5552+
version "1.0.2"
5553+
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
5554+
integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
5555+
54935556
psl@^1.1.28:
54945557
version "1.8.0"
54955558
resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
@@ -5822,7 +5885,7 @@ safe-regex@^1.1.0:
58225885
dependencies:
58235886
ret "~0.1.10"
58245887

5825-
"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
5888+
"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
58265889
version "2.1.2"
58275890
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
58285891
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
@@ -5896,6 +5959,11 @@ semver@~5.3.0:
58965959
resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
58975960
integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8=
58985961

5962+
seq-queue@^0.0.5:
5963+
version "0.0.5"
5964+
resolved "https://registry.yarnpkg.com/seq-queue/-/seq-queue-0.0.5.tgz#d56812e1c017a6e4e7c3e3a37a1da6d78dd3c93e"
5965+
integrity sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=
5966+
58995967
set-blocking@^2.0.0, set-blocking@~2.0.0:
59005968
version "2.0.0"
59015969
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
@@ -6111,6 +6179,11 @@ sqlite3@5:
61116179
optionalDependencies:
61126180
node-gyp "3.x"
61136181

6182+
sqlstring@^2.3.2:
6183+
version "2.3.2"
6184+
resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.2.tgz#cdae7169389a1375b18e885f2e60b3e460809514"
6185+
integrity sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==
6186+
61146187
sshpk@^1.7.0:
61156188
version "1.16.1"
61166189
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
@@ -6909,6 +6982,11 @@ y18n@^5.0.5:
69096982
resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18"
69106983
integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==
69116984

6985+
yallist@^2.1.2:
6986+
version "2.1.2"
6987+
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
6988+
integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
6989+
69126990
yallist@^3.0.0, yallist@^3.0.3:
69136991
version "3.1.1"
69146992
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"

0 commit comments

Comments
 (0)