bkper 4.12.1 → 4.12.2
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 +12 -9
- package/lib/commands/balances/list.d.ts.map +1 -1
- package/lib/commands/balances/list.js +2 -0
- package/lib/commands/balances/list.js.map +1 -1
- package/lib/commands/transactions/list.d.ts.map +1 -1
- package/lib/commands/transactions/list.js +2 -0
- package/lib/commands/transactions/list.js.map +1 -1
- package/lib/docs/cli-reference.md +12 -9
- package/lib/docs-compliance/rules.d.ts.map +1 -1
- package/lib/docs-compliance/rules.js +10 -1
- package/lib/docs-compliance/rules.js.map +1 -1
- package/lib/utils/query-warning.d.ts +17 -0
- package/lib/utils/query-warning.d.ts.map +1 -0
- package/lib/utils/query-warning.js +67 -0
- package/lib/utils/query-warning.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -289,13 +289,13 @@ bkper transaction create -b abc123 --date 2025-01-15 --amount 100.50 \
|
|
|
289
289
|
--from "Bank Account" --to "Office Supplies" --description "Printer paper"
|
|
290
290
|
|
|
291
291
|
# List transactions for a full year (on:YYYY)
|
|
292
|
-
bkper transaction list -b abc123 -q
|
|
292
|
+
bkper transaction list -b abc123 -q 'on:2025'
|
|
293
293
|
|
|
294
294
|
# List transactions for a month (on:YYYY-MM)
|
|
295
|
-
bkper transaction list -b abc123 -q
|
|
295
|
+
bkper transaction list -b abc123 -q 'on:2025-01'
|
|
296
296
|
|
|
297
297
|
# List with custom properties included
|
|
298
|
-
bkper transaction list -b abc123 -q
|
|
298
|
+
bkper transaction list -b abc123 -q 'account:Sales' -p
|
|
299
299
|
|
|
300
300
|
# Update a transaction
|
|
301
301
|
bkper transaction update tx_456 -b abc123 --amount 120.00 --description "Printer paper (corrected)"
|
|
@@ -349,7 +349,7 @@ Query account balances and group totals.
|
|
|
349
349
|
|
|
350
350
|
```bash
|
|
351
351
|
# List balances for a specific date (point-in-time)
|
|
352
|
-
bkper balance list -b abc123 -q
|
|
352
|
+
bkper balance list -b abc123 -q 'on:2025-12-31'
|
|
353
353
|
|
|
354
354
|
# Monthly balance evolution of one account during 2025
|
|
355
355
|
bkper balance list -b abc123 -q "account:'<accountName>' after:2025-01-01 before:2026-01-01 by:m" --expanded 2
|
|
@@ -373,6 +373,9 @@ Use the same query language across Bkper web app, CLI, and Google Sheets integra
|
|
|
373
373
|
- `on:2025-01-31` → specific day
|
|
374
374
|
- `after:` is **inclusive** and `before:` is **exclusive**.
|
|
375
375
|
- Full year 2025: `after:2025-01-01 before:2026-01-01`
|
|
376
|
+
- In shell commands, wrap queries with Bkper date variables (`$d`, `$m`, `$y`) in single quotes to avoid shell expansion.
|
|
377
|
+
- Example: `bkper transaction list -b abc123 -q 'after:$m-3 before:$m+1'`
|
|
378
|
+
- If the query already needs single quotes inside (for example, `account:'Brex Cash'`), keep double quotes and escape `$`: `-q "account:'Brex Cash' after:\$m-3 before:\$m+1"`
|
|
376
379
|
- For point-in-time statements (typically permanent accounts `ASSET`/`LIABILITY`), prefer `on:` or `before:`.
|
|
377
380
|
- For activity statements over a period (typically non-permanent accounts `INCOMING`/`OUTGOING`), prefer `after:` + `before:`.
|
|
378
381
|
- For statement-level analysis, prefer filtering by the report root group. Root names vary by book.
|
|
@@ -516,25 +519,25 @@ For resources that support stdin creation, JSON output can be piped directly int
|
|
|
516
519
|
bkper account list -b $BOOK_A --format json | bkper account create -b $BOOK_B
|
|
517
520
|
|
|
518
521
|
# Copy transactions matching a query
|
|
519
|
-
bkper transaction list -b $BOOK_A -q
|
|
522
|
+
bkper transaction list -b $BOOK_A -q 'after:2025-01-01' --format json | \
|
|
520
523
|
bkper transaction create -b $BOOK_B
|
|
521
524
|
|
|
522
525
|
# Clone accounts, then transactions
|
|
523
526
|
bkper account list -b $SOURCE --format json | bkper account create -b $DEST
|
|
524
|
-
bkper transaction list -b $SOURCE -q
|
|
527
|
+
bkper transaction list -b $SOURCE -q 'after:2025-01-01' --format json | \
|
|
525
528
|
bkper transaction create -b $DEST
|
|
526
529
|
|
|
527
530
|
# Batch update: list transactions, modify, and pipe back to update
|
|
528
|
-
bkper transaction list -b $BOOK -q
|
|
531
|
+
bkper transaction list -b $BOOK -q 'after:2025-01-01' --format json | \
|
|
529
532
|
jq '[.[] | .description = "Updated: " + .description]' | \
|
|
530
533
|
bkper transaction update -b $BOOK
|
|
531
534
|
|
|
532
535
|
# Batch update: add a property to all matching transactions
|
|
533
|
-
bkper transaction list -b $BOOK -q
|
|
536
|
+
bkper transaction list -b $BOOK -q 'account:Expenses' --format json | \
|
|
534
537
|
bkper transaction update -b $BOOK -p "reviewed=true"
|
|
535
538
|
|
|
536
539
|
# Batch update checked transactions
|
|
537
|
-
bkper transaction list -b $BOOK -q
|
|
540
|
+
bkper transaction list -b $BOOK -q 'is:checked after:2025-01-01' --format json | \
|
|
538
541
|
bkper transaction update -b $BOOK --update-checked -p "migrated=true"
|
|
539
542
|
```
|
|
540
543
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/balances/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/balances/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAG3D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,YAAY,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAE7D;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACpC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,mBAAmB,GAC7B,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAwBtB"}
|
|
@@ -9,6 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
};
|
|
10
10
|
import { BalanceType } from 'bkper-js';
|
|
11
11
|
import { getBkperInstance } from '../../bkper-factory.js';
|
|
12
|
+
import { warnIfSuspiciousDateVariableQuery } from '../../utils/query-warning.js';
|
|
12
13
|
/**
|
|
13
14
|
* Determines the appropriate BalanceType based on query operators.
|
|
14
15
|
* Uses after: presence as the heuristic: after: means PERIOD, otherwise CUMULATIVE.
|
|
@@ -25,6 +26,7 @@ export function resolveBalanceType(query) {
|
|
|
25
26
|
*/
|
|
26
27
|
export function listBalancesMatrix(bookId, options) {
|
|
27
28
|
return __awaiter(this, void 0, void 0, function* () {
|
|
29
|
+
warnIfSuspiciousDateVariableQuery(options.query);
|
|
28
30
|
const bkper = getBkperInstance();
|
|
29
31
|
const book = yield bkper.getBook(bookId);
|
|
30
32
|
const balanceType = resolveBalanceType(options.query);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/balances/list.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/balances/list.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,iCAAiC,EAAE,MAAM,8BAA8B,CAAC;AAWjF;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC5C,OAAO,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC;AAClF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAgB,kBAAkB,CACpC,MAAc,EACd,OAA4B;;QAE5B,iCAAiC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEjD,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEzC,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE3D,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC3B,wDAAwD;YACxD,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACJ,8CAA8C;YAC9C,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/transactions/list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAmB,MAAM,UAAU,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/transactions/list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAmB,MAAM,UAAU,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGvE;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CAClC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,uBAAuB,GACjC,OAAO,CAAC,sBAAsB,CAAC,CAiCjC;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC3C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,uBAAuB,EAChC,MAAM,EAAE,YAAY,GACrB,OAAO,CAAC,UAAU,CAAC,CAoBrB"}
|
|
@@ -8,6 +8,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
10
|
import { getBkperInstance } from '../../bkper-factory.js';
|
|
11
|
+
import { warnIfSuspiciousDateVariableQuery } from '../../utils/query-warning.js';
|
|
11
12
|
/**
|
|
12
13
|
* Queries transactions from a book, automatically paginating through all
|
|
13
14
|
* results until no more pages remain.
|
|
@@ -23,6 +24,7 @@ import { getBkperInstance } from '../../bkper-factory.js';
|
|
|
23
24
|
*/
|
|
24
25
|
export function listTransactions(bookId, options) {
|
|
25
26
|
return __awaiter(this, void 0, void 0, function* () {
|
|
27
|
+
warnIfSuspiciousDateVariableQuery(options.query);
|
|
26
28
|
const bkper = getBkperInstance();
|
|
27
29
|
const book = yield bkper.getBook(bookId, true);
|
|
28
30
|
const allItems = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/transactions/list.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/transactions/list.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,EAAE,iCAAiC,EAAE,MAAM,8BAA8B,CAAC;AAmBjF;;;;;;;;;;;;GAYG;AACH,MAAM,UAAgB,gBAAgB,CAClC,MAAc,EACd,OAAgC;;QAEhC,iCAAiC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEjD,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAE/C,MAAM,QAAQ,GAAkB,EAAE,CAAC;QACnC,IAAI,OAA4B,CAAC;QACjC,IAAI,MAA0B,CAAC;QAE/B,GAAG,CAAC;YACA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;YAC7E,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChC,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;YAC5B,CAAC;YACD,uEAAuE;YACvE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;YACxC,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YACtC,mEAAmE;YACnE,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;gBACvE,MAAM;YACV,CAAC;YACD,MAAM,GAAG,UAAU,CAAC;QACxB,CAAC,QAAQ,IAAI,EAAE;QAEf,OAAO;YACH,IAAI;YACJ,KAAK,EAAE,QAAQ;YACf,OAAO;SACV,CAAC;IACN,CAAC;CAAA;AAED;;;GAGG;AACH,MAAM,UAAgB,yBAAyB,CAC3C,MAAc,EACd,OAAgC,EAChC,MAAoB;;QAEpB,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAEvD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QACrE,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAEhG,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAChF,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC/D,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACrB,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACrC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACtC,CAAC;CAAA"}
|
|
@@ -289,13 +289,13 @@ bkper transaction create -b abc123 --date 2025-01-15 --amount 100.50 \
|
|
|
289
289
|
--from "Bank Account" --to "Office Supplies" --description "Printer paper"
|
|
290
290
|
|
|
291
291
|
# List transactions for a full year (on:YYYY)
|
|
292
|
-
bkper transaction list -b abc123 -q
|
|
292
|
+
bkper transaction list -b abc123 -q 'on:2025'
|
|
293
293
|
|
|
294
294
|
# List transactions for a month (on:YYYY-MM)
|
|
295
|
-
bkper transaction list -b abc123 -q
|
|
295
|
+
bkper transaction list -b abc123 -q 'on:2025-01'
|
|
296
296
|
|
|
297
297
|
# List with custom properties included
|
|
298
|
-
bkper transaction list -b abc123 -q
|
|
298
|
+
bkper transaction list -b abc123 -q 'account:Sales' -p
|
|
299
299
|
|
|
300
300
|
# Update a transaction
|
|
301
301
|
bkper transaction update tx_456 -b abc123 --amount 120.00 --description "Printer paper (corrected)"
|
|
@@ -349,7 +349,7 @@ Query account balances and group totals.
|
|
|
349
349
|
|
|
350
350
|
```bash
|
|
351
351
|
# List balances for a specific date (point-in-time)
|
|
352
|
-
bkper balance list -b abc123 -q
|
|
352
|
+
bkper balance list -b abc123 -q 'on:2025-12-31'
|
|
353
353
|
|
|
354
354
|
# Monthly balance evolution of one account during 2025
|
|
355
355
|
bkper balance list -b abc123 -q "account:'<accountName>' after:2025-01-01 before:2026-01-01 by:m" --expanded 2
|
|
@@ -373,6 +373,9 @@ Use the same query language across Bkper web app, CLI, and Google Sheets integra
|
|
|
373
373
|
- `on:2025-01-31` → specific day
|
|
374
374
|
- `after:` is **inclusive** and `before:` is **exclusive**.
|
|
375
375
|
- Full year 2025: `after:2025-01-01 before:2026-01-01`
|
|
376
|
+
- In shell commands, wrap queries with Bkper date variables (`$d`, `$m`, `$y`) in single quotes to avoid shell expansion.
|
|
377
|
+
- Example: `bkper transaction list -b abc123 -q 'after:$m-3 before:$m+1'`
|
|
378
|
+
- If the query already needs single quotes inside (for example, `account:'Brex Cash'`), keep double quotes and escape `$`: `-q "account:'Brex Cash' after:\$m-3 before:\$m+1"`
|
|
376
379
|
- For point-in-time statements (typically permanent accounts `ASSET`/`LIABILITY`), prefer `on:` or `before:`.
|
|
377
380
|
- For activity statements over a period (typically non-permanent accounts `INCOMING`/`OUTGOING`), prefer `after:` + `before:`.
|
|
378
381
|
- For statement-level analysis, prefer filtering by the report root group. Root names vary by book.
|
|
@@ -516,25 +519,25 @@ For resources that support stdin creation, JSON output can be piped directly int
|
|
|
516
519
|
bkper account list -b $BOOK_A --format json | bkper account create -b $BOOK_B
|
|
517
520
|
|
|
518
521
|
# Copy transactions matching a query
|
|
519
|
-
bkper transaction list -b $BOOK_A -q
|
|
522
|
+
bkper transaction list -b $BOOK_A -q 'after:2025-01-01' --format json | \
|
|
520
523
|
bkper transaction create -b $BOOK_B
|
|
521
524
|
|
|
522
525
|
# Clone accounts, then transactions
|
|
523
526
|
bkper account list -b $SOURCE --format json | bkper account create -b $DEST
|
|
524
|
-
bkper transaction list -b $SOURCE -q
|
|
527
|
+
bkper transaction list -b $SOURCE -q 'after:2025-01-01' --format json | \
|
|
525
528
|
bkper transaction create -b $DEST
|
|
526
529
|
|
|
527
530
|
# Batch update: list transactions, modify, and pipe back to update
|
|
528
|
-
bkper transaction list -b $BOOK -q
|
|
531
|
+
bkper transaction list -b $BOOK -q 'after:2025-01-01' --format json | \
|
|
529
532
|
jq '[.[] | .description = "Updated: " + .description]' | \
|
|
530
533
|
bkper transaction update -b $BOOK
|
|
531
534
|
|
|
532
535
|
# Batch update: add a property to all matching transactions
|
|
533
|
-
bkper transaction list -b $BOOK -q
|
|
536
|
+
bkper transaction list -b $BOOK -q 'account:Expenses' --format json | \
|
|
534
537
|
bkper transaction update -b $BOOK -p "reviewed=true"
|
|
535
538
|
|
|
536
539
|
# Batch update checked transactions
|
|
537
|
-
bkper transaction list -b $BOOK -q
|
|
540
|
+
bkper transaction list -b $BOOK -q 'is:checked after:2025-01-01' --format json | \
|
|
538
541
|
bkper transaction update -b $BOOK --update-checked -p "migrated=true"
|
|
539
542
|
```
|
|
540
543
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/docs-compliance/rules.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,eAAe,EAAE,CAAC;CAC7B;AA4BD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/docs-compliance/rules.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,eAAe,EAAE,CAAC;CAC7B;AA4BD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAgK1E"}
|
|
@@ -30,7 +30,7 @@ export function evaluateReadmeCompliance(content) {
|
|
|
30
30
|
line: getLineNumber(content, sameDayMatch.index),
|
|
31
31
|
});
|
|
32
32
|
}
|
|
33
|
-
const periodInQueryPattern =
|
|
33
|
+
const periodInQueryPattern = /(?:-q|--query)\s+['"][^'"\n]*period:/g;
|
|
34
34
|
let periodMatch;
|
|
35
35
|
while ((periodMatch = periodInQueryPattern.exec(content)) !== null) {
|
|
36
36
|
errors.push({
|
|
@@ -39,6 +39,15 @@ export function evaluateReadmeCompliance(content) {
|
|
|
39
39
|
line: getLineNumber(content, periodMatch.index),
|
|
40
40
|
});
|
|
41
41
|
}
|
|
42
|
+
const doubleQuotedDateVariablePattern = /(?:-q|--query)\s+"[^"\n]*(?<!\\)\$(?:d|m|y)(?:[+-]\d+)?[^"\n]*"/g;
|
|
43
|
+
let doubleQuotedDateVariableMatch;
|
|
44
|
+
while ((doubleQuotedDateVariableMatch = doubleQuotedDateVariablePattern.exec(content)) !== null) {
|
|
45
|
+
errors.push({
|
|
46
|
+
code: 'double-quoted-date-variable-query-example',
|
|
47
|
+
message: 'Found a double-quoted query example with an unescaped Bkper date variable. Prefer single quotes around queries using `$d`, `$m`, or `$y`, or escape `$` inside double quotes.',
|
|
48
|
+
line: getLineNumber(content, doubleQuotedDateVariableMatch.index),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
42
51
|
if (!content.includes('### Book setup guidance (important)')) {
|
|
43
52
|
errors.push({
|
|
44
53
|
code: 'missing-book-setup-guidance-title',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/docs-compliance/rules.ts"],"names":[],"mappings":"AAUA,SAAS,aAAa,CAAC,OAAe,EAAE,KAAa;IACjD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AACtD,CAAC;AAED,SAAS,sBAAsB,CAC3B,OAAe,EACf,cAAsB,EACtB,IAAY,EACZ,OAAe;IAEf,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACrD,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5D,MAAM,CAAC,IAAI,CAAC;gBACR,IAAI;gBACJ,OAAO;gBACP,IAAI,EAAE,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC;aAC5C,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAe;IACpD,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,MAAM,CAAC,IAAI,CACP,GAAG,sBAAsB,CACrB,OAAO,EACP,uCAAuC,EACvC,gCAAgC,EAChC,8DAA8D,CACjE,CACJ,CAAC;IAEF,MAAM,CAAC,IAAI,CACP,GAAG,sBAAsB,CACrB,OAAO,EACP,mCAAmC,EACnC,4BAA4B,EAC5B,0DAA0D,CAC7D,CACJ,CAAC;IAEF,MAAM,mBAAmB,GAAG,+BAA+B,CAAC;IAC5D,IAAI,YAAoC,CAAC;IACzC,OAAO,CAAC,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,4BAA4B;YAClC,OAAO,EAAE,mEAAmE;YAC5E,IAAI,EAAE,aAAa,CAAC,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC;SACnD,CAAC,CAAC;IACP,CAAC;IAED,MAAM,oBAAoB,GAAG,
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/docs-compliance/rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finds suspicious date query fragments that commonly appear when a shell expands
|
|
3
|
+
* Bkper date variables like `$d`, `$m`, or `$y` before the CLI receives the
|
|
4
|
+
* final query string.
|
|
5
|
+
*/
|
|
6
|
+
export declare function findSuspiciousDateQueryFragments(query: string): string[];
|
|
7
|
+
/**
|
|
8
|
+
* Builds a human-readable warning when the query looks like a shell-expanded
|
|
9
|
+
* Bkper date variable.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getSuspiciousDateVariableWarning(query: string): string | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Prints a warning to stderr when the query looks like a shell-expanded Bkper
|
|
14
|
+
* date variable.
|
|
15
|
+
*/
|
|
16
|
+
export declare function warnIfSuspiciousDateVariableQuery(query: string): void;
|
|
17
|
+
//# sourceMappingURL=query-warning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-warning.d.ts","sourceRoot":"","sources":["../../src/utils/query-warning.ts"],"names":[],"mappings":"AAmBA;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAiBxE;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAgBlF;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAKrE"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
const QUOTED_SEGMENT_PATTERN = /'[^']*'|"[^"]*"/g;
|
|
2
|
+
const EMPTY_DATE_OPERATOR_PATTERN = /(?:^|[\s(])(on|after|before):(?=$|[\s)])/g;
|
|
3
|
+
const BARE_SIGNED_OFFSET_PATTERN = /(?:^|[\s(])(on|after|before):([+-]\d{1,3})(?=$|[\s)])/g;
|
|
4
|
+
function sanitizeQueryForDateFragmentScan(query) {
|
|
5
|
+
return query.replace(QUOTED_SEGMENT_PATTERN, match => ' '.repeat(match.length));
|
|
6
|
+
}
|
|
7
|
+
function unique(items) {
|
|
8
|
+
const seen = new Set();
|
|
9
|
+
return items.filter(item => {
|
|
10
|
+
if (seen.has(item)) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
seen.add(item);
|
|
14
|
+
return true;
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Finds suspicious date query fragments that commonly appear when a shell expands
|
|
19
|
+
* Bkper date variables like `$d`, `$m`, or `$y` before the CLI receives the
|
|
20
|
+
* final query string.
|
|
21
|
+
*/
|
|
22
|
+
export function findSuspiciousDateQueryFragments(query) {
|
|
23
|
+
const sanitizedQuery = sanitizeQueryForDateFragmentScan(query);
|
|
24
|
+
const fragments = [];
|
|
25
|
+
EMPTY_DATE_OPERATOR_PATTERN.lastIndex = 0;
|
|
26
|
+
let emptyOperatorMatch;
|
|
27
|
+
while ((emptyOperatorMatch = EMPTY_DATE_OPERATOR_PATTERN.exec(sanitizedQuery)) !== null) {
|
|
28
|
+
fragments.push(`${emptyOperatorMatch[1]}:`);
|
|
29
|
+
}
|
|
30
|
+
BARE_SIGNED_OFFSET_PATTERN.lastIndex = 0;
|
|
31
|
+
let bareSignedOffsetMatch;
|
|
32
|
+
while ((bareSignedOffsetMatch = BARE_SIGNED_OFFSET_PATTERN.exec(sanitizedQuery)) !== null) {
|
|
33
|
+
fragments.push(`${bareSignedOffsetMatch[1]}:${bareSignedOffsetMatch[2]}`);
|
|
34
|
+
}
|
|
35
|
+
return unique(fragments);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Builds a human-readable warning when the query looks like a shell-expanded
|
|
39
|
+
* Bkper date variable.
|
|
40
|
+
*/
|
|
41
|
+
export function getSuspiciousDateVariableWarning(query) {
|
|
42
|
+
const fragments = findSuspiciousDateQueryFragments(query);
|
|
43
|
+
if (fragments.length === 0) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
return [
|
|
47
|
+
`Warning: query contains suspicious date fragment(s): ${fragments.join(', ')}`,
|
|
48
|
+
'This often happens when your shell expands Bkper date variables like $d, $m, or $y.',
|
|
49
|
+
'Use single quotes around the query, for example:',
|
|
50
|
+
" -q 'on:$m'",
|
|
51
|
+
" -q 'after:$m-3 before:$m+1'",
|
|
52
|
+
'Or escape $ inside double quotes:',
|
|
53
|
+
' -q "on:\\$m"',
|
|
54
|
+
' -q "after:\\$m-3 before:\\$m+1"',
|
|
55
|
+
].join('\n');
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Prints a warning to stderr when the query looks like a shell-expanded Bkper
|
|
59
|
+
* date variable.
|
|
60
|
+
*/
|
|
61
|
+
export function warnIfSuspiciousDateVariableQuery(query) {
|
|
62
|
+
const warning = getSuspiciousDateVariableWarning(query);
|
|
63
|
+
if (warning) {
|
|
64
|
+
console.warn(warning);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=query-warning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-warning.js","sourceRoot":"","sources":["../../src/utils/query-warning.ts"],"names":[],"mappings":"AAAA,MAAM,sBAAsB,GAAG,kBAAkB,CAAC;AAClD,MAAM,2BAA2B,GAAG,2CAA2C,CAAC;AAChF,MAAM,0BAA0B,GAAG,wDAAwD,CAAC;AAE5F,SAAS,gCAAgC,CAAC,KAAa;IACnD,OAAO,KAAK,CAAC,OAAO,CAAC,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,MAAM,CAAC,KAAe;IAC3B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QACvB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gCAAgC,CAAC,KAAa;IAC1D,MAAM,cAAc,GAAG,gCAAgC,CAAC,KAAK,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,2BAA2B,CAAC,SAAS,GAAG,CAAC,CAAC;IAC1C,IAAI,kBAA0C,CAAC;IAC/C,OAAO,CAAC,kBAAkB,GAAG,2BAA2B,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACtF,SAAS,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAChD,CAAC;IAED,0BAA0B,CAAC,SAAS,GAAG,CAAC,CAAC;IACzC,IAAI,qBAA6C,CAAC;IAClD,OAAO,CAAC,qBAAqB,GAAG,0BAA0B,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACxF,SAAS,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,IAAI,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gCAAgC,CAAC,KAAa;IAC1D,MAAM,SAAS,GAAG,gCAAgC,CAAC,KAAK,CAAC,CAAC;IAC1D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO;QACH,wDAAwD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC9E,qFAAqF;QACrF,kDAAkD;QAClD,cAAc;QACd,+BAA+B;QAC/B,mCAAmC;QACnC,gBAAgB;QAChB,mCAAmC;KACtC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iCAAiC,CAAC,KAAa;IAC3D,MAAM,OAAO,GAAG,gCAAgC,CAAC,KAAK,CAAC,CAAC;IACxD,IAAI,OAAO,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;AACL,CAAC"}
|