source-maps.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. var SourceMapGenerator = require('source-map').SourceMapGenerator;
  2. var all = require('./helpers').all;
  3. var isWindows = process.platform == 'win32';
  4. var unknownSource = '$stdin';
  5. function store(element, context) {
  6. var fromString = typeof element == 'string';
  7. var value = fromString ? element : element[0];
  8. if (value.indexOf('_') > -1)
  9. value = context.restore(value, prefixContentFrom(context.output));
  10. track(value, fromString ? null : element, context);
  11. context.output.push(value);
  12. }
  13. function prefixContentFrom(values) {
  14. var content = [];
  15. for (var i = values.length - 1; i >= 0; i--) {
  16. var value = values[i];
  17. content.unshift(value);
  18. if (value == '{' || value == ';')
  19. break;
  20. }
  21. return content.join('');
  22. }
  23. function track(value, element, context) {
  24. if (element)
  25. trackAllMappings(element, context);
  26. var parts = value.split('\n');
  27. context.line += parts.length - 1;
  28. context.column = parts.length > 1 ? 0 : (context.column + parts.pop().length);
  29. }
  30. function trackAllMappings(element, context) {
  31. var mapping = element[element.length - 1];
  32. if (!Array.isArray(mapping))
  33. return;
  34. for (var i = 0, l = mapping.length; i < l; i++) {
  35. trackMapping(mapping[i], context);
  36. }
  37. }
  38. function trackMapping(mapping, context) {
  39. var source = mapping[2] || unknownSource;
  40. if (isWindows)
  41. source = source.replace(/\\/g, '/');
  42. context.outputMap.addMapping({
  43. generated: {
  44. line: context.line,
  45. column: context.column
  46. },
  47. source: source,
  48. original: {
  49. line: mapping[0],
  50. column: mapping[1]
  51. }
  52. });
  53. if (mapping[3])
  54. context.outputMap.setSourceContent(source, mapping[3][mapping[2]]);
  55. }
  56. function stringify(tokens, options, restoreCallback, inputMapTracker) {
  57. var context = {
  58. column: 0,
  59. inputMapTracker: inputMapTracker,
  60. keepBreaks: options.keepBreaks,
  61. line: 1,
  62. output: [],
  63. outputMap: new SourceMapGenerator(),
  64. restore: restoreCallback,
  65. sourceMapInlineSources: options.sourceMapInlineSources,
  66. spaceAfterClosingBrace: options.compatibility.properties.spaceAfterClosingBrace,
  67. store: store
  68. };
  69. all(tokens, context, false);
  70. return {
  71. sourceMap: context.outputMap,
  72. styles: context.output.join('').trim()
  73. };
  74. }
  75. module.exports = stringify;