From 2b07a9749b394467522039b6491863ae92296d32 Mon Sep 17 00:00:00 2001 From: fortunato Date: Thu, 16 Oct 2025 09:29:58 -0600 Subject: [PATCH 1/2] LPD-66044 Add CDN to ES CSS loaders --- .../bundle/cssLoad/writeCSSExportsLoaderModules.mjs | 2 +- .../bundle/esbuild/plugins/getScssLoaderPlugin.mjs | 2 +- modules/_node-scripts/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/_node-scripts/bundle/cssLoad/writeCSSExportsLoaderModules.mjs b/modules/_node-scripts/bundle/cssLoad/writeCSSExportsLoaderModules.mjs index c7144f15ddee30..550ed4d478d58d 100644 --- a/modules/_node-scripts/bundle/cssLoad/writeCSSExportsLoaderModules.mjs +++ b/modules/_node-scripts/bundle/cssLoad/writeCSSExportsLoaderModules.mjs @@ -38,7 +38,7 @@ async function writeCSSExportLoaderModule(webContextPath, moduleName) { const link = document.createElement('link'); link.setAttribute('rel','stylesheet'); link.setAttribute('type','text/css'); -link.setAttribute('href', Liferay.ThemeDisplay.getPathContext() + '/o${webContextPath}/__liferay__/css/${flatModuleName}'); +link.setAttribute('href', Liferay.ThemeDisplay.getCDNHost() + Liferay.ThemeDisplay.getPathContext() + '/o${webContextPath}/__liferay__/css/${flatModuleName}'); if (Liferay.CSP) { link.setAttribute('nonce', Liferay.CSP.nonce); } diff --git a/modules/_node-scripts/bundle/esbuild/plugins/getScssLoaderPlugin.mjs b/modules/_node-scripts/bundle/esbuild/plugins/getScssLoaderPlugin.mjs index 54b9fa61198603..446f19cc7fafbf 100644 --- a/modules/_node-scripts/bundle/esbuild/plugins/getScssLoaderPlugin.mjs +++ b/modules/_node-scripts/bundle/esbuild/plugins/getScssLoaderPlugin.mjs @@ -56,7 +56,7 @@ link.setAttribute('rel', 'stylesheet'); link.setAttribute('type', 'text/css'); link.setAttribute( 'href', - Liferay.ThemeDisplay.getPathContext() + + Liferay.ThemeDisplay.getCDNHost() + Liferay.ThemeDisplay.getPathContext() + '/o${projectWebContextPath}/${cssBaseURI}' + (document.dir === 'rtl' ? '_rtl' : '') + '.(${hash}).css' diff --git a/modules/_node-scripts/package.json b/modules/_node-scripts/package.json index 890b77ea3c815c..927ca51f659025 100644 --- a/modules/_node-scripts/package.json +++ b/modules/_node-scripts/package.json @@ -4,7 +4,7 @@ "node-scripts": "./bin.js" }, "com.liferay": { - "sha256": "fbebf438625ff2f33ad75492887f910ce2df345f6af33d52a4676028af6a7b0d" + "sha256": "68f9517db28b323afdb49e1d1c42db014e6f99487c1609389bc4155aeaa1cd2a" }, "dependencies": { "@babel/preset-env": "7.24.7", From 3a2c347e9fb5ed48513ec9852df1cdb8081f6d25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Zaera=20Avell=C3=B3n?= Date: Mon, 15 Sep 2025 09:27:30 +0200 Subject: [PATCH 2/2] LPD-66044 Add CDN to JS URLs inside the import maps --- .../build.gradle | 1 + ...gFormFieldTypeJSImportMapsContributor.java | 55 ++++++++------ .../apps/fragment/fragment-impl/build.gradle | 1 + .../FragmentImplJSImportMapsContributor.java | 51 ++++++++----- ...ependenciesWebJSImportMapsContributor.java | 69 +++++++++-------- .../frontend-js-react-web/build.gradle | 1 + ...tendJSReactWebJSImportMapsContributor.java | 75 ++++++++++-------- .../taglib/dependencies/liferay.js.tpl | 1 + .../frontend-taglib-clay/build.gradle | 1 + ...tendTaglibClayJSImportMapsContributor.java | 76 ++++++++++++++----- .../OAuth2ClientJSImportMapsContributor.java | 47 +++++++----- 11 files changed, 234 insertions(+), 144 deletions(-) diff --git a/modules/apps/dynamic-data-mapping/dynamic-data-mapping-form-field-type/build.gradle b/modules/apps/dynamic-data-mapping/dynamic-data-mapping-form-field-type/build.gradle index 639d70a6ce8470..d74964348bc5d9 100644 --- a/modules/apps/dynamic-data-mapping/dynamic-data-mapping-form-field-type/build.gradle +++ b/modules/apps/dynamic-data-mapping/dynamic-data-mapping-form-field-type/build.gradle @@ -25,6 +25,7 @@ dependencies { compileOnly project(":apps:list-type:list-type-api") compileOnly project(":apps:map:map-api") compileOnly project(":apps:object:object-api") + compileOnly project(":apps:portal-url-builder:portal-url-builder-api") compileOnly project(":apps:static:osgi:osgi-util") compileOnly project(":apps:trash:trash-api") compileOnly project(":core:osgi-service-tracker-collections") diff --git a/modules/apps/dynamic-data-mapping/dynamic-data-mapping-form-field-type/src/main/java/com/liferay/dynamic/data/mapping/form/field/type/internal/frontend/js/importmaps/extender/DynamicDataMappingFormFieldTypeJSImportMapsContributor.java b/modules/apps/dynamic-data-mapping/dynamic-data-mapping-form-field-type/src/main/java/com/liferay/dynamic/data/mapping/form/field/type/internal/frontend/js/importmaps/extender/DynamicDataMappingFormFieldTypeJSImportMapsContributor.java index 8fd3fa13f9119f..6b37b435aaa03a 100644 --- a/modules/apps/dynamic-data-mapping/dynamic-data-mapping-form-field-type/src/main/java/com/liferay/dynamic/data/mapping/form/field/type/internal/frontend/js/importmaps/extender/DynamicDataMappingFormFieldTypeJSImportMapsContributor.java +++ b/modules/apps/dynamic-data-mapping/dynamic-data-mapping-form-field-type/src/main/java/com/liferay/dynamic/data/mapping/form/field/type/internal/frontend/js/importmaps/extender/DynamicDataMappingFormFieldTypeJSImportMapsContributor.java @@ -5,45 +5,52 @@ package com.liferay.dynamic.data.mapping.form.field.type.internal.frontend.js.importmaps.extender; -import com.liferay.frontend.js.importmaps.extender.JSImportMapsContributor; -import com.liferay.portal.kernel.json.JSONFactory; -import com.liferay.portal.kernel.json.JSONObject; +import com.liferay.frontend.js.importmaps.extender.DynamicJSImportMapsContributor; +import com.liferay.petra.string.StringPool; +import com.liferay.portal.url.builder.AbsolutePortalURLBuilder; +import com.liferay.portal.url.builder.AbsolutePortalURLBuilderFactory; +import com.liferay.portal.url.builder.ESModuleAbsolutePortalURLBuilder; -import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpServletRequest; + +import java.io.IOException; +import java.io.Writer; -import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; /** * @author Álvaro Leal */ -@Component(service = JSImportMapsContributor.class) +@Component(service = DynamicJSImportMapsContributor.class) public class DynamicDataMappingFormFieldTypeJSImportMapsContributor - implements JSImportMapsContributor { + implements DynamicJSImportMapsContributor { @Override - public JSONObject getImportMapsJSONObject() { - return _importMapsJSONObject; + public void writeGlobalImports( + HttpServletRequest httpServletRequest, Writer writer) + throws IOException { + + AbsolutePortalURLBuilder absolutePortalURLBuilder = + _absolutePortalURLBuilderFactory.getAbsolutePortalURLBuilder( + httpServletRequest); + + ESModuleAbsolutePortalURLBuilder esModuleAbsolutePortalURLBuilder = + absolutePortalURLBuilder.forESModule( + "dynamic-data-mapping-form-field-type", "api.js"); + + writer.write( + "\"@liferay/dynamic-data-mapping-form-field-type/api\" : \""); + writer.write(esModuleAbsolutePortalURLBuilder.build()); + writer.write(StringPool.QUOTE); } - @Activate - protected void activate() { - _importMapsJSONObject = _jsonFactory.createJSONObject(); - - _importMapsJSONObject.put( - "@liferay/dynamic-data-mapping-form-field-type/api", - _servletContext.getContextPath() + "/__liferay__/api.js"); + @Override + public void writeScopedImports( + HttpServletRequest httpServletRequest, Writer writer) { } - private JSONObject _importMapsJSONObject; - @Reference - private JSONFactory _jsonFactory; - - @Reference( - target = "(osgi.web.symbolicname=com.liferay.dynamic.data.mapping.form.field.type)" - ) - private ServletContext _servletContext; + private AbsolutePortalURLBuilderFactory _absolutePortalURLBuilderFactory; } \ No newline at end of file diff --git a/modules/apps/fragment/fragment-impl/build.gradle b/modules/apps/fragment/fragment-impl/build.gradle index 1c9cc8482eff5d..6987cbbeb2588c 100644 --- a/modules/apps/fragment/fragment-impl/build.gradle +++ b/modules/apps/fragment/fragment-impl/build.gradle @@ -34,6 +34,7 @@ dependencies { compileOnly project(":apps:layout:layout-taglib") compileOnly project(":apps:portal-configuration:portal-configuration-module-configuration-api") compileOnly project(":apps:portal-template:portal-template-react-renderer-api") + compileOnly project(":apps:portal-url-builder:portal-url-builder-api") compileOnly project(":apps:portal:portal-instance-lifecycle-api") compileOnly project(":apps:ratings:ratings-taglib") compileOnly project(":apps:saved-content:saved-content-taglib") diff --git a/modules/apps/fragment/fragment-impl/src/main/java/com/liferay/fragment/internal/js/importmaps/extender/FragmentImplJSImportMapsContributor.java b/modules/apps/fragment/fragment-impl/src/main/java/com/liferay/fragment/internal/js/importmaps/extender/FragmentImplJSImportMapsContributor.java index 0169c1f62220d4..0e442539a8b180 100644 --- a/modules/apps/fragment/fragment-impl/src/main/java/com/liferay/fragment/internal/js/importmaps/extender/FragmentImplJSImportMapsContributor.java +++ b/modules/apps/fragment/fragment-impl/src/main/java/com/liferay/fragment/internal/js/importmaps/extender/FragmentImplJSImportMapsContributor.java @@ -5,41 +5,50 @@ package com.liferay.fragment.internal.js.importmaps.extender; -import com.liferay.frontend.js.importmaps.extender.JSImportMapsContributor; -import com.liferay.portal.kernel.json.JSONObject; -import com.liferay.portal.kernel.json.JSONUtil; +import com.liferay.frontend.js.importmaps.extender.DynamicJSImportMapsContributor; +import com.liferay.petra.string.StringPool; +import com.liferay.portal.url.builder.AbsolutePortalURLBuilder; +import com.liferay.portal.url.builder.AbsolutePortalURLBuilderFactory; +import com.liferay.portal.url.builder.ESModuleAbsolutePortalURLBuilder; -import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpServletRequest; + +import java.io.IOException; +import java.io.Writer; -import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; /** * @author Víctor Galán */ -@Component(service = JSImportMapsContributor.class) +@Component(service = DynamicJSImportMapsContributor.class) public class FragmentImplJSImportMapsContributor - implements JSImportMapsContributor { + implements DynamicJSImportMapsContributor { @Override - public JSONObject getImportMapsJSONObject() { - return _importMapsJSONObject; - } + public void writeGlobalImports( + HttpServletRequest httpServletRequest, Writer writer) + throws IOException { + + AbsolutePortalURLBuilder absolutePortalURLBuilder = + _absolutePortalURLBuilderFactory.getAbsolutePortalURLBuilder( + httpServletRequest); - @Activate - protected void activate() { - _importMapsJSONObject = JSONUtil.put( - "@liferay/fragment-impl/api", - _servletContext.getContextPath() + "/__liferay__/api.js"); + ESModuleAbsolutePortalURLBuilder esModuleAbsolutePortalURLBuilder = + absolutePortalURLBuilder.forESModule("fragment-impl", "api.js"); + + writer.write("\"@liferay/fragment-impl/api\" : \""); + writer.write(esModuleAbsolutePortalURLBuilder.build()); + writer.write(StringPool.QUOTE); } - private JSONObject _importMapsJSONObject; + @Override + public void writeScopedImports( + HttpServletRequest httpServletRequest, Writer writer) { + } - @Reference( - target = "(osgi.web.symbolicname=com.liferay.fragment.impl)", - unbind = "-" - ) - private ServletContext _servletContext; + @Reference + private AbsolutePortalURLBuilderFactory _absolutePortalURLBuilderFactory; } \ No newline at end of file diff --git a/modules/apps/frontend-js/frontend-js-dependencies-web/src/main/java/com/liferay/frontend/js/dependencies/web/internal/js/importmaps/extender/FrontendJSDependenciesWebJSImportMapsContributor.java b/modules/apps/frontend-js/frontend-js-dependencies-web/src/main/java/com/liferay/frontend/js/dependencies/web/internal/js/importmaps/extender/FrontendJSDependenciesWebJSImportMapsContributor.java index a15b2b931eea79..3999c6c628462a 100644 --- a/modules/apps/frontend-js/frontend-js-dependencies-web/src/main/java/com/liferay/frontend/js/dependencies/web/internal/js/importmaps/extender/FrontendJSDependenciesWebJSImportMapsContributor.java +++ b/modules/apps/frontend-js/frontend-js-dependencies-web/src/main/java/com/liferay/frontend/js/dependencies/web/internal/js/importmaps/extender/FrontendJSDependenciesWebJSImportMapsContributor.java @@ -5,52 +5,59 @@ package com.liferay.frontend.js.dependencies.web.internal.js.importmaps.extender; -import com.liferay.frontend.js.importmaps.extender.JSImportMapsContributor; -import com.liferay.portal.kernel.json.JSONFactory; -import com.liferay.portal.kernel.json.JSONObject; +import com.liferay.frontend.js.importmaps.extender.DynamicJSImportMapsContributor; +import com.liferay.petra.string.StringPool; +import com.liferay.portal.url.builder.AbsolutePortalURLBuilder; +import com.liferay.portal.url.builder.AbsolutePortalURLBuilderFactory; +import com.liferay.portal.url.builder.ESModuleAbsolutePortalURLBuilder; -import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpServletRequest; + +import java.io.IOException; +import java.io.Writer; -import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; /** * @author Iván Zaera Avellón */ -@Component(service = JSImportMapsContributor.class) +@Component(service = DynamicJSImportMapsContributor.class) public class FrontendJSDependenciesWebJSImportMapsContributor - implements JSImportMapsContributor { + implements DynamicJSImportMapsContributor { @Override - public JSONObject getImportMapsJSONObject() { - return _importMapsJSONObject; - } + public void writeGlobalImports( + HttpServletRequest httpServletRequest, Writer writer) + throws IOException { + + AbsolutePortalURLBuilder absolutePortalURLBuilder = + _absolutePortalURLBuilderFactory.getAbsolutePortalURLBuilder( + httpServletRequest); + + ESModuleAbsolutePortalURLBuilder esModuleAbsolutePortalURLBuilder = + absolutePortalURLBuilder.forESModule( + "frontend-js-dependencies-web", "exports/@liferay$js-api.js"); + + writer.write("\"@liferay/frontend-js-api\" : \""); + writer.write(esModuleAbsolutePortalURLBuilder.build()); + writer.write("\","); - @Activate - protected void activate() { - _importMapsJSONObject = _jsonFactory.createJSONObject(); - - _importMapsJSONObject.put( - "@liferay/frontend-js-api", - _servletContext.getContextPath() + - "/__liferay__/exports/@liferay$js-api.js" - ).put( - "@liferay/frontend-js-api/data-set", - _servletContext.getContextPath() + - "/__liferay__/exports/@liferay$js-api$data-set.js" - ); + esModuleAbsolutePortalURLBuilder = absolutePortalURLBuilder.forESModule( + "frontend-js-dependencies-web", + "exports/@liferay$js-api$data-set.js"); + + writer.write("\"@liferay/frontend-js-api/data-set\" : \""); + writer.write(esModuleAbsolutePortalURLBuilder.build()); + writer.write(StringPool.QUOTE); } - private JSONObject _importMapsJSONObject; + @Override + public void writeScopedImports( + HttpServletRequest httpServletRequest, Writer writer) { + } @Reference - private JSONFactory _jsonFactory; - - @Reference( - target = "(osgi.web.symbolicname=com.liferay.frontend.js.dependencies.web)", - unbind = "-" - ) - private ServletContext _servletContext; + private AbsolutePortalURLBuilderFactory _absolutePortalURLBuilderFactory; } \ No newline at end of file diff --git a/modules/apps/frontend-js/frontend-js-react-web/build.gradle b/modules/apps/frontend-js/frontend-js-react-web/build.gradle index 3317943dcebc35..45685e00172a0f 100644 --- a/modules/apps/frontend-js/frontend-js-react-web/build.gradle +++ b/modules/apps/frontend-js/frontend-js-react-web/build.gradle @@ -4,6 +4,7 @@ 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 project(":apps:frontend-js:frontend-js-importmaps-extender-api") + compileOnly project(":apps:portal-url-builder:portal-url-builder-api") compileOnly project(":core:petra:petra-function") compileOnly project(":core:petra:petra-string") } \ No newline at end of file diff --git a/modules/apps/frontend-js/frontend-js-react-web/src/main/java/com/liferay/frontend/js/react/web/internal/js/importmaps/extender/FrontendJSReactWebJSImportMapsContributor.java b/modules/apps/frontend-js/frontend-js-react-web/src/main/java/com/liferay/frontend/js/react/web/internal/js/importmaps/extender/FrontendJSReactWebJSImportMapsContributor.java index 241cdfde411292..8cf29cef380366 100644 --- a/modules/apps/frontend-js/frontend-js-react-web/src/main/java/com/liferay/frontend/js/react/web/internal/js/importmaps/extender/FrontendJSReactWebJSImportMapsContributor.java +++ b/modules/apps/frontend-js/frontend-js-react-web/src/main/java/com/liferay/frontend/js/react/web/internal/js/importmaps/extender/FrontendJSReactWebJSImportMapsContributor.java @@ -5,62 +5,75 @@ package com.liferay.frontend.js.react.web.internal.js.importmaps.extender; -import com.liferay.frontend.js.importmaps.extender.JSImportMapsContributor; +import com.liferay.frontend.js.importmaps.extender.DynamicJSImportMapsContributor; import com.liferay.petra.string.CharPool; -import com.liferay.petra.string.StringBundler; -import com.liferay.portal.kernel.json.JSONFactory; -import com.liferay.portal.kernel.json.JSONObject; +import com.liferay.petra.string.StringPool; import com.liferay.portal.kernel.util.StringUtil; +import com.liferay.portal.url.builder.AbsolutePortalURLBuilder; +import com.liferay.portal.url.builder.AbsolutePortalURLBuilderFactory; +import com.liferay.portal.url.builder.ESModuleAbsolutePortalURLBuilder; -import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpServletRequest; + +import java.io.IOException; +import java.io.Writer; -import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; /** * @author Iván Zaera Avellón */ -@Component(service = JSImportMapsContributor.class) +@Component(service = DynamicJSImportMapsContributor.class) public class FrontendJSReactWebJSImportMapsContributor - implements JSImportMapsContributor { + implements DynamicJSImportMapsContributor { @Override - public JSONObject getImportMapsJSONObject() { - return _importMapsJSONObject; - } + public void writeGlobalImports( + HttpServletRequest httpServletRequest, Writer writer) + throws IOException { - @Activate - protected void activate() { - _importMapsJSONObject = _jsonFactory.createJSONObject(); + AbsolutePortalURLBuilder absolutePortalURLBuilder = + _absolutePortalURLBuilderFactory.getAbsolutePortalURLBuilder( + httpServletRequest); - String contextPath = _servletContext.getContextPath(); + boolean first = true; for (String moduleName : _MODULE_NAMES) { - _importMapsJSONObject.put( - moduleName, - StringBundler.concat( - contextPath, "/__liferay__/exports/", - StringUtil.replace( - moduleName, CharPool.FORWARD_SLASH, CharPool.DOLLAR), - ".js")); + String escapedModuleName = StringUtil.replace( + moduleName, CharPool.FORWARD_SLASH, CharPool.DOLLAR); + + ESModuleAbsolutePortalURLBuilder esModuleAbsolutePortalURLBuilder = + absolutePortalURLBuilder.forESModule( + "frontend-js-react-web", + "exports/" + escapedModuleName + ".js"); + + if (!first) { + writer.write(", "); + } + else { + first = false; + } + + writer.write(StringPool.QUOTE); + writer.write(moduleName); + writer.write("\": \""); + writer.write(esModuleAbsolutePortalURLBuilder.build()); + writer.write(StringPool.QUOTE); } } + @Override + public void writeScopedImports( + HttpServletRequest httpServletRequest, Writer writer) { + } + private static final String[] _MODULE_NAMES = { "react", "react-16", "react-18", "react-dom", "react-dom/client", "react-dom-16", "react-dom-18", "react-dom-18/client" }; - private JSONObject _importMapsJSONObject; - @Reference - private JSONFactory _jsonFactory; - - @Reference( - target = "(osgi.web.symbolicname=com.liferay.frontend.js.react.web)", - unbind = "-" - ) - private ServletContext _servletContext; + private AbsolutePortalURLBuilderFactory _absolutePortalURLBuilderFactory; } \ No newline at end of file diff --git a/modules/apps/frontend-js/frontend-js-web/src/main/resources/com/liferay/frontend/js/web/internal/servlet/taglib/dependencies/liferay.js.tpl b/modules/apps/frontend-js/frontend-js-web/src/main/resources/com/liferay/frontend/js/web/internal/servlet/taglib/dependencies/liferay.js.tpl index 5c270b37924256..05698565e27a9d 100644 --- a/modules/apps/frontend-js/frontend-js-web/src/main/resources/com/liferay/frontend/js/web/internal/servlet/taglib/dependencies/liferay.js.tpl +++ b/modules/apps/frontend-js/frontend-js-web/src/main/resources/com/liferay/frontend/js/web/internal/servlet/taglib/dependencies/liferay.js.tpl @@ -3,6 +3,7 @@ return ( (...args) => { import( + Liferay.ThemeDisplay.getCDNHost() + Liferay.ThemeDisplay.getPathContext() + '/o/' + contextPath + diff --git a/modules/apps/frontend-taglib/frontend-taglib-clay/build.gradle b/modules/apps/frontend-taglib/frontend-taglib-clay/build.gradle index 4f2d6e56bc2fd0..e43faad0e758dc 100644 --- a/modules/apps/frontend-taglib/frontend-taglib-clay/build.gradle +++ b/modules/apps/frontend-taglib/frontend-taglib-clay/build.gradle @@ -34,6 +34,7 @@ dependencies { compileOnly project(":apps:frontend-js:frontend-js-loader-modules-extender-api") compileOnly project(":apps:frontend-taglib:frontend-taglib-react") compileOnly project(":apps:portal-template:portal-template-react-renderer-api") + compileOnly project(":apps:portal-url-builder:portal-url-builder-api") compileOnly project(":apps:static:portal-configuration:portal-configuration-metatype-api") compileOnly project(":core:osgi-service-tracker-collections") compileOnly project(":core:petra:petra-function") diff --git a/modules/apps/frontend-taglib/frontend-taglib-clay/src/main/java/com/liferay/frontend/taglib/clay/internal/js/importmaps/extender/FrontendTaglibClayJSImportMapsContributor.java b/modules/apps/frontend-taglib/frontend-taglib-clay/src/main/java/com/liferay/frontend/taglib/clay/internal/js/importmaps/extender/FrontendTaglibClayJSImportMapsContributor.java index 3ba72c4ae1f29e..529088e232ba48 100644 --- a/modules/apps/frontend-taglib/frontend-taglib-clay/src/main/java/com/liferay/frontend/taglib/clay/internal/js/importmaps/extender/FrontendTaglibClayJSImportMapsContributor.java +++ b/modules/apps/frontend-taglib/frontend-taglib-clay/src/main/java/com/liferay/frontend/taglib/clay/internal/js/importmaps/extender/FrontendTaglibClayJSImportMapsContributor.java @@ -5,17 +5,25 @@ package com.liferay.frontend.taglib.clay.internal.js.importmaps.extender; -import com.liferay.frontend.js.importmaps.extender.JSImportMapsContributor; -import com.liferay.petra.string.StringBundler; +import com.liferay.frontend.js.importmaps.extender.DynamicJSImportMapsContributor; +import com.liferay.petra.string.CharPool; +import com.liferay.petra.string.StringPool; import com.liferay.portal.kernel.json.JSONException; import com.liferay.portal.kernel.json.JSONFactory; import com.liferay.portal.kernel.json.JSONObject; import com.liferay.portal.kernel.util.StringUtil; +import com.liferay.portal.url.builder.AbsolutePortalURLBuilder; +import com.liferay.portal.url.builder.AbsolutePortalURLBuilderFactory; +import com.liferay.portal.url.builder.ESModuleAbsolutePortalURLBuilder; -import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; import java.io.InputStream; +import java.io.Writer; + +import java.util.ArrayList; +import java.util.List; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; @@ -24,34 +32,65 @@ /** * @author Iván Zaera Avellón */ -@Component(service = JSImportMapsContributor.class) +@Component(service = DynamicJSImportMapsContributor.class) public class FrontendTaglibClayJSImportMapsContributor - implements JSImportMapsContributor { + implements DynamicJSImportMapsContributor { + + @Override + public void writeGlobalImports( + HttpServletRequest httpServletRequest, Writer writer) + throws IOException { + + AbsolutePortalURLBuilder absolutePortalURLBuilder = + _absolutePortalURLBuilderFactory.getAbsolutePortalURLBuilder( + httpServletRequest); + + boolean first = true; + + for (String moduleName : _moduleNames) { + String escapedModuleName = StringUtil.replace( + moduleName, CharPool.FORWARD_SLASH, CharPool.DOLLAR); + + ESModuleAbsolutePortalURLBuilder esModuleAbsolutePortalURLBuilder = + absolutePortalURLBuilder.forESModule( + "frontend-taglib-clay", + "exports/" + escapedModuleName + ".js"); + + if (!first) { + writer.write(", "); + } + else { + first = false; + } + + writer.write(StringPool.QUOTE); + writer.write(moduleName); + writer.write("\": \""); + writer.write(esModuleAbsolutePortalURLBuilder.build()); + writer.write(StringPool.QUOTE); + } + } @Override - public JSONObject getImportMapsJSONObject() { - return _importMapsJSONObject; + public void writeScopedImports( + HttpServletRequest httpServletRequest, Writer writer) { } @Activate protected void activate() throws IOException, JSONException { - _importMapsJSONObject = _jsonFactory.createJSONObject(); - JSONObject packageJSONObject = _getPackageJSONObject(); JSONObject dependenciesJSONObject = packageJSONObject.getJSONObject( "dependencies"); + _moduleNames.clear(); + for (String moduleName : dependenciesJSONObject.keySet()) { if (!moduleName.startsWith("@clayui/")) { continue; } - _importMapsJSONObject.put( - moduleName, - StringBundler.concat( - _servletContext.getContextPath(), "/__liferay__/exports/", - moduleName.replaceAll("\\/", "\\$"), ".js")); + _moduleNames.add(moduleName); } } @@ -66,15 +105,12 @@ private JSONObject _getPackageJSONObject() } } - private JSONObject _importMapsJSONObject; + @Reference + private AbsolutePortalURLBuilderFactory _absolutePortalURLBuilderFactory; @Reference private JSONFactory _jsonFactory; - @Reference( - target = "(osgi.web.symbolicname=com.liferay.frontend.taglib.clay)", - unbind = "-" - ) - private ServletContext _servletContext; + private final List _moduleNames = new ArrayList<>(); } \ No newline at end of file diff --git a/modules/apps/oauth2-provider/oauth2-provider-web/src/main/java/com/liferay/oauth2/provider/web/internal/frontend/js/importmaps/extender/OAuth2ClientJSImportMapsContributor.java b/modules/apps/oauth2-provider/oauth2-provider-web/src/main/java/com/liferay/oauth2/provider/web/internal/frontend/js/importmaps/extender/OAuth2ClientJSImportMapsContributor.java index 0c6a459fe83c5c..f17bb651ab5ed6 100644 --- a/modules/apps/oauth2-provider/oauth2-provider-web/src/main/java/com/liferay/oauth2/provider/web/internal/frontend/js/importmaps/extender/OAuth2ClientJSImportMapsContributor.java +++ b/modules/apps/oauth2-provider/oauth2-provider-web/src/main/java/com/liferay/oauth2/provider/web/internal/frontend/js/importmaps/extender/OAuth2ClientJSImportMapsContributor.java @@ -5,38 +5,51 @@ package com.liferay.oauth2.provider.web.internal.frontend.js.importmaps.extender; -import com.liferay.frontend.js.importmaps.extender.JSImportMapsContributor; -import com.liferay.portal.kernel.json.JSONFactory; -import com.liferay.portal.kernel.json.JSONObject; +import com.liferay.frontend.js.importmaps.extender.DynamicJSImportMapsContributor; +import com.liferay.petra.string.StringPool; +import com.liferay.portal.url.builder.AbsolutePortalURLBuilder; +import com.liferay.portal.url.builder.AbsolutePortalURLBuilderFactory; +import com.liferay.portal.url.builder.ESModuleAbsolutePortalURLBuilder; + +import jakarta.servlet.http.HttpServletRequest; + +import java.io.IOException; +import java.io.Writer; -import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; /** * @author Bryce Osterhaus */ -@Component(service = JSImportMapsContributor.class) +@Component(service = DynamicJSImportMapsContributor.class) public class OAuth2ClientJSImportMapsContributor - implements JSImportMapsContributor { + implements DynamicJSImportMapsContributor { @Override - public JSONObject getImportMapsJSONObject() { - return _importMapsJSONObject; - } + public void writeGlobalImports( + HttpServletRequest httpServletRequest, Writer writer) + throws IOException { - @Activate - protected void activate() { - _importMapsJSONObject = _jsonFactory.createJSONObject(); + AbsolutePortalURLBuilder absolutePortalURLBuilder = + _absolutePortalURLBuilderFactory.getAbsolutePortalURLBuilder( + httpServletRequest); - _importMapsJSONObject.put( - "@liferay/oauth2-provider-web/client", - "/o/oauth2-provider-web/__liferay__/client.js"); + ESModuleAbsolutePortalURLBuilder esModuleAbsolutePortalURLBuilder = + absolutePortalURLBuilder.forESModule( + "oauth2-provider-web", "client.js"); + + writer.write("\"@liferay/oauth2-provider-web/client\" : \""); + writer.write(esModuleAbsolutePortalURLBuilder.build()); + writer.write(StringPool.QUOTE); } - private JSONObject _importMapsJSONObject; + @Override + public void writeScopedImports( + HttpServletRequest httpServletRequest, Writer writer) { + } @Reference - private JSONFactory _jsonFactory; + private AbsolutePortalURLBuilderFactory _absolutePortalURLBuilderFactory; } \ No newline at end of file