|
|
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
- "use strict";
-
- var Source = require("./Source");
- var SourceNode = require("source-map").SourceNode;
-
- var REPLACE_REGEX = /\n(?=.|\s)/g;
-
- function cloneAndPrefix(node, prefix, append) {
- if(typeof node === "string") {
- var result = node.replace(REPLACE_REGEX, "\n" + prefix);
- if(append.length > 0) result = append.pop() + result;
- if(/\n$/.test(node)) append.push(prefix);
- return result;
- } else {
- var newNode = new SourceNode(
- node.line,
- node.column,
- node.source,
- node.children.map(function(node) {
- return cloneAndPrefix(node, prefix, append);
- }),
- node.name
- );
- newNode.sourceContents = node.sourceContents;
- return newNode;
- }
- };
-
- class PrefixSource extends Source {
- constructor(prefix, source) {
- super();
- this._source = source;
- this._prefix = prefix;
- }
-
- source() {
- var node = typeof this._source === "string" ? this._source : this._source.source();
- var prefix = this._prefix;
- return prefix + node.replace(REPLACE_REGEX, "\n" + prefix);
- }
-
- node(options) {
- var node = this._source.node(options);
- var prefix = this._prefix;
- var output = [];
- var result = new SourceNode();
- node.walkSourceContents(function(source, content) {
- result.setSourceContent(source, content);
- });
- var needPrefix = true;
- node.walk(function(chunk, mapping) {
- var parts = chunk.split(/(\n)/);
- for(var i = 0; i < parts.length; i += 2) {
- var nl = i + 1 < parts.length;
- var part = parts[i] + (nl ? "\n" : "");
- if(part) {
- if(needPrefix) {
- output.push(prefix);
- }
- output.push(new SourceNode(mapping.line, mapping.column, mapping.source, part, mapping.name));
- needPrefix = nl;
- }
- }
- });
- result.add(output);
- return result;
- }
-
- listMap(options) {
- var prefix = this._prefix;
- var map = this._source.listMap(options);
- return map.mapGeneratedCode(function(code) {
- return prefix + code.replace(REPLACE_REGEX, "\n" + prefix);
- });
- }
-
- updateHash(hash) {
- if(typeof this._source === "string")
- hash.update(this._source);
- else
- this._source.updateHash(hash);
- if(typeof this._prefix === "string")
- hash.update(this._prefix);
- else
- this._prefix.updateHash(hash);
- }
- }
-
- require("./SourceAndMapMixin")(PrefixSource.prototype);
-
- module.exports = PrefixSource;
|