1 | 'use strict';
|
2 |
|
3 | var FS = require('fs'),
|
4 | PATH = require('path');
|
5 | for(var i in PATH) exports[i] = PATH[i];
|
6 |
|
7 | var isWindows = exports.isWindows = process.platform === 'win32',
|
8 | dirSep = exports.dirSep = isWindows? '\\' : '/',
|
9 | dirSepRe = exports.dirSepRe = isWindows? '\\\\' : '/';
|
10 | exports.pathSep = isWindows? ';' : ':';
|
11 |
|
12 | exports.isAbsolute = function(path) {
|
13 | var re = new RegExp('^([a-zA-Z]:)?' + dirSepRe);
|
14 | return path.match(re);
|
15 | };
|
16 |
|
17 | exports.isRoot = function(path) {
|
18 | var re = new RegExp('^([a-zA-Z]:)?' + dirSepRe + '$');
|
19 | return path.match(re);
|
20 | };
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 | exports.relative = function(from, to, dot) {
|
32 | var path = PATH.relative(from, to);
|
33 | if (dot && !new RegExp('^\\.{1,2}' + dirSepRe).test(path)) {
|
34 | path = '.' + dirSep + path;
|
35 | }
|
36 | return path;
|
37 | };
|
38 |
|
39 | exports.absolute = function(path, startDir) {
|
40 | return exports.isAbsolute(path) ?
|
41 | path :
|
42 | exports.normalize(exports.join(startDir || process.cwd(), path));
|
43 | };
|
44 |
|
45 | exports.unixToOs = function(path) {
|
46 | return path.replace(/\//g, dirSep);
|
47 | };
|
48 |
|
49 | exports.joinPosix = function() {
|
50 | var paths = Array.prototype.slice.call(arguments, 0);
|
51 | return exports.normalizePosix(paths.filter(function(p) {
|
52 | return p && typeof p === 'string';
|
53 | }).join('/'));
|
54 | };
|
55 |
|
56 | exports.normalizePosix = function(path) {
|
57 | var isAbsolute = path.charAt(0) === '/',
|
58 | trailingSlash = path.slice(-1) === '/';
|
59 |
|
60 |
|
61 | path = normalizeArray(path
|
62 | .split('/')
|
63 | .filter(function(p) {
|
64 | return !!p;
|
65 | }), !isAbsolute).join('/');
|
66 |
|
67 | if (!path && !isAbsolute) {
|
68 | path = '.';
|
69 | }
|
70 | if (path && trailingSlash) {
|
71 | path += '/';
|
72 | }
|
73 |
|
74 | return (isAbsolute ? '/' : '') + path;
|
75 | };
|
76 |
|
77 |
|
78 | exports.exists = FS.exists || PATH.exists;
|
79 | exports.existsSync = FS.existsSync || PATH.existsSync;
|
80 |
|
81 | function normalizeArray(parts, allowAboveRoot) {
|
82 |
|
83 | var up = 0;
|
84 | for (var i = parts.length - 1; i >= 0; i--) {
|
85 | var last = parts[i];
|
86 | if (last === '.') {
|
87 | parts.splice(i, 1);
|
88 | } else if (last === '..') {
|
89 | parts.splice(i, 1);
|
90 | up++;
|
91 | } else if (up) {
|
92 | parts.splice(i, 1);
|
93 | up--;
|
94 | }
|
95 | }
|
96 |
|
97 |
|
98 | if (allowAboveRoot) {
|
99 | for (; up--; up) {
|
100 | parts.unshift('..');
|
101 | }
|
102 | }
|
103 |
|
104 | return parts;
|
105 | }
|