From 5c8e288f4f841d973c7fa145aa21501383d18e3e Mon Sep 17 00:00:00 2001 From: Eirikur Nilsson Date: Wed, 22 Mar 2017 00:50:03 +0000 Subject: [PATCH] Add types for webpack-chain --- webpack-chain/index.d.ts | 212 +++++++++++++++++++++++++++ webpack-chain/tsconfig.json | 22 +++ webpack-chain/tslint.json | 1 + webpack-chain/webpack-chain-tests.ts | 205 ++++++++++++++++++++++++++ 4 files changed, 440 insertions(+) create mode 100644 webpack-chain/index.d.ts create mode 100644 webpack-chain/tsconfig.json create mode 100644 webpack-chain/tslint.json create mode 100644 webpack-chain/webpack-chain-tests.ts diff --git a/webpack-chain/index.d.ts b/webpack-chain/index.d.ts new file mode 100644 index 0000000000..f6cfc40b25 --- /dev/null +++ b/webpack-chain/index.d.ts @@ -0,0 +1,212 @@ +// Type definitions for webpack-chain 3.0 +// Project: https://github.com/mozilla-neutrino/webpack-chain +// Definitions by: Eirikur Nilsson +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +import * as webpack from 'webpack'; +import * as https from 'https'; + +export = Config; + +declare class Config { + devServer: Config.DevServer + entryPoints: Config.EntryPoints + module: Config.Module + node: Config.ChainedMap + output: Config.Output + performance: Config.Performance + plugins: Config.Plugins + resolve: Config.Resolve + resolveLoader: Config.ResolveLoader + + amd(value: { [moduleName: string]: boolean }): this + bail(value: boolean): this + cache(value: boolean | any): this + devtool(value: Config.DevTool): this + context(value: string): this + externals(value: webpack.ExternalsElement | webpack.ExternalsElement[]): this + loader(value: any): this + profile(value: boolean): this + recordsPath(value: string): this + recordsInputPath(value: string): this + recordsOutputPath(value: string): this + stats(value: webpack.Options.Stats): this + target(value: string): this + watch(value: boolean): this + watchOptions(value: webpack.Options.WatchOptions): this + + entry(name: string): Config.ChainedSet + plugin(name: string): Config.Plugin + + toConfig(): webpack.Configuration + merge(obj: any): this +} + +declare namespace Config { + export class Chained { + end(): Parent + } + + export class TypedChainedMap extends Chained { + clear(): this + delete(key: string): this + has(key: string): boolean + get(key: string): Value + set(key: string, value: Value): this + merge(obj: { [key: string]: Value }): this + entries(): { [key: string]: Value } + values(): Array + } + + export class ChainedMap extends TypedChainedMap {} + + export class TypedChainedSet extends Chained { + add(value: Value): this + prepend(value: Value): this + clear(): this + delete(key: string): this + has(key: string): boolean + merge(arr: Array): this + values(): Array + } + + export class ChainedSet extends TypedChainedSet {} + + export class Plugins extends TypedChainedMap> {} + + export class Plugin extends ChainedMap { + init(value: (plugin: PluginClass, args: any[]) => webpack.Plugin): this + use(plugin: PluginClass, args?: any[]): this + tap(f: (args: any[]) => any[]): this + } + + export class Module extends ChainedMap { + rules: TypedChainedMap + rule(name: string): Rule + } + + export class Output extends ChainedMap { + chunkFilename(value: string): this + crossOriginLoading(value: boolean | string): this + filename(value: string): this + library(value: string): this + libraryTarget(value: string): this + devtoolFallbackModuleFilenameTemplate(value: any): this + devtoolLineToLine(value: any): this + devtoolModuleFilenameTemplate(value: any): this + hashFunction(value: string): this + hashDigest(value: string): this + hashDigestLength(value: number): this + hashSalt(value: any): this + hotUpdateChunkFilename(value: string): this + hotUpdateFunction(value: any): this + hotUpdateMainFilename(value: string): this + jsonpFunction(value: string): this + path(value: string): this + pathinfo(value: boolean): this + publicPath(value: string): this + sourceMapFilename(value: string): this + sourcePrefix(value: string): this + strictModuleExceptionHandling(value: boolean): this + umdNamedDefine(value: boolean): this + } + + export class DevServer extends ChainedMap { + clientLogLevel(value: 'none' | 'error' | 'warning' | 'info'): this + compress(value: boolean): this + contentBase(value: boolean | string | string[]): this + filename(value: string): this + headers(value: { [header: string]: string }): this + historyApiFallback(value: boolean | any): this + host(value: string): this + hot(value: boolean): this + hotOnly(value: boolean): this + https(value: boolean | https.ServerOptions): this + inline(value: boolean): this + lazy(value: boolean): this + noInfo(value: boolean): this + overlay(value: boolean | { warnings?: boolean, errors?: boolean }): this + port(value: number): this + proxy(value: any): this + quiet(value: boolean): this + setup(value: (expressApp: any) => void): this + stats(value: webpack.Options.Stats): this + watchContentBase(value: boolean): this + } + + export class Performance extends ChainedMap { + hints(value: boolean | 'error' | 'warning'): this + maxEntrypointSize(value: number): this + maxAssetSize(value: number): this + assetFilter(value: (assetFilename: string) => boolean): this + } + + export class EntryPoints extends TypedChainedMap> {} + + export class Resolve extends ChainedMap { + alias: TypedChainedMap + aliasFields: TypedChainedSet + descriptionFiles: TypedChainedSet + extensions: TypedChainedSet + mainFields: TypedChainedSet + mainFiles: TypedChainedSet + modules: TypedChainedSet + plugins: TypedChainedMap> + + enforceExtension(value: boolean): this + enforceModuleExtension(value: boolean): this + unsafeCache(value: boolean | RegExp | RegExp[]): this + symlinks(value: boolean): this + cachePredicate(value: (data: { path: string, request: string }) => boolean): this + + plugin(name: string): Plugin + } + + export class ResolveLoader extends ChainedMap { + extensions: TypedChainedSet + modules: TypedChainedSet + moduleExtensions: TypedChainedSet + packageMains: TypedChainedSet + } + + export class Rule extends ChainedMap { + uses: TypedChainedMap + include: TypedChainedSet + exclude: TypedChainedSet + + parser(value: { [optName: string]: any }): this + test(value: webpack.Condition | webpack.Condition[]): this + enforce(value: 'pre' | 'post'): this + + use(name: string): Use + pre(): this + post(): this + } + + type LoaderOptions = { [name: string]: any } + + export class Use extends ChainedMap { + loader(value: string): this + options(value: LoaderOptions): this + + tap(f: (options: LoaderOptions) => LoaderOptions): this + } + + type DevTool = 'eval' | 'inline-source-map' | 'cheap-eval-source-map' | 'cheap-source-map' | + 'cheap-module-eval-source-map' | 'cheap-module-source-map' | 'eval-source-map' | 'source-map' | + 'nosources-source-map' | 'hidden-source-map' | 'nosources-source-map' | '@eval' | + '@inline-source-map' | '@cheap-eval-source-map' | '@cheap-source-map' | + '@cheap-module-eval-source-map' | '@cheap-module-source-map' | '@eval-source-map' | + '@source-map' | '@nosources-source-map' | '@hidden-source-map' | '@nosources-source-map' | + '#eval' | '#inline-source-map' | '#cheap-eval-source-map' | '#cheap-source-map' | + '#cheap-module-eval-source-map' | '#cheap-module-source-map' | '#eval-source-map' | + '#source-map' | '#nosources-source-map' | '#hidden-source-map' | '#nosources-source-map' | + '#@eval' | '#@inline-source-map' | '#@cheap-eval-source-map' | '#@cheap-source-map' | + '#@cheap-module-eval-source-map' | '#@cheap-module-source-map' | '#@eval-source-map' | + '#@source-map' | '#@nosources-source-map' | '#@hidden-source-map' | '#@nosources-source-map' | + boolean + + interface PluginClass { + new (...opts: any[]): webpack.Plugin + } +} diff --git a/webpack-chain/tsconfig.json b/webpack-chain/tsconfig.json new file mode 100644 index 0000000000..ad23fcfa57 --- /dev/null +++ b/webpack-chain/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "webpack-chain-tests.ts" + ] +} diff --git a/webpack-chain/tslint.json b/webpack-chain/tslint.json new file mode 100644 index 0000000000..377cc837d4 --- /dev/null +++ b/webpack-chain/tslint.json @@ -0,0 +1 @@ +{ "extends": "../tslint.json" } diff --git a/webpack-chain/webpack-chain-tests.ts b/webpack-chain/webpack-chain-tests.ts new file mode 100644 index 0000000000..da72bc6f9f --- /dev/null +++ b/webpack-chain/webpack-chain-tests.ts @@ -0,0 +1,205 @@ +import * as Config from 'webpack-chain'; +import * as webpack from 'webpack'; + +const config = new Config(); + +config + .amd({ foo: true }) + .bail(true) + .cache(false) + .cache({}) + .devtool('hidden-source-map') + .devtool(false) + .context('') + .externals('foo') + .externals(/node_modules/) + .externals({ 'test': false, 'foo': 'bar' }) + .externals(['foo', 'bar']) + .externals((context, request, cb) => cb(null, true)) + .loader({}) + .profile(false) + .recordsPath('') + .recordsInputPath('') + .recordsOutputPath('') + .stats({ + assets: false, + publicPath: true, + modules: false + }) + .target('web') + .watch(true) + .watchOptions({}) + + .entry('main') + .add('index.js') + .delete('index.js') + .clear() + .end() + + .entryPoints + .delete('main') + .end() + + .plugin('foo') + .use(webpack.DefinePlugin, []) + .end() + + .plugins + .delete('foo') + .end() + + .devServer + .clientLogLevel('error') + .compress(false) + .contentBase('/') + .contentBase(['foo', 'bar']) + .filename('hello') + .headers({ + 'Content-Type': 'text/css', + }) + .historyApiFallback(true) + .host('localhost') + .hot(true) + .hotOnly(true) + .https(true) + .inline(true) + .lazy(true) + .noInfo(true) + .overlay(true) + .overlay({ + warnings: true, + errors: true, + }) + .port(8080) + .proxy({}) + .quiet(false) + .setup(app => {}) + .stats({ + reasons: true, + errors: true, + warnings: false, + }) + .watchContentBase(true) + .end() + + .module + .rule('compile') + .test(/.js$/) + .include + .add(/.js$/) + .end() + .exclude + .add(/node_modules/) + .end() + .parser({ + opt: 'foo', + }) + .enforce('pre') + .use('babel') + .loader('babel-loader') + .options({}) + .end() + .uses + .delete('babel') + .end() + .pre() + .post() + .end() + .rules + .delete('compile') + .end() + .end() + + .node + .set('__dirname', true) + .delete('__dirname') + .clear() + .end() + + .output + .chunkFilename('') + .crossOriginLoading(true) + .filename('main.js') + .library('var') + .libraryTarget('var') + .devtoolFallbackModuleFilenameTemplate('') + .devtoolLineToLine('') + .devtoolModuleFilenameTemplate('') + .hashFunction('md5') + .hashDigest('md5') + .hashDigestLength(15) + .hashSalt('') + .hotUpdateChunkFilename('update') + .hotUpdateFunction(() => {}) + .hotUpdateMainFilename('main') + .jsonpFunction('callback') + .path('/') + .pathinfo(true) + .publicPath('/') + .sourceMapFilename('index.js.map') + .sourcePrefix('~') + .strictModuleExceptionHandling(true) + .umdNamedDefine(true) + .end() + + .performance + .hints(true) + .hints('warning') + .maxEntrypointSize(20000) + .maxAssetSize(20000) + .assetFilter(filename => true) + .end() + + .resolve + .alias + .set('foo', 'bar') + .end() + .aliasFields + .add('foo') + .end() + .descriptionFiles + .add('foo') + .end() + .extensions + .add('.js') + .end() + .mainFields + .add('browser') + .end() + .mainFiles + .add('index.js') + .end() + .modules + .add('index.js') + .end() + .enforceExtension(true) + .enforceModuleExtension(true) + .unsafeCache(false) + .unsafeCache(/foo/) + .symlinks(true) + .cachePredicate(({ path, request }) => true) + .plugin('foo') + .use(webpack.DefinePlugin, []) + .end() + .plugins + .delete('foo') + .end() + .end() + + .resolveLoader + .extensions + .add('.js') + .end() + .modules + .add('index.js') + .end() + .moduleExtensions + .add('.js') + .end() + .packageMains + .add('index.js') + .end() + .end() + + .merge({}) + .toConfig();