@oroinc/oro-webpack-config-builder 5.1.0-lts011 → 5.1.0-lts012

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');
@@ -280,7 +282,8 @@ class ConfigBuilder {
280
282
  output: {
281
283
  filename: '[name].js',
282
284
  // Because we use third party libraries 'chunkFilename' should include only [name]
283
- chunkFilename: this._getVersionedPath('chunk/[name].js', this.assetVersion)
285
+ chunkFilename: this._getVersionedPath('chunk/[name].js', this.assetVersion),
286
+ crossOriginLoading: "anonymous"
284
287
  },
285
288
  devtool: !env.skipSourcemap && 'inline-cheap-module-source-map',
286
289
  mode: 'development',
@@ -383,6 +386,10 @@ class ConfigBuilder {
383
386
  new webpack.optimize.MinChunkSizePlugin({
384
387
  minChunkSize: 30000 // Minimum number of characters
385
388
  }),
389
+ new SubresourceIntegrityPlugin(),
390
+ new IntegrityFilePlugin({
391
+ publicPath: this.resolvedPublicPath
392
+ }),
386
393
  new AfterWebpackLogsPlugin(
387
394
  stats => this.emitter.emit('build:complete', stats)
388
395
  ),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oroinc/oro-webpack-config-builder",
3
- "version": "5.1.0-lts011",
3
+ "version": "5.1.0-lts012",
4
4
  "author": "Oro, Inc (https://www.oroinc.com)",
5
5
  "license": "MIT",
6
6
  "description": "An integration of OroPlatform based applications with the Webpack.",
@@ -46,6 +46,7 @@
46
46
  "webpack-cli": "~5.0.0",
47
47
  "webpack-dev-server": "^4.11.1",
48
48
  "webpack-merge": "~5.8.0",
49
+ "webpack-subresource-integrity": "^5.2.0-rc.1",
49
50
  "wildcard": "~2.0.0"
50
51
  }
51
52
  }
@@ -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;