gulpTasks-libraries.js 6.2 KB

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