ktemplate
Version:
简单支持预编译的 js 模版
118 lines (115 loc) • 3.48 kB
JavaScript
/**
* @date 13-1-14
* @describe: 对sourceMap的简单扩展
* @author: KnightWu
* @version: 0.0.1
*/
var sourceMap = require('source-map');
var path = require('path');
/**
* 合并 A 到 B, B 到 C 的map,最终生成 A 到 C 的 map,增加到本 map 生成者上
* @param A2B
* @param B2C
* @param file 生成map时所需的file名称
*/
sourceMap.SourceMapGenerator.prototype.combine = function (A2B, B2C, file) { //return A2C map
A2B = convertToSourceMapConsumer(A2B, file);
B2C = convertToSourceMapConsumer(B2C, file);
var self = this;
B2C.eachMapping(function (mapping) { //original order
self.addMapping(getA2CMapping(mapping, A2B));
}, sourceMap.SourceMapConsumer.ORIGINAL_ORDER);
};
/**
* 将一个 obj 转化成 consumer 类型
* @param obj
* @param file
* @return {{}}
*/
var convertToSourceMapConsumer = function (obj, file) {
var objConsumer = obj;
if (obj instanceof sourceMap.SourceMapGenerator) {
objConsumer = new sourceMap.SourceMapConsumer(obj.toString());
}
if (obj instanceof sourceMap.SourceNode) {
objConsumer = new sourceMap.SourceMapConsumer(
obj.toStringWithSourceMap({file: file}).map.toString()
);
}
return objConsumer;
};
/**
* 生成单条 A 到 C 的 map
* @param generatedMapping
* @param sourceMap
* @return {{generated: {line: *, column: *}, source: *, original: *}}
*/
var getA2CMapping = function (generatedMapping, sourceMap) {
var APos = sourceMap.originalPositionFor({
line: generatedMapping.originalLine,
column: generatedMapping.originalColumn
});
return {
generated: {
line: generatedMapping.generatedLine,
column: generatedMapping.generatedColumn
},
source: APos.source,
original: APos
};
};
/**
* 格式化位置对象
* @param posObj
* @return {*}
*/
var formatPos = function (posObj) {
if (posObj !== undefined) {
posObj = {
line: posObj.line || 0,
column: posObj.column || 0
}
} else {
posObj = {line: 0, column: 0};
}
return posObj;
};
/**
* 改变这个map,生成一个新的map对象
* @param walker 遍历操作
*/
sourceMap.SourceMapGenerator.prototype.transform = function (walker) {
var offsetObj = new sourceMap.SourceMapGenerator({
file: this._file,
sourceRoot: this._sourceRoot
});
var objConsumer = new sourceMap.SourceMapConsumer(this.toString());
objConsumer.eachMapping(function (mapping) { //generated order
offsetObj.addMapping(walker(mapping));
});
return offsetObj;
};
/**
* line 和 column 平移固定的值,比如,所有的行号和列号
* @param generated
* @param original
* @return {*}
*/
sourceMap.SourceMapGenerator.prototype.offset = function (generated, original) {
generated = formatPos(generated);
original = formatPos(original);
var sourceRoot = this._sourceRoot;
return this.transform(function (mapping) {
return {
generated: {
line: mapping.generatedLine + generated.line,
column: mapping.generatedColumn + generated.column
},
source: path.relative(sourceRoot, mapping.source),
original: {
line: mapping.originalLine + original.line,
column: mapping.originalColumn + original.column
}
};
});
};