🎉 initial commit

This commit is contained in:
Robert Kunze
2026-01-12 17:44:56 +01:00
commit 7fb0512f65
8 changed files with 822 additions and 0 deletions

60
seed.ts Normal file
View File

@@ -0,0 +1,60 @@
import getfiles from "https://deno.land/x/getfiles@v1.0.0/mod.ts";
import postgres from "https://deno.land/x/postgresjs@v3.4.4/mod.js";
import { parse } from "https://deno.land/std/csv/mod.ts";
const seedDir = "./db/seeds/";
export default async function (args: string[]) {
const sql = postgres({
debug: (_, query) => console.log("Running query", query),
});
const files = getfiles(seedDir).filter((x) =>
x.name?.endsWith(".sql") || x.name?.endsWith(".ts") ||
x.name?.endsWith(".csv")
);
for (const file of files) {
if (
args.length <= 0 ||
args.includes(
file.name?.replace(/^.*?\/(.*?)\.(?:sql|ts|csv)$/g, "$1"),
)
) {
// identified a seed we are supposed to run
if (file.name?.endsWith(".csv")) {
const tables = Deno.readTextFileSync(file.realPath).split(/\r?\n\r?\n/);
for (const table of tables) {
const [table_name, ...table_data] = table.split(/\r?\n/);
const parsedData = parse(table_data.join("\r\n"), {
skipFirstRow: true,
separator: ",",
lazyQuotes: true,
});
await sql`TRUNCATE TABLE ${table_name}`;
await parsedData.reduce(async (accP, row) => {
const cols = Object.keys(row).join(", ");
await accP;
return await sql`INSERT INTO ${sql(table_name)} ${
sql(row, ...cols)
}`;
}, Promise.resolve([]));
}
} else if (file.name?.endsWith(".sql")) {
console.log("Seeding ", file.name.replace(/\.sql$/, ""));
const commands = Deno.readTextFileSync(file.realPath).split(/;/);
for (const command of commands) {
if (!command.trim()) continue;
const cmd = command;
await sql.unsafe(cmd);
}
} else if (file.name?.endsWith(".ts")) {
const mod = await import(file.realPath);
await mod(sql);
} else {
throw new Error("Unable to identify seed type: " + file.name);
}
}
}
}