feat(stand,seed): reproducible demo data on both stands, make seed, smoke and prodlike
This commit is contained in:
1 parent
772047c0a1
commit
8b3f7e78a3
8 files changed
+3037
-1
No files matched your search
@@ -0,0 +1,74 @@
|
||||
import { parseArgs } from "node:util";
|
||||
import { type Api, createApi } from "./api.ts";
|
||||
import { createCalendar, HISTORY_MONTHS } from "./ledger.ts";
|
||||
import { seed } from "./seed.ts";
|
||||
import { wipe } from "./wipe.ts";
|
||||
|
||||
const MS_PER_SECOND = 1000;
|
||||
|
||||
const usage =
|
||||
"usage: bun scripts/seed/index.ts --base <url> --token-file <path> [--wipe]";
|
||||
|
||||
const summarize = async (api: Api) => {
|
||||
const calendar = createCalendar(new Date());
|
||||
const range = `start=${calendar.opening()}&end=${calendar.end(HISTORY_MONTHS)}`;
|
||||
const rows = [
|
||||
["asset accounts", "/accounts?type=asset"],
|
||||
["liabilities", "/accounts?type=liabilities"],
|
||||
["expense accounts", "/accounts?type=expense"],
|
||||
["revenue accounts", "/accounts?type=revenue"],
|
||||
["withdrawals", `/transactions?type=withdrawal&${range}`],
|
||||
["deposits", `/transactions?type=deposit&${range}`],
|
||||
["transfers", `/transactions?type=transfer&${range}`],
|
||||
["categories", "/categories"],
|
||||
["budgets", "/budgets"],
|
||||
["budget limits", `/budget-limits?${range}`],
|
||||
["available budgets", "/available-budgets"],
|
||||
["bills", "/bills"],
|
||||
["piggy banks", "/piggy-banks"],
|
||||
["object groups", "/object-groups"],
|
||||
["tags", "/tags"],
|
||||
["rule groups", "/rule-groups"],
|
||||
["rules", "/rules"],
|
||||
["recurrences", "/recurrences"],
|
||||
["webhooks", "/webhooks"],
|
||||
["attachments", "/attachments"],
|
||||
["transaction links", "/transaction-links"],
|
||||
["exchange rates", "/exchange-rates"],
|
||||
] as const;
|
||||
const totals = await Promise.all(rows.map(([, path]) => api.total(path)));
|
||||
console.log("summary:");
|
||||
for (const [index, [label]] of rows.entries()) {
|
||||
console.log(` ${label.padEnd(18)} ${totals[index]}`);
|
||||
}
|
||||
};
|
||||
|
||||
const main = async () => {
|
||||
const { values } = parseArgs({
|
||||
options: {
|
||||
base: { type: "string" },
|
||||
"token-file": { type: "string" },
|
||||
wipe: { default: false, type: "boolean" },
|
||||
},
|
||||
});
|
||||
const tokenFile = values["token-file"];
|
||||
if (!(values.base && tokenFile)) {
|
||||
throw new Error(usage);
|
||||
}
|
||||
const token = (await Bun.file(tokenFile).text()).trim();
|
||||
const api = createApi(values.base, token);
|
||||
const about = await api.json<{ data: { version: string } }>("GET", "/about");
|
||||
console.log(`Firefly III ${about.data.version} at ${values.base}`);
|
||||
const started = performance.now();
|
||||
console.log("wipe:");
|
||||
await wipe(api);
|
||||
if (!values.wipe) {
|
||||
console.log("seed:");
|
||||
await seed(api, new Date());
|
||||
await summarize(api);
|
||||
}
|
||||
const seconds = (performance.now() - started) / MS_PER_SECOND;
|
||||
console.log(`done in ${seconds.toFixed(1)}s`);
|
||||
};
|
||||
|
||||
await main();
|
||||
Reference in new issue
Block a user