123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- 'use strict';
- var SourceMapGenerator = require('source-map').SourceMapGenerator;
- var SourceMapConsumer = require('source-map').SourceMapConsumer;
- function unixStylePath(filePath) {
- return filePath.replace(/\\/g, '/');
- }
- function Concat(generateSourceMap, fileName, separator) {
- this.lineOffset = 0;
- this.columnOffset = 0;
- this.sourceMapping = generateSourceMap;
- this.contentParts = [];
- if (separator === undefined) {
- this.separator = bufferFrom('');
- } else {
- this.separator = bufferFrom(separator);
- }
- if (this.sourceMapping) {
- this._sourceMap = new SourceMapGenerator({file: unixStylePath(fileName)});
- this.separatorLineOffset = 0;
- this.separatorColumnOffset = 0;
- var separatorString = this.separator.toString();
- for (var i = 0; i < separatorString.length; i++) {
- this.separatorColumnOffset++;
- if (separatorString[i] === '\n') {
- this.separatorLineOffset++;
- this.separatorColumnOffset = 0;
- }
- }
- }
- }
- Concat.prototype.add = function(filePath, content, sourceMap) {
- filePath = filePath && unixStylePath(filePath);
- if (!Buffer.isBuffer(content)) {
- content = bufferFrom(content);
- }
- if (this.contentParts.length !== 0) {
- this.contentParts.push(this.separator);
- }
- this.contentParts.push(content);
- if (this.sourceMapping) {
- var contentString = content.toString();
- var lines = contentString.split('\n').length;
- if (Object.prototype.toString.call(sourceMap) === '[object String]')
- sourceMap = JSON.parse(sourceMap);
- if (sourceMap && sourceMap.mappings && sourceMap.mappings.length > 0) {
- var upstreamSM = new SourceMapConsumer(sourceMap);
- var _this = this;
- upstreamSM.eachMapping(function(mapping) {
- if (mapping.source) {
- _this._sourceMap.addMapping({
- generated: {
- line: _this.lineOffset + mapping.generatedLine,
- column: (mapping.generatedLine === 1 ? _this.columnOffset : 0) + mapping.generatedColumn
- },
- original: mapping.originalLine == null ? null : {
- line: mapping.originalLine,
- column: mapping.originalColumn
- },
- source: mapping.originalLine != null ? mapping.source : null,
- name: mapping.name
- });
- }
- });
- if (upstreamSM.sourcesContent) {
- upstreamSM.sourcesContent.forEach(function(sourceContent, i) {
- _this._sourceMap.setSourceContent(upstreamSM.sources[i], sourceContent);
- });
- }
- } else {
- if (sourceMap && sourceMap.sources && sourceMap.sources.length > 0)
- filePath = sourceMap.sources[0];
- if (filePath) {
- for (var i = 1; i <= lines; i++) {
- this._sourceMap.addMapping({
- generated: {
- line: this.lineOffset + i,
- column: (i === 1 ? this.columnOffset : 0)
- },
- original: {
- line: i,
- column: 0
- },
- source: filePath
- });
- }
- if (sourceMap && sourceMap.sourcesContent)
- this._sourceMap.setSourceContent(filePath, sourceMap.sourcesContent[0]);
- }
- }
- if (lines > 1)
- this.columnOffset = 0;
- if (this.separatorLineOffset === 0)
- this.columnOffset += contentString.length - Math.max(0, contentString.lastIndexOf('\n')+1);
- this.columnOffset += this.separatorColumnOffset;
- this.lineOffset += lines - 1 + this.separatorLineOffset;
- }
- };
- Object.defineProperty(Concat.prototype, 'content', {
- get: function content() {
- return Buffer.concat(this.contentParts);
- }
- });
- Object.defineProperty(Concat.prototype, 'sourceMap', {
- get: function sourceMap() {
- return this._sourceMap ? this._sourceMap.toString() : undefined;
- }
- });
- function bufferFrom(content) {
- try {
- return Buffer.from(content);
- } catch(e) {
- if (Object.prototype.toString.call(content) !== '[object String]') {
- throw new TypeError("separator must be a string");
- }
- return new Buffer(content);
- }
- }
- Concat.bufferFrom = bufferFrom;
- Concat.default = Concat;
- module.exports = Concat;
|