sourceMap.cjs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. 'use strict';
  2. const sourceMapGenerator_js = require('source-map-js/lib/source-map-generator.js');
  3. const trackNodes = new Set(['Atrule', 'Selector', 'Declaration']);
  4. function generateSourceMap(handlers) {
  5. const map = new sourceMapGenerator_js.SourceMapGenerator();
  6. const generated = {
  7. line: 1,
  8. column: 0
  9. };
  10. const original = {
  11. line: 0, // should be zero to add first mapping
  12. column: 0
  13. };
  14. const activatedGenerated = {
  15. line: 1,
  16. column: 0
  17. };
  18. const activatedMapping = {
  19. generated: activatedGenerated
  20. };
  21. let line = 1;
  22. let column = 0;
  23. let sourceMappingActive = false;
  24. const origHandlersNode = handlers.node;
  25. handlers.node = function(node) {
  26. if (node.loc && node.loc.start && trackNodes.has(node.type)) {
  27. const nodeLine = node.loc.start.line;
  28. const nodeColumn = node.loc.start.column - 1;
  29. if (original.line !== nodeLine ||
  30. original.column !== nodeColumn) {
  31. original.line = nodeLine;
  32. original.column = nodeColumn;
  33. generated.line = line;
  34. generated.column = column;
  35. if (sourceMappingActive) {
  36. sourceMappingActive = false;
  37. if (generated.line !== activatedGenerated.line ||
  38. generated.column !== activatedGenerated.column) {
  39. map.addMapping(activatedMapping);
  40. }
  41. }
  42. sourceMappingActive = true;
  43. map.addMapping({
  44. source: node.loc.source,
  45. original,
  46. generated
  47. });
  48. }
  49. }
  50. origHandlersNode.call(this, node);
  51. if (sourceMappingActive && trackNodes.has(node.type)) {
  52. activatedGenerated.line = line;
  53. activatedGenerated.column = column;
  54. }
  55. };
  56. const origHandlersEmit = handlers.emit;
  57. handlers.emit = function(value, type, auto) {
  58. for (let i = 0; i < value.length; i++) {
  59. if (value.charCodeAt(i) === 10) { // \n
  60. line++;
  61. column = 0;
  62. } else {
  63. column++;
  64. }
  65. }
  66. origHandlersEmit(value, type, auto);
  67. };
  68. const origHandlersResult = handlers.result;
  69. handlers.result = function() {
  70. if (sourceMappingActive) {
  71. map.addMapping(activatedMapping);
  72. }
  73. return {
  74. css: origHandlersResult(),
  75. map
  76. };
  77. };
  78. return handlers;
  79. }
  80. exports.generateSourceMap = generateSourceMap;