Skip to content

Commit 3756887

Browse files
committed
refactor: more explicit types
1 parent 93e5d41 commit 3756887

File tree

9 files changed

+82
-37
lines changed

9 files changed

+82
-37
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ types
88
*.log*
99
*.env*
1010
!vitest.config.ts
11+
tsconfig.tsbuildinfo

src/debugger.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { Hookable } from "./hookable";
1+
import type { Hookable } from "./hookable.ts";
22

33
export interface CreateDebuggerOptions {
44
/** An optional tag to prefix console logs with */
@@ -29,7 +29,10 @@ const isBrowser = typeof window !== "undefined";
2929
export function createDebugger(
3030
hooks: Hookable<any>,
3131
_options: CreateDebuggerOptions = {},
32-
) {
32+
): {
33+
/** Stop debugging and remove listeners */
34+
close: () => void;
35+
} {
3336
const options = <CreateDebuggerOptions>{
3437
inspect: isBrowser,
3538
group: isBrowser,

src/hookable.ts

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ import {
33
parallelTaskCaller,
44
serialTaskCaller,
55
callEachWith,
6-
} from "./utils";
6+
} from "./utils.ts";
7+
78
import type {
89
DeprecatedHook,
910
NestedHooks,
1011
HookCallback,
1112
HookKeys,
12-
} from "./types";
13+
} from "./types.ts";
1314

1415
type InferCallback<HT, HN extends keyof HT> = HT[HN] extends HookCallback
1516
? HT[HN]
@@ -49,7 +50,7 @@ export class Hookable<
4950
name: NameT,
5051
function_: InferCallback<HooksT, NameT>,
5152
options: { allowDeprecated?: boolean } = {},
52-
) {
53+
): () => void {
5354
if (!name || typeof function_ !== "function") {
5455
return () => {};
5556
}
@@ -103,7 +104,7 @@ export class Hookable<
103104
hookOnce<NameT extends HookNameT>(
104105
name: NameT,
105106
function_: InferCallback<HooksT, NameT>,
106-
) {
107+
): () => void {
107108
let _unreg: (() => void) | undefined;
108109
let _function: ((...arguments_: any) => any) | undefined = (
109110
...arguments_: any
@@ -122,7 +123,7 @@ export class Hookable<
122123
removeHook<NameT extends HookNameT>(
123124
name: NameT,
124125
function_: InferCallback<HooksT, NameT>,
125-
) {
126+
): void {
126127
if (this._hooks[name]) {
127128
const index = this._hooks[name].indexOf(function_);
128129

@@ -139,7 +140,7 @@ export class Hookable<
139140
deprecateHook<NameT extends HookNameT>(
140141
name: NameT,
141142
deprecated: HookKeys<HooksT> | DeprecatedHook<HooksT>,
142-
) {
143+
): void {
143144
this._deprecatedHooks[name] =
144145
typeof deprecated === "string" ? { to: deprecated } : deprecated;
145146
const _hooks = this._hooks[name] || [];
@@ -151,14 +152,14 @@ export class Hookable<
151152

152153
deprecateHooks(
153154
deprecatedHooks: Partial<Record<HookNameT, DeprecatedHook<HooksT>>>,
154-
) {
155+
): void {
155156
Object.assign(this._deprecatedHooks, deprecatedHooks);
156157
for (const name in deprecatedHooks) {
157158
this.deprecateHook(name, deprecatedHooks[name] as DeprecatedHook<HooksT>);
158159
}
159160
}
160161

161-
addHooks(configHooks: NestedHooks<HooksT>) {
162+
addHooks(configHooks: NestedHooks<HooksT>): () => void {
162163
const hooks = flatHooks<HooksT>(configHooks);
163164
// @ts-ignore
164165
const removeFns = Object.keys(hooks).map((key) =>
@@ -174,15 +175,15 @@ export class Hookable<
174175
};
175176
}
176177

177-
removeHooks(configHooks: NestedHooks<HooksT>) {
178+
removeHooks(configHooks: NestedHooks<HooksT>): void {
178179
const hooks = flatHooks<HooksT>(configHooks);
179180
for (const key in hooks) {
180181
// @ts-ignore
181182
this.removeHook(key, hooks[key]);
182183
}
183184
}
184185

185-
removeAllHooks() {
186+
removeAllHooks(): void {
186187
for (const key in this._hooks) {
187188
delete this._hooks[key];
188189
}
@@ -239,7 +240,7 @@ export class Hookable<
239240
return result;
240241
}
241242

242-
beforeEach(function_: (event: InferSpyEvent<HooksT>) => void) {
243+
beforeEach(function_: (event: InferSpyEvent<HooksT>) => void): () => void {
243244
this._before = this._before || [];
244245
this._before.push(function_);
245246
return () => {
@@ -252,7 +253,7 @@ export class Hookable<
252253
};
253254
}
254255

255-
afterEach(function_: (event: InferSpyEvent<HooksT>) => void) {
256+
afterEach(function_: (event: InferSpyEvent<HooksT>) => void): () => void {
256257
this._after = this._after || [];
257258
this._after.push(function_);
258259
return () => {

src/index.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
export { Hookable, createHooks } from "./hookable";
1+
export { Hookable, createHooks } from "./hookable.ts";
2+
23
export {
34
flatHooks,
45
mergeHooks,
56
parallelCaller,
67
serial,
78
serialCaller,
8-
} from "./utils";
9-
export * from "./debugger";
10-
export * from "./types";
9+
} from "./utils.ts";
10+
11+
export * from "./debugger.ts";
12+
13+
export * from "./types.ts";

src/utils.ts

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { NestedHooks, HookCallback } from "./types";
1+
import type { NestedHooks, HookCallback } from "./types.ts";
22

33
export function flatHooks<T>(
44
configHooks: NestedHooks<T>,
@@ -49,7 +49,7 @@ export function mergeHooks<T>(...hooks: NestedHooks<T>[]): T {
4949
export function serial<T>(
5050
tasks: T[],
5151
function_: (task: T) => Promise<any> | any,
52-
) {
52+
): Promise<any> {
5353
// eslint-disable-next-line unicorn/no-array-reduce
5454
return tasks.reduce(
5555
(promise, task) => promise.then(() => function_(task)),
@@ -58,13 +58,26 @@ export function serial<T>(
5858
}
5959

6060
// https://developer.chrome.com/blog/devtools-modern-web-debugging/#linked-stack-traces
61-
type CreateTask = typeof console.createTask;
61+
62+
type CreateTask = (name?: string) => {
63+
run: (function_: () => Promise<any> | any) => Promise<any> | any;
64+
};
65+
66+
declare global {
67+
interface Console {
68+
createTask?: CreateTask;
69+
}
70+
}
71+
6272
const defaultTask: ReturnType<CreateTask> = { run: (function_) => function_() };
6373
const _createTask: CreateTask = () => defaultTask;
6474
const createTask =
6575
console.createTask === undefined ? _createTask : console.createTask;
6676

67-
export function serialTaskCaller(hooks: HookCallback[], args: any[]) {
77+
export function serialTaskCaller(
78+
hooks: HookCallback[],
79+
args: any[],
80+
): Promise<any> {
6881
const name = args.shift();
6982
const task = createTask(name);
7083
// eslint-disable-next-line unicorn/no-array-reduce
@@ -75,14 +88,20 @@ export function serialTaskCaller(hooks: HookCallback[], args: any[]) {
7588
);
7689
}
7790

78-
export function parallelTaskCaller(hooks: HookCallback[], args: any[]) {
91+
export function parallelTaskCaller(
92+
hooks: HookCallback[],
93+
args: any[],
94+
): Promise<any> {
7995
const name = args.shift();
8096
const task = createTask(name);
8197
return Promise.all(hooks.map((hook) => task.run(() => hook(...args))));
8298
}
8399

84100
/** @deprecated */
85-
export function serialCaller(hooks: HookCallback[], arguments_?: any[]) {
101+
export function serialCaller(
102+
hooks: HookCallback[],
103+
arguments_?: any[],
104+
): Promise<any> {
86105
// eslint-disable-next-line unicorn/no-array-reduce
87106
return hooks.reduce(
88107
(promise, hookFunction) =>
@@ -92,11 +111,17 @@ export function serialCaller(hooks: HookCallback[], arguments_?: any[]) {
92111
}
93112

94113
/** @deprecated */
95-
export function parallelCaller(hooks: HookCallback[], args?: any[]) {
114+
export function parallelCaller(
115+
hooks: HookCallback[],
116+
args?: any[],
117+
): Promise<any> {
96118
return Promise.all(hooks.map((hook) => hook(...(args || []))));
97119
}
98120

99-
export function callEachWith(callbacks: Array<(arg0: any) => any>, arg0?: any) {
121+
export function callEachWith(
122+
callbacks: Array<(arg0: any) => any>,
123+
arg0?: any,
124+
): void {
100125
// eslint-disable-next-line unicorn/no-useless-spread
101126
for (const callback of [...callbacks]) {
102127
callback(arg0);

test/debuger.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
expect,
88
vi,
99
} from "vitest";
10-
import { createDebugger, Hookable } from "../src/index";
10+
import { createDebugger, Hookable } from "../src/index.ts";
1111

1212
const consoleMethods = [
1313
"time",

test/hookable.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// @ts-nocheck
22
import { describe, test, beforeEach, expect, vi } from "vitest";
3-
import { createHooks, flatHooks, mergeHooks } from "../src/index";
3+
import { createHooks, flatHooks, mergeHooks } from "../src/index.ts";
44

55
describe("core: hookable", () => {
66
beforeEach(() => {

test/types.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { describe, test } from "vitest";
22
import { expectTypeOf } from "expect-type";
3-
import { createHooks } from "../src";
4-
import type { HookCallback } from "../src/types";
3+
import { createHooks } from "../src/index.ts";
4+
import type { HookCallback } from "../src/types.ts";
55

66
describe("hook types", () => {
77
test("correctly handles non-nested hooks", () => {
@@ -55,11 +55,11 @@ describe("hook types", () => {
5555

5656
// should both be valid
5757
hooks.addHooks({
58-
namespace: { foo: (_arg) => {} },
58+
namespace: { foo: (_arg: any) => {} },
5959
bar: (_arg) => {},
6060
"namespace:foo": () => {},
6161
});
62-
hooks.addHooks({ namespace: { nothing: (_arg) => {} } });
62+
hooks.addHooks({ namespace: { nothing: (_arg: any) => {} } });
6363
hooks.addHooks({ nothing: (_arg) => {} });
6464
});
6565

tsconfig.json

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,21 @@
11
{
22
"compilerOptions": {
33
"target": "ESNext",
4-
"module": "ESNext",
5-
"esModuleInterop": true,
6-
"moduleResolution": "Node",
7-
"outDir": "dist",
8-
}
4+
"module": "NodeNext",
5+
"moduleResolution": "NodeNext",
6+
"resolveJsonModule": true,
7+
"esModuleInterop": false,
8+
"allowSyntheticDefaultImports": true,
9+
"skipLibCheck": true,
10+
"strict": true,
11+
"verbatimModuleSyntax": true,
12+
"isolatedModules": true,
13+
"composite": true,
14+
"allowImportingTsExtensions": true,
15+
"isolatedDeclarations": true,
16+
"forceConsistentCasingInFileNames": true,
17+
"noImplicitOverride": true,
18+
"noEmit": true
19+
},
20+
"include": ["src", "test"]
921
}

0 commit comments

Comments
 (0)