@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 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
- - 🎯 **Date Range Selection**: Choose specific date ranges for transaction import
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
- ### Main Menu
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. Option to skip accounts that don't need mapping
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
@@ -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>;
@@ -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;IAiHpE,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"}
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
  }
@@ -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;gBAEX,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAoC;IAYnE,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAWlC,WAAW,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAiB1C,eAAe,CAAC,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;CAgBtF"}
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: 10000,
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
- // Try to get accounts as a health check
23
- const response = await this.client.get('/accounts');
24
- return response.status === 200;
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
- try {
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
- try {
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,kDAA6C;AAG7C,MAAa,eAAe;IAI1B,YAAY,MAAc,EAAE,UAAkB,2BAA2B;QACvE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,eAAK,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE;gBACP,WAAW,EAAE,MAAM;gBACnB,cAAc,EAAE,kBAAkB;aACnC;YACD,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,IAAI,CAAC;YACH,wCAAwC;YACxC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACpD,OAAO,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC;QACjC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACnE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAEpD,gDAAgD;YAChD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1C,OAAO,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;gBAChF,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACrE,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,SAA6B;QACjD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,SAAS,eAAe,CAAC,CAAC;YAE9E,gDAAgD;YAChD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC9C,OAAO,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;gBACpF,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACzE,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;CACF;AA5DD,0CA4DC"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lunchflow/actual-flow",
3
- "version": "0.0.6",
3
+ "version": "0.0.7",
4
4
  "description": "Import transactions from Lunch Flow to Actual Budget with terminal UI.",
5
5
  "main": "./dist/index.js",
6
6
  "bin": {
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
  }
@@ -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: 10000,
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
- // Try to get accounts as a health check
23
- const response = await this.client.get('/accounts');
24
- return response.status === 200;
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
- try {
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
- } catch (error: any) {
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
- try {
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
- } catch (error: any) {
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
  }