From 2a4a62ad9ac5d95d45789330b755ccfce34a7267 Mon Sep 17 00:00:00 2001
From: Matiss Janis Aboltins <matiss@mja.lv>
Date: Mon, 2 Jan 2023 19:30:48 +0000
Subject: [PATCH] chore: remove more unused variables

---
 packages/loot-core/package.json               |  1 -
 .../loot-core/src/client/actions/budgets.js   |  2 -
 .../loot-core/src/client/actions/queries.js   |  2 -
 packages/loot-core/src/client/actions/user.js |  2 +-
 .../src/client/query-helpers.test.js          |  4 +-
 packages/loot-core/src/client/query-hooks.js  |  4 --
 .../loot-core/src/client/shared-listeners.js  |  2 +-
 packages/loot-core/src/mocks/budget.js        | 21 ++--------
 .../src/platform/client/undo/index.web.js     |  1 -
 .../platform/server/asyncStorage/index.web.js |  2 +-
 .../platform/server/connection/index.web.js   |  1 -
 .../platform/server/indexeddb/index.web.js    |  2 +-
 .../platform/server/sqlite/index.web.test.js  |  2 -
 .../src/server/accounts/parse-file.test.js    |  6 +--
 .../loot-core/src/server/accounts/rules.js    |  9 -----
 .../src/server/accounts/rules.test.js         | 38 +++++++------------
 .../loot-core/src/server/accounts/sync.js     |  5 +--
 .../src/server/accounts/sync.test.js          |  8 ++--
 .../src/server/accounts/transaction-rules.js  |  5 ---
 .../loot-core/src/server/accounts/transfer.js |  3 +-
 packages/loot-core/src/server/aql/compiler.js | 34 +++--------------
 .../src/server/aql/schema/executors.js        |  3 +-
 .../loot-core/src/server/aql/schema/index.js  |  2 +-
 .../loot-core/src/server/budget/actions.js    |  5 ---
 packages/loot-core/src/server/budget/base.js  | 14 -------
 .../loot-core/src/server/cloud-storage.js     |  4 +-
 .../loot-core/src/server/crdt/merkle.test.js  | 29 --------------
 packages/loot-core/src/server/db/index.js     | 32 ----------------
 packages/loot-core/src/server/main.js         | 22 ++++-------
 packages/loot-core/src/server/main.test.js    |  4 +-
 packages/loot-core/src/server/post.js         |  2 -
 .../loot-core/src/server/schedules/app.js     |  6 +--
 .../src/server/schedules/find-schedules.js    |  2 -
 .../src/server/spreadsheet/new/compiler.js    |  2 +-
 .../src/server/spreadsheet/new/parser.js      |  2 +-
 .../src/server/spreadsheet/new/sqlgen.js      |  1 -
 .../server/spreadsheet/spreadsheet.test.js    |  2 +
 .../src/server/spreadsheet/sqlinterp.test.js  |  2 +-
 .../spreadsheet/tests/data-propagation.js     |  9 -----
 .../loot-core/src/server/spreadsheet/usage.js |  1 -
 .../loot-core/src/server/spreadsheet/util.js  |  1 -
 packages/loot-core/src/server/sync/index.js   |  3 +-
 packages/loot-core/src/server/sync/migrate.js |  3 +-
 .../loot-core/src/server/sync/sync.test.js    | 29 +++++++-------
 .../src/server/tests/mockSyncServer.js        |  4 +-
 packages/loot-core/src/shared/arithmetic.js   |  4 --
 packages/loot-core/src/shared/async.test.js   |  1 -
 yarn.lock                                     |  1 -
 48 files changed, 73 insertions(+), 271 deletions(-)
 delete mode 100644 packages/loot-core/src/server/spreadsheet/tests/data-propagation.js

diff --git a/packages/loot-core/package.json b/packages/loot-core/package.json
index b87a4a4ee..eef1020b0 100644
--- a/packages/loot-core/package.json
+++ b/packages/loot-core/package.json
@@ -47,7 +47,6 @@
     "babel-loader": "^8.0.6",
     "buffer": "^5.5.0",
     "cross-env": "^7.0.3",
-    "damerau-levenshtein": "^1.0.4",
     "date-fns": "2.0.0-alpha.27",
     "eslint": "5.6.0",
     "eslint-plugin-import": "^2.26.0",
diff --git a/packages/loot-core/src/client/actions/budgets.js b/packages/loot-core/src/client/actions/budgets.js
index 0a8435143..9c1ec2e21 100644
--- a/packages/loot-core/src/client/actions/budgets.js
+++ b/packages/loot-core/src/client/actions/budgets.js
@@ -6,8 +6,6 @@ import { closeModal, pushModal } from './modals';
 import { loadPrefs, loadGlobalPrefs } from './prefs';
 import { startTutorialFirstTime } from './tutorial';
 
-const uuid = require('../../platform/uuid');
-
 export function updateStatusText(text) {
   return (dispatch, getState) => {
     const { loadingText } = getState().app;
diff --git a/packages/loot-core/src/client/actions/queries.js b/packages/loot-core/src/client/actions/queries.js
index 7bd94c7d7..e33a0c7fd 100644
--- a/packages/loot-core/src/client/actions/queries.js
+++ b/packages/loot-core/src/client/actions/queries.js
@@ -96,7 +96,6 @@ export function deleteCategory(id, transferId) {
     let { error } = await send('category-delete', { id, transferId });
 
     if (error) {
-      let msg;
       switch (error) {
         case 'category-type':
           dispatch(
@@ -164,7 +163,6 @@ export function updateGroup(group) {
 
 export function deleteGroup(id, transferId) {
   return async function(dispatch, getState) {
-    const group = getState().queries.categories.grouped.find(g => g.id === id);
     await send('category-group-delete', { id, transferId });
     await dispatch(getCategories());
     // See `deleteCategory` for why we need this
diff --git a/packages/loot-core/src/client/actions/user.js b/packages/loot-core/src/client/actions/user.js
index a3168f135..30da53705 100644
--- a/packages/loot-core/src/client/actions/user.js
+++ b/packages/loot-core/src/client/actions/user.js
@@ -39,7 +39,7 @@ export function loggedIn() {
 
 export function signOut() {
   return async dispatch => {
-    const data = await send('subscribe-sign-out');
+    await send('subscribe-sign-out');
 
     dispatch(getUserData());
     dispatch(loadGlobalPrefs());
diff --git a/packages/loot-core/src/client/query-helpers.test.js b/packages/loot-core/src/client/query-helpers.test.js
index 0eba14bc5..318a13710 100644
--- a/packages/loot-core/src/client/query-helpers.test.js
+++ b/packages/loot-core/src/client/query-helpers.test.js
@@ -337,7 +337,7 @@ describe('query helpers', () => {
     tracer.start();
 
     let query = q('transactions').select('id');
-    let paged = pagedQuery(query, data => tracer.event('data', data), {
+    pagedQuery(query, data => tracer.event('data', data), {
       pageCount: 10
     });
 
@@ -349,7 +349,7 @@ describe('query helpers', () => {
   });
 
   it('pagedQuery only runs `fetchNext` once at a time', async () => {
-    let data = initPagingServer(1000, { delay: 200 });
+    initPagingServer(1000, { delay: 200 });
     tracer.start();
 
     let query = q('transactions').select('id');
diff --git a/packages/loot-core/src/client/query-hooks.js b/packages/loot-core/src/client/query-hooks.js
index 97ef446c1..4cedb29ca 100644
--- a/packages/loot-core/src/client/query-hooks.js
+++ b/packages/loot-core/src/client/query-hooks.js
@@ -114,7 +114,3 @@ export function useLiveQuery(query, opts) {
 
   return { data };
 }
-
-function usePagedQuery(query) {
-  // TODO
-}
diff --git a/packages/loot-core/src/client/shared-listeners.js b/packages/loot-core/src/client/shared-listeners.js
index f22386d1e..287a860f4 100644
--- a/packages/loot-core/src/client/shared-listeners.js
+++ b/packages/loot-core/src/client/shared-listeners.js
@@ -170,7 +170,7 @@ export function listenForSyncEvent(actions, store) {
           // the server does not match the local one. This can mean a
           // few things depending on the state, and we try to show an
           // appropriate message and call to action to fix it.
-          let { groupId, cloudFileId } = store.getState().prefs.local;
+          let { cloudFileId } = store.getState().prefs.local;
 
           notif = {
             title: 'Syncing has been reset on this cloud file',
diff --git a/packages/loot-core/src/mocks/budget.js b/packages/loot-core/src/mocks/budget.js
index 1a1dd18fd..8647338e1 100644
--- a/packages/loot-core/src/mocks/budget.js
+++ b/packages/loot-core/src/mocks/budget.js
@@ -265,12 +265,7 @@ async function fillChecking(handlers, account, payees, groups) {
 }
 
 async function fillInvestment(handlers, account, payees, groups) {
-  let {
-    incomePayee,
-    expensePayees,
-    incomeGroup,
-    expenseCategories
-  } = extractCommonThings(payees, groups);
+  let { incomePayee, incomeGroup } = extractCommonThings(payees, groups);
 
   let numTransactions = integer(10, 30);
 
@@ -355,12 +350,7 @@ async function fillSavings(handlers, account, payees, groups) {
 }
 
 async function fillMortgage(handlers, account, payees, groups) {
-  let {
-    incomePayee,
-    expensePayees,
-    incomeGroup,
-    expenseCategories
-  } = extractCommonThings(payees, groups);
+  let { incomePayee, incomeGroup } = extractCommonThings(payees, groups);
 
   let numTransactions = integer(7, 10);
   let amount = integer(100000, 200000);
@@ -397,12 +387,7 @@ async function fillMortgage(handlers, account, payees, groups) {
 }
 
 async function fillOther(handlers, account, payees, groups) {
-  let {
-    incomePayee,
-    expensePayees,
-    incomeGroup,
-    expenseCategories
-  } = extractCommonThings(payees, groups);
+  let { incomePayee, incomeGroup } = extractCommonThings(payees, groups);
 
   let numTransactions = integer(3, 6);
   let category = incomeGroup.categories.find(c => c.name === 'Income');
diff --git a/packages/loot-core/src/platform/client/undo/index.web.js b/packages/loot-core/src/platform/client/undo/index.web.js
index bd57f412d..01911ff54 100644
--- a/packages/loot-core/src/platform/client/undo/index.web.js
+++ b/packages/loot-core/src/platform/client/undo/index.web.js
@@ -1,4 +1,3 @@
-const { getChangedValues } = require('../../../shared/util');
 const uuid = require('../../uuid');
 
 // List of recently used states. We don't use a true MRU structure
diff --git a/packages/loot-core/src/platform/server/asyncStorage/index.web.js b/packages/loot-core/src/platform/server/asyncStorage/index.web.js
index 7f7d5078e..71d5e6dcb 100644
--- a/packages/loot-core/src/platform/server/asyncStorage/index.web.js
+++ b/packages/loot-core/src/platform/server/asyncStorage/index.web.js
@@ -32,7 +32,7 @@ async function setItem(key, value) {
   let transaction = db.transaction(['asyncStorage'], 'readwrite');
   let objectStore = transaction.objectStore('asyncStorage');
 
-  let promise = new Promise((resolve, reject) => {
+  new Promise((resolve, reject) => {
     let req = objectStore.put(value, key);
     req.onerror = e => reject(e);
     req.onsuccess = e => resolve();
diff --git a/packages/loot-core/src/platform/server/connection/index.web.js b/packages/loot-core/src/platform/server/connection/index.web.js
index f9daff8b0..93bb7228d 100644
--- a/packages/loot-core/src/platform/server/connection/index.web.js
+++ b/packages/loot-core/src/platform/server/connection/index.web.js
@@ -1,5 +1,4 @@
 const { runHandler, isMutating } = require('../../../server/mutators');
-const { sequential } = require('../../../shared/async');
 const { captureException } = require('../../exceptions');
 
 function getGlobalObject() {
diff --git a/packages/loot-core/src/platform/server/indexeddb/index.web.js b/packages/loot-core/src/platform/server/indexeddb/index.web.js
index 49d30fcce..2fc7d29fd 100644
--- a/packages/loot-core/src/platform/server/indexeddb/index.web.js
+++ b/packages/loot-core/src/platform/server/indexeddb/index.web.js
@@ -131,7 +131,7 @@ function openDatabase() {
 
 function closeDatabase() {
   if (openedDb) {
-    let promise = openedDb.then(db => {
+    openedDb.then(db => {
       db.close();
     });
     openedDb = null;
diff --git a/packages/loot-core/src/platform/server/sqlite/index.web.test.js b/packages/loot-core/src/platform/server/sqlite/index.web.test.js
index 3d343f1c4..8ba9b1c19 100644
--- a/packages/loot-core/src/platform/server/sqlite/index.web.test.js
+++ b/packages/loot-core/src/platform/server/sqlite/index.web.test.js
@@ -6,8 +6,6 @@ import {
   runQuery
 } from './index.web';
 
-let os = require('os');
-
 beforeAll(() => {
   process.env.PUBLIC_URL =
     __dirname + '/../../../../../../node_modules/@jlongster/sql.js/dist/';
diff --git a/packages/loot-core/src/server/accounts/parse-file.test.js b/packages/loot-core/src/server/accounts/parse-file.test.js
index ee3cc1a9b..4c4b30581 100644
--- a/packages/loot-core/src/server/accounts/parse-file.test.js
+++ b/packages/loot-core/src/server/accounts/parse-file.test.js
@@ -44,7 +44,7 @@ describe('File import', () => {
   test('qif import works', async () => {
     prefs.loadPrefs();
     await db.insertAccount({ id: 'one', name: 'one' });
-    let { errors, added } = await importFileWithRealTime(
+    let { errors } = await importFileWithRealTime(
       'one',
       __dirname + '/../../mocks/files/data.qif',
       'MM/dd/yy'
@@ -57,7 +57,7 @@ describe('File import', () => {
     prefs.loadPrefs();
     await db.insertAccount({ id: 'one', name: 'one' });
 
-    let { errors, added } = await importFileWithRealTime(
+    let { errors } = await importFileWithRealTime(
       'one',
       __dirname + '/../../mocks/files/data.ofx'
     );
@@ -69,7 +69,7 @@ describe('File import', () => {
     prefs.loadPrefs();
     await db.insertAccount({ id: 'one', name: 'one' });
 
-    let { errors, added } = await importFileWithRealTime(
+    let { errors } = await importFileWithRealTime(
       'one',
       __dirname + '/../../mocks/files/data.qfx'
     );
diff --git a/packages/loot-core/src/server/accounts/rules.js b/packages/loot-core/src/server/accounts/rules.js
index 3667bf0c4..51d110d98 100644
--- a/packages/loot-core/src/server/accounts/rules.js
+++ b/packages/loot-core/src/server/accounts/rules.js
@@ -15,14 +15,6 @@ import { fastSetMerge } from '../../shared/util';
 import { RuleError } from '../errors';
 import { Schedule as RSchedule } from '../util/rschedule';
 
-function safeNumber(n) {
-  return isNaN(n) ? null : n;
-}
-
-function safeParseInt(n) {
-  return safeNumber(parseInt(n));
-}
-
 function assert(test, type, msg) {
   if (!test) {
     throw new RuleError(type, msg);
@@ -703,7 +695,6 @@ export function migrateIds(rule, mappings) {
 
 // This finds all the rules that reference the `id`
 export function iterateIds(rules, fieldName, func) {
-  let counts = {};
   let i;
 
   ruleiter: for (i = 0; i < rules.length; i++) {
diff --git a/packages/loot-core/src/server/accounts/rules.test.js b/packages/loot-core/src/server/accounts/rules.test.js
index 1b6db9900..9f284b2e5 100644
--- a/packages/loot-core/src/server/accounts/rules.test.js
+++ b/packages/loot-core/src/server/accounts/rules.test.js
@@ -72,19 +72,19 @@ describe('Condition', () => {
 
   test('date restricts operators for each type', () => {
     expect(() => {
-      let cond = new Condition('isapprox', 'date', '2020-08', null, fieldTypes);
+      new Condition('isapprox', 'date', '2020-08', null, fieldTypes);
     }).toThrow('Invalid date value for');
     expect(() => {
-      let cond = new Condition('gt', 'date', '2020-08', null, fieldTypes);
+      new Condition('gt', 'date', '2020-08', null, fieldTypes);
     }).toThrow('Invalid date value for');
     expect(() => {
-      let cond = new Condition('gte', 'date', '2020-08', null, fieldTypes);
+      new Condition('gte', 'date', '2020-08', null, fieldTypes);
     }).toThrow('Invalid date value for');
     expect(() => {
-      let cond = new Condition('lt', 'date', '2020-08', null, fieldTypes);
+      new Condition('lt', 'date', '2020-08', null, fieldTypes);
     }).toThrow('Invalid date value for');
     expect(() => {
-      let cond = new Condition('lte', 'date', '2020-08', null, fieldTypes);
+      new Condition('lte', 'date', '2020-08', null, fieldTypes);
     }).toThrow('Invalid date value for');
   });
 
@@ -224,23 +224,17 @@ describe('Condition', () => {
   });
 
   test('number validates value', () => {
-    let cond = new Condition('isapprox', 'amount', 34, null, fieldTypes);
+    new Condition('isapprox', 'amount', 34, null, fieldTypes);
 
     expect(() => {
-      cond = new Condition('isapprox', 'amount', 'hello', null, fieldTypes);
+      new Condition('isapprox', 'amount', 'hello', null, fieldTypes);
     }).toThrow('Value must be a number or between amount');
 
     expect(() => {
-      cond = new Condition(
-        'is',
-        'amount',
-        { num1: 0, num2: 10 },
-        null,
-        fieldTypes
-      );
+      new Condition('is', 'amount', { num1: 0, num2: 10 }, null, fieldTypes);
     }).toThrow('Invalid number value for');
 
-    cond = new Condition(
+    new Condition(
       'isbetween',
       'amount',
       { num1: 0, num2: 10 },
@@ -249,16 +243,10 @@ describe('Condition', () => {
     );
 
     expect(() => {
-      cond = new Condition('isbetween', 'amount', 34.22, null, fieldTypes);
+      new Condition('isbetween', 'amount', 34.22, null, fieldTypes);
     }).toThrow('Invalid between value for');
     expect(() => {
-      cond = new Condition(
-        'isbetween',
-        'amount',
-        { num1: 0 },
-        null,
-        fieldTypes
-      );
+      new Condition('isbetween', 'amount', { num1: 0 }, null, fieldTypes);
     }).toThrow('Value must be a number or between amount');
   });
 
@@ -326,11 +314,11 @@ describe('Action', () => {
     expect(item.name).toBe('James');
 
     expect(() => {
-      let action = new Action('set', 'foo', 'James', null, new Map());
+      new Action('set', 'foo', 'James', null, new Map());
     }).toThrow(/invalid field/i);
 
     expect(() => {
-      let action = new Action('noop', 'name', 'James', null, fieldTypes);
+      new Action('noop', 'name', 'James', null, fieldTypes);
     }).toThrow(/invalid action operation/i);
   });
 });
diff --git a/packages/loot-core/src/server/accounts/sync.js b/packages/loot-core/src/server/accounts/sync.js
index b242d02ec..3b1e34d0f 100644
--- a/packages/loot-core/src/server/accounts/sync.js
+++ b/packages/loot-core/src/server/accounts/sync.js
@@ -13,7 +13,6 @@ import title from './title';
 import { runRules } from './transaction-rules';
 import { batchUpdateTransactions } from './transactions';
 
-const levenshtein = require('damerau-levenshtein');
 const dateFns = require('date-fns');
 
 const uuid = require('../../platform/uuid');
@@ -331,7 +330,7 @@ export async function reconcileTransactions(acctId, transactions) {
   });
 
   // Finally, generate & commit the changes
-  for (let { payee_name, trans, subtransactions, match } of transactionsStep3) {
+  for (let { trans, subtransactions, match } of transactionsStep3) {
     if (match) {
       // TODO: change the above sql query to use aql
       let existing = {
@@ -395,7 +394,7 @@ export async function addTransactions(
     { rawPayeeName: true }
   );
 
-  for (let { payee_name, trans, subtransactions } of normalized) {
+  for (let { trans, subtransactions } of normalized) {
     // Run the rules
     trans = runRules(trans);
 
diff --git a/packages/loot-core/src/server/accounts/sync.test.js b/packages/loot-core/src/server/accounts/sync.test.js
index 8aec8fe7f..c5ac09e1f 100644
--- a/packages/loot-core/src/server/accounts/sync.test.js
+++ b/packages/loot-core/src/server/accounts/sync.test.js
@@ -101,8 +101,7 @@ async function getAllPayees() {
 describe('Account sync', () => {
   test('reconcile creates payees correctly', async () => {
     monthUtils.currentDay = () => '2017-10-15';
-    let mockTransactions = prepMockTransactions();
-    let { id, account_id } = await prepareDatabase();
+    let { id } = await prepareDatabase();
 
     let payees = await getAllPayees();
     expect(payees.length).toBe(0);
@@ -134,7 +133,6 @@ describe('Account sync', () => {
 
     // The payee can be anything, all that matters is the amount is the same
     let mockTransaction = mockTransactions.find(t => t.date === '2017-10-17');
-    let payeeName = mockTransaction.name;
     mockTransaction.amount = 29.47;
 
     let payeeId = await db.insertPayee({ name: 'macy' });
@@ -359,7 +357,7 @@ describe('Account sync', () => {
   test('reconcile handles transactions with undefined fields', async () => {
     const { id: acctId } = await prepareDatabase();
 
-    const transactionId = await db.insertTransaction({
+    await db.insertTransaction({
       id: 'one',
       account: acctId,
       amount: 2948,
@@ -523,7 +521,7 @@ describe('Account sync', () => {
         payee: null
       });
 
-      let { added, updated } = await reconcileTransactions(acctId, [
+      let { updated } = await reconcileTransactions(acctId, [
         {
           date: '2017-10-17',
           payee_name: 'bakkerij',
diff --git a/packages/loot-core/src/server/accounts/transaction-rules.js b/packages/loot-core/src/server/accounts/transaction-rules.js
index 26309cbc8..04df4b177 100644
--- a/packages/loot-core/src/server/accounts/transaction-rules.js
+++ b/packages/loot-core/src/server/accounts/transaction-rules.js
@@ -257,7 +257,6 @@ function onApplySync(oldValues, newValues) {
 // Runner
 export function runRules(trans) {
   let finalTrans = { ...trans };
-  let allChanges = {};
 
   let rules = rankRules(
     fastSetMerge(
@@ -346,8 +345,6 @@ export function conditionsToAQL(conditions, { recurDateBounds = 100 } = {}) {
               .toArray()
               .map(d => dayFromDate(d.date));
 
-            let compare = d => ({ $eq: d });
-
             return {
               $or: dates.map(d => {
                 if (op === 'isapprox') {
@@ -362,8 +359,6 @@ export function conditionsToAQL(conditions, { recurDateBounds = 100 } = {}) {
               })
             };
           } else {
-            let { date } = value;
-
             if (op === 'isapprox') {
               let fullDate = parseDate(value.date);
               let high = addDays(fullDate, 2);
diff --git a/packages/loot-core/src/server/accounts/transfer.js b/packages/loot-core/src/server/accounts/transfer.js
index 716c8fe40..015a86767 100644
--- a/packages/loot-core/src/server/accounts/transfer.js
+++ b/packages/loot-core/src/server/accounts/transfer.js
@@ -7,8 +7,7 @@ async function getPayee(acct) {
 async function getTransferredAccount(transaction) {
   if (transaction.payee) {
     let {
-      transfer_acct,
-      id
+      transfer_acct
     } = await db.first('SELECT id, transfer_acct FROM v_payees WHERE id = ?', [
       transaction.payee
     ]);
diff --git a/packages/loot-core/src/server/aql/compiler.js b/packages/loot-core/src/server/aql/compiler.js
index beacd52b8..8dd4544d8 100644
--- a/packages/loot-core/src/server/aql/compiler.js
+++ b/packages/loot-core/src/server/aql/compiler.js
@@ -104,7 +104,6 @@ function makePath(state, path) {
 
 function resolvePath(state, path) {
   let paths = path.split('.');
-  let tableId;
 
   paths = paths.reduce(
     (acc, name) => {
@@ -504,24 +503,6 @@ const compileExpr = saveStack('expr', (state, expr) => {
   return compileLiteral(expr);
 });
 
-function assertType(name, data, acceptedTypes) {
-  if (acceptedTypes.indexOf(data.type) === -1) {
-    throw new CompileError(
-      `Invalid type of expression to ${name}, must be one of ${JSON.stringify(
-        acceptedTypes
-      )}: ${JSON.stringify(data.value)}`
-    );
-  }
-}
-
-function assertArgLength(name, args, len) {
-  if (args.length !== len) {
-    throw new CompileError(
-      `Invalid number of args to ${name}: expected ${len} but received ${args.length}`
-    )();
-  }
-}
-
 const compileFunction = saveStack('function', (state, func) => {
   let [name] = Object.keys(func);
   let argExprs = func[name];
@@ -587,20 +568,17 @@ const compileFunction = saveStack('function', (state, func) => {
     case '$neg': {
       validateArgLength(args, 1);
       let [arg1] = valArray(state, args, ['float']);
-      return typed(`(-${val(state, args[0])})`, args[0].type);
+      return typed(`(-${val(state, arg1)})`, arg1.type);
     }
     case '$abs': {
       validateArgLength(args, 1);
       let [arg1] = valArray(state, args, ['float']);
-      return typed(`ABS(${val(state, args[0])})`, args[0].type);
+      return typed(`ABS(${val(state, arg1)})`, arg1.type);
     }
     case '$idiv': {
       validateArgLength(args, 2);
       let [arg1, arg2] = valArray(state, args, ['integer', 'integer']);
-      return typed(
-        `(${val(state, args[0])} / ${val(state, args[1])})`,
-        args[0].type
-      );
+      return typed(`(${val(state, arg1)} / ${val(state, arg2)})`, arg1.type);
     }
 
     // date functions
@@ -965,7 +943,7 @@ export function isAggregateQuery(queryState) {
 
   return queryState.selectExpressions.find(expr => {
     if (typeof expr !== 'string') {
-      let [name, value] = Object.entries(expr)[0];
+      let [, value] = Object.entries(expr)[0];
       return isAggregateFunction(value);
     }
     return false;
@@ -1015,8 +993,7 @@ export function compileQuery(queryState, schema, schemaConfig = {}) {
     groupExpressions,
     orderExpressions,
     limit,
-    offset,
-    calculation
+    offset
   } = customizeQuery(queryState);
 
   let select = '';
@@ -1024,7 +1001,6 @@ export function compileQuery(queryState, schema, schemaConfig = {}) {
   let joins = '';
   let groupBy = '';
   let orderBy = '';
-  let dependences = [];
   let state = {
     schema,
     implicitTableName: tableName,
diff --git a/packages/loot-core/src/server/aql/schema/executors.js b/packages/loot-core/src/server/aql/schema/executors.js
index d389effcf..f7a1b2cce 100644
--- a/packages/loot-core/src/server/aql/schema/executors.js
+++ b/packages/loot-core/src/server/aql/schema/executors.js
@@ -82,7 +82,7 @@ async function execTransactionsGrouped(
   splitType,
   outputTypes
 ) {
-  let { table: tableName, withDead } = queryState;
+  let { withDead } = queryState;
   let whereDead = withDead ? '' : `AND ${sql.from}.tombstone = 0`;
 
   if (isAggregateQuery(queryState)) {
@@ -160,7 +160,6 @@ async function execTransactionsGrouped(
     ${sql.orderBy}
   `;
 
-  let start = Date.now();
   let allRows = await db.all(finalSql);
 
   // Group the parents and children up
diff --git a/packages/loot-core/src/server/aql/schema/index.js b/packages/loot-core/src/server/aql/schema/index.js
index 85547c21c..4c0b2dd81 100644
--- a/packages/loot-core/src/server/aql/schema/index.js
+++ b/packages/loot-core/src/server/aql/schema/index.js
@@ -153,7 +153,7 @@ export const schemaConfig = {
   },
 
   customizeQuery(queryState) {
-    let { table: tableName, tableOptions = {} } = queryState;
+    let { table: tableName } = queryState;
 
     function orderBy(orders) {
       // If order was specified, always add id as the last sort to make
diff --git a/packages/loot-core/src/server/budget/actions.js b/packages/loot-core/src/server/budget/actions.js
index bbad221ac..47f98f1cc 100644
--- a/packages/loot-core/src/server/budget/actions.js
+++ b/packages/loot-core/src/server/budget/actions.js
@@ -29,11 +29,6 @@ function isReflectBudget() {
   return budgetType === 'report';
 }
 
-function isZeroBudget() {
-  let { budgetType } = prefs.getPrefs();
-  return budgetType === 'rollover';
-}
-
 function dbMonth(month) {
   return parseInt(month.replace('-', ''));
 }
diff --git a/packages/loot-core/src/server/budget/base.js b/packages/loot-core/src/server/budget/base.js
index 5aa4a04e2..2df8f425a 100644
--- a/packages/loot-core/src/server/budget/base.js
+++ b/packages/loot-core/src/server/budget/base.js
@@ -8,20 +8,6 @@ import * as report from './report';
 import * as rollover from './rollover';
 import { sumAmounts } from './util';
 
-function mergeUpdates(updates) {
-  const merged = {};
-  updates.forEach(update => {
-    Object.keys(update).forEach(sheet => {
-      if (merged[sheet]) {
-        merged[sheet] = { ...merged[sheet], ...update[sheet] };
-      } else {
-        merged[sheet] = update[sheet];
-      }
-    });
-  });
-  return merged;
-}
-
 export function getBudgetType() {
   let meta = sheet.get().meta();
   return meta.budgetType || 'rollover';
diff --git a/packages/loot-core/src/server/cloud-storage.js b/packages/loot-core/src/server/cloud-storage.js
index bf4135134..e9092955e 100644
--- a/packages/loot-core/src/server/cloud-storage.js
+++ b/packages/loot-core/src/server/cloud-storage.js
@@ -273,8 +273,6 @@ export async function upload() {
   } catch (err) {
     console.log('Upload failure', err);
 
-    let reason = err instanceof PostError ? err.reason : 'network';
-
     if (err instanceof PostError) {
       throw new FileUploadError(
         err.reason === 'unauthorized' ? 'unauthorized' : err.reason || 'network'
@@ -299,7 +297,7 @@ export async function upload() {
 }
 
 export async function possiblyUpload() {
-  let { cloudFileId, groupId, lastUploaded, id } = prefs.getPrefs();
+  let { cloudFileId, groupId, lastUploaded } = prefs.getPrefs();
 
   let threshold =
     lastUploaded && monthUtils.addDays(lastUploaded, UPLOAD_FREQUENCY_IN_DAYS);
diff --git a/packages/loot-core/src/server/crdt/merkle.test.js b/packages/loot-core/src/server/crdt/merkle.test.js
index f7bef4d7d..fd1a51d07 100644
--- a/packages/loot-core/src/server/crdt/merkle.test.js
+++ b/packages/loot-core/src/server/crdt/merkle.test.js
@@ -1,28 +1,6 @@
 import * as merkle from './merkle';
 import { Timestamp } from './timestamp';
 
-function pretty(n) {
-  if (n < 60) {
-    console.log(`${n} (${n} min)`);
-  } else if (n < 24 * 60) {
-    console.log(`${n} (${n / 60} hours)`);
-  } else {
-    console.log(`${n} (${n / (24 * 60)} days)`);
-  }
-}
-
-function printBase3Buckets() {
-  for (let i = 0; i < 14; i++) {
-    let left = '0000000000000'.slice(0, i);
-    let rightLow = '0000000000000'.slice(0, 13 - i);
-    let rightHigh = '2222222222222'.slice(0, 13 - i);
-    const min = left + '2' + rightLow;
-    const max = left + '2' + rightHigh;
-
-    pretty(parseInt(max, 3) - parseInt(min, 3));
-  }
-}
-
 function message(timestamp, hash) {
   timestamp = Timestamp.parse(timestamp);
   timestamp.hash = () => hash;
@@ -96,13 +74,6 @@ describe('merkle trie', () => {
     expect(merkle.diff(trie1, trie2)).toBe(0);
   });
 
-  function debug(k, trie) {
-    return {
-      name: `[${k}] Hash: ${trie.hash}`,
-      children: merkle.getKeys(trie).map(k => debug(k, trie[k]))
-    };
-  }
-
   test('pruning works and keeps correct hashes', () => {
     let messages = [
       message('2018-11-01T01:00:00.000Z-0000-0123456789ABCDEF', 1000),
diff --git a/packages/loot-core/src/server/db/index.js b/packages/loot-core/src/server/db/index.js
index 0fb1d1ca5..4c6f7e998 100644
--- a/packages/loot-core/src/server/db/index.js
+++ b/packages/loot-core/src/server/db/index.js
@@ -612,38 +612,6 @@ export async function getTransaction(id) {
   return rows[0];
 }
 
-function _addFragmentForAccount(accountId, addWhere, options = {}) {
-  let { showClosed = false, showOffbudget = true } = options;
-
-  let fragment = addWhere ? ' WHERE (' : ' AND ';
-  let params = [];
-
-  if (accountId) {
-    if (accountId === 'offbudget') {
-      fragment += 'a.closed = 0 AND a.offbudget = 1 ';
-    } else if (accountId === 'budgeted') {
-      fragment += 'a.closed = 0 AND a.offbudget = 0 ';
-    } else if (accountId === 'uncategorized') {
-      fragment += `
-          t.category IS NULL AND a.offbudget = 0 AND isParent = 0 AND (
-            ta.offbudget IS NULL OR ta.offbudget = 1
-          )
-        `;
-    } else {
-      fragment += 'a.id = ? ';
-      params.push(accountId);
-    }
-  } else {
-    fragment += showClosed ? '1' : 'a.closed = 0';
-
-    if (!showOffbudget) {
-      fragment += ' AND a.offbudget = 0';
-    }
-  }
-
-  return { fragment, params };
-}
-
 export async function getTransactionsByDate(
   accountId,
   startDate,
diff --git a/packages/loot-core/src/server/main.js b/packages/loot-core/src/server/main.js
index 2ff712dcd..f8f410637 100644
--- a/packages/loot-core/src/server/main.js
+++ b/packages/loot-core/src/server/main.js
@@ -468,7 +468,6 @@ handlers['payees-get'] = async function() {
 
 handlers['payees-get-rule-counts'] = async function() {
   let payeeCounts = {};
-  let allRules = rules.getRules();
 
   rules.iterateIds(rules.getRules(), 'payee', (rule, id) => {
     if (payeeCounts[id] == null) {
@@ -1063,8 +1062,6 @@ handlers['accounts-sync'] = async function({ id }) {
   let matchedTransactions = [];
   let updatedAccounts = [];
 
-  let { groupId } = prefs.getPrefs();
-
   for (var i = 0; i < accounts.length; i++) {
     const acct = accounts[i];
     if (acct.bankId) {
@@ -1291,8 +1288,6 @@ handlers['key-make'] = async function({ password }) {
     throw new Error('user-set-key must be called with file loaded');
   }
 
-  let cloudFileId = prefs.getPrefs().cloudFileId;
-
   let salt = encryption.randomBytes(32).toString('base64');
   let id = uuid.v4Sync();
   let key = await encryption.createKey({ id, password, salt });
@@ -1461,9 +1456,8 @@ handlers['subscribe-get-user'] = async function() {
 
 handlers['subscribe-change-password'] = async function({ password }) {
   let userToken = await asyncStorage.getItem('user-token');
-  let res;
   try {
-    res = await post(getServer().SIGNUP_SERVER + '/change-password', {
+    await post(getServer().SIGNUP_SERVER + '/change-password', {
       token: userToken,
       password
     });
@@ -1922,7 +1916,7 @@ async function loadBudget(id, appVersion, { showUpdate } = {}) {
     prefs.savePrefs({ userId });
   }
 
-  let { budgetVersion, budgetId } = prefs.getPrefs();
+  let { budgetVersion } = prefs.getPrefs();
 
   try {
     await updateVersion(budgetVersion, showUpdate);
@@ -2146,12 +2140,12 @@ export async function initApp(version, isDev, socketName) {
     }
   }
 
-  if (isDev) {
-    const lastBudget = await asyncStorage.getItem('lastBudget');
-    // if (lastBudget) {
-    //   loadBudget(lastBudget, VERSION);
-    // }
-  }
+  // if (isDev) {
+  // const lastBudget = await asyncStorage.getItem('lastBudget');
+  // if (lastBudget) {
+  //   loadBudget(lastBudget, VERSION);
+  // }
+  // }
 
   const url = await asyncStorage.getItem('server-url');
   if (url) {
diff --git a/packages/loot-core/src/server/main.test.js b/packages/loot-core/src/server/main.test.js
index 4f3d8f98e..88f768084 100644
--- a/packages/loot-core/src/server/main.test.js
+++ b/packages/loot-core/src/server/main.test.js
@@ -80,7 +80,7 @@ describe('Budgets', () => {
     await createTestBudget('default-budget-template');
 
     await db.openDatabase('test-budget');
-    let r = await db.runQuery('INSERT INTO __migrations__ (id) VALUES (1000)');
+    await db.runQuery('INSERT INTO __migrations__ (id) VALUES (1000)');
 
     const spy = jest.spyOn(console, 'warn').mockImplementation();
 
@@ -331,7 +331,7 @@ describe('Budget', () => {
 
 describe('Categories', () => {
   test('can be deleted', async () => {
-    let spreadsheet = await sheet.loadSpreadsheet(db);
+    await sheet.loadSpreadsheet(db);
 
     await runMutator(async () => {
       await db.insertCategoryGroup({ id: 'group1', name: 'group1' });
diff --git a/packages/loot-core/src/server/post.js b/packages/loot-core/src/server/post.js
index 5f711dfe3..21b6145ab 100644
--- a/packages/loot-core/src/server/post.js
+++ b/packages/loot-core/src/server/post.js
@@ -22,8 +22,6 @@ export async function post(url, data) {
   let text;
   let res;
 
-  let s = new Error().stack;
-
   try {
     res = await fetch(url, {
       method: 'POST',
diff --git a/packages/loot-core/src/server/schedules/app.js b/packages/loot-core/src/server/schedules/app.js
index 9f813ecef..0adc795a2 100644
--- a/packages/loot-core/src/server/schedules/app.js
+++ b/packages/loot-core/src/server/schedules/app.js
@@ -204,7 +204,7 @@ export async function createSchedule({ schedule, conditions = [] } = {}) {
   });
 
   let now = Date.now();
-  let nextDateId = await db.insertWithUUID('schedules_next_date', {
+  await db.insertWithUUID('schedules_next_date', {
     schedule_id: scheduleId,
     local_next_date: nextDateRepr,
     local_next_date_ts: now,
@@ -212,7 +212,7 @@ export async function createSchedule({ schedule, conditions = [] } = {}) {
     base_next_date_ts: now
   });
 
-  let id = await db.insertWithSchema('schedules', {
+  await db.insertWithSchema('schedules', {
     ...schedule,
     id: scheduleId,
     rule: ruleId
@@ -380,10 +380,8 @@ function trackJSONPaths() {
 }
 
 function onApplySync(oldValues, newValues) {
-  let found = false;
   newValues.forEach((items, table) => {
     if (table === 'rules') {
-      found = true;
       items.forEach(newValue => {
         onRuleUpdate(newValue);
       });
diff --git a/packages/loot-core/src/server/schedules/find-schedules.js b/packages/loot-core/src/server/schedules/find-schedules.js
index 8ac258016..679870e16 100644
--- a/packages/loot-core/src/server/schedules/find-schedules.js
+++ b/packages/loot-core/src/server/schedules/find-schedules.js
@@ -58,7 +58,6 @@ export function matchSchedules(allOccurs, config, partialMatchRank = 0.5) {
   for (let trans of baseOccur.transactions) {
     let threshold = getApproxNumberThreshold(trans.amount);
     let payee = trans.payee;
-    let account = trans.account;
 
     let found = occurs.map(occur => {
       let matched = occur.transactions.find(
@@ -113,7 +112,6 @@ async function schedulesForPattern(
 ) {
   let schedules = [];
 
-  let i = 0;
   for (let i = 0; i < numDays; i++) {
     let start = d.addDays(baseStart, i);
     let config;
diff --git a/packages/loot-core/src/server/spreadsheet/new/compiler.js b/packages/loot-core/src/server/spreadsheet/new/compiler.js
index 7f1c3636e..76c62176d 100644
--- a/packages/loot-core/src/server/spreadsheet/new/compiler.js
+++ b/packages/loot-core/src/server/spreadsheet/new/compiler.js
@@ -101,7 +101,7 @@ class Compiler {
       .concat(getSqlFields(node.table, node.groupby))
       .concat(...node.select.map(s => getSqlFields(node.table, s.expr)));
 
-    const { sql, where, dependencies } = generateSql(
+    const { sql, where } = generateSql(
       node.table,
       node.where,
       node.groupby,
diff --git a/packages/loot-core/src/server/spreadsheet/new/parser.js b/packages/loot-core/src/server/spreadsheet/new/parser.js
index 2bf3b0491..39abe8ace 100644
--- a/packages/loot-core/src/server/spreadsheet/new/parser.js
+++ b/packages/loot-core/src/server/spreadsheet/new/parser.js
@@ -132,6 +132,7 @@ function parseAnd(state) {
 function parseNot(state) {
   let left = parseCompare(state);
   while (skipValue(state, types.TOKEN_OPERATOR, 'not')) {
+    // eslint-disable-next-line no-unused-vars
     const right = parseCompare(state);
     left = new nodes.UnaryOp(left.lineno, left.colno, 'not', parseNot(state));
   }
@@ -221,7 +222,6 @@ function parseUnary(state) {
 function parsePrimary(state) {
   var tok = nextToken(state);
   var val = null;
-  var node = null;
 
   if (!tok) {
     fail(state, 'expected expression, got end of file');
diff --git a/packages/loot-core/src/server/spreadsheet/new/sqlgen.js b/packages/loot-core/src/server/spreadsheet/new/sqlgen.js
index b076edb82..665464c73 100644
--- a/packages/loot-core/src/server/spreadsheet/new/sqlgen.js
+++ b/packages/loot-core/src/server/spreadsheet/new/sqlgen.js
@@ -227,7 +227,6 @@ export default function generate(table, where, groupby, select, deps) {
   let dependencies = [];
   let joins = [];
 
-  let uid = 1;
   allPaths.forEach(path => {
     let currentTable = { name: table, id: table };
     for (var i = 0; i < path.length - 1; i++) {
diff --git a/packages/loot-core/src/server/spreadsheet/spreadsheet.test.js b/packages/loot-core/src/server/spreadsheet/spreadsheet.test.js
index b2ced4f01..e1bb3fa02 100644
--- a/packages/loot-core/src/server/spreadsheet/spreadsheet.test.js
+++ b/packages/loot-core/src/server/spreadsheet/spreadsheet.test.js
@@ -8,6 +8,8 @@ function wait(n) {
   return new Promise(resolve => setTimeout(resolve, n));
 }
 
+// TODO: re-enable and fix these tests
+// eslint-disable-next-line no-unused-vars
 async function insertTransactions(payeeId = null) {
   await db.insertAccount({ id: '1', name: 'checking', offbudget: 0 });
   await db.insertAccount({ id: '2', name: 'checking', offbudget: 1 });
diff --git a/packages/loot-core/src/server/spreadsheet/sqlinterp.test.js b/packages/loot-core/src/server/spreadsheet/sqlinterp.test.js
index f19cd3369..75b7168fe 100644
--- a/packages/loot-core/src/server/spreadsheet/sqlinterp.test.js
+++ b/packages/loot-core/src/server/spreadsheet/sqlinterp.test.js
@@ -16,7 +16,7 @@ test('sql interpretation works', async () => {
     category: 1
   };
 
-  const { ops, dependencies, sqlDependencies } = compile(`
+  const { sqlDependencies } = compile(`
     =from transactions
        where date >= 20170101 and date <= 20170131 and
          category = 1
diff --git a/packages/loot-core/src/server/spreadsheet/tests/data-propagation.js b/packages/loot-core/src/server/spreadsheet/tests/data-propagation.js
deleted file mode 100644
index 8268ef7a2..000000000
--- a/packages/loot-core/src/server/spreadsheet/tests/data-propagation.js
+++ /dev/null
@@ -1,9 +0,0 @@
-const expect = require('expect');
-
-const propagate = require('../data-compute/propagate.js');
-
-describe('data propagation', () => {
-  it('should work', () => {
-    expect(true).toExist();
-  });
-});
diff --git a/packages/loot-core/src/server/spreadsheet/usage.js b/packages/loot-core/src/server/spreadsheet/usage.js
index efedaa4cf..cbcd85fb3 100644
--- a/packages/loot-core/src/server/spreadsheet/usage.js
+++ b/packages/loot-core/src/server/spreadsheet/usage.js
@@ -43,7 +43,6 @@ const sheet = new Spreadsheet({
       },
       run: sql => {
         return new Promise(resolve => {
-          const start = Date.now();
           db.all(sql, function(err, rows) {
             if (err) {
               throw new Error(err);
diff --git a/packages/loot-core/src/server/spreadsheet/util.js b/packages/loot-core/src/server/spreadsheet/util.js
index e88bcb980..fc0493a37 100644
--- a/packages/loot-core/src/server/spreadsheet/util.js
+++ b/packages/loot-core/src/server/spreadsheet/util.js
@@ -32,7 +32,6 @@ function resolveNamesAsArrays(sheets) {
     const sheet = sheets[sheetName];
 
     sheet.forEach(name => {
-      const expr = sheet[name];
       cells.push(resolveName(sheetName, name));
     });
   });
diff --git a/packages/loot-core/src/server/sync/index.js b/packages/loot-core/src/server/sync/index.js
index 20d59fc58..5f51b1c61 100644
--- a/packages/loot-core/src/server/sync/index.js
+++ b/packages/loot-core/src/server/sync/index.js
@@ -210,7 +210,7 @@ function applyMessagesForImport(messages) {
   db.transaction(() => {
     for (let i = 0; i < messages.length; i++) {
       let msg = messages[i];
-      let { dataset, row, column, timestamp, value } = msg;
+      let { dataset } = msg;
 
       if (!msg.old) {
         try {
@@ -662,7 +662,6 @@ async function _fullSync(sinceTimestamp, count, prevDiffTime) {
   }
 
   let diffTime = merkle.diff(res.merkle, getClock().merkle);
-  let result = res.messages;
 
   if (diffTime !== null) {
     // This is a bit wonky, but we loop until we are in sync with the
diff --git a/packages/loot-core/src/server/sync/migrate.js b/packages/loot-core/src/server/sync/migrate.js
index 20f055c1b..4a79d73eb 100644
--- a/packages/loot-core/src/server/sync/migrate.js
+++ b/packages/loot-core/src/server/sync/migrate.js
@@ -2,10 +2,9 @@ import { Timestamp } from '../crdt';
 
 import { addSyncListener, applyMessages } from './index';
 
-function migrateParentIds(oldValues, newValues) {
+function migrateParentIds(_oldValues, newValues) {
   newValues.forEach((items, table) => {
     if (table === 'transactions') {
-      let old = oldValues.get(table);
       let toApply = [];
 
       items.forEach(newValue => {
diff --git a/packages/loot-core/src/server/sync/sync.test.js b/packages/loot-core/src/server/sync/sync.test.js
index 5cc86445b..6379679bb 100644
--- a/packages/loot-core/src/server/sync/sync.test.js
+++ b/packages/loot-core/src/server/sync/sync.test.js
@@ -2,7 +2,6 @@ import { getClock, Timestamp } from '../crdt';
 import * as db from '../db';
 import * as prefs from '../prefs';
 import * as sheet from '../sheet';
-import { resolveName } from '../spreadsheet/util';
 import * as encoder from './encoder';
 
 import { setSyncingMode, sendMessages, applyMessages, fullSync } from './index';
@@ -183,13 +182,13 @@ describe('Sync projections', () => {
       barId = await db.insertCategory({ name: 'bar', cat_group: 'group1' });
     });
 
-    const spreadsheet = await sheet.loadSpreadsheet(db);
+    await sheet.loadSpreadsheet(db);
     registerBudgetMonths(['2017-01', '2017-02']);
     expectCellNotToExist('budget201701', 'sum-amount-' + fooId);
     expectCellNotToExist('budget201701', 'sum-amount-' + barId);
     expectCellNotToExist('budget201701', 'group-sum-amount-' + barId);
 
-    const { messages } = await fullSync();
+    await fullSync();
 
     // Make sure the budget cells have been created
     expectCellToExist('budget201701', 'sum-amount-' + fooId);
@@ -203,26 +202,26 @@ describe('Sync projections', () => {
   test('creating and deleting categories in same sync', async () => {
     // It should work when the client creates a category and deletes
     // it in the same sync (should do nothing)
-    let groupId, fooId;
+    let fooId;
     await asSecondClient(async () => {
       await sheet.loadSpreadsheet(db);
-      groupId = await db.insertCategoryGroup({ id: 'group1', name: 'group1' });
+      await db.insertCategoryGroup({ id: 'group1', name: 'group1' });
       fooId = await db.insertCategory({ name: 'foo', cat_group: 'group1' });
       await db.deleteCategory({ id: fooId });
     });
 
-    const spreadsheet = await sheet.loadSpreadsheet(db);
+    await sheet.loadSpreadsheet(db);
     registerBudgetMonths(['2017-01', '2017-02']);
     expectCellNotToExist('budget201701', 'sum-amount-' + fooId);
-    const { messages } = await fullSync();
+    await fullSync();
     expectCellNotToExist('budget201701', 'sum-amount-' + fooId);
   });
 
   test('synced categories should have budgets deleted', async () => {
-    let groupId, fooId;
+    let fooId;
     await asSecondClient(async () => {
       await sheet.loadSpreadsheet(db);
-      groupId = await db.insertCategoryGroup({
+      await db.insertCategoryGroup({
         id: 'group1',
         name: 'group1'
       });
@@ -230,7 +229,7 @@ describe('Sync projections', () => {
       await db.deleteCategory({ id: fooId });
     });
 
-    const spreadsheet = await sheet.loadSpreadsheet(db);
+    await sheet.loadSpreadsheet(db);
     registerBudgetMonths(['2017-01', '2017-02']);
 
     // Get all the messages. We'll apply them in two passes
@@ -261,7 +260,7 @@ describe('Sync projections', () => {
       await db.deleteCategoryGroup({ id: groupId });
     });
 
-    const spreadsheet = await sheet.loadSpreadsheet(db);
+    await sheet.loadSpreadsheet(db);
     registerBudgetMonths(['2017-01', '2017-02']);
     expectCellNotToExist('budget201701', 'group-sum-amount-' + groupId);
     await fullSync();
@@ -284,7 +283,7 @@ describe('Sync projections', () => {
       await db.deleteCategoryGroup({ id: groupId });
     });
 
-    const spreadsheet = await sheet.loadSpreadsheet(db);
+    await sheet.loadSpreadsheet(db);
     registerBudgetMonths(['2017-01', '2017-02']);
 
     // Get all the messages. We'll apply them in two passes
@@ -312,16 +311,16 @@ describe('Sync projections', () => {
   });
 
   test('categories should update the budget when moved', async () => {
-    let groupId, group2Id, fooId;
+    let groupId, fooId;
     await asSecondClient(async () => {
       await sheet.loadSpreadsheet(db);
       groupId = await db.insertCategoryGroup({ id: 'group1', name: 'group1' });
-      group2Id = await db.insertCategoryGroup({ id: 'group2', name: 'group2' });
+      await db.insertCategoryGroup({ id: 'group2', name: 'group2' });
       fooId = await db.insertCategory({ name: 'foo', cat_group: 'group1' });
       await db.moveCategory(fooId, 'group2');
     });
 
-    const spreadsheet = await sheet.loadSpreadsheet(db);
+    await sheet.loadSpreadsheet(db);
     registerBudgetMonths(['2017-01', '2017-02']);
 
     // Get all the messages. We'll apply them in two passes
diff --git a/packages/loot-core/src/server/tests/mockSyncServer.js b/packages/loot-core/src/server/tests/mockSyncServer.js
index 1894eadd2..1584c1144 100644
--- a/packages/loot-core/src/server/tests/mockSyncServer.js
+++ b/packages/loot-core/src/server/tests/mockSyncServer.js
@@ -1,5 +1,3 @@
-import dateFns from 'date-fns';
-
 import { makeClock, Timestamp, merkle } from '../crdt';
 
 const SyncPb = require('../sync/proto/sync_pb');
@@ -113,7 +111,7 @@ module.exports.getClock = () => {
 
 module.exports.getMessages = () => {
   return currentMessages.map(msg => {
-    let { timestamp, is_encrypted, content } = msg;
+    let { timestamp, content } = msg;
     let fields = SyncPb.Message.deserializeBinary(content);
 
     return {
diff --git a/packages/loot-core/src/shared/arithmetic.js b/packages/loot-core/src/shared/arithmetic.js
index e659833f6..2c532378c 100644
--- a/packages/loot-core/src/shared/arithmetic.js
+++ b/packages/loot-core/src/shared/arithmetic.js
@@ -20,10 +20,6 @@ function next(state) {
   return ch;
 }
 
-function isEnd(state) {
-  return state.index >= state.str.length;
-}
-
 function nextOperator(state, op) {
   if (char(state) === op) {
     next(state);
diff --git a/packages/loot-core/src/shared/async.test.js b/packages/loot-core/src/shared/async.test.js
index 549c3e85b..1bafca0c4 100644
--- a/packages/loot-core/src/shared/async.test.js
+++ b/packages/loot-core/src/shared/async.test.js
@@ -6,7 +6,6 @@ function timeout(n) {
 
 function makeFunction(data) {
   return async function fn(n, { throwError } = {}) {
-    const x = Math.random();
     data.push(n);
     await timeout(10);
 
diff --git a/yarn.lock b/yarn.lock
index 69f69afe8..ad8d2a6f2 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -14701,7 +14701,6 @@ __metadata:
     cross-env: ^7.0.3
     csv-parse: ^4.10.1
     csv-stringify: ^5.3.6
-    damerau-levenshtein: ^1.0.4
     date-fns: 2.0.0-alpha.27
     deep-equal: ^2.0.5
     eslint: 5.6.0
-- 
GitLab