Spaces:
Configuration error
Configuration error
; | |
const sourceMapGenerator_js = require('source-map-js/lib/source-map-generator.js'); | |
const trackNodes = new Set(['Atrule', 'Selector', 'Declaration']); | |
function generateSourceMap(handlers) { | |
const map = new sourceMapGenerator_js.SourceMapGenerator(); | |
const generated = { | |
line: 1, | |
column: 0 | |
}; | |
const original = { | |
line: 0, // should be zero to add first mapping | |
column: 0 | |
}; | |
const activatedGenerated = { | |
line: 1, | |
column: 0 | |
}; | |
const activatedMapping = { | |
generated: activatedGenerated | |
}; | |
let line = 1; | |
let column = 0; | |
let sourceMappingActive = false; | |
const origHandlersNode = handlers.node; | |
handlers.node = function(node) { | |
if (node.loc && node.loc.start && trackNodes.has(node.type)) { | |
const nodeLine = node.loc.start.line; | |
const nodeColumn = node.loc.start.column - 1; | |
if (original.line !== nodeLine || | |
original.column !== nodeColumn) { | |
original.line = nodeLine; | |
original.column = nodeColumn; | |
generated.line = line; | |
generated.column = column; | |
if (sourceMappingActive) { | |
sourceMappingActive = false; | |
if (generated.line !== activatedGenerated.line || | |
generated.column !== activatedGenerated.column) { | |
map.addMapping(activatedMapping); | |
} | |
} | |
sourceMappingActive = true; | |
map.addMapping({ | |
source: node.loc.source, | |
original, | |
generated | |
}); | |
} | |
} | |
origHandlersNode.call(this, node); | |
if (sourceMappingActive && trackNodes.has(node.type)) { | |
activatedGenerated.line = line; | |
activatedGenerated.column = column; | |
} | |
}; | |
const origHandlersEmit = handlers.emit; | |
handlers.emit = function(value, type, auto) { | |
for (let i = 0; i < value.length; i++) { | |
if (value.charCodeAt(i) === 10) { // \n | |
line++; | |
column = 0; | |
} else { | |
column++; | |
} | |
} | |
origHandlersEmit(value, type, auto); | |
}; | |
const origHandlersResult = handlers.result; | |
handlers.result = function() { | |
if (sourceMappingActive) { | |
map.addMapping(activatedMapping); | |
} | |
return { | |
css: origHandlersResult(), | |
map | |
}; | |
}; | |
return handlers; | |
} | |
exports.generateSourceMap = generateSourceMap; | |