@lunchflow/actual-flow 0.0.6 → 0.0.7
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/README.md +61 -3
- package/dist/importer.d.ts +1 -1
- package/dist/importer.d.ts.map +1 -1
- package/dist/importer.js +20 -2
- package/dist/importer.js.map +1 -1
- package/dist/lunch-flow-client.d.ts +4 -0
- package/dist/lunch-flow-client.d.ts.map +1 -1
- package/dist/lunch-flow-client.js +49 -17
- package/dist/lunch-flow-client.js.map +1 -1
- package/package.json +1 -1
- package/src/importer.ts +20 -2
- package/src/lunch-flow-client.ts +63 -16
package/README.md
CHANGED
|
@@ -23,9 +23,10 @@
|
|
|
23
23
|
- 🔗 **Easy Setup**: Simple configuration process for both Lunch Flow and Actual Budget connections
|
|
24
24
|
- 📋 **Account Mapping**: Interactive terminal UI to map Lunch Flow accounts to Actual Budget accounts
|
|
25
25
|
- 📊 **Transaction Import**: Import transactions with proper mapping and deduplication
|
|
26
|
-
-
|
|
26
|
+
- 📅 **Sync Start Dates**: Configure per-account sync start dates to control import scope
|
|
27
27
|
- 🔍 **Connection Testing**: Test and verify connections to both services
|
|
28
28
|
- 📱 **Terminal UI**: Beautiful, interactive command-line interface
|
|
29
|
+
- 🚀 **Direct Import Command**: Run imports directly from command line for automation
|
|
29
30
|
- 🔄 **Deduplication**: Prevents importing duplicate transactions
|
|
30
31
|
|
|
31
32
|
## Installation
|
|
@@ -56,7 +57,22 @@ Configuration is saved to `config.json` in the project directory.
|
|
|
56
57
|
|
|
57
58
|
## Usage
|
|
58
59
|
|
|
59
|
-
###
|
|
60
|
+
### Command Line Interface
|
|
61
|
+
|
|
62
|
+
The tool supports both interactive and non-interactive modes:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Interactive mode (default)
|
|
66
|
+
actual-flow
|
|
67
|
+
|
|
68
|
+
# Direct import (non-interactive)
|
|
69
|
+
actual-flow import
|
|
70
|
+
|
|
71
|
+
# Show help
|
|
72
|
+
actual-flow help
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Main Menu (Interactive Mode)
|
|
60
76
|
|
|
61
77
|
The tool provides an interactive menu with the following options:
|
|
62
78
|
|
|
@@ -75,15 +91,57 @@ When configuring account mappings, you'll see:
|
|
|
75
91
|
1. All available Lunch Flow accounts
|
|
76
92
|
2. All available Actual Budget accounts
|
|
77
93
|
3. Interactive selection to map each Lunch Flow account to an Actual Budget account
|
|
78
|
-
4.
|
|
94
|
+
4. **Optional sync start date** for each mapping (YYYY-MM-DD format)
|
|
95
|
+
5. Option to skip accounts that don't need mapping
|
|
96
|
+
|
|
97
|
+
#### Sync Start Dates
|
|
98
|
+
|
|
99
|
+
You can configure a sync start date for each account mapping to control which transactions are imported:
|
|
100
|
+
- Only transactions on or after the specified date will be imported
|
|
101
|
+
- Leave empty to import all available transactions
|
|
102
|
+
- Useful for limiting historical data or starting fresh with specific accounts
|
|
79
103
|
|
|
80
104
|
### Transaction Import
|
|
81
105
|
|
|
106
|
+
#### Interactive Mode
|
|
82
107
|
1. Review a preview of transactions to be imported
|
|
83
108
|
2. Confirm the import
|
|
84
109
|
3. Monitor progress with real-time feedback
|
|
85
110
|
4. Automatic deduplication prevents importing existing transactions
|
|
86
111
|
|
|
112
|
+
#### Non-Interactive Mode (`actual-flow import`)
|
|
113
|
+
1. Automatically imports transactions without confirmation prompts
|
|
114
|
+
2. Perfect for automation, cron jobs, or CI/CD pipelines
|
|
115
|
+
3. Shows transaction preview and processing summary
|
|
116
|
+
4. Respects configured sync start dates for each account
|
|
117
|
+
|
|
118
|
+
## Automation Examples
|
|
119
|
+
|
|
120
|
+
### Cron Job
|
|
121
|
+
```bash
|
|
122
|
+
# Run import every day at 2 AM
|
|
123
|
+
0 2 * * * /path/to/actual-flow import
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### GitHub Actions
|
|
127
|
+
```yaml
|
|
128
|
+
name: Import Transactions
|
|
129
|
+
on:
|
|
130
|
+
schedule:
|
|
131
|
+
- cron: '0 2 * * *' # Daily at 2 AM
|
|
132
|
+
jobs:
|
|
133
|
+
import:
|
|
134
|
+
runs-on: ubuntu-latest
|
|
135
|
+
steps:
|
|
136
|
+
- uses: actions/checkout@v3
|
|
137
|
+
- uses: actions/setup-node@v3
|
|
138
|
+
with:
|
|
139
|
+
node-version: '18'
|
|
140
|
+
- run: npx @lunchflow/actual-flow import
|
|
141
|
+
env:
|
|
142
|
+
LUNCHFLOW_API_KEY: ${{ secrets.LUNCHFLOW_API_KEY }}
|
|
143
|
+
```
|
|
144
|
+
|
|
87
145
|
---
|
|
88
146
|
|
|
89
147
|
Made with ❤️ for the Actual Budget community
|
package/dist/importer.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ export declare class LunchFlowImporter {
|
|
|
11
11
|
private updateClients;
|
|
12
12
|
testConnections(): Promise<ConnectionStatus>;
|
|
13
13
|
configureAccountMappings(): Promise<void>;
|
|
14
|
-
importTransactions(skipConfirmation?: boolean): Promise<void>;
|
|
14
|
+
importTransactions(skipConfirmation?: boolean, throwOnError?: boolean): Promise<void>;
|
|
15
15
|
showCurrentMappings(): Promise<void>;
|
|
16
16
|
listAvailableBudgets(): Promise<void>;
|
|
17
17
|
reconfigureCredentials(): Promise<void>;
|
package/dist/importer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"importer.d.ts","sourceRoot":"","sources":["../src/importer.ts"],"names":[],"mappings":"AAKA,OAAO,EAA0B,gBAAgB,EAAwB,MAAM,SAAS,CAAC;AAIzF,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,EAAE,CAAa;IACvB,OAAO,CAAC,MAAM,CAAuB;;IAY/B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAYnB,kBAAkB;IAehC,OAAO,CAAC,aAAa;IAcf,eAAe,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAoB5C,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC;IAsCzC,kBAAkB,CAAC,gBAAgB,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"importer.d.ts","sourceRoot":"","sources":["../src/importer.ts"],"names":[],"mappings":"AAKA,OAAO,EAA0B,gBAAgB,EAAwB,MAAM,SAAS,CAAC;AAIzF,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,EAAE,CAAa;IACvB,OAAO,CAAC,MAAM,CAAuB;;IAY/B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAYnB,kBAAkB;IAehC,OAAO,CAAC,aAAa;IAcf,eAAe,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAoB5C,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC;IAsCzC,kBAAkB,CAAC,gBAAgB,GAAE,OAAe,EAAE,YAAY,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAmInG,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAQpC,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAkCrC,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBvC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAiCpB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;CAKjC"}
|
package/dist/importer.js
CHANGED
|
@@ -98,15 +98,21 @@ class LunchFlowImporter {
|
|
|
98
98
|
this.ui.showError('Failed to configure account mappings');
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
|
-
async importTransactions(skipConfirmation = false) {
|
|
101
|
+
async importTransactions(skipConfirmation = false, throwOnError = false) {
|
|
102
102
|
if (!this.config || this.config.accountMappings.length === 0) {
|
|
103
103
|
this.ui.showError('No account mappings configured. Please configure mappings first.');
|
|
104
|
+
if (throwOnError) {
|
|
105
|
+
throw new Error('No account mappings configured');
|
|
106
|
+
}
|
|
104
107
|
return;
|
|
105
108
|
}
|
|
106
109
|
// Test connections first
|
|
107
110
|
const status = await this.testConnections();
|
|
108
111
|
if (!status.lunchFlow || !status.actualBudget) {
|
|
109
112
|
this.ui.showError('Cannot import: connections failed');
|
|
113
|
+
if (throwOnError) {
|
|
114
|
+
throw new Error('Connection test failed');
|
|
115
|
+
}
|
|
110
116
|
return;
|
|
111
117
|
}
|
|
112
118
|
const spinner = this.ui.showSpinner('Fetching transactions from all mapped accounts...');
|
|
@@ -158,12 +164,18 @@ class LunchFlowImporter {
|
|
|
158
164
|
console.log(table.toString());
|
|
159
165
|
if (allLfTransactions.length === 0) {
|
|
160
166
|
this.ui.showInfo('No transactions found for any of the mapped accounts');
|
|
167
|
+
if (throwOnError) {
|
|
168
|
+
throw new Error('No transactions found');
|
|
169
|
+
}
|
|
161
170
|
return;
|
|
162
171
|
}
|
|
163
172
|
const mapper = new transaction_mapper_1.TransactionMapper(this.config.accountMappings);
|
|
164
173
|
const abTransactions = mapper.mapTransactions(allLfTransactions);
|
|
165
174
|
if (abTransactions.length === 0) {
|
|
166
175
|
this.ui.showError('No transactions could be mapped to Actual Budget accounts');
|
|
176
|
+
if (throwOnError) {
|
|
177
|
+
throw new Error('No transactions could be mapped');
|
|
178
|
+
}
|
|
167
179
|
return;
|
|
168
180
|
}
|
|
169
181
|
const startDate = abTransactions.reduce((min, t) => t.date < min ? t.date : min, abTransactions[0].date);
|
|
@@ -175,6 +187,9 @@ class LunchFlowImporter {
|
|
|
175
187
|
const confirmed = await this.ui.confirmImport(abTransactions.length, { startDate, endDate });
|
|
176
188
|
if (!confirmed) {
|
|
177
189
|
this.ui.showInfo('Import cancelled');
|
|
190
|
+
if (throwOnError) {
|
|
191
|
+
throw new Error('Import cancelled by user');
|
|
192
|
+
}
|
|
178
193
|
return;
|
|
179
194
|
}
|
|
180
195
|
}
|
|
@@ -191,6 +206,9 @@ class LunchFlowImporter {
|
|
|
191
206
|
spinner.stop();
|
|
192
207
|
this.ui.showError('Failed to import transactions');
|
|
193
208
|
console.error('Import error:', error);
|
|
209
|
+
if (throwOnError) {
|
|
210
|
+
throw error;
|
|
211
|
+
}
|
|
194
212
|
}
|
|
195
213
|
}
|
|
196
214
|
async showCurrentMappings() {
|
|
@@ -280,7 +298,7 @@ class LunchFlowImporter {
|
|
|
280
298
|
}
|
|
281
299
|
async runImport() {
|
|
282
300
|
await this.initialize();
|
|
283
|
-
await this.importTransactions(true); // Skip confirmation in non-interactive mode
|
|
301
|
+
await this.importTransactions(true, true); // Skip confirmation and throw on error in non-interactive mode
|
|
284
302
|
await this.abClient.shutdown();
|
|
285
303
|
}
|
|
286
304
|
}
|
package/dist/importer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"importer.js","sourceRoot":"","sources":["../src/importer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"importer.js","sourceRoot":"","sources":["../src/importer.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,11 @@ import { LunchFlowTransaction, LunchFlowAccount, LunchFlowAccountId } from './ty
|
|
|
2
2
|
export declare class LunchFlowClient {
|
|
3
3
|
private client;
|
|
4
4
|
private apiKey;
|
|
5
|
+
private readonly maxRetries;
|
|
5
6
|
constructor(apiKey: string, baseUrl?: string);
|
|
7
|
+
private retryWithBackoff;
|
|
8
|
+
private isRetriableError;
|
|
9
|
+
private sleep;
|
|
6
10
|
testConnection(): Promise<boolean>;
|
|
7
11
|
getAccounts(): Promise<LunchFlowAccount[]>;
|
|
8
12
|
getTransactions(accountId: LunchFlowAccountId): Promise<LunchFlowTransaction[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lunch-flow-client.d.ts","sourceRoot":"","sources":["../src/lunch-flow-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAErF,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAS;
|
|
1
|
+
{"version":3,"file":"lunch-flow-client.d.ts","sourceRoot":"","sources":["../src/lunch-flow-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAErF,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;gBAE5B,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAoC;YAY3D,gBAAgB;IA4B9B,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,KAAK;IAIP,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAalC,WAAW,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAc1C,eAAe,CAAC,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;CAatF"}
|
|
@@ -7,6 +7,7 @@ exports.LunchFlowClient = void 0;
|
|
|
7
7
|
const axios_1 = __importDefault(require("axios"));
|
|
8
8
|
class LunchFlowClient {
|
|
9
9
|
constructor(apiKey, baseUrl = 'https://api.lunchflow.com') {
|
|
10
|
+
this.maxRetries = 3;
|
|
10
11
|
this.apiKey = apiKey;
|
|
11
12
|
this.client = axios_1.default.create({
|
|
12
13
|
baseURL: baseUrl,
|
|
@@ -14,22 +15,61 @@ class LunchFlowClient {
|
|
|
14
15
|
'x-api-key': apiKey,
|
|
15
16
|
'Content-Type': 'application/json',
|
|
16
17
|
},
|
|
17
|
-
timeout:
|
|
18
|
+
timeout: 60000,
|
|
18
19
|
});
|
|
19
20
|
}
|
|
21
|
+
async retryWithBackoff(operation, operationName, retryCount = 0) {
|
|
22
|
+
try {
|
|
23
|
+
return await operation();
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
const isRetriableError = this.isRetriableError(error);
|
|
27
|
+
if (retryCount < this.maxRetries && isRetriableError) {
|
|
28
|
+
const backoffDelay = Math.pow(2, retryCount) * 1000; // Exponential backoff: 1s, 2s, 4s
|
|
29
|
+
console.log(`${operationName} failed (attempt ${retryCount + 1}/${this.maxRetries + 1}). Retrying in ${backoffDelay}ms...`);
|
|
30
|
+
console.log(`Error: ${error.message}`);
|
|
31
|
+
await this.sleep(backoffDelay);
|
|
32
|
+
return this.retryWithBackoff(operation, operationName, retryCount + 1);
|
|
33
|
+
}
|
|
34
|
+
// Log final failure
|
|
35
|
+
if (retryCount >= this.maxRetries) {
|
|
36
|
+
console.error(`${operationName} failed after ${this.maxRetries + 1} attempts. Final error: ${error.message}`);
|
|
37
|
+
}
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
isRetriableError(error) {
|
|
42
|
+
// Retry on network errors, timeouts, and 5xx server errors
|
|
43
|
+
if (error.code === 'ECONNRESET' || error.code === 'ETIMEDOUT' || error.code === 'ENOTFOUND') {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
if (error.response?.status >= 500) {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
// Retry on timeout errors
|
|
50
|
+
if (error.code === 'ECONNABORTED' && error.message.includes('timeout')) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
sleep(ms) {
|
|
56
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
57
|
+
}
|
|
20
58
|
async testConnection() {
|
|
21
59
|
try {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
60
|
+
return await this.retryWithBackoff(async () => {
|
|
61
|
+
// Try to get accounts as a health check
|
|
62
|
+
const response = await this.client.get('/accounts');
|
|
63
|
+
return response.status === 200;
|
|
64
|
+
}, 'Test Lunch Flow connection');
|
|
25
65
|
}
|
|
26
66
|
catch (error) {
|
|
27
|
-
console.error('Lunch Flow connection test failed:', error.message);
|
|
67
|
+
console.error('Lunch Flow connection test failed after all retries:', error.message);
|
|
28
68
|
return false;
|
|
29
69
|
}
|
|
30
70
|
}
|
|
31
71
|
async getAccounts() {
|
|
32
|
-
|
|
72
|
+
return this.retryWithBackoff(async () => {
|
|
33
73
|
const response = await this.client.get('/accounts');
|
|
34
74
|
// Handle different possible response structures
|
|
35
75
|
if (Array.isArray(response.data.accounts)) {
|
|
@@ -39,14 +79,10 @@ class LunchFlowClient {
|
|
|
39
79
|
console.warn('Unexpected response structure from Lunch Flow accounts endpoint');
|
|
40
80
|
return [];
|
|
41
81
|
}
|
|
42
|
-
}
|
|
43
|
-
catch (error) {
|
|
44
|
-
console.error('Failed to fetch Lunch Flow accounts:', error.message);
|
|
45
|
-
throw new Error(`Failed to fetch accounts: ${error.message}`);
|
|
46
|
-
}
|
|
82
|
+
}, 'Fetch Lunch Flow accounts');
|
|
47
83
|
}
|
|
48
84
|
async getTransactions(accountId) {
|
|
49
|
-
|
|
85
|
+
return this.retryWithBackoff(async () => {
|
|
50
86
|
const response = await this.client.get(`/accounts/${accountId}/transactions`);
|
|
51
87
|
// Handle different possible response structures
|
|
52
88
|
if (Array.isArray(response.data.transactions)) {
|
|
@@ -56,11 +92,7 @@ class LunchFlowClient {
|
|
|
56
92
|
console.warn('Unexpected response structure from Lunch Flow transactions endpoint');
|
|
57
93
|
return [];
|
|
58
94
|
}
|
|
59
|
-
}
|
|
60
|
-
catch (error) {
|
|
61
|
-
console.error('Failed to fetch Lunch Flow transactions:', error.message);
|
|
62
|
-
throw new Error(`Failed to fetch transactions: ${error.message}`);
|
|
63
|
-
}
|
|
95
|
+
}, `Fetch transactions for account ${accountId}`);
|
|
64
96
|
}
|
|
65
97
|
}
|
|
66
98
|
exports.LunchFlowClient = LunchFlowClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lunch-flow-client.js","sourceRoot":"","sources":["../src/lunch-flow-client.ts"],"names":[],"mappings":";;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"lunch-flow-client.js","sourceRoot":"","sources":["../src/lunch-flow-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/importer.ts
CHANGED
|
@@ -123,9 +123,12 @@ export class LunchFlowImporter {
|
|
|
123
123
|
}
|
|
124
124
|
}
|
|
125
125
|
|
|
126
|
-
async importTransactions(skipConfirmation: boolean = false): Promise<void> {
|
|
126
|
+
async importTransactions(skipConfirmation: boolean = false, throwOnError: boolean = false): Promise<void> {
|
|
127
127
|
if (!this.config || this.config.accountMappings.length === 0) {
|
|
128
128
|
this.ui.showError('No account mappings configured. Please configure mappings first.');
|
|
129
|
+
if (throwOnError) {
|
|
130
|
+
throw new Error('No account mappings configured');
|
|
131
|
+
}
|
|
129
132
|
return;
|
|
130
133
|
}
|
|
131
134
|
|
|
@@ -133,6 +136,9 @@ export class LunchFlowImporter {
|
|
|
133
136
|
const status = await this.testConnections();
|
|
134
137
|
if (!status.lunchFlow || !status.actualBudget) {
|
|
135
138
|
this.ui.showError('Cannot import: connections failed');
|
|
139
|
+
if (throwOnError) {
|
|
140
|
+
throw new Error('Connection test failed');
|
|
141
|
+
}
|
|
136
142
|
return;
|
|
137
143
|
}
|
|
138
144
|
|
|
@@ -195,6 +201,9 @@ export class LunchFlowImporter {
|
|
|
195
201
|
|
|
196
202
|
if (allLfTransactions.length === 0) {
|
|
197
203
|
this.ui.showInfo('No transactions found for any of the mapped accounts');
|
|
204
|
+
if (throwOnError) {
|
|
205
|
+
throw new Error('No transactions found');
|
|
206
|
+
}
|
|
198
207
|
return;
|
|
199
208
|
}
|
|
200
209
|
|
|
@@ -203,6 +212,9 @@ export class LunchFlowImporter {
|
|
|
203
212
|
|
|
204
213
|
if (abTransactions.length === 0) {
|
|
205
214
|
this.ui.showError('No transactions could be mapped to Actual Budget accounts');
|
|
215
|
+
if (throwOnError) {
|
|
216
|
+
throw new Error('No transactions could be mapped');
|
|
217
|
+
}
|
|
206
218
|
return;
|
|
207
219
|
}
|
|
208
220
|
|
|
@@ -217,6 +229,9 @@ export class LunchFlowImporter {
|
|
|
217
229
|
const confirmed = await this.ui.confirmImport(abTransactions.length, { startDate, endDate });
|
|
218
230
|
if (!confirmed) {
|
|
219
231
|
this.ui.showInfo('Import cancelled');
|
|
232
|
+
if (throwOnError) {
|
|
233
|
+
throw new Error('Import cancelled by user');
|
|
234
|
+
}
|
|
220
235
|
return;
|
|
221
236
|
}
|
|
222
237
|
} else {
|
|
@@ -233,6 +248,9 @@ export class LunchFlowImporter {
|
|
|
233
248
|
spinner.stop();
|
|
234
249
|
this.ui.showError('Failed to import transactions');
|
|
235
250
|
console.error('Import error:', error);
|
|
251
|
+
if (throwOnError) {
|
|
252
|
+
throw error;
|
|
253
|
+
}
|
|
236
254
|
}
|
|
237
255
|
}
|
|
238
256
|
|
|
@@ -335,7 +353,7 @@ export class LunchFlowImporter {
|
|
|
335
353
|
|
|
336
354
|
async runImport(): Promise<void> {
|
|
337
355
|
await this.initialize();
|
|
338
|
-
await this.importTransactions(true); // Skip confirmation in non-interactive mode
|
|
356
|
+
await this.importTransactions(true, true); // Skip confirmation and throw on error in non-interactive mode
|
|
339
357
|
await this.abClient.shutdown();
|
|
340
358
|
}
|
|
341
359
|
}
|
package/src/lunch-flow-client.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import axios, { AxiosInstance } from 'axios';
|
|
1
|
+
import axios, { AxiosInstance, AxiosError } from 'axios';
|
|
2
2
|
import { LunchFlowTransaction, LunchFlowAccount, LunchFlowAccountId } from './types';
|
|
3
3
|
|
|
4
4
|
export class LunchFlowClient {
|
|
5
5
|
private client: AxiosInstance;
|
|
6
6
|
private apiKey: string;
|
|
7
|
+
private readonly maxRetries: number = 3;
|
|
7
8
|
|
|
8
9
|
constructor(apiKey: string, baseUrl: string = 'https://api.lunchflow.com') {
|
|
9
10
|
this.apiKey = apiKey;
|
|
@@ -13,23 +14,75 @@ export class LunchFlowClient {
|
|
|
13
14
|
'x-api-key': apiKey,
|
|
14
15
|
'Content-Type': 'application/json',
|
|
15
16
|
},
|
|
16
|
-
timeout:
|
|
17
|
+
timeout: 60000,
|
|
17
18
|
});
|
|
18
19
|
}
|
|
19
20
|
|
|
21
|
+
private async retryWithBackoff<T>(
|
|
22
|
+
operation: () => Promise<T>,
|
|
23
|
+
operationName: string,
|
|
24
|
+
retryCount: number = 0
|
|
25
|
+
): Promise<T> {
|
|
26
|
+
try {
|
|
27
|
+
return await operation();
|
|
28
|
+
} catch (error: any) {
|
|
29
|
+
const isRetriableError = this.isRetriableError(error);
|
|
30
|
+
|
|
31
|
+
if (retryCount < this.maxRetries && isRetriableError) {
|
|
32
|
+
const backoffDelay = Math.pow(2, retryCount) * 1000; // Exponential backoff: 1s, 2s, 4s
|
|
33
|
+
console.log(`${operationName} failed (attempt ${retryCount + 1}/${this.maxRetries + 1}). Retrying in ${backoffDelay}ms...`);
|
|
34
|
+
console.log(`Error: ${error.message}`);
|
|
35
|
+
|
|
36
|
+
await this.sleep(backoffDelay);
|
|
37
|
+
return this.retryWithBackoff(operation, operationName, retryCount + 1);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Log final failure
|
|
41
|
+
if (retryCount >= this.maxRetries) {
|
|
42
|
+
console.error(`${operationName} failed after ${this.maxRetries + 1} attempts. Final error: ${error.message}`);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
throw error;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
private isRetriableError(error: any): boolean {
|
|
50
|
+
// Retry on network errors, timeouts, and 5xx server errors
|
|
51
|
+
if (error.code === 'ECONNRESET' || error.code === 'ETIMEDOUT' || error.code === 'ENOTFOUND') {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (error.response?.status >= 500) {
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Retry on timeout errors
|
|
60
|
+
if (error.code === 'ECONNABORTED' && error.message.includes('timeout')) {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
private sleep(ms: number): Promise<void> {
|
|
68
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
69
|
+
}
|
|
70
|
+
|
|
20
71
|
async testConnection(): Promise<boolean> {
|
|
21
72
|
try {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
73
|
+
return await this.retryWithBackoff(async () => {
|
|
74
|
+
// Try to get accounts as a health check
|
|
75
|
+
const response = await this.client.get('/accounts');
|
|
76
|
+
return response.status === 200;
|
|
77
|
+
}, 'Test Lunch Flow connection');
|
|
25
78
|
} catch (error: any) {
|
|
26
|
-
console.error('Lunch Flow connection test failed:', error.message);
|
|
79
|
+
console.error('Lunch Flow connection test failed after all retries:', error.message);
|
|
27
80
|
return false;
|
|
28
81
|
}
|
|
29
82
|
}
|
|
30
83
|
|
|
31
84
|
async getAccounts(): Promise<LunchFlowAccount[]> {
|
|
32
|
-
|
|
85
|
+
return this.retryWithBackoff(async () => {
|
|
33
86
|
const response = await this.client.get('/accounts');
|
|
34
87
|
|
|
35
88
|
// Handle different possible response structures
|
|
@@ -39,14 +92,11 @@ export class LunchFlowClient {
|
|
|
39
92
|
console.warn('Unexpected response structure from Lunch Flow accounts endpoint');
|
|
40
93
|
return [];
|
|
41
94
|
}
|
|
42
|
-
}
|
|
43
|
-
console.error('Failed to fetch Lunch Flow accounts:', error.message);
|
|
44
|
-
throw new Error(`Failed to fetch accounts: ${error.message}`);
|
|
45
|
-
}
|
|
95
|
+
}, 'Fetch Lunch Flow accounts');
|
|
46
96
|
}
|
|
47
97
|
|
|
48
98
|
async getTransactions(accountId: LunchFlowAccountId): Promise<LunchFlowTransaction[]> {
|
|
49
|
-
|
|
99
|
+
return this.retryWithBackoff(async () => {
|
|
50
100
|
const response = await this.client.get(`/accounts/${accountId}/transactions`);
|
|
51
101
|
|
|
52
102
|
// Handle different possible response structures
|
|
@@ -56,9 +106,6 @@ export class LunchFlowClient {
|
|
|
56
106
|
console.warn('Unexpected response structure from Lunch Flow transactions endpoint');
|
|
57
107
|
return [];
|
|
58
108
|
}
|
|
59
|
-
}
|
|
60
|
-
console.error('Failed to fetch Lunch Flow transactions:', error.message);
|
|
61
|
-
throw new Error(`Failed to fetch transactions: ${error.message}`);
|
|
62
|
-
}
|
|
109
|
+
}, `Fetch transactions for account ${accountId}`);
|
|
63
110
|
}
|
|
64
111
|
}
|