earnrate 0.2.7 → 0.2.9
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 +31 -5
- package/data/CHANGELOG.md +142 -0
- package/data/VERSION +1 -1
- package/data/cards/amex-blue-business-plus.yaml +4 -0
- package/data/cards/amex-blue-cash-everyday.yaml +4 -0
- package/data/cards/amex-blue-cash-preferred.yaml +36 -3
- package/data/cards/amex-gold.yaml +4 -0
- package/data/cards/amex-platinum.yaml +4 -0
- package/data/cards/bank-of-america-atmos-rewards-ascent.yaml +4 -0
- package/data/cards/bank-of-america-atmos-rewards-business.yaml +4 -0
- package/data/cards/bank-of-america-atmos-rewards-summit.yaml +24 -1
- package/data/cards/bank-of-america-customized-cash-rewards.yaml +4 -0
- package/data/cards/bilt-obsidian.yaml +4 -0
- package/data/cards/capital-one-kohls-card.yaml +2 -0
- package/data/cards/capital-one-kohls-rewards-visa.yaml +2 -0
- package/data/cards/capital-one-savor.yaml +4 -0
- package/data/cards/capital-one-venture-x.yaml +4 -0
- package/data/cards/capital-one-venture.yaml +4 -0
- package/data/cards/chase-aeroplan.yaml +5 -0
- package/data/cards/chase-freedom-flex.yaml +4 -0
- package/data/cards/chase-freedom-unlimited.yaml +4 -0
- package/data/cards/chase-ihg-one-rewards-business.yaml +29 -1
- package/data/cards/chase-ihg-one-rewards-premier-select.yaml +37 -2
- package/data/cards/chase-ihg-one-rewards-premier.yaml +29 -1
- package/data/cards/chase-ihg-one-rewards.yaml +57 -7
- package/data/cards/chase-ink-business-cash.yaml +4 -0
- package/data/cards/chase-ink-business-preferred.yaml +4 -0
- package/data/cards/chase-prime-visa.yaml +16 -1
- package/data/cards/chase-sapphire-preferred.yaml +4 -0
- package/data/cards/chase-sapphire-reserve.yaml +4 -0
- package/data/cards/chase-southwest-performance-business.yaml +4 -0
- package/data/cards/chase-southwest-plus.yaml +4 -0
- package/data/cards/chase-southwest-premier-business.yaml +4 -0
- package/data/cards/chase-southwest-premier.yaml +4 -0
- package/data/cards/chase-southwest-priority.yaml +4 -0
- package/data/cards/chase-united-business.yaml +5 -0
- package/data/cards/chase-united-club-business.yaml +5 -0
- package/data/cards/chase-united-club.yaml +5 -0
- package/data/cards/chase-united-explorer.yaml +5 -0
- package/data/cards/chase-united-gateway.yaml +5 -0
- package/data/cards/chase-united-quest.yaml +29 -1
- package/data/cards/citi-aadvantage-business.yaml +4 -0
- package/data/cards/citi-aadvantage-executive.yaml +4 -0
- package/data/cards/citi-aadvantage-globe.yaml +4 -0
- package/data/cards/citi-aadvantage-mileup.yaml +4 -0
- package/data/cards/citi-aadvantage-platinum-select.yaml +4 -0
- package/data/cards/citi-costco-anywhere-visa-business.yaml +4 -0
- package/data/cards/citi-costco-anywhere-visa.yaml +4 -0
- package/data/cards/citi-custom-cash.yaml +2 -0
- package/data/cards/citi-double-cash.yaml +4 -0
- package/data/cards/citi-my-best-buy-visa.yaml +4 -0
- package/data/cards/citi-strata-elite.yaml +4 -0
- package/data/cards/citi-strata-premier.yaml +4 -0
- package/data/cards/sofi-unlimited-2.yaml +4 -0
- package/data/cards/td-bank-nordstrom-credit-card.yaml +2 -0
- package/data/cards/td-bank-nordstrom-visa.yaml +2 -0
- package/data/cards/td-bank-target-circle-card.yaml +2 -0
- package/data/cards/usbank-cash-plus.yaml +5 -0
- package/data/cards/wells-fargo-active-cash.yaml +4 -0
- package/data/cards/wells-fargo-autograph.yaml +4 -0
- package/data/merchants/overrides.yaml +284 -0
- package/data/merchants/seed.yaml +1055 -2
- package/dist/cli/args.js +3 -6
- package/dist/cli/explore.js +10 -0
- package/dist/cli/import.js +21 -9
- package/dist/cli/run.js +3 -1
- package/dist/cli/wallet.js +5 -1
- package/dist/data/atomic-write.js +13 -0
- package/dist/data/file-store.js +2 -2
- package/dist/data/integrity.js +17 -0
- package/dist/data/store.js +5 -2
- package/dist/data/wallet-edit.js +35 -24
- package/dist/engine/cheat-sheet.js +46 -2
- package/dist/engine/checklist.js +19 -8
- package/dist/engine/evaluate.js +2 -0
- package/dist/engine/explore.js +1 -1
- package/dist/engine/milestones.js +83 -0
- package/dist/engine/periods.js +29 -12
- package/dist/engine/recommend.js +43 -9
- package/dist/engine/record.js +39 -1
- package/dist/engine/rule-text.js +5 -1
- package/dist/engine/setup.js +14 -2
- package/dist/engine/simulate.js +25 -3
- package/dist/engine/text.js +11 -0
- package/dist/engine/wallet-change.js +70 -3
- package/dist/engine/wallet-summary.js +17 -5
- package/dist/format/cards.js +3 -1
- package/dist/format/wallet-yaml.js +5 -1
- package/dist/format/wallet.js +18 -4
- package/dist/import/analyze.js +42 -2
- package/dist/mcp/inputs.js +10 -0
- package/dist/mcp/schemas.js +47 -2
- package/dist/mcp/tools/account.js +1 -1
- package/dist/mcp/tools/answers.js +8 -4
- package/dist/mcp/tools/wallet.js +18 -10
- package/dist/merchants/cache.js +3 -5
- package/dist/merchants/fallback.js +8 -0
- package/dist/merchants/missed.js +5 -6
- package/dist/schema/card-number.js +31 -0
- package/dist/schema/card.js +22 -1
- package/dist/schema/common.js +4 -0
- package/dist/schema/wallet.js +12 -2
- package/package.json +5 -3
package/dist/schema/wallet.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { CurrencyId, IsoDate, KebabId, PeriodKey, ValueRange, } from "./common.js";
|
|
3
|
+
import { CARD_NUMBER_LABEL, CARD_NUMBER_REDEMPTION, hasCardNumber, labelHasCardNumber, } from "./card-number.js";
|
|
3
4
|
const Valuation = z.union([
|
|
4
5
|
z.number().positive(),
|
|
5
6
|
z.strictObject({
|
|
6
7
|
value: z.number().positive().optional(),
|
|
7
8
|
range: ValueRange.optional(),
|
|
8
|
-
redemption: z
|
|
9
|
+
redemption: z
|
|
10
|
+
.string()
|
|
11
|
+
.refine((t) => !hasCardNumber(t), CARD_NUMBER_REDEMPTION)
|
|
12
|
+
.optional(),
|
|
9
13
|
}),
|
|
10
14
|
]);
|
|
11
15
|
const CapUsage = z.strictObject({
|
|
@@ -14,7 +18,11 @@ const CapUsage = z.strictObject({
|
|
|
14
18
|
});
|
|
15
19
|
export const WalletCardSchema = z.strictObject({
|
|
16
20
|
id: KebabId,
|
|
17
|
-
checkout_label: z
|
|
21
|
+
checkout_label: z
|
|
22
|
+
.string()
|
|
23
|
+
.min(1)
|
|
24
|
+
.refine((t) => !labelHasCardNumber(t), CARD_NUMBER_LABEL)
|
|
25
|
+
.optional(),
|
|
18
26
|
// MM-DD, needed only for cardmember_year caps.
|
|
19
27
|
anniversary: z
|
|
20
28
|
.string()
|
|
@@ -29,6 +37,8 @@ export const WalletCardSchema = z.strictObject({
|
|
|
29
37
|
})
|
|
30
38
|
.optional(),
|
|
31
39
|
activated: z.array(KebabId).default([]),
|
|
40
|
+
// Keyed by milestone id: every purchase on the card this period.
|
|
41
|
+
milestone_usage: z.record(KebabId, CapUsage).optional(),
|
|
32
42
|
// A welcome bonus in progress. Terms default to the card's published
|
|
33
43
|
// offer; set spend, by, points or dollars when yours was different.
|
|
34
44
|
bonus: z
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "earnrate",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.9",
|
|
4
4
|
"description": "Which credit card earns the most at a merchant, from your cards or every card, and why",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"credit cards",
|
|
@@ -46,13 +46,15 @@
|
|
|
46
46
|
"remote:build": "node scripts/build-remote.ts",
|
|
47
47
|
"remote:check": "yarn remote:build && WRANGLER_SEND_METRICS=false wrangler deploy --config remote/wrangler.jsonc --dry-run --outdir dist",
|
|
48
48
|
"remote:deploy": "yarn remote:build && WRANGLER_SEND_METRICS=false wrangler deploy --config remote/wrangler.jsonc",
|
|
49
|
+
"monitor:check": "WRANGLER_SEND_METRICS=false wrangler deploy --config monitor/wrangler.jsonc --dry-run --outdir dist",
|
|
50
|
+
"monitor:deploy": "WRANGLER_SEND_METRICS=false wrangler deploy --config monitor/wrangler.jsonc",
|
|
49
51
|
"site:build": "vite build site && node scripts/build-pages.ts",
|
|
50
52
|
"site:dev": "vite site",
|
|
51
53
|
"site:deploy": "yarn site:build && WRANGLER_SEND_METRICS=false wrangler deploy",
|
|
52
54
|
"test": "vitest run",
|
|
53
55
|
"test:watch": "vitest",
|
|
54
56
|
"coverage": "vitest run --coverage --coverage.include=src/**",
|
|
55
|
-
"typecheck": "tsc && tsc -p site && tsc -p remote",
|
|
57
|
+
"typecheck": "tsc && tsc -p site && tsc -p remote && tsc -p monitor",
|
|
56
58
|
"lint": "eslint",
|
|
57
59
|
"format": "prettier --write .",
|
|
58
60
|
"format:check": "prettier --check .",
|
|
@@ -81,6 +83,6 @@
|
|
|
81
83
|
"typescript-eslint": "^8.72.0",
|
|
82
84
|
"vite": "^8.3.5",
|
|
83
85
|
"vitest": "^5.0.5",
|
|
84
|
-
"wrangler": "4.
|
|
86
|
+
"wrangler": "4.156.2"
|
|
85
87
|
}
|
|
86
88
|
}
|