SourceListMap.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. var CodeNode = require("./CodeNode");
  6. var SourceNode = require("./SourceNode");
  7. var MappingsContext = require("./MappingsContext");
  8. function SourceListMap(generatedCode, source, originalSource) {
  9. if(Array.isArray(generatedCode)) {
  10. this.children = generatedCode;
  11. } else {
  12. this.children = [];
  13. if(generatedCode || source)
  14. this.add(generatedCode, source, originalSource);
  15. }
  16. }
  17. module.exports = SourceListMap;
  18. SourceListMap.prototype.add = function(generatedCode, source, originalSource) {
  19. if(typeof generatedCode === "string") {
  20. if(source) {
  21. this.children.push(new SourceNode(generatedCode, source, originalSource));
  22. } else if(this.children.length > 0 && this.children[this.children.length - 1].addGeneratedCode) {
  23. this.children[this.children.length - 1].addGeneratedCode(generatedCode);
  24. } else {
  25. this.children.push(new CodeNode(generatedCode));
  26. }
  27. } else if(generatedCode.getMappings && generatedCode.getGeneratedCode) {
  28. this.children.push(generatedCode);
  29. } else if(generatedCode.children) {
  30. generatedCode.children.forEach(function(sln) {
  31. this.children.push(sln);
  32. }, this);
  33. } else {
  34. throw new Error("Invalid arguments to SourceListMap.prototype.add: Expected string, Node or SourceListMap");
  35. }
  36. };
  37. SourceListMap.prototype.preprend = function(source) {
  38. if(typeof generatedCode === "string") {
  39. if(source) {
  40. this.children.unshift(new SourceNode(generatedCode, source, originalSource));
  41. } else if(this.children.length > 0 && this.children[this.children.length - 1].preprendGeneratedCode) {
  42. this.children[this.children.length - 1].preprendGeneratedCode(generatedCode);
  43. } else {
  44. this.children.unshift(new CodeNode(generatedCode));
  45. }
  46. } else if(generatedCode.getMappings && generatedCode.getGeneratedCode) {
  47. this.children.unshift(generatedCode);
  48. } else if(generatedCode.children) {
  49. generatedCode.children.slice().reverse().forEach(function(sln) {
  50. this.children.unshift(sln);
  51. }, this);
  52. } else {
  53. throw new Error("Invalid arguments to SourceListMap.prototype.prerend: Expected string, Node or SourceListMap");
  54. }
  55. };
  56. SourceListMap.prototype.mapGeneratedCode = function(fn) {
  57. this.children.forEach(function(sln) {
  58. sln.mapGeneratedCode(fn);
  59. });
  60. };
  61. SourceListMap.prototype.toString = function() {
  62. return this.children.map(function(sln) {
  63. return sln.getGeneratedCode();
  64. }).join("");
  65. };
  66. SourceListMap.prototype.toStringWithSourceMap = function(options) {
  67. var mappingsContext = new MappingsContext();
  68. var source = this.children.map(function(sln) {
  69. return sln.generatedCode;
  70. }).join("");
  71. var mappings = this.children.map(function(sln) {
  72. return sln.getMappings(mappingsContext);
  73. }).join("");
  74. return {
  75. source: source,
  76. map: {
  77. version: 3,
  78. file: options && options.file,
  79. sources: mappingsContext.sources,
  80. sourcesContent: mappingsContext.hasSourceContent ? mappingsContext.sourcesContent : undefined,
  81. mappings: mappings
  82. }
  83. };
  84. }