diff --git a/types/onetime/index.d.ts b/types/onetime/index.d.ts index c7406307bc..f1c6b56ad0 100644 --- a/types/onetime/index.d.ts +++ b/types/onetime/index.d.ts @@ -1,36 +1,45 @@ -// Type definitions for onetime 2.0 +// Type definitions for onetime 3.0 // Project: https://github.com/sindresorhus/onetime#readme // Definitions by: BendingBender // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 3.0 export = oneTime; -declare function oneTime(fn: () => R, options?: oneTime.Options): () => R; -declare function oneTime(fn: (t1: T1) => R, options?: oneTime.Options): (t1: T1) => R; -declare function oneTime(fn: (t1: T1, t2: T2) => R, options?: oneTime.Options): (t1: T1, t2: T2) => R; -declare function oneTime(fn: (t1: T1, t2: T2, t3: T3) => R, options?: oneTime.Options): (t1: T1, t2: T2, t3: T3) => R; -declare function oneTime( - fn: (t1: T1, t2: T2, t3: T3, t4: T4) => R, options?: oneTime.Options): (t1: T1, t2: T2, t3: T3, t4: T4) => R; -declare function oneTime( - fn: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5) => R, options?: oneTime.Options): (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5) => R; -declare function oneTime( - fn: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6) => R, options?: oneTime.Options): (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6) => R; -declare function oneTime( - fn: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7) => R, - options?: oneTime.Options): (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7) => R; -declare function oneTime( - fn: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8) => R, - options?: oneTime.Options): (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8) => R; -declare function oneTime( - fn: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8, t9: T9) => R, - options?: oneTime.Options): (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8, t9: T9) => R; -declare function oneTime( - fn: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8, t9: T9, t10: T10) => R, - options?: oneTime.Options): (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8, t9: T9, t10: T10) => R; -declare function oneTime(fn: (...args: any[]) => R, options?: oneTime.Options): (...args: any[]) => R; +/** + * Ensure a function is only called once. When called multiple times it will return the return value from the first call. + * + * @param fn Function that should only be called once. + * @returns A function that only calls `fn` once. + */ +declare function oneTime( + fn: (...args: T) => R, + options?: oneTime.Options +): (...args: T) => R; declare namespace oneTime { + /** + * Get the number of times `fn` has been called. + * + * @param fn Function to get call count from. + * @returns A number representing how many times `fn` has been called. + * + * @example + * const foo = onetime(() => {}); + * foo(); + * foo(); + * foo(); + * + * console.log(onetime.callCount(foo)); + * //=> 3 + */ + function callCount(fn: (...args: any[]) => any): number | undefined; + interface Options { + /** + * Throw an error when called more than once. + * @default false + */ throw?: boolean; } } diff --git a/types/onetime/onetime-tests.ts b/types/onetime/onetime-tests.ts index 840edb6cc2..4678eb45db 100644 --- a/types/onetime/onetime-tests.ts +++ b/types/onetime/onetime-tests.ts @@ -3,29 +3,10 @@ import onetime = require('onetime'); const foo = onetime(() => 5); foo(); // $ExpectType number -const foo2 = onetime(() => true, {throw: true}); +const foo2 = onetime(() => true, { throw: true }); foo2(); // $ExpectType boolean onetime((t1: boolean) => 5)(true); // $ExpectType number onetime((t1: boolean, t2: string) => 5)(true, ''); // $ExpectType number -onetime((t1: boolean, t2: string, t3: number) => 5)(true, '', 5); // $ExpectType number -onetime((t1: boolean, t2: string, t3: number, t4: undefined) => 5)(true, '', 5, undefined); // $ExpectType number -onetime((t1: boolean, t2: string, t3: number, t4: undefined, t5: string) => 5)(true, '', 5, undefined, ''); // $ExpectType number -onetime((t1: boolean, t2: string, t3: number, t4: undefined, t5: string, t6: number) => 5)(true, '', 5, undefined, '', 6); // $ExpectType number -onetime((t1: boolean, t2: string, t3: number, t4: undefined, t5: string, t6: number, t7: boolean) => 5)(true, '', 5, undefined, '', 6, false); // $ExpectType number -const t8 = onetime( - (t1: boolean, t2: string, t3: number, t4: undefined, t5: string, t6: number, t7: boolean, t8: string) => 5); -t8(true, '', 5, undefined, '', 6, false, ''); // $ExpectType number - -const t9 = onetime( - (t1: boolean, t2: string, t3: number, t4: undefined, t5: string, t6: number, t7: boolean, t8: string, t9: number) => 5); -t9(true, '', 5, undefined, '', 6, false, '', 1); // $ExpectType number - -const t10 = onetime( - (t1: boolean, t2: string, t3: number, t4: undefined, t5: string, t6: number, t7: boolean, t8: string, t9: number, t10: boolean) => 5); -t10(true, '', 5, undefined, '', 6, false, '', 1, true); // $ExpectType number - -const t11 = onetime( - (t1: boolean, t2: string, t3: number, t4: undefined, t5: string, t6: number, t7: boolean, t8: string, t9: number, t10: boolean, t11: string) => 5); -t11(true, '', 5, undefined, '', 6, false, '', 1, true, 5); // $ExpectType number +onetime.callCount((t1: boolean, t2: string) => 5); // $ExpectType number | undefined diff --git a/types/onetime/tsconfig.json b/types/onetime/tsconfig.json index 84d3da86b8..39df78e5bc 100644 --- a/types/onetime/tsconfig.json +++ b/types/onetime/tsconfig.json @@ -20,4 +20,4 @@ "index.d.ts", "onetime-tests.ts" ] -} \ No newline at end of file +} diff --git a/types/onetime/v2/index.d.ts b/types/onetime/v2/index.d.ts new file mode 100644 index 0000000000..c7406307bc --- /dev/null +++ b/types/onetime/v2/index.d.ts @@ -0,0 +1,36 @@ +// Type definitions for onetime 2.0 +// Project: https://github.com/sindresorhus/onetime#readme +// Definitions by: BendingBender +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +export = oneTime; + +declare function oneTime(fn: () => R, options?: oneTime.Options): () => R; +declare function oneTime(fn: (t1: T1) => R, options?: oneTime.Options): (t1: T1) => R; +declare function oneTime(fn: (t1: T1, t2: T2) => R, options?: oneTime.Options): (t1: T1, t2: T2) => R; +declare function oneTime(fn: (t1: T1, t2: T2, t3: T3) => R, options?: oneTime.Options): (t1: T1, t2: T2, t3: T3) => R; +declare function oneTime( + fn: (t1: T1, t2: T2, t3: T3, t4: T4) => R, options?: oneTime.Options): (t1: T1, t2: T2, t3: T3, t4: T4) => R; +declare function oneTime( + fn: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5) => R, options?: oneTime.Options): (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5) => R; +declare function oneTime( + fn: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6) => R, options?: oneTime.Options): (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6) => R; +declare function oneTime( + fn: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7) => R, + options?: oneTime.Options): (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7) => R; +declare function oneTime( + fn: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8) => R, + options?: oneTime.Options): (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8) => R; +declare function oneTime( + fn: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8, t9: T9) => R, + options?: oneTime.Options): (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8, t9: T9) => R; +declare function oneTime( + fn: (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8, t9: T9, t10: T10) => R, + options?: oneTime.Options): (t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8, t9: T9, t10: T10) => R; +declare function oneTime(fn: (...args: any[]) => R, options?: oneTime.Options): (...args: any[]) => R; + +declare namespace oneTime { + interface Options { + throw?: boolean; + } +} diff --git a/types/onetime/v2/onetime-tests.ts b/types/onetime/v2/onetime-tests.ts new file mode 100644 index 0000000000..840edb6cc2 --- /dev/null +++ b/types/onetime/v2/onetime-tests.ts @@ -0,0 +1,31 @@ +import onetime = require('onetime'); + +const foo = onetime(() => 5); +foo(); // $ExpectType number + +const foo2 = onetime(() => true, {throw: true}); +foo2(); // $ExpectType boolean + +onetime((t1: boolean) => 5)(true); // $ExpectType number +onetime((t1: boolean, t2: string) => 5)(true, ''); // $ExpectType number +onetime((t1: boolean, t2: string, t3: number) => 5)(true, '', 5); // $ExpectType number +onetime((t1: boolean, t2: string, t3: number, t4: undefined) => 5)(true, '', 5, undefined); // $ExpectType number +onetime((t1: boolean, t2: string, t3: number, t4: undefined, t5: string) => 5)(true, '', 5, undefined, ''); // $ExpectType number +onetime((t1: boolean, t2: string, t3: number, t4: undefined, t5: string, t6: number) => 5)(true, '', 5, undefined, '', 6); // $ExpectType number +onetime((t1: boolean, t2: string, t3: number, t4: undefined, t5: string, t6: number, t7: boolean) => 5)(true, '', 5, undefined, '', 6, false); // $ExpectType number + +const t8 = onetime( + (t1: boolean, t2: string, t3: number, t4: undefined, t5: string, t6: number, t7: boolean, t8: string) => 5); +t8(true, '', 5, undefined, '', 6, false, ''); // $ExpectType number + +const t9 = onetime( + (t1: boolean, t2: string, t3: number, t4: undefined, t5: string, t6: number, t7: boolean, t8: string, t9: number) => 5); +t9(true, '', 5, undefined, '', 6, false, '', 1); // $ExpectType number + +const t10 = onetime( + (t1: boolean, t2: string, t3: number, t4: undefined, t5: string, t6: number, t7: boolean, t8: string, t9: number, t10: boolean) => 5); +t10(true, '', 5, undefined, '', 6, false, '', 1, true); // $ExpectType number + +const t11 = onetime( + (t1: boolean, t2: string, t3: number, t4: undefined, t5: string, t6: number, t7: boolean, t8: string, t9: number, t10: boolean, t11: string) => 5); +t11(true, '', 5, undefined, '', 6, false, '', 1, true, 5); // $ExpectType number diff --git a/types/onetime/v2/tsconfig.json b/types/onetime/v2/tsconfig.json new file mode 100644 index 0000000000..bda103d103 --- /dev/null +++ b/types/onetime/v2/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "baseUrl": "../../", + "typeRoots": [ + "../../" + ], + "paths": { + "onetime": [ + "onetime/v2" + ] + }, + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "onetime-tests.ts" + ] +} diff --git a/types/onetime/v2/tslint.json b/types/onetime/v2/tslint.json new file mode 100644 index 0000000000..3db14f85ea --- /dev/null +++ b/types/onetime/v2/tslint.json @@ -0,0 +1 @@ +{ "extends": "dtslint/dt.json" }