UNPKG

neondb

Version:

create a claimable Neon database in seconds!

75 lines (72 loc) 2.25 kB
import { readFileSync, existsSync, mkdirSync, openSync, writeSync, closeSync } from 'node:fs'; import { dirname } from 'node:path'; import { log, outro } from '@clack/prompts'; import { parse } from 'dotenv'; import { messages } from '../texts.js'; function splitCommands(schema) { return schema.split(";").map((cmd) => cmd.trim()).filter(Boolean); } function validateSql(sql) { const openParens = (sql.match(/\(/g) || []).length; const closeParens = (sql.match(/\)/g) || []).length; if (openParens !== closeParens) { throw new Error("SQL has unbalanced parentheses"); } return sql; } function getSqlCommands(path) { try { const sql = validateSql(readFileSync(path, "utf8")); return splitCommands(sql); } catch (error) { log.error( error instanceof Error ? error.message : "Failed to read SQL file." ); process.exit(1); } } function getDotEnvContent(dotEnvFile) { if (!existsSync(dotEnvFile)) { log.info(messages.info.dotEnvFileNotFound); return {}; } try { const content = readFileSync(dotEnvFile); return parse(content); } catch { throw new Error(messages.errors.failedToParseEnvFile); } } function prepEnv(dotEnvFile, dotEnvKey) { try { const dotEnvContent = getDotEnvContent(dotEnvFile); if (dotEnvContent[dotEnvKey]) { log.warn(messages.errors.envKeyExists(dotEnvKey, dotEnvFile)); outro(messages.envKeyExistsExit); process.exit(0); } return; } catch (error) { if (error instanceof Error && error.message === messages.errors.failedToParseEnvFile) { console.error(error); log.error(messages.errors.invalidEnvFile); process.exit(1); } } } async function writeToEnv(dotEnvFile, dotEnvKey, claimExpiresAt, claimUrl, connString, poolerString) { if (!existsSync(dirname(dotEnvFile))) { mkdirSync(dirname(dotEnvFile), { recursive: true }); } const openedFile = openSync(dotEnvFile, "a"); writeSync( openedFile, `# Claimable DB expires at: ${claimExpiresAt.toUTCString()} # Claim it now to your account: ${claimUrl.href} ${dotEnvKey}=${connString} ${dotEnvKey}_POOLER=${poolerString} ` ); closeSync(openedFile); } export { getDotEnvContent, getSqlCommands, prepEnv, writeToEnv };