gulpfile.js 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811
  1. var gulp = require("gulp");
  2. var uglify = require("gulp-uglify");
  3. var typescript = require("gulp-typescript");
  4. var sourcemaps = require("gulp-sourcemaps");
  5. var srcToVariable = require("gulp-content-to-variable");
  6. var appendSrcToVariable = require("./gulp-appendSrcToVariable");
  7. var addDtsExport = require("./gulp-addDtsExport");
  8. var addModuleExports = require("./gulp-addModuleExports");
  9. var addES6Exports = require("./gulp-addES6Exports");
  10. var babylonModuleExports = require("./gulp-babylonModule");
  11. var babylonES6ModuleExports = require("./gulp-es6ModuleExports");
  12. var dtsModuleSupport = require("./gulp-dtsModuleSupport");
  13. let calculateDependencies = require("./gulp-calculateDependencies");
  14. var merge2 = require("merge2");
  15. var concat = require("gulp-concat");
  16. var rename = require("gulp-rename");
  17. var cleants = require("gulp-clean-ts-extends");
  18. var changedInPlace = require("gulp-changed-in-place");
  19. var runSequence = require("run-sequence");
  20. var replace = require("gulp-replace");
  21. var uncommentShader = require("./gulp-removeShaderComments");
  22. var expect = require("gulp-expect-file");
  23. var optimisejs = require("gulp-optimize-js");
  24. var webserver = require("gulp-webserver");
  25. var path = require("path");
  26. var sass = require("gulp-sass");
  27. var webpack = require("webpack-stream");
  28. var config = require("./config.json");
  29. var del = require("del");
  30. var karmaServer = require('karma').Server;
  31. var debug = require("gulp-debug");
  32. var includeShadersStream;
  33. var shadersStream;
  34. var workersStream;
  35. var extendsSearchRegex = /var\s__extends[\s\S]+?\}\)\(\);/g;
  36. var decorateSearchRegex = /var\s__decorate[\s\S]+?\};/g;
  37. var referenceSearchRegex = /\/\/\/ <reference.*/g;
  38. /**
  39. * TS configurations shared in the gulp file.
  40. */
  41. var tsConfig = {
  42. noResolve: true,
  43. target: "ES5",
  44. declarationFiles: true,
  45. typescript: require("typescript"),
  46. experimentalDecorators: true,
  47. isolatedModules: false,
  48. noImplicitAny: true,
  49. noImplicitReturns: true,
  50. noImplicitThis: true,
  51. noUnusedLocals: true,
  52. strictNullChecks: true,
  53. strictFunctionTypes: true,
  54. types: []
  55. };
  56. var tsProject = typescript.createProject(tsConfig);
  57. var externalTsConfig = {
  58. noResolve: false,
  59. target: "ES5",
  60. declarationFiles: true,
  61. typescript: require("typescript"),
  62. experimentalDecorators: true,
  63. isolatedModules: false,
  64. noImplicitAny: true,
  65. noImplicitReturns: true,
  66. noImplicitThis: true,
  67. noUnusedLocals: true,
  68. strictNullChecks: true,
  69. types: []
  70. };
  71. var minimist = require("minimist");
  72. var commandLineOptions = minimist(process.argv.slice(2), {
  73. boolean: "public"
  74. });
  75. function processDependency(kind, dependency, filesToLoad, firstLevelOnly) {
  76. if (!firstLevelOnly && dependency.dependUpon) {
  77. for (var i = 0; i < dependency.dependUpon.length; i++) {
  78. var dependencyName = dependency.dependUpon[i];
  79. var parent = config.workloads[dependencyName];
  80. processDependency(kind, parent, filesToLoad);
  81. }
  82. }
  83. var content = dependency[kind];
  84. if (!content) {
  85. return;
  86. }
  87. for (var i = 0; i < content.length; i++) {
  88. var file = content[i];
  89. if (filesToLoad.indexOf(file) === -1) {
  90. filesToLoad.push(file);
  91. }
  92. }
  93. }
  94. function determineFilesToProcess(kind) {
  95. var currentConfig = config.build.currentConfig;
  96. var buildConfiguration = config.buildConfigurations[currentConfig];
  97. var filesToLoad = [];
  98. for (var index = 0; index < buildConfiguration.length; index++) {
  99. var dependencyName = buildConfiguration[index];
  100. var dependency = config.workloads[dependencyName];
  101. if (kind === "directFiles" && !dependency) {
  102. filesToLoad.push("../../dist/preview release/" + dependencyName);
  103. }
  104. else if (dependency) {
  105. processDependency(kind, dependency, filesToLoad);
  106. }
  107. }
  108. if (kind === "shaderIncludes") {
  109. for (var index = 0; index < filesToLoad.length; index++) {
  110. filesToLoad[index] = "../../src/Shaders/ShadersInclude/" + filesToLoad[index] + ".fx";
  111. }
  112. } else if (kind === "shaders") {
  113. for (var index = 0; index < filesToLoad.length; index++) {
  114. var name = filesToLoad[index];
  115. filesToLoad[index] = "../../src/Shaders/" + filesToLoad[index] + ".fx";
  116. }
  117. }
  118. return filesToLoad;
  119. }
  120. /*
  121. * Shader Management.
  122. */
  123. function shadersName(filename) {
  124. return path.basename(filename)
  125. .replace(".fragment", "Pixel")
  126. .replace(".vertex", "Vertex")
  127. .replace(".fx", "Shader");
  128. }
  129. function includeShadersName(filename) {
  130. return path.basename(filename).replace(".fx", "");
  131. }
  132. /*
  133. * Main necessary files stream Management.
  134. */
  135. gulp.task("includeShaders", function (cb) {
  136. var filesToProcess = determineFilesToProcess("shaderIncludes");
  137. includeShadersStream = gulp.src(filesToProcess).
  138. pipe(expect.real({ errorOnFailure: true }, filesToProcess)).
  139. pipe(uncommentShader()).
  140. pipe(srcToVariable({
  141. variableName: "BABYLON.Effect.IncludesShadersStore", asMap: true, namingCallback: includeShadersName
  142. }));
  143. cb();
  144. });
  145. gulp.task("shaders", ["includeShaders"], function (cb) {
  146. var filesToProcess = determineFilesToProcess("shaders");
  147. shadersStream = gulp.src(filesToProcess).
  148. pipe(expect.real({ errorOnFailure: true }, filesToProcess)).
  149. pipe(uncommentShader()).
  150. pipe(srcToVariable({
  151. variableName: "BABYLON.Effect.ShadersStore", asMap: true, namingCallback: shadersName
  152. }));
  153. cb();
  154. });
  155. gulp.task("workers", function (cb) {
  156. workersStream = config.workers.map(function (workerDef) {
  157. return gulp.src(workerDef.files).
  158. pipe(expect.real({ errorOnFailure: true }, workerDef.files)).
  159. pipe(uglify()).
  160. pipe(srcToVariable({
  161. variableName: workerDef.variable
  162. }));
  163. });
  164. cb();
  165. });
  166. /**
  167. * Build tasks to concat minify uflify optimise the BJS js in different flavor (workers...).
  168. */
  169. gulp.task("buildWorker", ["workers", "shaders"], function () {
  170. var filesToProcess = determineFilesToProcess("files");
  171. return merge2(
  172. gulp.src(filesToProcess).
  173. pipe(expect.real({ errorOnFailure: true }, filesToProcess)),
  174. shadersStream,
  175. includeShadersStream,
  176. workersStream
  177. )
  178. .pipe(concat(config.build.minWorkerFilename))
  179. .pipe(cleants())
  180. .pipe(replace(extendsSearchRegex, ""))
  181. .pipe(replace(decorateSearchRegex, ""))
  182. .pipe(addModuleExports("BABYLON"))
  183. .pipe(uglify())
  184. .pipe(optimisejs())
  185. .pipe(gulp.dest(config.build.outputDirectory));
  186. });
  187. gulp.task("build", ["shaders"], function () {
  188. var filesToProcess = determineFilesToProcess("files");
  189. var directFilesToProcess = determineFilesToProcess("directFiles");
  190. let mergedStreams = merge2(
  191. gulp.src(filesToProcess).
  192. pipe(expect.real({ errorOnFailure: true }, filesToProcess)),
  193. shadersStream,
  194. includeShadersStream,
  195. gulp.src(directFilesToProcess)
  196. )
  197. return merge2(
  198. mergedStreams
  199. .pipe(concat(config.build.filename))
  200. .pipe(cleants())
  201. .pipe(replace(extendsSearchRegex, ""))
  202. .pipe(replace(decorateSearchRegex, ""))
  203. .pipe(addModuleExports("BABYLON"))
  204. .pipe(gulp.dest(config.build.outputDirectory))
  205. .pipe(rename(config.build.minFilename))
  206. .pipe(uglify())
  207. .pipe(optimisejs())
  208. .pipe(gulp.dest(config.build.outputDirectory)),
  209. mergedStreams
  210. .pipe(concat("es6.js"))
  211. .pipe(cleants())
  212. .pipe(replace(extendsSearchRegex, ""))
  213. .pipe(replace(decorateSearchRegex, ""))
  214. .pipe(addES6Exports("BABYLON"))
  215. .pipe(gulp.dest(config.build.outputDirectory))
  216. );
  217. });
  218. /*
  219. * Compiles all typescript files and creating a js and a declaration file.
  220. */
  221. gulp.task("typescript-compile", function () {
  222. var tsResult = gulp.src(config.typescript)
  223. .pipe(sourcemaps.init())
  224. .pipe(tsProject());
  225. //If this gulp task is running on travis, file the build!
  226. if (process.env.TRAVIS) {
  227. var error = false;
  228. tsResult.on("error", function () {
  229. error = true;
  230. }).on("end", function () {
  231. if (error) {
  232. console.log("Typescript compile failed");
  233. process.exit(1);
  234. }
  235. });
  236. }
  237. return merge2([
  238. tsResult.dts
  239. .pipe(concat(config.build.declarationFilename))
  240. .pipe(addDtsExport("BABYLON", "babylonjs"))
  241. .pipe(gulp.dest(config.build.outputDirectory)),
  242. tsResult.js
  243. .pipe(sourcemaps.write("./",
  244. {
  245. includeContent: false,
  246. sourceRoot: (filePath) => {
  247. return "";
  248. }
  249. }))
  250. .pipe(gulp.dest(config.build.srcOutputDirectory))
  251. ])
  252. });
  253. /**
  254. * Helper methods to build external library (mat, post processes, ...).
  255. */
  256. var buildExternalLibraries = function (settings) {
  257. var tasks = settings.libraries.map(function (library) {
  258. return buildExternalLibrary(library, settings, false);
  259. });
  260. let mergedTasks = merge2(tasks);
  261. if (settings.build.buildAsModule) {
  262. mergedTasks.on("end", function () {
  263. //generate js file list
  264. let files = settings.libraries.filter(function (lib) {
  265. return !lib.doNotIncludeInBundle;
  266. }).map(function (lib) {
  267. return config.build.outputDirectory + settings.build.distOutputDirectory + lib.output;
  268. });
  269. var outputDirectory = config.build.outputDirectory + settings.build.distOutputDirectory;
  270. let srcTask = gulp.src(files)
  271. .pipe(concat(settings.build.outputFilename + ".js"))
  272. .pipe(replace(extendsSearchRegex, ""))
  273. .pipe(replace(decorateSearchRegex, ""))
  274. .pipe(replace(referenceSearchRegex, ""))
  275. .pipe(addModuleExports(settings.build.moduleDeclaration, true, settings.build.extendsRoot))
  276. .pipe(gulp.dest(outputDirectory))
  277. .pipe(cleants())
  278. .pipe(rename({ extname: ".min.js" }))
  279. .pipe(uglify())
  280. .pipe(optimisejs())
  281. .pipe(gulp.dest(outputDirectory));
  282. let dtsFiles = files.map(function (filename) {
  283. return filename.replace(".js", ".d.ts");
  284. });
  285. let dtsTask = gulp.src(dtsFiles)
  286. .pipe(concat(settings.build.outputFilename + ".module.d.ts"))
  287. .pipe(replace(referenceSearchRegex, ""))
  288. .pipe(addDtsExport(settings.build.moduleDeclaration, settings.build.moduleName, true, settings.build.extendsRoot))
  289. .pipe(gulp.dest(outputDirectory));
  290. return merge2([srcTask, dtsTask]);
  291. });
  292. }
  293. return mergedTasks;
  294. }
  295. var buildExternalLibrary = function (library, settings, watch) {
  296. var tsProcess = gulp.src(library.files, { base: settings.build.srcOutputDirectory })
  297. .pipe(sourcemaps.init())
  298. .pipe(typescript(externalTsConfig));
  299. var includeShader = gulp.src(library.shadersIncludeFiles || [], { base: settings.build.srcOutputDirectory })
  300. .pipe(uncommentShader())
  301. .pipe(appendSrcToVariable("BABYLON.Effect.IncludesShadersStore", includeShadersName, library.output + ".include.fx"))
  302. .pipe(gulp.dest(settings.build.srcOutputDirectory));
  303. var shader = gulp.src(library.shaderFiles || [], { base: settings.build.srcOutputDirectory })
  304. .pipe(uncommentShader())
  305. .pipe(appendSrcToVariable("BABYLON.Effect.ShadersStore", shadersName, library.output + ".fx"))
  306. .pipe(gulp.dest(settings.build.srcOutputDirectory));
  307. var dev = tsProcess.js
  308. .pipe(sourcemaps.write("./", {
  309. includeContent: false,
  310. sourceRoot: (filePath) => {
  311. return "";
  312. }
  313. })).pipe(gulp.dest(settings.build.srcOutputDirectory));
  314. var outputDirectory = config.build.outputDirectory + settings.build.distOutputDirectory;
  315. var css = gulp.src(library.sassFiles || [])
  316. .pipe(sass().on("error", sass.logError))
  317. .pipe(concat(library.output.replace(".js", ".css")))
  318. .pipe(gulp.dest(outputDirectory));
  319. if (watch) {
  320. return merge2([shader, includeShader, dev, css]);
  321. }
  322. else {
  323. /*if (library.bundle) {
  324. // Don't remove extends and decorate functions
  325. var code = merge2([tsProcess.js, shader, includeShader])
  326. .pipe(concat(library.output));
  327. if (library.buildAsModule) {
  328. code = code.pipe(addModuleExports(library.moduleDeclaration, true))
  329. }
  330. code.pipe(gulp.dest(outputDirectory))
  331. .pipe(cleants())
  332. .pipe(rename({ extname: ".min.js" }))
  333. .pipe(uglify())
  334. .pipe(optimisejs())
  335. .pipe(gulp.dest(outputDirectory));
  336. } else {*/
  337. var code = merge2([tsProcess.js, shader, includeShader])
  338. .pipe(concat(library.output))
  339. if (library.buildAsModule) {
  340. code = code.pipe(replace(extendsSearchRegex, ""))
  341. .pipe(replace(decorateSearchRegex, ""))
  342. .pipe(addModuleExports(library.moduleDeclaration, true, library.extendsRoot))
  343. }
  344. code = code.pipe(gulp.dest(outputDirectory))
  345. .pipe(cleants())
  346. .pipe(rename({ extname: ".min.js" }))
  347. .pipe(uglify())
  348. .pipe(optimisejs())
  349. .pipe(gulp.dest(outputDirectory));
  350. /*}*/
  351. var dts = tsProcess.dts
  352. .pipe(concat(library.output))
  353. .pipe(replace(referenceSearchRegex, ""))
  354. .pipe(rename({ extname: ".d.ts" }))
  355. .pipe(gulp.dest(outputDirectory));
  356. var waitAll;
  357. if (library.buildAsModule) {
  358. var dts2 = tsProcess.dts
  359. .pipe(concat(library.output))
  360. .pipe(replace(referenceSearchRegex, ""))
  361. .pipe(addDtsExport(library.moduleDeclaration, library.moduleName, true, library.extendsRoot))
  362. .pipe(rename({ extname: ".module.d.ts" }))
  363. .pipe(gulp.dest(outputDirectory));
  364. waitAll = merge2([dev, code, css, dts, dts2]);
  365. } else {
  366. waitAll = merge2([dev, code, css, dts]);
  367. }
  368. if (library.webpack) {
  369. return waitAll.on("end", function () {
  370. return webpack(require(library.webpack))
  371. .pipe(rename(library.output.replace(".js", library.noBundleInName ? '.js' : ".bundle.js")))
  372. .pipe(addModuleExports(library.moduleDeclaration, false, false, true))
  373. .pipe(uglify())
  374. .pipe(optimisejs())
  375. .pipe(gulp.dest(outputDirectory))
  376. });
  377. }
  378. else {
  379. return waitAll;
  380. }
  381. }
  382. }
  383. /**
  384. * The default task, concat and min the main BJS files.
  385. */
  386. gulp.task("default", function (cb) {
  387. // runSequence("typescript-all", "intellisense", "tests-browserStack", cb);
  388. runSequence("typescript-all", "intellisense", cb);
  389. });
  390. gulp.task("mainBuild", function (cb) {
  391. runSequence("buildWorker", "build", cb);
  392. });
  393. /**
  394. * Build the releasable files.
  395. */
  396. gulp.task("typescript", function (cb) {
  397. runSequence("typescript-compile", "mainBuild", cb);
  398. });
  399. /**
  400. * Dynamic module creation.
  401. */
  402. config.modules.map(function (module) {
  403. gulp.task(module, function () {
  404. return buildExternalLibraries(config[module]);
  405. });
  406. });
  407. gulp.task("typescript-libraries", config.modules, function () {
  408. });
  409. /**
  410. * Dynamic custom configurations.
  411. */
  412. config.buildConfigurations.distributed.map(function (customConfiguration) {
  413. gulp.task(customConfiguration, function (cb) {
  414. config.build.currentConfig = customConfiguration;
  415. config.build.outputDirectory = config.build.outputCustomConfigurationsDirectory + "/" + customConfiguration;
  416. runSequence("typescript-compile", "build", cb);
  417. });
  418. });
  419. gulp.task("typescript-customConfigurations", function (cb) {
  420. runSequence(config.buildConfigurations.distributed, cb);
  421. });
  422. /**
  423. * Custom build with full path file control; used by profile.html
  424. */
  425. gulp.task("build-custom", function (cb) {
  426. runSequence("typescript-compile", "build", cb);
  427. });
  428. /**
  429. * Do it all.
  430. */
  431. gulp.task("typescript-all", function (cb) {
  432. runSequence("typescript", "typescript-libraries", "typescript-customConfigurations", cb);
  433. });
  434. /**
  435. * Watch ts files from typescript .
  436. */
  437. gulp.task("srcTscWatch", function () {
  438. // Reuse The TSC CLI from gulp to enable -w.
  439. process.argv[2] = "-w";
  440. process.argv[3] = "-p";
  441. process.argv[4] = "../../src/tsconfig.json";
  442. require("./node_modules/typescript/lib/tsc.js");
  443. });
  444. /**
  445. * Watch ts files and fire repective tasks.
  446. */
  447. gulp.task("watch", ["srcTscWatch"], function () {
  448. var interval = 1000;
  449. var tasks = [];
  450. config.modules.map(function (module) {
  451. config[module].libraries.map(function (library) {
  452. tasks.push(gulp.watch(library.files, { interval: interval }, function () {
  453. console.log(library.output);
  454. return buildExternalLibrary(library, config[module], true)
  455. .pipe(debug());
  456. }));
  457. tasks.push(gulp.watch(library.shaderFiles, { interval: interval }, function () {
  458. console.log(library.output);
  459. return buildExternalLibrary(library, config[module], true)
  460. .pipe(debug())
  461. }));
  462. tasks.push(gulp.watch(library.sassFiles, { interval: interval }, function () {
  463. console.log(library.output);
  464. return buildExternalLibrary(library, config[module], true)
  465. .pipe(debug())
  466. }));
  467. });
  468. });
  469. return tasks;
  470. });
  471. gulp.task("intellisense", function () {
  472. gulp.src(config.build.intellisenseSources)
  473. .pipe(concat(config.build.intellisenseFile))
  474. .pipe(replace(/^\s*_.*?$/gm, ""))
  475. .pipe(replace(/^\s*private .*?$/gm, ""))
  476. .pipe(replace(/^\s*public _.*?$/gm, ""))
  477. .pipe(replace(/^\s*protected .*?$/gm, ""))
  478. .pipe(replace(/^\s*public static _.*?$/gm, ""))
  479. .pipe(replace(/^\s*static _.*?$/gm, ""))
  480. .pipe(gulp.dest(config.build.playgroundDirectory));
  481. });
  482. /**
  483. * Embedded local dev env management.
  484. */
  485. gulp.task("deployLocalDev", function () {
  486. gulp.src("../../localDev/template/**.*")
  487. .pipe(gulp.dest("../../localDev/src/"));
  488. });
  489. /**
  490. * Embedded webserver for test convenience.
  491. */
  492. gulp.task("webserver", function () {
  493. var options = {
  494. port: 1338,
  495. livereload: false
  496. };
  497. if (commandLineOptions.public) {
  498. options.host = "0.0.0.0";
  499. }
  500. gulp.src("../../.").pipe(webserver(options));
  501. });
  502. /**
  503. * Combine Webserver and Watch as long as vscode does not handle multi tasks.
  504. */
  505. gulp.task("run", ["watch", "webserver"], function () {
  506. });
  507. gulp.task("tests-integration", function (done) {
  508. var kamaServerOptions = {
  509. configFile: __dirname + "/../../tests/validation/karma.conf.js",
  510. singleRun: false
  511. };
  512. var server = new karmaServer(kamaServerOptions, done);
  513. server.start();
  514. });
  515. gulp.task("tests-browserStack", function (done) {
  516. if (!process.env.TRAVIS) {
  517. done();
  518. return;
  519. }
  520. var kamaServerOptions = {
  521. configFile: __dirname + "/../../tests/validation/karma.conf.browserstack.js",
  522. singleRun: true
  523. };
  524. var server = new karmaServer(kamaServerOptions, done);
  525. server.start();
  526. });
  527. gulp.task("clean-JS-MAP", function () {
  528. return del([
  529. "../../src/**/*.js.map", "../../src/**/*.js"
  530. ], { force: true });
  531. });
  532. // this is needed for the modules for the declaration files.
  533. gulp.task("modules-compile", function () {
  534. var tsResult = gulp.src(config.typescript)
  535. .pipe(sourcemaps.init())
  536. .pipe(tsProject());
  537. // If this gulp task is running on travis
  538. if (process.env.TRAVIS) {
  539. var error = false;
  540. tsResult.on("error", function () {
  541. error = true;
  542. }).on("end", function () {
  543. if (error) {
  544. console.log("Typescript compile failed");
  545. process.exit(1);
  546. }
  547. });
  548. }
  549. return merge2([
  550. tsResult.dts
  551. .pipe(gulp.dest(config.build.srcOutputDirectory)),
  552. tsResult.js
  553. .pipe(sourcemaps.write("./",
  554. {
  555. includeContent: false,
  556. sourceRoot: (filePath) => {
  557. return "";
  558. }
  559. }))
  560. .pipe(gulp.dest(config.build.srcOutputDirectory))
  561. ]);
  562. });
  563. // this holds the declared objects in each module
  564. let declared = {}
  565. let perFile = {};
  566. let dependencyTree = {};
  567. gulp.task('prepare-for-modules', /*["modules-compile"],*/ function () {
  568. let tasks = [];
  569. Object.keys(config.workloads).forEach((moduleName) => {
  570. let dtsFiles = config.workloads[moduleName].files.map(f => f.replace(".js", ".d.ts"))
  571. let dtsTask = gulp.src(dtsFiles)
  572. .pipe(dtsModuleSupport(moduleName, false, declared, perFile));
  573. tasks.push(dtsTask);
  574. });
  575. // now calculate internal dependencies in the .ts files!
  576. /*Object.keys(config.workloads).forEach((moduleName) => {
  577. let tsFiles = config.workloads[moduleName].files.map(f => f.replace(".js", ".ts"))
  578. let depTask = gulp.src(tsFiles)
  579. .pipe(calculateDependencies(moduleName, perFile, dependencyTree));
  580. tasks.push(depTask);
  581. });*/
  582. return merge2(tasks);
  583. });
  584. gulp.task('prepare-dependency-tree', ["prepare-for-modules"], function () {
  585. let tasks = [];
  586. // now calculate internal dependencies in the .ts files!
  587. Object.keys(config.workloads).forEach((moduleName) => {
  588. let tsFiles = config.workloads[moduleName].files.map(f => f.replace(".js", ".ts"))
  589. let depTask = gulp.src(tsFiles)
  590. .pipe(calculateDependencies(moduleName, perFile, declared, dependencyTree));
  591. tasks.push(depTask);
  592. });
  593. return merge2(tasks);
  594. });
  595. // generate the modules directory, along with commonjs modules and es6 modules
  596. // Note - the generated modules are UNMINIFIED! The user will choose whether they want to minify or not.
  597. gulp.task("modules", ["prepare-dependency-tree"], function () {
  598. let tasks = [];
  599. Object.keys(config.workloads)
  600. .forEach((moduleName) => {
  601. let shadersFiles = [];
  602. processDependency("shaders", config.workloads[moduleName], shadersFiles, true);
  603. for (var index = 0; index < shadersFiles.length; index++) {
  604. shadersFiles[index] = "../../src/Shaders/" + shadersFiles[index] + ".fx";
  605. }
  606. let shaderIncludeFiles = [];
  607. processDependency("shaderIncludes", config.workloads[moduleName], shaderIncludeFiles, true);
  608. for (var index = 0; index < shaderIncludeFiles.length; index++) {
  609. shaderIncludeFiles[index] = "../../src/Shaders/ShadersInclude/" + shaderIncludeFiles[index] + ".fx";
  610. }
  611. let commonJsTask = merge2([
  612. gulp.src(config.workloads[moduleName].files)
  613. .pipe(replace(extendsSearchRegex, ""))
  614. .pipe(replace(decorateSearchRegex, ""))
  615. .pipe(replace(referenceSearchRegex, ""))
  616. .pipe(replace(/var BABYLON;\n/g, ""))
  617. .pipe(babylonModuleExports(moduleName, dependencyTree, false, perFile, shadersFiles.length, shaderIncludeFiles.length))
  618. .pipe(rename(function (path) {
  619. path.basename = path.basename.split(".").pop()
  620. path.extname = ".js"
  621. })),
  622. gulp.src(shadersFiles)
  623. .pipe(expect.real({ errorOnFailure: true }, shadersFiles))
  624. .pipe(uncommentShader())
  625. .pipe(appendSrcToVariable("BABYLON.Effect.ShadersStore", shadersName, config.build.outputDirectory + '/commonjs/' + moduleName + ".fx", "commonjs"))
  626. .pipe(rename("shaders.js")),
  627. gulp.src(shaderIncludeFiles)
  628. .pipe(expect.real({ errorOnFailure: true }, shaderIncludeFiles))
  629. .pipe(uncommentShader())
  630. .pipe(appendSrcToVariable("BABYLON.Effect.IncludesShadersStore", includeShadersName, config.build.outputDirectory + '/commonjs/' + moduleName + ".include.fx", "commonjs"))
  631. .pipe(rename("shaderIncludes.js")),
  632. gulp.src(config.workloads[moduleName].files)
  633. .pipe(concat('index.js'))
  634. .pipe(babylonModuleExports(moduleName, dependencyTree, true, perFile))
  635. ]).pipe(gulp.dest(config.build.outputDirectory + '/modules/' + moduleName + '/'))
  636. let es6Tasks = merge2([
  637. gulp.src(config.workloads[moduleName].files)
  638. .pipe(replace(extendsSearchRegex, ""))
  639. .pipe(replace(decorateSearchRegex, ""))
  640. .pipe(replace(referenceSearchRegex, ""))
  641. .pipe(replace(/var BABYLON;\n/g, ""))
  642. .pipe(babylonES6ModuleExports(moduleName, dependencyTree, false, perFile, shadersFiles.length, shaderIncludeFiles.length))
  643. .pipe(rename(function (path) {
  644. path.basename = path.basename.split(".").pop()
  645. path.extname = ".js"
  646. })),
  647. gulp.src(shadersFiles)
  648. .pipe(expect.real({ errorOnFailure: true }, shadersFiles))
  649. .pipe(uncommentShader())
  650. .pipe(appendSrcToVariable("BABYLON.Effect.ShadersStore", shadersName, config.build.outputDirectory + '/es6/' + moduleName + ".fx", "es6"))
  651. .pipe(rename("shaders.js")),
  652. gulp.src(shaderIncludeFiles)
  653. .pipe(expect.real({ errorOnFailure: true }, shaderIncludeFiles))
  654. .pipe(uncommentShader())
  655. .pipe(appendSrcToVariable("BABYLON.Effect.IncludesShadersStore", includeShadersName, config.build.outputDirectory + '/es6/' + moduleName + ".include.fx", "es6"))
  656. .pipe(rename("shaderIncludes.js")),
  657. gulp.src(config.workloads[moduleName].files)
  658. .pipe(concat('index.js'))
  659. .pipe(babylonES6ModuleExports(moduleName, dependencyTree, true, perFile))
  660. ]).pipe(gulp.dest(config.build.outputDirectory + '/modules/' + moduleName + '/es6/'))
  661. //commonjs js generation task
  662. /*let jsTask = merge2([
  663. gulp.src(config.workloads[moduleName].files),
  664. gulp.src(shadersFiles).
  665. //pipe(expect.real({ errorOnFailure: true }, shadersFiles)).
  666. pipe(uncommentShader()).
  667. pipe(appendSrcToVariable("BABYLON.Effect.ShadersStore", shadersName, config.build.outputDirectory + '/commonjs/' + moduleName + ".fx", true)),
  668. gulp.src(shaderIncludeFiles).
  669. //pipe(expect.real({ errorOnFailure: true }, shaderIncludeFiles)).
  670. pipe(uncommentShader()).
  671. pipe(appendSrcToVariable("BABYLON.Effect.IncludesShadersStore", includeShadersName, config.build.outputDirectory + '/commonjs/' + moduleName + ".include.fx", true))
  672. ]).pipe(concat('index.js'))
  673. .pipe(replace(extendsSearchRegex, ""))
  674. .pipe(replace(decorateSearchRegex, ""))
  675. .pipe(replace(referenceSearchRegex, ""))
  676. .pipe(babylonModuleExports(moduleName, config.workloads[moduleName].dependUpon))
  677. .pipe(gulp.dest(config.build.outputDirectory + '/modules/' + moduleName + '/'));*/
  678. // es6 modules generation task
  679. /*let es6Task = merge2([
  680. gulp.src(config.workloads[moduleName].files),
  681. gulp.src(shadersFiles).
  682. //pipe(expect.real({ errorOnFailure: true }, shadersFiles)).
  683. pipe(uncommentShader()).
  684. pipe(appendSrcToVariable("BABYLON.Effect.ShadersStore", shadersName, config.build.outputDirectory + '/commonjs/' + moduleName + ".fx", true)),
  685. gulp.src(shaderIncludeFiles).
  686. //pipe(expect.real({ errorOnFailure: true }, shaderIncludeFiles)).
  687. pipe(uncommentShader()).
  688. pipe(appendSrcToVariable("BABYLON.Effect.IncludesShadersStore", includeShadersName, config.build.outputDirectory + '/commonjs/' + moduleName + ".include.fx", true))
  689. ]).pipe(concat('es6.js'))
  690. .pipe(replace(extendsSearchRegex, ""))
  691. .pipe(replace(decorateSearchRegex, ""))
  692. .pipe(replace(referenceSearchRegex, ""))
  693. .pipe(replace(/var BABYLON;/g, ""))
  694. .pipe(babylonES6ModuleExports(moduleName, config.workloads[moduleName].dependUpon))
  695. .pipe(gulp.dest(config.build.outputDirectory + '/modules/' + moduleName + '/'));
  696. // dts genration task
  697. let dtsFiles = config.workloads[moduleName].files.map(f => f.replace(".js", ".d.ts"))
  698. let dtsTask = gulp.src(dtsFiles)
  699. .pipe(concat("index.d.ts"))
  700. .pipe(replace(/declare module BABYLON {/g, `declare module 'babylonjs/${moduleName}' {`))
  701. .pipe(replace(/\ninterface /g, `\nexport interface `))
  702. .pipe(dtsModuleSupport(moduleName, true, declared, perFile, dependencyTree))
  703. .pipe(gulp.dest(config.build.outputDirectory + '/modules/' + moduleName + '/'));
  704. */
  705. tasks.push(commonJsTask, es6Tasks);
  706. });
  707. // run da tasks man!
  708. return merge2(tasks);
  709. })