gulpTasks-librariesES6.js 10 KB

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