diff --git a/js/bundler/bundler-general.js b/js/bundler/bundler-general.js index aa264c8d94..6fd15bf2e1 100644 --- a/js/bundler/bundler-general.js +++ b/js/bundler/bundler-general.js @@ -44,6 +44,7 @@ class BundlerGeneral { * noDuplicates?: boolean, * dependentOn?: string[], * requires?: string[], + * mapDependencies?: boolean, * }>, * modulePaths?: Record., * lookupPatterns: string[], @@ -93,6 +94,8 @@ class BundlerGeneral { notBundledMap[name] = data.notBundledModules; result[name] = data.contents; + console.log(` Chunk '${name}' done, ${data.files.length} files.`) + if (i === 0 && this.config.mainChunk) { return; } @@ -101,9 +104,13 @@ class BundlerGeneral { let bundleFile = this.filePattern.replace('{*}', name); - let requires = this.config.chunks[name].requires; + let requires = [].concat(this.config.chunks[name].requires ?? []); - if (requires) { + if (this.config.chunks[name].mapDependencies) { + requires = requires.concat(data.dependencyModules); + } + + if (requires.length) { let part = JSON.stringify(requires); result[mainName] += `Espo.loader.mapBundleDependencies('${name}', ${part});\n`; @@ -144,12 +151,13 @@ class BundlerGeneral { * files: string[], * templateFiles: string[], * notBundledModules: string[], + * dependencyModules: [], * }} */ #bundleChunk(name, isMain, alreadyBundled) { let contents = ''; - let modules = []; + let dependencyModules = []; let params = this.config.chunks[name]; @@ -197,6 +205,7 @@ class BundlerGeneral { bundledFiles = data.files; notBundledModules = data.notBundledModules; + dependencyModules = data.dependencyModules; } // Pre-compiled templates turned out to be slower if too many are bundled. @@ -220,6 +229,7 @@ class BundlerGeneral { files: bundledFiles, templateFiles: bundledTemplateFiles, notBundledModules: notBundledModules, + dependencyModules: dependencyModules, }; } } diff --git a/js/bundler/bundler.js b/js/bundler/bundler.js index b6c76d4abf..9ee778ffa7 100644 --- a/js/bundler/bundler.js +++ b/js/bundler/bundler.js @@ -55,24 +55,25 @@ class Bundler { * Bundles Espo js files into chunks. * * @param {{ - * name: string, - * files?: string[], - * patterns: string[], - * ignoreFiles?: string[], - * lookupPatterns?: string[], - * ignoreFullPathFiles?: string[], - * dependentOn?: string[], - * libs: { - * src?: string, - * bundle?: boolean, - * key?: string, - * }[], + * name: string, + * files?: string[], + * patterns: string[], + * ignoreFiles?: string[], + * lookupPatterns?: string[], + * ignoreFullPathFiles?: string[], + * dependentOn?: string[], + * libs: { + * src?: string, + * bundle?: boolean, + * key?: string, + * }[], * }} params * @return {{ - * contents: string, - * files: string[], - * modules: string[], - * notBundledModules: string[], + * contents: string, + * files: string[], + * modules: string[], + * notBundledModules: string[], + * dependencyModules: string[], * }} */ bundle(params) { @@ -95,7 +96,7 @@ class Bundler { let notBundledModules = []; - let sortedFiles = this.#sortFiles( + let {files: sortedFiles, depModules} = this.#sortFiles( params.name, fullPathFiles, allFiles, @@ -117,6 +118,7 @@ class Bundler { files: sortedFiles, modules: modules, notBundledModules: notBundledModules, + dependencyModules: depModules, }; } @@ -166,7 +168,10 @@ class Bundler { * @param {string[]} ignoreFiles * @param {string[]} notBundledModules * @param {string[]|null} dependentOn - * @return {string[]} + * @return {{ + * files: string[], + * depModules: string[], + * }} */ #sortFiles( name, @@ -207,18 +212,22 @@ class Bundler { }); let depModules = []; + let allDepModules = []; modules .forEach(name => { let deps = this.#obtainAllDeps(name, map); + deps + .filter(item => !modules.includes(item)) + .filter(item => !allDepModules.includes(item)) + .forEach(item => allDepModules.push(item)); + deps .filter(item => !item.includes('!')) .filter(item => !modules.includes(item)) .filter(item => !depModules.includes(item)) - .forEach(item => { - depModules.push(item); - }); + .forEach(item => depModules.push(item)); }); modules = modules @@ -264,7 +273,10 @@ class Bundler { return moduleFileMap[name]; }); - return standalonePathList.concat(modulePaths); + return { + files: standalonePathList.concat(modulePaths), + depModules: allDepModules, + }; } /**