gulpTasks-libraries.js 7.4 KB

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