Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
B
bkunyun
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
bkunyun
Commits
e20a8772
Commit
e20a8772
authored
Aug 09, 2022
by
chenshouchao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: 自定义批算子中流算子拼接id的count计算方式优化
parent
bf2eb6ce
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
713 additions
and
783 deletions
+713
-783
webpack.config.js
config/webpack.config.js
+676
-676
index.tsx
src/views/CustomOperator/components/OperatorList/index.tsx
+36
-107
index.tsx
src/views/CustomOperator/index.tsx
+1
-0
No files found.
config/webpack.config.js
View file @
e20a8772
...
@@ -21,9 +21,9 @@ const modules = require("./modules");
...
@@ -21,9 +21,9 @@ const modules = require("./modules");
const
getClientEnvironment
=
require
(
"./env"
);
const
getClientEnvironment
=
require
(
"./env"
);
const
ModuleNotFoundPlugin
=
require
(
"react-dev-utils/ModuleNotFoundPlugin"
);
const
ModuleNotFoundPlugin
=
require
(
"react-dev-utils/ModuleNotFoundPlugin"
);
const
ForkTsCheckerWebpackPlugin
=
const
ForkTsCheckerWebpackPlugin
=
process
.
env
.
TSC_COMPILE_ON_ERROR
===
"true"
process
.
env
.
TSC_COMPILE_ON_ERROR
===
"true"
?
require
(
"react-dev-utils/ForkTsCheckerWarningWebpackPlugin"
)
?
require
(
"react-dev-utils/ForkTsCheckerWarningWebpackPlugin"
)
:
require
(
"react-dev-utils/ForkTsCheckerWebpackPlugin"
);
:
require
(
"react-dev-utils/ForkTsCheckerWebpackPlugin"
);
const
ReactRefreshWebpackPlugin
=
require
(
"@pmmmwh/react-refresh-webpack-plugin"
);
const
ReactRefreshWebpackPlugin
=
require
(
"@pmmmwh/react-refresh-webpack-plugin"
);
const
createEnvironmentHash
=
require
(
"./webpack/persistentCache/createEnvironmentHash"
);
const
createEnvironmentHash
=
require
(
"./webpack/persistentCache/createEnvironmentHash"
);
...
@@ -33,15 +33,15 @@ const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== "false";
...
@@ -33,15 +33,15 @@ const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== "false";
const
reactRefreshRuntimeEntry
=
require
.
resolve
(
"react-refresh/runtime"
);
const
reactRefreshRuntimeEntry
=
require
.
resolve
(
"react-refresh/runtime"
);
const
reactRefreshWebpackPluginRuntimeEntry
=
require
.
resolve
(
const
reactRefreshWebpackPluginRuntimeEntry
=
require
.
resolve
(
"@pmmmwh/react-refresh-webpack-plugin"
"@pmmmwh/react-refresh-webpack-plugin"
);
);
const
babelRuntimeEntry
=
require
.
resolve
(
"babel-preset-react-app"
);
const
babelRuntimeEntry
=
require
.
resolve
(
"babel-preset-react-app"
);
const
babelRuntimeEntryHelpers
=
require
.
resolve
(
const
babelRuntimeEntryHelpers
=
require
.
resolve
(
"@babel/runtime/helpers/esm/assertThisInitialized"
,
"@babel/runtime/helpers/esm/assertThisInitialized"
,
{
paths
:
[
babelRuntimeEntry
]
}
{
paths
:
[
babelRuntimeEntry
]
}
);
);
const
babelRuntimeRegenerator
=
require
.
resolve
(
"@babel/runtime/regenerator"
,
{
const
babelRuntimeRegenerator
=
require
.
resolve
(
"@babel/runtime/regenerator"
,
{
paths
:
[
babelRuntimeEntry
],
paths
:
[
babelRuntimeEntry
],
});
});
// Some apps do not need the benefits of saving a web request, so not inlining the chunk
// Some apps do not need the benefits of saving a web request, so not inlining the chunk
...
@@ -52,7 +52,7 @@ const emitErrorsAsWarnings = process.env.ESLINT_NO_DEV_ERRORS === "true";
...
@@ -52,7 +52,7 @@ const emitErrorsAsWarnings = process.env.ESLINT_NO_DEV_ERRORS === "true";
const
disableESLintPlugin
=
process
.
env
.
DISABLE_ESLINT_PLUGIN
===
"true"
;
const
disableESLintPlugin
=
process
.
env
.
DISABLE_ESLINT_PLUGIN
===
"true"
;
const
imageInlineSizeLimit
=
parseInt
(
const
imageInlineSizeLimit
=
parseInt
(
process
.
env
.
IMAGE_INLINE_SIZE_LIMIT
||
"10000"
process
.
env
.
IMAGE_INLINE_SIZE_LIMIT
||
"10000"
);
);
// Check if TypeScript is setup
// Check if TypeScript is setup
...
@@ -60,7 +60,7 @@ const useTypeScript = fs.existsSync(paths.appTsConfig);
...
@@ -60,7 +60,7 @@ const useTypeScript = fs.existsSync(paths.appTsConfig);
// Check if Tailwind config exists
// Check if Tailwind config exists
const
useTailwind
=
fs
.
existsSync
(
const
useTailwind
=
fs
.
existsSync
(
path
.
join
(
paths
.
appPath
,
"tailwind.config.js"
)
path
.
join
(
paths
.
appPath
,
"tailwind.config.js"
)
);
);
// Get the path to the uncompiled service worker (if it exists).
// Get the path to the uncompiled service worker (if it exists).
...
@@ -73,685 +73,685 @@ const sassRegex = /\.(scss|sass)$/;
...
@@ -73,685 +73,685 @@ const sassRegex = /\.(scss|sass)$/;
const
sassModuleRegex
=
/
\.
module
\.(
scss|sass
)
$/
;
const
sassModuleRegex
=
/
\.
module
\.(
scss|sass
)
$/
;
const
hasJsxRuntime
=
(()
=>
{
const
hasJsxRuntime
=
(()
=>
{
if
(
process
.
env
.
DISABLE_NEW_JSX_TRANSFORM
===
"true"
)
{
if
(
process
.
env
.
DISABLE_NEW_JSX_TRANSFORM
===
"true"
)
{
return
false
;
return
false
;
}
}
try
{
try
{
require
.
resolve
(
"react/jsx-runtime"
);
require
.
resolve
(
"react/jsx-runtime"
);
return
true
;
return
true
;
}
catch
(
e
)
{
}
catch
(
e
)
{
return
false
;
return
false
;
}
}
})();
})();
// This is the production and development configuration.
// This is the production and development configuration.
// It is focused on developer experience, fast rebuilds, and a minimal bundle.
// It is focused on developer experience, fast rebuilds, and a minimal bundle.
module
.
exports
=
function
(
webpackEnv
)
{
module
.
exports
=
function
(
webpackEnv
)
{
const
isEnvDevelopment
=
webpackEnv
===
"development"
;
const
isEnvDevelopment
=
webpackEnv
===
"development"
;
const
isEnvProduction
=
webpackEnv
===
"production"
;
const
isEnvProduction
=
webpackEnv
===
"production"
;
// Variable used for enabling profiling in Production
// Variable used for enabling profiling in Production
// passed into alias object. Uses a flag if passed into the build command
// passed into alias object. Uses a flag if passed into the build command
const
isEnvProductionProfile
=
const
isEnvProductionProfile
=
isEnvProduction
&&
process
.
argv
.
includes
(
"--profile"
);
isEnvProduction
&&
process
.
argv
.
includes
(
"--profile"
);
// We will provide `paths.publicUrlOrPath` to our app
// We will provide `paths.publicUrlOrPath` to our app
// as %PUBLIC_URL% in `index.html` and `process.env.PUBLIC_URL` in JavaScript.
// as %PUBLIC_URL% in `index.html` and `process.env.PUBLIC_URL` in JavaScript.
// Omit trailing slash as %PUBLIC_URL%/xyz looks better than %PUBLIC_URL%xyz.
// Omit trailing slash as %PUBLIC_URL%/xyz looks better than %PUBLIC_URL%xyz.
// Get environment variables to inject into our app.
// Get environment variables to inject into our app.
const
env
=
getClientEnvironment
(
paths
.
publicUrlOrPath
.
slice
(
0
,
-
1
));
const
env
=
getClientEnvironment
(
paths
.
publicUrlOrPath
.
slice
(
0
,
-
1
));
const
shouldUseReactRefresh
=
env
.
raw
.
FAST_REFRESH
;
const
shouldUseReactRefresh
=
env
.
raw
.
FAST_REFRESH
;
// common function to get style loaders
// common function to get style loaders
const
getStyleLoaders
=
(
cssOptions
,
preProcessor
)
=>
{
const
getStyleLoaders
=
(
cssOptions
,
preProcessor
)
=>
{
const
loaders
=
[
const
loaders
=
[
isEnvDevelopment
&&
require
.
resolve
(
"style-loader"
),
isEnvDevelopment
&&
require
.
resolve
(
"style-loader"
),
isEnvProduction
&&
{
isEnvProduction
&&
{
loader
:
MiniCssExtractPlugin
.
loader
,
loader
:
MiniCssExtractPlugin
.
loader
,
// css is located in `static/css`, use '../../' to locate index.html folder
// css is located in `static/css`, use '../../' to locate index.html folder
// in production `paths.publicUrlOrPath` can be a relative path
// in production `paths.publicUrlOrPath` can be a relative path
options
:
paths
.
publicUrlOrPath
.
startsWith
(
"."
)
options
:
paths
.
publicUrlOrPath
.
startsWith
(
"."
)
?
{
publicPath
:
"../../"
}
?
{
publicPath
:
"../../"
}
:
{},
:
{},
},
},
{
{
loader
:
require
.
resolve
(
"css-loader"
),
loader
:
require
.
resolve
(
"css-loader"
),
options
:
cssOptions
,
options
:
cssOptions
,
},
},
{
{
// Options for PostCSS as we reference these options twice
// Options for PostCSS as we reference these options twice
// Adds vendor prefixing based on your specified browser support in
// Adds vendor prefixing based on your specified browser support in
// package.json
// package.json
loader
:
require
.
resolve
(
"postcss-loader"
),
loader
:
require
.
resolve
(
"postcss-loader"
),
options
:
{
options
:
{
postcssOptions
:
{
postcssOptions
:
{
// Necessary for external CSS imports to work
// Necessary for external CSS imports to work
// https://github.com/facebook/create-react-app/issues/2677
// https://github.com/facebook/create-react-app/issues/2677
ident
:
"postcss"
,
ident
:
"postcss"
,
config
:
false
,
config
:
false
,
plugins
:
!
useTailwind
plugins
:
!
useTailwind
?
[
?
[
"postcss-flexbugs-fixes"
,
"postcss-flexbugs-fixes"
,
[
[
"postcss-preset-env"
,
"postcss-preset-env"
,
{
{
autoprefixer
:
{
autoprefixer
:
{
flexbox
:
"no-2009"
,
flexbox
:
"no-2009"
,
},
},
stage
:
3
,
stage
:
3
,
},
},
],
],
// Adds PostCSS Normalize as the reset css with default options,
// Adds PostCSS Normalize as the reset css with default options,
// so that it honors browserslist config in package.json
// so that it honors browserslist config in package.json
// which in turn let's users customize the target behavior as per their needs.
// which in turn let's users customize the target behavior as per their needs.
"postcss-normalize"
,
"postcss-normalize"
,
]
]
:
[
:
[
"tailwindcss"
,
"tailwindcss"
,
"postcss-flexbugs-fixes"
,
"postcss-flexbugs-fixes"
,
[
[
"postcss-preset-env"
,
"postcss-preset-env"
,
{
{
autoprefixer
:
{
autoprefixer
:
{
flexbox
:
"no-2009"
,
flexbox
:
"no-2009"
,
},
},
stage
:
3
,
stage
:
3
,
},
},
],
],
],
],
},
},
sourceMap
:
isEnvProduction
?
shouldUseSourceMap
:
isEnvDevelopment
,
sourceMap
:
isEnvProduction
?
shouldUseSourceMap
:
isEnvDevelopment
,
},
},
},
},
].
filter
(
Boolean
);
].
filter
(
Boolean
);
if
(
preProcessor
)
{
if
(
preProcessor
)
{
loaders
.
push
(
loaders
.
push
(
{
{
loader
:
require
.
resolve
(
"resolve-url-loader"
),
loader
:
require
.
resolve
(
"resolve-url-loader"
),
options
:
{
options
:
{
sourceMap
:
isEnvProduction
?
shouldUseSourceMap
:
isEnvDevelopment
,
sourceMap
:
isEnvProduction
?
shouldUseSourceMap
:
isEnvDevelopment
,
root
:
paths
.
appSrc
,
root
:
paths
.
appSrc
,
},
},
},
},
{
{
loader
:
require
.
resolve
(
preProcessor
),
loader
:
require
.
resolve
(
preProcessor
),
options
:
{
options
:
{
sourceMap
:
true
,
sourceMap
:
true
,
},
},
}
}
);
);
}
}
return
loaders
;
return
loaders
;
};
};
return
{
return
{
target
:
[
"browserslist"
],
target
:
[
"browserslist"
],
// Webpack noise constrained to errors and warnings
// Webpack noise constrained to errors and warnings
stats
:
"errors-warnings"
,
stats
:
"errors-warnings"
,
mode
:
isEnvProduction
?
"production"
:
isEnvDevelopment
&&
"development"
,
mode
:
isEnvProduction
?
"production"
:
isEnvDevelopment
&&
"development"
,
// Stop compilation early in production
// Stop compilation early in production
bail
:
isEnvProduction
,
bail
:
isEnvProduction
,
devtool
:
isEnvProduction
devtool
:
isEnvProduction
?
shouldUseSourceMap
?
shouldUseSourceMap
?
"source-map"
?
"source-map"
:
false
:
false
:
isEnvDevelopment
&&
"cheap-module-source-map"
,
:
isEnvDevelopment
&&
"cheap-module-source-map"
,
// These are the "entry points" to our application.
// These are the "entry points" to our application.
// This means they will be the "root" imports that are included in JS bundle.
// This means they will be the "root" imports that are included in JS bundle.
entry
:
paths
.
appIndexJs
,
entry
:
paths
.
appIndexJs
,
output
:
{
output
:
{
// The build folder.
// The build folder.
path
:
paths
.
appBuild
,
path
:
paths
.
appBuild
,
// Add /* filename */ comments to generated require()s in the output.
// Add /* filename */ comments to generated require()s in the output.
pathinfo
:
isEnvDevelopment
,
pathinfo
:
isEnvDevelopment
,
// There will be one main bundle, and one file per asynchronous chunk.
// There will be one main bundle, and one file per asynchronous chunk.
// In development, it does not produce real files.
// In development, it does not produce real files.
filename
:
isEnvProduction
filename
:
isEnvProduction
?
"static/js/[name].[contenthash:8].js"
?
"static/js/[name].[contenthash:8].js"
:
isEnvDevelopment
&&
"static/js/bundle.js"
,
:
isEnvDevelopment
&&
"static/js/bundle.js"
,
// There are also additional JS chunk files if you use code splitting.
// There are also additional JS chunk files if you use code splitting.
chunkFilename
:
isEnvProduction
chunkFilename
:
isEnvProduction
?
"static/js/[name].[contenthash:8].chunk.js"
?
"static/js/[name].[contenthash:8].chunk.js"
:
isEnvDevelopment
&&
"static/js/[name].chunk.js"
,
:
isEnvDevelopment
&&
"static/js/[name].chunk.js"
,
assetModuleFilename
:
"static/media/[name].[hash][ext]"
,
assetModuleFilename
:
"static/media/[name].[hash][ext]"
,
// webpack uses `publicPath` to determine where the app is being served from.
// webpack uses `publicPath` to determine where the app is being served from.
// It requires a trailing slash, or the file assets will get an incorrect path.
// It requires a trailing slash, or the file assets will get an incorrect path.
// We inferred the "public path" (such as / or /my-project) from homepage.
// We inferred the "public path" (such as / or /my-project) from homepage.
publicPath
:
paths
.
publicUrlOrPath
,
publicPath
:
paths
.
publicUrlOrPath
,
// Point sourcemap entries to original disk location (format as URL on Windows)
// Point sourcemap entries to original disk location (format as URL on Windows)
devtoolModuleFilenameTemplate
:
isEnvProduction
devtoolModuleFilenameTemplate
:
isEnvProduction
?
(
info
)
=>
?
(
info
)
=>
path
path
.
relative
(
paths
.
appSrc
,
info
.
absoluteResourcePath
)
.
relative
(
paths
.
appSrc
,
info
.
absoluteResourcePath
)
.
replace
(
/
\\
/g
,
"/"
)
.
replace
(
/
\\
/g
,
"/"
)
:
isEnvDevelopment
&&
:
isEnvDevelopment
&&
((
info
)
=>
((
info
)
=>
path
.
resolve
(
info
.
absoluteResourcePath
).
replace
(
/
\\
/g
,
"/"
)),
path
.
resolve
(
info
.
absoluteResourcePath
).
replace
(
/
\\
/g
,
"/"
)),
},
},
cache
:
{
cache
:
{
type
:
"filesystem"
,
type
:
"filesystem"
,
version
:
createEnvironmentHash
(
env
.
raw
),
version
:
createEnvironmentHash
(
env
.
raw
),
cacheDirectory
:
paths
.
appWebpackCache
,
cacheDirectory
:
paths
.
appWebpackCache
,
store
:
"pack"
,
store
:
"pack"
,
buildDependencies
:
{
buildDependencies
:
{
defaultWebpack
:
[
"webpack/lib/"
],
defaultWebpack
:
[
"webpack/lib/"
],
config
:
[
__filename
],
config
:
[
__filename
],
tsconfig
:
[
paths
.
appTsConfig
,
paths
.
appJsConfig
].
filter
((
f
)
=>
tsconfig
:
[
paths
.
appTsConfig
,
paths
.
appJsConfig
].
filter
((
f
)
=>
fs
.
existsSync
(
f
)
fs
.
existsSync
(
f
)
),
),
},
},
},
},
infrastructureLogging
:
{
infrastructureLogging
:
{
level
:
"none"
,
level
:
"none"
,
},
},
optimization
:
{
optimization
:
{
minimize
:
isEnvProduction
,
minimize
:
isEnvProduction
,
minimizer
:
[
minimizer
:
[
// This is only used in production mode
// This is only used in production mode
new
TerserPlugin
({
new
TerserPlugin
({
terserOptions
:
{
terserOptions
:
{
parse
:
{
parse
:
{
// We want terser to parse ecma 8 code. However, we don't want it
// We want terser to parse ecma 8 code. However, we don't want it
// to apply any minification steps that turns valid ecma 5 code
// to apply any minification steps that turns valid ecma 5 code
// into invalid ecma 5 code. This is why the 'compress' and 'output'
// into invalid ecma 5 code. This is why the 'compress' and 'output'
// sections only apply transformations that are ecma 5 safe
// sections only apply transformations that are ecma 5 safe
// https://github.com/facebook/create-react-app/pull/4234
// https://github.com/facebook/create-react-app/pull/4234
ecma
:
8
,
ecma
:
8
,
},
},
compress
:
{
compress
:
{
ecma
:
5
,
ecma
:
5
,
warnings
:
false
,
warnings
:
false
,
// Disabled because of an issue with Uglify breaking seemingly valid code:
// Disabled because of an issue with Uglify breaking seemingly valid code:
// https://github.com/facebook/create-react-app/issues/2376
// https://github.com/facebook/create-react-app/issues/2376
// Pending further investigation:
// Pending further investigation:
// https://github.com/mishoo/UglifyJS2/issues/2011
// https://github.com/mishoo/UglifyJS2/issues/2011
comparisons
:
false
,
comparisons
:
false
,
// Disabled because of an issue with Terser breaking valid code:
// Disabled because of an issue with Terser breaking valid code:
// https://github.com/facebook/create-react-app/issues/5250
// https://github.com/facebook/create-react-app/issues/5250
// Pending further investigation:
// Pending further investigation:
// https://github.com/terser-js/terser/issues/120
// https://github.com/terser-js/terser/issues/120
inline
:
2
,
inline
:
2
,
},
},
mangle
:
{
mangle
:
{
safari10
:
true
,
safari10
:
true
,
},
},
// Added for profiling in devtools
// Added for profiling in devtools
keep_classnames
:
isEnvProductionProfile
,
keep_classnames
:
isEnvProductionProfile
,
keep_fnames
:
isEnvProductionProfile
,
keep_fnames
:
isEnvProductionProfile
,
output
:
{
output
:
{
ecma
:
5
,
ecma
:
5
,
comments
:
false
,
comments
:
false
,
// Turned on because emoji and regex is not minified properly using default
// Turned on because emoji and regex is not minified properly using default
// https://github.com/facebook/create-react-app/issues/2488
// https://github.com/facebook/create-react-app/issues/2488
ascii_only
:
true
,
ascii_only
:
true
,
},
},
},
},
}),
}),
// This is only used in production mode
// This is only used in production mode
new
CssMinimizerPlugin
(),
new
CssMinimizerPlugin
(),
],
],
},
},
resolve
:
{
resolve
:
{
// This allows you to set a fallback for where webpack should look for modules.
// This allows you to set a fallback for where webpack should look for modules.
// We placed these paths second because we want `node_modules` to "win"
// We placed these paths second because we want `node_modules` to "win"
// if there are any conflicts. This matches Node resolution mechanism.
// if there are any conflicts. This matches Node resolution mechanism.
// https://github.com/facebook/create-react-app/issues/253
// https://github.com/facebook/create-react-app/issues/253
modules
:
[
"node_modules"
,
paths
.
appNodeModules
].
concat
(
modules
:
[
"node_modules"
,
paths
.
appNodeModules
].
concat
(
modules
.
additionalModulePaths
||
[]
modules
.
additionalModulePaths
||
[]
),
),
// These are the reasonable defaults supported by the Node ecosystem.
// These are the reasonable defaults supported by the Node ecosystem.
// We also include JSX as a common component filename extension to support
// We also include JSX as a common component filename extension to support
// some tools, although we do not recommend using it, see:
// some tools, although we do not recommend using it, see:
// https://github.com/facebook/create-react-app/issues/290
// https://github.com/facebook/create-react-app/issues/290
// `web` extension prefixes have been added for better support
// `web` extension prefixes have been added for better support
// for React Native Web.
// for React Native Web.
extensions
:
paths
.
moduleFileExtensions
extensions
:
paths
.
moduleFileExtensions
.
map
((
ext
)
=>
`.
${
ext
}
`
)
.
map
((
ext
)
=>
`.
${
ext
}
`
)
.
filter
((
ext
)
=>
useTypeScript
||
!
ext
.
includes
(
"ts"
)),
.
filter
((
ext
)
=>
useTypeScript
||
!
ext
.
includes
(
"ts"
)),
alias
:
{
alias
:
{
// Support React Native Web
// Support React Native Web
// https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/
// https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/
"react-native"
:
"react-native-web"
,
"react-native"
:
"react-native-web"
,
// Allows for better profiling with ReactDevTools
// Allows for better profiling with ReactDevTools
...(
isEnvProductionProfile
&&
{
...(
isEnvProductionProfile
&&
{
"react-dom$"
:
"react-dom/profiling"
,
"react-dom$"
:
"react-dom/profiling"
,
"scheduler/tracing"
:
"scheduler/tracing-profiling"
,
"scheduler/tracing"
:
"scheduler/tracing-profiling"
,
}),
}),
...(
modules
.
webpackAliases
||
{}),
...(
modules
.
webpackAliases
||
{}),
"@"
:
path
.
resolve
(
"src"
),
"@"
:
path
.
resolve
(
"src"
),
},
},
plugins
:
[
plugins
:
[
// Prevents users from importing files from outside of src/ (or node_modules/).
// Prevents users from importing files from outside of src/ (or node_modules/).
// This often causes confusion because we only process files within src/ with babel.
// This often causes confusion because we only process files within src/ with babel.
// To fix this, we prevent you from importing files out of src/ -- if you'd like to,
// To fix this, we prevent you from importing files out of src/ -- if you'd like to,
// please link the files into your node_modules/ and let module-resolution kick in.
// please link the files into your node_modules/ and let module-resolution kick in.
// Make sure your source files are compiled, as they will not be processed in any way.
// Make sure your source files are compiled, as they will not be processed in any way.
new
ModuleScopePlugin
(
paths
.
appSrc
,
[
new
ModuleScopePlugin
(
paths
.
appSrc
,
[
paths
.
appPackageJson
,
paths
.
appPackageJson
,
reactRefreshRuntimeEntry
,
reactRefreshRuntimeEntry
,
reactRefreshWebpackPluginRuntimeEntry
,
reactRefreshWebpackPluginRuntimeEntry
,
babelRuntimeEntry
,
babelRuntimeEntry
,
babelRuntimeEntryHelpers
,
babelRuntimeEntryHelpers
,
babelRuntimeRegenerator
,
babelRuntimeRegenerator
,
]),
]),
],
],
},
},
module
:
{
module
:
{
strictExportPresence
:
true
,
strictExportPresence
:
true
,
rules
:
[
rules
:
[
// Handle node_modules packages that contain sourcemaps
// Handle node_modules packages that contain sourcemaps
shouldUseSourceMap
&&
{
shouldUseSourceMap
&&
{
enforce
:
"pre"
,
enforce
:
"pre"
,
exclude
:
/@babel
(?:\/
|
\\{1,2})
runtime/
,
exclude
:
[
/@babel
(?:\/
|
\\{1,2})
runtime/
,
/node_modules/
]
,
test
:
/
\.(
js|mjs|jsx|ts|tsx|css
)
$/
,
test
:
/
\.(
js|mjs|jsx|ts|tsx|css
)
$/
,
loader
:
require
.
resolve
(
"source-map-loader"
),
loader
:
require
.
resolve
(
"source-map-loader"
),
},
},
{
{
// "oneOf" will traverse all following loaders until one will
// "oneOf" will traverse all following loaders until one will
// match the requirements. When no loader matches it will fall
// match the requirements. When no loader matches it will fall
// back to the "file" loader at the end of the loader list.
// back to the "file" loader at the end of the loader list.
oneOf
:
[
oneOf
:
[
// TODO: Merge this config once `image/avif` is in the mime-db
// TODO: Merge this config once `image/avif` is in the mime-db
// https://github.com/jshttp/mime-db
// https://github.com/jshttp/mime-db
{
{
test
:
[
/
\.
avif$/
],
test
:
[
/
\.
avif$/
],
type
:
"asset"
,
type
:
"asset"
,
mimetype
:
"image/avif"
,
mimetype
:
"image/avif"
,
parser
:
{
parser
:
{
dataUrlCondition
:
{
dataUrlCondition
:
{
maxSize
:
imageInlineSizeLimit
,
maxSize
:
imageInlineSizeLimit
,
},
},
},
},
},
},
// "url" loader works like "file" loader except that it embeds assets
// "url" loader works like "file" loader except that it embeds assets
// smaller than specified limit in bytes as data URLs to avoid requests.
// smaller than specified limit in bytes as data URLs to avoid requests.
// A missing `test` is equivalent to a match.
// A missing `test` is equivalent to a match.
{
{
test
:
[
/
\.
bmp$/
,
/
\.
gif$/
,
/
\.
jpe
?
g$/
,
/
\.
png$/
],
test
:
[
/
\.
bmp$/
,
/
\.
gif$/
,
/
\.
jpe
?
g$/
,
/
\.
png$/
],
type
:
"asset"
,
type
:
"asset"
,
parser
:
{
parser
:
{
dataUrlCondition
:
{
dataUrlCondition
:
{
maxSize
:
imageInlineSizeLimit
,
maxSize
:
imageInlineSizeLimit
,
},
},
},
},
},
},
{
{
test
:
/
\.
svg$/
,
test
:
/
\.
svg$/
,
use
:
[
use
:
[
{
{
loader
:
require
.
resolve
(
"@svgr/webpack"
),
loader
:
require
.
resolve
(
"@svgr/webpack"
),
options
:
{
options
:
{
prettier
:
false
,
prettier
:
false
,
svgo
:
false
,
svgo
:
false
,
svgoConfig
:
{
svgoConfig
:
{
plugins
:
[{
removeViewBox
:
false
}],
plugins
:
[{
removeViewBox
:
false
}],
},
},
titleProp
:
true
,
titleProp
:
true
,
ref
:
true
,
ref
:
true
,
},
},
},
},
{
{
loader
:
require
.
resolve
(
"file-loader"
),
loader
:
require
.
resolve
(
"file-loader"
),
options
:
{
options
:
{
name
:
"static/media/[name].[hash].[ext]"
,
name
:
"static/media/[name].[hash].[ext]"
,
},
},
},
},
],
],
issuer
:
{
issuer
:
{
and
:
[
/
\.(
ts|tsx|js|jsx|md|mdx
)
$/
],
and
:
[
/
\.(
ts|tsx|js|jsx|md|mdx
)
$/
],
},
},
},
},
// Process application JS with Babel.
// Process application JS with Babel.
// The preset includes JSX, Flow, TypeScript, and some ESnext features.
// The preset includes JSX, Flow, TypeScript, and some ESnext features.
{
{
test
:
/
\.(
js|mjs|jsx|ts|tsx
)
$/
,
test
:
/
\.(
js|mjs|jsx|ts|tsx
)
$/
,
include
:
paths
.
appSrc
,
include
:
paths
.
appSrc
,
loader
:
require
.
resolve
(
"babel-loader"
),
loader
:
require
.
resolve
(
"babel-loader"
),
options
:
{
options
:
{
customize
:
require
.
resolve
(
customize
:
require
.
resolve
(
"babel-preset-react-app/webpack-overrides"
"babel-preset-react-app/webpack-overrides"
),
),
presets
:
[
presets
:
[
[
[
require
.
resolve
(
"babel-preset-react-app"
),
require
.
resolve
(
"babel-preset-react-app"
),
{
{
runtime
:
hasJsxRuntime
?
"automatic"
:
"classic"
,
runtime
:
hasJsxRuntime
?
"automatic"
:
"classic"
,
},
},
],
],
],
],
plugins
:
[
plugins
:
[
isEnvDevelopment
&&
isEnvDevelopment
&&
shouldUseReactRefresh
&&
shouldUseReactRefresh
&&
require
.
resolve
(
"react-refresh/babel"
),
require
.
resolve
(
"react-refresh/babel"
),
].
filter
(
Boolean
),
].
filter
(
Boolean
),
// This is a feature of `babel-loader` for webpack (not Babel itself).
// This is a feature of `babel-loader` for webpack (not Babel itself).
// It enables caching results in ./node_modules/.cache/babel-loader/
// It enables caching results in ./node_modules/.cache/babel-loader/
// directory for faster rebuilds.
// directory for faster rebuilds.
cacheDirectory
:
true
,
cacheDirectory
:
true
,
// See #6846 for context on why cacheCompression is disabled
// See #6846 for context on why cacheCompression is disabled
cacheCompression
:
false
,
cacheCompression
:
false
,
compact
:
isEnvProduction
,
compact
:
isEnvProduction
,
},
},
},
},
// Process any JS outside of the app with Babel.
// Process any JS outside of the app with Babel.
// Unlike the application JS, we only compile the standard ES features.
// Unlike the application JS, we only compile the standard ES features.
{
{
test
:
/
\.(
js|mjs
)
$/
,
test
:
/
\.(
js|mjs
)
$/
,
exclude
:
/@babel
(?:\/
|
\\{1,2})
runtime/
,
exclude
:
/@babel
(?:\/
|
\\{1,2})
runtime/
,
loader
:
require
.
resolve
(
"babel-loader"
),
loader
:
require
.
resolve
(
"babel-loader"
),
options
:
{
options
:
{
babelrc
:
false
,
babelrc
:
false
,
configFile
:
false
,
configFile
:
false
,
compact
:
false
,
compact
:
false
,
presets
:
[
presets
:
[
[
[
require
.
resolve
(
"babel-preset-react-app/dependencies"
),
require
.
resolve
(
"babel-preset-react-app/dependencies"
),
{
helpers
:
true
},
{
helpers
:
true
},
],
],
],
],
cacheDirectory
:
true
,
cacheDirectory
:
true
,
// See #6846 for context on why cacheCompression is disabled
// See #6846 for context on why cacheCompression is disabled
cacheCompression
:
false
,
cacheCompression
:
false
,
// Babel sourcemaps are needed for debugging into node_modules
// Babel sourcemaps are needed for debugging into node_modules
// code. Without the options below, debuggers like VSCode
// code. Without the options below, debuggers like VSCode
// show incorrect code and set breakpoints on the wrong lines.
// show incorrect code and set breakpoints on the wrong lines.
sourceMaps
:
shouldUseSourceMap
,
sourceMaps
:
shouldUseSourceMap
,
inputSourceMap
:
shouldUseSourceMap
,
inputSourceMap
:
shouldUseSourceMap
,
},
},
},
},
// "postcss" loader applies autoprefixer to our CSS.
// "postcss" loader applies autoprefixer to our CSS.
// "css" loader resolves paths in CSS and adds assets as dependencies.
// "css" loader resolves paths in CSS and adds assets as dependencies.
// "style" loader turns CSS into JS modules that inject <style> tags.
// "style" loader turns CSS into JS modules that inject <style> tags.
// In production, we use MiniCSSExtractPlugin to extract that CSS
// In production, we use MiniCSSExtractPlugin to extract that CSS
// to a file, but in development "style" loader enables hot editing
// to a file, but in development "style" loader enables hot editing
// of CSS.
// of CSS.
// By default we support CSS Modules with the extension .module.css
// By default we support CSS Modules with the extension .module.css
{
{
test
:
cssRegex
,
test
:
cssRegex
,
exclude
:
cssModuleRegex
,
exclude
:
cssModuleRegex
,
use
:
getStyleLoaders
({
use
:
getStyleLoaders
({
importLoaders
:
1
,
importLoaders
:
1
,
sourceMap
:
isEnvProduction
sourceMap
:
isEnvProduction
?
shouldUseSourceMap
?
shouldUseSourceMap
:
isEnvDevelopment
,
:
isEnvDevelopment
,
modules
:
{
modules
:
{
mode
:
"icss"
,
mode
:
"icss"
,
},
},
}),
}),
// Don't consider CSS imports dead code even if the
// Don't consider CSS imports dead code even if the
// containing package claims to have no side effects.
// containing package claims to have no side effects.
// Remove this when webpack adds a warning or an error for this.
// Remove this when webpack adds a warning or an error for this.
// See https://github.com/webpack/webpack/issues/6571
// See https://github.com/webpack/webpack/issues/6571
sideEffects
:
true
,
sideEffects
:
true
,
},
},
// Adds support for CSS Modules (https://github.com/css-modules/css-modules)
// Adds support for CSS Modules (https://github.com/css-modules/css-modules)
// using the extension .module.css
// using the extension .module.css
{
{
test
:
cssModuleRegex
,
test
:
cssModuleRegex
,
use
:
getStyleLoaders
({
use
:
getStyleLoaders
({
importLoaders
:
1
,
importLoaders
:
1
,
sourceMap
:
isEnvProduction
sourceMap
:
isEnvProduction
?
shouldUseSourceMap
?
shouldUseSourceMap
:
isEnvDevelopment
,
:
isEnvDevelopment
,
modules
:
{
modules
:
{
mode
:
"local"
,
mode
:
"local"
,
getLocalIdent
:
getCSSModuleLocalIdent
,
getLocalIdent
:
getCSSModuleLocalIdent
,
},
},
}),
}),
},
},
// Opt-in support for SASS (using .scss or .sass extensions).
// Opt-in support for SASS (using .scss or .sass extensions).
// By default we support SASS Modules with the
// By default we support SASS Modules with the
// extensions .module.scss or .module.sass
// extensions .module.scss or .module.sass
{
{
test
:
sassRegex
,
test
:
sassRegex
,
exclude
:
sassModuleRegex
,
exclude
:
sassModuleRegex
,
use
:
getStyleLoaders
(
use
:
getStyleLoaders
(
{
{
importLoaders
:
3
,
importLoaders
:
3
,
sourceMap
:
isEnvProduction
sourceMap
:
isEnvProduction
?
shouldUseSourceMap
?
shouldUseSourceMap
:
isEnvDevelopment
,
:
isEnvDevelopment
,
modules
:
{
modules
:
{
mode
:
"icss"
,
mode
:
"icss"
,
},
},
},
},
"sass-loader"
"sass-loader"
),
),
// Don't consider CSS imports dead code even if the
// Don't consider CSS imports dead code even if the
// containing package claims to have no side effects.
// containing package claims to have no side effects.
// Remove this when webpack adds a warning or an error for this.
// Remove this when webpack adds a warning or an error for this.
// See https://github.com/webpack/webpack/issues/6571
// See https://github.com/webpack/webpack/issues/6571
sideEffects
:
true
,
sideEffects
:
true
,
},
},
// Adds support for CSS Modules, but using SASS
// Adds support for CSS Modules, but using SASS
// using the extension .module.scss or .module.sass
// using the extension .module.scss or .module.sass
{
{
test
:
sassModuleRegex
,
test
:
sassModuleRegex
,
use
:
getStyleLoaders
(
use
:
getStyleLoaders
(
{
{
importLoaders
:
3
,
importLoaders
:
3
,
sourceMap
:
isEnvProduction
sourceMap
:
isEnvProduction
?
shouldUseSourceMap
?
shouldUseSourceMap
:
isEnvDevelopment
,
:
isEnvDevelopment
,
modules
:
{
modules
:
{
mode
:
"local"
,
mode
:
"local"
,
getLocalIdent
:
getCSSModuleLocalIdent
,
getLocalIdent
:
getCSSModuleLocalIdent
,
},
},
},
},
"sass-loader"
"sass-loader"
),
),
},
},
// "file" loader makes sure those assets get served by WebpackDevServer.
// "file" loader makes sure those assets get served by WebpackDevServer.
// When you `import` an asset, you get its (virtual) filename.
// When you `import` an asset, you get its (virtual) filename.
// In production, they would get copied to the `build` folder.
// In production, they would get copied to the `build` folder.
// This loader doesn't use a "test" so it will catch all modules
// This loader doesn't use a "test" so it will catch all modules
// that fall through the other loaders.
// that fall through the other loaders.
{
{
// Exclude `js` files to keep "css" loader working as it injects
// Exclude `js` files to keep "css" loader working as it injects
// its runtime that would otherwise be processed through "file" loader.
// its runtime that would otherwise be processed through "file" loader.
// Also exclude `html` and `json` extensions so they get processed
// Also exclude `html` and `json` extensions so they get processed
// by webpacks internal loaders.
// by webpacks internal loaders.
exclude
:
[
/^$/
,
/
\.(
js|mjs|jsx|ts|tsx
)
$/
,
/
\.
html$/
,
/
\.
json$/
],
exclude
:
[
/^$/
,
/
\.(
js|mjs|jsx|ts|tsx
)
$/
,
/
\.
html$/
,
/
\.
json$/
],
type
:
"asset/resource"
,
type
:
"asset/resource"
,
},
},
// ** STOP ** Are you adding a new loader?
// ** STOP ** Are you adding a new loader?
// Make sure to add the new loader(s) before the "file" loader.
// Make sure to add the new loader(s) before the "file" loader.
],
],
},
},
].
filter
(
Boolean
),
].
filter
(
Boolean
),
},
},
plugins
:
[
plugins
:
[
// Generates an `index.html` file with the <script> injected.
// Generates an `index.html` file with the <script> injected.
new
HtmlWebpackPlugin
(
new
HtmlWebpackPlugin
(
Object
.
assign
(
Object
.
assign
(
{},
{},
{
{
inject
:
true
,
inject
:
true
,
template
:
paths
.
appHtml
,
template
:
paths
.
appHtml
,
},
},
isEnvProduction
isEnvProduction
?
{
?
{
minify
:
{
minify
:
{
removeComments
:
true
,
removeComments
:
true
,
collapseWhitespace
:
true
,
collapseWhitespace
:
true
,
removeRedundantAttributes
:
true
,
removeRedundantAttributes
:
true
,
useShortDoctype
:
true
,
useShortDoctype
:
true
,
removeEmptyAttributes
:
true
,
removeEmptyAttributes
:
true
,
removeStyleLinkTypeAttributes
:
true
,
removeStyleLinkTypeAttributes
:
true
,
keepClosingSlash
:
true
,
keepClosingSlash
:
true
,
minifyJS
:
true
,
minifyJS
:
true
,
minifyCSS
:
true
,
minifyCSS
:
true
,
minifyURLs
:
true
,
minifyURLs
:
true
,
},
},
}
}
:
undefined
:
undefined
)
)
),
),
// Inlines the webpack runtime script. This script is too small to warrant
// Inlines the webpack runtime script. This script is too small to warrant
// a network request.
// a network request.
// https://github.com/facebook/create-react-app/issues/5358
// https://github.com/facebook/create-react-app/issues/5358
isEnvProduction
&&
isEnvProduction
&&
shouldInlineRuntimeChunk
&&
shouldInlineRuntimeChunk
&&
new
InlineChunkHtmlPlugin
(
HtmlWebpackPlugin
,
[
/runtime-.+
[
.
]
js/
]),
new
InlineChunkHtmlPlugin
(
HtmlWebpackPlugin
,
[
/runtime-.+
[
.
]
js/
]),
// Makes some environment variables available in index.html.
// Makes some environment variables available in index.html.
// The public URL is available as %PUBLIC_URL% in index.html, e.g.:
// The public URL is available as %PUBLIC_URL% in index.html, e.g.:
// <link rel="icon" href="%PUBLIC_URL%/favicon.ico">
// <link rel="icon" href="%PUBLIC_URL%/favicon.ico">
// It will be an empty string unless you specify "homepage"
// It will be an empty string unless you specify "homepage"
// in `package.json`, in which case it will be the pathname of that URL.
// in `package.json`, in which case it will be the pathname of that URL.
new
InterpolateHtmlPlugin
(
HtmlWebpackPlugin
,
env
.
raw
),
new
InterpolateHtmlPlugin
(
HtmlWebpackPlugin
,
env
.
raw
),
// This gives some necessary context to module not found errors, such as
// This gives some necessary context to module not found errors, such as
// the requesting resource.
// the requesting resource.
new
ModuleNotFoundPlugin
(
paths
.
appPath
),
new
ModuleNotFoundPlugin
(
paths
.
appPath
),
// Makes some environment variables available to the JS code, for example:
// Makes some environment variables available to the JS code, for example:
// if (process.env.NODE_ENV === 'production') { ... }. See `./env.js`.
// if (process.env.NODE_ENV === 'production') { ... }. See `./env.js`.
// It is absolutely essential that NODE_ENV is set to production
// It is absolutely essential that NODE_ENV is set to production
// during a production build.
// during a production build.
// Otherwise React will be compiled in the very slow development mode.
// Otherwise React will be compiled in the very slow development mode.
new
webpack
.
DefinePlugin
(
env
.
stringified
),
new
webpack
.
DefinePlugin
(
env
.
stringified
),
// Experimental hot reloading for React .
// Experimental hot reloading for React .
// https://github.com/facebook/react/tree/main/packages/react-refresh
// https://github.com/facebook/react/tree/main/packages/react-refresh
isEnvDevelopment
&&
isEnvDevelopment
&&
shouldUseReactRefresh
&&
shouldUseReactRefresh
&&
new
ReactRefreshWebpackPlugin
({
new
ReactRefreshWebpackPlugin
({
overlay
:
false
,
overlay
:
false
,
}),
}),
// Watcher doesn't work well if you mistype casing in a path so we use
// Watcher doesn't work well if you mistype casing in a path so we use
// a plugin that prints an error when you attempt to do this.
// a plugin that prints an error when you attempt to do this.
// See https://github.com/facebook/create-react-app/issues/240
// See https://github.com/facebook/create-react-app/issues/240
isEnvDevelopment
&&
new
CaseSensitivePathsPlugin
(),
isEnvDevelopment
&&
new
CaseSensitivePathsPlugin
(),
isEnvProduction
&&
isEnvProduction
&&
new
MiniCssExtractPlugin
({
new
MiniCssExtractPlugin
({
// Options similar to the same options in webpackOptions.output
// Options similar to the same options in webpackOptions.output
// both options are optional
// both options are optional
filename
:
"static/css/[name].[contenthash:8].css"
,
filename
:
"static/css/[name].[contenthash:8].css"
,
chunkFilename
:
"static/css/[name].[contenthash:8].chunk.css"
,
chunkFilename
:
"static/css/[name].[contenthash:8].chunk.css"
,
}),
}),
// Generate an asset manifest file with the following content:
// Generate an asset manifest file with the following content:
// - "files" key: Mapping of all asset filenames to their corresponding
// - "files" key: Mapping of all asset filenames to their corresponding
// output file so that tools can pick it up without having to parse
// output file so that tools can pick it up without having to parse
// `index.html`
// `index.html`
// - "entrypoints" key: Array of files which are included in `index.html`,
// - "entrypoints" key: Array of files which are included in `index.html`,
// can be used to reconstruct the HTML if necessary
// can be used to reconstruct the HTML if necessary
new
WebpackManifestPlugin
({
new
WebpackManifestPlugin
({
fileName
:
"asset-manifest.json"
,
fileName
:
"asset-manifest.json"
,
publicPath
:
paths
.
publicUrlOrPath
,
publicPath
:
paths
.
publicUrlOrPath
,
generate
:
(
seed
,
files
,
entrypoints
)
=>
{
generate
:
(
seed
,
files
,
entrypoints
)
=>
{
const
manifestFiles
=
files
.
reduce
((
manifest
,
file
)
=>
{
const
manifestFiles
=
files
.
reduce
((
manifest
,
file
)
=>
{
manifest
[
file
.
name
]
=
file
.
path
;
manifest
[
file
.
name
]
=
file
.
path
;
return
manifest
;
return
manifest
;
},
seed
);
},
seed
);
const
entrypointFiles
=
entrypoints
.
main
.
filter
(
const
entrypointFiles
=
entrypoints
.
main
.
filter
(
(
fileName
)
=>
!
fileName
.
endsWith
(
".map"
)
(
fileName
)
=>
!
fileName
.
endsWith
(
".map"
)
);
);
return
{
return
{
files
:
manifestFiles
,
files
:
manifestFiles
,
entrypoints
:
entrypointFiles
,
entrypoints
:
entrypointFiles
,
};
};
},
},
}),
}),
// Moment.js is an extremely popular library that bundles large locale files
// Moment.js is an extremely popular library that bundles large locale files
// by default due to how webpack interprets its code. This is a practical
// by default due to how webpack interprets its code. This is a practical
// solution that requires the user to opt into importing specific locales.
// solution that requires the user to opt into importing specific locales.
// https://github.com/jmblog/how-to-optimize-momentjs-with-webpack
// https://github.com/jmblog/how-to-optimize-momentjs-with-webpack
// You can remove this if you don't use Moment.js:
// You can remove this if you don't use Moment.js:
new
webpack
.
IgnorePlugin
({
new
webpack
.
IgnorePlugin
({
resourceRegExp
:
/^
\.\/
locale$/
,
resourceRegExp
:
/^
\.\/
locale$/
,
contextRegExp
:
/moment$/
,
contextRegExp
:
/moment$/
,
}),
}),
// Generate a service worker script that will precache, and keep up to date,
// Generate a service worker script that will precache, and keep up to date,
// the HTML & assets that are part of the webpack build.
// the HTML & assets that are part of the webpack build.
isEnvProduction
&&
isEnvProduction
&&
fs
.
existsSync
(
swSrc
)
&&
fs
.
existsSync
(
swSrc
)
&&
new
WorkboxWebpackPlugin
.
InjectManifest
({
new
WorkboxWebpackPlugin
.
InjectManifest
({
swSrc
,
swSrc
,
dontCacheBustURLsMatching
:
/
\.[
0-9a-f
]{8}\.
/
,
dontCacheBustURLsMatching
:
/
\.[
0-9a-f
]{8}\.
/
,
exclude
:
[
/
\.
map$/
,
/asset-manifest
\.
json$/
,
/LICENSE/
],
exclude
:
[
/
\.
map$/
,
/asset-manifest
\.
json$/
,
/LICENSE/
],
// Bump up the default maximum size (2mb) that's precached,
// Bump up the default maximum size (2mb) that's precached,
// to make lazy-loading failure scenarios less likely.
// to make lazy-loading failure scenarios less likely.
// See https://github.com/cra-template/pwa/issues/13#issuecomment-722667270
// See https://github.com/cra-template/pwa/issues/13#issuecomment-722667270
maximumFileSizeToCacheInBytes
:
5
*
1024
*
1024
,
maximumFileSizeToCacheInBytes
:
5
*
1024
*
1024
,
}),
}),
// TypeScript type checking
// TypeScript type checking
useTypeScript
&&
useTypeScript
&&
new
ForkTsCheckerWebpackPlugin
({
new
ForkTsCheckerWebpackPlugin
({
async
:
isEnvDevelopment
,
async
:
isEnvDevelopment
,
typescript
:
{
typescript
:
{
typescriptPath
:
resolve
.
sync
(
"typescript"
,
{
typescriptPath
:
resolve
.
sync
(
"typescript"
,
{
basedir
:
paths
.
appNodeModules
,
basedir
:
paths
.
appNodeModules
,
}),
}),
configOverwrite
:
{
configOverwrite
:
{
compilerOptions
:
{
compilerOptions
:
{
sourceMap
:
isEnvProduction
sourceMap
:
isEnvProduction
?
shouldUseSourceMap
?
shouldUseSourceMap
:
isEnvDevelopment
,
:
isEnvDevelopment
,
skipLibCheck
:
true
,
skipLibCheck
:
true
,
inlineSourceMap
:
false
,
inlineSourceMap
:
false
,
declarationMap
:
false
,
declarationMap
:
false
,
noEmit
:
true
,
noEmit
:
true
,
incremental
:
true
,
incremental
:
true
,
tsBuildInfoFile
:
paths
.
appTsBuildInfoFile
,
tsBuildInfoFile
:
paths
.
appTsBuildInfoFile
,
},
},
},
},
context
:
paths
.
appPath
,
context
:
paths
.
appPath
,
diagnosticOptions
:
{
diagnosticOptions
:
{
syntactic
:
true
,
syntactic
:
true
,
},
},
mode
:
"write-references"
,
mode
:
"write-references"
,
// profile: true,
// profile: true,
},
},
issue
:
{
issue
:
{
// This one is specifically to match during CI tests,
// This one is specifically to match during CI tests,
// as micromatch doesn't match
// as micromatch doesn't match
// '../cra-template-typescript/template/src/App.tsx'
// '../cra-template-typescript/template/src/App.tsx'
// otherwise.
// otherwise.
include
:
[
include
:
[
{
file
:
"../**/src/**/*.{ts,tsx}"
},
{
file
:
"../**/src/**/*.{ts,tsx}"
},
{
file
:
"**/src/**/*.{ts,tsx}"
},
{
file
:
"**/src/**/*.{ts,tsx}"
},
],
],
exclude
:
[
exclude
:
[
{
file
:
"**/src/**/__tests__/**"
},
{
file
:
"**/src/**/__tests__/**"
},
{
file
:
"**/src/**/?(*.){spec|test}.*"
},
{
file
:
"**/src/**/?(*.){spec|test}.*"
},
{
file
:
"**/src/setupProxy.*"
},
{
file
:
"**/src/setupProxy.*"
},
{
file
:
"**/src/setupTests.*"
},
{
file
:
"**/src/setupTests.*"
},
],
],
},
},
logger
:
{
logger
:
{
infrastructure
:
"silent"
,
infrastructure
:
"silent"
,
},
},
}),
}),
!
disableESLintPlugin
&&
!
disableESLintPlugin
&&
new
ESLintPlugin
({
new
ESLintPlugin
({
// Plugin options
// Plugin options
extensions
:
[
"js"
,
"mjs"
,
"jsx"
,
"ts"
,
"tsx"
],
extensions
:
[
"js"
,
"mjs"
,
"jsx"
,
"ts"
,
"tsx"
],
formatter
:
require
.
resolve
(
"react-dev-utils/eslintFormatter"
),
formatter
:
require
.
resolve
(
"react-dev-utils/eslintFormatter"
),
eslintPath
:
require
.
resolve
(
"eslint"
),
eslintPath
:
require
.
resolve
(
"eslint"
),
failOnError
:
!
(
isEnvDevelopment
&&
emitErrorsAsWarnings
),
failOnError
:
!
(
isEnvDevelopment
&&
emitErrorsAsWarnings
),
context
:
paths
.
appSrc
,
context
:
paths
.
appSrc
,
cache
:
true
,
cache
:
true
,
cacheLocation
:
path
.
resolve
(
cacheLocation
:
path
.
resolve
(
paths
.
appNodeModules
,
paths
.
appNodeModules
,
".cache/.eslintcache"
".cache/.eslintcache"
),
),
// ESLint class options
// ESLint class options
cwd
:
paths
.
appPath
,
cwd
:
paths
.
appPath
,
resolvePluginsRelativeTo
:
__dirname
,
resolvePluginsRelativeTo
:
__dirname
,
baseConfig
:
{
baseConfig
:
{
extends
:
[
require
.
resolve
(
"eslint-config-react-app/base"
)],
extends
:
[
require
.
resolve
(
"eslint-config-react-app/base"
)],
rules
:
{
rules
:
{
...(
!
hasJsxRuntime
&&
{
...(
!
hasJsxRuntime
&&
{
"react/react-in-jsx-scope"
:
"error"
,
"react/react-in-jsx-scope"
:
"error"
,
}),
}),
},
},
},
},
}),
}),
].
filter
(
Boolean
),
].
filter
(
Boolean
),
// Turn off performance processing because we utilize
// Turn off performance processing because we utilize
// our own hints via the FileSizeReporter
// our own hints via the FileSizeReporter
performance
:
false
,
performance
:
false
,
};
};
};
};
src/views/CustomOperator/components/OperatorList/index.tsx
View file @
e20a8772
...
@@ -3,7 +3,7 @@ import SearchIcon from "@mui/icons-material/Search";
...
@@ -3,7 +3,7 @@ import SearchIcon from "@mui/icons-material/Search";
import
styles
from
"./index.module.css"
;
import
styles
from
"./index.module.css"
;
import
cloneDeep
from
"lodash/cloneDeep"
;
import
cloneDeep
from
"lodash/cloneDeep"
;
import
{
getScrollLoader
}
from
"@/utils/util"
;
import
{
getScrollLoader
}
from
"@/utils/util"
;
import
{
useState
,
useCallback
,
useEffect
}
from
"react"
;
import
{
useState
,
useCallback
,
useEffect
,
useMemo
}
from
"react"
;
import
{
getOperatorList
}
from
"@/api/project_api"
;
import
{
getOperatorList
}
from
"@/api/project_api"
;
import
CircularProgress
from
"@mui/material/CircularProgress"
;
import
CircularProgress
from
"@mui/material/CircularProgress"
;
import
useMyRequest
from
"@/hooks/useMyRequest"
;
import
useMyRequest
from
"@/hooks/useMyRequest"
;
...
@@ -11,10 +11,8 @@ import { useStores } from "@/store";
...
@@ -11,10 +11,8 @@ import { useStores } from "@/store";
import
{
toJS
}
from
"mobx"
;
import
{
toJS
}
from
"mobx"
;
import
{
ITask
}
from
"@/views/Project/ProjectSubmitWork/interface"
;
import
{
ITask
}
from
"@/views/Project/ProjectSubmitWork/interface"
;
let
count
=
1
;
type
IProps
=
{
type
IProps
=
{
operatorList
:
any
;
operatorList
:
ITask
[]
;
setOperatorList
:
any
;
setOperatorList
:
any
;
};
};
...
@@ -22,16 +20,36 @@ const OperatorList = (props: IProps) => {
...
@@ -22,16 +20,36 @@ const OperatorList = (props: IProps) => {
const
{
operatorList
,
setOperatorList
}
=
props
;
// 流程图中流算子列表
const
{
operatorList
,
setOperatorList
}
=
props
;
// 流程图中流算子列表
const
{
currentProjectStore
}
=
useStores
();
const
{
currentProjectStore
}
=
useStores
();
const
[
list
,
setList
]
=
useState
<
ITask
[]
>
([]);
// 算子列表
const
[
list
,
setList
]
=
useState
<
ITask
[]
>
([]);
// 算子列表
const
productId
=
toJS
(
currentProjectStore
.
currentProductInfo
.
id
);
const
productId
=
toJS
(
currentProjectStore
.
currentProductInfo
.
id
);
// 产品ID
const
[
keyword
,
setKeyword
]
=
useState
(
""
);
// 搜索算子列表时的关键词
const
[
keyword
,
setKeyword
]
=
useState
(
""
);
// 搜索算子列表时的关键词
const
[
dragItem
,
setDragItem
]
=
useState
<
any
>
({});
// 拖拽的算子
const
[
dragItem
,
setDragItem
]
=
useState
<
any
>
({});
// 拖拽的算子
const
[
page
,
setPage
]
=
useState
(
0
);
//
const
[
page
,
setPage
]
=
useState
(
0
);
// 算子列表页码
const
[
isLastPage
,
setIsLastPage
]
=
useState
(
false
);
const
[
isLastPage
,
setIsLastPage
]
=
useState
(
false
);
// 是否是最后一页
// todo 加载中 没有更多了样式
// 应该一个批算子里可以有多个流算子 流算子也可以重复 所以需要在流算子后加一个_${count} 加上operatorList可能有缓存数据, 所以不一定是1开头
const
count
=
useMemo
(()
=>
{
if
(
operatorList
.
length
===
0
)
{
return
1
;
}
else
{
const
countArr
=
operatorList
.
map
((
operatorLi
)
=>
{
const
_index
=
operatorLi
.
id
.
indexOf
(
"_"
);
if
(
_index
===
-
1
)
{
return
1
;
}
else
{
return
Number
(
operatorLi
.
id
.
slice
(
_index
+
1
));
}
});
const
maxCount
=
Math
.
max
(...
countArr
);
return
maxCount
+
1
;
}
},
[
operatorList
]);
// 获取算子列表
const
{
run
:
getOperatorListRun
,
loading
}
=
useMyRequest
(
getOperatorList
,
{
const
{
run
:
getOperatorListRun
,
loading
}
=
useMyRequest
(
getOperatorList
,
{
onSuccess
:
(
res
)
=>
{
onSuccess
:
(
res
)
=>
{
let
arr
=
res
?.
data
?.
content
;
let
arr
=
res
?.
data
?.
content
;
setIsLastPage
(
res
?.
data
?.
last
);
setIsLastPage
(
res
?.
data
?.
last
);
// todo 去掉parameters添加
arr
.
forEach
((
item
:
any
,
index
:
number
)
=>
{
arr
.
forEach
((
item
:
any
,
index
:
number
)
=>
{
item
.
edges
=
[];
item
.
edges
=
[];
item
.
parameters
.
push
({
item
.
parameters
.
push
({
...
@@ -80,10 +98,10 @@ const OperatorList = (props: IProps) => {
...
@@ -80,10 +98,10 @@ const OperatorList = (props: IProps) => {
});
});
});
});
setList
([...
list
,
...
arr
]);
setList
([...
list
,
...
arr
]);
// setList(res?.data?.content || []);
},
},
});
});
// 获取算子列表方法
const
getOperatorListFun
=
useCallback
(
const
getOperatorListFun
=
useCallback
(
(
keyword
:
string
=
""
,
page
=
0
)
=>
{
(
keyword
:
string
=
""
,
page
=
0
)
=>
{
getOperatorListRun
({
getOperatorListRun
({
...
@@ -97,16 +115,19 @@ const OperatorList = (props: IProps) => {
...
@@ -97,16 +115,19 @@ const OperatorList = (props: IProps) => {
[
productId
,
getOperatorListRun
]
[
productId
,
getOperatorListRun
]
);
);
// 打开弹窗时获取算子列表
useEffect
(()
=>
{
useEffect
(()
=>
{
getOperatorListFun
();
getOperatorListFun
();
},
[
getOperatorListFun
]);
},
[
getOperatorListFun
]);
// 算子列表搜索关键词变化
const
keywordChange
=
(
e
:
any
)
=>
{
const
keywordChange
=
(
e
:
any
)
=>
{
if
(
e
.
target
.
value
.
length
<=
30
)
{
if
(
e
.
target
.
value
.
length
<=
30
)
{
setKeyword
(
e
.
target
.
value
);
setKeyword
(
e
.
target
.
value
);
}
}
};
};
// 回车搜索
const
handleKeywordKeyUp
=
(
e
:
any
)
=>
{
const
handleKeywordKeyUp
=
(
e
:
any
)
=>
{
if
(
e
.
keyCode
===
13
)
{
if
(
e
.
keyCode
===
13
)
{
setList
([]);
setList
([]);
...
@@ -115,70 +136,21 @@ const OperatorList = (props: IProps) => {
...
@@ -115,70 +136,21 @@ const OperatorList = (props: IProps) => {
getOperatorListFun
(
e
.
target
.
value
,
0
);
getOperatorListFun
(
e
.
target
.
value
,
0
);
}
}
};
};
// const list = [
// {
// title: "这是中文",
// version: "1.0.0",
// },
// {
// allVersions: ["1.0.0", "2.0.0"],
// creator: "root",
// description: "这是一段Hitlist算子的描述",
// edges: [
// {
// id: "fdd26229-3a1f-46e7-a14a-dd55bcce55e4",
// label: null,
// source: "62c7965c9bf7ba39f2dcefcc",
// sourceHandle: null,
// target: "62c7965c9bf7ba39f2dcefce",
// targetHandle: null,
// },
// ],
// id: "62c7965c9bf7ba39f2dcefcc",
// parameters: [
// {
// name: "cpus",
// classType: "INT",
// classTypeName: "Int",
// required: false,
// defaultValue: "1",
// },
// ],
// // parentNode: "62c7965c9bf7ba39f2dcefc8",
// position: { x: 40, y: 200 },
// productId: "cadd",
// status: null,
// title: "Hitlist",
// type: "FLOW",
// version: "2.0.0",
// },
// {
// title: "asdf",
// version: "1.0.0",
// },
// {
// title: "asdf",
// version: "1.0.0",
// },
// {
// title: "asdf",
// version: "1.0.0",
// },
// ];
// 滚动触发
const
handleScroll
=
(
e
:
any
)
=>
{
const
handleScroll
=
(
e
:
any
)
=>
{
// 满足快滚动到底部时开始加载
if
(
getScrollLoader
(
e
))
{
if
(
getScrollLoader
(
e
))
{
console
.
log
(
"加载1"
);
if
(
loading
||
isLastPage
)
{
if
(
loading
||
isLastPage
)
{
return
;
return
;
}
else
{
}
else
{
console
.
log
(
"加载2"
);
getOperatorListFun
(
keyword
,
page
+
1
);
getOperatorListFun
(
keyword
,
page
+
1
);
setPage
(
page
+
1
);
setPage
(
page
+
1
);
}
}
}
}
};
};
// 渲染六个小点样式
const
randerIcon
=
()
=>
{
const
randerIcon
=
()
=>
{
return
(
return
(
<
div
className=
{
styles
.
icon
}
>
<
div
className=
{
styles
.
icon
}
>
...
@@ -201,9 +173,6 @@ const OperatorList = (props: IProps) => {
...
@@ -201,9 +173,6 @@ const OperatorList = (props: IProps) => {
/** 拖拽开始 */
/** 拖拽开始 */
const
onDragStart
=
(
item
:
any
)
=>
{
const
onDragStart
=
(
item
:
any
)
=>
{
setDragItem
(
item
);
setDragItem
(
item
);
console
.
log
(
"onDragStart"
);
// setIsDragStyle(true);
count
++
;
};
};
/** 生成批流副本 */
/** 生成批流副本 */
...
@@ -227,38 +196,14 @@ const OperatorList = (props: IProps) => {
...
@@ -227,38 +196,14 @@ const OperatorList = (props: IProps) => {
},
},
edges
:
newEdges
.
length
?
newEdges
:
task
?.
edges
,
edges
:
newEdges
.
length
?
newEdges
:
task
?.
edges
,
};
};
// const newVal = arr.map((item) => {
// const newEdges =
// item?.edges &&
// item?.edges.map((every) => {
// return {
// ...every,
// source: `${every.source}_${count}`,
// target: `${every.target}_${count}`,
// };
// });
// return {
// ...item,
// id: `${item.id}_${count}`,
// parentNode: item.parentNode ? `${item.parentNode}_${count}` : "",
// position: {
// x: item.position?.x,
// y: item.position?.y,
// },
// edges: newEdges.length ? newEdges : item?.edges,
// };
// });
// return newVal;
},
},
[]
[
count
]
);
);
/** 拖拽结束 */
/** 拖拽结束 */
const
onDragEnd
=
useCallback
(
const
onDragEnd
=
useCallback
(
(
e
:
React
.
DragEvent
<
HTMLDivElement
>
)
=>
{
(
e
:
React
.
DragEvent
<
HTMLDivElement
>
)
=>
{
const
dom
=
document
.
getElementById
(
"customOperatorFlow"
);
const
dom
=
document
.
getElementById
(
"customOperatorFlow"
);
console
.
log
(
e
);
console
.
log
(
dom
);
const
clientX
=
e
.
clientX
;
const
clientX
=
e
.
clientX
;
const
clientY
=
e
.
clientY
;
const
clientY
=
e
.
clientY
;
const
upperLeftPointX
=
Number
(
dom
?.
offsetLeft
);
const
upperLeftPointX
=
Number
(
dom
?.
offsetLeft
);
...
@@ -271,30 +216,16 @@ const OperatorList = (props: IProps) => {
...
@@ -271,30 +216,16 @@ const OperatorList = (props: IProps) => {
clientX
<
lowerRightX
&&
clientX
<
lowerRightX
&&
clientY
<
lowerRightY
clientY
<
lowerRightY
)
{
)
{
// const batchFlowArr = getBatchFlowArr(info.id);
const
newDragItem
=
cloneDeep
(
dragItem
);
const
newDragItem
=
cloneDeep
(
dragItem
);
const
newOperatorItem
=
getNewOperatorItem
(
const
newOperatorItem
=
getNewOperatorItem
(
newDragItem
,
newDragItem
,
clientX
-
upperLeftPointX
,
clientX
-
upperLeftPointX
,
clientY
-
upperLeftPointY
-
42
clientY
-
upperLeftPointY
-
42
);
);
// const newOperatorItem = {
// ...newDragItem,
// id: `${newDragItem.id}_${count}`,
// source: `${newDragItem.source}_${count}`,
// target: `${newDragItem.target}_${count}`,
// position: {
// x: clientX - upperLeftPointX,
// y: clientY - upperLeftPointY,
// },
// };
const
newVal
=
cloneDeep
(
operatorList
);
const
newVal
=
cloneDeep
(
operatorList
);
newVal
.
push
(
newOperatorItem
);
newVal
.
push
(
newOperatorItem
);
console
.
log
(
newVal
);
setOperatorList
(
newVal
);
setOperatorList
(
newVal
);
// setTemplateConfigInfo(newVal);
}
}
// setIsDragStyle(false);
},
},
[
dragItem
,
operatorList
,
setOperatorList
,
getNewOperatorItem
]
[
dragItem
,
operatorList
,
setOperatorList
,
getNewOperatorItem
]
);
);
...
@@ -335,12 +266,10 @@ const OperatorList = (props: IProps) => {
...
@@ -335,12 +266,10 @@ const OperatorList = (props: IProps) => {
<
span
className=
{
styles
.
name
}
>
{
item
.
title
}
</
span
>
<
span
className=
{
styles
.
name
}
>
{
item
.
title
}
</
span
>
<
span
className=
{
styles
.
version
}
>
v
{
item
.
version
}
</
span
>
<
span
className=
{
styles
.
version
}
>
v
{
item
.
version
}
</
span
>
</
div
>
</
div
>
{
/* <span className={styles.name}>{item.title}</span>
<span className={styles.version}>{item.version}</span> */
}
</
div
>
</
div
>
);
);
})
}
})
}
{
!
loading
&&
(
{
loading
&&
(
<
div
className=
{
styles
.
loading
}
>
<
div
className=
{
styles
.
loading
}
>
<
CircularProgress
<
CircularProgress
size=
{
12
}
size=
{
12
}
...
@@ -352,7 +281,7 @@ const OperatorList = (props: IProps) => {
...
@@ -352,7 +281,7 @@ const OperatorList = (props: IProps) => {
加载中...
加载中...
</
div
>
</
div
>
)
}
)
}
{
!
isLastPage
&&
<
div
className=
{
styles
.
loading
}
>
已经到底了
</
div
>
}
{
isLastPage
&&
<
div
className=
{
styles
.
loading
}
>
已经到底了
</
div
>
}
</
div
>
</
div
>
</
div
>
</
div
>
);
);
...
...
src/views/CustomOperator/index.tsx
View file @
e20a8772
...
@@ -21,6 +21,7 @@ const CustomOperator = observer((props: IProps) => {
...
@@ -21,6 +21,7 @@ const CustomOperator = observer((props: IProps) => {
const
sessionStorageOperatorList
=
JSON
.
parse
(
const
sessionStorageOperatorList
=
JSON
.
parse
(
sessionStorage
.
getItem
(
"operatorList"
)
||
"[]"
sessionStorage
.
getItem
(
"operatorList"
)
||
"[]"
);
);
console
.
log
(
"sessionStorageOperatorList"
,
sessionStorageOperatorList
);
const
[
operatorList
,
setOperatorList
]
=
useState
<
ITask
[]
>
(
const
[
operatorList
,
setOperatorList
]
=
useState
<
ITask
[]
>
(
sessionStorageOperatorList
sessionStorageOperatorList
);
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment