gulpTasks-librariesES6.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. // Gulp Tools
  2. var gulp = require("gulp");
  3. var path = require("path");
  4. var fs = require("fs-extra");
  5. var shelljs = require("shelljs");
  6. var concat = require('gulp-concat');
  7. // Gulp Helpers
  8. var rmDir = require("../../NodeHelpers/rmDir");
  9. var processImports = require("../helpers/gulp-processImportsToEs6");
  10. var processConstants = require("../helpers/gulp-processConstants");
  11. var processLooseDeclarations = require("../helpers/gulp-processLooseDeclarationsEs6");
  12. var uncommentShaders = require('../helpers/gulp-removeShaderComments');
  13. var processShaders = require("../helpers/gulp-processShaders");
  14. var del = require("del");
  15. // Import Build Config
  16. var config = require("../../Config/config.js");
  17. /**
  18. * Clean Source And Dist folders.
  19. */
  20. var cleanSourceAndDist = function(settings, cb) {
  21. rmDir(settings.computed.sourceES6Directory);
  22. rmDir(settings.computed.distES6Directory);
  23. cb();
  24. }
  25. /**
  26. * Clean shader ts files.
  27. */
  28. var cleanShaders = function(settings) {
  29. return del(settings.computed.shaderTSGlob, { force: true });
  30. }
  31. /**
  32. * Create shader ts files.
  33. */
  34. var buildShaders = function(settings) {
  35. return gulp.src(settings.computed.shaderGlob)
  36. .pipe(uncommentShaders())
  37. .pipe(processShaders(settings.isCore));
  38. }
  39. /**
  40. * Copy Sources.
  41. */
  42. var source = function(settings) {
  43. return gulp.src(settings.computed.mainDirectory + "/**/*")
  44. .pipe(gulp.dest(settings.computed.sourceES6Directory));
  45. }
  46. /**
  47. * Copy dependencies.
  48. */
  49. var dep = function(settings) {
  50. const copyPaths = []
  51. // Add tsconfig rules.
  52. copyPaths.push(path.join(config.computed.rootFolder, "/dist/preview release/babylon.max.js"));
  53. copyPaths.push(path.join(config.computed.rootFolder, "tsconfigRules.json"));
  54. const tsconfig = require(settings.computed.tsConfigPath);
  55. for (let pathName in tsconfig.compilerOptions.paths) {
  56. let paths = tsconfig.compilerOptions.paths[pathName];
  57. for (let dep of paths) {
  58. if (dep.indexOf("@babylonjs") === -1) {
  59. continue;
  60. }
  61. const fullPath = path.resolve(settings.computed.mainDirectory,
  62. tsconfig.compilerOptions.baseUrl,
  63. dep);
  64. copyPaths.push(fullPath);
  65. }
  66. }
  67. if (settings.build.es6.buildDependencies) {
  68. for (let pathName of settings.build.es6.buildDependencies) {
  69. const dependencyPath = path.join(config.computed.rootFolder, pathName);
  70. copyPaths.push(dependencyPath);
  71. }
  72. }
  73. return gulp.src(copyPaths, { base: config.computed.rootFolder })
  74. .pipe(gulp.dest(config.computed.sourceES6Folder));
  75. }
  76. /**
  77. * Adapt Sources import paths.
  78. */
  79. var modifySourcesImports = function(settings) {
  80. const tsconfig = require(settings.computed.tsConfigPath);
  81. var replacements = [];
  82. for (let pathName in tsconfig.compilerOptions.paths) {
  83. if (pathName.endsWith("/*")) {
  84. pathName = pathName.replace("/*", "");
  85. }
  86. for (var moduleName of config.es6modules) {
  87. var module = config[moduleName];
  88. if (module.build.umd.packageName === pathName) {
  89. if (module.build.es6.packageName) {
  90. var packageName = pathName;
  91. var newPackageName = module.build.es6.packageName;
  92. replacements.push({
  93. packageName,
  94. newPackageName
  95. });
  96. break;
  97. }
  98. }
  99. }
  100. }
  101. return gulp.src([settings.computed.sourceES6Directory + "/**/*.ts",
  102. settings.computed.sourceES6Directory + "/**/*.tsx"])
  103. .pipe(processImports(replacements));
  104. }
  105. /**
  106. * Inline Constants in sources.
  107. */
  108. var modifySourcesConstants = function(settings) {
  109. if (settings.isCore) {
  110. return gulp.src([settings.computed.sourceES6Directory + "/**/*.ts",
  111. settings.computed.sourceES6Directory + "/**/*.tsx"])
  112. .pipe(processConstants());
  113. }
  114. return Promise.resolve();
  115. }
  116. /**
  117. * Adapt TS Config Paths.
  118. */
  119. var modifyTsConfig = function(settings, cb) {
  120. const tsconfig = require(settings.computed.tsConfigPath);
  121. var newPaths = { };
  122. for (let pathName in tsconfig.compilerOptions.paths) {
  123. var newPathName = pathName;
  124. var originalPath = pathName;
  125. if (pathName.endsWith("/*")) {
  126. pathName = pathName.replace("/*", "");
  127. }
  128. var mapped = false;
  129. for (var moduleName of config.es6modules) {
  130. var module = config[moduleName];
  131. if (module.build.umd.packageName === pathName) {
  132. if (module.build.es6.packageName) {
  133. newPathName = module.build.es6.packageName + "*";
  134. newPaths[newPathName] = [ module.computed.distES6Directory.replace(/\\/g, "/") ];
  135. mapped = true;
  136. break;
  137. }
  138. }
  139. }
  140. if (!mapped) {
  141. newPaths[newPathName] = tsconfig.compilerOptions.paths[originalPath];
  142. }
  143. }
  144. tsconfig.compilerOptions.paths = newPaths;
  145. const destTsConfig = path.join(settings.computed.sourceES6Directory, "tsconfig.json");
  146. fs.writeJSONSync(destTsConfig, tsconfig);
  147. cb();
  148. }
  149. /**
  150. * Concat Lose DTS Files allowing isolated Modules build
  151. */
  152. var concatLoseDTSFiles = function(settings) {
  153. if (settings.build.loseDTSFiles) {
  154. return gulp.src([path.join(settings.computed.srcDirectory, settings.build.loseDTSFiles.glob)])
  155. .pipe(concat(config.computed.tempTypingsFileName))
  156. .pipe(processLooseDeclarations())
  157. .pipe(gulp.dest(config.computed.tempFolder));
  158. }
  159. return Promise.resolve();
  160. }
  161. /**
  162. * Append Lose DTS Files allowing isolated Modules build
  163. */
  164. var appendLoseDTSFiles = function(settings) {
  165. if (settings.build.loseDTSFiles) {
  166. const mainDeclarationFile = path.join(settings.computed.distES6Directory, settings.build.loseDTSFiles.destFileES6 || "index.d.ts");
  167. return gulp.src([mainDeclarationFile, config.computed.tempTypingsFilePath])
  168. .pipe(concat(settings.build.loseDTSFiles.destFileES6))
  169. .pipe(gulp.dest(settings.computed.distES6Directory));
  170. }
  171. return Promise.resolve();
  172. }
  173. /**
  174. * TSC Build.
  175. */
  176. var build = function(settings, cb) {
  177. // Launch TSC.
  178. const options = {
  179. cwd: settings.computed.sourceES6Directory,
  180. verbose: true
  181. };
  182. var skipLibCheck = settings.build.es6.skipLibCheck ? 'true' : 'false';
  183. let command = `node "${config.computed.tscPath}" --skipLibCheck ${skipLibCheck} --inlineSources --sourceMap true -t es5 -m esNext --outDir "${settings.computed.distES6Directory}"`;
  184. shelljs.exec(command, options, function(code, stdout, stderr) {
  185. if (stderr) {
  186. console.log(stderr);
  187. }
  188. if (stdout) {
  189. console.log(stdout);
  190. }
  191. if (code !== 0) {
  192. cb("TSC Failed.")
  193. }
  194. else {
  195. cb();
  196. }
  197. });
  198. }
  199. /**
  200. * Webpack Build.
  201. */
  202. var buildWebpack = function(settings, module, cb) {
  203. const gulpPath = path.join(config.computed.sourceES6Folder, "Tools/Gulp");
  204. // Launch TSC.
  205. const options = {
  206. cwd: gulpPath,
  207. verbose: true
  208. };
  209. let command = `gulp ${module} --noNamespace --moduleName ${settings.build.es6.packageName} --tscPath "${config.computed.tscPath}"`;
  210. console.log(command)
  211. shelljs.exec(command, options, function(code, stdout, stderr) {
  212. if (stderr) {
  213. console.log(stderr);
  214. }
  215. if (stdout) {
  216. console.log(stdout);
  217. }
  218. if (code !== 0) {
  219. cb("Webpack Build Failed.")
  220. }
  221. else {
  222. cb();
  223. }
  224. });
  225. }
  226. /**
  227. * Copy Webpack Dist.
  228. */
  229. var copyWebpackDist = function(settings, module) {
  230. var es6Config = require(path.join(config.computed.sourceES6Folder, "Tools/Config/config"));
  231. return gulp.src(es6Config[module].computed.distDirectory + "/**/*")
  232. .pipe(gulp.dest(settings.computed.distES6Directory));
  233. }
  234. /**
  235. * Dynamic es 6 module creation.
  236. */
  237. function buildES6Library(settings, module) {
  238. // Creates the required tasks.
  239. var tasks = [];
  240. var cleanAndShaderTasks = [ function cleanES6(cb) { return cleanSourceAndDist(settings, cb); } ];
  241. if (settings.computed.shaderTSGlob) {
  242. cleanAndShaderTasks.push(function cleanES6Shaders() { return cleanShaders(settings); });
  243. cleanAndShaderTasks.push(function() { return buildShaders(settings); });
  244. }
  245. var copySource = function() { return source(settings); };
  246. var dependencies = function() { return dep(settings); };
  247. var adaptSourceImportPaths = function() { return modifySourcesImports(settings); };
  248. var adaptSourceConstants = function() { return modifySourcesConstants(settings); };
  249. var adaptTsConfigImportPaths = function(cb) { return modifyTsConfig(settings, cb); };
  250. // Build with ts or webpack
  251. var buildSteps = null;
  252. if (settings.build.es6.webpackBuild) {
  253. buildSteps = [
  254. function buildes6(cb) { return buildWebpack(settings, module, cb) },
  255. function copyDist() { return copyWebpackDist(settings, module) }
  256. ];
  257. }
  258. else {
  259. buildSteps = [
  260. function buildes6(cb) { return build(settings, cb) },
  261. function concatLoseDTS() { return concatLoseDTSFiles(settings) },
  262. function appendLoseDTS() { return appendLoseDTSFiles(settings) }
  263. ];
  264. }
  265. tasks.push(...cleanAndShaderTasks, copySource, dependencies, adaptSourceImportPaths, adaptSourceConstants, adaptTsConfigImportPaths, ...buildSteps);
  266. return gulp.series.apply(this, tasks);
  267. }
  268. /**
  269. * Dynamic es 6 module creation.
  270. */
  271. config.es6modules.map(function(module) {
  272. const settings = config[module];
  273. gulp.task(module + "-es6", buildES6Library(settings, module));
  274. });
  275. /**
  276. * Build all es 6 libs.
  277. */
  278. gulp.task("typescript-es6", gulp.series(config.es6modules.map((module) => module + "-es6")));