Skip to content
Snippets Groups Projects
Unverified Commit 8a15caf4 authored by Matiss Janis Aboltins's avatar Matiss Janis Aboltins Committed by GitHub
Browse files

:recycle: (TypeScript) fix strictFunctionTypes violations (pt 1) (#2065)

parent af9efa09
No related branches found
No related tags found
No related merge requests found
...@@ -5,13 +5,13 @@ export interface BudgetHandlers { ...@@ -5,13 +5,13 @@ export interface BudgetHandlers {
category: string /* category id */; category: string /* category id */;
month: string; month: string;
amount: number; amount: number;
}) => Promise<unknown>; }) => Promise<void>;
'budget/copy-previous-month': (...args: unknown[]) => Promise<unknown>; 'budget/copy-previous-month': (arg: { month: string }) => Promise<void>;
'budget/set-zero': (...args: unknown[]) => Promise<unknown>; 'budget/set-zero': (arg: { month: string }) => Promise<void>;
'budget/set-3month-avg': (...args: unknown[]) => Promise<unknown>; 'budget/set-3month-avg': (arg: { month: string }) => Promise<void>;
'budget/check-templates': () => Promise<Notification>; 'budget/check-templates': () => Promise<Notification>;
...@@ -27,17 +27,37 @@ export interface BudgetHandlers { ...@@ -27,17 +27,37 @@ export interface BudgetHandlers {
month: string; month: string;
}) => Promise<Notification>; }) => Promise<Notification>;
'budget/hold-for-next-month': (...args: unknown[]) => Promise<unknown>; 'budget/hold-for-next-month': (arg: {
month: string;
amount: number;
}) => Promise<boolean>;
'budget/reset-hold': (...args: unknown[]) => Promise<unknown>; 'budget/reset-hold': (arg: { month: string }) => Promise<void>;
'budget/cover-overspending': (...args: unknown[]) => Promise<unknown>; 'budget/cover-overspending': (arg: {
month: string;
to: string;
from: string;
}) => Promise<void>;
'budget/transfer-available': (...args: unknown[]) => Promise<unknown>; 'budget/transfer-available': (arg: {
month: string;
amount: number;
category: string;
}) => Promise<void>;
'budget/transfer-category': (...args: unknown[]) => Promise<unknown>; 'budget/transfer-category': (arg: {
month: string;
amount: number;
to: string;
from: string;
}) => Promise<void>;
'budget/set-carryover': (...args: unknown[]) => Promise<unknown>; 'budget/set-carryover': (arg: {
startMonth: string;
category: string;
flag: boolean;
}) => Promise<void>;
'budget/apply-single-template': (arg: { 'budget/apply-single-template': (arg: {
month: string; month: string;
...@@ -48,10 +68,10 @@ export interface BudgetHandlers { ...@@ -48,10 +68,10 @@ export interface BudgetHandlers {
month: string; month: string;
N: number; N: number;
category: string; //category id category: string; //category id
}) => Promise<unknown>; }) => Promise<void>;
'budget/copy-single-month': (arg: { 'budget/copy-single-month': (arg: {
month: string; month: string;
category: string; //category id category: string; //category id
}) => Promise<unknown>; }) => Promise<void>;
} }
import { captureException, captureBreadcrumb } from '../platform/exceptions'; import { captureException, captureBreadcrumb } from '../platform/exceptions';
import { sequential } from '../shared/async'; import { sequential } from '../shared/async';
import { type HandlerFunctions } from '../types/handlers';
const runningMethods = new Set(); const runningMethods = new Set();
...@@ -9,9 +10,7 @@ let globalMutationsEnabled = false; ...@@ -9,9 +10,7 @@ let globalMutationsEnabled = false;
let _latestHandlerNames = []; let _latestHandlerNames = [];
export function mutator<T extends (...args: unknown[]) => unknown>( export function mutator<T extends HandlerFunctions>(handler: T): T {
handler: T,
): T {
mutatingMethods.set(handler, true); mutatingMethods.set(handler, true);
return handler; return handler;
} }
......
...@@ -2,6 +2,7 @@ import { Timestamp } from '@actual-app/crdt'; ...@@ -2,6 +2,7 @@ import { Timestamp } from '@actual-app/crdt';
import * as connection from '../platform/server/connection'; import * as connection from '../platform/server/connection';
import { getIn } from '../shared/util'; import { getIn } from '../shared/util';
import { type HandlerFunctions } from '../types/handlers';
import { withMutatorContext, getMutatorContext } from './mutators'; import { withMutatorContext, getMutatorContext } from './mutators';
import { Message, sendMessages } from './sync'; import { Message, sendMessages } from './sync';
...@@ -89,18 +90,10 @@ export function withUndo<T>( ...@@ -89,18 +90,10 @@ export function withUndo<T>(
); );
} }
// for some reason `void` is not inferred properly without this overload export function undoable<T extends HandlerFunctions>(func: T) {
export function undoable<Args extends unknown[]>( return (...args: Parameters<T>) => {
func: (...args: Args) => Promise<void>, return withUndo<Awaited<ReturnType<T>>>(() => {
): (...args: Args) => Promise<void>; return func.apply(null, args);
export function undoable<
Args extends unknown[],
Return extends Promise<unknown>,
>(func: (...args: Args) => Return): (...args: Args) => Return;
export function undoable(func: (...args: unknown[]) => Promise<unknown>) {
return (...args: unknown[]) => {
return withUndo(() => {
return func(...args);
}); });
}; };
} }
......
export function sequential<T extends (...args: unknown[]) => unknown>( import { type HandlerFunctions } from '../types/handlers';
export function sequential<T extends HandlerFunctions>(
fn: T, fn: T,
): (...args: Parameters<T>) => Promise<Awaited<ReturnType<T>>> { ): (...args: Parameters<T>) => Promise<Awaited<ReturnType<T>>> {
const sequenceState = { const sequenceState = {
...@@ -16,7 +18,7 @@ export function sequential<T extends (...args: unknown[]) => unknown>( ...@@ -16,7 +18,7 @@ export function sequential<T extends (...args: unknown[]) => unknown>(
} }
function run(args, resolve, reject) { function run(args, resolve, reject) {
sequenceState.running = fn(...args); sequenceState.running = fn.apply(null, args);
sequenceState.running.then( sequenceState.running.then(
val => { val => {
...@@ -43,13 +45,13 @@ export function sequential<T extends (...args: unknown[]) => unknown>( ...@@ -43,13 +45,13 @@ export function sequential<T extends (...args: unknown[]) => unknown>(
}; };
} }
export function once<T extends (...args: unknown[]) => Promise<unknown>>( export function once<T extends HandlerFunctions>(
fn: T, fn: T,
): (...args: Parameters<T>) => Promise<Awaited<ReturnType<T>>> { ): (...args: Parameters<T>) => Promise<Awaited<ReturnType<T>>> {
let promise = null; let promise = null;
const onceFn = (...args: Parameters<T>): Promise<Awaited<ReturnType<T>>> => { return (...args) => {
if (!promise) { if (!promise) {
promise = fn(...args).finally(() => { promise = fn.apply(null, args).finally(() => {
promise = null; promise = null;
}); });
return promise; return promise;
...@@ -57,6 +59,4 @@ export function once<T extends (...args: unknown[]) => Promise<unknown>>( ...@@ -57,6 +59,4 @@ export function once<T extends (...args: unknown[]) => Promise<unknown>>(
return promise; return promise;
}; };
return onceFn;
} }
import { type ServerHandlers } from './server-handlers';
export interface ApiHandlers { export interface ApiHandlers {
'api/batch-budget-start': () => Promise<unknown>; 'api/batch-budget-start': () => Promise<unknown>;
...@@ -5,7 +7,7 @@ export interface ApiHandlers { ...@@ -5,7 +7,7 @@ export interface ApiHandlers {
'api/load-budget': ( 'api/load-budget': (
...args: Parameters<ServerHandlers['load-budget']> ...args: Parameters<ServerHandlers['load-budget']>
) => Promise<unknown>; ) => Promise<void>;
'api/download-budget': (arg: { syncId; password }) => Promise<unknown>; 'api/download-budget': (arg: { syncId; password }) => Promise<unknown>;
......
...@@ -17,3 +17,5 @@ export interface Handlers ...@@ -17,3 +17,5 @@ export interface Handlers
RulesHandlers, RulesHandlers,
SchedulesHandlers, SchedulesHandlers,
ToolsHandlers {} ToolsHandlers {}
export type HandlerFunctions = Handlers[keyof Handlers];
...@@ -326,7 +326,7 @@ export interface ServerHandlers { ...@@ -326,7 +326,7 @@ export interface ServerHandlers {
error?: { message: string; reason: string; meta: unknown }; error?: { message: string; reason: string; meta: unknown };
}>; }>;
'load-budget': (arg: { id }) => Promise<{ error }>; 'load-budget': (arg: { id: string }) => Promise<{ error }>;
'create-demo-budget': () => Promise<unknown>; 'create-demo-budget': () => Promise<unknown>;
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
"downlevelIteration": true, "downlevelIteration": true,
// TODO: enable once every file is ts // TODO: enable once every file is ts
// "strict": true, // "strict": true,
// TODO: enable once the violations are fixed
// "strictFunctionTypes": true,
"noFallthroughCasesInSwitch": true, "noFallthroughCasesInSwitch": true,
"skipLibCheck": true, "skipLibCheck": true,
"jsx": "preserve", "jsx": "preserve",
......
---
category: Maintenance
authors: [MatissJanis]
---
Fixing TypeScript issues when enabling `strictFunctionTypes`.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment