| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- import { SourceMapGenerator } from 'source-map-js/lib/source-map-generator.js';
- const trackNodes = new Set(['Atrule', 'Selector', 'Declaration']);
- export function generateSourceMap(handlers) {
- const map = new 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;
- };
|