aboutsummaryrefslogtreecommitdiff
path: root/node_modules/espower-location-detector/lib
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/espower-location-detector/lib')
-rw-r--r--node_modules/espower-location-detector/lib/position-detector.js32
-rw-r--r--node_modules/espower-location-detector/lib/source-adjuster.js63
2 files changed, 95 insertions, 0 deletions
diff --git a/node_modules/espower-location-detector/lib/position-detector.js b/node_modules/espower-location-detector/lib/position-detector.js
new file mode 100644
index 000000000..a9ef278ab
--- /dev/null
+++ b/node_modules/espower-location-detector/lib/position-detector.js
@@ -0,0 +1,32 @@
+'use strict';
+
+var SourceMapConsumer = require('source-map').SourceMapConsumer;
+var extend = require('xtend');
+
+function isEmptyMapping (pos) {
+ return ['source', 'line', 'column', 'name'].every(function (prop) {
+ return pos[prop] === null;
+ });
+}
+
+function PositionDetector (sourceMap) {
+ if (sourceMap) {
+ this.sourceMapConsumer = new SourceMapConsumer(sourceMap);
+ }
+}
+PositionDetector.prototype.positionFor = function (currentNode) {
+ var currentPosition = {
+ source: currentNode.loc.source,
+ line: currentNode.loc.start.line,
+ column: currentNode.loc.start.column
+ };
+ if (this.sourceMapConsumer) {
+ var found = this.sourceMapConsumer.originalPositionFor(currentPosition);
+ if (found && !isEmptyMapping(found)) {
+ return extend({ mapped: true }, found);
+ }
+ }
+ return extend({ mapped: false }, currentPosition);
+};
+
+module.exports = PositionDetector;
diff --git a/node_modules/espower-location-detector/lib/source-adjuster.js b/node_modules/espower-location-detector/lib/source-adjuster.js
new file mode 100644
index 000000000..973b32a0f
--- /dev/null
+++ b/node_modules/espower-location-detector/lib/source-adjuster.js
@@ -0,0 +1,63 @@
+'use strict';
+
+var _path = require('path');
+var isAbsolute = require('path-is-absolute');
+var isUrl = require('is-url');
+
+function SourceAdjuster (sourceRoot, path, sourceMap) {
+ this.path = path;
+ this.sourceRoot = sourceRoot;
+ if (typeof sourceMap === 'string') {
+ this.sourceMap = JSON.parse(sourceMap.replace(/^\)\]\}'/, ''));
+ } else {
+ this.sourceMap = sourceMap;
+ }
+}
+SourceAdjuster.prototype.relativize = function (filepathOrUrl, mappedWithSourceMap) {
+ var filepath;
+ if (mappedWithSourceMap && filepathOrUrl && this.sourceMap) {
+ filepath = this.relativizeWithSourceMap(filepathOrUrl);
+ } else {
+ filepath = this.relativizeWithoutSourceMap(filepathOrUrl);
+ }
+ return fallbackOnBasename(filepath);
+};
+SourceAdjuster.prototype.relativizeWithSourceMap = function (filepathOrUrl) {
+ var sourceMapRoot = this.sourceMap.sourceRoot;
+ if (sourceMapRoot && isUrl(sourceMapRoot)) {
+ return _path.relative(sourceMapRoot, filepathOrUrl);
+ }
+ if (this.sourceRoot && isAbsolute(this.sourceRoot) && isAbsolute(filepathOrUrl)) {
+ return _path.relative(this.sourceRoot, filepathOrUrl);
+ }
+ if (sourceMapRoot && isAbsolute(sourceMapRoot) && isAbsolute(filepathOrUrl)) {
+ return _path.relative(sourceMapRoot, filepathOrUrl);
+ }
+ if (isUrl(filepathOrUrl)) {
+ return _path.basename(filepathOrUrl);
+ }
+ return filepathOrUrl;
+};
+SourceAdjuster.prototype.relativizeWithoutSourceMap = function (filepathOrUrl) {
+ var tmpPath = this.path || filepathOrUrl;
+ if (this.sourceRoot && isAbsolute(this.sourceRoot) && isAbsolute(tmpPath)) {
+ return _path.relative(this.sourceRoot, tmpPath);
+ } else {
+ return this.path;
+ }
+};
+
+function fallbackOnBasename (filepath) {
+ if (filepath) {
+ if (filepath.split(_path.sep).indexOf('..') !== -1) {
+ return _path.basename(filepath);
+ } else if (isUrl(filepath)) {
+ return _path.basename(filepath);
+ } else if (isAbsolute(filepath)) {
+ return _path.basename(filepath);
+ }
+ }
+ return filepath;
+}
+
+module.exports = SourceAdjuster;