join(...pathnames) {
		if (pathnames.length < 2)
			throw new Error("Join(), requires at least two parameters");

		let { url, query } = this.parse(pathnames[0]);

		const protocol = (this.PROTOCOL_PATTERN.exec(url) || [])[0] || "";

		if (protocol === "content://") {
			try {
				if (pathnames[1].startsWith("/")) pathnames[1] = pathnames[1].slice(1);
				const contentUri = Uri.parse(url);
				let [root, pathname] = contentUri.docId.split(":");
				const newDocId = path.join(pathname, ...pathnames.slice(1));
				if (/^content:\/\/com.termux/.test(url)) {
					const rootCondition = root.endsWith("/");
					const newDocIdCondition = newDocId.startsWith("/");
					if (rootCondition === newDocIdCondition) {
						root = root.slice(0, -1);
					} else if (!rootCondition === !newDocIdCondition) {
						root += "/";
					}
					return `${contentUri.rootUri}::${root}${newDocId}${query}`;
				}
				return `${contentUri.rootUri}::${root}:${newDocId}${query}`;
			} catch (error) {
				return null;
			}
		} else if (protocol) {
			url = url.replace(new RegExp("^" + protocol), "");
			pathnames[0] = url;
			return protocol + path.join(...pathnames) + query;
		} else {
			return path.join(url, ...pathnames.slice(1)) + query;
		}
	}
Join all arguments together and normalize the resulting path.
@param  {...string} pathnames
@returns {String}