kie-issues#3241: Parameterize logo and links for DI and JS webapp (#3261)

Co-authored-by: kumaradityaraj <sedulous.0007@gmail.com>
diff --git a/package.json b/package.json
index 2689a27..ee9ecbe 100644
--- a/package.json
+++ b/package.json
@@ -30,6 +30,7 @@
     "@nice-move/prettier-plugin-package-json": "^0.8.0",
     "@prettier/plugin-xml": "^3.4.1",
     "@types/node": "^22.10.7",
+    "html-webpack-plugin": "^5.3.2",
     "husky": "^6.0.0",
     "postinstall-postinstall": "^2.1.0",
     "prettier": "^3.3.2",
diff --git a/packages/kogito-data-index-webapp/README.md b/packages/kogito-data-index-webapp/README.md
new file mode 100644
index 0000000..daf94e5
--- /dev/null
+++ b/packages/kogito-data-index-webapp/README.md
@@ -0,0 +1,65 @@
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one
+   or more contributor license agreements.  See the NOTICE file
+   distributed with this work for additional information
+   regarding copyright ownership.  The ASF licenses this file
+   to you under the Apache License, Version 2.0 (the
+   "License"); you may not use this file except in compliance
+   with the License.  You may obtain a copy of the License at
+     http://www.apache.org/licenses/LICENSE-2.0
+   Unless required by applicable law or agreed to in writing,
+   software distributed under the License is distributed on an
+   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+   KIND, either express or implied.  See the License for the
+   specific language governing permissions and limitations
+   under the License.
+-->
+
+# Kogito Data Index Webapp
+
+This package contains the webapp for the Data Index endpoint
+
+## Build
+
+- The image name and tags can be customized by setting the following environment variables:
+
+  ```bash
+  export KOGITO_DATA_INDEX_WEBAPP_title=<title>
+  export KOGITO_DATA_INDEX_WEBAPP_logo=<logo>
+  export KOGITO_DATA_INDEX_WEBAPP_docLinkHref=<docLinkHref>
+  export KOGITO_DATA_INDEX_WEBAPP_docLinkText=<docLinkText>
+  ```
+
+  > Default values can be found [here](./env/index.js).
+
+- After optionally setting up the environment variables, run the following in the root folder of the repository to build the package:
+
+  ```bash
+  pnpm -F @kie-tools/kogito-data-index-webapp... build:prod
+  ```
+
+---
+
+Apache KIE (incubating) is an effort undergoing incubation at The Apache Software
+Foundation (ASF), sponsored by the name of Apache Incubator. Incubation is
+required of all newly accepted projects until a further review indicates that
+the infrastructure, communications, and decision making process have stabilized
+in a manner consistent with other successful ASF projects. While incubation
+status is not necessarily a reflection of the completeness or stability of the
+code, it does indicate that the project has yet to be fully endorsed by the ASF.
+
+Some of the incubating project’s releases may not be fully compliant with ASF
+policy. For example, releases may have incomplete or un-reviewed licensing
+conditions. What follows is a list of known issues the project is currently
+aware of (note that this list, by definition, is likely to be incomplete):
+
+- Hibernate, an LGPL project, is being used. Hibernate is in the process of
+  relicensing to ASL v2
+- Some files, particularly test files, and those not supporting comments, may
+  be missing the ASF Licensing Header
+
+If you are planning to incorporate this work into your product/project, please
+be aware that you will need to conduct a thorough licensing review to determine
+the overall implications of including this work. For the current status of this
+project through the Apache Incubator visit:
+https://incubator.apache.org/projects/kie.html
diff --git a/packages/kogito-data-index-webapp/env/index.js b/packages/kogito-data-index-webapp/env/index.js
index 45859a2..2e49cb3 100644
--- a/packages/kogito-data-index-webapp/env/index.js
+++ b/packages/kogito-data-index-webapp/env/index.js
@@ -20,13 +20,36 @@
 const { varsWithName, getOrDefault, composeEnv } = require("@kie-tools-scripts/build-env");
 
 module.exports = composeEnv([require("@kie-tools/root-env/env")], {
-  vars: varsWithName({}),
+  vars: varsWithName({
+    KOGITO_DATA_INDEX_WEBAPP_title: {
+      default: "KOGITO DATA INDEX",
+      description: "Application title",
+    },
+    KOGITO_DATA_INDEX_WEBAPP_logo: {
+      default: "favicon.svg",
+      description: "Path to logo image",
+    },
+    KOGITO_DATA_INDEX_WEBAPP_docLinkHref: {
+      default: "https://graphql.org/learn/",
+      description: "Documentation link URL",
+    },
+    KOGITO_DATA_INDEX_WEBAPP_docLinkText: {
+      default: "GraphQL DOCS",
+      description: "Documentation link text",
+    },
+  }),
   get env() {
     return {
-      dataIndexWebapp: {
+      kogitoDataIndexWebapp: {
         dev: {
           port: 9026,
         },
+        title: getOrDefault(this.vars.KOGITO_DATA_INDEX_WEBAPP_title),
+        logo: getOrDefault(this.vars.KOGITO_DATA_INDEX_WEBAPP_logo),
+        docLink: {
+          href: getOrDefault(this.vars.KOGITO_DATA_INDEX_WEBAPP_docLinkHref),
+          text: getOrDefault(this.vars.KOGITO_DATA_INDEX_WEBAPP_docLinkText),
+        },
       },
     };
   },
diff --git a/packages/kogito-data-index-webapp/package.json b/packages/kogito-data-index-webapp/package.json
index afb6ef9..4c2d94b 100644
--- a/packages/kogito-data-index-webapp/package.json
+++ b/packages/kogito-data-index-webapp/package.json
@@ -25,6 +25,8 @@
     "@kie-tools-core/webpack-base": "workspace:*",
     "@kie-tools/root-env": "workspace:*",
     "copy-webpack-plugin": "^11.0.0",
+    "html-replace-webpack-plugin": "^2.6.0",
+    "html-webpack-plugin": "^5.3.2",
     "jest": "^29.7.0",
     "rimraf": "^3.0.2",
     "ts-node": "^10.9.2",
diff --git a/packages/kogito-data-index-webapp/src/index.html b/packages/kogito-data-index-webapp/src/index.html
index 1456f07..1bc1e6d 100644
--- a/packages/kogito-data-index-webapp/src/index.html
+++ b/packages/kogito-data-index-webapp/src/index.html
@@ -22,16 +22,16 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <title>Data Index Webapp</title>
+    <title>${KOGITO_DATA_INDEX_WEBAPP_TITLE}</title>
     <link rel="stylesheet" href="styles.css" />
-    <link rel="shortcut icon" type="image/x-icon" href="favicon.svg" />
+    <link rel="shortcut icon" type="image/x-icon" href="${KOGITO_DATA_INDEX_WEBAPP_LOGO}" />
   </head>
   <body>
     <div class="maindiv">
       <div class="container">
         <div class="logo" style="display: flex; justify-content: center">
-          <img src="favicon.svg" alt="KIE Logo" />
-          <h1>Data Index Service</h1>
+          <img src="${KOGITO_DATA_INDEX_WEBAPP_LOGO}" alt="KIE Logo" />
+          <h1>${KOGITO_DATA_INDEX_WEBAPP_TITLE}</h1>
         </div>
         <div>
           <h4>Your Data Index service is up and working!</h4>
@@ -42,7 +42,9 @@
           modify that data.
         </p>
         <div>
-          <a href="https://graphql.org/learn/" class="btn" target="_blank">GraphQL docs</a>
+          <a href="${KOGITO_DATA_INDEX_WEBAPP_DOCLINK_HREF}" class="btn" target="_blank"
+            >${KOGITO_DATA_INDEX_WEBAPP_DOCLINK_TEXT}</a
+          >
         </div>
       </div>
     </div>
diff --git a/packages/kogito-data-index-webapp/webpack.config.js b/packages/kogito-data-index-webapp/webpack.config.js
index ede2d67..929734f 100644
--- a/packages/kogito-data-index-webapp/webpack.config.js
+++ b/packages/kogito-data-index-webapp/webpack.config.js
@@ -17,10 +17,13 @@
  * under the License.
  */
 
+const path = require("path");
 const CopyPlugin = require("copy-webpack-plugin");
 const { merge } = require("webpack-merge");
 const common = require("@kie-tools-core/webpack-base/webpack.common.config");
 const { env } = require("./env");
+const HtmlReplaceWebpackPlugin = require("html-replace-webpack-plugin");
+const HtmlWebpackPlugin = require("html-webpack-plugin");
 
 module.exports = async (webpackEnv) =>
   merge(common(webpackEnv), {
@@ -28,17 +31,39 @@
     plugins: [
       new CopyPlugin({
         patterns: [
-          { from: "./src/index.html", to: "./index.html" },
           { from: "./src/styles.css", to: "./styles.css" },
           { from: "./static/favicon.svg", to: "./favicon.svg" },
         ],
       }),
+      new HtmlWebpackPlugin({
+        template: path.resolve(__dirname, "src/index.html"),
+        filename: "index.html",
+        chunks: ["app"],
+      }),
+      new HtmlReplaceWebpackPlugin([
+        {
+          pattern: /\${KOGITO_DATA_INDEX_WEBAPP_TITLE}/g,
+          replacement: () => env.kogitoDataIndexWebapp.title ?? "",
+        },
+        {
+          pattern: /\${KOGITO_DATA_INDEX_WEBAPP_LOGO}/g,
+          replacement: () => env.kogitoDataIndexWebapp.logo ?? "",
+        },
+        {
+          pattern: /\${KOGITO_DATA_INDEX_WEBAPP_DOCLINK_HREF}/g,
+          replacement: () => env.kogitoDataIndexWebapp.docLink.href ?? "",
+        },
+        {
+          pattern: /\${KOGITO_DATA_INDEX_WEBAPP_DOCLINK_TEXT}/g,
+          replacement: () => env.kogitoDataIndexWebapp.docLink.text ?? "",
+        },
+      ]),
     ],
     ignoreWarnings: [/Failed to parse source map/],
     devServer: {
       static: {
         directory: "./dist",
       },
-      port: env.dataIndexWebapp.dev.port,
+      port: env.kogitoDataIndexWebapp.dev.port,
     },
   });
diff --git a/packages/kogito-jobs-service-webapp/README.md b/packages/kogito-jobs-service-webapp/README.md
new file mode 100644
index 0000000..41c69d8
--- /dev/null
+++ b/packages/kogito-jobs-service-webapp/README.md
@@ -0,0 +1,67 @@
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one
+   or more contributor license agreements.  See the NOTICE file
+   distributed with this work for additional information
+   regarding copyright ownership.  The ASF licenses this file
+   to you under the Apache License, Version 2.0 (the
+   "License"); you may not use this file except in compliance
+   with the License.  You may obtain a copy of the License at
+     http://www.apache.org/licenses/LICENSE-2.0
+   Unless required by applicable law or agreed to in writing,
+   software distributed under the License is distributed on an
+   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+   KIND, either express or implied.  See the License for the
+   specific language governing permissions and limitations
+   under the License.
+-->
+
+# Kogito Jobs Service Webapp
+
+This package contains the webapp for the Jobs Service endpoint
+
+## Build
+
+- The image name and tags can be customized by setting the following environment variables:
+
+  ```bash
+  export KOGITO_JOBS_SERVICE_WEBAPP_title=<title>
+  export KOGITO_JOBS_SERVICE_WEBAPP_logo=<logo>
+  export KOGITO_JOBS_SERVICE_WEBAPP_docLinkHref=<docLinkHref>
+  export KOGITO_JOBS_SERVICE_WEBAPP_docLinkText=<docLinkText>
+  export SONATAFLOW_JOBS_SERVICE_WEBAPP_docLinkHref=<docLinkHref>
+  export SONATAFLOW_JOBS_SERVICE_WEBAPP_docLinkText=<docLinkText>
+  ```
+
+  > Default values can be found [here](./env/index.js).
+
+- After optionally setting up the environment variables, run the following in the root folder of the repository to build the package:
+
+  ```bash
+  pnpm -F @kie-tools/kogito-jobs-service-webapp... build:prod
+  ```
+
+---
+
+Apache KIE (incubating) is an effort undergoing incubation at The Apache Software
+Foundation (ASF), sponsored by the name of Apache Incubator. Incubation is
+required of all newly accepted projects until a further review indicates that
+the infrastructure, communications, and decision making process have stabilized
+in a manner consistent with other successful ASF projects. While incubation
+status is not necessarily a reflection of the completeness or stability of the
+code, it does indicate that the project has yet to be fully endorsed by the ASF.
+
+Some of the incubating project’s releases may not be fully compliant with ASF
+policy. For example, releases may have incomplete or un-reviewed licensing
+conditions. What follows is a list of known issues the project is currently
+aware of (note that this list, by definition, is likely to be incomplete):
+
+- Hibernate, an LGPL project, is being used. Hibernate is in the process of
+  relicensing to ASL v2
+- Some files, particularly test files, and those not supporting comments, may
+  be missing the ASF Licensing Header
+
+If you are planning to incorporate this work into your product/project, please
+be aware that you will need to conduct a thorough licensing review to determine
+the overall implications of including this work. For the current status of this
+project through the Apache Incubator visit:
+https://incubator.apache.org/projects/kie.html
diff --git a/packages/kogito-jobs-service-webapp/env/index.js b/packages/kogito-jobs-service-webapp/env/index.js
index 2344426..6d9f447 100644
--- a/packages/kogito-jobs-service-webapp/env/index.js
+++ b/packages/kogito-jobs-service-webapp/env/index.js
@@ -17,16 +17,51 @@
  * under the License.
  */
 
-const { varsWithName, composeEnv } = require("@kie-tools-scripts/build-env");
+const { varsWithName, getOrDefault, composeEnv } = require("@kie-tools-scripts/build-env");
 
 module.exports = composeEnv([require("@kie-tools/root-env/env")], {
-  vars: varsWithName({}),
+  vars: varsWithName({
+    KOGITO_JOBS_SERVICE_WEBAPP_title: {
+      default: "KOGITO JOBS SERVICE",
+      description: "Application title",
+    },
+    KOGITO_JOBS_SERVICE_WEBAPP_logo: {
+      default: "favicon.svg",
+      description: "Path to logo image",
+    },
+    KOGITO_JOBS_SERVICE_WEBAPP_docLinkHref: {
+      default: "https://docs.kogito.kie.org/latest/html_single/#con-jobs-service_kogito-configuring",
+      description: "Documentation link URL",
+    },
+    KOGITO_JOBS_SERVICE_WEBAPP_docLinkText: {
+      default: "Kogito Jobs Service docs",
+      description: "Documentation link text",
+    },
+    SONATAFLOW_JOBS_SERVICE_WEBAPP_docLinkHref: {
+      default: "https://sonataflow.org/serverlessworkflow/latest/job-services/core-concepts.html",
+      description: "Documentation link URL",
+    },
+    SONATAFLOW_JOBS_SERVICE_WEBAPP_docLinkText: {
+      default: "SonataFlow Jobs Service docs",
+      description: "Documentation link text",
+    },
+  }),
   get env() {
     return {
-      jobsServiceWebapp: {
+      kogitoJobsServiceWebapp: {
         dev: {
           port: 9028,
         },
+        title: getOrDefault(this.vars.KOGITO_JOBS_SERVICE_WEBAPP_title),
+        logo: getOrDefault(this.vars.KOGITO_JOBS_SERVICE_WEBAPP_logo),
+        docLinkKogito: {
+          href: getOrDefault(this.vars.KOGITO_JOBS_SERVICE_WEBAPP_docLinkHref),
+          text: getOrDefault(this.vars.KOGITO_JOBS_SERVICE_WEBAPP_docLinkText),
+        },
+        docLinkSonataflow: {
+          href: getOrDefault(this.vars.SONATAFLOW_JOBS_SERVICE_WEBAPP_docLinkHref),
+          text: getOrDefault(this.vars.SONATAFLOW_JOBS_SERVICE_WEBAPP_docLinkText),
+        },
       },
     };
   },
diff --git a/packages/kogito-jobs-service-webapp/package.json b/packages/kogito-jobs-service-webapp/package.json
index c663430..51e82eb 100644
--- a/packages/kogito-jobs-service-webapp/package.json
+++ b/packages/kogito-jobs-service-webapp/package.json
@@ -25,6 +25,8 @@
     "@kie-tools-core/webpack-base": "workspace:*",
     "@kie-tools/root-env": "workspace:*",
     "copy-webpack-plugin": "^11.0.0",
+    "html-replace-webpack-plugin": "^2.6.0",
+    "html-webpack-plugin": "^5.3.2",
     "jest": "^29.7.0",
     "rimraf": "^3.0.2",
     "ts-node": "^10.9.2",
diff --git a/packages/kogito-jobs-service-webapp/src/index.html b/packages/kogito-jobs-service-webapp/src/index.html
index 98fb32f..cf394ac 100644
--- a/packages/kogito-jobs-service-webapp/src/index.html
+++ b/packages/kogito-jobs-service-webapp/src/index.html
@@ -22,16 +22,16 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <title>Jobs Service Webapp</title>
+    <title>${KOGITO_JOBS_SERVICE_WEBAPP_TITLE}</title>
     <link rel="stylesheet" href="styles.css" />
-    <link rel="shortcut icon" type="image/x-icon" href="favicon.svg" />
+    <link rel="shortcut icon" type="image/x-icon" href="${KOGITO_JOBS_SERVICE_WEBAPP_LOGO}" />
   </head>
   <body>
     <div class="maindiv">
       <div class="container">
         <div class="logo" style="display: flex; justify-content: center">
-          <img src="favicon.svg" alt="KIE Logo" />
-          <h1>Jobs Service</h1>
+          <img src="${KOGITO_JOBS_SERVICE_WEBAPP_LOGO}" alt="KIE Logo" />
+          <h1>${KOGITO_JOBS_SERVICE_WEBAPP_TITLE}</h1>
         </div>
         <div>
           <h4>Your Jobs service is up and working!</h4>
@@ -43,19 +43,13 @@
         </p>
         <div class="linkbutton">
           <div>
-            <a
-              href="https://kiegroup.github.io/kogito-docs/serverlessworkflow/latest/job-services/core-concepts.html"
-              class="btn"
-              target="_blank"
-              >SonataFlow Jobs Service docs</a
+            <a href="${SONATAFLOW_JOBS_SERVICE_WEBAPP_DOCLINK_HREF}" class="btn" target="_blank"
+              >${SONATAFLOW_JOBS_SERVICE_WEBAPP_DOCLINK_TEXT}</a
             >
           </div>
           <div>
-            <a
-              href="https://docs.kogito.kie.org/latest/html_single/#con-jobs-service_kogito-configuring"
-              class="btn"
-              target="_blank"
-              >Kogito Jobs Service docs</a
+            <a href="${KOGITO_JOBS_SERVICE_WEBAPP_DOCLINK_HREF}" class="btn" target="_blank"
+              >${KOGITO_JOBS_SERVICE_WEBAPP_DOCLINK_TEXT}</a
             >
           </div>
         </div>
diff --git a/packages/kogito-jobs-service-webapp/webpack.config.js b/packages/kogito-jobs-service-webapp/webpack.config.js
index 86e0614..7c08648 100644
--- a/packages/kogito-jobs-service-webapp/webpack.config.js
+++ b/packages/kogito-jobs-service-webapp/webpack.config.js
@@ -17,10 +17,13 @@
  * under the License.
  */
 
+const path = require("path");
 const CopyPlugin = require("copy-webpack-plugin");
 const { merge } = require("webpack-merge");
 const common = require("@kie-tools-core/webpack-base/webpack.common.config");
 const { env } = require("./env");
+const HtmlReplaceWebpackPlugin = require("html-replace-webpack-plugin");
+const HtmlWebpackPlugin = require("html-webpack-plugin");
 
 module.exports = async (webpackEnv) =>
   merge(common(webpackEnv), {
@@ -28,17 +31,47 @@
     plugins: [
       new CopyPlugin({
         patterns: [
-          { from: "./src/index.html", to: "./index.html" },
           { from: "./src/styles.css", to: "./styles.css" },
           { from: "./static/favicon.svg", to: "./favicon.svg" },
         ],
       }),
+      new HtmlWebpackPlugin({
+        template: path.resolve(__dirname, "src/index.html"),
+        filename: "index.html",
+        chunks: ["app"],
+      }),
+      new HtmlReplaceWebpackPlugin([
+        {
+          pattern: /\${KOGITO_JOBS_SERVICE_WEBAPP_TITLE}/g,
+          replacement: () => env.kogitoJobsServiceWebapp.title ?? "",
+        },
+        {
+          pattern: /\${KOGITO_JOBS_SERVICE_WEBAPP_LOGO}/g,
+          replacement: () => env.kogitoJobsServiceWebapp.logo ?? "",
+        },
+        {
+          pattern: /\${KOGITO_JOBS_SERVICE_WEBAPP_DOCLINK_HREF}/g,
+          replacement: () => env.kogitoJobsServiceWebapp.docLinkKogito.href ?? "",
+        },
+        {
+          pattern: /\${KOGITO_JOBS_SERVICE_WEBAPP_DOCLINK_TEXT}/g,
+          replacement: () => env.kogitoJobsServiceWebapp.docLinkKogito.text ?? "",
+        },
+        {
+          pattern: /\${SONATAFLOW_JOBS_SERVICE_WEBAPP_DOCLINK_HREF}/g,
+          replacement: () => env.kogitoJobsServiceWebapp.docLinkSonataflow.href ?? "",
+        },
+        {
+          pattern: /\${SONATAFLOW_JOBS_SERVICE_WEBAPP_DOCLINK_TEXT}/g,
+          replacement: () => env.kogitoJobsServiceWebapp.docLinkSonataflow.text ?? "",
+        },
+      ]),
     ],
     ignoreWarnings: [/Failed to parse source map/],
     devServer: {
       static: {
         directory: "./dist",
       },
-      port: env.jobsServiceWebapp.dev.port,
+      port: env.kogitoJobsServiceWebapp.dev.port,
     },
   });
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f5591ce..2260a7c 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -62,6 +62,9 @@
       '@types/node':
         specifier: ^22.10.7
         version: 22.13.10
+      html-webpack-plugin:
+        specifier: ^5.3.2
+        version: 5.6.4(webpack@5.94.0)
       husky:
         specifier: ^6.0.0
         version: 6.0.0
@@ -890,7 +893,7 @@
     devDependencies:
       '@angular-devkit/build-angular':
         specifier: ^18.1.2
-        version: 18.1.3(@angular/compiler-cli@18.1.3(@angular/compiler@18.1.3(@angular/core@18.1.3(rxjs@7.8.1)(zone.js@0.14.8)))(typescript@5.5.3))(@types/node@22.13.10)(chokidar@3.6.0)(html-webpack-plugin@5.5.3(webpack@5.94.0))(jest-environment-jsdom@29.7.0)(jest@29.7.0(@types/node@22.13.10))(karma@6.4.2)(stylus@0.59.0)(typescript@5.5.3)
+        version: 18.1.3(@angular/compiler-cli@18.1.3(@angular/compiler@18.1.3(@angular/core@18.1.3(rxjs@7.8.1)(zone.js@0.14.8)))(typescript@5.5.3))(@types/node@22.13.10)(chokidar@3.6.0)(html-webpack-plugin@5.6.4(webpack@5.94.0))(jest-environment-jsdom@29.7.0)(jest@29.7.0(@types/node@22.13.10))(karma@6.4.2)(stylus@0.59.0)(typescript@5.5.3)
       '@angular/cli':
         specifier: ^18.1.2
         version: 18.1.3(chokidar@3.6.0)
@@ -7480,6 +7483,12 @@
       copy-webpack-plugin:
         specifier: ^11.0.0
         version: 11.0.0(webpack@5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0))
+      html-replace-webpack-plugin:
+        specifier: ^2.6.0
+        version: 2.6.0
+      html-webpack-plugin:
+        specifier: ^5.3.2
+        version: 5.3.2(webpack@5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0))
       jest:
         specifier: ^29.7.0
         version: 29.7.0(@types/node@22.13.10)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.3.92)(@types/node@22.13.10)(typescript@5.5.3))
@@ -7699,6 +7708,12 @@
       copy-webpack-plugin:
         specifier: ^11.0.0
         version: 11.0.0(webpack@5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0))
+      html-replace-webpack-plugin:
+        specifier: ^2.6.0
+        version: 2.6.0
+      html-webpack-plugin:
+        specifier: ^5.3.2
+        version: 5.3.2(webpack@5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0))
       jest:
         specifier: ^29.7.0
         version: 29.7.0(@types/node@22.13.10)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.3.92)(@types/node@22.13.10)(typescript@5.5.3))
@@ -11051,7 +11066,7 @@
         version: 2.4.1
       csp-html-webpack-plugin:
         specifier: ^5.1.0
-        version: 5.1.0(html-webpack-plugin@5.5.3(webpack@5.94.0(webpack-cli@4.10.0)))(webpack@5.94.0(webpack-cli@4.10.0))
+        version: 5.1.0(html-webpack-plugin@5.6.4(webpack@5.94.0(webpack-cli@4.10.0)))(webpack@5.94.0(webpack-cli@4.10.0))
       monaco-editor-webpack-plugin:
         specifier: ^7.0.1
         version: 7.0.1(monaco-editor@0.39.0)(monaco-yaml@4.0.4(monaco-editor@0.39.0))(webpack@5.94.0(webpack-cli@4.10.0))
@@ -25087,6 +25102,18 @@
     peerDependencies:
       webpack: ^5.20.0
 
+  html-webpack-plugin@5.6.4:
+    resolution: {integrity: sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==}
+    engines: {node: '>=10.13.0'}
+    peerDependencies:
+      '@rspack/core': 0.x || 1.x
+      webpack: ^5.20.0
+    peerDependenciesMeta:
+      '@rspack/core':
+        optional: true
+      webpack:
+        optional: true
+
   htmlparser2@6.1.0:
     resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==}
 
@@ -31730,7 +31757,7 @@
       - utf-8-validate
       - webpack-cli
 
-  '@angular-devkit/build-angular@18.1.3(@angular/compiler-cli@18.1.3(@angular/compiler@18.1.3(@angular/core@18.1.3(rxjs@7.8.1)(zone.js@0.14.8)))(typescript@5.5.3))(@types/node@22.13.10)(chokidar@3.6.0)(html-webpack-plugin@5.5.3(webpack@5.94.0))(jest-environment-jsdom@29.7.0)(jest@29.7.0(@types/node@22.13.10))(karma@6.4.2)(stylus@0.59.0)(typescript@5.5.3)':
+  '@angular-devkit/build-angular@18.1.3(@angular/compiler-cli@18.1.3(@angular/compiler@18.1.3(@angular/core@18.1.3(rxjs@7.8.1)(zone.js@0.14.8)))(typescript@5.5.3))(@types/node@22.13.10)(chokidar@3.6.0)(html-webpack-plugin@5.6.4(webpack@5.94.0))(jest-environment-jsdom@29.7.0)(jest@29.7.0(@types/node@22.13.10))(karma@6.4.2)(stylus@0.59.0)(typescript@5.5.3)':
     dependencies:
       '@ampproject/remapping': 2.3.0
       '@angular-devkit/architect': 0.1801.3(chokidar@3.6.0)
@@ -31796,7 +31823,7 @@
       webpack-dev-middleware: 7.2.1(webpack@5.92.1(esbuild@0.21.5))
       webpack-dev-server: 5.0.4(webpack@5.92.1(esbuild@0.21.5))
       webpack-merge: 5.10.0
-      webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.5.3(webpack@5.94.0))(webpack@5.92.1(esbuild@0.21.5))
+      webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.6.4(webpack@5.94.0))(webpack@5.92.1(esbuild@0.21.5))
     optionalDependencies:
       esbuild: 0.21.5
       jest: 29.7.0(@types/node@22.13.10)
@@ -42390,7 +42417,7 @@
       express: 4.21.2
       fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.5.3)(webpack@5.94.0(@swc/core@1.3.92)(esbuild@0.18.20))
       fs-extra: 11.1.1
-      html-webpack-plugin: 5.5.3(webpack@5.94.0(@swc/core@1.3.92)(esbuild@0.18.20))
+      html-webpack-plugin: 5.6.4(webpack@5.94.0(@swc/core@1.3.92)(esbuild@0.18.20))
       path-browserify: 1.0.1
       process: 0.11.10
       react: 17.0.2
@@ -42410,6 +42437,7 @@
     optionalDependencies:
       typescript: 5.5.3
     transitivePeerDependencies:
+      - '@rspack/core'
       - '@swc/helpers'
       - '@types/react'
       - '@types/react-dom'
@@ -42450,7 +42478,7 @@
       express: 4.21.2
       fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.5.3)(webpack@5.94.0(@swc/core@1.3.92)(esbuild@0.18.20)(webpack-cli@4.10.0))
       fs-extra: 11.1.1
-      html-webpack-plugin: 5.5.3(webpack@5.94.0(@swc/core@1.3.92)(esbuild@0.18.20)(webpack-cli@4.10.0))
+      html-webpack-plugin: 5.6.4(webpack@5.94.0(@swc/core@1.3.92)(esbuild@0.18.20)(webpack-cli@4.10.0))
       path-browserify: 1.0.1
       process: 0.11.10
       react: 17.0.2
@@ -42470,6 +42498,7 @@
     optionalDependencies:
       typescript: 5.5.3
     transitivePeerDependencies:
+      - '@rspack/core'
       - '@swc/helpers'
       - '@types/react'
       - '@types/react-dom'
@@ -42503,7 +42532,7 @@
       express: 4.21.2
       fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.5.3)(webpack@5.94.0(@swc/core@1.3.92)(esbuild@0.18.20)(webpack-cli@4.10.0))
       fs-extra: 11.1.1
-      html-webpack-plugin: 5.5.3(webpack@5.94.0(@swc/core@1.3.92)(esbuild@0.18.20)(webpack-cli@4.10.0))
+      html-webpack-plugin: 5.6.4(webpack@5.94.0(@swc/core@1.3.92)(esbuild@0.18.20)(webpack-cli@4.10.0))
       magic-string: 0.30.7
       path-browserify: 1.0.1
       process: 0.11.10
@@ -42522,6 +42551,7 @@
     optionalDependencies:
       typescript: 5.5.3
     transitivePeerDependencies:
+      - '@rspack/core'
       - '@swc/helpers'
       - encoding
       - esbuild
@@ -42553,7 +42583,7 @@
       express: 4.21.2
       fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.5.3)(webpack@5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@4.15.1)(webpack@5.94.0)))
       fs-extra: 11.1.1
-      html-webpack-plugin: 5.5.3(webpack@5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@4.15.1)(webpack@5.94.0)))
+      html-webpack-plugin: 5.6.4(webpack@5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@4.15.1)(webpack@5.94.0)))
       magic-string: 0.30.7
       path-browserify: 1.0.1
       process: 0.11.10
@@ -42572,6 +42602,7 @@
     optionalDependencies:
       typescript: 5.5.3
     transitivePeerDependencies:
+      - '@rspack/core'
       - '@swc/helpers'
       - encoding
       - esbuild
@@ -42603,7 +42634,7 @@
       express: 4.21.2
       fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.5.3)(webpack@5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0(webpack-dev-server@4.15.1)(webpack@5.94.0)))
       fs-extra: 11.1.1
-      html-webpack-plugin: 5.5.3(webpack@5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0(webpack-dev-server@4.15.1)(webpack@5.94.0)))
+      html-webpack-plugin: 5.6.4(webpack@5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0(webpack-dev-server@4.15.1)(webpack@5.94.0)))
       magic-string: 0.30.7
       path-browserify: 1.0.1
       process: 0.11.10
@@ -42622,6 +42653,7 @@
     optionalDependencies:
       typescript: 5.5.3
     transitivePeerDependencies:
+      - '@rspack/core'
       - '@swc/helpers'
       - encoding
       - esbuild
@@ -43591,6 +43623,7 @@
       '@babel/core': 7.16.12
       typescript: 5.5.3
     transitivePeerDependencies:
+      - '@rspack/core'
       - '@swc/core'
       - '@swc/helpers'
       - '@types/react'
@@ -43619,6 +43652,7 @@
       '@babel/core': 7.23.9
       typescript: 5.5.3
     transitivePeerDependencies:
+      - '@rspack/core'
       - '@swc/core'
       - '@swc/helpers'
       - '@types/react'
@@ -43647,6 +43681,7 @@
       '@babel/core': 7.18.10
       typescript: 5.5.3
     transitivePeerDependencies:
+      - '@rspack/core'
       - '@swc/core'
       - '@swc/helpers'
       - '@types/webpack'
@@ -43673,6 +43708,7 @@
       '@babel/core': 7.23.0
       typescript: 5.5.3
     transitivePeerDependencies:
+      - '@rspack/core'
       - '@swc/core'
       - '@swc/helpers'
       - '@types/webpack'
@@ -43699,6 +43735,7 @@
       '@babel/core': 7.23.9
       typescript: 5.5.3
     transitivePeerDependencies:
+      - '@rspack/core'
       - '@swc/core'
       - '@swc/helpers'
       - '@types/webpack'
@@ -45155,9 +45192,9 @@
       webpack: 5.94.0(webpack-cli@4.10.0)
       webpack-cli: 4.10.0(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@4.15.1)(webpack@5.94.0)
 
-  '@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0(webpack-dev-server@4.15.1)(webpack@5.94.0))(webpack@5.94.0(webpack-cli@4.10.0))':
+  '@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0(webpack-dev-server@4.15.1)(webpack@5.94.0))(webpack@5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0))':
     dependencies:
-      webpack: 5.94.0(webpack-cli@4.10.0)
+      webpack: 5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0)
       webpack-cli: 4.10.0(webpack-dev-server@4.15.1)(webpack@5.94.0)
 
   '@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0(webpack@5.94.0))(webpack@5.94.0(webpack-cli@4.10.0))':
@@ -48184,10 +48221,10 @@
 
   crypto-random-string@2.0.0: {}
 
-  csp-html-webpack-plugin@5.1.0(html-webpack-plugin@5.5.3(webpack@5.94.0(webpack-cli@4.10.0)))(webpack@5.94.0(webpack-cli@4.10.0)):
+  csp-html-webpack-plugin@5.1.0(html-webpack-plugin@5.6.4(webpack@5.94.0(webpack-cli@4.10.0)))(webpack@5.94.0(webpack-cli@4.10.0)):
     dependencies:
       cheerio: 1.0.0-rc.10
-      html-webpack-plugin: 5.5.3(webpack@5.94.0(webpack-cli@4.10.0))
+      html-webpack-plugin: 5.6.4(webpack@5.94.0(webpack-cli@4.10.0))
       lodash: 4.17.21
       webpack: 5.94.0(webpack-cli@4.10.0)
 
@@ -51081,7 +51118,7 @@
       html-minifier-terser: 5.1.1
       lodash: 4.17.21
       pretty-error: 3.0.4
-      tapable: 2.2.0
+      tapable: 2.2.1
       webpack: 5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0)
 
   html-webpack-plugin@5.3.2(webpack@5.94.0(webpack-cli@4.10.0)):
@@ -51093,42 +51130,6 @@
       tapable: 2.2.0
       webpack: 5.94.0(webpack-cli@4.10.0)
 
-  html-webpack-plugin@5.5.3(webpack@5.94.0(@swc/core@1.3.92)(esbuild@0.18.20)(webpack-cli@4.10.0)):
-    dependencies:
-      '@types/html-minifier-terser': 6.1.0
-      html-minifier-terser: 6.1.0
-      lodash: 4.17.21
-      pretty-error: 4.0.0
-      tapable: 2.2.1
-      webpack: 5.94.0(@swc/core@1.3.92)(esbuild@0.18.20)(webpack-cli@4.10.0)
-
-  html-webpack-plugin@5.5.3(webpack@5.94.0(@swc/core@1.3.92)(esbuild@0.18.20)):
-    dependencies:
-      '@types/html-minifier-terser': 6.1.0
-      html-minifier-terser: 6.1.0
-      lodash: 4.17.21
-      pretty-error: 4.0.0
-      tapable: 2.2.1
-      webpack: 5.94.0(@swc/core@1.3.92)(esbuild@0.18.20)
-
-  html-webpack-plugin@5.5.3(webpack@5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@4.15.1)(webpack@5.94.0))):
-    dependencies:
-      '@types/html-minifier-terser': 6.1.0
-      html-minifier-terser: 6.1.0
-      lodash: 4.17.21
-      pretty-error: 4.0.0
-      tapable: 2.2.1
-      webpack: 5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@4.15.1)(webpack@5.94.0))
-
-  html-webpack-plugin@5.5.3(webpack@5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0(webpack-dev-server@4.15.1)(webpack@5.94.0))):
-    dependencies:
-      '@types/html-minifier-terser': 6.1.0
-      html-minifier-terser: 6.1.0
-      lodash: 4.17.21
-      pretty-error: 4.0.0
-      tapable: 2.2.1
-      webpack: 5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0(webpack-dev-server@4.15.1)(webpack@5.94.0))
-
   html-webpack-plugin@5.5.3(webpack@5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0)):
     dependencies:
       '@types/html-minifier-terser': 6.1.0
@@ -51157,6 +51158,66 @@
       webpack: 5.94.0
     optional: true
 
+  html-webpack-plugin@5.6.4(webpack@5.94.0(@swc/core@1.3.92)(esbuild@0.18.20)(webpack-cli@4.10.0)):
+    dependencies:
+      '@types/html-minifier-terser': 6.1.0
+      html-minifier-terser: 6.1.0
+      lodash: 4.17.21
+      pretty-error: 4.0.0
+      tapable: 2.2.1
+    optionalDependencies:
+      webpack: 5.94.0(@swc/core@1.3.92)(esbuild@0.18.20)(webpack-cli@4.10.0)
+
+  html-webpack-plugin@5.6.4(webpack@5.94.0(@swc/core@1.3.92)(esbuild@0.18.20)):
+    dependencies:
+      '@types/html-minifier-terser': 6.1.0
+      html-minifier-terser: 6.1.0
+      lodash: 4.17.21
+      pretty-error: 4.0.0
+      tapable: 2.2.1
+    optionalDependencies:
+      webpack: 5.94.0(@swc/core@1.3.92)(esbuild@0.18.20)
+
+  html-webpack-plugin@5.6.4(webpack@5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@4.15.1)(webpack@5.94.0))):
+    dependencies:
+      '@types/html-minifier-terser': 6.1.0
+      html-minifier-terser: 6.1.0
+      lodash: 4.17.21
+      pretty-error: 4.0.0
+      tapable: 2.2.1
+    optionalDependencies:
+      webpack: 5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@4.15.1)(webpack@5.94.0))
+
+  html-webpack-plugin@5.6.4(webpack@5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0(webpack-dev-server@4.15.1)(webpack@5.94.0))):
+    dependencies:
+      '@types/html-minifier-terser': 6.1.0
+      html-minifier-terser: 6.1.0
+      lodash: 4.17.21
+      pretty-error: 4.0.0
+      tapable: 2.2.1
+    optionalDependencies:
+      webpack: 5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0(webpack-dev-server@4.15.1)(webpack@5.94.0))
+
+  html-webpack-plugin@5.6.4(webpack@5.94.0(webpack-cli@4.10.0)):
+    dependencies:
+      '@types/html-minifier-terser': 6.1.0
+      html-minifier-terser: 6.1.0
+      lodash: 4.17.21
+      pretty-error: 4.0.0
+      tapable: 2.2.1
+    optionalDependencies:
+      webpack: 5.94.0(webpack-cli@4.10.0)
+
+  html-webpack-plugin@5.6.4(webpack@5.94.0):
+    dependencies:
+      '@types/html-minifier-terser': 6.1.0
+      html-minifier-terser: 6.1.0
+      lodash: 4.17.21
+      pretty-error: 4.0.0
+      tapable: 2.2.1
+    optionalDependencies:
+      webpack: 5.94.0
+
   htmlparser2@6.1.0:
     dependencies:
       domelementtype: 2.3.0
@@ -59165,7 +59226,7 @@
   webpack-cli@4.10.0(webpack-dev-server@4.15.1)(webpack@5.94.0):
     dependencies:
       '@discoveryjs/json-ext': 0.5.7
-      '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0(webpack-dev-server@4.15.1)(webpack@5.94.0))(webpack@5.94.0(webpack-cli@4.10.0))
+      '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0(webpack-dev-server@4.15.1)(webpack@5.94.0))(webpack@5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0))
       '@webpack-cli/info': 1.5.0(webpack-cli@4.10.0(webpack-dev-server@4.15.1)(webpack@5.94.0))
       '@webpack-cli/serve': 1.7.0(webpack-cli@4.10.0(webpack-dev-server@4.15.1)(webpack@5.94.0))(webpack-dev-server@4.15.1(webpack-cli@4.10.0)(webpack@5.94.0))
       colorette: 2.0.20
@@ -59175,7 +59236,7 @@
       import-local: 3.0.2
       interpret: 2.2.0
       rechoir: 0.7.0
-      webpack: 5.94.0(webpack-cli@4.10.0)
+      webpack: 5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0)
       webpack-merge: 5.10.0
     optionalDependencies:
       webpack-dev-server: 4.15.1(webpack-cli@4.10.0)(webpack@5.94.0)
@@ -59196,14 +59257,14 @@
       webpack: 5.94.0(webpack-cli@4.10.0)
       webpack-merge: 5.10.0
 
-  webpack-dev-middleware@5.3.3(webpack@5.94.0(webpack-cli@4.10.0)):
+  webpack-dev-middleware@5.3.3(webpack@5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0)):
     dependencies:
       colorette: 2.0.20
       memfs: 3.5.1
       mime-types: 2.1.35
       range-parser: 1.2.1
       schema-utils: 4.2.0
-      webpack: 5.94.0(webpack-cli@4.10.0)
+      webpack: 5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0)
 
   webpack-dev-middleware@5.3.3(webpack@5.94.0):
     dependencies:
@@ -59295,10 +59356,10 @@
       serve-index: 1.9.1
       sockjs: 0.3.24
       spdy: 4.0.2
-      webpack-dev-middleware: 5.3.3(webpack@5.94.0(webpack-cli@4.10.0))
+      webpack-dev-middleware: 5.3.3(webpack@5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0))
       ws: 8.18.0
     optionalDependencies:
-      webpack: 5.94.0(webpack-cli@4.10.0)
+      webpack: 5.94.0(@swc/core@1.3.92)(webpack-cli@4.10.0)
       webpack-cli: 4.10.0(webpack-dev-server@4.15.1)(webpack@5.94.0)
     transitivePeerDependencies:
       - bufferutil
@@ -59418,6 +59479,13 @@
     optionalDependencies:
       html-webpack-plugin: 5.5.3(webpack@5.94.0)
 
+  webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.6.4(webpack@5.94.0))(webpack@5.92.1(esbuild@0.21.5)):
+    dependencies:
+      typed-assert: 1.0.8
+      webpack: 5.92.1(esbuild@0.21.5)
+    optionalDependencies:
+      html-webpack-plugin: 5.6.4(webpack@5.94.0)
+
   webpack-virtual-modules@0.5.0: {}
 
   webpack@5.92.1(esbuild@0.21.5):
@@ -59459,7 +59527,7 @@
       '@webassemblyjs/wasm-parser': 1.12.1
       acorn: 8.12.1
       acorn-import-attributes: 1.9.5(acorn@8.12.1)
-      browserslist: 4.23.3
+      browserslist: 4.24.4
       chrome-trace-event: 1.0.4
       enhanced-resolve: 5.17.1
       es-module-lexer: 1.5.4