Skip to content

Commit 68b4883

Browse files
committed
build: git extension minification working
1 parent 3f1cfa2 commit 68b4883

File tree

2 files changed

+173
-7
lines changed

2 files changed

+173
-7
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ Thumbs.db
33
# ignore jenkins build info
44
/build.prop
55

6+
/src/extensions/default/*/extension-min.js
7+
68
# ignore node_modules created by gulp and other build scripts
79
/node_modules
810
/npm-debug.log

gulpfile.js/index.js

Lines changed: 171 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ function cleanUnwantedFilesInDist() {
6666
'dist/nls/*/expertTranslations.json',
6767
'dist/nls/*/lastTranslated.json',
6868
'dist/nls/*/lastTranslatedLocale.json',
69-
'dist/nls/*/*.js.map'
69+
'dist/nls/*/*.js.map',
70+
'dist/extensions/default/*/unittests.js.map'
7071
]);
7172
}
7273

@@ -633,6 +634,169 @@ function _renameBracketsConcatAsBracketsJSInDist() {
633634
});
634635
}
635636

637+
/**
638+
* This function concatenates all JS files inside a single extension folder,
639+
* rewriting its define() calls to include the correct AMD module name,
640+
* and inlining `require("text!...")` contents where possible.
641+
*
642+
* @param {string} extensionName - e.g. 'ext_name' for src/extensions/default/ext_name
643+
* @returns {Promise<void>}
644+
*/
645+
function makeExtensionConcatJS(extensionName) {
646+
return new Promise((resolve, reject) => {
647+
try {
648+
const srcDir = 'src/extensions/default/';
649+
const extensionDir = `src/extensions/default/${extensionName}/`;
650+
const extensionMinFile = path.join(extensionDir, 'extension-min.js');
651+
console.log("Concatenating extension: ", extensionDir);
652+
653+
if (fs.existsSync(extensionMinFile)) {
654+
fs.unlinkSync(extensionMinFile);
655+
}
656+
// For example, we can store the final concatenated content here:
657+
// We start by reading the "main.js" for the extension.
658+
// You could also do something else if you want an empty string or an existing extension "entry" file.
659+
let concatenatedFile = fs.readFileSync(
660+
path.join(extensionDir, 'main.js'),
661+
'utf8'
662+
);
663+
664+
// Let's gather all .js files
665+
// (We are reusing your existing listAllJsFilesRecursively logic).
666+
const files = listAllJsFilesRecursively(extensionDir);
667+
668+
let mergeCount = 0;
669+
670+
// Optional: track any files you don't want to merge
671+
const DO_NOT_CONCATENATE = [
672+
// put full paths here if you have any special exceptions
673+
];
674+
const notConcatenatedJS = [];
675+
676+
for (let file of files) {
677+
file = file.replaceAll('\\', '/'); // Windows path fix to web-like
678+
console.log("the replace: ", file, extensionDir, srcDir);
679+
const relPath = file.replace(extensionDir, ''); // e.g. ext_name/someFile.js
680+
681+
// Skip the extension’s main.js because we already loaded it at the top
682+
if (file.endsWith('main.js') || file.endsWith("unittests.js")) {
683+
continue;
684+
}
685+
686+
if (DO_NOT_CONCATENATE.includes(file)) {
687+
notConcatenatedJS.push(file);
688+
continue;
689+
}
690+
691+
let content = fs.readFileSync(file, 'utf8');
692+
693+
// Check for the number of `define(` calls.
694+
const defineCount = content.split('define(').length - 1;
695+
// If no define calls, we choose to skip for AMD concatenation
696+
if (defineCount === 0) {
697+
notConcatenatedJS.push(file);
698+
continue;
699+
}
700+
if (defineCount !== 1) {
701+
throw new Error(
702+
`Multiple define statements detected in extension file: ${file}`
703+
);
704+
}
705+
706+
// Insert the AMD module name: define("ext_name/someFile", [deps], function(...){...});
707+
// remove .js extension for the define ID
708+
const defineId = relPath.replace('.js', '');
709+
// Replace first occurrence of define( with define("<the-id>",
710+
content = content.replace(
711+
'define(',
712+
`define("${defineId}", `
713+
);
714+
715+
// inline text requires
716+
content = inlineTextRequire(file, content, extensionDir);
717+
718+
concatenatedFile += '\n' + content;
719+
mergeCount++;
720+
}
721+
722+
console.log(
723+
`Concatenated ${mergeCount} files into extension-min.js for extension: ${extensionName}`
724+
);
725+
console.log('Skipped these JS files:', notConcatenatedJS);
726+
727+
// Finally, write to src/extensions/ext_name/extension-min.js
728+
fs.writeFileSync(extensionMinFile, concatenatedFile);
729+
730+
resolve();
731+
} catch (err) {
732+
console.error(err);
733+
reject(err);
734+
}
735+
});
736+
}
737+
738+
/**
739+
* Similar to _renameBracketsConcatAsBracketsJSInDist,
740+
* but this one handles each extension’s final output in dist.
741+
*
742+
* @param {string} extensionName - e.g. 'ext_name'
743+
* @returns {Promise<void>}
744+
*/
745+
function _renameExtensionConcatAsExtensionJSInDist(extensionName) {
746+
return new Promise((resolve, reject) => {
747+
try {
748+
const srcExtensionDir = `src/extensions/default/${extensionName}/`;
749+
const srcExtensionConcatFile = path.join(srcExtensionDir, 'extension-min.js');
750+
const distExtensionDir = path.join('dist/extensions/default', extensionName);
751+
const extMinFile = path.join(distExtensionDir, 'main.js');
752+
const extMinFileMap = path.join(distExtensionDir, 'main.js.map');
753+
const extSrcFile = path.join(distExtensionDir, 'extension-min.js');
754+
const extSrcFileMap = path.join(distExtensionDir, 'extension-min.js.map');
755+
756+
// Make sure extension-min.js exists in dist.
757+
if (!fs.existsSync(extSrcFile)) {
758+
return reject(
759+
new Error(
760+
`No extension-min.js found for ${extensionName} in ${extSrcFile}.`
761+
)
762+
);
763+
}
764+
765+
if (fs.existsSync(srcExtensionConcatFile)) {
766+
fs.unlinkSync(srcExtensionConcatFile);
767+
}
768+
if (fs.existsSync(extMinFile)) {
769+
fs.unlinkSync(extMinFile);
770+
}
771+
fs.copyFileSync(extSrcFile, extMinFile);
772+
773+
if (fs.existsSync(extMinFileMap)) {
774+
fs.unlinkSync(extMinFileMap);
775+
}
776+
if (fs.existsSync(extSrcFileMap)) {
777+
fs.copyFileSync(extSrcFileMap, extMinFileMap);
778+
}
779+
780+
fs.unlinkSync(extSrcFile);
781+
if (fs.existsSync(extSrcFileMap)) {
782+
fs.unlinkSync(extSrcFileMap);
783+
}
784+
785+
resolve();
786+
} catch (err) {
787+
reject(err);
788+
}
789+
});
790+
}
791+
792+
async function makeConcatExtensions() {
793+
await makeExtensionConcatJS("Git");
794+
}
795+
796+
async function _renameConcatExtensionsinDist() {
797+
await _renameExtensionConcatAsExtensionJSInDist("Git");
798+
}
799+
636800
function createCacheManifest(srcFolder) {
637801
return new Promise((resolve, reject)=>{
638802
_listFilesInDir(srcFolder).then((files)=>{
@@ -751,16 +915,16 @@ exports.buildDebug = series(copyThirdPartyLibs.copyAllDebug, makeLoggerConfig, z
751915
exports.clean = series(cleanDist);
752916
exports.reset = series(cleanAll);
753917

754-
exports.releaseDev = series(cleanDist, exports.buildDebug, makeBracketsConcatJS, _compileLessSrc,
755-
makeDistAll, cleanUnwantedFilesInDist, releaseDev,
918+
exports.releaseDev = series(cleanDist, exports.buildDebug, makeBracketsConcatJS, makeConcatExtensions, _compileLessSrc,
919+
makeDistAll, cleanUnwantedFilesInDist, releaseDev, _renameConcatExtensionsinDist,
756920
createDistCacheManifest, createDistTest, _cleanReleaseBuildArtefactsInSrc);
757-
exports.releaseStaging = series(cleanDist, exports.build, makeBracketsConcatJS, _compileLessSrc,
921+
exports.releaseStaging = series(cleanDist, exports.build, makeBracketsConcatJS, makeConcatExtensions, _compileLessSrc,
758922
makeDistNonJS, makeJSDist, makeJSPrettierDist, makeNonMinifyDist, cleanUnwantedFilesInDist,
759-
_renameBracketsConcatAsBracketsJSInDist, _patchMinifiedCSSInDistIndex, releaseStaging,
923+
_renameBracketsConcatAsBracketsJSInDist, _renameConcatExtensionsinDist, _patchMinifiedCSSInDistIndex, releaseStaging,
760924
createDistCacheManifest, createDistTest, _cleanReleaseBuildArtefactsInSrc);
761-
exports.releaseProd = series(cleanDist, exports.build, makeBracketsConcatJS, _compileLessSrc,
925+
exports.releaseProd = series(cleanDist, exports.build, makeBracketsConcatJS, makeConcatExtensions, _compileLessSrc,
762926
makeDistNonJS, makeJSDist, makeJSPrettierDist, makeNonMinifyDist, cleanUnwantedFilesInDist,
763-
_renameBracketsConcatAsBracketsJSInDist, _patchMinifiedCSSInDistIndex, releaseProd,
927+
_renameBracketsConcatAsBracketsJSInDist, _renameConcatExtensionsinDist, _patchMinifiedCSSInDistIndex, releaseProd,
764928
createDistCacheManifest, createDistTest, _cleanReleaseBuildArtefactsInSrc);
765929
exports.releaseWebCache = series(makeDistWebCache);
766930
exports.serve = series(exports.build, serve);

0 commit comments

Comments
 (0)