default

Parse and serialize HomeBank XHB files.

Examples

Parse an XHB string and inspect its contents

import { assertEquals } from "@std/assert";
import { parse } from "@hertzg/xhb";

// deno-fmt-ignore
const xml = [
  '<?xml version="1.0"?>',
  '<homebank v="1.3" d="050204">',
  '<cur key="1" flags="0" iso="GBP" name="Pound Sterling" symb="£" syprf="1" dchar="." gchar="," frac="2" rate="0" mdate="0"/>',
  '<account key="1" pos="1" type="1" curr="1" name="Cheque Account" number="01548726554" bankname="Amiga Universal Bank" initial="76.219999999999999" minimum="-30.489999999999998" cheque1="8760951"/>',
  '<pay key="1" name="Amazon"/>',
  '<cat key="1" flags="1" name="Food"/>',
  '<tag key="1" name="groceries"/>',
  '<ope date="736968" amount="-42.5" account="1" paymode="1" payee="1" category="1" wording="Weekly shop" tags="groceries"/>',
  '</homebank>',
  '',
].join("\n");

const xhb = parse(xml);

assertEquals(xhb.versions.file, "1.3");
assertEquals(xhb.currencies.length, 1);
assertEquals(xhb.currencies[0].isoCode, "GBP");
assertEquals(xhb.accounts.length, 1);
assertEquals(xhb.accounts[0].name, "Cheque Account");
assertEquals(xhb.payees.length, 1);
assertEquals(xhb.payees[0].name, "Amazon");
assertEquals(xhb.operations.length, 1);
assertEquals(xhb.operations[0].amount, "-42.5");
assertEquals(xhb.operations[0].memo, "Weekly shop");
assertEquals(xhb.operations[0].tags, ["groceries"]);

Round-trip: parse then serialize produces identical output

import { assertEquals } from "@std/assert";
import { parse, serialize } from "@hertzg/xhb";

// deno-fmt-ignore
const xml = [
  '<?xml version="1.0"?>',
  '<homebank v="1.3" d="050204">',
  '<cur key="1" flags="0" iso="GBP" name="Pound Sterling" symb="£" syprf="1" dchar="." gchar="," frac="2" rate="0" mdate="0"/>',
  '<account key="1" pos="1" type="1" curr="1" name="Cheque Account" number="01548726554" bankname="Amiga Universal Bank" initial="76.219999999999999" minimum="-30.489999999999998" cheque1="8760951"/>',
  '</homebank>',
  '',
].join("\n");

const xhb = parse(xml);
const output = serialize(xhb);

assertEquals(output, xml);

Modify a parsed XHB and serialize it back

import { assertEquals } from "@std/assert";
import { parse, serialize } from "@hertzg/xhb";

// deno-fmt-ignore
const xml = [
  '<?xml version="1.0"?>',
  '<homebank v="1.3" d="050204">',
  '<pay key="1" name="Amazon"/>',
  '</homebank>',
  '',
].join("\n");

const xhb = parse(xml);
xhb.payees.push({ key: 2, name: "Grocery Store", payMode: 0, category: 0 });

const output = serialize(xhb);

assertEquals(output.includes('name="Grocery Store"'), true);
assertEquals(xhb.payees.length, 2);

Functions

f
parse(xml: string): XHB

Parses an XHB XML string into a typed XHB object.

f
serialize(
xhb: XHB,
options?: SerializeOptions
): string

Serializes an XHB object back into an XHB XML string.

Interfaces

I
Account

A bank account from the <account> element.

I
Archive

A scheduled / recurring transaction template from the <fav> element.

I
ArchiveSplit

A single entry within a split scheduled transaction.

I
Assign

An auto-assignment rule from the <asg> element.

I
Category

A transaction category from the <cat> element.

I
Currency

A currency definition from the <cur> element.

I
Operation

A financial transaction (operation) from the <ope> element.

I
OperationSplit

A single entry within a split transaction.

I
Payee

A transaction payee from the <pay> element.

I
Properties

Global file-level properties from the <properties> element.

I
SerializeOptions

Options for serialize.

I
Tag

A user-defined tag from the <tag> element.

I
Versions

XHB file and data format version information from the <homebank> root element.

I
XHB

A complete HomeBank XHB file represented as a typed object.

Type Aliases

T
gBoolean = number

Boolean stored as a number (0 or 1).

T
gCharP = string

Null-terminated string (C gchar *).

T
gDouble = string

Double-precision floating-point value stored as a string.

T
gInt = number

Signed 32-bit integer.

T
gShort = number

Signed 16-bit integer.

T
gUInt32 = number

Unsigned 32-bit integer.

T
gUShort = number

Unsigned 16-bit integer.

T
VolatileXHB = Pick<XHB, "versions"> & Partial<Omit<XHB, "versions">>

A partially-constructed XHB where only versions is required. Used during parsing when the full object is still being built.

Variables

v
ACCOUNT_FLAG_ADDED: number

Account was recently added (temporary flag).

v
ACCOUNT_FLAG_CHANGED: number

Account was recently changed (temporary flag).

v
ACCOUNT_FLAG_CLOSED: number

Account is closed.

v
ACCOUNT_FLAG_NOBUDGET: number

Exclude from budget.

v
ACCOUNT_FLAG_NOREPORT: number

Exclude from reports.

v
ACCOUNT_FLAG_NOSUMMAR: number

Exclude from summary.

v
ACCOUNT_TYPE_ASSET: 3

Asset account.

v
ACCOUNT_TYPE_BANK: 1

Bank account.

v
ACCOUNT_TYPE_CASH: 2

Cash account.

v
ACCOUNT_TYPE_CREDITCARD: 4

Credit card account.

v
ACCOUNT_TYPE_LIABILITY: 5

Liability (debt) account.

v
ACCOUNT_TYPE_NONE: 0

No account type.

v
ARCHIVE_FLAG_ADDED: number

Archive was recently added (temporary flag).

v
ARCHIVE_FLAG_AUTO: number

Archive is a scheduled (auto) transaction.

v
ARCHIVE_FLAG_CHANGED: number

Archive was recently changed (temporary flag).

v
ARCHIVE_FLAG_CHEQ2: number

Use second cheque book numbering.

v
ARCHIVE_FLAG_INCOME: number

Transaction is income.

v
ARCHIVE_FLAG_LIMIT: number

Scheduled transaction has a repeat limit.

v
ARCHIVE_FLAG_SPLIT: number

Transaction contains split entries.

v
ASSIGN_FIELD_MEMO: 0

Match against the memo field.

v
ASSIGN_FIELD_PAYEE: 1

Match against the payee name.

v
ASSIGN_FLAG_DOCAT: number

Assign category on match.

v
ASSIGN_FLAG_DOMOD: number

Assign payment mode on match.

v
ASSIGN_FLAG_DOPAY: number

Assign payee on match.

v
ASSIGN_FLAG_EXACT: number

Require exact match.

v
ASSIGN_FLAG_OVWCAT: number

Overwrite existing category.

v
ASSIGN_FLAG_OVWMOD: number

Overwrite existing payment mode.

v
ASSIGN_FLAG_OVWPAY: number

Overwrite existing payee.

v
ASSIGN_FLAG_REGEX: number

Pattern is a regular expression.

v
CATEGORY_FLAG_BUDGET: number

Category has budget amounts set.

v
CATEGORY_FLAG_CUSTOM: number

Category has been user-customized.

v
CATEGORY_FLAG_FORCED: number

Category budget is forced / overridden.

v
CATEGORY_FLAG_INCOME: number

Category represents income (vs expense).

v
CATEGORY_FLAG_SUB: number

Category is a subcategory.

v
CURRENCY_FLAG_CUSTOM: number

Currency has been user-customized.

v
OPERATION_FLAG_ADDED: number

Transaction was recently added (temporary flag).

v
OPERATION_FLAG_AUTO: number

Transaction was auto-generated from a schedule.

v
OPERATION_FLAG_CHANGED: number

Transaction was recently changed (temporary flag).

v
OPERATION_FLAG_CHEQ2: number

Use second cheque book numbering.

v
OPERATION_FLAG_INCOME: number

Transaction is income.

v
OPERATION_FLAG_LIMIT: number

Scheduled transaction has a repeat limit.

v
OPERATION_FLAG_SPLIT: number

Transaction contains split entries.

v
PAY_MODE_CCARD: 1

Credit card.

v
PAY_MODE_CHECK: 2

Check / cheque.

v
PAY_MODE_DCARD: 6

Debit card.

v
PAY_MODE_EPAYMENT: 8

Electronic payment.

v
PAY_MODE_FEE: 10

Fee / charge.

v
PAY_MODE_INTXFER: 5

Internal transfer between accounts.

v
PAY_MODE_NONE: 0

No payment mode.

v
PAY_MODE_NUM_MAX: 12

Total number of payment modes (upper bound sentinel).

v
PAY_MODE_REPEATPMT: 7

Repeating / standing order payment.

v
PAY_MODE_XFER: 4

Bank transfer.

v
SCHEDULED_EVERY_UNIT_DAY: 0

Repeat every N days.

v
SCHEDULED_EVERY_UNIT_MONTH: 2

Repeat every N months.

v
SCHEDULED_EVERY_UNIT_WEEK: 1

Repeat every N weeks.

v
SCHEDULED_EVERY_UNIT_YEAR: 3

Repeat every N years.

v
SCHEDULED_WEEKEND_AFTER: 2

Move to the Monday after if landing on a weekend.

v
SCHEDULED_WEEKEND_BEFORE: 1

Move to the Friday before if landing on a weekend.

v
SCHEDULED_WEEKEND_POSSIBLE: 0

Allow scheduling on weekends.

v
VEHICLE_SCHEDULED_TRANSACTION_MODE_NUMBER_OF_DAYS: 1

Vehicle scheduled transaction mode: repeat every N days.

v
VEHICLE_SCHEDULED_TRANSACTION_MODE_WEEKDAY: 0

Vehicle scheduled transaction mode: repeat on a specific weekday.

v
ACCOUNT_FLAG_OLDBUDGE: number

Legacy budget flag (pre-5.x).

v
ARCHIVE_FLAG_OLDREMIND: number

Legacy remind flag (pre-5.x).

v
ARCHIVE_FLAG_OLDVALID: number

Legacy valid flag (pre-5.x).

v
OPERATION_FLAG_OLDREMIND: number

Legacy remind flag (pre-5.x).

v
OPERATION_FLAG_OLDVALID: number

Legacy valid flag (pre-5.x).