@equt/clis 0.1.5 → 0.1.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.
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerSmsParse(program: Command): void;
3
+ //# sourceMappingURL=sms-parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sms-parse.d.ts","sourceRoot":"","sources":["../../../src/bookkeeping/commands/sms-parse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAqFxC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+CvD"}
@@ -0,0 +1,111 @@
1
+ import fs from 'node:fs';
2
+ import process from 'node:process';
3
+ const RE_BOC = /信用卡(\d+)于[^在]+在([^消]+)消费(RMB|USD|JPY|人民币)([0-9,]+(?:\.\d+)?)元/;
4
+ const RE_SPDB = /转入([0-9,]+(?:\.\d+)?)元\[(工资|其他代发)\]/;
5
+ const RE_CMB = /您账户(\d+)于[^信]+信用卡还款交易人民币([0-9,]+(?:\.\d+)?)/;
6
+ const RE_BOS = /本期贷款已足额归还,当期还款本息合计([0-9,]+(?:\.\d+)?)元/;
7
+ const RE_COMMA = /,/g;
8
+ function normalizeCurrency(raw) {
9
+ if (raw === 'RMB' || raw === '人民币')
10
+ return 'CNY';
11
+ return raw;
12
+ }
13
+ function parseAmount(raw) {
14
+ return Number.parseFloat(raw.replace(RE_COMMA, ''));
15
+ }
16
+ function extractDate(createdAt) {
17
+ return createdAt.slice(0, 10);
18
+ }
19
+ function parse95566(text, createdAt) {
20
+ if (text.includes('交易失败'))
21
+ return null;
22
+ const m = RE_BOC.exec(text);
23
+ if (!m)
24
+ return null;
25
+ return {
26
+ date: extractDate(createdAt),
27
+ account: `BOC ${m[1]}`,
28
+ currency: normalizeCurrency(m[3]),
29
+ amount: parseAmount(m[4]),
30
+ merchant: m[2].trim(),
31
+ };
32
+ }
33
+ function parse95528(text, createdAt) {
34
+ const m = RE_SPDB.exec(text);
35
+ if (!m)
36
+ return null;
37
+ return {
38
+ date: extractDate(createdAt),
39
+ account: 'SPDB 6587',
40
+ currency: 'CNY',
41
+ amount: parseAmount(m[1]),
42
+ label: m[2],
43
+ };
44
+ }
45
+ function parse95555(text, createdAt) {
46
+ const m = RE_CMB.exec(text);
47
+ if (!m)
48
+ return null;
49
+ return {
50
+ date: extractDate(createdAt),
51
+ account: `CMB ${m[1]}`,
52
+ currency: 'CNY',
53
+ amount: parseAmount(m[2]),
54
+ };
55
+ }
56
+ function parse95594(text, createdAt) {
57
+ const m = RE_BOS.exec(text);
58
+ if (!m)
59
+ return null;
60
+ return {
61
+ date: extractDate(createdAt),
62
+ account: 'BOSC 5571',
63
+ currency: 'CNY',
64
+ amount: parseAmount(m[1]),
65
+ };
66
+ }
67
+ export function registerSmsParse(program) {
68
+ program
69
+ .command('sms-parse')
70
+ .description('Parse a bank SMS from stdin into a structured transaction')
71
+ .action(() => {
72
+ let raw;
73
+ try {
74
+ raw = fs.readFileSync(0, 'utf-8');
75
+ }
76
+ catch {
77
+ process.exit(0);
78
+ }
79
+ let msg;
80
+ try {
81
+ msg = JSON.parse(raw);
82
+ }
83
+ catch {
84
+ process.exit(0);
85
+ }
86
+ const { sender, text, created_at: createdAt } = msg;
87
+ if (!sender || !text || !createdAt)
88
+ process.exit(0);
89
+ let result = null;
90
+ switch (sender) {
91
+ case '95566':
92
+ result = parse95566(text, createdAt);
93
+ break;
94
+ case '95528':
95
+ result = parse95528(text, createdAt);
96
+ break;
97
+ case '95555':
98
+ result = parse95555(text, createdAt);
99
+ break;
100
+ case '95594':
101
+ result = parse95594(text, createdAt);
102
+ break;
103
+ default:
104
+ result = null;
105
+ }
106
+ if (result === null)
107
+ process.exit(0);
108
+ process.stdout.write(`${JSON.stringify(result)}\n`);
109
+ });
110
+ }
111
+ //# sourceMappingURL=sms-parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sms-parse.js","sourceRoot":"","sources":["../../../src/bookkeeping/commands/sms-parse.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ import { registerCurrencies } from './commands/currencies.js';
7
7
  import { registerJournalInspect } from './commands/journal-inspect.js';
8
8
  import { registerJournals } from './commands/journals.js';
9
9
  import { registerLineAdd } from './commands/line-add.js';
10
+ import { registerSmsParse } from './commands/sms-parse.js';
10
11
  import { registerUnitPrice } from './commands/unit-price.js';
11
12
  program
12
13
  .name('bookkeeping')
@@ -18,6 +19,7 @@ registerJournals(program);
18
19
  registerJournalInspect(program);
19
20
  registerLineAdd(program);
20
21
  registerUnitPrice(program);
22
+ registerSmsParse(program);
21
23
  program.parseAsync(process.argv).catch((err) => {
22
24
  if (APIResponseError.isAPIResponseError(err)) {
23
25
  console.error(`Notion API error ${err.status}: ${err.message}`);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bookkeeping/index.ts"],"names":[],"mappings":";AACA,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5D,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAA;AAE7D,gBAAgB,CAAC,OAAO,CAAC,CAAA;AACzB,kBAAkB,CAAC,OAAO,CAAC,CAAA;AAC3B,gBAAgB,CAAC,OAAO,CAAC,CAAA;AACzB,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,eAAe,CAAC,OAAO,CAAC,CAAA;AACxB,iBAAiB,CAAC,OAAO,CAAC,CAAA;AAE1B,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,IAAI,gBAAgB,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;IACjE,CAAC;SACI,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;SACI,CAAC;QACJ,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;IAC5B,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bookkeeping/index.ts"],"names":[],"mappings":";AACA,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5D,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAA;AAE7D,gBAAgB,CAAC,OAAO,CAAC,CAAA;AACzB,kBAAkB,CAAC,OAAO,CAAC,CAAA;AAC3B,gBAAgB,CAAC,OAAO,CAAC,CAAA;AACzB,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,eAAe,CAAC,OAAO,CAAC,CAAA;AACxB,iBAAiB,CAAC,OAAO,CAAC,CAAA;AAC1B,gBAAgB,CAAC,OAAO,CAAC,CAAA;AAEzB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,IAAI,gBAAgB,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;IACjE,CAAC;SACI,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;SACI,CAAC;QACJ,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;IAC5B,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@equt/clis",
3
3
  "type": "module",
4
- "version": "0.1.5",
4
+ "version": "0.1.7",
5
5
  "packageManager": "bun@1.3.10",
6
6
  "bin": {
7
7
  "bookkeeping": "./dist/bookkeeping/index.js"