diff --git a/application/Espo/Core/Utils/Client/DevModeJsFileListProvider.php b/application/Espo/Core/Utils/Client/DevModeJsFileListProvider.php index 185a96710f..fa8ce9d6ba 100644 --- a/application/Espo/Core/Utils/Client/DevModeJsFileListProvider.php +++ b/application/Espo/Core/Utils/Client/DevModeJsFileListProvider.php @@ -30,6 +30,7 @@ namespace Espo\Core\Utils\Client; use Espo\Core\Utils\File\Manager as FileManager; +use RuntimeException; /** * @internal Also used by the installer w/o DI. @@ -61,38 +62,40 @@ class DevModeJsFileListProvider $list = array_merge( $list, array_map( - fn($item) => self::prepareBundleLibFilePath($item), - $this->getLibFileListFromItems($files) + fn ($item) => self::prepareBundleLibFilePath($item), + $files ) ); continue; } - $list[] = self::prepareBundleLibFilePath($item->src); + if (!isset($item->src)) { + continue; + } + + $list[] = self::prepareBundleLibFilePath($item); } return $list; } - /** - * @param \stdClass[] $items - * @return string[] - */ - private function getLibFileListFromItems(array $items): array - { - $list = []; - foreach ($items as $item) { - $list[] = $item->src; + private function prepareBundleLibFilePath(object $item): string + { + $amdId = $item->amdId ?? null; + + if ($amdId) { + return 'client/lib/original/' . $amdId . '.js'; } - return $list; - } + $src = $item->src ?? null; - private function prepareBundleLibFilePath(string $path): string - { - $arr = explode('/', $path); + if (!$src) { + throw new RuntimeException("Missing 'src' in bundled lib definition."); + } + + $arr = explode('/', $src); return 'client/lib/original/' . array_slice($arr, -1)[0]; } diff --git a/frontend/libs.json b/frontend/libs.json index 6f36fa85df..4d84e85a25 100644 --- a/frontend/libs.json +++ b/frontend/libs.json @@ -125,6 +125,10 @@ "bundle": true, "amdId": "intl-tel-input-utils" }, + { + "bundle": true, + "amdId": "intl-tel-input-globals" + }, { "src": "node_modules/summernote/dist/summernote.js", "amdId": "summernote", diff --git a/js/build-utils.js b/js/build-utils.js index 72bc6fb1e6..79f9ce777a 100644 --- a/js/build-utils.js +++ b/js/build-utils.js @@ -27,33 +27,48 @@ ************************************************************************/ const BuildUtils = { + /** + * @param {Array} libs + * @return {{src: string, file: string}[]} + */ getBundleLibList: function(libs) { const list = []; - libs.forEach(item => { - if (!item.bundle) { - return; + const getFile = item => { + if (item.amdId) { + return item.amdId + '.js'; } - if (item.files) { - item.files.forEach(item => list.push(item.src)); + return item.src.split('/').slice(-1); + }; - return; - } + libs.filter(item => item.bundle) + .forEach(item => { + if (item.files) { + item.files.forEach(item => list.push({ + src: item.src, + file: getFile(item), + })); - if (!item.src) { - throw new Error("No lib src."); - } + return; + } - list.push(item.src); - }); + if (!item.src) { + return; + } + + list.push({ + src: item.src, + file: getFile(item), + }); + }); return list; }, getPreparedBundleLibList: function (libs) { return BuildUtils.getBundleLibList(libs) - .map(file => 'client/lib/original/' + file.split('/').slice(-1)); + .map(item => 'client/lib/original/' + item.file); }, destToOriginalDest: function (dest) { @@ -114,7 +129,7 @@ const BuildUtils = { } if (!item.src) { - throw new Error("No lib src."); + return; } list.push({ diff --git a/js/diff.js b/js/diff.js index 8b010627d4..145d1eddd6 100644 --- a/js/diff.js +++ b/js/diff.js @@ -556,19 +556,27 @@ class Diff .parse( cp.execSync("git show " + commitHash + ":frontend/libs.json").toString() || '[]' ) - .filter(item => item.bundle); + .filter(item => item.bundle) + .filter(item => item.src || item.files); } let libNewDataList = require(this.espoPath + '/frontend/libs.json') .filter(item => !item.bundle); let bundledNewDataList = require(this.espoPath + '/frontend/libs.json') - .filter(item => item.bundle); + .filter(item => item.bundle) + .filter(item => item.src || item.files); let resolveItemDest = item => item.dest || 'client/lib/' + item.src.split('/').pop(); - let resolveBundledItemDest = item => 'client/lib/original/' + item.src.split('/').pop(); + const resolveBundledItemDest = item => { + if (item.amdId) { + return `'client/lib/original/${item.amdId}.js`; + } + + return 'client/lib/original/' + item.src.split('/').pop(); + }; let resolveItemName = item => { if (item.name) { @@ -759,6 +767,10 @@ class Diff return; } + if (!item.src) { + return; + } + data.filesToCopy.push(resolveBundledItemDest(item)); }); @@ -786,6 +798,10 @@ class Diff return; } + if (!item.src) { + return; + } + data.filesToDelete.push(resolveBundledItemDest(item)); }); diff --git a/js/scripts/prepare-lib-original.js b/js/scripts/prepare-lib-original.js index f88cf6d257..9cbbbaa84e 100644 --- a/js/scripts/prepare-lib-original.js +++ b/js/scripts/prepare-lib-original.js @@ -94,8 +94,7 @@ const addSuppressAmd = path => { fs.writeFileSync(path, contents, {encoding: 'utf-8'}); } -/** @var {string[]} */ -const libSrcList = buildUtils.getBundleLibList(libs); +const bundleLibDataList = buildUtils.getBundleLibList(libs); const amdIdMap = {}; const suppressAmdMap = {}; @@ -114,8 +113,10 @@ libs.forEach(item => { amdIdMap[item.src] = 'lib!' + item.amdId; }); -libSrcList.forEach(src => { - const dest = originalLibDir + '/' + src.split('/').slice(-1); +bundleLibDataList.forEach(item => { + const src = item.src; + + const dest = originalLibDir + '/' + item.file; fs.copyFileSync(src, dest); stripSourceMappingUrl(dest);