forked from projectmoon/tenebrous-dicebot
103 lines
2.3 KiB
JavaScript
103 lines
2.3 KiB
JavaScript
/*
|
|
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
Author Tobias Koppers @sokra
|
|
*/
|
|
"use strict";
|
|
|
|
const Source = require("./Source");
|
|
const RawSource = require("./RawSource");
|
|
const { SourceNode } = require("source-map");
|
|
const { getSourceAndMap, getMap } = require("./helpers");
|
|
|
|
const REPLACE_REGEX = /\n(?=.|\s)/g;
|
|
|
|
class PrefixSource extends Source {
|
|
constructor(prefix, source) {
|
|
super();
|
|
this._source =
|
|
typeof source === "string" || Buffer.isBuffer(source)
|
|
? new RawSource(source, true)
|
|
: source;
|
|
this._prefix = prefix;
|
|
}
|
|
|
|
getPrefix() {
|
|
return this._prefix;
|
|
}
|
|
|
|
original() {
|
|
return this._source;
|
|
}
|
|
|
|
source() {
|
|
const node = this._source.source();
|
|
const prefix = this._prefix;
|
|
return prefix + node.replace(REPLACE_REGEX, "\n" + prefix);
|
|
}
|
|
|
|
// TODO efficient buffer() implementation
|
|
|
|
map(options) {
|
|
return getMap(this, options);
|
|
}
|
|
|
|
sourceAndMap(options) {
|
|
return getSourceAndMap(this, options);
|
|
}
|
|
|
|
node(options) {
|
|
const node = this._source.node(options);
|
|
const prefix = this._prefix;
|
|
const output = [];
|
|
const result = new SourceNode();
|
|
node.walkSourceContents(function (source, content) {
|
|
result.setSourceContent(source, content);
|
|
});
|
|
let needPrefix = true;
|
|
node.walk(function (chunk, mapping) {
|
|
const parts = chunk.split(/(\n)/);
|
|
for (let i = 0; i < parts.length; i += 2) {
|
|
const nl = i + 1 < parts.length;
|
|
const 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) {
|
|
const prefix = this._prefix;
|
|
const map = this._source.listMap(options);
|
|
let prefixNextLine = true;
|
|
return map.mapGeneratedCode(function (code) {
|
|
let updatedCode = code.replace(REPLACE_REGEX, "\n" + prefix);
|
|
if (prefixNextLine) updatedCode = prefix + updatedCode;
|
|
prefixNextLine = code.charCodeAt(code.length - 1) === 10; // === /\n$/.test(code)
|
|
return updatedCode;
|
|
});
|
|
}
|
|
|
|
updateHash(hash) {
|
|
hash.update("PrefixSource");
|
|
this._source.updateHash(hash);
|
|
hash.update(this._prefix);
|
|
}
|
|
}
|
|
|
|
module.exports = PrefixSource;
|