const { environment, config } = require('@rails/webpacker') const ForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin"); const webpack = require('webpack'); const path = require("path"); const erb = require('./loaders/erb') const fs = require('fs') const hash = require('object-hash') function getTerser() { if(environment.config && environment.config.optimization && environment.config.optimization.minimizer && environment.config.optimization.minimizer instanceof Array && environment.config.optimization.minimizer.length === 1) return environment.config.optimization.minimizer[0] else return null; } function outputLicenseFile(file, outputDir) { const contents = fs.readFileSync(file); const name = path.basename(file) + "-" + hash(contents) + ".txt"; if (!fs.existsSync(outputDir)) { fs.mkdirSync(outputDir, {recursive: true}); } fs.copyFileSync(file, path.join(outputDir, name)); return name; } environment.loaders.prepend('erb', erb) environment.plugins.append( "ForkTsCheckerWebpackPlugin", new ForkTsCheckerWebpackPlugin({ typescript: { tsconfig: path.resolve(__dirname, "../../tsconfig.json"), }, async: false, }) ); environment.plugins.prepend("BannerPlugin", new webpack.BannerPlugin( {banner: `@hlicense License information is available at ${config.publicPath}${outputLicenseFile('NOTICE-js', config.outputPath)}`, entryOnly: false})) const terser = getTerser() if (terser) { terser.options.terserOptions = terser.options.terserOptions || {} terser.options.terserOptions.output = terser.options.terserOptions.output || {} terser.options.terserOptions.output.comments = /@hlicense/i // we don't want terser to print out license headers, we'll handle that ourselves terser.options.extractComments = false; } module.exports = environment