From 33ffaef6de5d4f7de27ae40f55db919d22c6b84b Mon Sep 17 00:00:00 2001 From: Nicola Molinari Date: Tue, 26 Apr 2022 15:00:07 +0200 Subject: [PATCH] fix(mc-scripts): dynamically change public path of assets on runtime for cdnUrl --- .../html-scripts/public-path.js | 11 +++++++ packages/mc-html-template/src/index.js | 1 + .../mc-html-template/src/load-html-scripts.js | 1 + .../mc-html-template/src/process-headers.js | 3 +- packages/mc-scripts/package.json | 1 + .../mc-scripts/src/commands/build-vite.js | 29 +++++++++++++++++-- .../src/config/application-runtime.js | 16 ++++++++-- yarn.lock | 17 +++++++++++ 8 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 packages/mc-html-template/html-scripts/public-path.js diff --git a/packages/mc-html-template/html-scripts/public-path.js b/packages/mc-html-template/html-scripts/public-path.js new file mode 100644 index 0000000000..583eaddc02 --- /dev/null +++ b/packages/mc-html-template/html-scripts/public-path.js @@ -0,0 +1,11 @@ +window.__dynamicImportHandler__ = function (importer) { + return `${window.app.cdnUrl.replace(/\/$/, '')}/${importer.replace( + /^(\.\/)?/, + '' + )}`; +}; +window.__dynamicImportPreload__ = function (preloads) { + return preloads.map( + (preload) => `${window.app.cdnUrl.replace(/\/$/, '')}/${preload}` + ); +}; diff --git a/packages/mc-html-template/src/index.js b/packages/mc-html-template/src/index.js index 974bd78d7e..36ee4dda4a 100644 --- a/packages/mc-html-template/src/index.js +++ b/packages/mc-html-template/src/index.js @@ -2,3 +2,4 @@ exports.compileHtml = require('./compile-html'); exports.generateTemplate = require('./generate-template'); exports.processHeaders = require('./process-headers'); exports.replaceHtmlPlaceholders = require('./utils/replace-html-placeholders'); +exports.htmlScripts = require('./load-html-scripts'); diff --git a/packages/mc-html-template/src/load-html-scripts.js b/packages/mc-html-template/src/load-html-scripts.js index da4a619428..e8b6816f14 100644 --- a/packages/mc-html-template/src/load-html-scripts.js +++ b/packages/mc-html-template/src/load-html-scripts.js @@ -26,4 +26,5 @@ const loadScriptAsString = (fileName) => { module.exports = { dataLayer: loadScriptAsString('data-layer.js'), loadingScreen: loadScriptAsString('loading-screen.js'), + publicPath: loadScriptAsString('public-path.js'), }; diff --git a/packages/mc-html-template/src/process-headers.js b/packages/mc-html-template/src/process-headers.js index da95d82bcd..7f16271f3c 100644 --- a/packages/mc-html-template/src/process-headers.js +++ b/packages/mc-html-template/src/process-headers.js @@ -46,11 +46,12 @@ const processHeaders = (applicationConfig) => { // List hashes for injected inline scripts. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src const htmlScriptsHashes = [ - createAssetHash(htmlScripts.dataLayer), createAssetHash(htmlScripts.loadingScreen), createAssetHash( `window.app = ${sanitizeAppEnvironment(applicationConfig.env)};` ), + createAssetHash(htmlScripts.publicPath), + createAssetHash(htmlScripts.dataLayer), ]; // // List hashes for injected inline styles. diff --git a/packages/mc-scripts/package.json b/packages/mc-scripts/package.json index eda6099a1f..676e698443 100644 --- a/packages/mc-scripts/package.json +++ b/packages/mc-scripts/package.json @@ -76,6 +76,7 @@ "thread-loader": "3.0.4", "url": "^0.11.0", "vite": "2.9.1", + "vite-plugin-dynamic-publicpath": "1.1.2", "webpack": "5.72.0", "webpack-bundle-analyzer": "4.5.0", "webpack-dev-server": "4.8.1", diff --git a/packages/mc-scripts/src/commands/build-vite.js b/packages/mc-scripts/src/commands/build-vite.js index fa8edd6c42..fb13a8fd90 100644 --- a/packages/mc-scripts/src/commands/build-vite.js +++ b/packages/mc-scripts/src/commands/build-vite.js @@ -1,10 +1,13 @@ +/* eslint-disable react-hooks/rules-of-hooks */ const fs = require('fs-extra'); const path = require('path'); const { build } = require('vite'); const pluginGraphql = require('@rollup/plugin-graphql'); const pluginReact = require('@vitejs/plugin-react').default; +const { useDynamicPublicPath } = require('vite-plugin-dynamic-publicpath'); const { generateTemplate, + htmlScripts, } = require('@commercetools-frontend/mc-html-template'); const { packageLocation: applicationStaticAssetsPath, @@ -23,10 +26,23 @@ const pluginCustomApplication = () => { // Ensure to use the `cdnUrl` value when loading the entry point. // NOTE: with Webpack this is done by setting the `__webpack_public_path__`. const html = rawHtml.replace( - new RegExp(`