gulpTasks-libraries.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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. // 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 configPath = "../config.json";
  16. var config = require(configPath);
  17. // Constants
  18. const tempTypingsFile = "tempTypings.js";
  19. const tempTypingsFolder = "../../.temp/";
  20. const tempTypingsPath = tempTypingsFolder + tempTypingsFile.replace(".js", ".d.ts");
  21. /**
  22. * Clean shader ts files.
  23. */
  24. var cleanShaders = function(settings) {
  25. return del([settings.build.srcDirectory + "**/*.fx.ts"]);
  26. }
  27. /**
  28. * Create shader ts files.
  29. */
  30. var buildShaders = function(settings) {
  31. return gulp.src(settings.build.srcDirectory + "**/*.fx")
  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 = config.build.outputDirectory + settings.build.distOutputDirectory;
  41. // Does name contain .min. for min files.
  42. var isMinOutputName = libraries[0].output.indexOf(".min.") > -1;
  43. // Webpack Config.
  44. var configFolder = path.dirname(path.resolve(__dirname, configPath));
  45. var configPath = path.join(settings.build.mainFolder, "webpack.config.js");
  46. var wpConfig = require(path.resolve(configFolder, configPath));
  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] = path.resolve(wpConfig.context, library.entry);
  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. var rootPath = path.resolve(__dirname, "../../../");
  62. var absoluteSrc = path.resolve(__dirname, "../", settings.build.srcDirectory);
  63. wpConfig.output.devtoolModuleFilenameTemplate = (info) => {
  64. info.resourcePath = path.normalize(info.resourcePath);
  65. if (!path.isAbsolute(info.resourcePath)) {
  66. info.resourcePath = path.join(absoluteSrc, info.resourcePath);
  67. }
  68. return `webpack://BABYLONJS/${path.relative(rootPath, info.resourcePath).replace(/\\/g, "/")}`;
  69. };
  70. // Generate unminified file.
  71. wpConfig.mode = "development";
  72. wpConfig.output.filename = isMinOutputName ? '[name].js' : '[name].max.js';
  73. }
  74. // Generate minified file.
  75. let wpBuild = webpackStream(wpConfig, webpack);
  76. return wpBuild.pipe(gulp.dest(outputDirectory));
  77. }
  78. /**
  79. * Build AMD DTS Files
  80. */
  81. var buildAMDDTSFiles = function(libraries, settings, cb) {
  82. // TODO. Generate all d.ts
  83. let library = libraries[0];
  84. if (!library.preventLoadLibrary) {
  85. // Create temp directory.
  86. let srcDirectory = settings.build.srcDirectory;
  87. let depthCount = srcDirectory.match(/\//g).length - srcDirectory.match(/\.\.\//g).length;
  88. let tempDirectory = "";
  89. for (let i = 0; i < depthCount; i++) {
  90. tempDirectory += "../"
  91. }
  92. tempDirectory += ".temp/";
  93. // Generate DTS the old way...
  94. cp.execSync('tsc --module amd --outFile "' + tempDirectory + tempTypingsFile + '" --emitDeclarationOnly true', {
  95. cwd: settings.build.srcDirectory
  96. });
  97. }
  98. cb();
  99. }
  100. /**
  101. * Append Lose DTS Files allowing isolated Modules build
  102. */
  103. var appendLoseDTSFiles = function(settings) {
  104. if (settings.build.loseDTSFiles) {
  105. return gulp.src([tempTypingsPath, settings.build.loseDTSFiles], { base: "./"})
  106. .pipe(concat(tempTypingsPath))
  107. .pipe(gulp.dest(tempTypingsPath));
  108. }
  109. return Promise.resolve();
  110. }
  111. /**
  112. * Process DTS Files
  113. */
  114. var processDTSFiles = function(libraries, settings, cb) {
  115. // Convert Module to Namespace for globals
  116. var outputDirectory = config.build.outputDirectory + settings.build.distOutputDirectory;
  117. // TODO. Generate all d.ts
  118. let library = libraries[0];
  119. if (!library.preventLoadLibrary) {
  120. // Find declaration path.
  121. let fileLocation = path.join(outputDirectory, settings.build.processDeclaration.filename);
  122. // Convert the tsc AMD BUNDLED declaration to our expected one
  123. processAmdDeclarationToModule(tempTypingsPath, {
  124. output: fileLocation,
  125. moduleName: settings.build.processDeclaration.packageName,
  126. entryPoint: library.entry,
  127. externals: settings.build.processDeclaration.classMap,
  128. });
  129. // Convert Module to Namespace for globals
  130. processModuleDeclarationToNamespace(fileLocation, settings.build.processDeclaration);
  131. }
  132. cb();
  133. }
  134. /**
  135. * Dynamic module creation In Serie for WebPack leaks.
  136. */
  137. function buildExternalLibraries(settings) {
  138. // Creates the required tasks.
  139. var tasks = [];
  140. var cleanup = function() { return cleanShaders(settings); };
  141. var shaders = function() { return buildShaders(settings); };
  142. var buildMin = function() { return buildExternalLibrariesMultiEntry(settings.libraries, settings, true) };
  143. var buildMax = function() { return buildExternalLibrariesMultiEntry(settings.libraries, settings, false) };
  144. var buildAMDDTS = function(cb) { return buildAMDDTSFiles(settings.libraries, settings, cb) };
  145. var appendLoseDTS = function() { return appendLoseDTSFiles(settings) };
  146. var processDTS = function(cb) { return processDTSFiles(settings.libraries, settings, cb) };
  147. tasks.push(cleanup, shaders, buildMin, buildMax, buildAMDDTS, appendLoseDTS, processDTS);
  148. return gulp.series.apply(this, tasks);
  149. }
  150. /**
  151. * Dynamic module creation.
  152. */
  153. config.modules.map(function(module) {
  154. const settings = config[module];
  155. gulp.task(module, buildExternalLibraries(settings));
  156. });