@dizzlkheinz/ynab-mcpb 0.18.3 → 0.19.0
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/CHANGELOG.md +17 -0
- package/CLAUDE.md +87 -8
- package/bin/ynab-mcp-server.cjs +2 -2
- package/bin/ynab-mcp-server.js +3 -3
- package/biome.json +39 -0
- package/dist/bundle/index.cjs +67 -67
- package/dist/index.d.ts +1 -1
- package/dist/index.js +27 -27
- package/dist/server/YNABMCPServer.d.ts +3 -4
- package/dist/server/YNABMCPServer.js +111 -116
- package/dist/server/budgetResolver.d.ts +6 -5
- package/dist/server/budgetResolver.js +46 -36
- package/dist/server/cacheKeys.js +6 -6
- package/dist/server/cacheManager.js +14 -11
- package/dist/server/completions.d.ts +2 -2
- package/dist/server/completions.js +20 -15
- package/dist/server/config.d.ts +10 -5
- package/dist/server/config.js +24 -7
- package/dist/server/deltaCache.d.ts +2 -2
- package/dist/server/deltaCache.js +22 -16
- package/dist/server/deltaCache.merge.d.ts +2 -2
- package/dist/server/diagnostics.d.ts +4 -4
- package/dist/server/diagnostics.js +38 -32
- package/dist/server/errorHandler.d.ts +5 -12
- package/dist/server/errorHandler.js +219 -217
- package/dist/server/prompts.d.ts +2 -2
- package/dist/server/prompts.js +45 -45
- package/dist/server/rateLimiter.js +4 -4
- package/dist/server/requestLogger.d.ts +1 -1
- package/dist/server/requestLogger.js +40 -35
- package/dist/server/resources.d.ts +3 -3
- package/dist/server/resources.js +55 -52
- package/dist/server/responseFormatter.js +6 -6
- package/dist/server/securityMiddleware.d.ts +2 -2
- package/dist/server/securityMiddleware.js +22 -20
- package/dist/server/serverKnowledgeStore.js +1 -1
- package/dist/server/toolRegistry.d.ts +3 -3
- package/dist/server/toolRegistry.js +47 -40
- package/dist/tools/__tests__/deltaTestUtils.d.ts +3 -3
- package/dist/tools/__tests__/deltaTestUtils.js +2 -2
- package/dist/tools/accountTools.d.ts +9 -8
- package/dist/tools/accountTools.js +47 -47
- package/dist/tools/adapters.d.ts +13 -8
- package/dist/tools/adapters.js +21 -11
- package/dist/tools/budgetTools.d.ts +8 -7
- package/dist/tools/budgetTools.js +22 -22
- package/dist/tools/categoryTools.d.ts +9 -8
- package/dist/tools/categoryTools.js +68 -59
- package/dist/tools/compareTransactions/formatter.d.ts +3 -3
- package/dist/tools/compareTransactions/formatter.js +9 -9
- package/dist/tools/compareTransactions/index.d.ts +6 -6
- package/dist/tools/compareTransactions/index.js +58 -43
- package/dist/tools/compareTransactions/matcher.d.ts +1 -1
- package/dist/tools/compareTransactions/matcher.js +28 -15
- package/dist/tools/compareTransactions/parser.d.ts +2 -2
- package/dist/tools/compareTransactions/parser.js +144 -138
- package/dist/tools/compareTransactions/types.d.ts +4 -4
- package/dist/tools/compareTransactions.d.ts +1 -1
- package/dist/tools/compareTransactions.js +1 -1
- package/dist/tools/deltaFetcher.d.ts +2 -2
- package/dist/tools/deltaFetcher.js +16 -15
- package/dist/tools/deltaSupport.d.ts +4 -4
- package/dist/tools/deltaSupport.js +35 -41
- package/dist/tools/exportTransactions.d.ts +5 -4
- package/dist/tools/exportTransactions.js +61 -59
- package/dist/tools/monthTools.d.ts +7 -6
- package/dist/tools/monthTools.js +31 -29
- package/dist/tools/payeeTools.d.ts +7 -6
- package/dist/tools/payeeTools.js +28 -28
- package/dist/tools/reconcileAdapter.d.ts +2 -2
- package/dist/tools/reconcileAdapter.js +21 -11
- package/dist/tools/reconciliation/analyzer.d.ts +4 -4
- package/dist/tools/reconciliation/analyzer.js +136 -57
- package/dist/tools/reconciliation/csvParser.d.ts +3 -3
- package/dist/tools/reconciliation/csvParser.js +128 -104
- package/dist/tools/reconciliation/executor.d.ts +4 -4
- package/dist/tools/reconciliation/executor.js +148 -109
- package/dist/tools/reconciliation/index.d.ts +10 -10
- package/dist/tools/reconciliation/index.js +96 -83
- package/dist/tools/reconciliation/matcher.d.ts +3 -3
- package/dist/tools/reconciliation/matcher.js +17 -16
- package/dist/tools/reconciliation/payeeNormalizer.js +19 -8
- package/dist/tools/reconciliation/recommendationEngine.d.ts +1 -1
- package/dist/tools/reconciliation/recommendationEngine.js +40 -40
- package/dist/tools/reconciliation/reportFormatter.d.ts +2 -2
- package/dist/tools/reconciliation/reportFormatter.js +79 -54
- package/dist/tools/reconciliation/signDetector.d.ts +1 -1
- package/dist/tools/reconciliation/types.d.ts +19 -16
- package/dist/tools/reconciliation/ynabAdapter.d.ts +2 -2
- package/dist/tools/schemas/common.d.ts +1 -1
- package/dist/tools/schemas/common.js +1 -1
- package/dist/tools/schemas/outputs/accountOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/accountOutputs.js +24 -18
- package/dist/tools/schemas/outputs/budgetOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/budgetOutputs.js +14 -11
- package/dist/tools/schemas/outputs/categoryOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/categoryOutputs.js +49 -29
- package/dist/tools/schemas/outputs/comparisonOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/comparisonOutputs.js +12 -12
- package/dist/tools/schemas/outputs/index.d.ts +14 -14
- package/dist/tools/schemas/outputs/index.js +14 -14
- package/dist/tools/schemas/outputs/monthOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/monthOutputs.js +56 -41
- package/dist/tools/schemas/outputs/payeeOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/payeeOutputs.js +10 -10
- package/dist/tools/schemas/outputs/reconciliationOutputs.d.ts +2 -2
- package/dist/tools/schemas/outputs/reconciliationOutputs.js +45 -45
- package/dist/tools/schemas/outputs/transactionMutationOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/transactionMutationOutputs.js +28 -22
- package/dist/tools/schemas/outputs/transactionOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/transactionOutputs.js +43 -35
- package/dist/tools/schemas/outputs/utilityOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/utilityOutputs.js +5 -3
- package/dist/tools/schemas/shared/commonOutputs.d.ts +1 -1
- package/dist/tools/schemas/shared/commonOutputs.js +15 -9
- package/dist/tools/transactionReadTools.d.ts +11 -0
- package/dist/tools/transactionReadTools.js +202 -0
- package/dist/tools/transactionSchemas.d.ts +309 -0
- package/dist/tools/transactionSchemas.js +235 -0
- package/dist/tools/transactionTools.d.ts +6 -302
- package/dist/tools/transactionTools.js +7 -2054
- package/dist/tools/transactionUtils.d.ts +31 -0
- package/dist/tools/transactionUtils.js +364 -0
- package/dist/tools/transactionWriteTools.d.ts +20 -0
- package/dist/tools/transactionWriteTools.js +1342 -0
- package/dist/tools/utilityTools.d.ts +5 -4
- package/dist/tools/utilityTools.js +11 -11
- package/dist/types/index.d.ts +7 -7
- package/dist/types/index.js +6 -6
- package/dist/types/reconciliation.d.ts +1 -1
- package/dist/types/toolRegistration.d.ts +14 -12
- package/dist/utils/amountUtils.js +1 -1
- package/dist/utils/dateUtils.js +4 -4
- package/dist/utils/errors.d.ts +3 -3
- package/dist/utils/errors.js +4 -4
- package/dist/utils/money.d.ts +2 -2
- package/dist/utils/money.js +8 -8
- package/dist/utils/validationError.d.ts +1 -1
- package/dist/utils/validationError.js +1 -1
- package/docs/assets/examples/reconciliation-with-recommendations.json +66 -66
- package/docs/assets/schemas/reconciliation-v2.json +360 -336
- package/docs/plans/2025-12-25-transaction-tools-refactor-design.md +211 -0
- package/docs/plans/2025-12-25-transaction-tools-refactor.md +905 -0
- package/esbuild.config.mjs +53 -50
- package/meta.json +12548 -12548
- package/package.json +98 -109
- package/scripts/analyze-bundle.mjs +33 -30
- package/scripts/create-pr-description.js +169 -120
- package/scripts/run-all-tests.js +205 -0
- package/scripts/run-domain-integration-tests.js +28 -18
- package/scripts/run-generate-mcpb.js +19 -17
- package/scripts/run-throttled-integration-tests.js +92 -83
- package/scripts/test-delta-params.mjs +149 -120
- package/scripts/test-recommendations.ts +36 -32
- package/scripts/tmpTransaction.ts +80 -43
- package/scripts/validate-env.js +98 -91
- package/scripts/verify-build.js +78 -76
- package/src/__tests__/comprehensive.integration.test.ts +1281 -1154
- package/src/__tests__/performance.test.ts +723 -671
- package/src/__tests__/setup.ts +442 -395
- package/src/__tests__/smoke.e2e.test.ts +41 -39
- package/src/__tests__/testRunner.ts +314 -295
- package/src/__tests__/testUtils.ts +456 -364
- package/src/__tests__/tools/reconciliation/csvParser.integration.test.ts +109 -107
- package/src/__tests__/tools/reconciliation/real-world.integration.test.ts +41 -41
- package/src/index.ts +68 -59
- package/src/server/CLAUDE.md +480 -0
- package/src/server/YNABMCPServer.ts +821 -794
- package/src/server/__tests__/YNABMCPServer.integration.test.ts +929 -893
- package/src/server/__tests__/YNABMCPServer.test.ts +903 -899
- package/src/server/__tests__/budgetResolver.test.ts +466 -423
- package/src/server/__tests__/cacheManager.test.ts +891 -874
- package/src/server/__tests__/completions.integration.test.ts +115 -106
- package/src/server/__tests__/completions.test.ts +334 -313
- package/src/server/__tests__/config.test.ts +98 -86
- package/src/server/__tests__/deltaCache.merge.test.ts +774 -703
- package/src/server/__tests__/deltaCache.swr.test.ts +198 -153
- package/src/server/__tests__/deltaCache.test.ts +946 -759
- package/src/server/__tests__/diagnostics.test.ts +825 -792
- package/src/server/__tests__/errorHandler.integration.test.ts +512 -462
- package/src/server/__tests__/errorHandler.test.ts +402 -397
- package/src/server/__tests__/prompts.test.ts +424 -347
- package/src/server/__tests__/rateLimiter.test.ts +313 -309
- package/src/server/__tests__/requestLogger.test.ts +443 -403
- package/src/server/__tests__/resources.template.test.ts +196 -185
- package/src/server/__tests__/resources.test.ts +294 -288
- package/src/server/__tests__/security.integration.test.ts +487 -421
- package/src/server/__tests__/securityMiddleware.test.ts +519 -444
- package/src/server/__tests__/server-startup.integration.test.ts +509 -490
- package/src/server/__tests__/serverKnowledgeStore.test.ts +174 -173
- package/src/server/__tests__/toolRegistration.test.ts +239 -210
- package/src/server/__tests__/toolRegistry.test.ts +907 -845
- package/src/server/budgetResolver.ts +221 -181
- package/src/server/cacheKeys.ts +6 -6
- package/src/server/cacheManager.ts +498 -484
- package/src/server/completions.ts +267 -243
- package/src/server/config.ts +35 -14
- package/src/server/deltaCache.merge.ts +146 -128
- package/src/server/deltaCache.ts +352 -309
- package/src/server/diagnostics.ts +257 -242
- package/src/server/errorHandler.ts +747 -744
- package/src/server/prompts.ts +181 -176
- package/src/server/rateLimiter.ts +131 -129
- package/src/server/requestLogger.ts +350 -322
- package/src/server/resources.ts +442 -374
- package/src/server/responseFormatter.ts +41 -37
- package/src/server/securityMiddleware.ts +223 -205
- package/src/server/serverKnowledgeStore.ts +67 -67
- package/src/server/toolRegistry.ts +508 -474
- package/src/tools/CLAUDE.md +604 -0
- package/src/tools/__tests__/accountTools.delta.integration.test.ts +128 -111
- package/src/tools/__tests__/accountTools.integration.test.ts +129 -111
- package/src/tools/__tests__/accountTools.test.ts +685 -638
- package/src/tools/__tests__/adapters.test.ts +142 -108
- package/src/tools/__tests__/budgetTools.delta.integration.test.ts +73 -73
- package/src/tools/__tests__/budgetTools.integration.test.ts +132 -124
- package/src/tools/__tests__/budgetTools.test.ts +442 -413
- package/src/tools/__tests__/categoryTools.delta.integration.test.ts +76 -68
- package/src/tools/__tests__/categoryTools.integration.test.ts +314 -288
- package/src/tools/__tests__/categoryTools.test.ts +656 -625
- package/src/tools/__tests__/compareTransactions/formatter.test.ts +535 -462
- package/src/tools/__tests__/compareTransactions/index.test.ts +378 -358
- package/src/tools/__tests__/compareTransactions/matcher.test.ts +497 -398
- package/src/tools/__tests__/compareTransactions/parser.test.ts +765 -747
- package/src/tools/__tests__/compareTransactions.test.ts +352 -332
- package/src/tools/__tests__/compareTransactions.window.test.ts +150 -146
- package/src/tools/__tests__/deltaFetcher.scheduled.integration.test.ts +69 -65
- package/src/tools/__tests__/deltaFetcher.test.ts +325 -265
- package/src/tools/__tests__/deltaSupport.test.ts +211 -184
- package/src/tools/__tests__/deltaTestUtils.ts +37 -33
- package/src/tools/__tests__/exportTransactions.test.ts +205 -200
- package/src/tools/__tests__/monthTools.delta.integration.test.ts +68 -68
- package/src/tools/__tests__/monthTools.integration.test.ts +178 -166
- package/src/tools/__tests__/monthTools.test.ts +561 -512
- package/src/tools/__tests__/payeeTools.delta.integration.test.ts +68 -68
- package/src/tools/__tests__/payeeTools.integration.test.ts +158 -142
- package/src/tools/__tests__/payeeTools.test.ts +486 -434
- package/src/tools/__tests__/transactionSchemas.test.ts +1204 -0
- package/src/tools/__tests__/transactionTools.integration.test.ts +875 -825
- package/src/tools/__tests__/transactionTools.test.ts +4923 -4366
- package/src/tools/__tests__/transactionUtils.test.ts +1016 -0
- package/src/tools/__tests__/utilityTools.integration.test.ts +32 -32
- package/src/tools/__tests__/utilityTools.test.ts +68 -58
- package/src/tools/accountTools.ts +293 -271
- package/src/tools/adapters.ts +120 -63
- package/src/tools/budgetTools.ts +121 -116
- package/src/tools/categoryTools.ts +379 -339
- package/src/tools/compareTransactions/formatter.ts +131 -119
- package/src/tools/compareTransactions/index.ts +249 -214
- package/src/tools/compareTransactions/matcher.ts +259 -209
- package/src/tools/compareTransactions/parser.ts +517 -487
- package/src/tools/compareTransactions/types.ts +38 -38
- package/src/tools/compareTransactions.ts +1 -1
- package/src/tools/deltaFetcher.ts +281 -260
- package/src/tools/deltaSupport.ts +264 -259
- package/src/tools/exportTransactions.ts +230 -218
- package/src/tools/monthTools.ts +180 -165
- package/src/tools/payeeTools.ts +152 -140
- package/src/tools/reconcileAdapter.ts +297 -246
- package/src/tools/reconciliation/CLAUDE.md +506 -0
- package/src/tools/reconciliation/__tests__/adapter.causes.test.ts +135 -112
- package/src/tools/reconciliation/__tests__/adapter.test.ts +249 -227
- package/src/tools/reconciliation/__tests__/analyzer.test.ts +408 -335
- package/src/tools/reconciliation/__tests__/csvParser.test.ts +71 -69
- package/src/tools/reconciliation/__tests__/executor.integration.test.ts +348 -323
- package/src/tools/reconciliation/__tests__/executor.progress.test.ts +503 -457
- package/src/tools/reconciliation/__tests__/executor.test.ts +898 -831
- package/src/tools/reconciliation/__tests__/matcher.test.ts +667 -663
- package/src/tools/reconciliation/__tests__/payeeNormalizer.test.ts +296 -276
- package/src/tools/reconciliation/__tests__/recommendationEngine.integration.test.ts +692 -624
- package/src/tools/reconciliation/__tests__/recommendationEngine.test.ts +1008 -986
- package/src/tools/reconciliation/__tests__/reconciliation.delta.integration.test.ts +187 -146
- package/src/tools/reconciliation/__tests__/reportFormatter.test.ts +583 -530
- package/src/tools/reconciliation/__tests__/scenarios/adapterCurrency.scenario.test.ts +75 -71
- package/src/tools/reconciliation/__tests__/scenarios/extremes.scenario.test.ts +70 -58
- package/src/tools/reconciliation/__tests__/scenarios/repeatAmount.scenario.test.ts +102 -88
- package/src/tools/reconciliation/__tests__/schemaUrl.test.ts +58 -43
- package/src/tools/reconciliation/__tests__/signDetector.test.ts +209 -206
- package/src/tools/reconciliation/__tests__/ynabAdapter.test.ts +66 -60
- package/src/tools/reconciliation/analyzer.ts +582 -406
- package/src/tools/reconciliation/csvParser.ts +656 -609
- package/src/tools/reconciliation/executor.ts +1290 -1128
- package/src/tools/reconciliation/index.ts +580 -528
- package/src/tools/reconciliation/matcher.ts +256 -240
- package/src/tools/reconciliation/payeeNormalizer.ts +92 -78
- package/src/tools/reconciliation/recommendationEngine.ts +357 -345
- package/src/tools/reconciliation/reportFormatter.ts +349 -276
- package/src/tools/reconciliation/signDetector.ts +89 -83
- package/src/tools/reconciliation/types.ts +164 -153
- package/src/tools/reconciliation/ynabAdapter.ts +17 -15
- package/src/tools/schemas/CLAUDE.md +546 -0
- package/src/tools/schemas/common.ts +1 -1
- package/src/tools/schemas/outputs/__tests__/accountOutputs.test.ts +410 -409
- package/src/tools/schemas/outputs/__tests__/budgetOutputs.test.ts +305 -299
- package/src/tools/schemas/outputs/__tests__/categoryOutputs.test.ts +431 -430
- package/src/tools/schemas/outputs/__tests__/comparisonOutputs.test.ts +510 -495
- package/src/tools/schemas/outputs/__tests__/dateValidation.test.ts +179 -153
- package/src/tools/schemas/outputs/__tests__/discrepancyDirection.test.ts +293 -254
- package/src/tools/schemas/outputs/__tests__/monthOutputs.test.ts +457 -457
- package/src/tools/schemas/outputs/__tests__/payeeOutputs.test.ts +362 -356
- package/src/tools/schemas/outputs/__tests__/reconciliationOutputs.test.ts +402 -399
- package/src/tools/schemas/outputs/__tests__/transactionMutationSchemas.test.ts +225 -211
- package/src/tools/schemas/outputs/__tests__/transactionOutputs.test.ts +457 -454
- package/src/tools/schemas/outputs/__tests__/utilityOutputs.test.ts +316 -315
- package/src/tools/schemas/outputs/accountOutputs.ts +40 -34
- package/src/tools/schemas/outputs/budgetOutputs.ts +24 -19
- package/src/tools/schemas/outputs/categoryOutputs.ts +76 -56
- package/src/tools/schemas/outputs/comparisonOutputs.ts +192 -169
- package/src/tools/schemas/outputs/index.ts +163 -163
- package/src/tools/schemas/outputs/monthOutputs.ts +95 -80
- package/src/tools/schemas/outputs/payeeOutputs.ts +18 -18
- package/src/tools/schemas/outputs/reconciliationOutputs.ts +386 -373
- package/src/tools/schemas/outputs/transactionMutationOutputs.ts +259 -231
- package/src/tools/schemas/outputs/transactionOutputs.ts +81 -71
- package/src/tools/schemas/outputs/utilityOutputs.ts +90 -84
- package/src/tools/schemas/shared/commonOutputs.ts +27 -19
- package/src/tools/toolCategories.ts +114 -114
- package/src/tools/transactionReadTools.ts +327 -0
- package/src/tools/transactionSchemas.ts +484 -0
- package/src/tools/transactionTools.ts +107 -2990
- package/src/tools/transactionUtils.ts +621 -0
- package/src/tools/transactionWriteTools.ts +2110 -0
- package/src/tools/utilityTools.ts +46 -41
- package/src/types/CLAUDE.md +477 -0
- package/src/types/__tests__/index.test.ts +51 -51
- package/src/types/index.ts +43 -39
- package/src/types/integration-tests.d.ts +26 -26
- package/src/types/reconciliation.ts +29 -29
- package/src/types/toolAnnotations.ts +30 -30
- package/src/types/toolRegistration.ts +43 -32
- package/src/utils/CLAUDE.md +508 -0
- package/src/utils/__tests__/dateUtils.test.ts +174 -168
- package/src/utils/__tests__/money.test.ts +193 -187
- package/src/utils/amountUtils.ts +5 -5
- package/src/utils/baseError.ts +5 -5
- package/src/utils/dateUtils.ts +29 -26
- package/src/utils/errors.ts +14 -14
- package/src/utils/money.ts +66 -52
- package/src/utils/validationError.ts +1 -1
- package/tsconfig.json +29 -29
- package/tsconfig.prod.json +16 -16
- package/vitest-reporters/split-json-reporter.ts +247 -204
- package/vitest.config.ts +99 -95
- package/.prettierignore +0 -10
- package/.prettierrc.json +0 -10
- package/eslint.config.js +0 -49
|
@@ -1,311 +1,316 @@
|
|
|
1
|
-
import * as ynab from
|
|
2
|
-
import { cacheManager } from
|
|
3
|
-
import { DeltaCache } from
|
|
4
|
-
import { ServerKnowledgeStore } from
|
|
5
|
-
import { DeltaFetcher } from
|
|
1
|
+
import type * as ynab from "ynab";
|
|
2
|
+
import { cacheManager } from "../server/cacheManager.js";
|
|
3
|
+
import { DeltaCache } from "../server/deltaCache.js";
|
|
4
|
+
import { ServerKnowledgeStore } from "../server/serverKnowledgeStore.js";
|
|
5
|
+
import { DeltaFetcher } from "./deltaFetcher.js";
|
|
6
6
|
|
|
7
7
|
interface SharedDeltaSupportContext {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
deltaFetcher?: DeltaFetcher;
|
|
9
|
+
deltaCache?: DeltaCache;
|
|
10
|
+
knowledgeStore?: ServerKnowledgeStore;
|
|
11
|
+
ynabAPI?: ynab.API;
|
|
12
|
+
manuallyConfigured?: boolean;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
export interface SharedDeltaSupportOptions {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
deltaFetcher?: DeltaFetcher;
|
|
17
|
+
deltaCache?: DeltaCache;
|
|
18
|
+
knowledgeStore?: ServerKnowledgeStore;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
let sharedDeltaContext: SharedDeltaSupportContext | undefined;
|
|
22
22
|
|
|
23
|
-
export function setSharedDeltaSupport(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
23
|
+
export function setSharedDeltaSupport(
|
|
24
|
+
options?: SharedDeltaSupportOptions,
|
|
25
|
+
): void {
|
|
26
|
+
if (!options) {
|
|
27
|
+
sharedDeltaContext = undefined;
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
sharedDeltaContext = {
|
|
31
|
+
...options,
|
|
32
|
+
manuallyConfigured: true,
|
|
33
|
+
};
|
|
32
34
|
}
|
|
33
35
|
|
|
34
36
|
export function getSharedDeltaSupport(): SharedDeltaSupportOptions | undefined {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
37
|
+
if (!sharedDeltaContext) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
const result: SharedDeltaSupportOptions = {};
|
|
41
|
+
if (sharedDeltaContext.deltaFetcher) {
|
|
42
|
+
result.deltaFetcher = sharedDeltaContext.deltaFetcher;
|
|
43
|
+
}
|
|
44
|
+
if (sharedDeltaContext.deltaCache) {
|
|
45
|
+
result.deltaCache = sharedDeltaContext.deltaCache;
|
|
46
|
+
}
|
|
47
|
+
if (sharedDeltaContext.knowledgeStore) {
|
|
48
|
+
result.knowledgeStore = sharedDeltaContext.knowledgeStore;
|
|
49
|
+
}
|
|
50
|
+
return result;
|
|
49
51
|
}
|
|
50
52
|
|
|
51
53
|
function resolveSharedDeltaFetcher(ynabAPI: ynab.API): DeltaFetcher {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
54
|
+
if (
|
|
55
|
+
sharedDeltaContext &&
|
|
56
|
+
!sharedDeltaContext.manuallyConfigured &&
|
|
57
|
+
sharedDeltaContext.ynabAPI &&
|
|
58
|
+
sharedDeltaContext.ynabAPI !== ynabAPI
|
|
59
|
+
) {
|
|
60
|
+
sharedDeltaContext = undefined;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (sharedDeltaContext?.deltaFetcher) {
|
|
64
|
+
return sharedDeltaContext.deltaFetcher;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const context: SharedDeltaSupportContext = sharedDeltaContext
|
|
68
|
+
? { ...sharedDeltaContext }
|
|
69
|
+
: {};
|
|
70
|
+
if (context.manuallyConfigured === undefined) {
|
|
71
|
+
context.manuallyConfigured = false;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (!context.deltaCache) {
|
|
75
|
+
if (!context.knowledgeStore) {
|
|
76
|
+
context.knowledgeStore = new ServerKnowledgeStore();
|
|
77
|
+
}
|
|
78
|
+
context.deltaCache = new DeltaCache(cacheManager, context.knowledgeStore);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const deltaFetcher = new DeltaFetcher(ynabAPI, context.deltaCache);
|
|
82
|
+
context.deltaFetcher = deltaFetcher;
|
|
83
|
+
if (!context.ynabAPI) {
|
|
84
|
+
context.ynabAPI = ynabAPI;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
sharedDeltaContext = context;
|
|
88
|
+
|
|
89
|
+
return deltaFetcher;
|
|
86
90
|
}
|
|
87
91
|
|
|
88
92
|
/**
|
|
89
93
|
* Type guard to check if a value is a DeltaFetcher instance.
|
|
90
94
|
*/
|
|
91
95
|
function isDeltaFetcher(value: unknown): value is DeltaFetcher {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
96
|
+
return (
|
|
97
|
+
value !== null &&
|
|
98
|
+
typeof value === "object" &&
|
|
99
|
+
value instanceof DeltaFetcher &&
|
|
100
|
+
typeof (value as DeltaFetcher).fetchAccounts === "function" &&
|
|
101
|
+
typeof (value as DeltaFetcher).fetchCategories === "function"
|
|
102
|
+
);
|
|
99
103
|
}
|
|
100
104
|
|
|
101
105
|
/**
|
|
102
106
|
* Type guard to check if a value is a DeltaCache instance.
|
|
103
107
|
*/
|
|
104
108
|
function isDeltaCache(value: unknown): value is DeltaCache {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
109
|
+
return (
|
|
110
|
+
value !== null &&
|
|
111
|
+
typeof value === "object" &&
|
|
112
|
+
value instanceof DeltaCache &&
|
|
113
|
+
typeof (value as DeltaCache).fetchWithDelta === "function"
|
|
114
|
+
);
|
|
111
115
|
}
|
|
112
116
|
|
|
113
117
|
/**
|
|
114
118
|
* Type guard to check if a value is a ServerKnowledgeStore instance.
|
|
115
119
|
*/
|
|
116
120
|
function isServerKnowledgeStore(value: unknown): value is ServerKnowledgeStore {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
121
|
+
return (
|
|
122
|
+
value !== null &&
|
|
123
|
+
typeof value === "object" &&
|
|
124
|
+
value instanceof ServerKnowledgeStore &&
|
|
125
|
+
typeof (value as ServerKnowledgeStore).get === "function" &&
|
|
126
|
+
typeof (value as ServerKnowledgeStore).update === "function"
|
|
127
|
+
);
|
|
124
128
|
}
|
|
125
129
|
|
|
126
130
|
/**
|
|
127
131
|
* Type guard to check if a value is a plain object (params).
|
|
128
132
|
*/
|
|
129
133
|
function isParamsObject(value: unknown): value is Record<string, unknown> {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
134
|
+
return (
|
|
135
|
+
value !== null &&
|
|
136
|
+
typeof value === "object" &&
|
|
137
|
+
!Array.isArray(value) &&
|
|
138
|
+
// Not a class instance
|
|
139
|
+
(value.constructor === Object || value.constructor === undefined)
|
|
140
|
+
);
|
|
137
141
|
}
|
|
138
142
|
|
|
139
143
|
/**
|
|
140
144
|
* Helper to get a descriptive type name for error messages.
|
|
141
145
|
*/
|
|
142
146
|
function getTypeName(value: unknown): string {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
147
|
+
if (value === null) return "null";
|
|
148
|
+
if (value === undefined) return "undefined";
|
|
149
|
+
const type = typeof value;
|
|
150
|
+
if (type !== "object") return type;
|
|
151
|
+
const constructorName = (value as Record<string, unknown>).constructor?.name;
|
|
152
|
+
return constructorName ? `${type} (${constructorName})` : type;
|
|
149
153
|
}
|
|
150
154
|
|
|
151
|
-
export function resolveDeltaFetcherArgs<
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
+
export function resolveDeltaFetcherArgs<
|
|
156
|
+
TParams extends Record<string, unknown>,
|
|
157
|
+
>(
|
|
158
|
+
ynabAPI: ynab.API,
|
|
159
|
+
deltaFetcherOrParams: DeltaFetcher | TParams,
|
|
160
|
+
maybeParams?: TParams,
|
|
155
161
|
): { deltaFetcher: DeltaFetcher; params: TParams } {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
deltaFetcher: resolveSharedDeltaFetcher(ynabAPI),
|
|
198
|
-
params: deltaFetcherOrParams,
|
|
199
|
-
};
|
|
162
|
+
// Case 1: Three arguments - (ynabAPI, deltaFetcher, params)
|
|
163
|
+
if (maybeParams !== undefined) {
|
|
164
|
+
// Validate that deltaFetcherOrParams is actually a DeltaFetcher
|
|
165
|
+
if (!isDeltaFetcher(deltaFetcherOrParams)) {
|
|
166
|
+
throw new Error(
|
|
167
|
+
`resolveDeltaFetcherArgs: When providing 3 arguments, the second argument must be a DeltaFetcher instance. Got: ${getTypeName(deltaFetcherOrParams)}`,
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Validate that maybeParams is a params object
|
|
172
|
+
if (!isParamsObject(maybeParams)) {
|
|
173
|
+
throw new Error(
|
|
174
|
+
`resolveDeltaFetcherArgs: When providing 3 arguments, the third argument must be a params object. Got: ${getTypeName(maybeParams)}`,
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return {
|
|
179
|
+
deltaFetcher: deltaFetcherOrParams,
|
|
180
|
+
params: maybeParams,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Case 2: Two arguments - (ynabAPI, params)
|
|
185
|
+
// Validate that deltaFetcherOrParams is a params object, not a DeltaFetcher
|
|
186
|
+
if (isDeltaFetcher(deltaFetcherOrParams)) {
|
|
187
|
+
throw new Error(
|
|
188
|
+
"resolveDeltaFetcherArgs: When providing 2 arguments, the second argument must be a params object, not a DeltaFetcher. " +
|
|
189
|
+
"To use a custom DeltaFetcher, provide all 3 arguments: (ynabAPI, deltaFetcher, params)",
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if (!isParamsObject(deltaFetcherOrParams)) {
|
|
194
|
+
throw new Error(
|
|
195
|
+
`resolveDeltaFetcherArgs: When providing 2 arguments, the second argument must be a params object. Got: ${getTypeName(deltaFetcherOrParams)}`,
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return {
|
|
200
|
+
deltaFetcher: resolveSharedDeltaFetcher(ynabAPI),
|
|
201
|
+
params: deltaFetcherOrParams,
|
|
202
|
+
};
|
|
200
203
|
}
|
|
201
204
|
|
|
202
205
|
export function resolveDeltaWriteArgs<TParams extends Record<string, unknown>>(
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
): {
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
206
|
+
deltaCacheOrParams: DeltaCache | TParams,
|
|
207
|
+
knowledgeStoreOrParams?: ServerKnowledgeStore | TParams,
|
|
208
|
+
maybeParams?: TParams,
|
|
209
|
+
): {
|
|
210
|
+
deltaCache: DeltaCache;
|
|
211
|
+
knowledgeStore: ServerKnowledgeStore;
|
|
212
|
+
params: TParams;
|
|
213
|
+
} {
|
|
214
|
+
// Case 1: Three arguments - (deltaCache, knowledgeStore, params)
|
|
215
|
+
if (maybeParams !== undefined) {
|
|
216
|
+
// Validate that deltaCacheOrParams is actually a DeltaCache
|
|
217
|
+
if (!isDeltaCache(deltaCacheOrParams)) {
|
|
218
|
+
throw new Error(
|
|
219
|
+
`resolveDeltaWriteArgs: When providing 3 arguments, the first argument must be a DeltaCache instance. Got: ${getTypeName(deltaCacheOrParams)}`,
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Validate that knowledgeStoreOrParams is actually a ServerKnowledgeStore
|
|
224
|
+
if (!isServerKnowledgeStore(knowledgeStoreOrParams)) {
|
|
225
|
+
throw new Error(
|
|
226
|
+
`resolveDeltaWriteArgs: When providing 3 arguments, the second argument must be a ServerKnowledgeStore instance. Got: ${getTypeName(knowledgeStoreOrParams)}`,
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Validate that maybeParams is a params object
|
|
231
|
+
if (!isParamsObject(maybeParams)) {
|
|
232
|
+
throw new Error(
|
|
233
|
+
`resolveDeltaWriteArgs: When providing 3 arguments, the third argument must be a params object. Got: ${getTypeName(maybeParams)}`,
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
return {
|
|
238
|
+
deltaCache: deltaCacheOrParams,
|
|
239
|
+
knowledgeStore: knowledgeStoreOrParams,
|
|
240
|
+
params: maybeParams,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Case 2: Two arguments - could be (deltaCache, params) or just (params)
|
|
245
|
+
// Need to determine if knowledgeStoreOrParams is a ServerKnowledgeStore or params
|
|
246
|
+
if (knowledgeStoreOrParams !== undefined) {
|
|
247
|
+
const isKnowledgeStore = isServerKnowledgeStore(knowledgeStoreOrParams);
|
|
248
|
+
const isParams = isParamsObject(knowledgeStoreOrParams);
|
|
249
|
+
|
|
250
|
+
if (!isKnowledgeStore && !isParams) {
|
|
251
|
+
throw new Error(
|
|
252
|
+
`resolveDeltaWriteArgs: When providing 2 arguments, the second argument must be either a ServerKnowledgeStore or a params object. Got: ${getTypeName(knowledgeStoreOrParams)}`,
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// If second arg is a params object, then first arg should be params too (invalid)
|
|
257
|
+
if (isParams) {
|
|
258
|
+
throw new Error(
|
|
259
|
+
"resolveDeltaWriteArgs: Invalid argument combination. When providing 2 arguments where the second is a params object, " +
|
|
260
|
+
"this is ambiguous. Either provide 1 argument (params only) or 3 arguments (deltaCache, knowledgeStore, params).",
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// Second arg is ServerKnowledgeStore, so first arg must be DeltaCache (invalid - missing params)
|
|
265
|
+
if (isKnowledgeStore) {
|
|
266
|
+
throw new Error(
|
|
267
|
+
"resolveDeltaWriteArgs: When providing DeltaCache and ServerKnowledgeStore, you must also provide params as the third argument. " +
|
|
268
|
+
"Got 2 arguments, expected 3: (deltaCache, knowledgeStore, params)",
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// Case 3: One argument - (params)
|
|
274
|
+
// Validate that deltaCacheOrParams is a params object, not a DeltaCache
|
|
275
|
+
if (isDeltaCache(deltaCacheOrParams)) {
|
|
276
|
+
throw new Error(
|
|
277
|
+
"resolveDeltaWriteArgs: When providing only 1 argument, it must be a params object, not a DeltaCache. " +
|
|
278
|
+
"To use a custom DeltaCache, provide all 3 arguments: (deltaCache, knowledgeStore, params)",
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
if (!isParamsObject(deltaCacheOrParams)) {
|
|
283
|
+
throw new Error(
|
|
284
|
+
`resolveDeltaWriteArgs: When providing only 1 argument, it must be a params object. Got: ${getTypeName(deltaCacheOrParams)}`,
|
|
285
|
+
);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// Use shared context if available, otherwise create new fallback instances
|
|
289
|
+
if (sharedDeltaContext) {
|
|
290
|
+
if (!sharedDeltaContext.knowledgeStore) {
|
|
291
|
+
sharedDeltaContext.knowledgeStore = new ServerKnowledgeStore();
|
|
292
|
+
}
|
|
293
|
+
if (!sharedDeltaContext.deltaCache) {
|
|
294
|
+
sharedDeltaContext.deltaCache = new DeltaCache(
|
|
295
|
+
cacheManager,
|
|
296
|
+
sharedDeltaContext.knowledgeStore,
|
|
297
|
+
);
|
|
298
|
+
}
|
|
299
|
+
return {
|
|
300
|
+
deltaCache: sharedDeltaContext.deltaCache,
|
|
301
|
+
knowledgeStore: sharedDeltaContext.knowledgeStore,
|
|
302
|
+
params: deltaCacheOrParams,
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
const fallbackKnowledgeStore = new ServerKnowledgeStore();
|
|
307
|
+
const fallbackDeltaCache = new DeltaCache(
|
|
308
|
+
cacheManager,
|
|
309
|
+
fallbackKnowledgeStore,
|
|
310
|
+
);
|
|
311
|
+
return {
|
|
312
|
+
deltaCache: fallbackDeltaCache,
|
|
313
|
+
knowledgeStore: fallbackKnowledgeStore,
|
|
314
|
+
params: deltaCacheOrParams,
|
|
315
|
+
};
|
|
311
316
|
}
|