Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

tslint-loader with webpack 2.1.0-beta.25

I have an angular2 Project that I compress/compile with webpack.

I use tslink loader with webpack so I have tslint related configuration in webpack.config.js.

module.exports = {
...
tslint: {
    configuration: {
        rules: {
            quotemark: [true, "double"]
        }
    },

    // tslint errors are displayed by default as warnings
    // set emitErrors to true to display them as errors
    emitErrors: false,

    // tslint does not interrupt the compilation by default
    // if you want any file with tslint errors to fail
    // set failOnHint to true
    failOnHint: true,

    // name of your formatter (optional)
    formatter: "",

    // path to directory containing formatter (optional)
    formattersDirectory: "node_modules/tslint-loader/formatters/",

    // These options are useful if you want to save output to files
    // for your continuous integration server
    fileOutput: {
        // The directory where each file"s report is saved
        dir: "./webpack-log/",

        // The extension to use for each report"s filename. Defaults to "txt"
        ext: "xml",

        // If true, all files are removed from the report directory at the beginning of run
        clean: true,

        // A string to include at the top of every report file.
        // Useful for some report formats.
        header: "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<checkstyle version=\"5.7\">",

        // A string to include at the bottom of every report file.
        // Useful for some report formats.
        footer: "</checkstyle>"
    }
},
...
preLoaders: [
        {
            test: /\.ts$/,
            loader: "tslint"
        }
    ],
}
}

I updated webpack 1.13.1 to 2.1.0-beta.25 and tslint configuration breaks the complication process of npm run build.

I changed the preLoaders directive to loaders

module: {
        ....
        {
            test: /\.ts$/,
            loader: 'tslint',
            exclude: /(node_modules)/,
            enforce: 'pre'
        },
    ],
}

that's not enough cause I still get the error

For loader options: webpack 2 no longer allows custom properties in configuration.
 Loaders should be updated to allow passing options via loader options in module.rules.

so I should move the tslint configuration and place it somewhere else. kinda lost here. so any information regarding the issue would be greatly appreciated.

thanks!

like image 764
ufk Avatar asked Oct 07 '16 14:10

ufk


3 Answers

For others who have problems with preloaders in webpack 2. In beta v2.1-beta.23 there are breaking changes with pre/postLoaders.

First the "loaders" section should be renamed to "rules". Also pre/postLoaders is now defined under rules.

In my case i was using tslint as a preLoader. To add a pre/postLoader to rules add the enforce property with value either pre or post.

module: {
    rules: [
        {
            enforce: 'pre',
            test: /\.tsx?$/,
            loader: 'tslint',
            exclude: /(node_modules)/,
        },
        {
            test: /\.tsx?$/,
            loaders: ['awesome-typescript-loader'],
            exclude: /(node_modules)/
        }
    ]
}

More info in the release on github: Webpack v2.1.0-beta.23

In the release info there is also a link to a pull request that shows the needed changes going from v2.1.0-beta.22 to v2.1.0-beta.23 in webpack config file. There you can see that you also need the LoaderOptionsPlugin.

plugins: [
    new webpack.LoaderOptionsPlugin({
        options: {
            tslint: {
                emitErrors: true,
                failOnHint: true
            }
        }
    })
]
like image 185
jontem Avatar answered Oct 30 '22 11:10

jontem


ok.. so I just needed to move the tslint definition under:

plugins: [
    new LoaderOptionsPlugin({
        options: {
           tslint: {
             ...

and declared

const LoaderOptionsPlugin = require("webpack/lib/LoaderOptionsPlugin");
like image 2
ufk Avatar answered Oct 30 '22 11:10

ufk


If you don't want to add a plugin, you can do something like this,

module: {
  rules: [
    {
      enforce: 'pre',
      test: /\.ts$/,
      loader: 'tslint-loader?' + JSON.stringify({
        emitErrors: true,
        failOnHint: true
      })
    }
  ]
}
like image 1
Raghav Manikandan Avatar answered Oct 30 '22 12:10

Raghav Manikandan