You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.6 KiB
65 lines
1.6 KiB
'use strict'; |
|
|
|
var css = require('css'); |
|
var acorn = require('acorn'); |
|
var SourceMapGenerator = require('source-map').SourceMapGenerator; |
|
|
|
function generateJs(sourcePath, fileContent) { |
|
var generator = new SourceMapGenerator({ file: sourcePath }); |
|
var tokenizer = acorn.tokenizer(fileContent, { allowHashBang: true, locations: true }); |
|
|
|
while (true) { |
|
var token = tokenizer.getToken(); |
|
|
|
if (token.type.label === 'eof') { |
|
break; |
|
} |
|
var mapping = { |
|
original: token.loc.start, |
|
generated: token.loc.start, |
|
source: sourcePath, |
|
}; |
|
if (token.type.label === 'name') { |
|
mapping.name = token.value; |
|
} |
|
generator.addMapping(mapping); |
|
} |
|
generator.setSourceContent(sourcePath, fileContent); |
|
|
|
return generator.toJSON(); |
|
} |
|
|
|
function generateCss(sourcePath, fileContent) { |
|
var generator = new SourceMapGenerator({ file: sourcePath }); |
|
var ast = css.parse(fileContent, { silent: true }); |
|
|
|
function registerTokens(ast) { |
|
if (ast.position) { |
|
generator.addMapping({ |
|
original: ast.position.start, |
|
generated: ast.position.start, |
|
source: sourcePath, |
|
}); |
|
} |
|
|
|
for (var key in ast) { |
|
if (key === 'position' || !ast[key]) { |
|
continue; |
|
} |
|
if (Object.prototype.toString.call(ast[key]) === '[object Object]') { |
|
registerTokens(ast[key]); |
|
} else if (Array.isArray(ast[key])) { |
|
ast[key].forEach(registerTokens); |
|
} |
|
} |
|
} |
|
registerTokens(ast); |
|
generator.setSourceContent(sourcePath, fileContent); |
|
|
|
return generator.toJSON(); |
|
} |
|
|
|
module.exports = { |
|
js: generateJs, |
|
css: generateCss, |
|
};
|
|
|