I have a react/typescript app configured with webpack. When I am starting it up, I get an error from the js-sha256 package. I don't have that package directly, it's a dependency of the keycloak-js package. Not sure what to do as I am aware I am using an old keycloak-js version but when I set it to the latest, it is still showing the same error.

Error

ERROR in ./node_modules/js-sha256/src/sha256.js 20:53-60
Module not found: Error: Can't resolve 'process/browser' in '/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/js-sha256/src'
resolve 'process/browser' in '/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/js-sha256/src'
  Parsed request is a module
  using description file: /Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/js-sha256/package.json (relative path: ./src)
    Field 'browser' doesn't contain a valid alias configuration
    resolve as module
      /Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/js-sha256/src/node_modules doesn't exist or is not a directory
      /Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/js-sha256/node_modules doesn't exist or is not a directory
      /Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/node_modules doesn't exist or is not a directory
      looking for modules in /Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules
        /Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/process doesn't exist
      /Users/dandold/Workspace/businesses/buddydata/node_modules doesn't exist or is not a directory
      /Users/dandold/Workspace/businesses/node_modules doesn't exist or is not a directory
      /Users/dandold/Workspace/node_modules doesn't exist or is not a directory
      /Users/dandold/node_modules doesn't exist or is not a directory
      /Users/node_modules doesn't exist or is not a directory
      /node_modules doesn't exist or is not a directory
 @ ./node_modules/keycloak-js/dist/keycloak.js 21:38-58
 @ ./src/services/UserService.ts 7:0-35 14:15-23
 @ ./src/index.tsx 6:0-53 11:0-24

ERROR in ./node_modules/js-sha256/src/sha256.js
Cannot read properties of undefined (reading 'module')
TypeError: Cannot read properties of undefined (reading 'module')
    at ProvidedDependencyTemplate.apply (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/dependencies/ProvidedDependency.js:122:61)
    at JavascriptGenerator.sourceDependency (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/javascript/JavascriptGenerator.js:206:12)
    at JavascriptGenerator.sourceModule (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/javascript/JavascriptGenerator.js:112:9)
    at JavascriptGenerator.generate (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/javascript/JavascriptGenerator.js:98:8)
    at NormalModule.codeGeneration (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/NormalModule.js:1204:22)
    at /Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/Compilation.js:3329:22
    at /Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/Cache.js:91:34
    at Array.<anonymous> (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/cache/MemoryCachePlugin.js:45:13)
    at /Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/Cache.js:91:19
    at Hook.eval [as callAsync] (eval at create (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:19:1)
    at Cache.get (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/Cache.js:75:18)
    at ItemCacheFacade.get (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/CacheFacade.js:111:15)
    at Compilation._codeGenerationModule (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/Compilation.js:3322:9)
    at /Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/Compilation.js:3229:11
    at arrayIterator (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/neo-async/async.js:3467:9)
    at timesSync (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/neo-async/async.js:2297:7)
    at Object.eachLimit (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/neo-async/async.js:3463:5)
    at runIteration (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/Compilation.js:3209:13)
    at Compilation._runCodeGenerationJobs (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/Compilation.js:3284:3)
    at Compilation.codeGeneration (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/Compilation.js:3191:8)
    at /Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/Compilation.js:3018:11
    at Hook.eval [as callAsync] (eval at create (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:6:1)
    at Hook.CALL_ASYNC_DELEGATE [as _callAsync] (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/tapable/lib/Hook.js:18:14)
    at /Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/Compilation.js:2968:36
    at Hook.eval [as callAsync] (eval at create (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:6:1)
    at Hook.CALL_ASYNC_DELEGATE [as _callAsync] (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/tapable/lib/Hook.js:18:14)
    at Compilation.seal (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/Compilation.js:2959:27)
    at /Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/Compiler.js:1187:20
    at /Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/Compilation.js:2757:4
    at eval (eval at create (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:29:1)
    at /Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/FlagDependencyExportsPlugin.js:385:11
    at /Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/neo-async/async.js:2830:7
    at Object.each (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/neo-async/async.js:2850:39)
    at /Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/FlagDependencyExportsPlugin.js:361:18
    at /Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/neo-async/async.js:2830:7
    at Object.each (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/neo-async/async.js:2850:39)
    at /Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/FlagDependencyExportsPlugin.js:51:16
    at Hook.eval [as callAsync] (eval at create (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:25:1)
    at Hook.CALL_ASYNC_DELEGATE [as _callAsync] (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/tapable/lib/Hook.js:18:14)
    at Compilation.finish (/Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/Compilation.js:2714:28)
    at /Users/dandold/Workspace/businesses/buddydata/app.buddydata.io/node_modules/webpack/lib/Compiler.js:1182:19
    at processTicksAndRejections (node:internal/process/task_queues:78:11)
 @ ./node_modules/keycloak-js/dist/keycloak.js 21:38-58
 @ ./src/services/UserService.ts 7:0-35 14:15-23
 @ ./src/index.tsx 6:0-53 11:0-24

webpack 5.75.0 compiled with 2 errors in 4626 ms
ℹ 「wdm」: Failed to compile.

Package.json

{
  "main": "src/index.js",
  "scripts": {
    "start": "TS_NODE_PROJECT=tsconfig-for-webpack-config.json webpack serve"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@babel/core": "^7.17.9",
    "@emotion/react": "^11.10.5",
    "@emotion/styled": "^11.10.5",
    "@headlessui/react": "^1.4.1",
    "@material-ui/core": "^4.12.4",
    "@material-ui/icons": "^4.11.3",
    "axios": "^1.2.1",
    "keycloak-js": "11.0.3",
    "moment": "^2.29.1",
    "react": "^17.0.2",
    "react-datepicker": "^4.2.1",
    "react-dom": "^17.0.2",
    "react-redux": "^7.2.4",
    "react-router": "^5.2.0",
    "react-router-dom": "^5.3.0",
    "redux": "^4.2.0",
    "redux-axios-middleware": "^4.0.1",
    "redux-logger": "^3.0.6",
    "redux-thunk": "^2.4.1",
    "svg-sprite-loader": "^6.0.11"
  },
  "devDependencies": {
    "@babel/plugin-proposal-class-properties": "^7.16.7",
    "@babel/plugin-proposal-decorators": "^7.16.7",
    "@babel/plugin-proposal-export-default-from": "^7.18.9",
    "@babel/plugin-transform-runtime": "^7.17.0",
    "@babel/preset-env": "^7.16.11",
    "@babel/preset-react": "^7.16.7",
    "@babel/preset-typescript": "^7.16.7",
    "@pmmmwh/react-refresh-webpack-plugin": "^0.5.5",
    "@types/react": "^17.0.38",
    "@types/react-dom": "^17.0.9",
    "@types/redux-logger": "^3.0.9",
    "@types/webpack": "^5.28.0",
    "@types/webpack-dev-server": "^4.7.2",
    "babel-loader": "^8.2.1",
    "babel-plugin-module-resolver": "^4.1.0",
    "clean-webpack-plugin": "^4.0.0",
    "copy-webpack-plugin": "^11.0.0",
    "css-loader": "^3.0.0",
    "file-loader": "^6.2.0",
    "html-loader": "^1.3.0",
    "html-webpack-plugin": "^5.5.0",
    "image-webpack-loader": "^8.1.0",
    "mini-css-extract-plugin": "^2.6.1",
    "prop-types": "^15.7.2",
    "react-refresh": "^0.14.0",
    "redux-devtools-extension": "^2.13.9",
    "style-loader": "^1.0.0",
    "ts-node": "^10.3.0",
    "typescript": "^4.6.2",
    "webpack": "^5.74.0",
    "webpack-bundle-analyzer": "^4.5.0",
    "webpack-cli": "^4.10.0",
    "webpack-dev-server": "^3.11.2"
  }
}

webpack.config.ts

import path from 'path'
import webpack, { Configuration as WebpackConfiguration } from 'webpack'
import { Configuration as WebpackDevServerConfiguration } from 'webpack-dev-server'
import MiniCssExtractPlugin from 'mini-css-extract-plugin'
import CopyPlugin from 'copy-webpack-plugin'

interface Configuration extends WebpackConfiguration {
  devServer?: WebpackDevServerConfiguration
}

const { PUBLIC_PATH = `https://localhost:8080/`, NODE_ENV = 'development' } = process.env as {
  PUBLIC_PATH?: string
  NODE_ENV?: Configuration['mode']
}

const buildConfig = async (): Promise<Configuration> => {
  const config: Configuration = {
    mode: NODE_ENV,
    devtool: 'hidden-source-map',
    entry: '@/index.tsx',
    resolve: {
      alias: {
        '@': path.resolve(__dirname, 'src'),
      },
      extensions: ['.ts', '.tsx', '.js'],
    },
    output: {
      publicPath: PUBLIC_PATH,
      path: path.resolve(__dirname, '.tmp'),
      filename: '[name].js',
      chunkFilename: '[name].js'
    },
    module: {
      rules: [
        {
          test: /\.(j|t)sx?$/,
          exclude: /node_modules/,
          loader: 'babel-loader',
        },
        {
          test: /\.css$/,
          exclude: /\.module\.(sa|sc|c)ss$/,
          use: [MiniCssExtractPlugin.loader, 'css-loader'],
        },
        {
          test: /\.s(a|c)ss$/,
          exclude: /\.module\.(sa|sc|c)ss$/,
          use: [
            MiniCssExtractPlugin.loader,
            {
              loader: 'css-loader',
              options: {
                // For styles/helpers/_fonts.sass
                url: (url): boolean => !url.startsWith('/fonts/'),
                importLoaders: 2,
                modules: {
                  mode: 'local',
                  localIdentName: '[local]',
                },
              },
            },
            {
              loader: 'sass-loader',
              options: {
                sassOptions: {
                  quietDeps: true,
                },
              },
            },
          ],
        },
        {
          test: /\.module\.(sa|sc|c)ss$/,
          use: [
            MiniCssExtractPlugin.loader,
            {
              loader: 'css-loader',
              options: {
                modules: true,
                url: (url): boolean => !url.startsWith('/fonts/'),
                importLoaders: 2,
                sourceMap: false, // turned off as causes delay
              },
            },
            {
              loader: 'sass-loader',
              options: {
                sassOptions: {
                  quietDeps: true,
                },
              },
            },
          ],
        },
        {
          test: /\.(gif|png|jpe?g)$/,
          use: ['file-loader', 'image-webpack-loader'],
        },
        {
          test: /\.svg$/,
          oneOf: [
            {
              include: /(\/node_modules\/@cloudbees\/)|(\/assets\/images\/icons\/svg\/)/,
              exclude: /\/semantic-ui-css\//,
              use: 'svg-sprite-loader',
            },
            {
              use: ['file-loader', 'image-webpack-loader'],
            },
          ],
        },
        {
          test: /\.(eot|ttf|woff|woff2)$/,
          loader: 'file-loader',
          exclude: /\/semantic-ui-css\//,
          options: {
            name: 'fonts/[name].[ext]',
          },
        },
        {
          test: /\.(eot|ttf|woff|woff2|)$/,
          include: /\/semantic-ui-css\//,
          loader: 'file-loader',
          options: {
            name: 'fonts/semantic/[name].[ext]',
          },
        },
      ],
    },
    plugins: [
      new MiniCssExtractPlugin(),
      new webpack.IgnorePlugin({
        resourceRegExp: /^\.\/locale$/,
        contextRegExp: /moment$/,
      }),
      new CopyPlugin({
        patterns: [
          { from: "public/keycloak/keycloak.json" },
          { from: "public/keycloak/silent-check-sso.html" },
          { from: 'assets' }
        ],
      }),
      // When running locally, if you want to allow env vars declared on the command line
      // to be visible in code via process.env, add them here.
      new webpack.EnvironmentPlugin({}),
    ],
  }

  if (NODE_ENV === 'development') {
    config.devtool = 'eval-cheap-module-source-map'
    config.devServer = {
      headers: { 'Access-Control-Allow-Origin': '*' },
      public: 'http://localhost:8080',
      disableHostCheck: true,
      hot: true,
      hotOnly: true,
    }
    const ReactRefreshPlugin = (await import('@pmmmwh/react-refresh-webpack-plugin'))
      .default
    config.plugins.push(new ReactRefreshPlugin())
    config.plugins.push(
      // fix "process is not defined" error
      new webpack.ProvidePlugin({
        process: 'process/browser',
      })
    )
    //Make possible to link ("yarn link") a dependency that has react as peerDependency (eg react-honeyui)
    //See https://stackoverflow.com/a/31170775
    config.resolve.alias['react'] = path.resolve(__dirname, 'node_modules/react')
  } else {
    config.performance = {
      hints: 'error',
      maxEntrypointSize: 6000000,
      maxAssetSize: 4800000,
    }
  }

  return config
}

export default buildConfig

tsconfig-for-webpack-config.json

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es5",
    "esModuleInterop": true
  }
}

.babelrc.js

module.exports = (api) => {
  // This caches the Babel config by environment.
  api.cache.using(() => process.env.NODE_ENV)

  const plugins = [
    [
      'module-resolver',
      {
        alias: {
          '@': './src',
        },
      },
    ],
    [
      '@babel/plugin-proposal-decorators',
      {
        legacy: true,
      },
    ],
    '@babel/plugin-proposal-class-properties',
    '@babel/plugin-proposal-export-default-from',
  ]

  if (api.env('development')) {
    plugins.push('react-refresh/babel')
  }

  if (api.env('test')) {
    plugins.push('@babel/plugin-transform-runtime')
  }

  return {
    plugins,
    presets: ['@babel/env', '@babel/typescript', '@babel/react'],
  }
}

This is my setup and from what I can see it's all in order, but obviously it's not! Can anyone point me in the right direction so I can get this compiled and running

1

There are 1 best solutions below

0
On

yarn add process solved the issue for me