diff --git a/modules/_node-scripts/bundle/cssLoad/writeCSSExportsLoaderModules.mjs b/modules/_node-scripts/bundle/cssLoad/writeCSSExportsLoaderModules.mjs
index 994aca6da2f88f..beec4df58a640f 100644
--- a/modules/_node-scripts/bundle/cssLoad/writeCSSExportsLoaderModules.mjs
+++ b/modules/_node-scripts/bundle/cssLoad/writeCSSExportsLoaderModules.mjs
@@ -6,8 +6,13 @@
import fs from 'fs/promises';
import path from 'path';
-import {BUILD_NPM_EXPORTS_PATH} from '../../util/constants.mjs';
+import {
+ BUILD_CSS_EXPORTS_PATH,
+ BUILD_NPM_EXPORTS_PATH,
+} from '../../util/constants.mjs';
import getFlatName from '../../util/getFlatName.mjs';
+import calculateFileHash from '../util/calculateFileHash.mjs';
+import extractFileHash from '../util/extractFileHash.mjs';
import getCSSLoadJavaScript from '../util/getCSSLoadJavaScript.mjs';
export default async function writeCSSExportsLoaderModules(
@@ -30,17 +35,31 @@ export default async function writeCSSExportsLoaderModules(
async function writeCSSExportLoaderModule(webContextPath, moduleName) {
const flatModuleName = getFlatName(moduleName);
+ const baseFlatModuleName = flatModuleName.substring(
+ 0,
+ flatModuleName.length - 4
+ );
+
+ const cssFiles = await fs.readdir(path.join(BUILD_CSS_EXPORTS_PATH));
+
+ const cssFile = cssFiles.find((cssFile) =>
+ cssFile.startsWith(`${baseFlatModuleName}.(`)
+ );
+
+ const cssFileHash = extractFileHash(cssFile);
+
+ const source = getCSSLoadJavaScript(
+ webContextPath,
+ `__liferay__/css/${baseFlatModuleName}.(${cssFileHash}).css`
+ );
+
+ const hash = await calculateFileHash(source);
+
const cssLoaderPath = path.join(
BUILD_NPM_EXPORTS_PATH,
- `${flatModuleName}.js`
+ `${flatModuleName}.(${hash}).js`
);
await fs.mkdir(path.dirname(cssLoaderPath), {recursive: true});
- await fs.writeFile(
- cssLoaderPath,
- getCSSLoadJavaScript(
- webContextPath,
- `__liferay__/css/${flatModuleName}`
- )
- );
+ await fs.writeFile(cssLoaderPath, source);
}
diff --git a/modules/_node-scripts/bundle/esbuild/bundleCSSExports.mjs b/modules/_node-scripts/bundle/esbuild/bundleCSSExports.mjs
index 394a4b8ca745aa..c71cc9a99eeefd 100644
--- a/modules/_node-scripts/bundle/esbuild/bundleCSSExports.mjs
+++ b/modules/_node-scripts/bundle/esbuild/bundleCSSExports.mjs
@@ -30,6 +30,7 @@ async function bundle(moduleName) {
const entryPoint = getEntryPoint(moduleName);
const esbuildConfig = {
+ entryNames: '[dir]/[name].([hash])',
entryPoints: [entryPoint],
loader: {
'.png': 'empty',
diff --git a/modules/_node-scripts/bundle/esbuild/bundleJavaScriptExports.mjs b/modules/_node-scripts/bundle/esbuild/bundleJavaScriptExports.mjs
index dbc1707a59933c..9818a77ae2b887 100644
--- a/modules/_node-scripts/bundle/esbuild/bundleJavaScriptExports.mjs
+++ b/modules/_node-scripts/bundle/esbuild/bundleJavaScriptExports.mjs
@@ -57,6 +57,7 @@ async function bundle(
const esbuildConfig = {
alias: projectAlias,
bundle: true,
+ entryNames: '[dir]/[name].([hash])',
entryPoints: [entryPoint],
format: 'esm',
outdir: BUILD_MAIN_EXPORTS_PATH,
@@ -103,14 +104,17 @@ async function bundle(
const flatModuleName = getFlatName(moduleName);
- await runEsbuild(esbuildConfig, flatModuleName);
+ const {metafile} = await runEsbuild(esbuildConfig, flatModuleName);
+ const {outputs} = metafile;
- await relocateSourcemap(
- path.join(
- BUILD_MAIN_EXPORTS_PATH,
- 'exports',
- `${flatModuleName}.js.map`
- ),
- projectWebContextPath
- );
+ await Promise.all([
+ ...Object.keys(outputs).map(async (output) => {
+ if (output.endsWith('.map')) {
+ return relocateSourcemap(
+ path.join(output),
+ projectWebContextPath
+ );
+ }
+ }),
+ ]);
}
diff --git a/modules/_node-scripts/bundle/esbuild/bundleJavaScriptMain.mjs b/modules/_node-scripts/bundle/esbuild/bundleJavaScriptMain.mjs
index 2f0b9fa8d7afad..6b663512790730 100644
--- a/modules/_node-scripts/bundle/esbuild/bundleJavaScriptMain.mjs
+++ b/modules/_node-scripts/bundle/esbuild/bundleJavaScriptMain.mjs
@@ -41,6 +41,7 @@ export default async function bundleJavaScriptMain(
const esbuildConfig = {
alias: projectAlias,
bundle: true,
+ entryNames: '[dir]/[name].([hash])',
entryPoints: [
...Object.keys(submodules).map((submoduleName) => ({
in: path.resolve(submodules[submoduleName]),
@@ -97,19 +98,18 @@ export default async function bundleJavaScriptMain(
);
}
- await runEsbuild(esbuildConfig, 'main');
+ const {metafile} = await runEsbuild(esbuildConfig, 'main');
+ const {outputs} = metafile;
await Promise.all([
- relocateSourcemap(
- path.join(BUILD_MAIN_EXPORTS_PATH, 'index.js.map'),
- projectWebContextPath
- ),
- ...Object.keys(submodules).map((submodule) =>
- relocateSourcemap(
- path.join(BUILD_MAIN_EXPORTS_PATH, `${submodule}.js.map`),
- projectWebContextPath
- )
- ),
+ ...Object.keys(outputs).map(async (output) => {
+ if (output.endsWith('.map')) {
+ return relocateSourcemap(
+ path.join(output),
+ projectWebContextPath
+ );
+ }
+ }),
writeLanguageJSON(languageJSON),
]);
}
diff --git a/modules/_node-scripts/bundle/esbuild/plugins/getScssLoaderPlugin.mjs b/modules/_node-scripts/bundle/esbuild/plugins/getScssLoaderPlugin.mjs
index c831b8a26c4092..6c3f63816730e6 100644
--- a/modules/_node-scripts/bundle/esbuild/plugins/getScssLoaderPlugin.mjs
+++ b/modules/_node-scripts/bundle/esbuild/plugins/getScssLoaderPlugin.mjs
@@ -29,6 +29,8 @@ export default function getScssLoaderPlugin(projectWebContextPath) {
async (args) => {
const projectPath = path.relative(SRC_PATH, args.path);
+ const projectBasePath = projectPath.replace(/\.scss$/, '');
+
const cssFiles = await fs.readdir(
path.join(
BUILD_SASS_CACHE_PATH,
@@ -36,8 +38,6 @@ export default function getScssLoaderPlugin(projectWebContextPath) {
)
);
- const projectBasePath = projectPath.replace(/\.scss$/, '');
-
const cssBasename = cssFiles.find((cssFile) =>
cssFile.startsWith(
`${path.basename(projectBasePath)}.(`
diff --git a/modules/_node-scripts/bundle/esbuild/runEsbuild.mjs b/modules/_node-scripts/bundle/esbuild/runEsbuild.mjs
index bec8b08b981c0e..f350d5f76a19b9 100644
--- a/modules/_node-scripts/bundle/esbuild/runEsbuild.mjs
+++ b/modules/_node-scripts/bundle/esbuild/runEsbuild.mjs
@@ -8,17 +8,21 @@ import fs from 'fs/promises';
import path from 'path';
export default async function runEsbuild(esbuildConfig, configName) {
- await Promise.all([
+ const [result] = await Promise.all([
doRunEsbuild(esbuildConfig, configName),
writeDebugEsbuildConfig(esbuildConfig, configName),
]);
+
+ return result;
}
async function doRunEsbuild(esbuildesbuildConfig, configName) {
+ let result;
+
const start = performance.now();
try {
- await esbuild.build({
+ result = await esbuild.build({
define: {
// Flag to use React 16 instead of React 18. See render.tsx in frontend-js-react-web.
@@ -27,6 +31,7 @@ async function doRunEsbuild(esbuildesbuildConfig, configName) {
? 'true'
: 'false',
},
+ metafile: true,
minify: process.env.NODE_ENV === 'production',
...esbuildesbuildConfig,
});
@@ -40,6 +45,8 @@ async function doRunEsbuild(esbuildesbuildConfig, configName) {
console.log(
`⌛ Esbuild for ${configName} took: ${(lapse / 1000).toFixed(3)} s`
);
+
+ return result;
}
async function writeDebugEsbuildConfig(esbuildConfig, configName) {
diff --git a/modules/_node-scripts/bundle/index.mjs b/modules/_node-scripts/bundle/index.mjs
index afe5a857544803..a98c423bf181ed 100644
--- a/modules/_node-scripts/bundle/index.mjs
+++ b/modules/_node-scripts/bundle/index.mjs
@@ -74,7 +74,6 @@ export default async function main() {
// CSS exports bundling
bundleCSSExports(projectExports),
- writeCSSExportsLoaderModules(projectExports, projectWebContextPath),
// AMD bridging
@@ -100,5 +99,7 @@ export default async function main() {
),
]);
+ await writeCSSExportsLoaderModules(projectExports, projectWebContextPath);
+
await writeTimings(start, endConfig);
}
diff --git a/modules/_node-scripts/package.json b/modules/_node-scripts/package.json
index 18bb8736849432..cbf865afdea9da 100644
--- a/modules/_node-scripts/package.json
+++ b/modules/_node-scripts/package.json
@@ -4,7 +4,7 @@
"node-scripts": "./bin.js"
},
"com.liferay": {
- "sha256": "00d2a972afe65186b666efa058975f387ea44673708b4158204d3bbdba5cc781"
+ "sha256": "731360bca3b133cedbdc76f8b0ee91196992ac777cbd90f7b21ae9f4105701fd"
},
"dependencies": {
"@babel/preset-env": "7.24.7",
diff --git a/modules/apps/frontend-editor/frontend-editor-alloyeditor-web/src/main/resources/META-INF/resources/resources.jsp b/modules/apps/frontend-editor/frontend-editor-alloyeditor-web/src/main/resources/META-INF/resources/resources.jsp
index 6eb65951dd0075..ecc7ea29b14fc2 100644
--- a/modules/apps/frontend-editor/frontend-editor-alloyeditor-web/src/main/resources/META-INF/resources/resources.jsp
+++ b/modules/apps/frontend-editor/frontend-editor-alloyeditor-web/src/main/resources/META-INF/resources/resources.jsp
@@ -8,6 +8,12 @@
<%@ include file="/init.jsp" %>
<%
+String alloyEditorServletContextName = PortalWebResourcesUtil.getServletContext(
+ PortalWebResourceConstants.RESOURCE_TYPE_EDITOR_ALLOYEDITOR
+).getServletContextName();
+String ckEditorServletContextName = PortalWebResourcesUtil.getServletContext(
+ PortalWebResourceConstants.RESOURCE_TYPE_EDITOR_CKEDITOR
+).getServletContextName();
String editorName = (String)request.getAttribute(AlloyEditorConstants.ATTRIBUTE_NAMESPACE + ":editorName");
%>
@@ -16,18 +22,14 @@ String editorName = (String)request.getAttribute(AlloyEditorConstants.ATTRIBUTE_
>
- <%
- long javaScriptLastModified = PortalWebResourcesUtil.getLastModified(PortalWebResourceConstants.RESOURCE_TYPE_EDITOR_ALLOYEDITOR);
- %>
-
window.ALLOYEDITOR_BASEPATH =
'<%= PortalUtil.getPathProxy() + application.getContextPath() %>/alloyeditor/';
-
+
-
+
diff --git a/modules/apps/frontend-editor/frontend-editor-ckeditor-web/src/main/resources/META-INF/resources/init.jsp b/modules/apps/frontend-editor/frontend-editor-ckeditor-web/src/main/resources/META-INF/resources/init.jsp
index d65cf6c70a1e78..85e49e97ac629b 100644
--- a/modules/apps/frontend-editor/frontend-editor-ckeditor-web/src/main/resources/META-INF/resources/init.jsp
+++ b/modules/apps/frontend-editor/frontend-editor-ckeditor-web/src/main/resources/META-INF/resources/init.jsp
@@ -30,7 +30,6 @@ page import="com.liferay.portal.kernel.util.GetterUtil" %><%@
page import="com.liferay.portal.kernel.util.HashMapBuilder" %><%@
page import="com.liferay.portal.kernel.util.HtmlUtil" %><%@
page import="com.liferay.portal.kernel.util.JavaConstants" %><%@
-page import="com.liferay.portal.kernel.util.PortalUtil" %><%@
page import="com.liferay.portal.kernel.util.SessionClicks" %><%@
page import="com.liferay.portal.kernel.util.TextFormatter" %><%@
page import="com.liferay.portal.kernel.util.URLCodec" %><%@
diff --git a/modules/apps/frontend-editor/frontend-editor-ckeditor-web/src/main/resources/META-INF/resources/resources.jsp b/modules/apps/frontend-editor/frontend-editor-ckeditor-web/src/main/resources/META-INF/resources/resources.jsp
index 7e38ca0b61e263..85a133b99f9033 100644
--- a/modules/apps/frontend-editor/frontend-editor-ckeditor-web/src/main/resources/META-INF/resources/resources.jsp
+++ b/modules/apps/frontend-editor/frontend-editor-ckeditor-web/src/main/resources/META-INF/resources/resources.jsp
@@ -8,6 +8,9 @@
<%@ include file="/init.jsp" %>
<%
+String ckEditorServletContextName = PortalWebResourcesUtil.getServletContext(
+ PortalWebResourceConstants.RESOURCE_TYPE_EDITOR_CKEDITOR
+).getServletContextName();
String editorName = (String)request.getAttribute(CKEditorConstants.ATTRIBUTE_NAMESPACE + ":editorName");
boolean inlineEdit = GetterUtil.getBoolean((String)request.getAttribute(CKEditorConstants.ATTRIBUTE_NAMESPACE + ":inlineEdit"));
String inlineEditSaveURL = GetterUtil.getString((String)request.getAttribute(CKEditorConstants.ATTRIBUTE_NAMESPACE + ":inlineEditSaveURL"));
@@ -22,14 +25,10 @@ String inlineEditSaveURL = GetterUtil.getString((String)request.getAttribute(CKE
}
- <%
- long javaScriptLastModified = PortalWebResourcesUtil.getLastModified(PortalWebResourceConstants.RESOURCE_TYPE_EDITOR_CKEDITOR);
- %>
-
-
+
-
+
diff --git a/modules/apps/frontend-js/frontend-js-importmaps-extender/src/main/java/com/liferay/frontend/js/importmaps/extender/internal/configuration/JSImportMapsConfiguration.java b/modules/apps/frontend-js/frontend-js-importmaps-extender/src/main/java/com/liferay/frontend/js/importmaps/extender/internal/configuration/JSImportMapsConfiguration.java
deleted file mode 100644
index 3bae08e59ef196..00000000000000
--- a/modules/apps/frontend-js/frontend-js-importmaps-extender/src/main/java/com/liferay/frontend/js/importmaps/extender/internal/configuration/JSImportMapsConfiguration.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
- * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
- */
-
-package com.liferay.frontend.js.importmaps.extender.internal.configuration;
-
-import aQute.bnd.annotation.metatype.Meta;
-
-import com.liferay.portal.configuration.metatype.annotations.ExtendedObjectClassDefinition;
-
-/**
- * @author Iván Zaera Avellón
- */
-@ExtendedObjectClassDefinition(category = "infrastructure", generateUI = false)
-@Meta.OCD(
- description = "frontend-js-import-maps-description",
- id = "com.liferay.frontend.js.importmaps.extender.internal.configuration.JSImportMapsConfiguration",
- localization = "content/Language",
- name = "frontend-js-import-maps-configuration-name"
-)
-public interface JSImportMapsConfiguration {
-
- @Meta.AD(deflt = "true", name = "enable-import-maps", required = false)
- public boolean enableImportMaps();
-
- @Meta.AD(
- deflt = "false", description = "enable-es-module-shims-help",
- name = "enable-es-module-shims", required = false
- )
- public boolean enableESModuleShims();
-
-}
\ No newline at end of file
diff --git a/modules/apps/frontend-js/frontend-js-importmaps-extender/src/main/java/com/liferay/frontend/js/importmaps/extender/internal/servlet/taglib/JSImportMapsExtenderTopHeadDynamicInclude.java b/modules/apps/frontend-js/frontend-js-importmaps-extender/src/main/java/com/liferay/frontend/js/importmaps/extender/internal/servlet/taglib/JSImportMapsExtenderTopHeadDynamicInclude.java
index 277357017a9db6..394c3c38b4f7d8 100644
--- a/modules/apps/frontend-js/frontend-js-importmaps-extender/src/main/java/com/liferay/frontend/js/importmaps/extender/internal/servlet/taglib/JSImportMapsExtenderTopHeadDynamicInclude.java
+++ b/modules/apps/frontend-js/frontend-js-importmaps-extender/src/main/java/com/liferay/frontend/js/importmaps/extender/internal/servlet/taglib/JSImportMapsExtenderTopHeadDynamicInclude.java
@@ -7,18 +7,12 @@
import com.liferay.frontend.js.importmaps.extender.DynamicJSImportMapsContributor;
import com.liferay.frontend.js.importmaps.extender.JSImportMapsContributor;
-import com.liferay.frontend.js.importmaps.extender.internal.configuration.JSImportMapsConfiguration;
import com.liferay.frontend.js.importmaps.extender.internal.osgi.util.tracker.DynamicJSImportMapsContributorServiceTrackerCustomizer;
import com.liferay.frontend.js.importmaps.extender.internal.osgi.util.tracker.JSImportMapsContributorServiceTrackerCustomizer;
-import com.liferay.portal.configuration.metatype.bnd.util.ConfigurableUtil;
import com.liferay.portal.kernel.content.security.policy.ContentSecurityPolicyNonceProviderUtil;
-import com.liferay.portal.kernel.frontend.esm.FrontendESMUtil;
import com.liferay.portal.kernel.servlet.taglib.BaseDynamicInclude;
import com.liferay.portal.kernel.servlet.taglib.DynamicInclude;
-import com.liferay.portal.kernel.util.HashMapBuilder;
import com.liferay.portal.kernel.util.Portal;
-import com.liferay.portal.url.builder.AbsolutePortalURLBuilder;
-import com.liferay.portal.url.builder.AbsolutePortalURLBuilderFactory;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@@ -30,7 +24,6 @@
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
-import org.osgi.service.component.annotations.Modified;
import org.osgi.service.component.annotations.Reference;
import org.osgi.util.tracker.ServiceTracker;
@@ -38,7 +31,6 @@
* @author Iván Zaera Avellón
*/
@Component(
- configurationPid = "com.liferay.frontend.js.importmaps.extender.internal.configuration.JSImportMapsConfiguration",
property = "service.ranking:Integer=" + Integer.MAX_VALUE,
service = DynamicInclude.class
)
@@ -53,51 +45,15 @@ public void include(
PrintWriter printWriter = httpServletResponse.getWriter();
- if (_jsImportMapsConfiguration.enableImportMaps()) {
- printWriter.print("");
- }
-
- if (_jsImportMapsConfiguration.enableESModuleShims()) {
- printWriter.print("\n");
- }
+ printWriter.print("");
}
@Override
@@ -109,8 +65,6 @@ public void register(DynamicIncludeRegistry dynamicIncludeRegistry) {
protected void activate(BundleContext bundleContext) {
_bundleContext = bundleContext;
- modified();
-
_jsImportMapsCache = new JSImportMapsCache(_portal);
_dynamicJSImportMapsContributorServiceTracker = new ServiceTracker<>(
@@ -141,33 +95,11 @@ protected void deactivate() {
_jsImportMapsContributorServiceTracker = null;
}
- @Modified
- protected void modified() {
-
- // See LPS-165021
-
- _jsImportMapsConfiguration = ConfigurableUtil.createConfigurable(
- JSImportMapsConfiguration.class,
- HashMapBuilder.put(
- "enable-es-module-shims", false
- ).put(
- "enable-import-maps", true
- ).build());
-
- FrontendESMUtil.setScriptType(
- _jsImportMapsConfiguration.enableESModuleShims() ? "module-shim" :
- "module");
- }
-
- @Reference
- private AbsolutePortalURLBuilderFactory _absolutePortalURLBuilderFactory;
-
private volatile BundleContext _bundleContext;
private ServiceTracker
_dynamicJSImportMapsContributorServiceTracker;
private JSImportMapsCache _jsImportMapsCache;
- private volatile JSImportMapsConfiguration _jsImportMapsConfiguration;
private ServiceTracker
_jsImportMapsContributorServiceTracker;
diff --git a/modules/apps/frontend-js/frontend-js-loader-modules-extender/src/main/java/com/liferay/frontend/js/loader/modules/extender/internal/servlet/taglib/JSLoaderTopHeadDynamicInclude.java b/modules/apps/frontend-js/frontend-js-loader-modules-extender/src/main/java/com/liferay/frontend/js/loader/modules/extender/internal/servlet/taglib/JSLoaderTopHeadDynamicInclude.java
index a88b7a7df70969..52e7056adb66d3 100644
--- a/modules/apps/frontend-js/frontend-js-loader-modules-extender/src/main/java/com/liferay/frontend/js/loader/modules/extender/internal/servlet/taglib/JSLoaderTopHeadDynamicInclude.java
+++ b/modules/apps/frontend-js/frontend-js-loader-modules-extender/src/main/java/com/liferay/frontend/js/loader/modules/extender/internal/servlet/taglib/JSLoaderTopHeadDynamicInclude.java
@@ -11,7 +11,6 @@
import com.liferay.portal.kernel.content.security.policy.ContentSecurityPolicyNonceProvider;
import com.liferay.portal.kernel.content.security.policy.ContentSecurityPolicyNonceProviderUtil;
import com.liferay.portal.kernel.feature.flag.FeatureFlagManagerUtil;
-import com.liferay.portal.kernel.frontend.esm.FrontendESMUtil;
import com.liferay.portal.kernel.servlet.PortalWebResourceConstants;
import com.liferay.portal.kernel.servlet.PortalWebResourcesUtil;
import com.liferay.portal.kernel.servlet.taglib.BaseDynamicInclude;
@@ -82,9 +81,8 @@ public void include(
printWriter.write(Boolean.toString(_details.exposeGlobal()));
printWriter.write(", logLevel: '");
printWriter.write(_details.logLevel());
- printWriter.write("', moduleType: '");
- printWriter.write(FrontendESMUtil.getScriptType());
- printWriter.write("', namespace:'Liferay', nonce: '");
+ printWriter.write("', moduleType: 'module', namespace:'Liferay', ");
+ printWriter.write("nonce: '");
printWriter.write(
_contentSecurityPolicyNonceProvider.getNonce(httpServletRequest));
printWriter.write(
@@ -105,8 +103,8 @@ public void include(
httpServletRequest);
printWriter.write(
- absolutePortalURLBuilder.forBundleScript(
- _bundle, "/loader.js"
+ absolutePortalURLBuilder.forWebContextScript(
+ "frontend-js-loader-modules-extender", "/loader.js"
).build());
printWriter.write("\" type=\"");
diff --git a/modules/apps/frontend-js/frontend-js-lodash-web/src/main/java/com/liferay/frontend/js/lodash/web/internal/servlet/taglib/LodashTopHeadDynamicInclude.java b/modules/apps/frontend-js/frontend-js-lodash-web/src/main/java/com/liferay/frontend/js/lodash/web/internal/servlet/taglib/LodashTopHeadDynamicInclude.java
index d81ac879d14ac5..3bf0be4a073ac3 100644
--- a/modules/apps/frontend-js/frontend-js-lodash-web/src/main/java/com/liferay/frontend/js/lodash/web/internal/servlet/taglib/LodashTopHeadDynamicInclude.java
+++ b/modules/apps/frontend-js/frontend-js-lodash-web/src/main/java/com/liferay/frontend/js/lodash/web/internal/servlet/taglib/LodashTopHeadDynamicInclude.java
@@ -61,8 +61,8 @@ public void include(
printWriter.print(" data-senna-track=\"permanent\" src=\"");
printWriter.print(
- absolutePortalURLBuilder.forBundleScript(
- _bundleContext.getBundle(), fileName
+ absolutePortalURLBuilder.forWebContextScript(
+ "frontend-js-lodash-web", fileName
).build());
printWriter.println("\" type=\"text/javascript\">");
diff --git a/modules/apps/frontend-js/frontend-js-svg4everybody-web/node-scripts.config.js b/modules/apps/frontend-js/frontend-js-svg4everybody-web/node-scripts.config.js
index 4c334868a2b5f1..0234e6c9a48914 100644
--- a/modules/apps/frontend-js/frontend-js-svg4everybody-web/node-scripts.config.js
+++ b/modules/apps/frontend-js/frontend-js-svg4everybody-web/node-scripts.config.js
@@ -9,7 +9,7 @@ module.exports = {
customBuild: {
esbuild: {
bundle: true,
- entryNames: 'index',
+ entryNames: 'index.([hash])',
entryPoints: [
path.resolve(
'src',
diff --git a/modules/apps/frontend-js/frontend-js-svg4everybody-web/src/main/java/com/liferay/frontend/js/svg4everybody/web/internal/servlet/taglib/SVG4EverybodyTopHeadDynamicInclude.java b/modules/apps/frontend-js/frontend-js-svg4everybody-web/src/main/java/com/liferay/frontend/js/svg4everybody/web/internal/servlet/taglib/SVG4EverybodyTopHeadDynamicInclude.java
index 1e5de0f4e3d18f..a49eebcee67904 100644
--- a/modules/apps/frontend-js/frontend-js-svg4everybody-web/src/main/java/com/liferay/frontend/js/svg4everybody/web/internal/servlet/taglib/SVG4EverybodyTopHeadDynamicInclude.java
+++ b/modules/apps/frontend-js/frontend-js-svg4everybody-web/src/main/java/com/liferay/frontend/js/svg4everybody/web/internal/servlet/taglib/SVG4EverybodyTopHeadDynamicInclude.java
@@ -24,7 +24,7 @@
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.url.builder.AbsolutePortalURLBuilder;
import com.liferay.portal.url.builder.AbsolutePortalURLBuilderFactory;
-import com.liferay.portal.url.builder.BundleScriptAbsolutePortalURLBuilder;
+import com.liferay.portal.url.builder.WebContextScriptAbsolutePortalURLBuilder;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@@ -109,16 +109,16 @@ public void include(
httpServletRequest));
printWriter.print(" data-senna-track=\"permanent\" src=\"");
- BundleScriptAbsolutePortalURLBuilder
- bundleScriptAbsolutePortalURLBuilder =
- absolutePortalURLBuilder.forBundleScript(
- _bundleContext.getBundle(), jsFileName);
+ WebContextScriptAbsolutePortalURLBuilder
+ webContextScriptAbsolutePortalURLBuilder =
+ absolutePortalURLBuilder.forWebContextScript(
+ "frontend-js-svg4everybody-web", jsFileName);
if (!cdnDynamicResourcesEnabled) {
- bundleScriptAbsolutePortalURLBuilder.ignoreCDNHost();
+ webContextScriptAbsolutePortalURLBuilder.ignoreCDNHost();
}
- printWriter.print(bundleScriptAbsolutePortalURLBuilder.build());
+ printWriter.print(webContextScriptAbsolutePortalURLBuilder.build());
printWriter.println("\" type=\"text/javascript\">");
}
diff --git a/modules/apps/frontend-js/frontend-js-web/build.gradle b/modules/apps/frontend-js/frontend-js-web/build.gradle
index ff1d8e83304576..4fac57ab3ee700 100644
--- a/modules/apps/frontend-js/frontend-js-web/build.gradle
+++ b/modules/apps/frontend-js/frontend-js-web/build.gradle
@@ -9,7 +9,6 @@ dependencies {
compileOnly group: "org.osgi", name: "org.osgi.service.cm", version: "1.6.0"
compileOnly group: "org.osgi", name: "org.osgi.service.component.annotations", version: "1.4.0"
compileOnly group: "org.osgi", name: "osgi.core", version: "6.0.0"
- compileOnly project(":apps:configuration-admin:configuration-admin-api")
compileOnly project(":apps:frontend-js:frontend-js-importmaps-extender-api")
compileOnly project(":apps:frontend-js:frontend-js-loader-modules-extender-api")
compileOnly project(":apps:portal-configuration:portal-configuration-module-configuration-api")
diff --git a/modules/apps/frontend-js/frontend-js-web/node-scripts.config.js b/modules/apps/frontend-js/frontend-js-web/node-scripts.config.js
index d4494145dbb21f..7f3e024b453cbf 100644
--- a/modules/apps/frontend-js/frontend-js-web/node-scripts.config.js
+++ b/modules/apps/frontend-js/frontend-js-web/node-scripts.config.js
@@ -9,7 +9,7 @@ module.exports = {
customBuild: {
esbuild: {
bundle: true,
- entryNames: 'Liferay',
+ entryNames: 'Liferay.([hash])',
entryPoints: [
path.resolve(
'src',
diff --git a/modules/apps/frontend-js/frontend-js-web/src/main/java/com/liferay/frontend/js/web/internal/configuration/FrontendCachingConfiguration.java b/modules/apps/frontend-js/frontend-js-web/src/main/java/com/liferay/frontend/js/web/internal/configuration/FrontendCachingConfiguration.java
index 578abd6943093e..78973d971b490e 100644
--- a/modules/apps/frontend-js/frontend-js-web/src/main/java/com/liferay/frontend/js/web/internal/configuration/FrontendCachingConfiguration.java
+++ b/modules/apps/frontend-js/frontend-js-web/src/main/java/com/liferay/frontend/js/web/internal/configuration/FrontendCachingConfiguration.java
@@ -7,7 +7,6 @@
import aQute.bnd.annotation.metatype.Meta;
-import com.liferay.portal.configuration.metatype.annotations.ExtendedAttributeDefinition;
import com.liferay.portal.configuration.metatype.annotations.ExtendedObjectClassDefinition;
/**
@@ -30,9 +29,6 @@ public interface FrontendCachingConfiguration {
)
public long cssStyleSheetsMaxAge();
- @ExtendedAttributeDefinition(
- visibilityControllerKey = "com.liferay.frontend.js.web.internal.configuration.admin.display.FrontendCachingConfigurationVisibilityController"
- )
@Meta.AD(
deflt = "86400", description = "es-modules-max-age-help",
name = "es-modules-max-age", required = false
@@ -46,9 +42,6 @@ public interface FrontendCachingConfiguration {
)
public boolean sendNoCacheForCSSStyleSheets();
- @ExtendedAttributeDefinition(
- visibilityControllerKey = "com.liferay.frontend.js.web.internal.configuration.admin.display.FrontendCachingConfigurationVisibilityController"
- )
@Meta.AD(
deflt = "false", description = "send-no-cache-for-es-modules-help",
name = "send-no-cache-for-es-modules", required = false
diff --git a/modules/apps/frontend-js/frontend-js-web/src/main/java/com/liferay/frontend/js/web/internal/configuration/admin/display/FrontendCachingConfigurationVisibilityController.java b/modules/apps/frontend-js/frontend-js-web/src/main/java/com/liferay/frontend/js/web/internal/configuration/admin/display/FrontendCachingConfigurationVisibilityController.java
deleted file mode 100644
index e6a6c08e58d38b..00000000000000
--- a/modules/apps/frontend-js/frontend-js-web/src/main/java/com/liferay/frontend/js/web/internal/configuration/admin/display/FrontendCachingConfigurationVisibilityController.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com
- * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
- */
-
-package com.liferay.frontend.js.web.internal.configuration.admin.display;
-
-import com.liferay.configuration.admin.display.ConfigurationVisibilityController;
-import com.liferay.portal.configuration.metatype.annotations.ExtendedObjectClassDefinition;
-
-import java.io.Serializable;
-
-import org.osgi.service.component.annotations.Component;
-
-/**
- * @author Iván Zaera Avellón
- */
-@Component(service = ConfigurationVisibilityController.class)
-public class FrontendCachingConfigurationVisibilityController
- implements ConfigurationVisibilityController {
-
- @Override
- public boolean isVisible(
- ExtendedObjectClassDefinition.Scope scope, Serializable scopePK) {
-
- // LPD-69957
-
- return false;
- }
-
-}
\ No newline at end of file
diff --git a/modules/apps/frontend-js/frontend-js-web/src/main/java/com/liferay/frontend/js/web/internal/resource/handler/HashedFileFrontendResourceRequestHandler.java b/modules/apps/frontend-js/frontend-js-web/src/main/java/com/liferay/frontend/js/web/internal/resource/handler/HashedFileFrontendResourceRequestHandler.java
index a5f2475ccd8c3c..fd4c8147a3156c 100644
--- a/modules/apps/frontend-js/frontend-js-web/src/main/java/com/liferay/frontend/js/web/internal/resource/handler/HashedFileFrontendResourceRequestHandler.java
+++ b/modules/apps/frontend-js/frontend-js-web/src/main/java/com/liferay/frontend/js/web/internal/resource/handler/HashedFileFrontendResourceRequestHandler.java
@@ -7,6 +7,8 @@
import com.liferay.frontend.js.web.internal.resource.FrontendResource;
import com.liferay.frontend.js.web.internal.resource.HashedFileFrontendResource;
+import com.liferay.petra.string.StringBundler;
+import com.liferay.petra.string.StringPool;
import com.liferay.portal.kernel.frontend.hashed.files.HashedFilesRegistry;
import com.liferay.portal.kernel.frontend.hashed.files.HashedFilesUtil;
import com.liferay.portal.kernel.log.Log;
@@ -56,12 +58,6 @@ public boolean canHandleRequest(HttpServletRequest httpServletRequest) {
return true;
}
- // LPD-52709
-
- if (true) {
- return false;
- }
-
String hashedFileURI = _hashedFilesRegistry.getHashedFileURI(
requestURI);
@@ -87,6 +83,10 @@ public FrontendResource handleRequest(HttpServletRequest httpServletRequest)
String requestHash = HashedFilesUtil.getHash(requestURI);
if (requestHash != null) {
+ if (_log.isDebugEnabled()) {
+ _log.debug("Handling request " + requestURI);
+ }
+
return _createFrontendResource(
_portal.getCompanyId(httpServletRequest), requestHash, true,
requestURI);
@@ -96,11 +96,22 @@ public FrontendResource handleRequest(HttpServletRequest httpServletRequest)
requestURI);
if (hashedFileURI == null) {
+ if (_log.isDebugEnabled()) {
+ _log.debug("Handling request " + requestURI);
+ }
+
return _createFrontendResource(
_portal.getCompanyId(httpServletRequest), null, false,
requestURI);
}
+ if (_log.isDebugEnabled()) {
+ _log.debug(
+ StringBundler.concat(
+ "Handling request ", requestURI, " [static file: ",
+ hashedFileURI, StringPool.CLOSE_BRACKET));
+ }
+
return _createFrontendResource(
_portal.getCompanyId(httpServletRequest),
HashedFilesUtil.getHash(hashedFileURI), false, hashedFileURI);
diff --git a/modules/apps/frontend-js/frontend-js-web/src/main/java/com/liferay/frontend/js/web/internal/resource/handler/StyleSheetFrontendResourceRequestHandler.java b/modules/apps/frontend-js/frontend-js-web/src/main/java/com/liferay/frontend/js/web/internal/resource/handler/StyleSheetFrontendResourceRequestHandler.java
index e860c9424b1094..078dc37554f0e9 100644
--- a/modules/apps/frontend-js/frontend-js-web/src/main/java/com/liferay/frontend/js/web/internal/resource/handler/StyleSheetFrontendResourceRequestHandler.java
+++ b/modules/apps/frontend-js/frontend-js-web/src/main/java/com/liferay/frontend/js/web/internal/resource/handler/StyleSheetFrontendResourceRequestHandler.java
@@ -8,10 +8,13 @@
import com.liferay.frontend.js.web.internal.configuration.FrontendCachingConfiguration;
import com.liferay.frontend.js.web.internal.resource.FrontendResource;
import com.liferay.frontend.js.web.internal.resource.StyleSheetFrontendResource;
+import com.liferay.petra.string.StringBundler;
import com.liferay.petra.string.StringPool;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.frontend.hashed.files.HashedFilesRegistry;
import com.liferay.portal.kernel.frontend.hashed.files.HashedFilesUtil;
+import com.liferay.portal.kernel.log.Log;
+import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.model.Theme;
import com.liferay.portal.kernel.service.ThemeLocalService;
import com.liferay.portal.kernel.util.Portal;
@@ -83,6 +86,10 @@ public FrontendResource handleRequest(HttpServletRequest httpServletRequest)
SortedMap tokens = _getTokens(httpServletRequest);
if (requestHash != null) {
+ if (_log.isDebugEnabled()) {
+ _log.debug("Handling request: " + requestURI);
+ }
+
return _createFrontendResource(
requestHash, tokens == null, requestURI, tokens);
}
@@ -91,9 +98,20 @@ public FrontendResource handleRequest(HttpServletRequest httpServletRequest)
requestURI);
if (hashedFileURI == null) {
+ if (_log.isDebugEnabled()) {
+ _log.debug("Handling request: " + requestURI);
+ }
+
return _createFrontendResource(null, false, requestURI, tokens);
}
+ if (_log.isDebugEnabled()) {
+ _log.debug(
+ StringBundler.concat(
+ "Handling request ", requestURI, " [static file: ",
+ hashedFileURI, StringPool.CLOSE_BRACKET));
+ }
+
return _createFrontendResource(
HashedFilesUtil.getHash(hashedFileURI), false, hashedFileURI,
tokens);
@@ -166,6 +184,9 @@ private SortedMap _getTokens(
return tokens;
}
+ private static final Log _log = LogFactoryUtil.getLog(
+ StyleSheetFrontendResourceRequestHandler.class);
+
private final FrontendCachingConfiguration _frontendCachingConfiguration;
private final HashedFilesRegistry _hashedFilesRegistry;
private final Portal _portal;
diff --git a/modules/apps/frontend-js/frontend-js-web/src/main/java/com/liferay/frontend/js/web/internal/servlet/taglib/LiferayGlobalObjectPostAUIDynamicInclude.java b/modules/apps/frontend-js/frontend-js-web/src/main/java/com/liferay/frontend/js/web/internal/servlet/taglib/LiferayGlobalObjectPostAUIDynamicInclude.java
index c78f9dbd5df51a..b0ba5cca3811a9 100644
--- a/modules/apps/frontend-js/frontend-js-web/src/main/java/com/liferay/frontend/js/web/internal/servlet/taglib/LiferayGlobalObjectPostAUIDynamicInclude.java
+++ b/modules/apps/frontend-js/frontend-js-web/src/main/java/com/liferay/frontend/js/web/internal/servlet/taglib/LiferayGlobalObjectPostAUIDynamicInclude.java
@@ -5,6 +5,7 @@
package com.liferay.frontend.js.web.internal.servlet.taglib;
+import com.liferay.petra.string.StringPool;
import com.liferay.portal.kernel.content.security.policy.ContentSecurityPolicyNonceProviderUtil;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
@@ -14,7 +15,7 @@
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.url.builder.AbsolutePortalURLBuilder;
import com.liferay.portal.url.builder.AbsolutePortalURLBuilderFactory;
-import com.liferay.portal.url.builder.BundleScriptAbsolutePortalURLBuilder;
+import com.liferay.portal.url.builder.WebContextScriptAbsolutePortalURLBuilder;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@@ -57,15 +58,22 @@ public void include(
_absolutePortalURLBuilderFactory.getAbsolutePortalURLBuilder(
httpServletRequest);
- BundleScriptAbsolutePortalURLBuilder
- bundleScriptAbsolutePortalURLBuilder =
- absolutePortalURLBuilder.forBundleScript(
- _bundle, "/Liferay.js");
+ WebContextScriptAbsolutePortalURLBuilder
+ webContextScriptAbsolutePortalURLBuilder =
+ absolutePortalURLBuilder.forWebContextScript(
+ "frontend-js-web", "/Liferay.js");
_renderScript(
- httpServletRequest, httpServletResponse.getWriter(),
- bundleScriptAbsolutePortalURLBuilder.build(),
+ null, httpServletRequest, httpServletResponse.getWriter(),
+ webContextScriptAbsolutePortalURLBuilder.build(),
"text/javascript");
+
+ _renderScript(
+ "await import(`@liferay/language" +
+ "/${Liferay.ThemeDisplay.getLanguageId()}/frontend-js-web" +
+ "/all.js`);",
+ httpServletRequest, httpServletResponse.getWriter(), null,
+ "module");
}
catch (Exception exception) {
_log.error(exception);
@@ -90,8 +98,8 @@ protected void deactivate() {
}
private void _renderScript(
- HttpServletRequest httpServletRequest, PrintWriter printWriter,
- String src, String type) {
+ String content, HttpServletRequest httpServletRequest,
+ PrintWriter printWriter, String src, String type) {
printWriter.print("");
+ printWriter.print("\">");
+
+ if (Validator.isNotNull(content)) {
+ printWriter.print(content);
+ }
+
+ printWriter.println("");
}
private static final Log _log = LogFactoryUtil.getLog(
diff --git a/modules/apps/frontend-js/frontend-js-web/src/main/java/com/liferay/frontend/js/web/internal/servlet/taglib/aui/PortletDataRendererImpl.java b/modules/apps/frontend-js/frontend-js-web/src/main/java/com/liferay/frontend/js/web/internal/servlet/taglib/aui/PortletDataRendererImpl.java
index e791d74da708a6..0a3ad2dc31b380 100644
--- a/modules/apps/frontend-js/frontend-js-web/src/main/java/com/liferay/frontend/js/web/internal/servlet/taglib/aui/PortletDataRendererImpl.java
+++ b/modules/apps/frontend-js/frontend-js-web/src/main/java/com/liferay/frontend/js/web/internal/servlet/taglib/aui/PortletDataRendererImpl.java
@@ -8,7 +8,6 @@
import com.liferay.petra.string.StringBundler;
import com.liferay.petra.string.StringPool;
import com.liferay.portal.kernel.content.security.policy.ContentSecurityPolicyNonceProviderUtil;
-import com.liferay.portal.kernel.frontend.esm.FrontendESMUtil;
import com.liferay.portal.kernel.servlet.taglib.aui.AMDRequire;
import com.liferay.portal.kernel.servlet.taglib.aui.ESImport;
import com.liferay.portal.kernel.servlet.taglib.aui.JSFragment;
@@ -66,9 +65,7 @@ public void write(Collection portletDatas, Writer writer)
writer.write("