From 37c9d660265dcb4368a0b65f3c3aa97540231303 Mon Sep 17 00:00:00 2001 From: zichun Date: Fri, 29 May 2026 15:51:42 +0800 Subject: [PATCH] apply-ddl: drop dead env aliases + collapse dbEnvFromConfig two-hop --- lib/apply-ddl.mjs | 42 +++++++++++++----------------------------- lib/apply-ddl.test.mjs | 54 +++++++++++++----------------------------------------- 2 files changed, 26 insertions(+), 70 deletions(-) diff --git a/lib/apply-ddl.mjs b/lib/apply-ddl.mjs index bb556f6..71e06c8 100644 --- a/lib/apply-ddl.mjs +++ b/lib/apply-ddl.mjs @@ -1,24 +1,6 @@ import { parseYamlConfig } from './yaml-config.mjs' /** - * Flatten config-vars.yaml's `database:` section into the DB_* env-shape that - * resolveDbConfig consumes. Pure; tolerates a missing section. - * - * @param {Record} config parsed config-vars.yaml - * @returns {Record} - */ -export function dbEnvFromConfig(config) { - const db = (config && config.database) || {} - return { - DB_HOST: db.host, - DB_PORT: db.port != null ? String(db.port) : undefined, - DB_USER: db.user, - DB_PASSWORD: db.password, - DB_SCHEMA: db.schema, - } -} - -/** * Apply a DDL file to a MySQL database using mysql2/promise. * DB credentials are read from config-vars.yaml's `database:` section. * @@ -28,9 +10,9 @@ export function dbEnvFromConfig(config) { export async function applyDDL({ configPath, ddlPath }) { const { readFileSync } = await import('node:fs') - const env = dbEnvFromConfig(parseYamlConfig(readFileSync(configPath, 'utf8'))) + const config = parseYamlConfig(readFileSync(configPath, 'utf8')) const ddl = readFileSync(ddlPath, 'utf8') - const { host, port, user, password, database } = resolveDbConfig(env, configPath) + const { host, port, user, password, database } = resolveDbConfig(config, configPath) let mysql try { @@ -55,21 +37,23 @@ export async function applyDDL({ configPath, ddlPath }) { } /** - * Resolve mysql2 connection settings from a parsed env object. Pure (no I/O), - * so it is unit-testable without mysql2 installed. + * Resolve mysql2 connection settings from a parsed config-vars.yaml object, + * reading its `database:` section directly. Pure (no I/O), so it is + * unit-testable without mysql2 installed. * * Throws if no schema resolves — V1 has no USE/CREATE DATABASE. * - * @param {Record} env + * @param {Record} config parsed config-vars.yaml * @param {string} [cfgPath] only used to make the error message actionable * @returns {{host:string, port:number, user:string, password:string, database:string}} */ -export function resolveDbConfig(env, cfgPath = 'config-vars.yaml') { - const host = env.DB_HOST || env.MYSQL_HOST || '127.0.0.1' - const port = Number(env.DB_PORT || env.MYSQL_PORT || 3306) - const user = env.DB_USER || env.MYSQL_USER || 'root' - const password = env.DB_PASS || env.DB_PASSWORD || env.MYSQL_PASSWORD || '' - const database = env.DB_SCHEMA || env.DB_NAME || env.MYSQL_DATABASE || undefined +export function resolveDbConfig(config, cfgPath = 'config-vars.yaml') { + const db = (config && config.database) || {} + const host = db.host || '127.0.0.1' + const port = Number(db.port || 3306) + const user = db.user || 'root' + const password = db.password || '' + const database = db.schema || undefined if (!database) { throw new Error(`apply-ddl: 缺数据库名 — 请在 ${cfgPath} 的 database.schema 填写`) } diff --git a/lib/apply-ddl.test.mjs b/lib/apply-ddl.test.mjs index c7e816c..cd0e242 100644 --- a/lib/apply-ddl.test.mjs +++ b/lib/apply-ddl.test.mjs @@ -1,54 +1,26 @@ import { test } from 'node:test' import assert from 'node:assert/strict' -import { dbEnvFromConfig, resolveDbConfig } from './apply-ddl.mjs' +import { resolveDbConfig } from './apply-ddl.mjs' -// ── dbEnvFromConfig(config-vars.yaml database: → DB_* env-shape adapter)── -test('dbEnvFromConfig maps the database section to the DB_* shape', () => { - const env = dbEnvFromConfig({ - database: { host: 'db.local', port: 3307, user: 'u', password: 'p@ss', schema: 'erp_test' }, +// ── resolveDbConfig(直接读 config-vars.yaml 解析后的 database: 段)───────── +test('resolveDbConfig maps the database section to mysql2 settings', () => { + const c = resolveDbConfig({ + database: { host: 'db.local', port: '3307', user: 'u', password: 'p@ss', schema: 'erp_test' }, }) - assert.equal(env.DB_HOST, 'db.local') - assert.equal(env.DB_PORT, '3307') // coerced to string for resolveDbConfig - assert.equal(env.DB_USER, 'u') - assert.equal(env.DB_PASSWORD, 'p@ss') - assert.equal(env.DB_SCHEMA, 'erp_test') -}) - -test('dbEnvFromConfig tolerates a missing/empty config', () => { - assert.equal(dbEnvFromConfig({}).DB_HOST, undefined) - assert.equal(dbEnvFromConfig(null).DB_SCHEMA, undefined) -}) - -test('dbEnvFromConfig → resolveDbConfig round-trips a filled database section', () => { - const c = resolveDbConfig(dbEnvFromConfig({ database: { host: 'localhost', port: 3306, schema: 'erp_dev' } })) - assert.equal(c.host, 'localhost') - assert.equal(c.port, 3306) - assert.equal(c.database, 'erp_dev') -}) - -// ── resolveDbConfig(M1:DB_SCHEMA 是插件契约的 schema 键)───────── -test('resolveDbConfig maps DB_SCHEMA to database (plugin canonical key)', () => { - const c = resolveDbConfig({ DB_SCHEMA: 'erp_test', DB_USER: 'u', DB_PASS: 'p', DB_HOST: 'db.local', DB_PORT: '3307' }) - assert.equal(c.database, 'erp_test') assert.equal(c.host, 'db.local') assert.equal(c.port, 3307) assert.equal(c.user, 'u') - assert.equal(c.password, 'p') -}) - -test('resolveDbConfig honors DB_NAME / MYSQL_DATABASE aliases', () => { - assert.equal(resolveDbConfig({ DB_NAME: 'a' }).database, 'a') - assert.equal(resolveDbConfig({ MYSQL_DATABASE: 'b' }).database, 'b') - // DB_SCHEMA wins over aliases - assert.equal(resolveDbConfig({ DB_SCHEMA: 's', DB_NAME: 'a' }).database, 's') + assert.equal(c.password, 'p@ss') + assert.equal(c.database, 'erp_test') }) -test('resolveDbConfig fails closed when no schema key is present (M1)', () => { - assert.throws(() => resolveDbConfig({ DB_USER: 'root' }, 'config-vars.yaml'), /database\.schema/) +test('resolveDbConfig fails closed when database.schema is missing (M1)', () => { + assert.throws(() => resolveDbConfig({ database: { user: 'root' } }, 'config-vars.yaml'), /database\.schema/) + assert.throws(() => resolveDbConfig({}), /database\.schema/) }) test('resolveDbConfig applies sane defaults for host/port/user/password', () => { - const c = resolveDbConfig({ DB_SCHEMA: 's' }) + const c = resolveDbConfig({ database: { schema: 's' } }) assert.equal(c.host, '127.0.0.1') assert.equal(c.port, 3306) assert.equal(c.user, 'root') @@ -56,6 +28,6 @@ test('resolveDbConfig applies sane defaults for host/port/user/password', () => }) test('resolveDbConfig rejects invalid ports', () => { - assert.throws(() => resolveDbConfig({ DB_SCHEMA: 'erp_test', DB_PORT: 'abc' }), /database\.port/) - assert.throws(() => resolveDbConfig({ DB_SCHEMA: 'erp_test', DB_PORT: '70000' }), /database\.port/) + assert.throws(() => resolveDbConfig({ database: { schema: 'erp_test', port: 'abc' } }), /database\.port/) + assert.throws(() => resolveDbConfig({ database: { schema: 'erp_test', port: '70000' } }), /database\.port/) }) -- libgit2 0.22.2