diff --git a/types/webpack-config-utils/index.d.ts b/types/webpack-config-utils/index.d.ts new file mode 100644 index 0000000000..97c1fdf397 --- /dev/null +++ b/types/webpack-config-utils/index.d.ts @@ -0,0 +1,40 @@ +// Type definitions for webpack-config-utils 2.3 +// Project: https://github.com/kentcdodds/webpack-config-utils#readme +// Definitions by: Martin Hochel +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.8 + +export function getIfUtils( + env: { [P in E]: boolean | string } | E, + vars?: Array +): IfUtils; +export function removeEmpty(input: Array): T[]; +export function removeEmpty(input: { [P in keyof T]: T[P] }): NonEmptyObject; +export function propIf(a: Falsy, value: any, alternate: E): E; +export function propIf(a: any, value: I, alternate: any): I; +export function propIfNot(a: Falsy, value: I, alternate: any): I; +export function propIfNot(a: any, value: any, alternate: E): E; + +export type Falsy = false | '' | 'false' | undefined | null | 0; +export type DefinedObjKeys = ({ [P in keyof T]: T[P] extends undefined ? never : P })[keyof T]; +export type NonEmptyObject = DefinedObjKeys> = { [PP in P]: T[PP] }; + +export type EnvVars = 'production' | 'prod' | 'test' | 'development' | 'dev'; + +export interface IfUtilsFn { + (value: Y, alternate?: N): Y | N; + (): boolean; +} +export interface IfUtils { + ifDevelopment: IfUtilsFn; + ifNotDevelopment: IfUtilsFn; + ifDev: IfUtilsFn; + ifNotDev: IfUtilsFn; + ifProduction: IfUtilsFn; + ifNotProduction: IfUtilsFn; + ifProd: IfUtilsFn; + ifNotProd: IfUtilsFn; + ifTest: IfUtilsFn; + ifNotTest: IfUtilsFn; + [key: string]: IfUtilsFn; +} diff --git a/types/webpack-config-utils/tsconfig.json b/types/webpack-config-utils/tsconfig.json new file mode 100644 index 0000000000..0376cbd868 --- /dev/null +++ b/types/webpack-config-utils/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "webpack-config-utils-tests.ts" + ] +} diff --git a/types/webpack-config-utils/tslint.json b/types/webpack-config-utils/tslint.json new file mode 100644 index 0000000000..3db14f85ea --- /dev/null +++ b/types/webpack-config-utils/tslint.json @@ -0,0 +1 @@ +{ "extends": "dtslint/dt.json" } diff --git a/types/webpack-config-utils/webpack-config-utils-tests.ts b/types/webpack-config-utils/webpack-config-utils-tests.ts new file mode 100644 index 0000000000..4f83245b57 --- /dev/null +++ b/types/webpack-config-utils/webpack-config-utils-tests.ts @@ -0,0 +1,100 @@ +import webpackConfigUtils = require('webpack-config-utils'); +import { getIfUtils, removeEmpty, propIf, propIfNot } from 'webpack-config-utils'; + +{ + // propIf/propIfNot + + // $ExpectType "value" + propIf(true, 'value', 'alternate'); + + // $ExpectType "alternate" + propIf(false, 'value', 'alternate'); + + // $ExpectType "alternate" + propIf('false', 'value', 'alternate'); + + // $ExpectType "alternate" + propIfNot(true, 'value', 'alternate'); + + // $ExpectType "value" + propIfNot(false, 'value', 'alternate'); + + // $ExpectType "value" + propIfNot('false', 'value', 'alternate'); +} +{ + // getIfUtils + { + // $ExpectType IfUtils + const utils = getIfUtils({}); + } + { + const utils = getIfUtils({}, ['foo', 'bar']); // 'ifFoo', 'ifNotFoo', 'ifBar', 'ifNotBar' + const { + ifFoo, // $ExpectType IfUtilsFn + ifBar, // $ExpectType IfUtilsFn + ifNotFoo, // $ExpectType IfUtilsFn + ifNotBar // $ExpectType IfUtilsFn + } = utils; + } + + { + const { + ifProduction // $ExpectType IfUtilsFn + } = getIfUtils('production'); + + // $ExpectType "value" | "alternate" + ifProduction('value', 'alternate'); // 'value' + } + { + const { ifNotDev } = getIfUtils({ dev: false }); + + // $ExpectType "value" | "alternate" + ifNotDev('value', 'alternate'); // 'value' + } + { + // $ExpectError + getIfUtils(false); // webpack-config-utils:getIfUtils.*?string\/Object/); + } + { + const { ifTest, ifProd, ifNotDev } = getIfUtils('test'); + // $ExpectType boolean + ifTest(); // true; + // $ExpectType boolean + ifProd(); // false; + // $ExpectType boolean + ifNotDev(); // true; + } + { + const { ifWatch, ifProd, ifNotDev, ifTest } = getIfUtils('watch', ['prod', 'dev', 'watch']); + // $ExpectType boolean + ifWatch(); // true + // $ExpectType boolean + ifProd(); // false + // $ExpectType boolean + ifNotDev(); // true + // $ExpectType IfUtilsFn + ifTest; // function + } +} +{ + // removeEmpty + // $ExpectType (number | null)[] + const emptiedArray = removeEmpty([undefined, 0, 1, 2, undefined, 3, undefined, null]); // [0, 1, 2, 3, null] + + // $ExpectType NonEmptyObject<{ a: number; b: string; c: undefined; d: null; }, "b" | "a" | "d"> + const emptiedObject = removeEmpty({ a: 1, b: 'b', c: undefined, d: null }); // {a: 1, b: 'b', d: null} + const { + a, // $ExpectType number + b, // $ExpectType string + d // $ExpectType null + } = emptiedObject; + + { + // $ExpectError + const {a, b, c, d} = emptiedObject; + } + + // $ExpectType number | null + const firstItem = emptiedArray[0]; +}