npm package: @ilabdev/webpack
Description: Gulp tasks for linting & compiling scripts with webpack
Author: Innovation Lab
Latest version: 1.0.0

# `@ilabdev/webpack`

> Gulp tasks for linting & compiling scripts with webpack

## Installation & set up

Install `@ilabdev/webpack`

```shell
npm install @ilabdev/webpack --save-dev

-- OR --

yarn add @ilabdev/webpack --dev
```

Include `@ilabdev/webpack` in your `gulpfile.js`

**NOTE:** Make sure you pass `gulp` through to the package as shown below. The package sets up gulp tasks and will need it passed through to work.

```js
require( '@ilabdev/webpack' )( gulp )
```

Add the content from `config.sample.js` to your `.gulpconfig.js` and adjust as appropriate

```js
module.exports = {
    // Other configs here...
    webpack: {
        process: true,
        watch: true,
        logColor: 'magenta',
        areas: [
            {
                paths: {
                    src: './src/js/scripts.js',
                    watch: './src/js/**/*',
                    dest: './dist/js',
                },
                minify: {
                    process: true,
                    separate: false,
                },
                pipes: {
                    // Put any pipe overrides here
                    src: {
                        allowEmpty: true,
                        base: './src/js',
                        sourcemaps: true,
                    },
                    dest: {
                        sourcemaps: '.',
                    },
                },
            },
        ],
        pipes: {
            filters: {
                lint: [
                    '**/*.js',
                ],
                build: [
                    '**/*.js',
                    '!**/libs/**/*.js',
                ],
            },
            watch: {
                events: 'all',
            },
            eslint: {
                // Overrides the version of eslint used
                eslint: null,
                formatter: 'stylish',
                options: {
                    fix: false,
                },
            },
            webpack: {
                // Overrides the version of webpack used.
                webpack: null,
                options: {
                    externals: {
                        react: 'React',
                        'react-dom': 'ReactDOM',
                    },
                    target: 'browserslist',
                    module: {
                        rules: [
                            {
                                test: /\.jsx?$/,
                                exclude: /(node_modules|bower_components)/,
                                use: {
                                    loader: 'babel-loader',
                                    options: {
                                        presets: [
                                            '@babel/preset-env',
                                            '@babel/preset-react',
                                        ],
                                        plugins: [],
                                    },
                                },
                            },
                        ],
                    },
                    resolve: {
                        extensions: ['.js', '.jsx', '.json'],
                    },
                    devtool: 'source-map',
                    mode: 'development',
                },
            },
            uglify: {
                output: {
                    comments: '/^!|@preserve|@license|@cc_on/i',
                },
            },
        },
    },
    // Other configs here...
}
```

Run `gulp webpack` to run the linting & compiling tasks, `gulp webpack:lint` to run the linting task, `gulp webpack:build` to run the compiling task, `gulp webpack:watch` to run the watch task, or add the task as a script and run that with `npm` or `yarn`

## Config

### `process`

Type: `boolean`

Whether to lint & compile scripts or not

### `watch`

Type: `boolean`

Whether to watch scripts for changes or not

### `loggerColor`

Type: `string`

The logger color to use for any output text. See https://github.com/stgdp/fancy-logger#available-modifiers for colors that can be used

### `areas`

Type: `object[]`

The areas to be linted & compiled. Each area has it's own, isolated settings to allow for separate configs

### `areas[].paths`

Type: `object`

Path references for the linter & compiler

### `areas[].paths.src`

Type: `string[]|string`

The paths to linted & compiled. Passed through to `gulp.src`, items can be globs

### `areas[].paths.watch`

Type: `string[]|string`

The paths to watched. These are combined into a single array and passed through to `gulp.watch`

### `areas[].paths.dest`

Type: `string`

The destination path of the compiled scripts. Passed through to `gulp.dest`, items can be globs

### `areas[].paths.minify`

Type: `object`

The options for minifying scripts

### `areas[].paths.minify.process`

Type: `boolean`

Whether to minify scripts or not

### `areas[].paths.minify.separate`

Type: `boolean`

Whether minified scripts should be separate files or not

### `areas[].pipes`

Type: `object`

Options to be passed through to the pipes.

### `areas[].pipes.src`

Type: `object`

Options to be passed through to the `gulp.src` pipe. See https://gulpjs.com/docs/en/api/src/ for more information

### `areas[].pipes.dest`

Type: `object`

Options to be passed through to the `gulp.dest` pipe. See https://gulpjs.com/docs/en/api/dest/ for more information

### `pipes`

Type: `object`

Options to be passed through to the pipes.

### `pipes.filters`

Type: `object`

Filters for each task

### `pipes.filters.lint`

Type: `string[]`

Filters for the lint task

### `pipes.filters.build`

Type: `string[]`

Filters for the build task

### `pipes.watch`

Type: `object`

Options to be passed through to the `gulp.watch` pipe. See https://gulpjs.com/docs/en/api/watch/ for more information

### `pipes.eslint`

Type: `object`

Options for eslint

### `pipes.eslint.eslint`

Type: `class|null`

Overrides the version of eslint used. Must pass through the eslint class e.g. `require( 'eslint' ).ESLint`

### `pipes.eslint.formatter`

Type: `string`

The formatter to be used to output errors & warnings. See https://eslint.org/docs/latest/use/formatters/ for more information

### `pipes.eslint.options`

Type: `object`

Options to be passed through to the eslint class. See https://eslint.org/docs/latest/integrate/nodejs-api#parameters for more information

### `pipes.webpack`

Type: `object`

Options for webpack

### `pipes.webpack.webpack`

Type: `function|null`

Overrides the version of webpack used

### `pipes.webpack.options`

Type: `object`

Options to be passed through to `webpack`. See https://webpack.js.org/configuration/ for more information

### `pipes.uglify`

Type: `object`

Options to be passed through to `gulp-uglify`. See https://www.npmjs.com/package/gulp-uglify for more information