@@ -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+
636800function createCacheManifest ( srcFolder ) {
637801 return new Promise ( ( resolve , reject ) => {
638802 _listFilesInDir ( srcFolder ) . then ( ( files ) => {
@@ -751,16 +915,16 @@ exports.buildDebug = series(copyThirdPartyLibs.copyAllDebug, makeLoggerConfig, z
751915exports . clean = series ( cleanDist ) ;
752916exports . 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 ) ;
765929exports . releaseWebCache = series ( makeDistWebCache ) ;
766930exports . serve = series ( exports . build , serve ) ;
0 commit comments