@f-o-t/ofx 2.4.1 → 2.4.5

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.
package/LICENSE.md CHANGED
@@ -1,10 +1,21 @@
1
+ MIT License
1
2
 
2
- MIT License
3
+ Copyright (c) 2026 FOT (F-O-T)
3
4
 
4
- Copyright (c) 2025 FOT
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
5
11
 
6
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
7
14
 
8
- The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
9
-
10
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,10 @@
1
+ import type { OFXBalance, OFXBankAccount, OFXCreditCardAccount, OFXDocument, OFXSignOnResponse, OFXTransaction } from "./schemas";
2
+ export interface BalanceInfo {
3
+ ledger?: OFXBalance;
4
+ available?: OFXBalance;
5
+ }
6
+ export declare function getTransactions(document: OFXDocument): OFXTransaction[];
7
+ export declare function getAccountInfo(document: OFXDocument): (OFXBankAccount | OFXCreditCardAccount)[];
8
+ export declare function getBalance(document: OFXDocument): BalanceInfo[];
9
+ export declare function getSignOnInfo(document: OFXDocument): OFXSignOnResponse;
10
+ //# sourceMappingURL=extractors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractors.d.ts","sourceRoot":"","sources":["../src/extractors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACT,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,WAAW,EACX,iBAAiB,EACjB,cAAc,EAChB,MAAM,WAAW,CAAC;AAGnB,MAAM,WAAW,WAAW;IACzB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,SAAS,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,GAAG,cAAc,EAAE,CAoBvE;AAED,wBAAgB,cAAc,CAC3B,QAAQ,EAAE,WAAW,GACrB,CAAC,cAAc,GAAG,oBAAoB,CAAC,EAAE,CAoB3C;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,WAAW,GAAG,WAAW,EAAE,CA4B/D;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,WAAW,GAAG,iBAAiB,CAEtE"}
@@ -0,0 +1,147 @@
1
+ import { z } from "zod";
2
+ export declare const generateHeaderOptionsSchema: z.ZodOptional<z.ZodObject<{
3
+ version: z.ZodOptional<z.ZodString>;
4
+ encoding: z.ZodOptional<z.ZodString>;
5
+ charset: z.ZodOptional<z.ZodString>;
6
+ }, z.core.$strip>>;
7
+ export type GenerateHeaderOptions = z.infer<typeof generateHeaderOptionsSchema>;
8
+ export declare function generateHeader(options?: GenerateHeaderOptions): string;
9
+ export declare const generateTransactionInputSchema: z.ZodObject<{
10
+ type: z.ZodEnum<{
11
+ CREDIT: "CREDIT";
12
+ DEBIT: "DEBIT";
13
+ INT: "INT";
14
+ DIV: "DIV";
15
+ FEE: "FEE";
16
+ SRVCHG: "SRVCHG";
17
+ DEP: "DEP";
18
+ ATM: "ATM";
19
+ POS: "POS";
20
+ XFER: "XFER";
21
+ CHECK: "CHECK";
22
+ PAYMENT: "PAYMENT";
23
+ CASH: "CASH";
24
+ DIRECTDEP: "DIRECTDEP";
25
+ DIRECTDEBIT: "DIRECTDEBIT";
26
+ REPEATPMT: "REPEATPMT";
27
+ HOLD: "HOLD";
28
+ OTHER: "OTHER";
29
+ }>;
30
+ datePosted: z.ZodDate;
31
+ amount: z.ZodNumber;
32
+ fitId: z.ZodString;
33
+ name: z.ZodOptional<z.ZodString>;
34
+ memo: z.ZodOptional<z.ZodString>;
35
+ checkNum: z.ZodOptional<z.ZodString>;
36
+ refNum: z.ZodOptional<z.ZodString>;
37
+ }, z.core.$strip>;
38
+ export type GenerateTransactionInput = z.infer<typeof generateTransactionInputSchema>;
39
+ export declare const generateBankStatementOptionsSchema: z.ZodObject<{
40
+ bankId: z.ZodString;
41
+ accountId: z.ZodString;
42
+ accountType: z.ZodEnum<{
43
+ CHECKING: "CHECKING";
44
+ SAVINGS: "SAVINGS";
45
+ MONEYMRKT: "MONEYMRKT";
46
+ CREDITLINE: "CREDITLINE";
47
+ CD: "CD";
48
+ }>;
49
+ currency: z.ZodString;
50
+ startDate: z.ZodDate;
51
+ endDate: z.ZodDate;
52
+ transactions: z.ZodArray<z.ZodObject<{
53
+ type: z.ZodEnum<{
54
+ CREDIT: "CREDIT";
55
+ DEBIT: "DEBIT";
56
+ INT: "INT";
57
+ DIV: "DIV";
58
+ FEE: "FEE";
59
+ SRVCHG: "SRVCHG";
60
+ DEP: "DEP";
61
+ ATM: "ATM";
62
+ POS: "POS";
63
+ XFER: "XFER";
64
+ CHECK: "CHECK";
65
+ PAYMENT: "PAYMENT";
66
+ CASH: "CASH";
67
+ DIRECTDEP: "DIRECTDEP";
68
+ DIRECTDEBIT: "DIRECTDEBIT";
69
+ REPEATPMT: "REPEATPMT";
70
+ HOLD: "HOLD";
71
+ OTHER: "OTHER";
72
+ }>;
73
+ datePosted: z.ZodDate;
74
+ amount: z.ZodNumber;
75
+ fitId: z.ZodString;
76
+ name: z.ZodOptional<z.ZodString>;
77
+ memo: z.ZodOptional<z.ZodString>;
78
+ checkNum: z.ZodOptional<z.ZodString>;
79
+ refNum: z.ZodOptional<z.ZodString>;
80
+ }, z.core.$strip>>;
81
+ ledgerBalance: z.ZodOptional<z.ZodObject<{
82
+ amount: z.ZodNumber;
83
+ asOfDate: z.ZodDate;
84
+ }, z.core.$strip>>;
85
+ availableBalance: z.ZodOptional<z.ZodObject<{
86
+ amount: z.ZodNumber;
87
+ asOfDate: z.ZodDate;
88
+ }, z.core.$strip>>;
89
+ financialInstitution: z.ZodOptional<z.ZodObject<{
90
+ org: z.ZodOptional<z.ZodString>;
91
+ fid: z.ZodOptional<z.ZodString>;
92
+ }, z.core.$strip>>;
93
+ language: z.ZodOptional<z.ZodString>;
94
+ }, z.core.$strip>;
95
+ export type GenerateBankStatementOptions = z.infer<typeof generateBankStatementOptionsSchema>;
96
+ export declare function generateBankStatement(options: GenerateBankStatementOptions): string;
97
+ export declare const generateCreditCardStatementOptionsSchema: z.ZodObject<{
98
+ accountId: z.ZodString;
99
+ currency: z.ZodString;
100
+ startDate: z.ZodDate;
101
+ endDate: z.ZodDate;
102
+ transactions: z.ZodArray<z.ZodObject<{
103
+ type: z.ZodEnum<{
104
+ CREDIT: "CREDIT";
105
+ DEBIT: "DEBIT";
106
+ INT: "INT";
107
+ DIV: "DIV";
108
+ FEE: "FEE";
109
+ SRVCHG: "SRVCHG";
110
+ DEP: "DEP";
111
+ ATM: "ATM";
112
+ POS: "POS";
113
+ XFER: "XFER";
114
+ CHECK: "CHECK";
115
+ PAYMENT: "PAYMENT";
116
+ CASH: "CASH";
117
+ DIRECTDEP: "DIRECTDEP";
118
+ DIRECTDEBIT: "DIRECTDEBIT";
119
+ REPEATPMT: "REPEATPMT";
120
+ HOLD: "HOLD";
121
+ OTHER: "OTHER";
122
+ }>;
123
+ datePosted: z.ZodDate;
124
+ amount: z.ZodNumber;
125
+ fitId: z.ZodString;
126
+ name: z.ZodOptional<z.ZodString>;
127
+ memo: z.ZodOptional<z.ZodString>;
128
+ checkNum: z.ZodOptional<z.ZodString>;
129
+ refNum: z.ZodOptional<z.ZodString>;
130
+ }, z.core.$strip>>;
131
+ ledgerBalance: z.ZodOptional<z.ZodObject<{
132
+ amount: z.ZodNumber;
133
+ asOfDate: z.ZodDate;
134
+ }, z.core.$strip>>;
135
+ availableBalance: z.ZodOptional<z.ZodObject<{
136
+ amount: z.ZodNumber;
137
+ asOfDate: z.ZodDate;
138
+ }, z.core.$strip>>;
139
+ financialInstitution: z.ZodOptional<z.ZodObject<{
140
+ org: z.ZodOptional<z.ZodString>;
141
+ fid: z.ZodOptional<z.ZodString>;
142
+ }, z.core.$strip>>;
143
+ language: z.ZodOptional<z.ZodString>;
144
+ }, z.core.$strip>;
145
+ export type GenerateCreditCardStatementOptions = z.infer<typeof generateCreditCardStatementOptionsSchema>;
146
+ export declare function generateCreditCardStatement(options: GenerateCreditCardStatementOptions): string;
147
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,2BAA2B;;;;kBAM1B,CAAC;AAEf,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,MAAM,CAiBtE;AAED,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBASzC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAC3C,OAAO,8BAA8B,CACvC,CAAC;AAsCF,eAAO,MAAM,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAY7C,CAAC;AAEH,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAC/C,OAAO,kCAAkC,CAC3C,CAAC;AAEF,wBAAgB,qBAAqB,CAClC,OAAO,EAAE,4BAA4B,GACrC,MAAM,CAwER;AAED,eAAO,MAAM,wCAAwC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAUnD,CAAC;AAEH,MAAM,MAAM,kCAAkC,GAAG,CAAC,CAAC,KAAK,CACrD,OAAO,wCAAwC,CACjD,CAAC;AAEF,wBAAgB,2BAA2B,CACxC,OAAO,EAAE,kCAAkC,GAC3C,MAAM,CAsER"}
package/dist/index.d.ts CHANGED
@@ -1,190 +1,7 @@
1
- import { z } from "zod";
2
- declare const ofxDateSchema: any;
3
- type OFXDate = z.infer<typeof ofxDateSchema>;
4
- declare const statusSchema: any;
5
- type OFXStatus = z.infer<typeof statusSchema>;
6
- declare const financialInstitutionSchema: any;
7
- type OFXFinancialInstitution = z.infer<typeof financialInstitutionSchema>;
8
- declare const transactionTypeSchema: any;
9
- type OFXTransactionType = z.infer<typeof transactionTypeSchema>;
10
- declare const transactionSchema: any;
11
- type OFXTransaction = z.infer<typeof transactionSchema>;
12
- declare const accountTypeSchema: any;
13
- type OFXAccountType = z.infer<typeof accountTypeSchema>;
14
- declare const bankAccountSchema: any;
15
- type OFXBankAccount = z.infer<typeof bankAccountSchema>;
16
- declare const creditCardAccountSchema: any;
17
- type OFXCreditCardAccount = z.infer<typeof creditCardAccountSchema>;
18
- declare const balanceSchema: any;
19
- type OFXBalance = z.infer<typeof balanceSchema>;
20
- declare const transactionListSchema: any;
21
- type OFXTransactionList = z.infer<typeof transactionListSchema>;
22
- declare const bankStatementResponseSchema: any;
23
- type OFXBankStatementResponse = z.infer<typeof bankStatementResponseSchema>;
24
- declare const creditCardStatementResponseSchema: any;
25
- type OFXCreditCardStatementResponse = z.infer<typeof creditCardStatementResponseSchema>;
26
- declare const signOnResponseSchema: any;
27
- type OFXSignOnResponse = z.infer<typeof signOnResponseSchema>;
28
- declare const bankStatementTransactionResponseSchema: any;
29
- type OFXBankStatementTransactionResponse = z.infer<typeof bankStatementTransactionResponseSchema>;
30
- declare const creditCardStatementTransactionResponseSchema: any;
31
- type OFXCreditCardStatementTransactionResponse = z.infer<typeof creditCardStatementTransactionResponseSchema>;
32
- declare const bankMessageSetResponseSchema: any;
33
- type OFXBankMessageSetResponse = z.infer<typeof bankMessageSetResponseSchema>;
34
- declare const creditCardMessageSetResponseSchema: any;
35
- type OFXCreditCardMessageSetResponse = z.infer<typeof creditCardMessageSetResponseSchema>;
36
- declare const signOnMessageSetResponseSchema: any;
37
- type OFXSignOnMessageSetResponse = z.infer<typeof signOnMessageSetResponseSchema>;
38
- declare const ofxResponseSchema: any;
39
- type OFXResponse = z.infer<typeof ofxResponseSchema>;
40
- declare const ofxHeaderSchema: any;
41
- type OFXHeader = z.infer<typeof ofxHeaderSchema>;
42
- declare const ofxDocumentSchema: any;
43
- type OFXDocument = z.infer<typeof ofxDocumentSchema>;
44
- interface BalanceInfo {
45
- ledger?: OFXBalance;
46
- available?: OFXBalance;
47
- }
48
- declare function getTransactions(document: OFXDocument): OFXTransaction[];
49
- declare function getAccountInfo(document: OFXDocument): (OFXBankAccount | OFXCreditCardAccount)[];
50
- declare function getBalance(document: OFXDocument): BalanceInfo[];
51
- declare function getSignOnInfo(document: OFXDocument): OFXSignOnResponse;
52
- import { z as z2 } from "zod";
53
- declare const generateHeaderOptionsSchema: any;
54
- type GenerateHeaderOptions = z2.infer<typeof generateHeaderOptionsSchema>;
55
- declare function generateHeader(options?: GenerateHeaderOptions): string;
56
- declare const generateTransactionInputSchema: any;
57
- type GenerateTransactionInput = z2.infer<typeof generateTransactionInputSchema>;
58
- declare const generateBankStatementOptionsSchema: any;
59
- type GenerateBankStatementOptions = z2.infer<typeof generateBankStatementOptionsSchema>;
60
- declare function generateBankStatement(options: GenerateBankStatementOptions): string;
61
- declare const generateCreditCardStatementOptionsSchema: any;
62
- type GenerateCreditCardStatementOptions = z2.infer<typeof generateCreditCardStatementOptionsSchema>;
63
- declare function generateCreditCardStatement(options: GenerateCreditCardStatementOptions): string;
64
- import { z as z3 } from "zod";
65
- declare function getEncodingFromCharset(charset?: string): string;
66
- type ParseResult<T> = {
67
- success: true;
68
- data: T;
69
- } | {
70
- success: false;
71
- error: z3.ZodError;
72
- };
73
- declare function parse(content: string): ParseResult<OFXDocument>;
74
- declare function parseOrThrow(content: string): OFXDocument;
75
- /**
76
- * Decodes an OFX buffer to a string with proper charset detection.
77
- * Automatically detects encoding from OFX header (CHARSET field).
78
- */
79
- declare function decodeOfxBuffer(buffer: Uint8Array): string;
80
- declare function parseBuffer(buffer: Uint8Array): ParseResult<OFXDocument>;
81
- declare function parseBufferOrThrow(buffer: Uint8Array): OFXDocument;
82
- interface StreamOptions {
83
- encoding?: string;
84
- }
85
- type StreamEvent = {
86
- type: "header";
87
- data: OFXHeader;
88
- } | {
89
- type: "transaction";
90
- data: OFXTransaction;
91
- } | {
92
- type: "account";
93
- data: OFXBankAccount | OFXCreditCardAccount;
94
- } | {
95
- type: "balance";
96
- data: {
97
- ledger?: OFXBalance;
98
- available?: OFXBalance;
99
- };
100
- } | {
101
- type: "complete";
102
- transactionCount: number;
103
- };
104
- interface BatchFileInput {
105
- filename: string;
106
- buffer: Uint8Array;
107
- }
108
- type BatchStreamEvent = {
109
- type: "file_start";
110
- fileIndex: number;
111
- filename: string;
112
- } | {
113
- type: "header";
114
- fileIndex: number;
115
- data: OFXHeader;
116
- } | {
117
- type: "transaction";
118
- fileIndex: number;
119
- data: OFXTransaction;
120
- } | {
121
- type: "account";
122
- fileIndex: number;
123
- data: OFXBankAccount | OFXCreditCardAccount;
124
- } | {
125
- type: "balance";
126
- fileIndex: number;
127
- data: {
128
- ledger?: OFXBalance;
129
- available?: OFXBalance;
130
- };
131
- } | {
132
- type: "file_complete";
133
- fileIndex: number;
134
- filename: string;
135
- transactionCount: number;
136
- } | {
137
- type: "file_error";
138
- fileIndex: number;
139
- filename: string;
140
- error: string;
141
- } | {
142
- type: "batch_complete";
143
- totalFiles: number;
144
- totalTransactions: number;
145
- errorCount: number;
146
- };
147
- interface BatchParsedFile {
148
- fileIndex: number;
149
- filename: string;
150
- header?: OFXHeader;
151
- transactions: OFXTransaction[];
152
- accounts: (OFXBankAccount | OFXCreditCardAccount)[];
153
- balances: {
154
- ledger?: OFXBalance;
155
- available?: OFXBalance;
156
- }[];
157
- error?: string;
158
- }
159
- declare function parseStream(input: ReadableStream<Uint8Array> | AsyncIterable<string>, options?: StreamOptions): AsyncGenerator<StreamEvent>;
160
- declare function parseStreamToArray(input: ReadableStream<Uint8Array> | AsyncIterable<string>, options?: StreamOptions): Promise<{
161
- header?: OFXHeader;
162
- transactions: OFXTransaction[];
163
- accounts: (OFXBankAccount | OFXCreditCardAccount)[];
164
- balances: {
165
- ledger?: OFXBalance;
166
- available?: OFXBalance;
167
- }[];
168
- }>;
169
- /**
170
- * Streaming batch parser - processes files sequentially, yielding events.
171
- * Yields control between files for UI responsiveness.
172
- *
173
- * @param files - Array of files with filename and buffer
174
- * @param options - Stream options (encoding)
175
- * @yields BatchStreamEvent for each file start, transaction, completion, or error
176
- */
177
- declare function parseBatchStream(files: BatchFileInput[], options?: StreamOptions): AsyncGenerator<BatchStreamEvent>;
178
- /**
179
- * Convenience function that collects streaming batch results into arrays.
180
- *
181
- * @param files - Array of files with filename and buffer
182
- * @param options - Stream options (encoding)
183
- * @returns Array of parsed file results
184
- */
185
- declare function parseBatchStreamToArray(files: BatchFileInput[], options?: StreamOptions): Promise<BatchParsedFile[]>;
186
- declare function formatOfxDate(date: Date, timezone?: {
187
- offset: number;
188
- name: string;
189
- }): string;
190
- export { parseStreamToArray, parseStream, parseOrThrow, parseBufferOrThrow, parseBuffer, parseBatchStreamToArray, parseBatchStream, parse, getTransactions, getSignOnInfo, getEncodingFromCharset, getBalance, getAccountInfo, generateTransactionInputSchema, generateHeaderOptionsSchema, generateHeader, generateCreditCardStatementOptionsSchema, generateCreditCardStatement, generateBankStatementOptionsSchema, generateBankStatement, formatOfxDate, decodeOfxBuffer, StreamOptions, StreamEvent, ParseResult, OFXTransactionType, OFXTransactionList, OFXTransaction, OFXStatus, OFXSignOnResponse, OFXSignOnMessageSetResponse, OFXResponse, OFXHeader, OFXFinancialInstitution, OFXDocument, OFXDate, OFXCreditCardStatementTransactionResponse, OFXCreditCardStatementResponse, OFXCreditCardMessageSetResponse, OFXCreditCardAccount, OFXBankStatementTransactionResponse, OFXBankStatementResponse, OFXBankMessageSetResponse, OFXBankAccount, OFXBalance, OFXAccountType, GenerateTransactionInput, GenerateHeaderOptions, GenerateCreditCardStatementOptions, GenerateBankStatementOptions, BatchStreamEvent, BatchParsedFile, BatchFileInput, BalanceInfo };
1
+ export { type BalanceInfo, getAccountInfo, getBalance, getSignOnInfo, getTransactions, } from "./extractors";
2
+ export { type GenerateBankStatementOptions, type GenerateCreditCardStatementOptions, type GenerateHeaderOptions, type GenerateTransactionInput, generateBankStatement, generateBankStatementOptionsSchema, generateCreditCardStatement, generateCreditCardStatementOptionsSchema, generateHeader, generateHeaderOptionsSchema, generateTransactionInputSchema, } from "./generator";
3
+ export { decodeOfxBuffer, getEncodingFromCharset, type ParseResult, parse, parseBuffer, parseBufferOrThrow, parseOrThrow, } from "./parser";
4
+ export type { OFXAccountType, OFXBalance, OFXBankAccount, OFXBankMessageSetResponse, OFXBankStatementResponse, OFXBankStatementTransactionResponse, OFXCreditCardAccount, OFXCreditCardMessageSetResponse, OFXCreditCardStatementResponse, OFXCreditCardStatementTransactionResponse, OFXDate, OFXDocument, OFXFinancialInstitution, OFXHeader, OFXResponse, OFXSignOnMessageSetResponse, OFXSignOnResponse, OFXStatus, OFXTransaction, OFXTransactionList, OFXTransactionType, } from "./schemas";
5
+ export { type BatchFileInput, type BatchParsedFile, type BatchStreamEvent, parseBatchStream, parseBatchStreamToArray, parseStream, parseStreamToArray, type StreamEvent, type StreamOptions, } from "./stream";
6
+ export { formatOfxDate } from "./utils";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACJ,KAAK,WAAW,EAChB,cAAc,EACd,UAAU,EACV,aAAa,EACb,eAAe,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EACJ,KAAK,4BAA4B,EACjC,KAAK,kCAAkC,EACvC,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,qBAAqB,EACrB,kCAAkC,EAClC,2BAA2B,EAC3B,wCAAwC,EACxC,cAAc,EACd,2BAA2B,EAC3B,8BAA8B,GAChC,MAAM,aAAa,CAAC;AACrB,OAAO,EACJ,eAAe,EACf,sBAAsB,EACtB,KAAK,WAAW,EAChB,KAAK,EACL,WAAW,EACX,kBAAkB,EAClB,YAAY,GACd,MAAM,UAAU,CAAC;AAClB,YAAY,EACT,cAAc,EACd,UAAU,EACV,cAAc,EACd,yBAAyB,EACzB,wBAAwB,EACxB,mCAAmC,EACnC,oBAAoB,EACpB,+BAA+B,EAC/B,8BAA8B,EAC9B,yCAAyC,EACzC,OAAO,EACP,WAAW,EACX,uBAAuB,EACvB,SAAS,EACT,WAAW,EACX,2BAA2B,EAC3B,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,kBAAkB,GACpB,MAAM,WAAW,CAAC;AACnB,OAAO,EACJ,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,gBAAgB,EAChB,uBAAuB,EACvB,WAAW,EACX,kBAAkB,EAClB,KAAK,WAAW,EAChB,KAAK,aAAa,GACpB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ // @bun
1
2
  // src/utils.ts
2
3
  var toArray = (value) => Array.isArray(value) ? value : [value];
3
4
  var ENTITY_MAP = {
@@ -1255,3 +1256,5 @@ export {
1255
1256
  formatOfxDate,
1256
1257
  decodeOfxBuffer
1257
1258
  };
1259
+
1260
+ //# debugId=7C69B4A1D0DBA73E64756E2164756E21
@@ -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
+ }