@f-o-t/ofx 2.4.2 → 2.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,15 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils.ts", "../src/extractors.ts", "../src/generator.ts", "../src/schemas.ts", "../src/parser.ts", "../src/stream.ts"],
4
+ "sourcesContent": [
5
+ "export const toInt = (val: string): number => Number.parseInt(val, 10);\n\nexport const toFloat = (val: string): number => Number.parseFloat(val);\n\nexport const toArray = <T>(value: T | T[]): T[] =>\n Array.isArray(value) ? value : [value];\n\nexport const ENTITY_MAP: Record<string, string> = {\n \"&amp;\": \"&\",\n \"&apos;\": \"'\",\n \"&gt;\": \">\",\n \"&lt;\": \"<\",\n \"&quot;\": '\"',\n};\n\nexport const ENTITY_REGEX = /&(?:amp|lt|gt|quot|apos);/g;\n\nexport function decodeEntities(text: string): string {\n if (!text.includes(\"&\")) return text;\n return text.replace(ENTITY_REGEX, (match) => ENTITY_MAP[match] ?? match);\n}\n\nexport const pad = (n: number, width = 2): string =>\n n.toString().padStart(width, \"0\");\n\nexport function escapeOfxText(text: string): string {\n if (!text.includes(\"&\") && !text.includes(\"<\") && !text.includes(\">\")) {\n return text;\n }\n return text.replace(/[&<>]/g, (c) =>\n c === \"&\" ? \"&amp;\" : c === \"<\" ? \"&lt;\" : \"&gt;\",\n );\n}\n\n/**\n * Format amount for OFX output.\n * Uses string-based formatting to avoid floating-point precision issues.\n */\nexport function formatAmount(amount: number): string {\n // Use string manipulation to avoid floating-point precision issues\n const rounded = Math.round(amount * 100) / 100;\n const [intPart, decPart = \"\"] = rounded.toString().split(\".\");\n return `${intPart}.${decPart.padEnd(2, \"0\").slice(0, 2)}`;\n}\n\nexport function formatOfxDate(\n date: Date,\n timezone?: { offset: number; name: string },\n): string {\n const tz = timezone ?? { name: \"GMT\", offset: 0 };\n const offsetMs = tz.offset * 60 * 60 * 1000;\n const adjustedDate = new Date(date.getTime() + offsetMs);\n\n const year = adjustedDate.getUTCFullYear();\n const month = pad(adjustedDate.getUTCMonth() + 1);\n const day = pad(adjustedDate.getUTCDate());\n const hour = pad(adjustedDate.getUTCHours());\n const minute = pad(adjustedDate.getUTCMinutes());\n const second = pad(adjustedDate.getUTCSeconds());\n\n const sign = tz.offset >= 0 ? \"+\" : \"\";\n return `${year}${month}${day}${hour}${minute}${second}[${sign}${tz.offset}:${tz.name}]`;\n}\n",
6
+ "import type {\n OFXBalance,\n OFXBankAccount,\n OFXCreditCardAccount,\n OFXDocument,\n OFXSignOnResponse,\n OFXTransaction,\n} from \"./schemas\";\nimport { toArray } from \"./utils\";\n\nexport interface BalanceInfo {\n ledger?: OFXBalance;\n available?: OFXBalance;\n}\n\nexport function getTransactions(document: OFXDocument): OFXTransaction[] {\n const results: OFXTransaction[] = [];\n\n const bankResponse = document.OFX.BANKMSGSRSV1?.STMTTRNRS;\n if (bankResponse) {\n for (const r of toArray(bankResponse)) {\n const txns = r.STMTRS?.BANKTRANLIST?.STMTTRN;\n if (txns) results.push(...txns);\n }\n }\n\n const ccResponse = document.OFX.CREDITCARDMSGSRSV1?.CCSTMTTRNRS;\n if (ccResponse) {\n for (const r of toArray(ccResponse)) {\n const txns = r.CCSTMTRS?.BANKTRANLIST?.STMTTRN;\n if (txns) results.push(...txns);\n }\n }\n\n return results;\n}\n\nexport function getAccountInfo(\n document: OFXDocument,\n): (OFXBankAccount | OFXCreditCardAccount)[] {\n const results: (OFXBankAccount | OFXCreditCardAccount)[] = [];\n\n const bankResponse = document.OFX.BANKMSGSRSV1?.STMTTRNRS;\n if (bankResponse) {\n for (const r of toArray(bankResponse)) {\n const account = r.STMTRS?.BANKACCTFROM;\n if (account) results.push(account);\n }\n }\n\n const ccResponse = document.OFX.CREDITCARDMSGSRSV1?.CCSTMTTRNRS;\n if (ccResponse) {\n for (const r of toArray(ccResponse)) {\n const account = r.CCSTMTRS?.CCACCTFROM;\n if (account) results.push(account);\n }\n }\n\n return results;\n}\n\nexport function getBalance(document: OFXDocument): BalanceInfo[] {\n const results: BalanceInfo[] = [];\n\n const bankResponse = document.OFX.BANKMSGSRSV1?.STMTTRNRS;\n if (bankResponse) {\n for (const r of toArray(bankResponse)) {\n if (r.STMTRS) {\n results.push({\n available: r.STMTRS.AVAILBAL,\n ledger: r.STMTRS.LEDGERBAL,\n });\n }\n }\n }\n\n const ccResponse = document.OFX.CREDITCARDMSGSRSV1?.CCSTMTTRNRS;\n if (ccResponse) {\n for (const r of toArray(ccResponse)) {\n if (r.CCSTMTRS) {\n results.push({\n available: r.CCSTMTRS.AVAILBAL,\n ledger: r.CCSTMTRS.LEDGERBAL,\n });\n }\n }\n }\n\n return results;\n}\n\nexport function getSignOnInfo(document: OFXDocument): OFXSignOnResponse {\n return document.OFX.SIGNONMSGSRSV1.SONRS;\n}\n",
7
+ "import { z } from \"zod\";\nimport { accountTypeSchema, transactionTypeSchema } from \"./schemas\";\nimport { escapeOfxText, formatAmount, formatOfxDate } from \"./utils\";\n\nexport const generateHeaderOptionsSchema = z\n .object({\n version: z.string().optional(),\n encoding: z.string().optional(),\n charset: z.string().optional(),\n })\n .optional();\n\nexport type GenerateHeaderOptions = z.infer<typeof generateHeaderOptionsSchema>;\n\nexport function generateHeader(options?: GenerateHeaderOptions): string {\n const version = options?.version ?? \"100\";\n const encoding = options?.encoding ?? \"USASCII\";\n const charset = options?.charset ?? \"1252\";\n\n return [\n \"OFXHEADER:100\",\n \"DATA:OFXSGML\",\n `VERSION:${version}`,\n \"SECURITY:NONE\",\n `ENCODING:${encoding}`,\n `CHARSET:${charset}`,\n \"COMPRESSION:NONE\",\n \"OLDFILEUID:NONE\",\n \"NEWFILEUID:NONE\",\n \"\",\n ].join(\"\\n\");\n}\n\nexport const generateTransactionInputSchema = z.object({\n type: transactionTypeSchema,\n datePosted: z.date(),\n amount: z.number(),\n fitId: z.string().min(1),\n name: z.string().optional(),\n memo: z.string().optional(),\n checkNum: z.string().optional(),\n refNum: z.string().optional(),\n});\n\nexport type GenerateTransactionInput = z.infer<\n typeof generateTransactionInputSchema\n>;\n\nfunction generateTransaction(trn: GenerateTransactionInput): string {\n const lines: string[] = [\n \"<STMTTRN>\",\n `<TRNTYPE>${trn.type}`,\n `<DTPOSTED>${formatOfxDate(trn.datePosted)}`,\n `<TRNAMT>${formatAmount(trn.amount)}`,\n `<FITID>${escapeOfxText(trn.fitId)}`,\n ];\n\n if (trn.name) {\n lines.push(`<NAME>${escapeOfxText(trn.name)}`);\n }\n if (trn.memo) {\n lines.push(`<MEMO>${escapeOfxText(trn.memo)}`);\n }\n if (trn.checkNum) {\n lines.push(`<CHECKNUM>${escapeOfxText(trn.checkNum)}`);\n }\n if (trn.refNum) {\n lines.push(`<REFNUM>${escapeOfxText(trn.refNum)}`);\n }\n\n lines.push(\"</STMTTRN>\");\n return lines.join(\"\\n\");\n}\n\nconst balanceSchema = z.object({\n amount: z.number(),\n asOfDate: z.date(),\n});\n\nconst financialInstitutionSchema = z.object({\n org: z.string().optional(),\n fid: z.string().optional(),\n});\n\nexport const generateBankStatementOptionsSchema = z.object({\n bankId: z.string().min(1),\n accountId: z.string().min(1),\n accountType: accountTypeSchema,\n currency: z.string().min(1),\n startDate: z.date(),\n endDate: z.date(),\n transactions: z.array(generateTransactionInputSchema),\n ledgerBalance: balanceSchema.optional(),\n availableBalance: balanceSchema.optional(),\n financialInstitution: financialInstitutionSchema.optional(),\n language: z.string().optional(),\n});\n\nexport type GenerateBankStatementOptions = z.infer<\n typeof generateBankStatementOptionsSchema\n>;\n\nexport function generateBankStatement(\n options: GenerateBankStatementOptions,\n): string {\n const parts: string[] = [generateHeader()];\n const serverDate = formatOfxDate(new Date());\n const language = options.language ?? \"POR\";\n\n parts.push(`<OFX>\n<SIGNONMSGSRSV1>\n<SONRS>\n<STATUS>\n<CODE>0\n<SEVERITY>INFO\n</STATUS>\n<DTSERVER>${serverDate}\n<LANGUAGE>${language}`);\n\n if (options.financialInstitution) {\n parts.push(\"<FI>\");\n if (options.financialInstitution.org) {\n parts.push(`<ORG>${escapeOfxText(options.financialInstitution.org)}`);\n }\n if (options.financialInstitution.fid) {\n parts.push(`<FID>${escapeOfxText(options.financialInstitution.fid)}`);\n }\n parts.push(\"</FI>\");\n }\n\n parts.push(`</SONRS>\n</SIGNONMSGSRSV1>\n<BANKMSGSRSV1>\n<STMTTRNRS>\n<TRNUID>0\n<STATUS>\n<CODE>0\n<SEVERITY>INFO\n</STATUS>\n<STMTRS>\n<CURDEF>${options.currency}\n<BANKACCTFROM>\n<BANKID>${escapeOfxText(options.bankId)}\n<ACCTID>${escapeOfxText(options.accountId)}\n<ACCTTYPE>${options.accountType}\n</BANKACCTFROM>\n<BANKTRANLIST>\n<DTSTART>${formatOfxDate(options.startDate)}\n<DTEND>${formatOfxDate(options.endDate)}`);\n\n for (const trn of options.transactions) {\n parts.push(generateTransaction(trn));\n }\n\n parts.push(\"</BANKTRANLIST>\");\n\n if (options.ledgerBalance) {\n parts.push(`<LEDGERBAL>\n<BALAMT>${formatAmount(options.ledgerBalance.amount)}\n<DTASOF>${formatOfxDate(options.ledgerBalance.asOfDate)}\n</LEDGERBAL>`);\n }\n\n if (options.availableBalance) {\n parts.push(`<AVAILBAL>\n<BALAMT>${formatAmount(options.availableBalance.amount)}\n<DTASOF>${formatOfxDate(options.availableBalance.asOfDate)}\n</AVAILBAL>`);\n }\n\n parts.push(`</STMTRS>\n</STMTTRNRS>\n</BANKMSGSRSV1>\n</OFX>`);\n\n return parts.join(\"\\n\");\n}\n\nexport const generateCreditCardStatementOptionsSchema = z.object({\n accountId: z.string().min(1),\n currency: z.string().min(1),\n startDate: z.date(),\n endDate: z.date(),\n transactions: z.array(generateTransactionInputSchema),\n ledgerBalance: balanceSchema.optional(),\n availableBalance: balanceSchema.optional(),\n financialInstitution: financialInstitutionSchema.optional(),\n language: z.string().optional(),\n});\n\nexport type GenerateCreditCardStatementOptions = z.infer<\n typeof generateCreditCardStatementOptionsSchema\n>;\n\nexport function generateCreditCardStatement(\n options: GenerateCreditCardStatementOptions,\n): string {\n const parts: string[] = [generateHeader()];\n const serverDate = formatOfxDate(new Date());\n const language = options.language ?? \"POR\";\n\n parts.push(`<OFX>\n<SIGNONMSGSRSV1>\n<SONRS>\n<STATUS>\n<CODE>0\n<SEVERITY>INFO\n</STATUS>\n<DTSERVER>${serverDate}\n<LANGUAGE>${language}`);\n\n if (options.financialInstitution) {\n parts.push(\"<FI>\");\n if (options.financialInstitution.org) {\n parts.push(`<ORG>${escapeOfxText(options.financialInstitution.org)}`);\n }\n if (options.financialInstitution.fid) {\n parts.push(`<FID>${escapeOfxText(options.financialInstitution.fid)}`);\n }\n parts.push(\"</FI>\");\n }\n\n parts.push(`</SONRS>\n</SIGNONMSGSRSV1>\n<CREDITCARDMSGSRSV1>\n<CCSTMTTRNRS>\n<TRNUID>0\n<STATUS>\n<CODE>0\n<SEVERITY>INFO\n</STATUS>\n<CCSTMTRS>\n<CURDEF>${options.currency}\n<CCACCTFROM>\n<ACCTID>${escapeOfxText(options.accountId)}\n</CCACCTFROM>\n<BANKTRANLIST>\n<DTSTART>${formatOfxDate(options.startDate)}\n<DTEND>${formatOfxDate(options.endDate)}`);\n\n for (const trn of options.transactions) {\n parts.push(generateTransaction(trn));\n }\n\n parts.push(\"</BANKTRANLIST>\");\n\n if (options.ledgerBalance) {\n parts.push(`<LEDGERBAL>\n<BALAMT>${formatAmount(options.ledgerBalance.amount)}\n<DTASOF>${formatOfxDate(options.ledgerBalance.asOfDate)}\n</LEDGERBAL>`);\n }\n\n if (options.availableBalance) {\n parts.push(`<AVAILBAL>\n<BALAMT>${formatAmount(options.availableBalance.amount)}\n<DTASOF>${formatOfxDate(options.availableBalance.asOfDate)}\n</AVAILBAL>`);\n }\n\n parts.push(`</CCSTMTRS>\n</CCSTMTTRNRS>\n</CREDITCARDMSGSRSV1>\n</OFX>`);\n\n return parts.join(\"\\n\");\n}\n",
8
+ "import { z } from \"zod\";\n\nconst toFloat = (val: string): number => Number.parseFloat(val);\n\ninterface OFXDateValue {\n raw: string;\n year: number;\n month: number;\n day: number;\n hour: number;\n minute: number;\n second: number;\n timezone: { offset: number; name: string };\n toDate: () => Date;\n}\n\nconst dateComponentsSchema = z.object({\n year: z.number(),\n month: z.number(),\n day: z.number(),\n hour: z.number(),\n minute: z.number(),\n second: z.number(),\n});\n\ntype DateComponents = z.infer<typeof dateComponentsSchema>;\n\nconst DATE_REGEX = /^(\\d{4})(\\d{2})(\\d{2})(\\d{2})?(\\d{2})?(\\d{2})?/;\nconst TIMEZONE_REGEX = /\\[([+-]?\\d+):(\\w+)\\]/;\n\n// Exported for testing purposes only - not part of public API\nexport function parseDateComponents(val: string): DateComponents {\n const m = DATE_REGEX.exec(val);\n if (!m) return { day: 0, hour: 0, minute: 0, month: 0, second: 0, year: 0 };\n return {\n day: +(m[3] as string),\n hour: +(m[4] || 0),\n minute: +(m[5] || 0),\n month: +(m[2] as string),\n second: +(m[6] || 0),\n year: +(m[1] as string),\n };\n}\n\n// Exported for testing purposes only - not part of public API\nexport function parseTimezone(val: string): { offset: number; name: string } {\n const match = TIMEZONE_REGEX.exec(val);\n return {\n name: match?.[2] ?? \"UTC\",\n offset: match ? +(match[1] as string) : 0,\n };\n}\n\nexport const ofxDateSchema = z.string().transform((val): OFXDateValue => {\n const components = parseDateComponents(val);\n const timezone = parseTimezone(val);\n\n return {\n ...components,\n raw: val,\n timezone,\n toDate(): Date {\n const offsetMs = timezone.offset * 60 * 60 * 1000;\n return new Date(\n Date.UTC(\n components.year,\n components.month - 1,\n components.day,\n components.hour,\n components.minute,\n components.second,\n ) - offsetMs,\n );\n },\n };\n});\n\nexport type OFXDate = z.infer<typeof ofxDateSchema>;\n\nexport const statusSchema = z.object({\n CODE: z.string(),\n MESSAGE: z.string().optional(),\n SEVERITY: z.enum([\"INFO\", \"WARN\", \"ERROR\"]),\n});\n\nexport type OFXStatus = z.infer<typeof statusSchema>;\n\nexport const financialInstitutionSchema = z.object({\n FID: z.string().optional(),\n ORG: z.string().optional(),\n});\n\nexport type OFXFinancialInstitution = z.infer<\n typeof financialInstitutionSchema\n>;\n\nexport const transactionTypeSchema = z.enum([\n \"CREDIT\",\n \"DEBIT\",\n \"INT\",\n \"DIV\",\n \"FEE\",\n \"SRVCHG\",\n \"DEP\",\n \"ATM\",\n \"POS\",\n \"XFER\",\n \"CHECK\",\n \"PAYMENT\",\n \"CASH\",\n \"DIRECTDEP\",\n \"DIRECTDEBIT\",\n \"REPEATPMT\",\n \"HOLD\",\n \"OTHER\",\n]);\n\nexport type OFXTransactionType = z.infer<typeof transactionTypeSchema>;\n\nexport const transactionSchema = z.object({\n CHECKNUM: z.string().optional(),\n CORRECTACTION: z.enum([\"DELETE\", \"REPLACE\"]).optional(),\n CORRECTFITID: z.string().optional(),\n CURRENCY: z.string().optional(),\n DTAVAIL: ofxDateSchema.optional(),\n DTPOSTED: ofxDateSchema,\n DTUSER: ofxDateSchema.optional(),\n FITID: z.string().optional(),\n MEMO: z.string().optional(),\n NAME: z.string().optional(),\n PAYEEID: z.string().optional(),\n REFNUM: z.string().optional(),\n SIC: z.string().optional(),\n SRVRTID: z.string().optional(),\n TRNAMT: z.string().transform(toFloat),\n TRNTYPE: transactionTypeSchema,\n});\n\nexport type OFXTransaction = z.infer<typeof transactionSchema>;\n\nexport const accountTypeSchema = z.enum([\n \"CHECKING\",\n \"SAVINGS\",\n \"MONEYMRKT\",\n \"CREDITLINE\",\n \"CD\",\n]);\n\nexport type OFXAccountType = z.infer<typeof accountTypeSchema>;\n\n// Extended account type schema that includes CREDITCARD\n// Some OFX files (especially from certain banks) include credit card accounts\n// in the BANKACCTFROM tag instead of CCACCTFROM, requiring this extended schema\nconst extendedAccountTypeSchema = z.enum([\n \"CHECKING\",\n \"SAVINGS\",\n \"MONEYMRKT\",\n \"CREDITLINE\",\n \"CD\",\n \"CREDITCARD\",\n]);\n\nexport const bankAccountSchema = z.object({\n ACCTID: z.string(),\n ACCTKEY: z.string().optional(),\n ACCTTYPE: accountTypeSchema,\n BANKID: z.string(),\n BRANCHID: z.string().optional(),\n});\n\nexport type OFXBankAccount = z.infer<typeof bankAccountSchema>;\n\n// Flexible bank account schema used for credit card statements\n// that may include account info in BANKACCTFROM instead of CCACCTFROM\nconst flexibleBankAccountSchema = z.object({\n ACCTID: z.string(),\n ACCTKEY: z.string().optional(),\n ACCTTYPE: extendedAccountTypeSchema.optional(),\n BANKID: z.string().optional(),\n BRANCHID: z.string().optional(),\n});\n\nexport const creditCardAccountSchema = z.object({\n ACCTID: z.string(),\n ACCTKEY: z.string().optional(),\n});\n\nexport type OFXCreditCardAccount = z.infer<typeof creditCardAccountSchema>;\n\nexport const balanceSchema = z.object({\n BALAMT: z.string().transform(toFloat),\n DTASOF: ofxDateSchema,\n});\n\nexport type OFXBalance = z.infer<typeof balanceSchema>;\n\nexport const transactionListSchema = z.object({\n DTEND: ofxDateSchema,\n DTSTART: ofxDateSchema,\n STMTTRN: z.array(transactionSchema).default([]),\n});\n\nexport type OFXTransactionList = z.infer<typeof transactionListSchema>;\n\nexport const bankStatementResponseSchema = z.object({\n AVAILBAL: balanceSchema.optional(),\n BANKACCTFROM: bankAccountSchema,\n BANKTRANLIST: transactionListSchema.optional(),\n CURDEF: z.string().default(\"USD\"),\n LEDGERBAL: balanceSchema.optional(),\n MKTGINFO: z.string().optional(),\n});\n\nexport type OFXBankStatementResponse = z.infer<\n typeof bankStatementResponseSchema\n>;\n\nexport const creditCardStatementResponseSchema = z\n .object({\n AVAILBAL: balanceSchema.optional(),\n BANKACCTFROM: flexibleBankAccountSchema.optional(),\n BANKTRANLIST: transactionListSchema.optional(),\n CCACCTFROM: creditCardAccountSchema.optional(),\n CURDEF: z.string().default(\"USD\"),\n LEDGERBAL: balanceSchema.optional(),\n MKTGINFO: z.string().optional(),\n })\n .refine((data) => data.CCACCTFROM || data.BANKACCTFROM, {\n message: \"Either CCACCTFROM or BANKACCTFROM is required\",\n });\n\nexport type OFXCreditCardStatementResponse = z.infer<\n typeof creditCardStatementResponseSchema\n>;\n\nexport const signOnResponseSchema = z.object({\n ACCESSKEY: z.string().optional(),\n DTSERVER: ofxDateSchema,\n FI: financialInstitutionSchema.optional(),\n LANGUAGE: z.string().default(\"ENG\"),\n SESSCOOKIE: z.string().optional(),\n STATUS: statusSchema,\n});\n\nexport type OFXSignOnResponse = z.infer<typeof signOnResponseSchema>;\n\nexport const bankStatementTransactionResponseSchema = z.object({\n STATUS: statusSchema.optional(),\n STMTRS: bankStatementResponseSchema.optional(),\n TRNUID: z.string().optional(),\n});\n\nexport type OFXBankStatementTransactionResponse = z.infer<\n typeof bankStatementTransactionResponseSchema\n>;\n\nexport const creditCardStatementTransactionResponseSchema = z.object({\n CCSTMTRS: creditCardStatementResponseSchema.optional(),\n STATUS: statusSchema.optional(),\n TRNUID: z.string().optional(),\n});\n\nexport type OFXCreditCardStatementTransactionResponse = z.infer<\n typeof creditCardStatementTransactionResponseSchema\n>;\n\nconst singleOrArray = <T extends z.ZodTypeAny>(schema: T) =>\n z.union([schema, z.array(schema)]).optional();\n\nexport const bankMessageSetResponseSchema = z.object({\n STMTTRNRS: singleOrArray(bankStatementTransactionResponseSchema),\n});\n\nexport type OFXBankMessageSetResponse = z.infer<\n typeof bankMessageSetResponseSchema\n>;\n\nexport const creditCardMessageSetResponseSchema = z.object({\n CCSTMTTRNRS: singleOrArray(creditCardStatementTransactionResponseSchema),\n});\n\nexport type OFXCreditCardMessageSetResponse = z.infer<\n typeof creditCardMessageSetResponseSchema\n>;\n\nexport const signOnMessageSetResponseSchema = z.object({\n SONRS: signOnResponseSchema,\n});\n\nexport type OFXSignOnMessageSetResponse = z.infer<\n typeof signOnMessageSetResponseSchema\n>;\n\nexport const ofxResponseSchema = z.object({\n BANKMSGSRSV1: bankMessageSetResponseSchema.optional(),\n CREDITCARDMSGSRSV1: creditCardMessageSetResponseSchema.optional(),\n SIGNONMSGSRSV1: signOnMessageSetResponseSchema,\n});\n\nexport type OFXResponse = z.infer<typeof ofxResponseSchema>;\n\nexport const ofxHeaderSchema = z.object({\n CHARSET: z.string().optional(),\n COMPRESSION: z.string().optional(),\n DATA: z.string().optional(),\n ENCODING: z.string().optional(),\n NEWFILEUID: z.string().optional(),\n OFXHEADER: z.string().optional(),\n OLDFILEUID: z.string().optional(),\n SECURITY: z.string().optional(),\n VERSION: z.string().optional(),\n});\n\nexport type OFXHeader = z.infer<typeof ofxHeaderSchema>;\n\nexport const ofxDocumentSchema = z.object({\n header: ofxHeaderSchema,\n OFX: ofxResponseSchema,\n});\n\nexport type OFXDocument = z.infer<typeof ofxDocumentSchema>;\n",
9
+ "import { z } from \"zod\";\nimport {\n type OFXDocument,\n type OFXHeader,\n ofxHeaderSchema,\n ofxResponseSchema,\n} from \"./schemas\";\nimport { decodeEntities, toArray } from \"./utils\";\n\ninterface TagStackItem {\n name: string;\n content: Record<string, unknown>;\n}\n\nconst CHARSET_MAP: Record<string, string> = {\n \"1252\": \"windows-1252\",\n \"WINDOWS-1252\": \"windows-1252\",\n CP1252: \"windows-1252\",\n \"8859-1\": \"windows-1252\",\n \"ISO-8859-1\": \"windows-1252\",\n LATIN1: \"windows-1252\",\n \"LATIN-1\": \"windows-1252\",\n \"UTF-8\": \"utf-8\",\n UTF8: \"utf-8\",\n NONE: \"utf-8\",\n \"\": \"utf-8\",\n};\n\nexport function getEncodingFromCharset(charset?: string): string {\n if (!charset) return \"utf-8\";\n const normalized = charset.toUpperCase().trim();\n return CHARSET_MAP[normalized] ?? \"windows-1252\";\n}\n\nfunction addToContent(\n content: Record<string, unknown>,\n key: string,\n value: unknown,\n): void {\n // Prevent prototype pollution\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") {\n return;\n }\n\n const existing = content[key];\n if (existing !== undefined) {\n if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n content[key] = [existing, value];\n }\n } else {\n content[key] = value;\n }\n}\n\nexport function sgmlToObject(sgml: string): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n const tagStack: TagStackItem[] = [{ content: result, name: \"root\" }];\n const stackMap = new Map<string, number>([[\"root\", 0]]);\n\n const hasSpecialContent = sgml.includes(\"<?\") || sgml.includes(\"<!--\");\n const cleanSgml = hasSpecialContent\n ? sgml.replace(/<\\?.*?\\?>|<!--.*?-->/gs, \"\").trim()\n : sgml.trim();\n\n const tagRegex = /<(\\/?)([\\w.]+)>([^<]*)/g;\n let match: RegExpExecArray | null = tagRegex.exec(cleanSgml);\n\n while (match !== null) {\n const isClosing = match[1];\n const tagName = match[2];\n const textContent = match[3]?.trim() ?? \"\";\n\n if (!tagName) {\n match = tagRegex.exec(cleanSgml);\n continue;\n }\n\n const current = tagStack[tagStack.length - 1];\n if (!current) {\n match = tagRegex.exec(cleanSgml);\n continue;\n }\n\n if (isClosing) {\n const stackIndex = stackMap.get(tagName);\n if (stackIndex !== undefined && stackIndex > 0) {\n for (let i = tagStack.length - 1; i >= stackIndex; i--) {\n const item = tagStack[i];\n if (item) stackMap.delete(item.name);\n }\n tagStack.length = stackIndex;\n }\n } else if (textContent) {\n const decoded = textContent.includes(\"&\")\n ? decodeEntities(textContent)\n : textContent;\n addToContent(current.content, tagName, decoded);\n } else {\n const newObj: Record<string, unknown> = {};\n addToContent(current.content, tagName, newObj);\n stackMap.set(tagName, tagStack.length);\n tagStack.push({ content: newObj, name: tagName });\n }\n\n match = tagRegex.exec(cleanSgml);\n }\n\n return result;\n}\n\nfunction generateFitId(txn: Record<string, unknown>, index: number): string {\n const date = String(txn.DTPOSTED ?? \"\");\n const amount = String(txn.TRNAMT ?? \"0\");\n const name = String(txn.NAME ?? txn.MEMO ?? \"\");\n const input = `${date}:${amount}:${name}:${index}`;\n let hash = 0;\n for (let i = 0; i < input.length; i++) {\n hash = (hash << 5) - hash + input.charCodeAt(i);\n hash = hash | 0; // Convert to 32-bit integer\n }\n return `AUTO${Math.abs(hash).toString(16).toUpperCase().padStart(8, \"0\")}`;\n}\n\nfunction normalizeResponseArray(\n msgs: Record<string, unknown>,\n responseKey: string,\n statementKey: string,\n): void {\n const responses = msgs[responseKey];\n if (!responses) return;\n\n for (const response of toArray(responses)) {\n const stmt = (response as Record<string, unknown>)?.[statementKey] as\n | Record<string, unknown>\n | undefined;\n const tranList = stmt?.BANKTRANLIST as\n | Record<string, unknown>\n | undefined;\n if (tranList?.STMTTRN !== undefined) {\n tranList.STMTTRN = toArray(tranList.STMTTRN);\n const transactions = tranList.STMTTRN as Array<\n Record<string, unknown>\n >;\n transactions.forEach((txn, idx) => {\n if (!txn.FITID) {\n txn.FITID = generateFitId(txn, idx);\n }\n });\n }\n }\n}\n\nfunction normalizeSignOn(data: Record<string, unknown>): void {\n const ofx = data.OFX as Record<string, unknown> | undefined;\n if (!ofx) return;\n\n const signonMsgs = ofx.SIGNONMSGSRSV1 as Record<string, unknown> | undefined;\n const sonrs = signonMsgs?.SONRS as Record<string, unknown> | undefined;\n if (!sonrs) return;\n\n const status = sonrs.STATUS as Record<string, unknown> | undefined;\n if (!status) return;\n\n if (!sonrs.DTSERVER && status.DTSERVER) {\n sonrs.DTSERVER = status.DTSERVER;\n delete status.DTSERVER;\n }\n\n if (!sonrs.LANGUAGE && status.LANGUAGE) {\n sonrs.LANGUAGE = status.LANGUAGE;\n delete status.LANGUAGE;\n }\n}\n\nexport function normalizeTransactions(\n data: Record<string, unknown>,\n): Record<string, unknown> {\n const ofx = data.OFX as Record<string, unknown> | undefined;\n if (!ofx) return data;\n\n normalizeSignOn(data);\n\n const bankMsgs = ofx.BANKMSGSRSV1 as Record<string, unknown> | undefined;\n if (bankMsgs) {\n normalizeResponseArray(bankMsgs, \"STMTTRNRS\", \"STMTRS\");\n }\n\n const ccMsgs = ofx.CREDITCARDMSGSRSV1 as Record<string, unknown> | undefined;\n if (ccMsgs) {\n normalizeResponseArray(ccMsgs, \"CCSTMTTRNRS\", \"CCSTMTRS\");\n }\n\n return data;\n}\n\nexport function parseHeader(content: string): {\n header: OFXHeader;\n body: string;\n} {\n const lines = content.split(/\\r?\\n/);\n const header: Record<string, string> = {};\n let bodyStartIndex = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]?.trim() ?? \"\";\n\n if (line.startsWith(\"<?xml\") || line.startsWith(\"<OFX>\")) {\n bodyStartIndex = i;\n break;\n }\n\n const match = line.match(/^(\\w+):(.*)$/);\n if (match?.[1] && match[2] !== undefined) {\n header[match[1]] = match[2];\n }\n\n if (line === \"\" && Object.keys(header).length > 0) {\n bodyStartIndex = i + 1;\n break;\n }\n }\n\n const body = lines.slice(bodyStartIndex).join(\"\\n\");\n return { body, header: ofxHeaderSchema.parse(header) };\n}\n\nexport type ParseResult<T> =\n | { success: true; data: T }\n | { success: false; error: z.ZodError };\n\nexport function parse(content: string): ParseResult<OFXDocument> {\n try {\n if (typeof content !== \"string\") {\n return {\n error: new z.ZodError([\n {\n code: \"invalid_type\",\n expected: \"string\",\n message: `Expected string, received ${typeof content}`,\n path: [],\n },\n ]),\n success: false,\n };\n }\n\n if (content.trim() === \"\") {\n return {\n error: new z.ZodError([\n {\n code: \"custom\",\n message: \"Content cannot be empty\",\n path: [],\n },\n ]),\n success: false,\n };\n }\n\n const { header, body } = parseHeader(content);\n const rawData = sgmlToObject(body);\n const normalizedData = normalizeTransactions(rawData);\n\n const parseResult = ofxResponseSchema.safeParse(normalizedData.OFX);\n\n if (!parseResult.success) {\n return { error: parseResult.error, success: false };\n }\n\n return {\n data: { header, OFX: parseResult.data },\n success: true,\n };\n } catch (err) {\n if (err instanceof z.ZodError) {\n return { error: err, success: false };\n }\n throw err;\n }\n}\n\nexport function parseOrThrow(content: string): OFXDocument {\n const result = parse(content);\n if (!result.success) {\n throw result.error;\n }\n return result.data;\n}\n\nfunction isValidUtf8(buffer: Uint8Array): boolean {\n let i = 0;\n while (i < buffer.length) {\n const byte = buffer[i];\n if (byte === undefined) break;\n\n if (byte <= 0x7f) {\n i++;\n } else if ((byte & 0xe0) === 0xc0) {\n const b1 = buffer[i + 1];\n if (i + 1 >= buffer.length || b1 === undefined || (b1 & 0xc0) !== 0x80)\n return false;\n i += 2;\n } else if ((byte & 0xf0) === 0xe0) {\n const b1 = buffer[i + 1];\n const b2 = buffer[i + 2];\n if (\n i + 2 >= buffer.length ||\n b1 === undefined ||\n b2 === undefined ||\n (b1 & 0xc0) !== 0x80 ||\n (b2 & 0xc0) !== 0x80\n )\n return false;\n i += 3;\n } else if ((byte & 0xf8) === 0xf0) {\n const b1 = buffer[i + 1];\n const b2 = buffer[i + 2];\n const b3 = buffer[i + 3];\n if (\n i + 3 >= buffer.length ||\n b1 === undefined ||\n b2 === undefined ||\n b3 === undefined ||\n (b1 & 0xc0) !== 0x80 ||\n (b2 & 0xc0) !== 0x80 ||\n (b3 & 0xc0) !== 0x80\n )\n return false;\n i += 4;\n } else {\n return false;\n }\n }\n return true;\n}\n\nfunction hasUtf8MultiByte(buffer: Uint8Array): boolean {\n for (let i = 0; i < buffer.length; i++) {\n const byte = buffer[i];\n if (byte !== undefined && byte > 0x7f) {\n return true;\n }\n }\n return false;\n}\n\nfunction parseHeaderFromBuffer(buffer: Uint8Array): {\n header: OFXHeader;\n encoding: string;\n} {\n const maxHeaderSize = Math.min(buffer.length, 1000);\n const headerSection = new TextDecoder(\"windows-1252\").decode(\n buffer.slice(0, maxHeaderSize),\n );\n\n const header: Record<string, string> = {};\n\n const singleLineMatch = headerSection.match(\n /^(OFXHEADER:\\d+.*?)(?=<OFX|<\\?xml)/is,\n );\n if (singleLineMatch?.[1]) {\n const headerPart = singleLineMatch[1];\n const fieldRegex = /(\\w+):([^\\s<]+)/g;\n let fieldMatch = fieldRegex.exec(headerPart);\n while (fieldMatch !== null) {\n const key = fieldMatch[1];\n const value = fieldMatch[2];\n if (key && value !== undefined) {\n header[key] = value;\n }\n fieldMatch = fieldRegex.exec(headerPart);\n }\n } else {\n const lines = headerSection.split(/\\r?\\n/);\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.startsWith(\"<?xml\") || trimmed.startsWith(\"<OFX\")) {\n break;\n }\n\n const match = trimmed.match(/^(\\w+):(.*)$/);\n if (match?.[1] && match[2] !== undefined) {\n header[match[1]] = match[2];\n }\n\n if (trimmed === \"\" && Object.keys(header).length > 0) {\n break;\n }\n }\n }\n\n const parsedHeader = ofxHeaderSchema.parse(header);\n let encoding = getEncodingFromCharset(parsedHeader.CHARSET);\n\n if (\n encoding !== \"utf-8\" &&\n hasUtf8MultiByte(buffer) &&\n isValidUtf8(buffer)\n ) {\n encoding = \"utf-8\";\n }\n\n return { encoding, header: parsedHeader };\n}\n\n/**\n * Decodes an OFX buffer to a string with proper charset detection.\n * Automatically detects encoding from OFX header (CHARSET field).\n */\nexport function decodeOfxBuffer(buffer: Uint8Array): string {\n const { encoding } = parseHeaderFromBuffer(buffer);\n const decoder = new TextDecoder(encoding as Bun.Encoding);\n return decoder.decode(buffer);\n}\n\nexport function parseBuffer(buffer: Uint8Array): ParseResult<OFXDocument> {\n try {\n if (!(buffer instanceof Uint8Array)) {\n return {\n error: new z.ZodError([\n {\n code: \"invalid_type\",\n expected: \"object\",\n message: \"Expected Uint8Array\",\n path: [],\n },\n ]),\n success: false,\n };\n }\n\n if (buffer.length === 0) {\n return {\n error: new z.ZodError([\n {\n code: \"custom\",\n message: \"Buffer cannot be empty\",\n path: [],\n },\n ]),\n success: false,\n };\n }\n\n const content = decodeOfxBuffer(buffer);\n return parse(content);\n } catch (err) {\n if (err instanceof z.ZodError) {\n return { error: err, success: false };\n }\n throw err;\n }\n}\n\nexport function parseBufferOrThrow(buffer: Uint8Array): OFXDocument {\n const result = parseBuffer(buffer);\n if (!result.success) {\n throw result.error;\n }\n return result.data;\n}\n",
10
+ "import { decodeOfxBuffer, getEncodingFromCharset } from \"./parser\";\nimport {\n balanceSchema,\n bankAccountSchema,\n creditCardAccountSchema,\n type OFXBalance,\n type OFXBankAccount,\n type OFXCreditCardAccount,\n type OFXHeader,\n type OFXTransaction,\n ofxHeaderSchema,\n transactionSchema,\n} from \"./schemas\";\nimport { decodeEntities } from \"./utils\";\n\nexport interface StreamOptions {\n encoding?: string;\n}\n\nexport type StreamEvent =\n | { type: \"header\"; data: OFXHeader }\n | { type: \"transaction\"; data: OFXTransaction }\n | { type: \"account\"; data: OFXBankAccount | OFXCreditCardAccount }\n | { type: \"balance\"; data: { ledger?: OFXBalance; available?: OFXBalance } }\n | { type: \"complete\"; transactionCount: number };\n\n// Batch streaming types\nexport interface BatchFileInput {\n filename: string;\n buffer: Uint8Array;\n}\n\nexport type BatchStreamEvent =\n | { type: \"file_start\"; fileIndex: number; filename: string }\n | { type: \"header\"; fileIndex: number; data: OFXHeader }\n | { type: \"transaction\"; fileIndex: number; data: OFXTransaction }\n | {\n type: \"account\";\n fileIndex: number;\n data: OFXBankAccount | OFXCreditCardAccount;\n }\n | {\n type: \"balance\";\n fileIndex: number;\n data: { ledger?: OFXBalance; available?: OFXBalance };\n }\n | {\n type: \"file_complete\";\n fileIndex: number;\n filename: string;\n transactionCount: number;\n }\n | { type: \"file_error\"; fileIndex: number; filename: string; error: string }\n | {\n type: \"batch_complete\";\n totalFiles: number;\n totalTransactions: number;\n errorCount: number;\n };\n\nexport interface BatchParsedFile {\n fileIndex: number;\n filename: string;\n header?: OFXHeader;\n transactions: OFXTransaction[];\n accounts: (OFXBankAccount | OFXCreditCardAccount)[];\n balances: { ledger?: OFXBalance; available?: OFXBalance }[];\n error?: string;\n}\n\ninterface ParserState {\n buffer: string;\n inHeader: boolean;\n headerParsed: boolean;\n transactionCount: number;\n currentPath: string[];\n currentObject: Record<string, unknown>;\n objectStack: Record<string, unknown>[];\n}\n\nfunction parseHeaderFromBuffer(\n buffer: string,\n): { header: OFXHeader; bodyStart: number } | null {\n const lines = buffer.split(/\\r?\\n/);\n const header: Record<string, string> = {};\n let bodyStartIndex = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]?.trim() ?? \"\";\n\n if (line.startsWith(\"<?xml\") || line.startsWith(\"<OFX>\")) {\n bodyStartIndex = i;\n break;\n }\n\n const match = line.match(/^(\\w+):(.*)$/);\n if (match?.[1] && match[2] !== undefined) {\n header[match[1]] = match[2];\n }\n\n if (line === \"\" && Object.keys(header).length > 0) {\n bodyStartIndex = i + 1;\n break;\n }\n }\n\n if (Object.keys(header).length === 0) return null;\n\n const headerResult = ofxHeaderSchema.safeParse(header);\n if (!headerResult.success) return null;\n\n const bodyStartChar = lines.slice(0, bodyStartIndex).join(\"\\n\").length + 1;\n return { bodyStart: bodyStartChar, header: headerResult.data };\n}\n\nfunction tryParseTransaction(obj: unknown): OFXTransaction | null {\n const result = transactionSchema.safeParse(obj);\n return result.success ? result.data : null;\n}\n\nfunction tryParseBankAccount(obj: unknown): OFXBankAccount | null {\n const result = bankAccountSchema.safeParse(obj);\n return result.success ? result.data : null;\n}\n\nfunction tryParseCreditCardAccount(obj: unknown): OFXCreditCardAccount | null {\n const result = creditCardAccountSchema.safeParse(obj);\n return result.success ? result.data : null;\n}\n\nfunction tryParseBalance(obj: unknown): OFXBalance | null {\n const result = balanceSchema.safeParse(obj);\n return result.success ? result.data : null;\n}\n\nexport async function* parseStream(\n input: ReadableStream<Uint8Array> | AsyncIterable<string>,\n options?: StreamOptions,\n): AsyncGenerator<StreamEvent> {\n const state: ParserState = {\n buffer: \"\",\n currentObject: {},\n currentPath: [],\n headerParsed: false,\n inHeader: true,\n objectStack: [{}],\n transactionCount: 0,\n };\n\n let detectedEncoding: string | undefined = options?.encoding;\n let decoder = new TextDecoder((detectedEncoding ?? \"utf-8\") as Bun.Encoding);\n const tagRegex = /<(\\/?)([\\w.]+)>([^<]*)/g;\n\n let pendingLedgerBalance: OFXBalance | undefined;\n let pendingAvailableBalance: OFXBalance | undefined;\n let emittedBalanceForCurrentStatement = false;\n\n async function* processChunk(\n chunk: string,\n isLast = false,\n ): AsyncGenerator<StreamEvent> {\n state.buffer += chunk;\n\n if (!state.headerParsed) {\n const headerResult = parseHeaderFromBuffer(state.buffer);\n if (headerResult) {\n state.headerParsed = true;\n state.inHeader = false;\n\n if (!detectedEncoding && headerResult.header.CHARSET) {\n detectedEncoding = getEncodingFromCharset(\n headerResult.header.CHARSET,\n );\n decoder = new TextDecoder(detectedEncoding as Bun.Encoding);\n }\n\n yield { data: headerResult.header, type: \"header\" };\n state.buffer = state.buffer.slice(headerResult.bodyStart);\n } else {\n return;\n }\n }\n\n const lastLt = state.buffer.lastIndexOf(\"<\");\n const safeEnd = isLast ? state.buffer.length : lastLt;\n if (safeEnd <= 0) return;\n\n const safeBuffer = state.buffer.slice(0, safeEnd);\n let processedUpTo = 0;\n\n tagRegex.lastIndex = 0;\n for (\n let match = tagRegex.exec(safeBuffer);\n match !== null;\n match = tagRegex.exec(safeBuffer)\n ) {\n const isClosing = match[1] === \"/\";\n const tagName = match[2];\n const textContent = match[3]?.trim() ?? \"\";\n\n if (!tagName) continue;\n\n const currentObj = state.objectStack[state.objectStack.length - 1];\n if (!currentObj) continue;\n\n if (isClosing) {\n if (tagName === \"STMTTRN\") {\n const txn = tryParseTransaction(currentObj);\n if (txn) {\n state.transactionCount++;\n yield { data: txn, type: \"transaction\" };\n }\n } else if (tagName === \"BANKACCTFROM\") {\n const account = tryParseBankAccount(currentObj);\n if (account) {\n yield { data: account, type: \"account\" };\n }\n } else if (tagName === \"CCACCTFROM\") {\n const account = tryParseCreditCardAccount(currentObj);\n if (account) {\n yield { data: account, type: \"account\" };\n }\n } else if (tagName === \"LEDGERBAL\") {\n pendingLedgerBalance = tryParseBalance(currentObj) ?? undefined;\n } else if (tagName === \"AVAILBAL\") {\n pendingAvailableBalance =\n tryParseBalance(currentObj) ?? undefined;\n } else if (\n (tagName === \"STMTRS\" || tagName === \"CCSTMTRS\") &&\n !emittedBalanceForCurrentStatement\n ) {\n if (pendingLedgerBalance || pendingAvailableBalance) {\n yield {\n data: {\n available: pendingAvailableBalance,\n ledger: pendingLedgerBalance,\n },\n type: \"balance\",\n };\n emittedBalanceForCurrentStatement = true;\n }\n } else if (tagName === \"STMTTRNRS\" || tagName === \"CCSTMTTRNRS\") {\n pendingLedgerBalance = undefined;\n pendingAvailableBalance = undefined;\n emittedBalanceForCurrentStatement = false;\n }\n\n const pathIndex = state.currentPath.lastIndexOf(tagName);\n if (pathIndex !== -1) {\n state.currentPath.length = pathIndex;\n state.objectStack.length = Math.max(pathIndex + 1, 1);\n }\n } else if (textContent) {\n const decoded = decodeEntities(textContent);\n const existing = currentObj[tagName];\n if (existing !== undefined) {\n if (Array.isArray(existing)) {\n existing.push(decoded);\n } else {\n currentObj[tagName] = [existing, decoded];\n }\n } else {\n currentObj[tagName] = decoded;\n }\n } else {\n const newObj: Record<string, unknown> = {};\n const existing = currentObj[tagName];\n if (existing !== undefined) {\n if (Array.isArray(existing)) {\n existing.push(newObj);\n } else {\n currentObj[tagName] = [existing, newObj];\n }\n } else {\n currentObj[tagName] = newObj;\n }\n state.currentPath.push(tagName);\n state.objectStack.push(newObj);\n }\n\n processedUpTo = tagRegex.lastIndex;\n }\n\n if (processedUpTo > 0) {\n state.buffer = state.buffer.slice(processedUpTo);\n }\n tagRegex.lastIndex = 0;\n }\n\n if (input instanceof ReadableStream) {\n const reader = input.getReader();\n const initialChunks: Uint8Array[] = [];\n let headerFound = false;\n\n try {\n while (!headerFound) {\n const { done, value } = await reader.read();\n if (done) break;\n initialChunks.push(value);\n\n const combined = new Uint8Array(\n initialChunks.reduce((sum, chunk) => sum + chunk.length, 0),\n );\n let offset = 0;\n for (const chunk of initialChunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n const headerSection = new TextDecoder(\"windows-1252\").decode(\n combined.slice(0, Math.min(combined.length, 1000)),\n );\n\n if (\n headerSection.includes(\"<OFX\") ||\n headerSection.includes(\"<?xml\")\n ) {\n const charsetMatch = headerSection.match(/CHARSET:(\\S+)/i);\n if (charsetMatch && !detectedEncoding) {\n detectedEncoding = getEncodingFromCharset(charsetMatch[1]);\n decoder = new TextDecoder(detectedEncoding as Bun.Encoding);\n }\n headerFound = true;\n\n const content = decoder.decode(combined);\n yield* processChunk(content);\n }\n }\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n yield* processChunk(decoder.decode(value, { stream: true }));\n }\n yield* processChunk(decoder.decode(), true);\n } finally {\n reader.releaseLock();\n }\n } else {\n const chunks: string[] = [];\n for await (const chunk of input) {\n chunks.push(chunk);\n }\n for (let i = 0; i < chunks.length; i++) {\n yield* processChunk(chunks[i] ?? \"\", i === chunks.length - 1);\n }\n }\n\n yield { transactionCount: state.transactionCount, type: \"complete\" };\n}\n\nexport async function parseStreamToArray(\n input: ReadableStream<Uint8Array> | AsyncIterable<string>,\n options?: StreamOptions,\n): Promise<{\n header?: OFXHeader;\n transactions: OFXTransaction[];\n accounts: (OFXBankAccount | OFXCreditCardAccount)[];\n balances: { ledger?: OFXBalance; available?: OFXBalance }[];\n}> {\n const result: {\n header?: OFXHeader;\n transactions: OFXTransaction[];\n accounts: (OFXBankAccount | OFXCreditCardAccount)[];\n balances: { ledger?: OFXBalance; available?: OFXBalance }[];\n } = {\n accounts: [],\n balances: [],\n transactions: [],\n };\n\n for await (const event of parseStream(input, options)) {\n switch (event.type) {\n case \"header\":\n result.header = event.data;\n break;\n case \"transaction\":\n result.transactions.push(event.data);\n break;\n case \"account\":\n result.accounts.push(event.data);\n break;\n case \"balance\":\n result.balances.push(event.data);\n break;\n }\n }\n\n return result;\n}\n\n/**\n * Creates an async iterable that yields chunks of the content string.\n * Yields to the main thread between chunks for UI responsiveness.\n */\nasync function* createChunkIterable(\n content: string,\n chunkSize = 65536,\n): AsyncGenerator<string> {\n for (let i = 0; i < content.length; i += chunkSize) {\n yield content.slice(i, i + chunkSize);\n // Yield to main thread between chunks for UI responsiveness\n await new Promise((resolve) => setTimeout(resolve, 0));\n }\n}\n\n/**\n * Streaming batch parser - processes files sequentially, yielding events.\n * Yields control between files for UI responsiveness.\n *\n * @param files - Array of files with filename and buffer\n * @param options - Stream options (encoding)\n * @yields BatchStreamEvent for each file start, transaction, completion, or error\n */\nexport async function* parseBatchStream(\n files: BatchFileInput[],\n options?: StreamOptions,\n): AsyncGenerator<BatchStreamEvent> {\n let totalTransactions = 0;\n let errorCount = 0;\n\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n if (!file) continue;\n\n yield { type: \"file_start\", fileIndex: i, filename: file.filename };\n\n try {\n let fileTransactionCount = 0;\n\n // Decode buffer with proper charset detection\n const content = decodeOfxBuffer(file.buffer);\n\n // Create chunked async iterable\n const chunkIterable = createChunkIterable(content);\n\n for await (const event of parseStream(chunkIterable, options)) {\n switch (event.type) {\n case \"header\":\n yield { type: \"header\", fileIndex: i, data: event.data };\n break;\n case \"transaction\":\n yield { type: \"transaction\", fileIndex: i, data: event.data };\n fileTransactionCount++;\n break;\n case \"account\":\n yield { type: \"account\", fileIndex: i, data: event.data };\n break;\n case \"balance\":\n yield { type: \"balance\", fileIndex: i, data: event.data };\n break;\n case \"complete\":\n // Handled below\n break;\n }\n }\n\n totalTransactions += fileTransactionCount;\n yield {\n type: \"file_complete\",\n fileIndex: i,\n filename: file.filename,\n transactionCount: fileTransactionCount,\n };\n } catch (err) {\n errorCount++;\n yield {\n type: \"file_error\",\n fileIndex: i,\n filename: file.filename,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n\n // Yield control between files for UI responsiveness\n await new Promise((resolve) => setTimeout(resolve, 0));\n }\n\n yield {\n type: \"batch_complete\",\n totalFiles: files.length,\n totalTransactions,\n errorCount,\n };\n}\n\n/**\n * Convenience function that collects streaming batch results into arrays.\n *\n * @param files - Array of files with filename and buffer\n * @param options - Stream options (encoding)\n * @returns Array of parsed file results\n */\nexport async function parseBatchStreamToArray(\n files: BatchFileInput[],\n options?: StreamOptions,\n): Promise<BatchParsedFile[]> {\n const results: BatchParsedFile[] = files.map((file, index) => ({\n fileIndex: index,\n filename: file.filename,\n transactions: [],\n accounts: [],\n balances: [],\n }));\n\n for await (const event of parseBatchStream(files, options)) {\n switch (event.type) {\n case \"header\": {\n const result = results[event.fileIndex];\n if (result) result.header = event.data;\n break;\n }\n case \"transaction\": {\n const result = results[event.fileIndex];\n if (result) result.transactions.push(event.data);\n break;\n }\n case \"account\": {\n const result = results[event.fileIndex];\n if (result) result.accounts.push(event.data);\n break;\n }\n case \"balance\": {\n const result = results[event.fileIndex];\n if (result) result.balances.push(event.data);\n break;\n }\n case \"file_error\": {\n const result = results[event.fileIndex];\n if (result) result.error = event.error;\n break;\n }\n }\n }\n\n return results;\n}\n"
11
+ ],
12
+ "mappings": "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",
13
+ "debugId": "7C69B4A1D0DBA73E64756E2164756E21",
14
+ "names": []
15
+ }
@@ -0,0 +1,26 @@
1
+ import { z } from "zod";
2
+ import { type OFXDocument, type OFXHeader } from "./schemas";
3
+ export declare function getEncodingFromCharset(charset?: string): string;
4
+ export declare function sgmlToObject(sgml: string): Record<string, unknown>;
5
+ export declare function normalizeTransactions(data: Record<string, unknown>): Record<string, unknown>;
6
+ export declare function parseHeader(content: string): {
7
+ header: OFXHeader;
8
+ body: string;
9
+ };
10
+ export type ParseResult<T> = {
11
+ success: true;
12
+ data: T;
13
+ } | {
14
+ success: false;
15
+ error: z.ZodError;
16
+ };
17
+ export declare function parse(content: string): ParseResult<OFXDocument>;
18
+ export declare function parseOrThrow(content: string): OFXDocument;
19
+ /**
20
+ * Decodes an OFX buffer to a string with proper charset detection.
21
+ * Automatically detects encoding from OFX header (CHARSET field).
22
+ */
23
+ export declare function decodeOfxBuffer(buffer: Uint8Array): string;
24
+ export declare function parseBuffer(buffer: Uint8Array): ParseResult<OFXDocument>;
25
+ export declare function parseBufferOrThrow(buffer: Uint8Array): OFXDocument;
26
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACJ,KAAK,WAAW,EAChB,KAAK,SAAS,EAGhB,MAAM,WAAW,CAAC;AAsBnB,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAI/D;AAwBD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsDlE;AAkED,wBAAgB,qBAAqB,CAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiBzB;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG;IAC3C,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACf,CA0BA;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,IACpB;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAC1B;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAA;CAAE,CAAC;AAE3C,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,CAiD/D;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAMzD;AAsHD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAI1D;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,CAAC,WAAW,CAAC,CAqCxE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,CAMlE"}