gulpTasks-libraries.js 5.4 KB

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