track.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. var escapePrefix = '__ESCAPED_';
  2. function trackPrefix(value, context, interestingContent) {
  3. if (!interestingContent && value.indexOf('\n') == -1) {
  4. if (value.indexOf(escapePrefix) === 0) {
  5. return value;
  6. } else {
  7. context.column += value.length;
  8. return;
  9. }
  10. }
  11. var withoutContent = 0;
  12. var split = value.split('\n');
  13. var total = split.length;
  14. var shift = 0;
  15. while (true) {
  16. if (withoutContent == total - 1)
  17. break;
  18. var part = split[withoutContent];
  19. if (/\S/.test(part))
  20. break;
  21. shift += part.length + 1;
  22. withoutContent++;
  23. }
  24. context.line += withoutContent;
  25. context.column = withoutContent > 0 ? 0 : context.column;
  26. context.column += /^(\s)*/.exec(split[withoutContent])[0].length;
  27. return value.substring(shift).trimLeft();
  28. }
  29. function sourceFor(originalMetadata, contextMetadata, context) {
  30. var source = originalMetadata.source || contextMetadata.source;
  31. if (source && context.resolvePath)
  32. return context.resolvePath(contextMetadata.source, source);
  33. return source;
  34. }
  35. function snapshot(data, context, fallbacks) {
  36. var metadata = {
  37. line: context.line,
  38. column: context.column,
  39. source: context.source
  40. };
  41. var sourceContent = null;
  42. var sourceMetadata = context.sourceMapTracker.isTracking(metadata.source) ?
  43. context.sourceMapTracker.originalPositionFor(metadata, data, fallbacks || 0) :
  44. {};
  45. metadata.line = sourceMetadata.line || metadata.line;
  46. metadata.column = sourceMetadata.column || metadata.column;
  47. metadata.source = sourceMetadata.sourceResolved ?
  48. sourceMetadata.source :
  49. sourceFor(sourceMetadata, metadata, context);
  50. if (context.sourceMapInlineSources) {
  51. var sourceMapSourcesContent = context.sourceMapTracker.sourcesContentFor(context.source);
  52. sourceContent = sourceMapSourcesContent && sourceMapSourcesContent[metadata.source] ?
  53. sourceMapSourcesContent :
  54. context.sourceReader.sourceAt(context.source);
  55. }
  56. return sourceContent ?
  57. [metadata.line, metadata.column, metadata.source, sourceContent] :
  58. [metadata.line, metadata.column, metadata.source];
  59. }
  60. function trackSuffix(data, context) {
  61. var parts = data.split('\n');
  62. for (var i = 0, l = parts.length; i < l; i++) {
  63. var part = parts[i];
  64. var cursor = 0;
  65. if (i > 0) {
  66. context.line++;
  67. context.column = 0;
  68. }
  69. while (true) {
  70. var next = part.indexOf(escapePrefix, cursor);
  71. if (next == -1) {
  72. context.column += part.substring(cursor).length;
  73. break;
  74. }
  75. context.column += next - cursor;
  76. cursor += next - cursor;
  77. var escaped = part.substring(next, part.indexOf('__', next + 1) + 2);
  78. var encodedValues = escaped.substring(escaped.indexOf('(') + 1, escaped.indexOf(')')).split(',');
  79. context.line += ~~encodedValues[0];
  80. context.column = (~~encodedValues[0] === 0 ? context.column : 0) + ~~encodedValues[1];
  81. cursor += escaped.length;
  82. }
  83. }
  84. }
  85. function track(data, context, snapshotMetadata, fallbacks) {
  86. var untracked = trackPrefix(data, context, snapshotMetadata);
  87. var metadata = snapshotMetadata ?
  88. snapshot(untracked, context, fallbacks) :
  89. [];
  90. if (untracked)
  91. trackSuffix(untracked, context);
  92. return metadata;
  93. }
  94. module.exports = track;