mirror of
https://github.com/tiennm99/FBcount.git
synced 2026-05-14 18:57:58 +00:00
203 lines
4.6 KiB
JavaScript
203 lines
4.6 KiB
JavaScript
'use strict';
|
|
|
|
var assert = require('assert');
|
|
var path = require('path');
|
|
|
|
exports.STORE_BLOB = 0;
|
|
exports.STORE_CONTENT = 1;
|
|
exports.STORE_LINKS = 2;
|
|
exports.STORE_STAT = 3;
|
|
exports.ALIAS_AS_RELATIVE = 0; // require("./file.js") // file or directory
|
|
exports.ALIAS_AS_RESOLVABLE = 1; // require("package")
|
|
|
|
function uppercaseDriveLetter (f) {
|
|
if (f.slice(1, 3) !== ':\\') return f;
|
|
return f[0].toUpperCase() + f.slice(1);
|
|
}
|
|
|
|
function removeTrailingSlashes (f) {
|
|
if (f === '/') {
|
|
return f; // dont remove from "/"
|
|
}
|
|
if (f.slice(1) === ':\\') {
|
|
return f; // dont remove from "D:\"
|
|
}
|
|
var last = f.length - 1;
|
|
while (true) {
|
|
var char = f.charAt(last);
|
|
if (char === '\\') {
|
|
f = f.slice(0, -1);
|
|
last -= 1;
|
|
} else
|
|
if (char === '/') {
|
|
f = f.slice(0, -1);
|
|
last -= 1;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
return f;
|
|
}
|
|
|
|
function normalizePath (f) {
|
|
var file = f;
|
|
if (!(/^.:$/.test(f))) file = path.normalize(file); // 'c:' -> 'c:.'
|
|
file = uppercaseDriveLetter(file);
|
|
file = removeTrailingSlashes(file);
|
|
return file;
|
|
}
|
|
|
|
exports.normalizePath = normalizePath;
|
|
|
|
exports.isPackageJson = function (file) {
|
|
return path.basename(file) === 'package.json';
|
|
};
|
|
|
|
exports.isDotJS = function (file) {
|
|
return path.extname(file) === '.js';
|
|
};
|
|
|
|
exports.isDotJSON = function (file) {
|
|
return path.extname(file) === '.json';
|
|
};
|
|
|
|
exports.isDotNODE = function (file) {
|
|
return path.extname(file) === '.node';
|
|
};
|
|
|
|
function replaceSlashes (file, slash) {
|
|
if (/^.:\\/.test(file)) {
|
|
if (slash === '/') {
|
|
return file.slice(2).replace(/\\/g, '/');
|
|
}
|
|
} else
|
|
if (/^\//.test(file)) {
|
|
if (slash === '\\') {
|
|
return 'C:' + file.replace(/\//g, '\\');
|
|
}
|
|
}
|
|
return file;
|
|
}
|
|
|
|
function injectSnapshot (file) {
|
|
if (/^.:\\/.test(file)) {
|
|
// C:\path\to
|
|
if (file.length === 3) file = file.slice(0, -1); // C:\
|
|
return file[0] + ':\\snapshot' + file.slice(2);
|
|
} else
|
|
if (/^\//.test(file)) {
|
|
// /home/user/project
|
|
if (file.length === 1) file = file.slice(0, -1); // /
|
|
return '/snapshot' + file;
|
|
}
|
|
return file;
|
|
}
|
|
|
|
var win32 = process.platform === 'win32';
|
|
|
|
function longestCommonLength (s1, s2) {
|
|
var length = Math.min(s1.length, s2.length);
|
|
for (var i = 0; i < length; i += 1) {
|
|
if (s1.charCodeAt(i) !== s2.charCodeAt(i)) {
|
|
return i;
|
|
}
|
|
}
|
|
return length;
|
|
}
|
|
|
|
function withoutNodeModules (file) {
|
|
return file.split(path.sep + 'node_modules' + path.sep)[0];
|
|
}
|
|
|
|
exports.retrieveDenominator = function (files) {
|
|
assert(files.length > 0);
|
|
|
|
var s1 = withoutNodeModules(files[0]) + path.sep;
|
|
for (var i = 1; i < files.length; i += 1) {
|
|
var s2 = withoutNodeModules(files[i]) + path.sep;
|
|
s1 = s1.slice(0, longestCommonLength(s1, s2));
|
|
}
|
|
|
|
if (s1 === '') return win32 ? 2 : 0;
|
|
return s1.lastIndexOf(path.sep);
|
|
};
|
|
|
|
exports.substituteDenominator = function (f, denominator) {
|
|
var rootLength = win32 ? 2 : 0;
|
|
return f.slice(0, rootLength) + f.slice(denominator);
|
|
};
|
|
|
|
exports.snapshotify = function (file, slash) {
|
|
assert.equal(file, normalizePath(file));
|
|
return injectSnapshot(replaceSlashes(file, slash));
|
|
};
|
|
|
|
if (win32) {
|
|
exports.insideSnapshot = function insideSnapshot (f) {
|
|
if (typeof f !== 'string') return false;
|
|
var slice112 = f.slice(1, 12);
|
|
if (slice112 === ':\\snapshot\\' ||
|
|
slice112 === ':/snapshot\\' ||
|
|
slice112 === ':\\snapshot/' ||
|
|
slice112 === ':/snapshot/' ||
|
|
slice112 === ':\\snapshot' ||
|
|
slice112 === ':/snapshot') return true;
|
|
return false;
|
|
};
|
|
} else {
|
|
exports.insideSnapshot = function insideSnapshot (f) {
|
|
if (typeof f !== 'string') return false;
|
|
var slice010 = f.slice(0, 10);
|
|
if (slice010 === '/snapshot/' ||
|
|
slice010 === '/snapshot') return true;
|
|
return false;
|
|
};
|
|
}
|
|
|
|
exports.stripSnapshot = function (f) {
|
|
var file = normalizePath(f);
|
|
if (/^.:\\snapshot$/.test(file)) {
|
|
return file[0] + ':\\**\\';
|
|
}
|
|
if (/^.:\\snapshot\\/.test(file)) {
|
|
return file[0] + ':\\**' + file.slice(11);
|
|
}
|
|
if (/^\/snapshot$/.test(file)) {
|
|
return '/**/';
|
|
}
|
|
if (/^\/snapshot\//.test(file)) {
|
|
return '/**' + file.slice(9);
|
|
}
|
|
return f; // not inside
|
|
};
|
|
|
|
if (win32) {
|
|
exports.removeUplevels = function removeUplevels (f) {
|
|
while (true) {
|
|
if (f.slice(0, 3) === '..\\') {
|
|
f = f.slice(3);
|
|
} else
|
|
if (f === '..') {
|
|
f = '.';
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
return f;
|
|
};
|
|
} else {
|
|
exports.removeUplevels = function removeUplevels (f) {
|
|
while (true) {
|
|
if (f.slice(0, 3) === '../') {
|
|
f = f.slice(3);
|
|
} else
|
|
if (f === '..') {
|
|
f = '.';
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
return f;
|
|
};
|
|
}
|