1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- '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]) {
- break;
- }
- 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,
- };
|