From 7ed9a04b2f6e0f7f34c11b430b77506a24db0d7d Mon Sep 17 00:00:00 2001 From: Victor Korzunin Date: Sat, 21 Aug 2021 11:12:49 +0200 Subject: [PATCH] fix(sequelize): no need to parse db url, sequelize accepts it --- .plop/index.ts.hbs | 13 +++---- .plop/plopfile.js | 5 --- .plop/utils/index.ts.hbs | 1 - .plop/utils/parseDatabaseUrl.ts.hbs | 51 ------------------------- prisma/models/index.ts | 13 +++---- prisma/models/utils/index.ts | 1 - prisma/models/utils/parseDatabaseUrl.ts | 51 ------------------------- 7 files changed, 12 insertions(+), 123 deletions(-) delete mode 100644 .plop/utils/parseDatabaseUrl.ts.hbs delete mode 100644 prisma/models/utils/parseDatabaseUrl.ts diff --git a/.plop/index.ts.hbs b/.plop/index.ts.hbs index cd0a7a2..4bf8a51 100644 --- a/.plop/index.ts.hbs +++ b/.plop/index.ts.hbs @@ -1,7 +1,7 @@ import { ModelCtor, Sequelize } from 'sequelize'; import { tryLoadEnvs } from '@prisma/sdk'; import path from 'path'; -import { findSync, parseDatabaseUrl } from './utils'; +import { findSync } from './utils'; const dirname = findSync(process.cwd(), ['{{relativeOutputDir}}', '{{slsRelativeOutputDir}}'], ['d'], ['d'], 1)[0] || __dirname; @@ -15,18 +15,17 @@ const loadedEnv = tryLoadEnvs({ rootEnvPath: config.relativeEnvPaths.rootEnvPath && path.resolve(dirname, config.relativeEnvPaths.rootEnvPath), schemaEnvPath: config.relativeEnvPaths.schemaEnvPath && path.resolve(dirname, config.relativeEnvPaths.schemaEnvPath), }); -const env = loadedEnv ? loadedEnv.parsed : {}; +const env = { ...(loadedEnv ? loadedEnv.parsed : {}), ...process.env }; const databaseUrl = config.datasource.url.fromEnvVar ? env[config.datasource.url.fromEnvVar] : config.datasource.url.value; -const { driver, user, password, host, port, database } = parseDatabaseUrl(databaseUrl); export const createInstance = async () => { - const sequelize = new Sequelize(database, user, password, { - host, - port, + const sequelize = new Sequelize(databaseUrl, { ssl: true, - dialect: driver, + define: { + freezeTableName: true, + }, }); const models = { diff --git a/.plop/plopfile.js b/.plop/plopfile.js index d843f09..7404dd8 100644 --- a/.plop/plopfile.js +++ b/.plop/plopfile.js @@ -8,11 +8,6 @@ module.exports = function (plop) { path: 'utils/find.ts', templateFile: path.join(__dirname, './utils/find.ts.hbs'), }, - { - type: 'add', - path: 'utils/parseDatabaseUrl.ts', - templateFile: path.join(__dirname, './utils/parseDatabaseUrl.ts.hbs'), - }, { type: 'add', path: 'utils/index.ts', diff --git a/.plop/utils/index.ts.hbs b/.plop/utils/index.ts.hbs index c30c943..833bbb3 100644 --- a/.plop/utils/index.ts.hbs +++ b/.plop/utils/index.ts.hbs @@ -1,2 +1 @@ export * from './find'; -export * from './parseDatabaseUrl'; diff --git a/.plop/utils/parseDatabaseUrl.ts.hbs b/.plop/utils/parseDatabaseUrl.ts.hbs deleted file mode 100644 index f6cf07b..0000000 --- a/.plop/utils/parseDatabaseUrl.ts.hbs +++ /dev/null @@ -1,51 +0,0 @@ -import url from 'url'; -import querystring from 'querystring'; - -export function parseDatabaseUrl(databaseUrl: string) { - const parsedUrl = url.parse(databaseUrl, false, true); - - // Query parameters end up directly in the configuration. - const config = querystring.parse(parsedUrl.query); - - config.driver = (parsedUrl.protocol || 'sqlite3:') - // The protocol coming from url.parse() has a trailing : - .replace(/\:$/, ''); - - // Cloud Foundry will sometimes set a 'mysql2' scheme instead of 'mysql'. - if (config.driver == 'mysql2') config.driver = 'mysql'; - - // url.parse() produces an "auth" that looks like "user:password". No - // individual fields, unfortunately. - if (parsedUrl.auth) { - const userPassword = parsedUrl.auth.split(':', 2); - config.user = userPassword[0]; - if (userPassword.length > 1) { - config.password = userPassword[1]; - } - } - - if (config.driver === 'sqlite3') { - if (parsedUrl.hostname) { - if (parsedUrl.pathname) { - // Relative path. - config.filename = parsedUrl.hostname + parsedUrl.pathname; - } else { - // Just a filename. - config.filename = parsedUrl.hostname; - } - } else { - // Absolute path. - config.filename = parsedUrl.pathname; - } - } else { - // Some drivers (e.g., redis) don't have database names. - if (parsedUrl.pathname) { - config.database = parsedUrl.pathname.replace(/^\//, '').replace(/\/$/, ''); - } - - if (parsedUrl.hostname) config.host = parsedUrl.hostname; - if (parsedUrl.port) config.port = parsedUrl.port; - } - - return config; -} diff --git a/prisma/models/index.ts b/prisma/models/index.ts index 8769af8..162fbaf 100644 --- a/prisma/models/index.ts +++ b/prisma/models/index.ts @@ -1,7 +1,7 @@ import { ModelCtor, Sequelize } from 'sequelize'; import { tryLoadEnvs } from '@prisma/sdk'; import path from 'path'; -import { findSync, parseDatabaseUrl } from './utils'; +import { findSync } from './utils'; const dirname = findSync(process.cwd(), ['prisma/models', 'models'], ['d'], ['d'], 1)[0] || __dirname; @@ -42,18 +42,17 @@ const loadedEnv = tryLoadEnvs({ rootEnvPath: config.relativeEnvPaths.rootEnvPath && path.resolve(dirname, config.relativeEnvPaths.rootEnvPath), schemaEnvPath: config.relativeEnvPaths.schemaEnvPath && path.resolve(dirname, config.relativeEnvPaths.schemaEnvPath), }); -const env = loadedEnv ? loadedEnv.parsed : {}; +const env = { ...(loadedEnv ? loadedEnv.parsed : {}), ...process.env }; const databaseUrl = config.datasource.url.fromEnvVar ? env[config.datasource.url.fromEnvVar] : config.datasource.url.value; -const { driver, user, password, host, port, database } = parseDatabaseUrl(databaseUrl); export const createInstance = async () => { - const sequelize = new Sequelize(database, user, password, { - host, - port, + const sequelize = new Sequelize(databaseUrl, { ssl: true, - dialect: driver, + define: { + freezeTableName: true, + }, }); const models = { diff --git a/prisma/models/utils/index.ts b/prisma/models/utils/index.ts index c30c943..833bbb3 100644 --- a/prisma/models/utils/index.ts +++ b/prisma/models/utils/index.ts @@ -1,2 +1 @@ export * from './find'; -export * from './parseDatabaseUrl'; diff --git a/prisma/models/utils/parseDatabaseUrl.ts b/prisma/models/utils/parseDatabaseUrl.ts deleted file mode 100644 index f6cf07b..0000000 --- a/prisma/models/utils/parseDatabaseUrl.ts +++ /dev/null @@ -1,51 +0,0 @@ -import url from 'url'; -import querystring from 'querystring'; - -export function parseDatabaseUrl(databaseUrl: string) { - const parsedUrl = url.parse(databaseUrl, false, true); - - // Query parameters end up directly in the configuration. - const config = querystring.parse(parsedUrl.query); - - config.driver = (parsedUrl.protocol || 'sqlite3:') - // The protocol coming from url.parse() has a trailing : - .replace(/\:$/, ''); - - // Cloud Foundry will sometimes set a 'mysql2' scheme instead of 'mysql'. - if (config.driver == 'mysql2') config.driver = 'mysql'; - - // url.parse() produces an "auth" that looks like "user:password". No - // individual fields, unfortunately. - if (parsedUrl.auth) { - const userPassword = parsedUrl.auth.split(':', 2); - config.user = userPassword[0]; - if (userPassword.length > 1) { - config.password = userPassword[1]; - } - } - - if (config.driver === 'sqlite3') { - if (parsedUrl.hostname) { - if (parsedUrl.pathname) { - // Relative path. - config.filename = parsedUrl.hostname + parsedUrl.pathname; - } else { - // Just a filename. - config.filename = parsedUrl.hostname; - } - } else { - // Absolute path. - config.filename = parsedUrl.pathname; - } - } else { - // Some drivers (e.g., redis) don't have database names. - if (parsedUrl.pathname) { - config.database = parsedUrl.pathname.replace(/^\//, '').replace(/\/$/, ''); - } - - if (parsedUrl.hostname) config.host = parsedUrl.hostname; - if (parsedUrl.port) config.port = parsedUrl.port; - } - - return config; -}