@commercetools-frontend/mc-html-template 24.11.0 → 24.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commercetools-frontend-mc-html-template.cjs.dev.js +24 -21
- package/dist/commercetools-frontend-mc-html-template.cjs.prod.js +24 -21
- package/dist/commercetools-frontend-mc-html-template.esm.js +23 -20
- package/package.json +3 -3
- package/webpack-html-template/dist/commercetools-frontend-mc-html-template-webpack-html-template.cjs.dev.js +2 -2
- package/webpack-html-template/dist/commercetools-frontend-mc-html-template-webpack-html-template.cjs.prod.js +2 -2
- package/webpack-html-template/dist/commercetools-frontend-mc-html-template-webpack-html-template.esm.js +2 -2
|
@@ -12,8 +12,8 @@ var _Object$assign = require('@babel/runtime-corejs3/core-js-stable/object/assig
|
|
|
12
12
|
var _Object$keys = require('@babel/runtime-corejs3/core-js-stable/object/keys');
|
|
13
13
|
var _mapInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/map');
|
|
14
14
|
var _Object$entries = require('@babel/runtime-corejs3/core-js-stable/object/entries');
|
|
15
|
-
var _trimInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/trim');
|
|
16
15
|
var _concatInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/concat');
|
|
16
|
+
var _trimInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/trim');
|
|
17
17
|
var _Object$getOwnPropertySymbols = require('@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols');
|
|
18
18
|
var _filterInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/filter');
|
|
19
19
|
var _Object$getOwnPropertyDescriptor = require('@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor');
|
|
@@ -35,8 +35,8 @@ var _Object$assign__default = /*#__PURE__*/_interopDefault(_Object$assign);
|
|
|
35
35
|
var _Object$keys__default = /*#__PURE__*/_interopDefault(_Object$keys);
|
|
36
36
|
var _mapInstanceProperty__default = /*#__PURE__*/_interopDefault(_mapInstanceProperty);
|
|
37
37
|
var _Object$entries__default = /*#__PURE__*/_interopDefault(_Object$entries);
|
|
38
|
-
var _trimInstanceProperty__default = /*#__PURE__*/_interopDefault(_trimInstanceProperty);
|
|
39
38
|
var _concatInstanceProperty__default = /*#__PURE__*/_interopDefault(_concatInstanceProperty);
|
|
39
|
+
var _trimInstanceProperty__default = /*#__PURE__*/_interopDefault(_trimInstanceProperty);
|
|
40
40
|
var _Object$getOwnPropertySymbols__default = /*#__PURE__*/_interopDefault(_Object$getOwnPropertySymbols);
|
|
41
41
|
var _filterInstanceProperty__default = /*#__PURE__*/_interopDefault(_filterInstanceProperty);
|
|
42
42
|
var _Object$getOwnPropertyDescriptor__default = /*#__PURE__*/_interopDefault(_Object$getOwnPropertyDescriptor);
|
|
@@ -57,7 +57,7 @@ function createAssetHash(content) {
|
|
|
57
57
|
* CSP headers sent.
|
|
58
58
|
* For more information head to: developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src#Sources
|
|
59
59
|
*/
|
|
60
|
-
return
|
|
60
|
+
return "sha256-".concat(sha256Hash);
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
const sanitizeAppEnvironment = env => serialize__default["default"](env, {
|
|
@@ -65,7 +65,7 @@ const sanitizeAppEnvironment = env => serialize__default["default"](env, {
|
|
|
65
65
|
});
|
|
66
66
|
|
|
67
67
|
function ownKeys(e, r) { var t = _Object$keys__default["default"](e); if (_Object$getOwnPropertySymbols__default["default"]) { var o = _Object$getOwnPropertySymbols__default["default"](e); r && (o = _filterInstanceProperty__default["default"](o).call(o, function (r) { return _Object$getOwnPropertyDescriptor__default["default"](e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
68
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var
|
|
68
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context8, _context9; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty__default["default"](_context8 = ownKeys(Object(t), !0)).call(_context8, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors__default["default"] ? _Object$defineProperties__default["default"](e, _Object$getOwnPropertyDescriptors__default["default"](t)) : _forEachInstanceProperty__default["default"](_context9 = ownKeys(Object(t))).call(_context9, function (r) { _Object$defineProperty__default["default"](e, r, _Object$getOwnPropertyDescriptor__default["default"](t, r)); }); } return e; }
|
|
69
69
|
// https://babeljs.io/blog/2017/09/11/zero-config-with-babel-macros
|
|
70
70
|
const htmlScripts$1 = {
|
|
71
71
|
"loadingScreen": "window.onAppLoaded=function(){var e=document.querySelector(\"#app-loader\");e&&e.parentNode.removeChild(e)},setTimeout(function(){var e=document.querySelector(\".loading-screen\");e&&e.classList.remove(\"loading-screen--hidden\")},250),setTimeout(function(){var e=document.querySelector(\".long-loading-notice\");e&&e.classList.remove(\"long-loading-notice--hidden\")},2e3);",
|
|
@@ -82,20 +82,21 @@ const parseCSPDirectives = function () {
|
|
|
82
82
|
return _Object$assign__default["default"](mergedDirectives, _reduceInstanceProperty__default["default"](_context = _Object$keys__default["default"](directive)).call(_context, (mergedDirectiveValues, directiveKey) => {
|
|
83
83
|
const existingDirectiveValue = mergedDirectives[directiveKey];
|
|
84
84
|
return _Object$assign__default["default"](mergedDirectiveValues, {
|
|
85
|
-
[directiveKey]: [...toArray(existingDirectiveValue
|
|
85
|
+
[directiveKey]: [...toArray(existingDirectiveValue !== null && existingDirectiveValue !== void 0 ? existingDirectiveValue : []), ...toArray(directive[directiveKey])]
|
|
86
86
|
});
|
|
87
87
|
}, {}));
|
|
88
88
|
}, {});
|
|
89
89
|
return _mapInstanceProperty__default["default"](_context2 = _Object$entries__default["default"](mergedDirectives)).call(_context2, _ref => {
|
|
90
|
+
var _context3;
|
|
90
91
|
let _ref2 = _slicedToArray(_ref, 2),
|
|
91
92
|
directive = _ref2[0],
|
|
92
93
|
value = _ref2[1];
|
|
93
|
-
return
|
|
94
|
+
return _concatInstanceProperty__default["default"](_context3 = "".concat(directive, " ")).call(_context3, _Array$isArray__default["default"](value) ? value.join(' ') : value);
|
|
94
95
|
}).join('; ');
|
|
95
96
|
};
|
|
96
97
|
const parsePermissionsPolicyDirectives = (defaultValue, customDirectives) => {
|
|
97
|
-
var
|
|
98
|
-
const mergedDirectives = _mapInstanceProperty__default["default"](
|
|
98
|
+
var _context4;
|
|
99
|
+
const mergedDirectives = _mapInstanceProperty__default["default"](_context4 = defaultValue.split(',')).call(_context4, directive => {
|
|
99
100
|
const _directive$trim$split = _trimInstanceProperty__default["default"](directive).call(directive).split('='),
|
|
100
101
|
_directive$trim$split2 = _slicedToArray(_directive$trim$split, 2),
|
|
101
102
|
directiveName = _directive$trim$split2[0],
|
|
@@ -109,12 +110,12 @@ const parsePermissionsPolicyDirectives = (defaultValue, customDirectives) => {
|
|
|
109
110
|
return mergedDirectives.join(', ');
|
|
110
111
|
};
|
|
111
112
|
const processHeaders = applicationConfig => {
|
|
112
|
-
var
|
|
113
|
+
var _context5, _context6, _context7, _applicationConfig$he, _applicationConfig$he2, _applicationConfig$he3, _applicationConfig$he4;
|
|
113
114
|
const isMcDevEnv = applicationConfig.env.env === 'development';
|
|
114
115
|
|
|
115
116
|
// List hashes for injected inline scripts.
|
|
116
117
|
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src
|
|
117
|
-
const htmlScriptsHashes = [createAssetHash(htmlScripts$1.loadingScreen), createAssetHash(
|
|
118
|
+
const htmlScriptsHashes = [createAssetHash(htmlScripts$1.loadingScreen), createAssetHash("window.app = ".concat(sanitizeAppEnvironment(applicationConfig.env), ";")), createAssetHash(htmlScripts$1.publicPath)];
|
|
118
119
|
|
|
119
120
|
// // List hashes for injected inline styles.
|
|
120
121
|
// // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/style-src
|
|
@@ -126,15 +127,15 @@ const processHeaders = applicationConfig => {
|
|
|
126
127
|
*/
|
|
127
128
|
const defaultCSPDirectives = _Object$assign__default["default"]({
|
|
128
129
|
'default-src': "'none'",
|
|
129
|
-
'script-src': _concatInstanceProperty__default["default"](
|
|
130
|
+
'script-src': _concatInstanceProperty__default["default"](_context5 = ["'self'"]).call(_context5, isMcDevEnv ?
|
|
130
131
|
// Allow webpack to load source maps on runtime when errors occur
|
|
131
132
|
// using script tags
|
|
132
|
-
['localhost:*', "'unsafe-inline'"] : _mapInstanceProperty__default["default"](htmlScriptsHashes).call(htmlScriptsHashes, assetHash =>
|
|
133
|
-
'connect-src': _concatInstanceProperty__default["default"](
|
|
133
|
+
['localhost:*', "'unsafe-inline'"] : _mapInstanceProperty__default["default"](htmlScriptsHashes).call(htmlScriptsHashes, assetHash => "'".concat(assetHash, "'"))),
|
|
134
|
+
'connect-src': _concatInstanceProperty__default["default"](_context6 = ["'self'", 'app.launchdarkly.com', 'clientstream.launchdarkly.com', 'events.launchdarkly.com', 'app.getsentry.com',
|
|
134
135
|
// Match all attempts to load from any subdomain of `sentry.io`
|
|
135
|
-
'*.sentry.io']).call(
|
|
136
|
+
'*.sentry.io']).call(_context6, isMcDevEnv ? ['ws:', 'localhost:8080', 'webpack-internal:'] : []),
|
|
136
137
|
'img-src': ['*', 'data:'],
|
|
137
|
-
'style-src': _concatInstanceProperty__default["default"](
|
|
138
|
+
'style-src': _concatInstanceProperty__default["default"](_context7 = ["'self'", 'fonts.googleapis.com', 'data:']).call(_context7,
|
|
138
139
|
// TODO: investigate what needs to be done to avoid unsafe-inline styles
|
|
139
140
|
// https://github.com/commercetools/merchant-center-frontend/pull/5223#discussion_r210367636
|
|
140
141
|
["'unsafe-inline'"]
|
|
@@ -161,9 +162,9 @@ const processHeaders = applicationConfig => {
|
|
|
161
162
|
return _objectSpread(_objectSpread({}, constants.HTTP_SECURITY_HEADERS), {}, {
|
|
162
163
|
// The `Content-Security-Policy` header is always generated
|
|
163
164
|
// based on the Merchant Center customization config.
|
|
164
|
-
[constants.HTTP_SECURITY_HEADER_KEYS['Content-Security-Policy']]: parseCSPDirectives(defaultCSPDirectives, applicationConfig.headers
|
|
165
|
-
}, applicationConfig.headers
|
|
166
|
-
[constants.HTTP_SECURITY_HEADER_KEYS['Permissions-Policy']]: parsePermissionsPolicyDirectives(constants.HTTP_SECURITY_HEADERS['Permissions-Policy'], applicationConfig.headers.permissionsPolicies
|
|
165
|
+
[constants.HTTP_SECURITY_HEADER_KEYS['Content-Security-Policy']]: parseCSPDirectives(defaultCSPDirectives, (_applicationConfig$he = (_applicationConfig$he2 = applicationConfig.headers) === null || _applicationConfig$he2 === void 0 ? void 0 : _applicationConfig$he2.csp) !== null && _applicationConfig$he !== void 0 ? _applicationConfig$he : {})
|
|
166
|
+
}, (_applicationConfig$he3 = applicationConfig.headers) !== null && _applicationConfig$he3 !== void 0 && _applicationConfig$he3.permissionsPolicies ? {
|
|
167
|
+
[constants.HTTP_SECURITY_HEADER_KEYS['Permissions-Policy']]: parsePermissionsPolicyDirectives(constants.HTTP_SECURITY_HEADERS['Permissions-Policy'], (_applicationConfig$he4 = applicationConfig.headers.permissionsPolicies) !== null && _applicationConfig$he4 !== void 0 ? _applicationConfig$he4 : {})
|
|
167
168
|
} : {});
|
|
168
169
|
};
|
|
169
170
|
|
|
@@ -176,9 +177,11 @@ const htmlStyles = {
|
|
|
176
177
|
"loadingScreen": ".loading-screen{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh;width:100vw}.loading-screen--hidden{display:none}.loading-screen>*+*{margin:24px 0 0}.loading-spinner{width:32px;height:32px}.long-loading-notice{color:#999;font-family:'Open Sans',sans-serif;font-size:12px}.long-loading-notice--hidden{visibility:hidden}.loading-spinner-circle{fill:#213c45;opacity:.2}@keyframes loading-spinner-animation{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.loading-spinner-pointer{transform-origin:20px 20px 0;animation:loading-spinner-animation .5s infinite linear}"
|
|
177
178
|
};
|
|
178
179
|
const trimTrailingSlash = value => value.replace(/\/$/, '');
|
|
179
|
-
const replaceHtmlPlaceholders = (indexHtmlContent, options) =>
|
|
180
|
-
|
|
181
|
-
|
|
180
|
+
const replaceHtmlPlaceholders = (indexHtmlContent, options) => {
|
|
181
|
+
var _options$headers$Cont, _options$headers;
|
|
182
|
+
return indexHtmlContent.replace(new RegExp('__CSP__', 'g'), (_options$headers$Cont = (_options$headers = options.headers) === null || _options$headers === void 0 ? void 0 : _options$headers['Content-Security-Policy']) !== null && _options$headers$Cont !== void 0 ? _options$headers$Cont : '').replace(new RegExp('__CDN_URL__', 'g'), options.env.cdnUrl ? // Ensure there is a trailing slash
|
|
183
|
+
"".concat(trimTrailingSlash(options.env.cdnUrl), "/") : '').replace(new RegExp('__MC_API_URL__', 'g'), trimTrailingSlash(options.env.mcApiUrl)).replace(new RegExp('__APPLICATION_ENVIRONMENT__', 'g'), "<script>window.app = ".concat(sanitizeAppEnvironment(options.env), ";</script>")).replace(new RegExp('__LOADING_SCREEN_JS__', 'g'), "<script>".concat(htmlScripts.loadingScreen, "</script>")).replace(new RegExp('__LOADING_SCREEN_CSS__', 'g'), "<style>".concat(htmlStyles.loadingScreen, "</style>"));
|
|
184
|
+
};
|
|
182
185
|
|
|
183
186
|
async function compileHtml(indexHtmlTemplatePath) {
|
|
184
187
|
const applicationConfig$1 = await applicationConfig.processConfig();
|
|
@@ -12,8 +12,8 @@ var _Object$assign = require('@babel/runtime-corejs3/core-js-stable/object/assig
|
|
|
12
12
|
var _Object$keys = require('@babel/runtime-corejs3/core-js-stable/object/keys');
|
|
13
13
|
var _mapInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/map');
|
|
14
14
|
var _Object$entries = require('@babel/runtime-corejs3/core-js-stable/object/entries');
|
|
15
|
-
var _trimInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/trim');
|
|
16
15
|
var _concatInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/concat');
|
|
16
|
+
var _trimInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/trim');
|
|
17
17
|
var _Object$getOwnPropertySymbols = require('@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols');
|
|
18
18
|
var _filterInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/filter');
|
|
19
19
|
var _Object$getOwnPropertyDescriptor = require('@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor');
|
|
@@ -35,8 +35,8 @@ var _Object$assign__default = /*#__PURE__*/_interopDefault(_Object$assign);
|
|
|
35
35
|
var _Object$keys__default = /*#__PURE__*/_interopDefault(_Object$keys);
|
|
36
36
|
var _mapInstanceProperty__default = /*#__PURE__*/_interopDefault(_mapInstanceProperty);
|
|
37
37
|
var _Object$entries__default = /*#__PURE__*/_interopDefault(_Object$entries);
|
|
38
|
-
var _trimInstanceProperty__default = /*#__PURE__*/_interopDefault(_trimInstanceProperty);
|
|
39
38
|
var _concatInstanceProperty__default = /*#__PURE__*/_interopDefault(_concatInstanceProperty);
|
|
39
|
+
var _trimInstanceProperty__default = /*#__PURE__*/_interopDefault(_trimInstanceProperty);
|
|
40
40
|
var _Object$getOwnPropertySymbols__default = /*#__PURE__*/_interopDefault(_Object$getOwnPropertySymbols);
|
|
41
41
|
var _filterInstanceProperty__default = /*#__PURE__*/_interopDefault(_filterInstanceProperty);
|
|
42
42
|
var _Object$getOwnPropertyDescriptor__default = /*#__PURE__*/_interopDefault(_Object$getOwnPropertyDescriptor);
|
|
@@ -57,7 +57,7 @@ function createAssetHash(content) {
|
|
|
57
57
|
* CSP headers sent.
|
|
58
58
|
* For more information head to: developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src#Sources
|
|
59
59
|
*/
|
|
60
|
-
return
|
|
60
|
+
return "sha256-".concat(sha256Hash);
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
const sanitizeAppEnvironment = env => serialize__default["default"](env, {
|
|
@@ -65,7 +65,7 @@ const sanitizeAppEnvironment = env => serialize__default["default"](env, {
|
|
|
65
65
|
});
|
|
66
66
|
|
|
67
67
|
function ownKeys(e, r) { var t = _Object$keys__default["default"](e); if (_Object$getOwnPropertySymbols__default["default"]) { var o = _Object$getOwnPropertySymbols__default["default"](e); r && (o = _filterInstanceProperty__default["default"](o).call(o, function (r) { return _Object$getOwnPropertyDescriptor__default["default"](e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
68
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var
|
|
68
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context8, _context9; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty__default["default"](_context8 = ownKeys(Object(t), !0)).call(_context8, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors__default["default"] ? _Object$defineProperties__default["default"](e, _Object$getOwnPropertyDescriptors__default["default"](t)) : _forEachInstanceProperty__default["default"](_context9 = ownKeys(Object(t))).call(_context9, function (r) { _Object$defineProperty__default["default"](e, r, _Object$getOwnPropertyDescriptor__default["default"](t, r)); }); } return e; }
|
|
69
69
|
// https://babeljs.io/blog/2017/09/11/zero-config-with-babel-macros
|
|
70
70
|
const htmlScripts$1 = {
|
|
71
71
|
"loadingScreen": "window.onAppLoaded=function(){var e=document.querySelector(\"#app-loader\");e&&e.parentNode.removeChild(e)},setTimeout(function(){var e=document.querySelector(\".loading-screen\");e&&e.classList.remove(\"loading-screen--hidden\")},250),setTimeout(function(){var e=document.querySelector(\".long-loading-notice\");e&&e.classList.remove(\"long-loading-notice--hidden\")},2e3);",
|
|
@@ -82,20 +82,21 @@ const parseCSPDirectives = function () {
|
|
|
82
82
|
return _Object$assign__default["default"](mergedDirectives, _reduceInstanceProperty__default["default"](_context = _Object$keys__default["default"](directive)).call(_context, (mergedDirectiveValues, directiveKey) => {
|
|
83
83
|
const existingDirectiveValue = mergedDirectives[directiveKey];
|
|
84
84
|
return _Object$assign__default["default"](mergedDirectiveValues, {
|
|
85
|
-
[directiveKey]: [...toArray(existingDirectiveValue
|
|
85
|
+
[directiveKey]: [...toArray(existingDirectiveValue !== null && existingDirectiveValue !== void 0 ? existingDirectiveValue : []), ...toArray(directive[directiveKey])]
|
|
86
86
|
});
|
|
87
87
|
}, {}));
|
|
88
88
|
}, {});
|
|
89
89
|
return _mapInstanceProperty__default["default"](_context2 = _Object$entries__default["default"](mergedDirectives)).call(_context2, _ref => {
|
|
90
|
+
var _context3;
|
|
90
91
|
let _ref2 = _slicedToArray(_ref, 2),
|
|
91
92
|
directive = _ref2[0],
|
|
92
93
|
value = _ref2[1];
|
|
93
|
-
return
|
|
94
|
+
return _concatInstanceProperty__default["default"](_context3 = "".concat(directive, " ")).call(_context3, _Array$isArray__default["default"](value) ? value.join(' ') : value);
|
|
94
95
|
}).join('; ');
|
|
95
96
|
};
|
|
96
97
|
const parsePermissionsPolicyDirectives = (defaultValue, customDirectives) => {
|
|
97
|
-
var
|
|
98
|
-
const mergedDirectives = _mapInstanceProperty__default["default"](
|
|
98
|
+
var _context4;
|
|
99
|
+
const mergedDirectives = _mapInstanceProperty__default["default"](_context4 = defaultValue.split(',')).call(_context4, directive => {
|
|
99
100
|
const _directive$trim$split = _trimInstanceProperty__default["default"](directive).call(directive).split('='),
|
|
100
101
|
_directive$trim$split2 = _slicedToArray(_directive$trim$split, 2),
|
|
101
102
|
directiveName = _directive$trim$split2[0],
|
|
@@ -109,12 +110,12 @@ const parsePermissionsPolicyDirectives = (defaultValue, customDirectives) => {
|
|
|
109
110
|
return mergedDirectives.join(', ');
|
|
110
111
|
};
|
|
111
112
|
const processHeaders = applicationConfig => {
|
|
112
|
-
var
|
|
113
|
+
var _context5, _context6, _context7, _applicationConfig$he, _applicationConfig$he2, _applicationConfig$he3, _applicationConfig$he4;
|
|
113
114
|
const isMcDevEnv = applicationConfig.env.env === 'development';
|
|
114
115
|
|
|
115
116
|
// List hashes for injected inline scripts.
|
|
116
117
|
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src
|
|
117
|
-
const htmlScriptsHashes = [createAssetHash(htmlScripts$1.loadingScreen), createAssetHash(
|
|
118
|
+
const htmlScriptsHashes = [createAssetHash(htmlScripts$1.loadingScreen), createAssetHash("window.app = ".concat(sanitizeAppEnvironment(applicationConfig.env), ";")), createAssetHash(htmlScripts$1.publicPath)];
|
|
118
119
|
|
|
119
120
|
// // List hashes for injected inline styles.
|
|
120
121
|
// // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/style-src
|
|
@@ -126,15 +127,15 @@ const processHeaders = applicationConfig => {
|
|
|
126
127
|
*/
|
|
127
128
|
const defaultCSPDirectives = _Object$assign__default["default"]({
|
|
128
129
|
'default-src': "'none'",
|
|
129
|
-
'script-src': _concatInstanceProperty__default["default"](
|
|
130
|
+
'script-src': _concatInstanceProperty__default["default"](_context5 = ["'self'"]).call(_context5, isMcDevEnv ?
|
|
130
131
|
// Allow webpack to load source maps on runtime when errors occur
|
|
131
132
|
// using script tags
|
|
132
|
-
['localhost:*', "'unsafe-inline'"] : _mapInstanceProperty__default["default"](htmlScriptsHashes).call(htmlScriptsHashes, assetHash =>
|
|
133
|
-
'connect-src': _concatInstanceProperty__default["default"](
|
|
133
|
+
['localhost:*', "'unsafe-inline'"] : _mapInstanceProperty__default["default"](htmlScriptsHashes).call(htmlScriptsHashes, assetHash => "'".concat(assetHash, "'"))),
|
|
134
|
+
'connect-src': _concatInstanceProperty__default["default"](_context6 = ["'self'", 'app.launchdarkly.com', 'clientstream.launchdarkly.com', 'events.launchdarkly.com', 'app.getsentry.com',
|
|
134
135
|
// Match all attempts to load from any subdomain of `sentry.io`
|
|
135
|
-
'*.sentry.io']).call(
|
|
136
|
+
'*.sentry.io']).call(_context6, isMcDevEnv ? ['ws:', 'localhost:8080', 'webpack-internal:'] : []),
|
|
136
137
|
'img-src': ['*', 'data:'],
|
|
137
|
-
'style-src': _concatInstanceProperty__default["default"](
|
|
138
|
+
'style-src': _concatInstanceProperty__default["default"](_context7 = ["'self'", 'fonts.googleapis.com', 'data:']).call(_context7,
|
|
138
139
|
// TODO: investigate what needs to be done to avoid unsafe-inline styles
|
|
139
140
|
// https://github.com/commercetools/merchant-center-frontend/pull/5223#discussion_r210367636
|
|
140
141
|
["'unsafe-inline'"]
|
|
@@ -161,9 +162,9 @@ const processHeaders = applicationConfig => {
|
|
|
161
162
|
return _objectSpread(_objectSpread({}, constants.HTTP_SECURITY_HEADERS), {}, {
|
|
162
163
|
// The `Content-Security-Policy` header is always generated
|
|
163
164
|
// based on the Merchant Center customization config.
|
|
164
|
-
[constants.HTTP_SECURITY_HEADER_KEYS['Content-Security-Policy']]: parseCSPDirectives(defaultCSPDirectives, applicationConfig.headers
|
|
165
|
-
}, applicationConfig.headers
|
|
166
|
-
[constants.HTTP_SECURITY_HEADER_KEYS['Permissions-Policy']]: parsePermissionsPolicyDirectives(constants.HTTP_SECURITY_HEADERS['Permissions-Policy'], applicationConfig.headers.permissionsPolicies
|
|
165
|
+
[constants.HTTP_SECURITY_HEADER_KEYS['Content-Security-Policy']]: parseCSPDirectives(defaultCSPDirectives, (_applicationConfig$he = (_applicationConfig$he2 = applicationConfig.headers) === null || _applicationConfig$he2 === void 0 ? void 0 : _applicationConfig$he2.csp) !== null && _applicationConfig$he !== void 0 ? _applicationConfig$he : {})
|
|
166
|
+
}, (_applicationConfig$he3 = applicationConfig.headers) !== null && _applicationConfig$he3 !== void 0 && _applicationConfig$he3.permissionsPolicies ? {
|
|
167
|
+
[constants.HTTP_SECURITY_HEADER_KEYS['Permissions-Policy']]: parsePermissionsPolicyDirectives(constants.HTTP_SECURITY_HEADERS['Permissions-Policy'], (_applicationConfig$he4 = applicationConfig.headers.permissionsPolicies) !== null && _applicationConfig$he4 !== void 0 ? _applicationConfig$he4 : {})
|
|
167
168
|
} : {});
|
|
168
169
|
};
|
|
169
170
|
|
|
@@ -176,9 +177,11 @@ const htmlStyles = {
|
|
|
176
177
|
"loadingScreen": ".loading-screen{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh;width:100vw}.loading-screen--hidden{display:none}.loading-screen>*+*{margin:24px 0 0}.loading-spinner{width:32px;height:32px}.long-loading-notice{color:#999;font-family:'Open Sans',sans-serif;font-size:12px}.long-loading-notice--hidden{visibility:hidden}.loading-spinner-circle{fill:#213c45;opacity:.2}@keyframes loading-spinner-animation{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.loading-spinner-pointer{transform-origin:20px 20px 0;animation:loading-spinner-animation .5s infinite linear}"
|
|
177
178
|
};
|
|
178
179
|
const trimTrailingSlash = value => value.replace(/\/$/, '');
|
|
179
|
-
const replaceHtmlPlaceholders = (indexHtmlContent, options) =>
|
|
180
|
-
|
|
181
|
-
|
|
180
|
+
const replaceHtmlPlaceholders = (indexHtmlContent, options) => {
|
|
181
|
+
var _options$headers$Cont, _options$headers;
|
|
182
|
+
return indexHtmlContent.replace(new RegExp('__CSP__', 'g'), (_options$headers$Cont = (_options$headers = options.headers) === null || _options$headers === void 0 ? void 0 : _options$headers['Content-Security-Policy']) !== null && _options$headers$Cont !== void 0 ? _options$headers$Cont : '').replace(new RegExp('__CDN_URL__', 'g'), options.env.cdnUrl ? // Ensure there is a trailing slash
|
|
183
|
+
"".concat(trimTrailingSlash(options.env.cdnUrl), "/") : '').replace(new RegExp('__MC_API_URL__', 'g'), trimTrailingSlash(options.env.mcApiUrl)).replace(new RegExp('__APPLICATION_ENVIRONMENT__', 'g'), "<script>window.app = ".concat(sanitizeAppEnvironment(options.env), ";</script>")).replace(new RegExp('__LOADING_SCREEN_JS__', 'g'), "<script>".concat(htmlScripts.loadingScreen, "</script>")).replace(new RegExp('__LOADING_SCREEN_CSS__', 'g'), "<style>".concat(htmlStyles.loadingScreen, "</style>"));
|
|
184
|
+
};
|
|
182
185
|
|
|
183
186
|
async function compileHtml(indexHtmlTemplatePath) {
|
|
184
187
|
const applicationConfig$1 = await applicationConfig.processConfig();
|
|
@@ -8,8 +8,8 @@ import _Object$assign from '@babel/runtime-corejs3/core-js-stable/object/assign'
|
|
|
8
8
|
import _Object$keys from '@babel/runtime-corejs3/core-js-stable/object/keys';
|
|
9
9
|
import _mapInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/map';
|
|
10
10
|
import _Object$entries from '@babel/runtime-corejs3/core-js-stable/object/entries';
|
|
11
|
-
import _trimInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/trim';
|
|
12
11
|
import _concatInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/concat';
|
|
12
|
+
import _trimInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/trim';
|
|
13
13
|
import _Object$getOwnPropertySymbols from '@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols';
|
|
14
14
|
import _filterInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/filter';
|
|
15
15
|
import _Object$getOwnPropertyDescriptor from '@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor';
|
|
@@ -32,7 +32,7 @@ function createAssetHash(content) {
|
|
|
32
32
|
* CSP headers sent.
|
|
33
33
|
* For more information head to: developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src#Sources
|
|
34
34
|
*/
|
|
35
|
-
return
|
|
35
|
+
return "sha256-".concat(sha256Hash);
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
const sanitizeAppEnvironment = env => serialize(env, {
|
|
@@ -40,7 +40,7 @@ const sanitizeAppEnvironment = env => serialize(env, {
|
|
|
40
40
|
});
|
|
41
41
|
|
|
42
42
|
function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
43
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var
|
|
43
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context8, _context9; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context8 = ownKeys(Object(t), !0)).call(_context8, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context9 = ownKeys(Object(t))).call(_context9, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
44
44
|
// https://babeljs.io/blog/2017/09/11/zero-config-with-babel-macros
|
|
45
45
|
const htmlScripts$1 = {
|
|
46
46
|
"loadingScreen": "window.onAppLoaded=function(){var e=document.querySelector(\"#app-loader\");e&&e.parentNode.removeChild(e)},setTimeout(function(){var e=document.querySelector(\".loading-screen\");e&&e.classList.remove(\"loading-screen--hidden\")},250),setTimeout(function(){var e=document.querySelector(\".long-loading-notice\");e&&e.classList.remove(\"long-loading-notice--hidden\")},2e3);",
|
|
@@ -57,20 +57,21 @@ const parseCSPDirectives = function () {
|
|
|
57
57
|
return _Object$assign(mergedDirectives, _reduceInstanceProperty(_context = _Object$keys(directive)).call(_context, (mergedDirectiveValues, directiveKey) => {
|
|
58
58
|
const existingDirectiveValue = mergedDirectives[directiveKey];
|
|
59
59
|
return _Object$assign(mergedDirectiveValues, {
|
|
60
|
-
[directiveKey]: [...toArray(existingDirectiveValue
|
|
60
|
+
[directiveKey]: [...toArray(existingDirectiveValue !== null && existingDirectiveValue !== void 0 ? existingDirectiveValue : []), ...toArray(directive[directiveKey])]
|
|
61
61
|
});
|
|
62
62
|
}, {}));
|
|
63
63
|
}, {});
|
|
64
64
|
return _mapInstanceProperty(_context2 = _Object$entries(mergedDirectives)).call(_context2, _ref => {
|
|
65
|
+
var _context3;
|
|
65
66
|
let _ref2 = _slicedToArray(_ref, 2),
|
|
66
67
|
directive = _ref2[0],
|
|
67
68
|
value = _ref2[1];
|
|
68
|
-
return
|
|
69
|
+
return _concatInstanceProperty(_context3 = "".concat(directive, " ")).call(_context3, _Array$isArray(value) ? value.join(' ') : value);
|
|
69
70
|
}).join('; ');
|
|
70
71
|
};
|
|
71
72
|
const parsePermissionsPolicyDirectives = (defaultValue, customDirectives) => {
|
|
72
|
-
var
|
|
73
|
-
const mergedDirectives = _mapInstanceProperty(
|
|
73
|
+
var _context4;
|
|
74
|
+
const mergedDirectives = _mapInstanceProperty(_context4 = defaultValue.split(',')).call(_context4, directive => {
|
|
74
75
|
const _directive$trim$split = _trimInstanceProperty(directive).call(directive).split('='),
|
|
75
76
|
_directive$trim$split2 = _slicedToArray(_directive$trim$split, 2),
|
|
76
77
|
directiveName = _directive$trim$split2[0],
|
|
@@ -84,12 +85,12 @@ const parsePermissionsPolicyDirectives = (defaultValue, customDirectives) => {
|
|
|
84
85
|
return mergedDirectives.join(', ');
|
|
85
86
|
};
|
|
86
87
|
const processHeaders = applicationConfig => {
|
|
87
|
-
var
|
|
88
|
+
var _context5, _context6, _context7, _applicationConfig$he, _applicationConfig$he2, _applicationConfig$he3, _applicationConfig$he4;
|
|
88
89
|
const isMcDevEnv = applicationConfig.env.env === 'development';
|
|
89
90
|
|
|
90
91
|
// List hashes for injected inline scripts.
|
|
91
92
|
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src
|
|
92
|
-
const htmlScriptsHashes = [createAssetHash(htmlScripts$1.loadingScreen), createAssetHash(
|
|
93
|
+
const htmlScriptsHashes = [createAssetHash(htmlScripts$1.loadingScreen), createAssetHash("window.app = ".concat(sanitizeAppEnvironment(applicationConfig.env), ";")), createAssetHash(htmlScripts$1.publicPath)];
|
|
93
94
|
|
|
94
95
|
// // List hashes for injected inline styles.
|
|
95
96
|
// // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/style-src
|
|
@@ -101,15 +102,15 @@ const processHeaders = applicationConfig => {
|
|
|
101
102
|
*/
|
|
102
103
|
const defaultCSPDirectives = _Object$assign({
|
|
103
104
|
'default-src': "'none'",
|
|
104
|
-
'script-src': _concatInstanceProperty(
|
|
105
|
+
'script-src': _concatInstanceProperty(_context5 = ["'self'"]).call(_context5, isMcDevEnv ?
|
|
105
106
|
// Allow webpack to load source maps on runtime when errors occur
|
|
106
107
|
// using script tags
|
|
107
|
-
['localhost:*', "'unsafe-inline'"] : _mapInstanceProperty(htmlScriptsHashes).call(htmlScriptsHashes, assetHash =>
|
|
108
|
-
'connect-src': _concatInstanceProperty(
|
|
108
|
+
['localhost:*', "'unsafe-inline'"] : _mapInstanceProperty(htmlScriptsHashes).call(htmlScriptsHashes, assetHash => "'".concat(assetHash, "'"))),
|
|
109
|
+
'connect-src': _concatInstanceProperty(_context6 = ["'self'", 'app.launchdarkly.com', 'clientstream.launchdarkly.com', 'events.launchdarkly.com', 'app.getsentry.com',
|
|
109
110
|
// Match all attempts to load from any subdomain of `sentry.io`
|
|
110
|
-
'*.sentry.io']).call(
|
|
111
|
+
'*.sentry.io']).call(_context6, isMcDevEnv ? ['ws:', 'localhost:8080', 'webpack-internal:'] : []),
|
|
111
112
|
'img-src': ['*', 'data:'],
|
|
112
|
-
'style-src': _concatInstanceProperty(
|
|
113
|
+
'style-src': _concatInstanceProperty(_context7 = ["'self'", 'fonts.googleapis.com', 'data:']).call(_context7,
|
|
113
114
|
// TODO: investigate what needs to be done to avoid unsafe-inline styles
|
|
114
115
|
// https://github.com/commercetools/merchant-center-frontend/pull/5223#discussion_r210367636
|
|
115
116
|
["'unsafe-inline'"]
|
|
@@ -136,9 +137,9 @@ const processHeaders = applicationConfig => {
|
|
|
136
137
|
return _objectSpread(_objectSpread({}, HTTP_SECURITY_HEADERS), {}, {
|
|
137
138
|
// The `Content-Security-Policy` header is always generated
|
|
138
139
|
// based on the Merchant Center customization config.
|
|
139
|
-
[HTTP_SECURITY_HEADER_KEYS['Content-Security-Policy']]: parseCSPDirectives(defaultCSPDirectives, applicationConfig.headers
|
|
140
|
-
}, applicationConfig.headers
|
|
141
|
-
[HTTP_SECURITY_HEADER_KEYS['Permissions-Policy']]: parsePermissionsPolicyDirectives(HTTP_SECURITY_HEADERS['Permissions-Policy'], applicationConfig.headers.permissionsPolicies
|
|
140
|
+
[HTTP_SECURITY_HEADER_KEYS['Content-Security-Policy']]: parseCSPDirectives(defaultCSPDirectives, (_applicationConfig$he = (_applicationConfig$he2 = applicationConfig.headers) === null || _applicationConfig$he2 === void 0 ? void 0 : _applicationConfig$he2.csp) !== null && _applicationConfig$he !== void 0 ? _applicationConfig$he : {})
|
|
141
|
+
}, (_applicationConfig$he3 = applicationConfig.headers) !== null && _applicationConfig$he3 !== void 0 && _applicationConfig$he3.permissionsPolicies ? {
|
|
142
|
+
[HTTP_SECURITY_HEADER_KEYS['Permissions-Policy']]: parsePermissionsPolicyDirectives(HTTP_SECURITY_HEADERS['Permissions-Policy'], (_applicationConfig$he4 = applicationConfig.headers.permissionsPolicies) !== null && _applicationConfig$he4 !== void 0 ? _applicationConfig$he4 : {})
|
|
142
143
|
} : {});
|
|
143
144
|
};
|
|
144
145
|
|
|
@@ -151,9 +152,11 @@ const htmlStyles = {
|
|
|
151
152
|
"loadingScreen": ".loading-screen{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh;width:100vw}.loading-screen--hidden{display:none}.loading-screen>*+*{margin:24px 0 0}.loading-spinner{width:32px;height:32px}.long-loading-notice{color:#999;font-family:'Open Sans',sans-serif;font-size:12px}.long-loading-notice--hidden{visibility:hidden}.loading-spinner-circle{fill:#213c45;opacity:.2}@keyframes loading-spinner-animation{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.loading-spinner-pointer{transform-origin:20px 20px 0;animation:loading-spinner-animation .5s infinite linear}"
|
|
152
153
|
};
|
|
153
154
|
const trimTrailingSlash = value => value.replace(/\/$/, '');
|
|
154
|
-
const replaceHtmlPlaceholders = (indexHtmlContent, options) =>
|
|
155
|
-
|
|
156
|
-
|
|
155
|
+
const replaceHtmlPlaceholders = (indexHtmlContent, options) => {
|
|
156
|
+
var _options$headers$Cont, _options$headers;
|
|
157
|
+
return indexHtmlContent.replace(new RegExp('__CSP__', 'g'), (_options$headers$Cont = (_options$headers = options.headers) === null || _options$headers === void 0 ? void 0 : _options$headers['Content-Security-Policy']) !== null && _options$headers$Cont !== void 0 ? _options$headers$Cont : '').replace(new RegExp('__CDN_URL__', 'g'), options.env.cdnUrl ? // Ensure there is a trailing slash
|
|
158
|
+
"".concat(trimTrailingSlash(options.env.cdnUrl), "/") : '').replace(new RegExp('__MC_API_URL__', 'g'), trimTrailingSlash(options.env.mcApiUrl)).replace(new RegExp('__APPLICATION_ENVIRONMENT__', 'g'), "<script>window.app = ".concat(sanitizeAppEnvironment(options.env), ";</script>")).replace(new RegExp('__LOADING_SCREEN_JS__', 'g'), "<script>".concat(htmlScripts.loadingScreen, "</script>")).replace(new RegExp('__LOADING_SCREEN_CSS__', 'g'), "<style>".concat(htmlStyles.loadingScreen, "</style>"));
|
|
159
|
+
};
|
|
157
160
|
|
|
158
161
|
async function compileHtml(indexHtmlTemplatePath) {
|
|
159
162
|
const applicationConfig = await processConfig();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@commercetools-frontend/mc-html-template",
|
|
3
|
-
"version": "24.
|
|
3
|
+
"version": "24.13.0",
|
|
4
4
|
"description": "Everything related to render the index.html for a MC application",
|
|
5
5
|
"bugs": "https://github.com/commercetools/merchant-center-application-kit/issues",
|
|
6
6
|
"repository": {
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"@babel/runtime": "^7.22.15",
|
|
40
40
|
"@babel/runtime-corejs3": "^7.22.15",
|
|
41
|
-
"@commercetools-frontend/application-config": "24.
|
|
42
|
-
"@commercetools-frontend/constants": "24.
|
|
41
|
+
"@commercetools-frontend/application-config": "24.13.0",
|
|
42
|
+
"@commercetools-frontend/constants": "24.13.0",
|
|
43
43
|
"serialize-javascript": "6.0.2",
|
|
44
44
|
"uglify-js": "3.19.3",
|
|
45
45
|
"uglifycss": "0.0.29"
|
|
@@ -31,8 +31,8 @@ function webpackHtmlTemplate(templateParams) {
|
|
|
31
31
|
// Trim leading slash, the CDN_URL will ensure to have a trailing slash
|
|
32
32
|
// (see `replaceHtmlPlaceholders`)
|
|
33
33
|
fileName.replace(/^\//, ''));
|
|
34
|
-
const cssImports = _mapInstanceProperty__default["default"](cssChunks).call(cssChunks, chunkPath =>
|
|
35
|
-
const scriptImports = _mapInstanceProperty__default["default"](scriptChunks).call(scriptChunks, chunkPath =>
|
|
34
|
+
const cssImports = _mapInstanceProperty__default["default"](cssChunks).call(cssChunks, chunkPath => "<link href=\"__CDN_URL__".concat(chunkPath, "\" rel='stylesheet' type='text/css'>"));
|
|
35
|
+
const scriptImports = _mapInstanceProperty__default["default"](scriptChunks).call(scriptChunks, chunkPath => "<script src=\"__CDN_URL__".concat(chunkPath, "\" defer></script>"));
|
|
36
36
|
return generateTemplate.generateTemplate({
|
|
37
37
|
cssImports,
|
|
38
38
|
scriptImports
|
|
@@ -31,8 +31,8 @@ function webpackHtmlTemplate(templateParams) {
|
|
|
31
31
|
// Trim leading slash, the CDN_URL will ensure to have a trailing slash
|
|
32
32
|
// (see `replaceHtmlPlaceholders`)
|
|
33
33
|
fileName.replace(/^\//, ''));
|
|
34
|
-
const cssImports = _mapInstanceProperty__default["default"](cssChunks).call(cssChunks, chunkPath =>
|
|
35
|
-
const scriptImports = _mapInstanceProperty__default["default"](scriptChunks).call(scriptChunks, chunkPath =>
|
|
34
|
+
const cssImports = _mapInstanceProperty__default["default"](cssChunks).call(cssChunks, chunkPath => "<link href=\"__CDN_URL__".concat(chunkPath, "\" rel='stylesheet' type='text/css'>"));
|
|
35
|
+
const scriptImports = _mapInstanceProperty__default["default"](scriptChunks).call(scriptChunks, chunkPath => "<script src=\"__CDN_URL__".concat(chunkPath, "\" defer></script>"));
|
|
36
36
|
return generateTemplate.generateTemplate({
|
|
37
37
|
cssImports,
|
|
38
38
|
scriptImports
|
|
@@ -20,8 +20,8 @@ function webpackHtmlTemplate(templateParams) {
|
|
|
20
20
|
// Trim leading slash, the CDN_URL will ensure to have a trailing slash
|
|
21
21
|
// (see `replaceHtmlPlaceholders`)
|
|
22
22
|
fileName.replace(/^\//, ''));
|
|
23
|
-
const cssImports = _mapInstanceProperty(cssChunks).call(cssChunks, chunkPath =>
|
|
24
|
-
const scriptImports = _mapInstanceProperty(scriptChunks).call(scriptChunks, chunkPath =>
|
|
23
|
+
const cssImports = _mapInstanceProperty(cssChunks).call(cssChunks, chunkPath => "<link href=\"__CDN_URL__".concat(chunkPath, "\" rel='stylesheet' type='text/css'>"));
|
|
24
|
+
const scriptImports = _mapInstanceProperty(scriptChunks).call(scriptChunks, chunkPath => "<script src=\"__CDN_URL__".concat(chunkPath, "\" defer></script>"));
|
|
25
25
|
return generateTemplate({
|
|
26
26
|
cssImports,
|
|
27
27
|
scriptImports
|