fromStringWithSourceMap.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. var base64VLQ = require("./base64-vlq");
  6. var SourceNode = require("./SourceNode");
  7. var CodeNode = require("./CodeNode");
  8. var SourceListMap = require("./SourceListMap");
  9. module.exports = function fromStringWithSourceMap(code, map) {
  10. var sources = map.sources;
  11. var sourcesContent = map.sourcesContent;
  12. var mappings = map.mappings.split(";");
  13. var lines = code.split("\n");
  14. var nodes = [];
  15. var currentNode = null;
  16. var currentLine = 1;
  17. var currentSourceIdx = 0;
  18. var currentSourceNodeLine;
  19. mappings.forEach(function(mapping, idx) {
  20. var line = lines[idx];
  21. if(typeof line === 'undefined') return;
  22. if(idx !== lines.length - 1) line += "\n";
  23. if(!mapping)
  24. return addCode(line);
  25. mapping = { value: 0, rest: mapping };
  26. var lineAdded = false;
  27. while(mapping.rest)
  28. lineAdded = processMapping(mapping, line, lineAdded) || lineAdded;
  29. if(!lineAdded)
  30. addCode(line);
  31. });
  32. if(mappings.length < lines.length) {
  33. var idx = mappings.length;
  34. while(!lines[idx].trim() && idx < lines.length-1) {
  35. addCode(lines[idx] + "\n");
  36. idx++;
  37. }
  38. addCode(lines.slice(idx).join("\n"));
  39. }
  40. return new SourceListMap(nodes);
  41. function processMapping(mapping, line, ignore) {
  42. if(mapping.rest && mapping.rest[0] !== ",") {
  43. base64VLQ.decode(mapping.rest, mapping);
  44. }
  45. if(!mapping.rest)
  46. return false;
  47. if(mapping.rest[0] === ",") {
  48. mapping.rest = mapping.rest.substr(1);
  49. return false;
  50. }
  51. base64VLQ.decode(mapping.rest, mapping);
  52. var sourceIdx = mapping.value + currentSourceIdx;
  53. currentSourceIdx = sourceIdx;
  54. if(mapping.rest && mapping.rest[0] !== ",") {
  55. base64VLQ.decode(mapping.rest, mapping);
  56. var linePosition = mapping.value + currentLine;
  57. currentLine = linePosition;
  58. } else {
  59. var linePosition = currentLine;
  60. }
  61. if(mapping.rest) {
  62. var next = mapping.rest.indexOf(",");
  63. mapping.rest = next === -1 ? "" : mapping.rest.substr(next);
  64. }
  65. if(!ignore) {
  66. addSource(line, sources ? sources[sourceIdx] : null, sourcesContent ? sourcesContent[sourceIdx] : null, linePosition)
  67. return true;
  68. }
  69. }
  70. function addCode(generatedCode) {
  71. if(currentNode && currentNode instanceof CodeNode) {
  72. currentNode.addGeneratedCode(generatedCode);
  73. } else if(currentNode && currentNode instanceof SourceNode && !generatedCode.trim()) {
  74. currentNode.generatedCode += generatedCode;
  75. currentSourceNodeLine++;
  76. } else {
  77. currentNode = new CodeNode(generatedCode);
  78. nodes.push(currentNode);
  79. }
  80. }
  81. function addSource(generatedCode, source, originalSource, linePosition) {
  82. if(currentNode && currentNode instanceof SourceNode &&
  83. currentNode.source === source &&
  84. currentSourceNodeLine === linePosition
  85. ) {
  86. currentNode.generatedCode += generatedCode;
  87. currentSourceNodeLine++;
  88. } else {
  89. currentNode = new SourceNode(generatedCode, source, originalSource, linePosition);
  90. currentSourceNodeLine = linePosition + 1;
  91. nodes.push(currentNode);
  92. }
  93. }
  94. };