2020-02-27 11:25:55 +00:00
/* eslint-disable @typescript-eslint/no-var-requires */
2023-05-11 05:26:03 +00:00
const assert = require ( "assert" ) ;
2020-04-17 04:59:43 +00:00
const SentryWebpackPlugin = require ( "@sentry/webpack-plugin" ) ;
2022-06-21 13:57:34 +00:00
const { merge } = require ( "webpack-merge" ) ;
2020-04-17 04:59:43 +00:00
const common = require ( "./craco.common.config.js" ) ;
2020-05-05 12:16:51 +00:00
const WorkboxPlugin = require ( "workbox-webpack-plugin" ) ;
2022-02-04 20:22:31 +00:00
const CompressionPlugin = require ( "compression-webpack-plugin" ) ;
2022-09-30 06:27:29 +00:00
const { RetryChunkLoadPlugin } = require ( "webpack-retry-chunk-load-plugin" ) ;
2023-05-11 05:26:03 +00:00
const IconChunkNamingPlugin = require ( "./webpack/IconChunkNamingPlugin" ) ;
2023-04-18 08:40:11 +00:00
const path = require ( "path" ) ;
2023-05-11 05:26:03 +00:00
2020-04-17 04:59:43 +00:00
const env = process . env . REACT _APP _ENVIRONMENT ;
2023-04-18 08:40:11 +00:00
const isAirgap = process . env . REACT _APP _AIRGAP _ENABLED ;
2020-04-17 04:59:43 +00:00
const plugins = [ ] ;
2020-03-05 09:17:10 +00:00
2020-09-02 19:47:49 +00:00
plugins . push (
new WorkboxPlugin . InjectManifest ( {
swSrc : "./src/serviceWorker.js" ,
mode : "development" ,
swDest : "./pageService.js" ,
2022-11-23 09:48:23 +00:00
maximumFileSizeToCacheInBytes : 11 * 1024 * 1024 ,
2023-05-24 07:20:26 +00:00
exclude : [
// Don’ t cache source maps and PWA manifests.
// (These are the default values of the `exclude` option: https://developer.chrome.com/docs/workbox/reference/workbox-build/#type-WebpackPartial,
// so we need to specify them explicitly if we’ re extending this array.)
/\.map$/ ,
/^manifest.*\.js$/ ,
// Don’ t cache the root html file
/index\.html/ ,
// Don’ t cache LICENSE.txt files emitted by CRA
// when a chunk includes some license comments
/LICENSE\.txt/ ,
// Don’ t cache icons as there are hundreds of them, and caching them all
// one by one keeps the network busy for a long time (which is bad for battery life)
/\/icon.*\.(js|png|svg)$/ ,
] ,
// Don’ t cache-bust JS and CSS chunks
dontCacheBustURLsMatching : /\.[0-9a-zA-Z]{8}\.chunk\.(js|css)$/ ,
2020-09-02 19:47:49 +00:00
} ) ,
) ;
2020-04-17 04:59:43 +00:00
if ( env === "PRODUCTION" || env === "STAGING" ) {
2021-01-12 12:45:15 +00:00
if (
process . env . SENTRY _AUTH _TOKEN != null &&
process . env . SENTRY _AUTH _TOKEN !== ""
) {
plugins . push (
new SentryWebpackPlugin ( {
include : "build" ,
ignore : [ "node_modules" , "webpack.config.js" ] ,
release : process . env . REACT _APP _SENTRY _RELEASE ,
deploy : {
2021-04-06 10:17:25 +00:00
env : process . env . REACT _APP _SENTRY _ENVIRONMENT ,
} ,
} ) ,
2021-01-12 12:45:15 +00:00
) ;
} else {
console . log (
"Sentry configuration missing in process environment. Sentry will be disabled." ,
) ;
}
2020-03-05 09:17:10 +00:00
}
2022-02-04 20:22:31 +00:00
plugins . push ( new CompressionPlugin ( ) ) ;
plugins . push (
2022-06-21 13:57:34 +00:00
new CompressionPlugin ( {
algorithm : "brotliCompress" ,
filename : "[path][base].br" ,
2022-02-04 20:22:31 +00:00
test : /\.(js|css|html|svg)$/ ,
threshold : 10240 ,
minRatio : 0.8 ,
} ) ,
) ;
2020-03-05 09:17:10 +00:00
2022-09-30 06:27:29 +00:00
plugins . push (
new RetryChunkLoadPlugin ( {
// optional value to set the amount of time in milliseconds before trying to load the chunk again. Default is 0
retryDelay : 3000 ,
// optional value to set the maximum number of retries to load the chunk. Default is 1
maxRetries : 2 ,
// optional code to be executed in the browser context if after all retries chunk is not loaded.
// if not set - nothing will happen and error will be returned to the chunk loader.
lastResortScript : "window.location.href='/404.html';" ,
} ) ,
) ;
2023-05-11 05:26:03 +00:00
plugins . push (
// Give icon chunks names like `icon.dfd465bd.chunk.js` instead of `35140.dfd465bd.chunk.js`
new IconChunkNamingPlugin ( ) ,
) ;
2020-02-27 11:25:55 +00:00
module . exports = merge ( common , {
webpack : {
2023-05-11 05:26:03 +00:00
configure : {
plugins ,
2023-04-18 08:40:11 +00:00
} ,
2020-02-27 11:25:55 +00:00
} ,
2021-04-06 10:17:25 +00:00
jest : {
configure : {
moduleNameMapper : {
// Jest module mapper which will detect our absolute imports.
"^@test(.*)$" : "<rootDir>/test$1" ,
} ,
} ,
} ,
2023-05-11 05:26:03 +00:00
plugins : [
// Enable Airgap builds
{
plugin : {
overrideWebpackConfig : ( { context : { env , paths } , webpackConfig } ) => {
if ( env . REACT _APP _AIRGAP _ENABLED === "true" || isAirgap === "true" ) {
paths . appBuild = webpackConfig . output . path =
path . resolve ( "build_airgap" ) ;
}
return webpackConfig ;
} ,
} ,
} ,
// Emit dedicated HTML files for edit and view modes. This is done as an optimization (to preload
// route-specific chunks on the most critical routes) and doesn’ t affect the actual app behavior.
{
plugin : {
overrideWebpackConfig : ( { webpackConfig } ) => {
const htmlWebpackPlugin = webpackConfig . plugins . find (
( plugin ) => plugin . constructor . name === "HtmlWebpackPlugin" ,
) ;
// CRA must include HtmlWebpackPlugin: https://github.com/facebook/create-react-app/blob/d960b9e38c062584ff6cfb1a70e1512509a966e7/packages/react-scripts/config/webpack.config.js#L608-L632
// If it doesn’ t, perhaps the version of CRA has changed, or plugin names got mangled?
assert (
htmlWebpackPlugin ,
"Cannot find HtmlWebpackPlugin in webpack config" ,
) ;
// HtmlWebpackPlugin must have the userOptions field: https://github.com/jantimon/html-webpack-plugin/blob/d5ce5a8f2d12a2450a65ec51c285dd54e36cd921/index.js#L34.
// If it doesn’ t, perhaps the version of HtmlWebpackPlugin has changed?
assert (
htmlWebpackPlugin . userOptions ,
"htmlWebpackPlugin.userOptions must be defined" ,
) ;
// Instead of requiring HtmlWebpackPlugin directly, use the same version that CRA uses
const HtmlWebpackPlugin = htmlWebpackPlugin . constructor ;
const htmlWebpackPluginForEditMode = new HtmlWebpackPlugin ( {
... htmlWebpackPlugin . userOptions ,
filename : "edit.html" ,
// This option isn’ t used by HtmlWebpackPlugin itself – instead, it’ s passed to
// our custom template
appsmithHtmlTarget : "edit-mode" ,
} ) ;
const htmlWebpackPluginForViewMode = new HtmlWebpackPlugin ( {
... htmlWebpackPlugin . userOptions ,
filename : "view.html" ,
// This option isn’ t used by HtmlWebpackPlugin itself – instead, it’ s passed to
// our custom template
appsmithHtmlTarget : "view-mode" ,
} ) ;
webpackConfig . plugins . push (
htmlWebpackPluginForEditMode ,
htmlWebpackPluginForViewMode ,
) ;
return webpackConfig ;
} ,
} ,
} ,
] ,
2020-02-27 11:25:55 +00:00
} ) ;