# Webpack Bundle Tracker

[![master build status](https://github.com/django-webpack/webpack-bundle-tracker/actions/workflows/config.yml/badge.svg)](https://github.com/django-webpack/webpack-bundle-tracker/actions/workflows/config.yml)

Spits out some stats about webpack compilation process to a file.

## Install

```bash
npm install --save-dev webpack-bundle-tracker
```

## Compatibility

This project is compatible with NodeJS versions 16 and up.

:warning: Starting on version 17, NodeJS uses OpenSSL v3 which has compatibility issues with Webpack@4. This isn't an issue for Webpack@5, however
if you're using Node >= 17 and Webpack@4, to properly use this package you must ensure to set the `NODE_OPTIONS=--openssl-legacy-provider` environment
variable. You can read more about this on https://github.com/webpack/webpack/issues/14532.

## Migrating from version 1.x.y to 2.x.y

Starting on version 2.0.0, when creating a new instance of `BundleTracker`, the usage of the `path` parameter has been fixed and it's now being used to generate the output path for the stats file, together with the `filename` parameter. On version 2.0.0, if the `path` parameter is ommited from the constuctor call, it will attempt to place the stats file at the `output.path` directory (if also ommited, will use `'.'` as a fallback). Also, version 2.0.0 doesn't allow sub-directories to be included on the `filename`, only allowing to include them on the `path` param. To avoid those issues, when migrating, double-check if the file placement is as expected. The usage of these parameters is documented [here](#usage) and [here](#options).

## Usage

```javascript
var path = require('path');
var BundleTracker = require('webpack-bundle-tracker');
module.exports = {
  context: __dirname,
  entry: {
    app: ['./app'],
  },

  output: {
    path: path.resolve('./assets/bundles/'),
    filename: '[name]-[hash].js',
    publicPath: 'http://localhost:3000/assets/bundles/',
  },

  plugins: [
    new BundleTracker({
      path: path.join(__dirname, 'assets'),
      filename: 'webpack-stats.json',
    }),
  ],
};
```

The `webpack-stats.json` file will look like,

```json
{
  "status": "done",
  "chunks": {
    "app": ["app-0828904584990b611fb8.js"]
  },
  "assets": {
    "app-0828904584990b611fb8.js": {
      "name": "app-0828904584990b611fb8.js",
      "publicPath": "http://localhost:3000/assets/bundles/app-0828904584990b611fb8.js",
      "path": "/home/user/project-root/assets/bundles/app-0828904584990b611fb8.js"
    }
  }
}
```

In case webpack is still compiling, it'll look like,

```json
{
  "status": "compile"
}
```

And errors will look like,

```json
{
  "status": "error",
  "file": "/path/to/file/that/caused/the/error",
  "error": "ErrorName",
  "message": "ErrorMessage"
}
```

`ErrorMessage` shows the line and column that caused the error.

And in case `logTime` option is set to `true`, the output will look like,

```json
{
  "status": "done",
  "chunks": {
    "app": ["app-0828904584990b611fb8.js"]
  },
  "assets": {
    "app-0828904584990b611fb8.js": {
      "name": "app-0828904584990b611fb8.js",
      "publicPath": "http://localhost:3000/assets/bundles/app-0828904584990b611fb8.js",
      "path": "/home/user/project-root/assets/bundles/app-0828904584990b611fb8.js"
    }
  },
  "startTime": 1440535322138,
  "endTime": 1440535326804
}
```

And in case `relativePath` option is set to `true`, the output will look like,

```json
{
  "status": "done",
  "chunks": {
    "app": ["app-0828904584990b611fb8.js"]
  },
  "assets": {
    "app-0828904584990b611fb8.js": {
      "name": "app-0828904584990b611fb8.js",
      "publicPath": "http://localhost:3000/assets/bundles/app-0828904584990b611fb8.js",
      "path": "app-0828904584990b611fb8.js"
    }
  }
}
```

And in case `integrity` option is set to `true`, the output will look like,

```json
{
  "status": "done",
  "chunks": {
    "app": ["app-0828904584990b611fb8.js"]
  },
  "assets": {
    "app-0828904584990b611fb8.js": {
      "name": "app-0828904584990b611fb8.js",
      "publicPath": "http://localhost:3000/assets/bundles/app-0828904584990b611fb8.js",
      "path": "app-0828904584990b611fb8.js",
      "integrity": "sha256-yAIefNWsF0IfxalAlLNngdY0t3J1h4IzZLzcJEn/FTM= sha384-QmiRCOdQx6MVC721liFMbJjud6Kr5ryT1vhHI5htzftpzoI1P3IlBqbpg5AHjbBv sha512-kbLjakids0Z2vvrOrtV7s2FUvKcgM3bg0WQwuyGvJPE+zVqOL4t0UvWkeUzz5z2ZrDm0ST/dQjPBJaq7rDB/2Q=="
    }
  }
}
```

And in case of usage of compression plugin for webpack, the output will look like,

```json
{
  "status": "done",
  "chunks": {
    "app": ["app-0828904584990b611fb8.js"]
  },
  "assets": {
    "app-0828904584990b611fb8.js": {
      "name": "app-0828904584990b611fb8.js",
      "publicPath": "http://localhost:3000/assets/bundles/app-0828904584990b611fb8.js",
      "path": "/home/user/project-root/assets/bundles/app-0828904584990b611fb8.js"
    },
    "app-0828904584990b611fb8.js.br": {
      "name": "app-0828904584990b611fb8.js.br",
      "publicPath": "http://localhost:3000/assets/bundles/app-0828904584990b611fb8.js.br",
      "path": "/home/user/project-root/assets/bundles/app-0828904584990b611fb8.js.br"
    },
    "app-0828904584990b611fb8.js.gz": {
      "name": "app-0828904584990b611fb8.js.gz",
      "publicPath": "http://localhost:3000/assets/bundles/app-0828904584990b611fb8.js.gz",
      "path": "/home/user/project-root/assets/bundles/app-0828904584990b611fb8.js.gz"
    }
  }
}
```

By default, the output JSON will not be indented. To increase readability, you can use the `indent`
option to make the output legible. By default it is off. The value that is set here will be directly
passed to the `space` parameter in `JSON.stringify`. More information can be found [here](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify)

## Options

| Name              | Type        | Default                          | Description                                                                                                                     |
| ----------------- | ----------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| `path`            | `{String}`  | `'.'`                            | Output directory of bundle tracker JSON file. Will attempt to use `output.path` before falling back to the default value.       |
| `filename`        | `{String}`  | `'webpack-stats.json'`           | Name of the bundle tracker JSON file.                                                                                           |
| `publicPath`      | `{String}`  | (ignored)                        | Override `output.publicPath` from Webpack config.                                                                               |
| `relativePath`    | `{Boolean}` | `false`                          | Show relative path instead of absolute path for bundles in JSON Tracker file. Path are relative from path of JSON Tracker file. |
| `logTime`         | `{Boolean}` | `false`                          | Output `startTime` and `endTime` properties in bundle tracker JSON file.                                                        |
| `integrity`       | `{Boolean}` | `false`                          | Output `integrity` property for each asset entry.                                                                               |
| `integrityHashes` | `{Array}`   | `['sha256', 'sha384', 'sha512']` | Cryptographic hash functions used to compute integrity for each asset.                                                          |
| `indent`          | `{Integer}` | `undefined`                      | Format resulting JSON file for better readability.                                                                              |
