1 line
39 KiB
Plaintext
1 line
39 KiB
Plaintext
{"version":3,"file":"path.mjs","sources":["../../src/utils/path.ts"],"sourcesContent":["import { DOMAdapter } from '../environment/adapter';\n\nfunction assertPath(path: string)\n{\n if (typeof path !== 'string')\n {\n throw new TypeError(`Path must be a string. Received ${JSON.stringify(path)}`);\n }\n}\n\nfunction removeUrlParams(url: string): string\n{\n const re = url.split('?')[0];\n\n return re.split('#')[0];\n}\n\nfunction escapeRegExp(string: string)\n{\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n}\n\nfunction replaceAll(str: string, find: string, replace: string)\n{\n return str.replace(new RegExp(escapeRegExp(find), 'g'), replace);\n}\n\n// Resolves . and .. elements in a path with directory names\nfunction normalizeStringPosix(path: string, allowAboveRoot: boolean)\n{\n let res = '';\n let lastSegmentLength = 0;\n let lastSlash = -1;\n let dots = 0;\n let code = -1;\n\n for (let i = 0; i <= path.length; ++i)\n {\n if (i < path.length)\n {\n code = path.charCodeAt(i);\n }\n else if (code === 47)\n {\n break;\n }\n else\n {\n code = 47;\n }\n if (code === 47)\n {\n if (lastSlash === i - 1 || dots === 1)\n {\n // NOOP\n }\n else if (lastSlash !== i - 1 && dots === 2)\n {\n if (\n res.length < 2\n || lastSegmentLength !== 2\n || res.charCodeAt(res.length - 1) !== 46\n || res.charCodeAt(res.length - 2) !== 46\n )\n {\n if (res.length > 2)\n {\n const lastSlashIndex = res.lastIndexOf('/');\n\n if (lastSlashIndex !== res.length - 1)\n {\n if (lastSlashIndex === -1)\n {\n res = '';\n lastSegmentLength = 0;\n }\n else\n {\n res = res.slice(0, lastSlashIndex);\n lastSegmentLength = res.length - 1 - res.lastIndexOf('/');\n }\n lastSlash = i;\n dots = 0;\n continue;\n }\n }\n else if (res.length === 2 || res.length === 1)\n {\n res = '';\n lastSegmentLength = 0;\n lastSlash = i;\n dots = 0;\n continue;\n }\n }\n if (allowAboveRoot)\n {\n if (res.length > 0)\n { res += '/..'; }\n else\n { res = '..'; }\n lastSegmentLength = 2;\n }\n }\n else\n {\n if (res.length > 0)\n {\n res += `/${path.slice(lastSlash + 1, i)}`;\n }\n else\n {\n res = path.slice(lastSlash + 1, i);\n }\n lastSegmentLength = i - lastSlash - 1;\n }\n lastSlash = i;\n dots = 0;\n }\n else if (code === 46 && dots !== -1)\n {\n ++dots;\n }\n else\n {\n dots = -1;\n }\n }\n\n return res;\n}\n\n/**\n * Path utilities for working with URLs and file paths in a cross-platform way.\n * All paths that are passed in will become normalized to have posix separators.\n * ```js\n * import { path } from 'pixi.js';\n *\n * path.normalize('http://www.example.com/foo/bar/../baz'); // http://www.example.com/foo/baz\n * ```\n * @memberof utils\n */\nexport interface Path\n{\n /**\n * Converts a path to posix format.\n * @param path - The path to convert to posix\n */\n toPosix: (path: string) => string;\n /**\n * Checks if the path is a URL e.g. http://, https://\n * @param path - The path to check\n */\n isUrl: (path: string) => boolean;\n /**\n * Checks if the path is a data URL\n * @param path - The path to check\n */\n isDataUrl: (path: string) => boolean;\n /**\n * Checks if the path is a blob URL\n * @param path - The path to check\n */\n isBlobUrl: (path: string) => boolean;\n /**\n * Checks if the path has a protocol e.g. http://, https://, file:///, data:, blob:, C:/\n * This will return true for windows file paths\n * @param path - The path to check\n */\n hasProtocol: (path: string) => boolean;\n /**\n * Returns the protocol of the path e.g. http://, https://, file:///, data:, blob:, C:/\n * @param path - The path to get the protocol from\n */\n getProtocol: (path: string) => string;\n /**\n * Converts URL to an absolute path.\n * When loading from a Web Worker, we must use absolute paths.\n * If the URL is already absolute we return it as is\n * If it's not, we convert it\n * @param url - The URL to test\n * @param customBaseUrl - The base URL to use\n * @param customRootUrl - The root URL to use\n */\n toAbsolute: (url: string, baseUrl?: string, rootUrl?: string) => string;\n /**\n * Normalizes the given path, resolving '..' and '.' segments\n * @param path - The path to normalize\n */\n normalize: (path: string) => string;\n /**\n * Determines if path is an absolute path.\n * Absolute paths can be urls, data urls, or paths on disk\n * @param path - The path to test\n */\n isAbsolute: (path: string) => boolean;\n /**\n * Joins all given path segments together using the platform-specific separator as a delimiter,\n * then normalizes the resulting path\n * @param segments - The segments of the path to join\n */\n join: (...paths: string[]) => string;\n /**\n * Returns the directory name of a path\n * @param path - The path to parse\n */\n dirname: (path: string) => string;\n /**\n * Returns the root of the path e.g. /, C:/, file:///, http://domain.com/\n * @param path - The path to parse\n */\n rootname: (path: string) => string;\n /**\n * Returns the last portion of a path\n * @param path - The path to test\n * @param ext - Optional extension to remove\n */\n basename: (path: string, ext?: string) => string;\n /**\n * Returns the extension of the path, from the last occurrence of the . (period) character to end of string in the last\n * portion of the path. If there is no . in the last portion of the path, or if there are no . characters other than\n * the first character of the basename of path, an empty string is returned.\n * @param path - The path to parse\n */\n extname: (path: string) => string;\n /**\n * Parses a path into an object containing the 'root', `dir`, `base`, `ext`, and `name` properties.\n * @param path - The path to parse\n */\n parse: (path: string) => { root?: string, dir?: string, base?: string, ext?: string, name?: string };\n sep: string,\n delimiter: string,\n joinExtensions: string[],\n}\n\n/**\n * Path utilities for working with URLs and file paths in a cross-platform way.\n * All paths that are passed in will become normalized to have posix separators.\n * ```js\n * import { path } from 'pixi.js';\n *\n * path.normalize('http://www.example.com/foo/bar/../baz'); // http://www.example.com/foo/baz\n * ```\n * @see {@link utils.Path}\n * @memberof utils\n */\nexport const path: Path = {\n /**\n * Converts a path to posix format.\n * @param path - The path to convert to posix\n */\n toPosix(path: string) { return replaceAll(path, '\\\\', '/'); },\n /**\n * Checks if the path is a URL e.g. http://, https://\n * @param path - The path to check\n */\n isUrl(path: string) { return (/^https?:/).test(this.toPosix(path)); },\n /**\n * Checks if the path is a data URL\n * @param path - The path to check\n */\n isDataUrl(path: string)\n {\n // eslint-disable-next-line max-len\n return (/^data:([a-z]+\\/[a-z0-9-+.]+(;[a-z0-9-.!#$%*+.{}|~`]+=[a-z0-9-.!#$%*+.{}()_|~`]+)*)?(;base64)?,([a-z0-9!$&',()*+;=\\-._~:@\\/?%\\s<>]*?)$/i)\n .test(path);\n },\n /**\n * Checks if the path is a blob URL\n * @param path - The path to check\n */\n isBlobUrl(path: string)\n {\n // Not necessary to have an exact regex to match the blob URLs\n return path.startsWith('blob:');\n },\n /**\n * Checks if the path has a protocol e.g. http://, https://, file:///, data:, blob:, C:/\n * This will return true for windows file paths\n * @param path - The path to check\n */\n hasProtocol(path: string) { return (/^[^/:]+:/).test(this.toPosix(path)); },\n /**\n * Returns the protocol of the path e.g. http://, https://, file:///, data:, blob:, C:/\n * @param path - The path to get the protocol from\n */\n getProtocol(path: string)\n {\n assertPath(path);\n path = this.toPosix(path);\n\n const matchFile = (/^file:\\/\\/\\//).exec(path);\n\n if (matchFile)\n {\n return matchFile[0];\n }\n\n const matchProtocol = (/^[^/:]+:\\/{0,2}/).exec(path);\n\n if (matchProtocol)\n {\n return matchProtocol[0];\n }\n\n return '';\n },\n\n /**\n * Converts URL to an absolute path.\n * When loading from a Web Worker, we must use absolute paths.\n * If the URL is already absolute we return it as is\n * If it's not, we convert it\n * @param url - The URL to test\n * @param customBaseUrl - The base URL to use\n * @param customRootUrl - The root URL to use\n */\n toAbsolute(url: string, customBaseUrl?: string, customRootUrl?: string)\n {\n assertPath(url);\n\n if (this.isDataUrl(url) || this.isBlobUrl(url)) return url;\n\n const baseUrl = removeUrlParams(this.toPosix(customBaseUrl ?? DOMAdapter.get().getBaseUrl()));\n const rootUrl = removeUrlParams(this.toPosix(customRootUrl ?? this.rootname(baseUrl)));\n\n url = this.toPosix(url);\n\n // root relative url\n if (url.startsWith('/'))\n {\n return path.join(rootUrl, url.slice(1));\n }\n\n const absolutePath = this.isAbsolute(url) ? url : this.join(baseUrl, url);\n\n return absolutePath;\n },\n\n /**\n * Normalizes the given path, resolving '..' and '.' segments\n * @param path - The path to normalize\n */\n normalize(path: string)\n {\n assertPath(path);\n\n if (path.length === 0) return '.';\n if (this.isDataUrl(path) || this.isBlobUrl(path)) return path;\n\n path = this.toPosix(path);\n\n let protocol = '';\n const isAbsolute = path.startsWith('/');\n\n if (this.hasProtocol(path))\n {\n protocol = this.rootname(path);\n path = path.slice(protocol.length);\n }\n\n const trailingSeparator = path.endsWith('/');\n\n // Normalize the path\n path = normalizeStringPosix(path, false);\n\n if (path.length > 0 && trailingSeparator) path += '/';\n if (isAbsolute) return `/${path}`;\n\n return protocol + path;\n },\n\n /**\n * Determines if path is an absolute path.\n * Absolute paths can be urls, data urls, or paths on disk\n * @param path - The path to test\n */\n isAbsolute(path: string)\n {\n assertPath(path);\n path = this.toPosix(path);\n\n if (this.hasProtocol(path)) return true;\n\n return path.startsWith('/');\n },\n\n /**\n * Joins all given path segments together using the platform-specific separator as a delimiter,\n * then normalizes the resulting path\n * @param segments - The segments of the path to join\n */\n join(...segments: string[])\n {\n if (segments.length === 0)\n { return '.'; }\n let joined;\n\n for (let i = 0; i < segments.length; ++i)\n {\n const arg = segments[i];\n\n assertPath(arg);\n if (arg.length > 0)\n {\n if (joined === undefined) joined = arg;\n else\n {\n const prevArg = segments[i - 1] ?? '';\n\n if (this.joinExtensions.includes(this.extname(prevArg).toLowerCase()))\n {\n joined += `/../${arg}`;\n }\n else\n {\n joined += `/${arg}`;\n }\n }\n }\n }\n if (joined === undefined) { return '.'; }\n\n return this.normalize(joined);\n },\n\n /**\n * Returns the directory name of a path\n * @param path - The path to parse\n */\n dirname(path: string)\n {\n assertPath(path);\n if (path.length === 0) return '.';\n path = this.toPosix(path);\n let code = path.charCodeAt(0);\n const hasRoot = code === 47;\n let end = -1;\n let matchedSlash = true;\n\n const proto = this.getProtocol(path);\n const origpath = path;\n\n path = path.slice(proto.length);\n\n for (let i = path.length - 1; i >= 1; --i)\n {\n code = path.charCodeAt(i);\n if (code === 47)\n {\n if (!matchedSlash)\n {\n end = i;\n break;\n }\n }\n else\n {\n // We saw the first non-path separator\n matchedSlash = false;\n }\n }\n\n // if end is -1 and its a url then we need to add the path back\n // eslint-disable-next-line no-nested-ternary\n if (end === -1) return hasRoot ? '/' : this.isUrl(origpath) ? proto + path : proto;\n if (hasRoot && end === 1) return '//';\n\n return proto + path.slice(0, end);\n },\n\n /**\n * Returns the root of the path e.g. /, C:/, file:///, http://domain.com/\n * @param path - The path to parse\n */\n rootname(path: string)\n {\n assertPath(path);\n path = this.toPosix(path);\n\n let root = '';\n\n if (path.startsWith('/')) root = '/';\n else\n {\n root = this.getProtocol(path);\n }\n\n if (this.isUrl(path))\n {\n // need to find the first path separator\n const index = path.indexOf('/', root.length);\n\n if (index !== -1)\n {\n root = path.slice(0, index);\n }\n else root = path;\n\n if (!root.endsWith('/')) root += '/';\n }\n\n return root;\n },\n\n /**\n * Returns the last portion of a path\n * @param path - The path to test\n * @param ext - Optional extension to remove\n */\n basename(path: string, ext?: string)\n {\n assertPath(path);\n if (ext) assertPath(ext);\n\n path = removeUrlParams(this.toPosix(path));\n\n let start = 0;\n let end = -1;\n let matchedSlash = true;\n let i: number;\n\n if (ext !== undefined && ext.length > 0 && ext.length <= path.length)\n {\n if (ext.length === path.length && ext === path) return '';\n let extIdx = ext.length - 1;\n let firstNonSlashEnd = -1;\n\n for (i = path.length - 1; i >= 0; --i)\n {\n const code = path.charCodeAt(i);\n\n if (code === 47)\n {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash)\n {\n start = i + 1;\n break;\n }\n }\n else\n {\n if (firstNonSlashEnd === -1)\n {\n // We saw the first non-path separator, remember this index in case\n // we need it if the extension ends up not matching\n matchedSlash = false;\n firstNonSlashEnd = i + 1;\n }\n if (extIdx >= 0)\n {\n // Try to match the explicit extension\n if (code === ext.charCodeAt(extIdx))\n {\n if (--extIdx === -1)\n {\n // We matched the extension, so mark this as the end of our path\n // component\n end = i;\n }\n }\n else\n {\n // Extension does not match, so our result is the entire path\n // component\n extIdx = -1;\n end = firstNonSlashEnd;\n }\n }\n }\n }\n\n if (start === end) end = firstNonSlashEnd; else if (end === -1) end = path.length;\n\n return path.slice(start, end);\n }\n for (i = path.length - 1; i >= 0; --i)\n {\n if (path.charCodeAt(i) === 47)\n {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash)\n {\n start = i + 1;\n break;\n }\n }\n else if (end === -1)\n {\n // We saw the first non-path separator, mark this as the end of our\n // path component\n matchedSlash = false;\n end = i + 1;\n }\n }\n\n if (end === -1) return '';\n\n return path.slice(start, end);\n },\n\n /**\n * Returns the extension of the path, from the last occurrence of the . (period) character to end of string in the last\n * portion of the path. If there is no . in the last portion of the path, or if there are no . characters other than\n * the first character of the basename of path, an empty string is returned.\n * @param path - The path to parse\n */\n extname(path: string)\n {\n assertPath(path);\n path = removeUrlParams(this.toPosix(path));\n\n let startDot = -1;\n let startPart = 0;\n let end = -1;\n let matchedSlash = true;\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n let preDotState = 0;\n\n for (let i = path.length - 1; i >= 0; --i)\n {\n const code = path.charCodeAt(i);\n\n if (code === 47)\n {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash)\n {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1)\n {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46)\n {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1) startDot = i;\n else if (preDotState !== 1) preDotState = 1;\n }\n else if (startDot !== -1)\n {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n\n if (\n startDot === -1 || end === -1\n // We saw a non-dot character immediately before the dot\n || preDotState === 0\n // The (right-most) trimmed path component is exactly '..'\n // eslint-disable-next-line no-mixed-operators, no-mixed-operators/no-mixed-operators\n || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1\n )\n {\n return '';\n }\n\n return path.slice(startDot, end);\n },\n\n /**\n * Parses a path into an object containing the 'root', `dir`, `base`, `ext`, and `name` properties.\n * @param path - The path to parse\n */\n parse(path: string)\n {\n assertPath(path);\n\n const ret = { root: '', dir: '', base: '', ext: '', name: '' };\n\n if (path.length === 0) return ret;\n path = removeUrlParams(this.toPosix(path));\n\n let code = path.charCodeAt(0);\n const isAbsolute = this.isAbsolute(path);\n let start: number;\n const protocol = '';\n\n ret.root = this.rootname(path);\n\n if (isAbsolute || this.hasProtocol(path))\n {\n start = 1;\n }\n else\n {\n start = 0;\n }\n let startDot = -1;\n let startPart = 0;\n let end = -1;\n let matchedSlash = true;\n let i = path.length - 1;\n\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n let preDotState = 0;\n\n // Get non-dir info\n for (; i >= start; --i)\n {\n code = path.charCodeAt(i);\n if (code === 47)\n {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash)\n {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1)\n {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46)\n {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1) startDot = i;\n else if (preDotState !== 1) preDotState = 1;\n }\n else if (startDot !== -1)\n {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n\n if (\n startDot === -1 || end === -1\n // We saw a non-dot character immediately before the dot\n || preDotState === 0\n // The (right-most) trimmed path component is exactly '..'\n // eslint-disable-next-line no-mixed-operators, no-mixed-operators/no-mixed-operators\n || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1\n )\n {\n if (end !== -1)\n {\n if (startPart === 0 && isAbsolute) ret.base = ret.name = path.slice(1, end);\n else ret.base = ret.name = path.slice(startPart, end);\n }\n }\n else\n {\n if (startPart === 0 && isAbsolute)\n {\n ret.name = path.slice(1, startDot);\n ret.base = path.slice(1, end);\n }\n else\n {\n ret.name = path.slice(startPart, startDot);\n ret.base = path.slice(startPart, end);\n }\n ret.ext = path.slice(startDot, end);\n }\n\n ret.dir = this.dirname(path);\n if (protocol) ret.dir = protocol + ret.dir;\n\n return ret;\n },\n\n sep: '/',\n delimiter: ':',\n joinExtensions: ['.html'],\n} as Path;\n"],"names":["path"],"mappings":"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"} |