Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
141 changes: 55 additions & 86 deletions src/generators/configurations/generatePackageJson.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import {
} from '../../data';
import type { CreateConfiguration, PackageJson } from '../../types';
import { getPackageVersion } from '../../utils/getPackageVersion';
import { computeFlags } from '../project/computeFlags';
import { initTemplates } from '../db/dockerInitTemplates';
import { computeFlags } from '../project/computeFlags';

type CreatePackageJsonProps = Pick<
CreateConfiguration,
Expand All @@ -29,6 +29,31 @@ type CreatePackageJsonProps = Pick<
latest: boolean;
};

const dbScripts = {
cockroachdb: {
clientCmd: 'cockroach sql --insecure --database=database',
waitCmd: initTemplates.cockroachdb.wait
},
mariadb: {
clientCmd:
'MYSQL_PWD=userpassword mariadb -h127.0.0.1 -u user database',
waitCmd: initTemplates.mariadb.wait
},
mssql: {
clientCmd:
'/opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P SApassword1',
waitCmd: initTemplates.mssql.wait
},
mysql: {
clientCmd: 'MYSQL_PWD=userpassword mysql -h127.0.0.1 -u user database',
waitCmd: initTemplates.mysql.wait
},
postgresql: {
clientCmd: 'psql -h localhost -U user -d database',
waitCmd: initTemplates.postgresql.wait
}
} as const;
Comment thread
coderabbitai[bot] marked this conversation as resolved.

export const createPackageJson = ({
projectName,
authProvider,
Expand Down Expand Up @@ -163,107 +188,51 @@ export const createPackageJson = ({
typecheck: 'bun run tsc --noEmit'
};

if (
databaseEngine === 'postgresql' &&
(!databaseHost || databaseHost === 'none')
) {
scripts['db:up'] =
'sh -c "docker info >/dev/null 2>&1 || sudo service docker start; docker compose -p postgresql -f db/docker-compose.db.yml up -d db"';
scripts['db:down'] =
'docker compose -p postgresql -f db/docker-compose.db.yml down';
scripts['db:reset'] =
'docker compose -p postgresql -f db/docker-compose.db.yml down -v';
scripts['db:psql'] =
"docker compose -p postgresql -f db/docker-compose.db.yml exec db bash -lc 'until pg_isready -U user -h localhost --quiet; do sleep 1; done; exec psql -h localhost -U user -d database'";
scripts['predev'] = 'bun db:up';
scripts['predb:psql'] = 'bun db:up';
scripts['postdev'] = 'bun db:down';
scripts['postdb:psql'] = 'bun db:down';
}
const isLocal = !databaseHost || databaseHost === 'none';

if (
databaseEngine === 'cockroachdb' &&
(!databaseHost || databaseHost === 'none')
isLocal &&
databaseEngine !== undefined &&
databaseEngine !== 'none' &&
databaseEngine !== 'sqlite' &&
databaseEngine !== 'mongodb' &&
databaseEngine !== 'singlestore' && // TODO: Add support for singlestore
databaseEngine !== 'gel' // TODO: Add support for gel
) {
scripts['db:up'] =
'sh -c "docker info >/dev/null 2>&1 || sudo service docker start; docker compose -p cockroachdb -f db/docker-compose.db.yml up -d db"';
scripts['db:down'] =
'docker compose -p cockroachdb -f db/docker-compose.db.yml down';
scripts['db:reset'] =
'docker compose -p cockroachdb -f db/docker-compose.db.yml down -v';
scripts['db:cockroach'] =
"docker compose -p cockroachdb -f db/docker-compose.db.yml exec db bash -lc 'cockroach sql --insecure --database=database'";
scripts['predev'] = 'bun db:up';
scripts['predb:cockroach'] = 'bun db:up';
scripts['postdev'] = 'bun db:down';
scripts['postdb:cockroach'] = 'bun db:down';
}
const config = dbScripts[databaseEngine];
const dockerPrefix = `docker compose -p ${databaseEngine} -f db/docker-compose.db.yml`;

if ((databaseEngine === 'mysql' || databaseEngine === 'mariadb') && orm === 'drizzle') {
dependencies['mysql2'] = resolveVersion('mysql2', '3.14.2');
}
scripts['db:up'] = `${dockerPrefix} up -d db`;
scripts['postdb:up'] =
`${dockerPrefix} exec db bash -lc '${config.waitCmd}'`;
scripts['db:down'] = `${dockerPrefix} down`;
scripts['db:reset'] = `${dockerPrefix} down -v`;
scripts[`db:${databaseEngine}`] =
`${dockerPrefix} exec -it db bash -lc '${config.clientCmd}'`;

if (
databaseEngine === 'mysql' &&
(!databaseHost || databaseHost === 'none')
) {
scripts['db:up'] =
'sh -c "docker info >/dev/null 2>&1 || sudo service docker start; docker compose -p mysql -f db/docker-compose.db.yml up -d db"';
scripts['db:down'] =
'docker compose -p mysql -f db/docker-compose.db.yml down';
scripts['db:reset'] =
'docker compose -p mysql -f db/docker-compose.db.yml down -v';
scripts['db:mysql'] =
"docker compose -p mysql -f db/docker-compose.db.yml exec -e MYSQL_PWD=rootpassword db bash -lc 'until mysqladmin ping -h127.0.0.1 --silent; do sleep 1; done; exec mysql -h127.0.0.1 -uroot'";
scripts['predev'] = 'bun db:up';
scripts['predb:mysql'] = 'bun db:up';
scripts[`predb:${databaseEngine}`] = 'bun db:up';
scripts['postdev'] = 'bun db:down';
scripts['postdb:mysql'] = 'bun db:down';
scripts[`postdb:${databaseEngine}`] = 'bun db:down';
}

if (
databaseEngine === 'mariadb' &&
(!databaseHost || databaseHost === 'none')
isLocal &&
(databaseEngine === 'mysql' || databaseEngine === 'mariadb') &&
orm === 'drizzle'
) {
scripts['db:up'] =
'sh -c "docker info >/dev/null 2>&1 || sudo service docker start; docker compose -p mariadb -f db/docker-compose.db.yml up -d db"';
scripts['db:down'] =
'docker compose -p mariadb -f db/docker-compose.db.yml down';
scripts['db:reset'] =
'docker compose -p mariadb -f db/docker-compose.db.yml down -v';
scripts['db:mariadb'] =
"docker compose -p mariadb -f db/docker-compose.db.yml exec -e MYSQL_PWD=rootpassword db bash -lc 'until mariadb-admin ping -h127.0.0.1 --silent; do sleep 1; done; exec mariadb -h127.0.0.1 -uroot'";
scripts['predev'] = 'bun db:up';
scripts['predb:mariadb'] = 'bun db:up';
scripts['postdev'] = 'bun db:down';
scripts['postdb:mariadb'] = 'bun db:down';
dependencies['mysql2'] = resolveVersion('mysql2', '3.14.2');
}

if (
databaseEngine === 'mssql' &&
(!databaseHost || databaseHost === 'none')
) {
const { wait } = initTemplates.mssql;
if (isLocal && databaseEngine === 'mssql') {
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if this does not us drizzle doesnt that mean we can use the bun version of mssql

dependencies['mssql'] = resolveVersion('mssql', '12.1.0');
devDependencies['@types/mssql'] = resolveVersion('@types/mssql', '9.1.8');
scripts['db:up'] =
`sh -c "docker info >/dev/null 2>&1 || sudo service docker start; docker compose -p mssql -f db/docker-compose.db.yml up -d db && docker compose -p mssql -f db/docker-compose.db.yml exec db bash -lc \\"${wait}\\""`;
scripts['db:down'] =
'docker compose -p mssql -f db/docker-compose.db.yml down';
scripts['db:reset'] =
'docker compose -p mssql -f db/docker-compose.db.yml down -v';
scripts['db:mssql'] =
`docker compose -p mssql -f db/docker-compose.db.yml exec db bash -lc '/opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P SApassword1'`;
scripts['predev'] = 'bun db:up';
scripts['predb:mssql'] = 'bun db:up';
scripts['postdev'] = 'bun db:down';
scripts['postdb:mssql'] = 'bun db:down';
devDependencies['@types/mssql'] = resolveVersion(
'@types/mssql',
'9.1.8'
);
}

if (
databaseEngine === 'sqlite' &&
(!databaseHost || databaseHost === 'none')
) {
if (isLocal && databaseEngine === 'sqlite') {
scripts['db:sqlite'] = 'sqlite3 db/database.sqlite';
scripts['db:init'] = 'sqlite3 db/database.sqlite < db/init.sql';
}
Expand Down
2 changes: 1 addition & 1 deletion src/generators/db/dockerInitTemplates.ts
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ export const initTemplates = {
},
mssql: {
cli: '/opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P SApassword1 -Q',
wait: 'until /opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P SApassword1 -Q \'SELECT 1\' >/dev/null 2>&1; do sleep 1; done'
wait: 'until /opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P SApassword1 -Q "SELECT 1" >/dev/null 2>&1; do sleep 1; done'
},
mysql: {
cli: 'MYSQL_PWD=userpassword mysql -h127.0.0.1 -u user database -e',
Expand Down
43 changes: 24 additions & 19 deletions src/generators/db/generateDockerContainer.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,25 @@
import { DatabaseEngine } from '../../types';

const templates = {
interface DatabaseTemplate {
image: string;
port: string;
env: Record<string, string>;
volumePath: string;
command?: string;
}

const templates: Record<
Exclude<DatabaseEngine, 'none' | 'sqlite' | undefined>,
DatabaseTemplate
> = {
cockroachdb: {
command: 'start-single-node --insecure',
env: {
COCKROACH_DATABASE: 'database'
},
image: 'cockroachdb/cockroach:latest-v25.3',
port: '26257:26257',
volumePath: '/cockroach/cockroach-data',
command: 'start-single-node --insecure'
volumePath: '/cockroach/cockroach-data'
},
gel: {
env: {
Expand All @@ -18,8 +29,7 @@ const templates = {
},
image: 'gel:latest',
port: '4000:4000',
volumePath: '/var/lib/gel',
command: ''
volumePath: '/var/lib/gel'
},
mariadb: {
env: {
Expand All @@ -30,8 +40,7 @@ const templates = {
},
image: 'mariadb:11.4',
port: '3306:3306',
volumePath: '/var/lib/mysql',
command: ''
volumePath: '/var/lib/mysql'
},
mongodb: {
env: {
Expand All @@ -41,8 +50,7 @@ const templates = {
},
image: 'mongo:7.0',
port: '27017:27017',
volumePath: '/data/db',
command: ''
volumePath: '/data/db'
},
mssql: {
env: {
Expand All @@ -51,8 +59,7 @@ const templates = {
},
image: 'mcr.microsoft.com/mssql/server:2022-latest',
port: '1433:1433',
volumePath: '/var/opt/mssql',
command: ''
volumePath: '/var/opt/mssql'
},
mysql: {
env: {
Expand All @@ -63,8 +70,7 @@ const templates = {
},
image: 'mysql:8.0',
port: '3306:3306',
volumePath: '/var/lib/mysql',
command: ''
volumePath: '/var/lib/mysql'
},
postgresql: {
env: {
Expand All @@ -74,19 +80,17 @@ const templates = {
},
image: 'postgres:15',
port: '5432:5432',
volumePath: '/var/lib/postgresql/data',
command: ''
volumePath: '/var/lib/postgresql/data'
},
singlestore: {
env: {
ROOT_PASSWORD: 'password'
},
image: 'singlestore/cluster-in-a-box:latest',
port: '3306:3306',
volumePath: '/var/lib/memsql',
command: ''
volumePath: '/var/lib/memsql'
}
} as const;
};

export const generateDockerContainer = (databaseEngine: DatabaseEngine) => {
if (
Expand All @@ -100,6 +104,7 @@ export const generateDockerContainer = (databaseEngine: DatabaseEngine) => {
}

const { image, port, env, volumePath, command } = templates[databaseEngine];
const commandLines = command ? ` command: ${command}` : '';
const envLines = Object.entries(env)
.map(([key, value]) => ` ${key}: ${value}`)
.join('\n');
Expand All @@ -112,7 +117,7 @@ export const generateDockerContainer = (databaseEngine: DatabaseEngine) => {
${envLines}
ports:
- "${port}"
command: ${command}
${commandLines}
volumes:
- db_data:${volumePath}

Expand Down
26 changes: 16 additions & 10 deletions src/generators/db/generateDrizzleSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,14 @@ const DIALECTS = {
table: 'gelTable',
time: 'timestamp()'
},
mariadb: {
builders: ['json', 'mysqlTable', 'timestamp', 'varchar', 'int'],
json: 'json()',
pkg: 'mysql-core',
string: 'varchar({ length: 255 })',
table: 'mysqlTable',
time: 'timestamp()'
},
mysql: {
builders: ['json', 'mysqlTable', 'timestamp', 'varchar', 'int'],
json: 'json()',
Expand Down Expand Up @@ -40,14 +48,6 @@ const DIALECTS = {
string: 'text()',
table: 'sqliteTable',
time: "integer({ mode: 'timestamp' })"
},
mariadb: {
builders: ['json', 'mysqlTable', 'timestamp', 'varchar', 'int'],
json: 'json()',
pkg: 'mysql-core',
string: 'varchar({ length: 255 })',
table: 'mysqlTable',
time: 'timestamp()'
}
} as const;

Expand All @@ -64,7 +64,9 @@ export const generateDrizzleSchema = ({
}: GenerateSchemaProps) => {
const cfg = DIALECTS[databaseEngine];
const intBuilder =
databaseEngine === 'mysql' || databaseEngine === 'singlestore' || databaseEngine === 'mariadb'
databaseEngine === 'mysql' ||
databaseEngine === 'singlestore' ||
databaseEngine === 'mariadb'
? 'int'
: 'integer';
const timeBuilder = builder(cfg.time);
Expand All @@ -86,7 +88,11 @@ export const generateDrizzleSchema = ({
: '';

let uidColumn: string;
if (databaseEngine === 'mysql' || databaseEngine === 'singlestore' || databaseEngine === 'mariadb') {
if (
databaseEngine === 'mysql' ||
databaseEngine === 'singlestore' ||
databaseEngine === 'mariadb'
) {
uidColumn = `${intBuilder}('uid').primaryKey().autoincrement()`;
} else if (databaseEngine === 'sqlite') {
uidColumn = `integer('uid').primaryKey({ autoIncrement: true })`;
Expand Down
16 changes: 8 additions & 8 deletions src/generators/db/handlerTemplates.ts
Original file line number Diff line number Diff line change
Expand Up @@ -324,19 +324,19 @@ const driverConfigurations = {
importLines: `import { GelClient } from 'gel'`,
queries: gelSqlQueryOperations
},
'mariadb:drizzle:local': {
dbType: 'MySql2Database<SchemaType>',
importLines: `
import { eq } from 'drizzle-orm'
import { MySql2Database } from 'drizzle-orm/mysql2'
import { schema, type SchemaType } from '../../../db/schema'`,
queries: mysqlDrizzleQueryOperations
},
'mariadb:sql:local': {
dbType: 'SQL',
importLines: `import { SQL } from 'bun'`,
queries: mysqlSqlQueryOperations
},
'mariadb:drizzle:local': {
dbType: 'MySql2Database<SchemaType>',
importLines: `
import { eq } from 'drizzle-orm'
import { MySql2Database } from 'drizzle-orm/mysql2'
import { schema, type SchemaType } from '../../../db/schema'`,
queries: mysqlDrizzleQueryOperations
},
'mongodb:native:local': {
dbType: 'Db',
importLines: `import { Db } from 'mongodb'`,
Expand Down
Loading