@actual-app/core 26.3.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/.swcrc +11 -0
- package/bin/build-browser +40 -0
- package/bin/copy-migrations +9 -0
- package/db.sqlite +0 -0
- package/default-db.sqlite +0 -0
- package/migrations/.force-copy-windows +0 -0
- package/migrations/1548957970627_remove-db-version.sql +5 -0
- package/migrations/1550601598648_payees.sql +23 -0
- package/migrations/1555786194328_remove_category_group_unique.sql +25 -0
- package/migrations/1561751833510_indexes.sql +7 -0
- package/migrations/1567699552727_budget.sql +38 -0
- package/migrations/1582384163573_cleared.sql +6 -0
- package/migrations/1597756566448_rules.sql +10 -0
- package/migrations/1608652596043_parent_field.sql +13 -0
- package/migrations/1608652596044_trans_views.sql +56 -0
- package/migrations/1612625548236_optimize.sql +7 -0
- package/migrations/1614782639336_trans_views2.sql +33 -0
- package/migrations/1615745967948_meta.sql +10 -0
- package/migrations/1616167010796_accounts_order.sql +5 -0
- package/migrations/1618975177358_schedules.sql +28 -0
- package/migrations/1632571489012_remove_cache.js +136 -0
- package/migrations/1679728867040_rules_conditions.sql +5 -0
- package/migrations/1681115033845_add_schedule_name.sql +5 -0
- package/migrations/1682974838138_remove_payee_rules.sql +5 -0
- package/migrations/1685007876842_add_category_hidden.sql +6 -0
- package/migrations/1686139660866_remove_account_type.sql +5 -0
- package/migrations/1688749527273_transaction_filters.sql +10 -0
- package/migrations/1688841238000_add_account_type.sql +5 -0
- package/migrations/1691233396000_add_schedule_next_date_tombstone.sql +5 -0
- package/migrations/1694438752000_add_goal_targets.sql +7 -0
- package/migrations/1697046240000_add_reconciled.sql +5 -0
- package/migrations/1704572023730_add_account_sync_source.sql +5 -0
- package/migrations/1704572023731_add_missing_goCardless_sync_source.sql +9 -0
- package/migrations/1707267033000_reports.sql +28 -0
- package/migrations/1712784523000_unhide_input_group.sql +8 -0
- package/migrations/1716359441000_include_current.sql +5 -0
- package/migrations/1720310586000_link_transfer_schedules.sql +19 -0
- package/migrations/1720664867241_add_payee_favorite.sql +5 -0
- package/migrations/1720665000000_goal_context.sql +6 -0
- package/migrations/1722717601000_reports_move_selected_categories.js +55 -0
- package/migrations/1722804019000_create_dashboard_table.js +69 -0
- package/migrations/1723665565000_prefs.js +59 -0
- package/migrations/1730744182000_fix_dashboard_table.sql +7 -0
- package/migrations/1736640000000_custom_report_sorting.sql +7 -0
- package/migrations/1737158400000_add_learn_categories_to_payees.sql +5 -0
- package/migrations/1738491452000_sorting_rename.sql +13 -0
- package/migrations/1739139550000_bank_sync_page.sql +7 -0
- package/migrations/1740506588539_add_last_reconciled_at.sql +5 -0
- package/migrations/1745425408000_update_budgetType_pref.sql +7 -0
- package/migrations/1749799110000_add_tags.sql +10 -0
- package/migrations/1749799110001_tags_tombstone.sql +5 -0
- package/migrations/1754611200000_add_category_template_settings.sql +5 -0
- package/migrations/1759260219000_add_trim_interval_report_setting.sql +6 -0
- package/migrations/1759842823172_add_isGlobal_to_preferences.sql +1 -0
- package/migrations/1762178745667_rename_csv_skip_lines_pref.sql +8 -0
- package/migrations/1765518577215_multiple_dashboards.js +30 -0
- package/migrations/1768872504000_add_payee_locations.sql +21 -0
- package/package.json +128 -0
- package/src/mocks/arbitrary-schema.ts +162 -0
- package/src/mocks/budget.ts +901 -0
- package/src/mocks/files/8859-1.qfx +63 -0
- package/src/mocks/files/best.data-ever$.QFX +124 -0
- package/src/mocks/files/big.data.QiF +91 -0
- package/src/mocks/files/budgets/.commit-to-git +0 -0
- package/src/mocks/files/camt/camt.053.payee-memo.xml +127 -0
- package/src/mocks/files/camt/camt.053.xml +463 -0
- package/src/mocks/files/credit-card.ofx +11 -0
- package/src/mocks/files/data-multi-decimal.ofx +64 -0
- package/src/mocks/files/data-payee-memo.ofx +75 -0
- package/src/mocks/files/data-payee-memo.qif +17 -0
- package/src/mocks/files/data.ofx +124 -0
- package/src/mocks/files/data.qfx +124 -0
- package/src/mocks/files/data.qif +91 -0
- package/src/mocks/files/default-budget-template/db.sqlite +0 -0
- package/src/mocks/files/default-budget-template/metadata.json +6 -0
- package/src/mocks/files/html-vals.qfx +17 -0
- package/src/mocks/index.ts +221 -0
- package/src/mocks/migrations/1508717984291_up_add-poop.sql +13 -0
- package/src/mocks/migrations/1508718036311_up_modify-poop.sql +2 -0
- package/src/mocks/migrations/1508727787513_remove-is_income.sql +15 -0
- package/src/mocks/random.ts +16 -0
- package/src/mocks/setup.ts +180 -0
- package/src/mocks/spreadsheet.ts +101 -0
- package/src/mocks/util.ts +82 -0
- package/src/platform/client/connection/README.md +3 -0
- package/src/platform/client/connection/__mocks__/index.ts +67 -0
- package/src/platform/client/connection/index-types.ts +95 -0
- package/src/platform/client/connection/index.browser.ts +213 -0
- package/src/platform/client/connection/index.ts +155 -0
- package/src/platform/client/undo/index.ts +59 -0
- package/src/platform/exceptions/__mocks__/index.ts +7 -0
- package/src/platform/exceptions/index.ts +9 -0
- package/src/platform/server/asyncStorage/__mocks__/index.ts +50 -0
- package/src/platform/server/asyncStorage/index-types.ts +35 -0
- package/src/platform/server/asyncStorage/index.api.ts +2 -0
- package/src/platform/server/asyncStorage/index.electron.ts +88 -0
- package/src/platform/server/asyncStorage/index.ts +126 -0
- package/src/platform/server/connection/README.md +3 -0
- package/src/platform/server/connection/__mocks__/index.ts +15 -0
- package/src/platform/server/connection/index-types.ts +20 -0
- package/src/platform/server/connection/index.api.ts +13 -0
- package/src/platform/server/connection/index.electron.ts +102 -0
- package/src/platform/server/connection/index.ts +154 -0
- package/src/platform/server/fetch/__mocks__/index.ts +3 -0
- package/src/platform/server/fetch/index.api.ts +1 -0
- package/src/platform/server/fetch/index.electron.ts +18 -0
- package/src/platform/server/fetch/index.ts +20 -0
- package/src/platform/server/fs/index.api.ts +198 -0
- package/src/platform/server/fs/index.electron.ts +208 -0
- package/src/platform/server/fs/index.test.ts +117 -0
- package/src/platform/server/fs/index.ts +416 -0
- package/src/platform/server/fs/path-join.api.ts +1 -0
- package/src/platform/server/fs/path-join.electron.ts +1 -0
- package/src/platform/server/fs/path-join.ts +97 -0
- package/src/platform/server/fs/shared.ts +33 -0
- package/src/platform/server/indexeddb/index.ts +115 -0
- package/src/platform/server/log/index.ts +43 -0
- package/src/platform/server/sqlite/index.api.ts +2 -0
- package/src/platform/server/sqlite/index.electron.ts +134 -0
- package/src/platform/server/sqlite/index.test.ts +108 -0
- package/src/platform/server/sqlite/index.ts +241 -0
- package/src/platform/server/sqlite/normalise.ts +9 -0
- package/src/platform/server/sqlite/unicodeLike.test.ts +58 -0
- package/src/platform/server/sqlite/unicodeLike.ts +31 -0
- package/src/server/__mocks__/post.ts +9 -0
- package/src/server/__snapshots__/main.test.ts.snap +199 -0
- package/src/server/__snapshots__/sheet.test.ts.snap +9 -0
- package/src/server/accounts/__snapshots__/sync.test.ts.snap +136 -0
- package/src/server/accounts/app-bank-sync.test.ts +136 -0
- package/src/server/accounts/app.ts +1294 -0
- package/src/server/accounts/link.ts +25 -0
- package/src/server/accounts/payees.ts +36 -0
- package/src/server/accounts/sync.test.ts +679 -0
- package/src/server/accounts/sync.ts +1168 -0
- package/src/server/accounts/title/index.ts +60 -0
- package/src/server/accounts/title/lower-case.ts +93 -0
- package/src/server/accounts/title/specials.ts +21 -0
- package/src/server/admin/app.ts +241 -0
- package/src/server/api-models.ts +244 -0
- package/src/server/api.test.ts +36 -0
- package/src/server/api.ts +1030 -0
- package/src/server/app.ts +91 -0
- package/src/server/aql/compiler.test.ts +966 -0
- package/src/server/aql/compiler.ts +1222 -0
- package/src/server/aql/exec.test.ts +289 -0
- package/src/server/aql/exec.ts +128 -0
- package/src/server/aql/index.ts +41 -0
- package/src/server/aql/schema/executors.test.ts +420 -0
- package/src/server/aql/schema/executors.ts +345 -0
- package/src/server/aql/schema/index.test.ts +67 -0
- package/src/server/aql/schema/index.ts +409 -0
- package/src/server/aql/schema-helpers.test.ts +242 -0
- package/src/server/aql/schema-helpers.ts +208 -0
- package/src/server/aql/views.test.ts +62 -0
- package/src/server/aql/views.ts +57 -0
- package/src/server/auth/app.ts +387 -0
- package/src/server/bench.ts +29 -0
- package/src/server/budget/actions.ts +686 -0
- package/src/server/budget/app.ts +469 -0
- package/src/server/budget/base.test.ts +340 -0
- package/src/server/budget/base.ts +339 -0
- package/src/server/budget/category-template-context.test.ts +1658 -0
- package/src/server/budget/category-template-context.ts +862 -0
- package/src/server/budget/cleanup-template.pegjs +27 -0
- package/src/server/budget/cleanup-template.ts +408 -0
- package/src/server/budget/envelope.ts +403 -0
- package/src/server/budget/goal-template.pegjs +110 -0
- package/src/server/budget/goal-template.ts +309 -0
- package/src/server/budget/report.ts +308 -0
- package/src/server/budget/schedule-template.test.ts +184 -0
- package/src/server/budget/schedule-template.ts +351 -0
- package/src/server/budget/statements.ts +60 -0
- package/src/server/budget/template-notes.test.ts +393 -0
- package/src/server/budget/template-notes.ts +323 -0
- package/src/server/budget/util.ts +25 -0
- package/src/server/budgetfiles/__snapshots__/backups.test.ts.snap +101 -0
- package/src/server/budgetfiles/app.ts +672 -0
- package/src/server/budgetfiles/backups.test.ts +79 -0
- package/src/server/budgetfiles/backups.ts +251 -0
- package/src/server/cloud-storage.ts +467 -0
- package/src/server/dashboard/app.ts +373 -0
- package/src/server/db/__snapshots__/index.test.ts.snap +271 -0
- package/src/server/db/index.test.ts +300 -0
- package/src/server/db/index.ts +855 -0
- package/src/server/db/mappings.ts +59 -0
- package/src/server/db/sort.ts +58 -0
- package/src/server/db/types/index.ts +342 -0
- package/src/server/db/util.ts +36 -0
- package/src/server/encryption/app.ts +133 -0
- package/src/server/encryption/encryption-internals.api.ts +2 -0
- package/src/server/encryption/encryption-internals.electron.ts +89 -0
- package/src/server/encryption/encryption-internals.ts +109 -0
- package/src/server/encryption/encryption.test.ts +19 -0
- package/src/server/encryption/index.test.ts +19 -0
- package/src/server/encryption/index.ts +89 -0
- package/src/server/errors.ts +110 -0
- package/src/server/filters/app.ts +191 -0
- package/src/server/importers/actual.ts +49 -0
- package/src/server/importers/index.ts +58 -0
- package/src/server/importers/ynab4-types.ts +163 -0
- package/src/server/importers/ynab4.ts +470 -0
- package/src/server/importers/ynab5-types.ts +290 -0
- package/src/server/importers/ynab5.ts +1193 -0
- package/src/server/main-app.ts +25 -0
- package/src/server/main.test.ts +392 -0
- package/src/server/main.ts +336 -0
- package/src/server/migrate/__snapshots__/migrations.test.ts.snap +17 -0
- package/src/server/migrate/cli.ts +100 -0
- package/src/server/migrate/migrations.test.ts +81 -0
- package/src/server/migrate/migrations.ts +192 -0
- package/src/server/models.ts +184 -0
- package/src/server/mutators.ts +139 -0
- package/src/server/notes/app.ts +18 -0
- package/src/server/payees/app.ts +351 -0
- package/src/server/polyfills.ts +26 -0
- package/src/server/post.ts +219 -0
- package/src/server/preferences/app.ts +249 -0
- package/src/server/prefs.ts +91 -0
- package/src/server/reports/app.ts +187 -0
- package/src/server/rules/action.ts +344 -0
- package/src/server/rules/app.ts +193 -0
- package/src/server/rules/condition.ts +436 -0
- package/src/server/rules/customFunctions.ts +61 -0
- package/src/server/rules/formula-action.test.ts +175 -0
- package/src/server/rules/handlebars-helpers.ts +131 -0
- package/src/server/rules/index.test.ts +1095 -0
- package/src/server/rules/index.ts +22 -0
- package/src/server/rules/rule-indexer.ts +89 -0
- package/src/server/rules/rule-utils.ts +274 -0
- package/src/server/rules/rule.ts +193 -0
- package/src/server/schedules/app.test.ts +502 -0
- package/src/server/schedules/app.ts +644 -0
- package/src/server/schedules/find-schedules.ts +391 -0
- package/src/server/server-config.ts +59 -0
- package/src/server/sheet.test.ts +101 -0
- package/src/server/sheet.ts +280 -0
- package/src/server/spreadsheet/__snapshots__/spreadsheet.test.ts.snap +5 -0
- package/src/server/spreadsheet/app.ts +54 -0
- package/src/server/spreadsheet/globals.ts +13 -0
- package/src/server/spreadsheet/graph-data-structure.ts +165 -0
- package/src/server/spreadsheet/scratch +60 -0
- package/src/server/spreadsheet/spreadsheet.test.ts +191 -0
- package/src/server/spreadsheet/spreadsheet.ts +523 -0
- package/src/server/spreadsheet/util.ts +15 -0
- package/src/server/sql/init.sql +88 -0
- package/src/server/sync/__snapshots__/sync.test.ts.snap +31 -0
- package/src/server/sync/app.ts +29 -0
- package/src/server/sync/encoder.ts +129 -0
- package/src/server/sync/index.ts +820 -0
- package/src/server/sync/make-test-message.ts +19 -0
- package/src/server/sync/migrate.test.ts +169 -0
- package/src/server/sync/migrate.ts +48 -0
- package/src/server/sync/repair.ts +39 -0
- package/src/server/sync/reset.ts +91 -0
- package/src/server/sync/sync.property.test.ts +385 -0
- package/src/server/sync/sync.test.ts +349 -0
- package/src/server/sync/utils.ts +3 -0
- package/src/server/tags/app.ts +101 -0
- package/src/server/tests/mockData.json +9352 -0
- package/src/server/tests/mockSyncServer.ts +119 -0
- package/src/server/tools/app.ts +152 -0
- package/src/server/transactions/__snapshots__/transaction-rules.test.ts.snap +173 -0
- package/src/server/transactions/__snapshots__/transfer.test.ts.snap +655 -0
- package/src/server/transactions/app.ts +136 -0
- package/src/server/transactions/export/export-to-csv.ts +132 -0
- package/src/server/transactions/import/__snapshots__/parse-file.test.ts.snap +1582 -0
- package/src/server/transactions/import/ofx2json.test.ts +33 -0
- package/src/server/transactions/import/ofx2json.ts +157 -0
- package/src/server/transactions/import/parse-file.test.ts +224 -0
- package/src/server/transactions/import/parse-file.ts +286 -0
- package/src/server/transactions/import/qif2json.ts +110 -0
- package/src/server/transactions/import/xmlcamt2json.ts +168 -0
- package/src/server/transactions/index.ts +196 -0
- package/src/server/transactions/merge.test.ts +370 -0
- package/src/server/transactions/merge.ts +139 -0
- package/src/server/transactions/transaction-rules.test.ts +994 -0
- package/src/server/transactions/transaction-rules.ts +1038 -0
- package/src/server/transactions/transfer.test.ts +221 -0
- package/src/server/transactions/transfer.ts +173 -0
- package/src/server/undo.ts +271 -0
- package/src/server/update.ts +37 -0
- package/src/server/util/budget-name.ts +61 -0
- package/src/server/util/custom-sync-mapping.ts +48 -0
- package/src/server/util/rschedule.ts +9 -0
- package/src/shared/__mocks__/platform.ts +7 -0
- package/src/shared/__snapshots__/months.test.ts.snap +21 -0
- package/src/shared/arithmetic.test.ts +112 -0
- package/src/shared/arithmetic.ts +170 -0
- package/src/shared/async.test.ts +135 -0
- package/src/shared/async.ts +76 -0
- package/src/shared/constants.ts +5 -0
- package/src/shared/currencies.ts +70 -0
- package/src/shared/dashboard.ts +260 -0
- package/src/shared/environment.ts +18 -0
- package/src/shared/errors.ts +195 -0
- package/src/shared/locale.ts +27 -0
- package/src/shared/location-utils.test.ts +69 -0
- package/src/shared/location-utils.ts +49 -0
- package/src/shared/months.test.ts +5 -0
- package/src/shared/months.ts +485 -0
- package/src/shared/normalisation.ts +6 -0
- package/src/shared/platform.electron.ts +21 -0
- package/src/shared/platform.ts +20 -0
- package/src/shared/query.ts +176 -0
- package/src/shared/rules.test.ts +56 -0
- package/src/shared/rules.ts +371 -0
- package/src/shared/schedules.test.ts +570 -0
- package/src/shared/schedules.ts +560 -0
- package/src/shared/test-helpers.ts +156 -0
- package/src/shared/transactions.test.ts +275 -0
- package/src/shared/transactions.ts +433 -0
- package/src/shared/transfer.test.ts +75 -0
- package/src/shared/transfer.ts +16 -0
- package/src/shared/user.ts +4 -0
- package/src/shared/util.test.ts +240 -0
- package/src/shared/util.ts +633 -0
- package/src/types/api-handlers.ts +287 -0
- package/src/types/budget.ts +8 -0
- package/src/types/file.ts +47 -0
- package/src/types/handlers.ts +46 -0
- package/src/types/models/account.ts +24 -0
- package/src/types/models/bank-sync.ts +23 -0
- package/src/types/models/bank.ts +6 -0
- package/src/types/models/category-group.ts +11 -0
- package/src/types/models/category.ts +13 -0
- package/src/types/models/dashboard.ts +199 -0
- package/src/types/models/gocardless.ts +84 -0
- package/src/types/models/import-transaction.ts +56 -0
- package/src/types/models/index.ts +23 -0
- package/src/types/models/nearby-payee.ts +7 -0
- package/src/types/models/note.ts +4 -0
- package/src/types/models/openid.ts +8 -0
- package/src/types/models/payee-location.ts +8 -0
- package/src/types/models/payee.ts +10 -0
- package/src/types/models/pluggyai.ts +19 -0
- package/src/types/models/reports.ts +144 -0
- package/src/types/models/rule.ts +174 -0
- package/src/types/models/schedule.ts +49 -0
- package/src/types/models/simplefin.ts +28 -0
- package/src/types/models/tags.ts +6 -0
- package/src/types/models/templates.ts +135 -0
- package/src/types/models/transaction-filter.ts +9 -0
- package/src/types/models/transaction.ts +39 -0
- package/src/types/models/user-access.ts +10 -0
- package/src/types/models/user.ts +25 -0
- package/src/types/prefs.ts +167 -0
- package/src/types/server-events.ts +86 -0
- package/src/types/server-handlers.ts +27 -0
- package/src/types/util.ts +26 -0
- package/tsconfig.json +34 -0
- package/typings/pegjs.ts +1 -0
- package/typings/process-worker.ts +12 -0
- package/typings/vite-plugin-peggy-loader.ts +1 -0
- package/typings/window.ts +62 -0
- package/vite.config.ts +109 -0
- package/vite.desktop.config.ts +59 -0
- package/vitest.config.ts +43 -0
- package/vitest.web.config.ts +38 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
CREATE TABLE created_budgets (month TEXT PRIMARY KEY);
|
|
2
|
+
|
|
3
|
+
CREATE TABLE spreadsheet_cells
|
|
4
|
+
(name TEXT PRIMARY KEY,
|
|
5
|
+
expr TEXT,
|
|
6
|
+
cachedValue TEXT);
|
|
7
|
+
|
|
8
|
+
CREATE TABLE banks
|
|
9
|
+
(id TEXT PRIMARY KEY,
|
|
10
|
+
bank_id TEXT,
|
|
11
|
+
name TEXT,
|
|
12
|
+
tombstone INTEGER DEFAULT 0);
|
|
13
|
+
|
|
14
|
+
CREATE TABLE accounts
|
|
15
|
+
(id TEXT PRIMARY KEY,
|
|
16
|
+
account_id TEXT,
|
|
17
|
+
name TEXT,
|
|
18
|
+
balance_current INTEGER,
|
|
19
|
+
balance_available INTEGER,
|
|
20
|
+
balance_limit INTEGER,
|
|
21
|
+
mask TEXT,
|
|
22
|
+
official_name TEXT,
|
|
23
|
+
type TEXT,
|
|
24
|
+
subtype TEXT,
|
|
25
|
+
bank TEXT,
|
|
26
|
+
offbudget INTEGER DEFAULT 0,
|
|
27
|
+
closed INTEGER DEFAULT 0,
|
|
28
|
+
tombstone INTEGER DEFAULT 0);
|
|
29
|
+
|
|
30
|
+
CREATE TABLE pending_transactions
|
|
31
|
+
(id TEXT PRIMARY KEY,
|
|
32
|
+
acct INTEGER,
|
|
33
|
+
amount INTEGER,
|
|
34
|
+
description TEXT,
|
|
35
|
+
date TEXT,
|
|
36
|
+
FOREIGN KEY(acct) REFERENCES accounts(id));
|
|
37
|
+
|
|
38
|
+
CREATE TABLE transactions
|
|
39
|
+
(id TEXT PRIMARY KEY,
|
|
40
|
+
isParent INTEGER DEFAULT 0,
|
|
41
|
+
isChild INTEGER DEFAULT 0,
|
|
42
|
+
acct TEXT,
|
|
43
|
+
category TEXT,
|
|
44
|
+
amount INTEGER,
|
|
45
|
+
description TEXT,
|
|
46
|
+
notes TEXT,
|
|
47
|
+
date INTEGER,
|
|
48
|
+
financial_id TEXT,
|
|
49
|
+
type TEXT,
|
|
50
|
+
location TEXT,
|
|
51
|
+
error TEXT,
|
|
52
|
+
imported_description TEXT,
|
|
53
|
+
starting_balance_flag INTEGER DEFAULT 0,
|
|
54
|
+
transferred_id TEXT,
|
|
55
|
+
sort_order REAL,
|
|
56
|
+
tombstone INTEGER DEFAULT 0);
|
|
57
|
+
|
|
58
|
+
CREATE TABLE categories
|
|
59
|
+
(id TEXT PRIMARY KEY,
|
|
60
|
+
name TEXT,
|
|
61
|
+
is_income INTEGER DEFAULT 0,
|
|
62
|
+
cat_group TEXT,
|
|
63
|
+
sort_order REAL,
|
|
64
|
+
tombstone INTEGER DEFAULT 0);
|
|
65
|
+
|
|
66
|
+
CREATE TABLE category_groups
|
|
67
|
+
(id TEXT PRIMARY KEY,
|
|
68
|
+
name TEXT UNIQUE,
|
|
69
|
+
is_income INTEGER DEFAULT 0,
|
|
70
|
+
sort_order REAL,
|
|
71
|
+
tombstone INTEGER DEFAULT 0);
|
|
72
|
+
|
|
73
|
+
CREATE TABLE messages_crdt
|
|
74
|
+
(id INTEGER PRIMARY KEY,
|
|
75
|
+
timestamp TEXT NOT NULL UNIQUE,
|
|
76
|
+
dataset TEXT NOT NULL,
|
|
77
|
+
row TEXT NOT NULL,
|
|
78
|
+
column TEXT NOT NULL,
|
|
79
|
+
value BLOB NOT NULL);
|
|
80
|
+
|
|
81
|
+
CREATE TABLE category_mapping
|
|
82
|
+
(id TEXT PRIMARY KEY,
|
|
83
|
+
transferId TEXT);
|
|
84
|
+
|
|
85
|
+
CREATE TABLE messages_clock (id INTEGER PRIMARY KEY, clock TEXT);
|
|
86
|
+
|
|
87
|
+
CREATE TABLE db_version (version TEXT PRIMARY KEY);
|
|
88
|
+
CREATE TABLE __migrations__ (id INT PRIMARY KEY NOT NULL);
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
|
+
|
|
3
|
+
exports[`Sync > should send messages to the server 1`] = `
|
|
4
|
+
[
|
|
5
|
+
{
|
|
6
|
+
"column": "amount",
|
|
7
|
+
"dataset": "transactions",
|
|
8
|
+
"id": 1,
|
|
9
|
+
"row": "foo",
|
|
10
|
+
"timestamp": "1970-01-02T10:17:36.789Z-0000-0000000000000id1",
|
|
11
|
+
"value": "N:3200",
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"column": "amount",
|
|
15
|
+
"dataset": "transactions",
|
|
16
|
+
"id": 2,
|
|
17
|
+
"row": "foo",
|
|
18
|
+
"timestamp": "1970-01-02T10:17:37.789Z-0000-0000000000000id1",
|
|
19
|
+
"value": "N:4200",
|
|
20
|
+
},
|
|
21
|
+
]
|
|
22
|
+
`;
|
|
23
|
+
|
|
24
|
+
exports[`Sync > should send messages to the server 2`] = `
|
|
25
|
+
[
|
|
26
|
+
{
|
|
27
|
+
"clock": "{"timestamp":"1970-01-02T10:17:37.789Z-0000-0000000000000id1","merkle":{"2":{"2":{"1":{"1":{"0":{"1":{"2":{"hash":-1992470180},"hash":-1992470180},"hash":-1992470180},"hash":-1992470180},"hash":-1992470180},"hash":-1992470180},"hash":-1992470180},"hash":-1992470180}}",
|
|
28
|
+
"id": 1,
|
|
29
|
+
},
|
|
30
|
+
]
|
|
31
|
+
`;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { createApp } from '../app';
|
|
2
|
+
|
|
3
|
+
import { repairSync as _repairSync } from './repair';
|
|
4
|
+
import { resetSync as _resetSync } from './reset';
|
|
5
|
+
|
|
6
|
+
import { fullSync } from '.';
|
|
7
|
+
|
|
8
|
+
export type SyncHandlers = {
|
|
9
|
+
sync: typeof sync;
|
|
10
|
+
'sync-reset': typeof resetSync;
|
|
11
|
+
'sync-repair': typeof repairSync;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export const app = createApp<SyncHandlers>();
|
|
15
|
+
app.method('sync', sync);
|
|
16
|
+
app.method('sync-reset', resetSync);
|
|
17
|
+
app.method('sync-repair', repairSync);
|
|
18
|
+
|
|
19
|
+
async function sync() {
|
|
20
|
+
return await fullSync();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async function resetSync() {
|
|
24
|
+
return await _resetSync();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async function repairSync() {
|
|
28
|
+
await _repairSync();
|
|
29
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// @ts-strict-ignore
|
|
2
|
+
import { SyncProtoBuf, Timestamp } from '@actual-app/crdt';
|
|
3
|
+
|
|
4
|
+
import { logger } from '../../platform/server/log';
|
|
5
|
+
import * as encryption from '../encryption';
|
|
6
|
+
import { SyncError } from '../errors';
|
|
7
|
+
import * as prefs from '../prefs';
|
|
8
|
+
|
|
9
|
+
import type { Message } from './index';
|
|
10
|
+
|
|
11
|
+
function coerceBuffer(value) {
|
|
12
|
+
// The web encryption APIs give us back raw Uint8Array... but our
|
|
13
|
+
// encryption code assumes we can work with it as a buffer. This is
|
|
14
|
+
// a leaky abstraction and ideally the our abstraction over the web
|
|
15
|
+
// encryption APIs should do this.
|
|
16
|
+
if (!Buffer.isBuffer(value)) {
|
|
17
|
+
return Buffer.from(value);
|
|
18
|
+
}
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export async function encode(
|
|
23
|
+
groupId: string,
|
|
24
|
+
fileId: string,
|
|
25
|
+
since: Timestamp | string,
|
|
26
|
+
messages: Message[],
|
|
27
|
+
): Promise<Uint8Array> {
|
|
28
|
+
const { encryptKeyId } = prefs.getPrefs();
|
|
29
|
+
const requestPb = new SyncProtoBuf.SyncRequest();
|
|
30
|
+
|
|
31
|
+
for (let i = 0; i < messages.length; i++) {
|
|
32
|
+
const msg = messages[i];
|
|
33
|
+
const envelopePb = new SyncProtoBuf.MessageEnvelope();
|
|
34
|
+
envelopePb.setTimestamp(msg.timestamp.toString());
|
|
35
|
+
|
|
36
|
+
const messagePb = new SyncProtoBuf.Message();
|
|
37
|
+
messagePb.setDataset(msg.dataset);
|
|
38
|
+
messagePb.setRow(msg.row);
|
|
39
|
+
messagePb.setColumn(msg.column);
|
|
40
|
+
messagePb.setValue(msg.value as string);
|
|
41
|
+
const binaryMsg = messagePb.serializeBinary();
|
|
42
|
+
|
|
43
|
+
if (encryptKeyId) {
|
|
44
|
+
const encrypted = new SyncProtoBuf.EncryptedData();
|
|
45
|
+
|
|
46
|
+
let result;
|
|
47
|
+
try {
|
|
48
|
+
result = await encryption.encrypt(binaryMsg, encryptKeyId);
|
|
49
|
+
} catch (e) {
|
|
50
|
+
throw new SyncError('encrypt-failure', {
|
|
51
|
+
isMissingKey: e.message === 'missing-key',
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
encrypted.setData(result.value);
|
|
56
|
+
encrypted.setIv(Buffer.from(result.meta.iv, 'base64'));
|
|
57
|
+
encrypted.setAuthtag(Buffer.from(result.meta.authTag, 'base64'));
|
|
58
|
+
|
|
59
|
+
envelopePb.setContent(encrypted.serializeBinary());
|
|
60
|
+
envelopePb.setIsencrypted(true);
|
|
61
|
+
} else {
|
|
62
|
+
envelopePb.setContent(binaryMsg);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
requestPb.addMessages(envelopePb);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
requestPb.setGroupid(groupId);
|
|
69
|
+
requestPb.setFileid(fileId);
|
|
70
|
+
requestPb.setKeyid(encryptKeyId);
|
|
71
|
+
requestPb.setSince(since.toString());
|
|
72
|
+
|
|
73
|
+
return requestPb.serializeBinary();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export async function decode(
|
|
77
|
+
data: Uint8Array,
|
|
78
|
+
): Promise<{ messages: Message[]; merkle: { hash: number } }> {
|
|
79
|
+
const { encryptKeyId } = prefs.getPrefs();
|
|
80
|
+
|
|
81
|
+
const responsePb = SyncProtoBuf.SyncResponse.deserializeBinary(data);
|
|
82
|
+
const merkle = JSON.parse(responsePb.getMerkle());
|
|
83
|
+
const list = responsePb.getMessagesList();
|
|
84
|
+
const messages = [];
|
|
85
|
+
|
|
86
|
+
for (let i = 0; i < list.length; i++) {
|
|
87
|
+
const envelopePb = list[i];
|
|
88
|
+
const timestamp = Timestamp.parse(envelopePb.getTimestamp());
|
|
89
|
+
const encrypted = envelopePb.getIsencrypted();
|
|
90
|
+
let msg;
|
|
91
|
+
|
|
92
|
+
if (encrypted) {
|
|
93
|
+
const binary = SyncProtoBuf.EncryptedData.deserializeBinary(
|
|
94
|
+
envelopePb.getContent() as Uint8Array,
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
let decrypted;
|
|
98
|
+
try {
|
|
99
|
+
decrypted = await encryption.decrypt(coerceBuffer(binary.getData()), {
|
|
100
|
+
keyId: encryptKeyId,
|
|
101
|
+
algorithm: 'aes-256-gcm',
|
|
102
|
+
iv: coerceBuffer(binary.getIv()),
|
|
103
|
+
authTag: coerceBuffer(binary.getAuthtag()),
|
|
104
|
+
});
|
|
105
|
+
} catch (e) {
|
|
106
|
+
logger.log(e);
|
|
107
|
+
throw new SyncError('decrypt-failure', {
|
|
108
|
+
isMissingKey: e.message === 'missing-key',
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
msg = SyncProtoBuf.Message.deserializeBinary(decrypted);
|
|
113
|
+
} else {
|
|
114
|
+
msg = SyncProtoBuf.Message.deserializeBinary(
|
|
115
|
+
envelopePb.getContent() as Uint8Array,
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
messages.push({
|
|
120
|
+
timestamp,
|
|
121
|
+
dataset: msg.getDataset(),
|
|
122
|
+
row: msg.getRow(),
|
|
123
|
+
column: msg.getColumn(),
|
|
124
|
+
value: msg.getValue(),
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return { messages, merkle };
|
|
129
|
+
}
|