longcelot-sheet-db
Version:
Google Sheets-backed staging database adapter for Node.js with schema-first design
48 lines • 2.52 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createDatabaseAdapter = createDatabaseAdapter;
const sheetAdapter_1 = require("./sheetAdapter");
const postgresAdapter_1 = require("./sql/postgresAdapter");
const mysqlAdapter_1 = require("./sql/mysqlAdapter");
const SchemaError_1 = require("../errors/SchemaError");
function sheetsConfigFromEnv() {
const clientId = process.env.GOOGLE_CLIENT_ID;
const clientSecret = process.env.GOOGLE_CLIENT_SECRET;
const redirectUri = process.env.GOOGLE_REDIRECT_URI;
const adminSheetId = process.env.ADMIN_SHEET_ID;
if (!clientId || !clientSecret || !redirectUri || !adminSheetId) {
throw new SchemaError_1.SchemaError("createDatabaseAdapter() with driver 'sheets' requires GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, " +
'GOOGLE_REDIRECT_URI, and ADMIN_SHEET_ID env vars (or pass `sheets: {...}` explicitly).');
}
let tokens = {};
if (process.env.SHEETS_TOKENS_JSON) {
try {
tokens = JSON.parse(process.env.SHEETS_TOKENS_JSON);
}
catch {
throw new SchemaError_1.SchemaError('SHEETS_TOKENS_JSON env var is not valid JSON.');
}
}
return { adminSheetId, credentials: { clientId, clientSecret, redirectUri }, tokens };
}
/**
* Single top-level factory: pick the storage engine via one config value (or one env var), not a
* different import per environment. This is simultaneously Phase 16.2's "single top-level
* factory" and Phase 16.7's "env-driven adapter selection" — a dev's `.env` points at
* `DB_DRIVER=sheets`, a CI/CD pipeline's env points at `DB_DRIVER=postgres` (+ `$DATABASE_URL`),
* with zero application code branching for those two tracks.
*/
function createDatabaseAdapter(config = {}) {
const driver = config.driver ?? process.env.DB_DRIVER ?? 'sheets';
switch (driver) {
case 'sheets':
return (0, sheetAdapter_1.createSheetAdapter)(config.sheets ?? sheetsConfigFromEnv());
case 'postgres':
return (0, postgresAdapter_1.createPostgresAdapter)(config.postgres ?? { connectionString: process.env.DATABASE_URL });
case 'mysql':
return (0, mysqlAdapter_1.createMySQLAdapter)(config.mysql ?? { connectionString: process.env.DATABASE_URL });
default:
throw new SchemaError_1.SchemaError(`Unknown DB_DRIVER '${String(driver)}'. Expected 'sheets' | 'postgres' | 'mysql'.`);
}
}
//# sourceMappingURL=createDatabaseAdapter.js.map