gulp-addModuleExports.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. var gutil = require('gulp-util');
  2. var through = require('through2');
  3. /**
  4. * The parameters for this function has grown during development.
  5. * Eventually, this function will need to be reorganized.
  6. */
  7. // subModule, extendsRoot, externalUsingBabylon, noBabylonInit
  8. module.exports = function (varName, config) {
  9. return through.obj(function (file, enc, cb) {
  10. config = config || {};
  11. if (typeof varName === 'string') {
  12. varName = {
  13. name: varName,
  14. module: varName
  15. }
  16. if (varName.name === 'BABYLON') {
  17. varName.module = 'babylonjs';
  18. }
  19. }
  20. if (!config.dependencies) {
  21. if (config.subModule || config.extendsRoot) {
  22. config.dependencies = [
  23. {
  24. name: "BABYLON",
  25. module: "babylonjs",
  26. optional: false
  27. }
  28. ]
  29. }
  30. }
  31. function moduleExportAddition(varName) {
  32. let dependenciesDefinition = `var amdDependencies = [];`;
  33. let functionVariables = '';
  34. let requireText = '';
  35. let amdText = '';
  36. let afterInitText = '';
  37. if (config.dependencies) {
  38. config.dependencies.forEach(dep => {
  39. if (functionVariables) functionVariables += ',';
  40. functionVariables += dep.name;
  41. requireText += ` ${dep.optional ? ' try { ' : ''} ${dep.name} = ${dep.name} || require("${dep.module}"); ${dep.optional ? ' } catch(e) {} ' : ''}
  42. `;
  43. amdText += ` ${dep.optional ? ' if(require.specified && require.specified("' + dep.module + '"))' : ''} amdDependencies.push("${dep.module}");
  44. `;
  45. dependenciesDefinition += `
  46. var ${dep.name} = root.${dep.name};`;
  47. afterInitText += ` ${dep.name} = ${dep.name} || this.${dep.name};
  48. `
  49. });
  50. }
  51. let base = config.subModule ? 'BABYLON' : varName.name;
  52. return `\n\n(function universalModuleDefinition(root, factory) {
  53. ${dependenciesDefinition}
  54. if(typeof exports === 'object' && typeof module === 'object') {
  55. ${requireText}
  56. module.exports = factory(${functionVariables});
  57. } else if(typeof define === 'function' && define.amd) {
  58. ${amdText}
  59. define("${varName.module}", amdDependencies, factory);
  60. } else if(typeof exports === 'object') {
  61. ${requireText}
  62. exports["${varName.module}"] = factory(${functionVariables});
  63. } else {
  64. root["${base}"]${(config.subModule && !config.extendsRoot) ? '["' + varName.name + '"]' : ''} = factory(${functionVariables});
  65. }
  66. })(this, function(${functionVariables}) {
  67. ${afterInitText}
  68. ${String(file.contents)}
  69. ${varName.name === 'BABYLON' || varName.name === 'INSPECTOR' ? `
  70. var globalObject = (typeof global !== 'undefined') ? global : ((typeof window !== 'undefined') ? window : this);
  71. globalObject["${varName.name}"] = ${varName.name}` : ''}
  72. //backwards compatibility
  73. if(typeof earcut !== 'undefined') {
  74. globalObject["Earcut"] = {
  75. earcut: earcut
  76. };
  77. }
  78. return ${base}${(config.subModule && !config.extendsRoot) ? '.' + varName.name : ''};
  79. });
  80. `;
  81. }
  82. var extendsAddition =
  83. `var __extends=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,o){t.__proto__=o}||function(t,o){for(var n in o)o.hasOwnProperty(n)&&(t[n]=o[n])};return function(o,n){function r(){this.constructor=o}t(o,n),o.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();
  84. `;
  85. var decorateAddition = `var __decorate=this&&this.__decorate||function(e,t,r,c){var o,f=arguments.length,n=f<3?t:null===c?c=Object.getOwnPropertyDescriptor(t,r):c;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,r,c);else for(var l=e.length-1;l>=0;l--)(o=e[l])&&(n=(f<3?o(n):f>3?o(t,r,n):o(t,r))||n);return f>3&&n&&Object.defineProperty(t,r,n),n};
  86. `;
  87. if (file.isNull()) {
  88. cb(null, file);
  89. return;
  90. }
  91. if (file.isStream()) {
  92. //streams not supported, no need for now.
  93. return;
  94. }
  95. try {
  96. if (config.externalUsingBabylon) {
  97. file.contents = new Buffer(String('').concat(moduleExportAddition(varName)));
  98. } else {
  99. let pretext = '';
  100. file.contents = new Buffer(decorateAddition.concat(new Buffer(extendsAddition.concat(String('')).concat(moduleExportAddition(varName)))));
  101. }
  102. this.push(file);
  103. } catch (err) {
  104. this.emit('error', new gutil.PluginError('gulp-add-module-exports', err, { fileName: file.path }));
  105. }
  106. cb();
  107. });
  108. };