mirror of
https://github.com/oven-sh/bun
synced 2026-02-14 21:01:52 +00:00
feat: Add comprehensive MySQL environment variable support
Added MySQL-specific environment variables with proper precedence: **New MySQL Environment Variables:** - `MYSQL_HOST` (defaults to `localhost`) - `MYSQL_PORT` (defaults to `3306`) - `MYSQL_USER` (with fallback to `$USER`) - `MYSQL_PASSWORD` (defaults to empty) - `MYSQL_DATABASE` (defaults to `mysql`) - `MYSQL_URL` (primary connection URL) - `TLS_MYSQL_DATABASE_URL` (SSL/TLS connection URL) **Enhanced TLS Support:** - Added `TLS_MYSQL_DATABASE_URL` for MySQL TLS connections - Enhanced `TLS_DATABASE_URL` to work with MySQL protocol detection - All TLS URLs automatically enable SSL mode **Environment Variable Precedence:** - MySQL-specific env vars (e.g., `$MYSQL_USER`) override generic ones (e.g., `$USER`) - Environment variable names override URL protocols for semantic intent - Proper URL precedence: `MYSQL_URL` > `DATABASE_URL` > `TLS_MYSQL_DATABASE_URL` > `TLS_DATABASE_URL` **Comprehensive Testing:** - 23 adapter precedence tests covering all MySQL env vars - Tests for TLS URL handling and protocol detection - Tests for env var name precedence over protocols - All existing tests (241 total) continue to pass This brings MySQL environment variable support in line with PostgreSQL, providing a complete and intuitive configuration experience. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
committed by
Ciro Spaciari
parent
1b023c5e5f
commit
8d71c5ea66
@@ -11,12 +11,20 @@ describe("SQL adapter environment variable precedence", () => {
|
||||
delete process.env.PGURL;
|
||||
delete process.env.PG_URL;
|
||||
delete process.env.MYSQL_URL;
|
||||
delete process.env.TLS_DATABASE_URL;
|
||||
delete process.env.TLS_POSTGRES_DATABASE_URL;
|
||||
delete process.env.TLS_MYSQL_DATABASE_URL;
|
||||
delete process.env.PGHOST;
|
||||
delete process.env.PGPORT;
|
||||
delete process.env.PGUSER;
|
||||
delete process.env.PGUSERNAME;
|
||||
delete process.env.PGPASSWORD;
|
||||
delete process.env.PGDATABASE;
|
||||
delete process.env.MYSQL_HOST;
|
||||
delete process.env.MYSQL_PORT;
|
||||
delete process.env.MYSQL_USER;
|
||||
delete process.env.MYSQL_PASSWORD;
|
||||
delete process.env.MYSQL_DATABASE;
|
||||
delete process.env.USER;
|
||||
delete process.env.USERNAME;
|
||||
}
|
||||
@@ -233,4 +241,64 @@ describe("SQL adapter environment variable precedence", () => {
|
||||
expect(options.options.port).toBe(5432);
|
||||
restoreEnv();
|
||||
});
|
||||
test("should use MySQL-specific environment variables", () => {
|
||||
cleanEnv();
|
||||
process.env.MYSQL_HOST = "mysql-server";
|
||||
process.env.MYSQL_PORT = "3307";
|
||||
process.env.MYSQL_USER = "admin";
|
||||
process.env.MYSQL_PASSWORD = "secret";
|
||||
process.env.MYSQL_DATABASE = "production";
|
||||
|
||||
const options = new SQL({ adapter: "mysql" });
|
||||
expect(options.options.adapter).toBe("mysql");
|
||||
expect(options.options.hostname).toBe("mysql-server");
|
||||
expect(options.options.port).toBe(3307);
|
||||
expect(options.options.username).toBe("admin");
|
||||
expect(options.options.password).toBe("secret");
|
||||
expect(options.options.database).toBe("production");
|
||||
restoreEnv();
|
||||
});
|
||||
|
||||
test("MySQL-specific env vars should take precedence over generic ones", () => {
|
||||
cleanEnv();
|
||||
process.env.USER = "generic-user";
|
||||
process.env.MYSQL_USER = "mysql-user";
|
||||
|
||||
const options = new SQL({ adapter: "mysql" });
|
||||
expect(options.options.username).toBe("mysql-user");
|
||||
restoreEnv();
|
||||
});
|
||||
|
||||
test("should infer mysql adapter from TLS_MYSQL_DATABASE_URL", () => {
|
||||
cleanEnv();
|
||||
process.env.TLS_MYSQL_DATABASE_URL = "mysql://user:pass@host:3306/db";
|
||||
|
||||
const options = new SQL();
|
||||
expect(options.options.adapter).toBe("mysql");
|
||||
expect(options.options.hostname).toBe("host");
|
||||
expect(options.options.port).toBe(3306);
|
||||
restoreEnv();
|
||||
});
|
||||
|
||||
test("should infer postgres adapter from TLS_POSTGRES_DATABASE_URL", () => {
|
||||
cleanEnv();
|
||||
process.env.TLS_POSTGRES_DATABASE_URL = "postgres://user:pass@host:5432/db";
|
||||
|
||||
const options = new SQL();
|
||||
expect(options.options.adapter).toBe("postgres");
|
||||
expect(options.options.hostname).toBe("host");
|
||||
expect(options.options.port).toBe(5432);
|
||||
restoreEnv();
|
||||
});
|
||||
|
||||
test("should infer adapter from TLS_DATABASE_URL using protocol", () => {
|
||||
cleanEnv();
|
||||
process.env.TLS_DATABASE_URL = "mysql://user:pass@host:3306/db";
|
||||
|
||||
const options = new SQL();
|
||||
expect(options.options.adapter).toBe("mysql");
|
||||
expect(options.options.hostname).toBe("host");
|
||||
expect(options.options.port).toBe(3306);
|
||||
restoreEnv();
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user