neondb
Version:
create a claimable Neon database in seconds!
75 lines (72 loc) • 2.25 kB
JavaScript
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 };