gulpTasks-libraries.js 6.0 KB

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