123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
- "use strict";
- const path = require("path");
- const CHAR_HASH = "#".charCodeAt(0);
- const CHAR_SLASH = "/".charCodeAt(0);
- const CHAR_BACKSLASH = "\\".charCodeAt(0);
- const CHAR_A = "A".charCodeAt(0);
- const CHAR_Z = "Z".charCodeAt(0);
- const CHAR_LOWER_A = "a".charCodeAt(0);
- const CHAR_LOWER_Z = "z".charCodeAt(0);
- const CHAR_DOT = ".".charCodeAt(0);
- const CHAR_COLON = ":".charCodeAt(0);
- const posixNormalize = path.posix.normalize;
- const winNormalize = path.win32.normalize;
- /**
- * @enum {number}
- */
- const PathType = Object.freeze({
- Empty: 0,
- Normal: 1,
- Relative: 2,
- AbsoluteWin: 3,
- AbsolutePosix: 4,
- Internal: 5
- });
- exports.PathType = PathType;
- /**
- * @param {string} p a path
- * @returns {PathType} type of path
- */
- const getType = p => {
- switch (p.length) {
- case 0:
- return PathType.Empty;
- case 1: {
- const c0 = p.charCodeAt(0);
- switch (c0) {
- case CHAR_DOT:
- return PathType.Relative;
- case CHAR_SLASH:
- return PathType.AbsolutePosix;
- case CHAR_HASH:
- return PathType.Internal;
- }
- return PathType.Normal;
- }
- case 2: {
- const c0 = p.charCodeAt(0);
- switch (c0) {
- case CHAR_DOT: {
- const c1 = p.charCodeAt(1);
- switch (c1) {
- case CHAR_DOT:
- case CHAR_SLASH:
- return PathType.Relative;
- }
- return PathType.Normal;
- }
- case CHAR_SLASH:
- return PathType.AbsolutePosix;
- case CHAR_HASH:
- return PathType.Internal;
- }
- const c1 = p.charCodeAt(1);
- if (c1 === CHAR_COLON) {
- if (
- (c0 >= CHAR_A && c0 <= CHAR_Z) ||
- (c0 >= CHAR_LOWER_A && c0 <= CHAR_LOWER_Z)
- ) {
- return PathType.AbsoluteWin;
- }
- }
- return PathType.Normal;
- }
- }
- const c0 = p.charCodeAt(0);
- switch (c0) {
- case CHAR_DOT: {
- const c1 = p.charCodeAt(1);
- switch (c1) {
- case CHAR_SLASH:
- return PathType.Relative;
- case CHAR_DOT: {
- const c2 = p.charCodeAt(2);
- if (c2 === CHAR_SLASH) return PathType.Relative;
- return PathType.Normal;
- }
- }
- return PathType.Normal;
- }
- case CHAR_SLASH:
- return PathType.AbsolutePosix;
- case CHAR_HASH:
- return PathType.Internal;
- }
- const c1 = p.charCodeAt(1);
- if (c1 === CHAR_COLON) {
- const c2 = p.charCodeAt(2);
- if (
- (c2 === CHAR_BACKSLASH || c2 === CHAR_SLASH) &&
- ((c0 >= CHAR_A && c0 <= CHAR_Z) ||
- (c0 >= CHAR_LOWER_A && c0 <= CHAR_LOWER_Z))
- ) {
- return PathType.AbsoluteWin;
- }
- }
- return PathType.Normal;
- };
- exports.getType = getType;
- /**
- * @param {string} p a path
- * @returns {string} the normalized path
- */
- const normalize = p => {
- switch (getType(p)) {
- case PathType.Empty:
- return p;
- case PathType.AbsoluteWin:
- return winNormalize(p);
- case PathType.Relative: {
- const r = posixNormalize(p);
- return getType(r) === PathType.Relative ? r : `./${r}`;
- }
- }
- return posixNormalize(p);
- };
- exports.normalize = normalize;
- /**
- * @param {string} rootPath the root path
- * @param {string | undefined} request the request path
- * @returns {string} the joined path
- */
- const join = (rootPath, request) => {
- if (!request) return normalize(rootPath);
- const requestType = getType(request);
- switch (requestType) {
- case PathType.AbsolutePosix:
- return posixNormalize(request);
- case PathType.AbsoluteWin:
- return winNormalize(request);
- }
- switch (getType(rootPath)) {
- case PathType.Normal:
- case PathType.Relative:
- case PathType.AbsolutePosix:
- return posixNormalize(`${rootPath}/${request}`);
- case PathType.AbsoluteWin:
- return winNormalize(`${rootPath}\\${request}`);
- }
- switch (requestType) {
- case PathType.Empty:
- return rootPath;
- case PathType.Relative: {
- const r = posixNormalize(rootPath);
- return getType(r) === PathType.Relative ? r : `./${r}`;
- }
- }
- return posixNormalize(rootPath);
- };
- exports.join = join;
- const joinCache = new Map();
- /**
- * @param {string} rootPath the root path
- * @param {string | undefined} request the request path
- * @returns {string} the joined path
- */
- const cachedJoin = (rootPath, request) => {
- let cacheEntry;
- let cache = joinCache.get(rootPath);
- if (cache === undefined) {
- joinCache.set(rootPath, (cache = new Map()));
- } else {
- cacheEntry = cache.get(request);
- if (cacheEntry !== undefined) return cacheEntry;
- }
- cacheEntry = join(rootPath, request);
- cache.set(request, cacheEntry);
- return cacheEntry;
- };
- exports.cachedJoin = cachedJoin;
- const checkImportsExportsFieldTarget = relativePath => {
- let lastNonSlashIndex = 0;
- let slashIndex = relativePath.indexOf("/", 1);
- let cd = 0;
- while (slashIndex !== -1) {
- const folder = relativePath.slice(lastNonSlashIndex, slashIndex);
- switch (folder) {
- case "..": {
- cd--;
- if (cd < 0)
- return new Error(
- `Trying to access out of package scope. Requesting ${relativePath}`
- );
- break;
- }
- case ".":
- break;
- default:
- cd++;
- break;
- }
- lastNonSlashIndex = slashIndex + 1;
- slashIndex = relativePath.indexOf("/", lastNonSlashIndex);
- }
- };
- exports.checkImportsExportsFieldTarget = checkImportsExportsFieldTarget;
|