gulpTasks-libraries.js 6.3 KB

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