@oroinc/oro-webpack-config-builder 6.1.0-lts02 → 6.1.0-lts04

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,6 +9,8 @@ const EntryPointFileWriter = require('./writer/scss-entry-point-file-writer');
9
9
  const LayoutModulesConfigLoader = require('./modules-config/layout-modules-config-loader');
10
10
  const LayoutStyleLoader = require('./style/layout-style-loader');
11
11
  const MapModulesPlugin = require('./plugin/map/map-modules-plugin');
12
+ const IntegrityFilePlugin = require('./plugin/integrity/integrity-file-plugin');
13
+ const {SubresourceIntegrityPlugin} = require('webpack-subresource-integrity');
12
14
  const MiniCssExtractPlugin = require('mini-css-extract-plugin');
13
15
  const ModulesConfigLoader = require('./modules-config/modules-config-loader');
14
16
  const DynamicImportsFileWriter = require('./writer/dynamic-imports-file-writer');
@@ -281,7 +283,8 @@ class ConfigBuilder {
281
283
  output: {
282
284
  filename: '[name].js',
283
285
  // Because we use third party libraries 'chunkFilename' should include only [name]
284
- chunkFilename: this._getVersionedPath('chunk/[name].js', this.assetVersion)
286
+ chunkFilename: this._getVersionedPath('chunk/[name].js', this.assetVersion),
287
+ crossOriginLoading: "anonymous"
285
288
  },
286
289
  devtool: !env.skipSourcemap && 'inline-cheap-module-source-map',
287
290
  mode: 'development',
@@ -292,7 +295,7 @@ class ConfigBuilder {
292
295
  defaultVendors: false
293
296
  }
294
297
  },
295
- minimize: true,
298
+ minimize: this._isProduction,
296
299
  minimizer: [new TerserPlugin({
297
300
  parallel: true,
298
301
  extractComments: false,
@@ -388,6 +391,10 @@ class ConfigBuilder {
388
391
  new webpack.optimize.MinChunkSizePlugin({
389
392
  minChunkSize: 30000 // Minimum number of characters
390
393
  }),
394
+ new SubresourceIntegrityPlugin(),
395
+ new IntegrityFilePlugin({
396
+ publicPath: this.resolvedPublicPath
397
+ }),
391
398
  new AfterWebpackLogsPlugin(
392
399
  stats => this.emitter.emit('build:complete', stats)
393
400
  )
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oroinc/oro-webpack-config-builder",
3
- "version": "6.1.0-lts02",
3
+ "version": "6.1.0-lts04",
4
4
  "author": "Oro, Inc. (https://oroinc.com)",
5
5
  "license": "MIT",
6
6
  "description": "An integration of OroPlatform based applications with the Webpack.",
@@ -49,6 +49,7 @@
49
49
  "webpack-cli": "~6.0.0",
50
50
  "webpack-dev-server": "^5.2.0",
51
51
  "webpack-merge": "~5.8.0",
52
+ "webpack-subresource-integrity": "^5.2.0-rc.1",
52
53
  "wildcard": "~2.0.0"
53
54
  }
54
55
  }
@@ -0,0 +1,42 @@
1
+ const { createHash } = require('crypto');
2
+ const { Compilation, sources } = require('webpack');
3
+ const fs = require('fs').promises;
4
+ const path = require('path');
5
+
6
+ class IntegrityFilePlugin {
7
+ constructor({fileName = 'integrity.json', publicPath = '', algorithm = 'sha384'} = {}) {
8
+ this.fileName = fileName;
9
+ this.publicPath = publicPath;
10
+ this.algorithm = algorithm;
11
+ }
12
+
13
+ apply(compiler) {
14
+ compiler.hooks.thisCompilation.tap('IntegrityFilePlugin', (compilation) => {
15
+ compilation.hooks.processAssets.tapPromise(
16
+ { name: 'SubresourceIntegrityPlugin', stage: Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_TRANSFER },
17
+ async () => {
18
+ const integrityData = Object.fromEntries(
19
+ Object.entries(compilation.assets)
20
+ .filter(([assetName]) => assetName.endsWith('.css') || assetName.endsWith('.js'))
21
+ .map(([assetName, asset]) => {
22
+ const hash = createHash(this.algorithm).update(asset.source()).digest('base64');
23
+ const assetNormalized = assetName.split('?')[0];
24
+
25
+ return [
26
+ path.join(compiler.options.output.publicPath || '', assetNormalized),
27
+ `${this.algorithm}-${hash}`
28
+ ];
29
+ })
30
+ );
31
+ const jsonData = JSON.stringify(integrityData, null, 2);
32
+ const outputPath = path.join(this.publicPath, compiler.options.output.publicPath, this.fileName);
33
+
34
+ await fs.writeFile(outputPath, jsonData, 'utf8');
35
+ compilation.emitAsset(outputPath, new sources.RawSource(jsonData));
36
+ }
37
+ );
38
+ });
39
+ }
40
+ }
41
+
42
+ module.exports = IntegrityFilePlugin;