66 lines
1.6 KiB
JavaScript
66 lines
1.6 KiB
JavaScript
|
'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,
|
||
|
};
|