gulpTasks-libraries.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. // Gulp Tools
  2. var gulp = require("gulp");
  3. var webpack = require('webpack');
  4. var webpackStream = require("webpack-stream");
  5. var cp = require('child_process');
  6. var path = require("path");
  7. var concat = require('gulp-concat');
  8. var minimist = require("minimist");
  9. var symlinkDir = require('symlink-dir');
  10. // Gulp Helpers
  11. var uncommentShaders = require('../helpers/gulp-removeShaderComments');
  12. var processShaders = require("../helpers/gulp-processShaders");
  13. var processAmdDeclarationToModule = require('../helpers/gulp-processAmdDeclarationToModule');
  14. var processModuleDeclarationToNamespace = require('../helpers/gulp-processModuleDeclarationToNamespace');
  15. var del = require("del");
  16. // Parse Command Line.
  17. var commandLineOptions = minimist(process.argv.slice(2), {
  18. boolean: ["noNamespace"],
  19. string: ["moduleName"],
  20. string: ["tscPath"]
  21. });
  22. // Import Build Config
  23. var config = require("../../Config/config.js");
  24. /**
  25. * Clean shader ts files.
  26. */
  27. var cleanShaders = function(settings) {
  28. return del(settings.computed.shaderTSGlob, { force: true });
  29. }
  30. /**
  31. * Create shader ts files.
  32. */
  33. var buildShaders = function(settings) {
  34. return gulp.src(settings.computed.shaderGlob)
  35. .pipe(uncommentShaders())
  36. .pipe(processShaders(settings.isCore));
  37. }
  38. /**
  39. * Build a single library (one of the material of mat lib) from a module (materialsLibrary for instance)
  40. */
  41. var buildExternalLibrariesMultiEntry = function(libraries, settings, isMin) {
  42. // Convert Module to Namespace for globals
  43. var outputDirectory = settings.computed.distDirectory;
  44. // Does name contain .min. for min files.
  45. var isMinOutputName = libraries[0].output.indexOf(".min.") > -1;
  46. // Webpack Config.
  47. var wpConfig = require(settings.computed.webpackConfigPath);
  48. // Create multi entry list.
  49. wpConfig.entry = { };
  50. for (let library of settings.libraries) {
  51. let name = library.output.replace(isMinOutputName ? ".min.js" : ".js", "");
  52. wpConfig.entry[name] = library.computed.entryPath;
  53. }
  54. // Create output by type (min vs max).
  55. if (isMin) {
  56. delete wpConfig.devtool;
  57. wpConfig.output.filename = isMinOutputName ? '[name].min.js' : '[name].js';
  58. }
  59. else {
  60. // Map Output
  61. wpConfig.devtool = "source-map";
  62. wpConfig.output.devtoolModuleFilenameTemplate = (info) => {
  63. info.resourcePath = path.normalize(info.resourcePath);
  64. if (!path.isAbsolute(info.resourcePath)) {
  65. info.resourcePath = path.join(settings.computed.srcDirectory, info.resourcePath);
  66. }
  67. return `webpack://BABYLONJS/${path.relative(config.computed.rootFolder, info.resourcePath).replace(/\\/g, "/")}`;
  68. };
  69. // Generate unminified file.
  70. wpConfig.mode = "development";
  71. wpConfig.output.filename = isMinOutputName ? '[name].js' : '[name].max.js';
  72. }
  73. // Generate minified file.
  74. let wpBuild = webpackStream({ config: wpConfig }, webpack);
  75. return wpBuild.pipe(gulp.dest(outputDirectory));
  76. }
  77. /**
  78. * Build AMD DTS Files
  79. */
  80. var buildAMDDTSFiles = function(libraries, settings, cb) {
  81. // TODO. Generate all d.ts
  82. let library = libraries[0];
  83. if (!library.preventLoadLibrary) {
  84. // Generate DTS the old way...
  85. cp.execSync(`node "${commandLineOptions.tscPath || config.computed.tscPath}" --module amd --outFile "${config.computed.tempTypingsAMDFilePath}" --emitDeclarationOnly true`, {
  86. cwd: settings.computed.srcDirectory
  87. });
  88. }
  89. cb();
  90. }
  91. /**
  92. * Append Lose DTS Files allowing isolated Modules build
  93. */
  94. var appendLoseDTSFiles = function(settings, moduleFile) {
  95. if (settings.build.loseDTSFiles) {
  96. let library = settings.libraries[0];
  97. if (!library.preventLoadLibrary) {
  98. // Convert Module to Namespace for globals
  99. var outputDirectory = settings.computed.distDirectory;
  100. // Find declaration path.
  101. let fileName = settings.build.umd.processDeclaration.filename;
  102. if (!moduleFile) {
  103. fileName = fileName.replace(".module", "");
  104. }
  105. let fileLocation = path.join(outputDirectory, fileName);
  106. return gulp.src([fileLocation, path.join(settings.computed.srcDirectory, settings.build.loseDTSFiles.glob)])
  107. .pipe(concat(fileName))
  108. .pipe(gulp.dest(outputDirectory));
  109. }
  110. }
  111. return Promise.resolve();
  112. }
  113. /**
  114. * Process DTS Files
  115. */
  116. var processDTSFiles = function(libraries, settings, cb) {
  117. // Convert Module to Namespace for globals
  118. var outputDirectory = settings.computed.distDirectory;
  119. // TODO. Generate all d.ts
  120. let library = libraries[0];
  121. if (!library.preventLoadLibrary) {
  122. // Find declaration path.
  123. let fileLocation = path.join(outputDirectory, settings.build.umd.processDeclaration.filename);
  124. // Convert the tsc AMD BUNDLED declaration to our expected one
  125. processAmdDeclarationToModule(config.computed.tempTypingsFilePath, {
  126. output: fileLocation,
  127. moduleName: commandLineOptions.moduleName || settings.build.umd.packageName,
  128. entryPoint: library.entry,
  129. externals: settings.build.umd.processDeclaration.classMap,
  130. hiddenConsts: settings.build.umd.processDeclaration.hiddenConsts
  131. });
  132. // Convert Module to Namespace for globals
  133. if (!commandLineOptions.noNamespace) {
  134. processModuleDeclarationToNamespace(fileLocation, settings.build.umd.packageName, settings.build.umd.processDeclaration, cb);
  135. }
  136. else {
  137. cb();
  138. }
  139. }
  140. else {
  141. cb();
  142. }
  143. }
  144. /**
  145. * Generate our required symlinked for the shared components.
  146. */
  147. var generateSharedUiComponents = function(settings, done) {
  148. if (!settings.build.sharedUiComponents) {
  149. done();
  150. return;
  151. }
  152. var sharedUiComponents = config.computed.sharedUiComponentsSrcPath;
  153. var umdSharedUiComponents = path.resolve(settings.computed.mainDirectory, settings.build.sharedUiComponents);
  154. symlinkDir(sharedUiComponents, umdSharedUiComponents).then(() => {
  155. done();
  156. });
  157. };
  158. /**
  159. * Dynamic module creation In Serie for WebPack leaks.
  160. */
  161. function buildExternalLibraries(settings, fast) {
  162. // Creates the required tasks.
  163. var tasks = [];
  164. var sharedUiComponents = function(cb) { return generateSharedUiComponents(settings, cb); };
  165. var cleanup = function() { return cleanShaders(settings); };
  166. var shaders = function() { return buildShaders(settings); };
  167. var buildMin = function() { return buildExternalLibrariesMultiEntry(settings.libraries, settings, true) };
  168. var buildMax = function() { return buildExternalLibrariesMultiEntry(settings.libraries, settings, false) };
  169. var buildAMDDTS = function(cb) { return buildAMDDTSFiles(settings.libraries, settings, cb) };
  170. var processDTS = function(cb) { return processDTSFiles(settings.libraries, settings, cb) };
  171. var appendLoseDTS = [function() { return appendLoseDTSFiles(settings, true) }];
  172. if (!commandLineOptions.noNamespace) {
  173. appendLoseDTS.push(function() { return appendLoseDTSFiles(settings, false) });
  174. }
  175. if (fast) {
  176. tasks.push(sharedUiComponents, buildMax);
  177. } else {
  178. tasks.push(sharedUiComponents, cleanup, shaders, buildMin, buildMax, buildAMDDTS, processDTS, ...appendLoseDTS);
  179. }
  180. return gulp.series.apply(this, tasks);
  181. }
  182. /**
  183. * Dynamic module creation.
  184. */
  185. config.modules.map(function(module) {
  186. const settings = config[module];
  187. gulp.task(module, buildExternalLibraries(settings));
  188. });
  189. /**
  190. * Build the releasable files.
  191. * Back Compat Only, now name core as it is a lib
  192. */
  193. gulp.task("typescript", gulp.series("core"));
  194. /**
  195. * Build the releasable files.
  196. * Back Compat Only, now name core as it is a lib
  197. */
  198. gulp.task("core-workers", buildExternalLibraries(config["core"], true));
  199. /**
  200. * Build all libs.
  201. */
  202. gulp.task("typescript-libraries", gulp.series(config.modules, config.viewerModules));