From 21c72ab9412228eea753e2abc48f8962707b1fe3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ionic=C4=83=20Biz=C4=83u?= Date: Mon, 27 Jun 2022 12:19:36 +0300 Subject: [PATCH] Refactor codebase, upgrade dependencies --- lib/index.js | 45 +++++++++++++++++++++++++++++++++------------ package.json | 8 ++++---- test/index.js | 27 +++++++++++++++++---------- 3 files changed, 54 insertions(+), 26 deletions(-) diff --git a/lib/index.js b/lib/index.js index 31b2a04..40966e9 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,8 +1,10 @@ "use strict" +// Dependencies const parsePath = require("parse-path") , normalizeUrl = require("normalize-url") + /** * parseUrl * Parses the input url. @@ -12,7 +14,7 @@ const parsePath = require("parse-path") * @name parseUrl * @function * @param {String} url The input url. - * @param {Boolean|Object} normalize Wheter to normalize the url or not. + * @param {Boolean|Object} normalize Whether to normalize the url or not. * Default is `false`. If `true`, the url will * be normalized. If an object, it will be the * options object sent to [`normalize-url`](https://github.com/sindresorhus/normalize-url). @@ -21,21 +23,26 @@ const parsePath = require("parse-path") * * @return {Object} An object containing the following fields: * - * - `protocols` (Array): An array with the url protocols (usually it has one element). - * - `protocol` (String): The first protocol, `"ssh"` (if the url is a ssh url) or `"file"`. - * - `port` (null|Number): The domain port. - * - `resource` (String): The url domain (including subdomains). - * - `user` (String): The authentication user (usually for ssh urls). - * - `pathname` (String): The url pathname. - * - `hash` (String): The url hash. - * - `search` (String): The url querystring value. - * - `href` (String): The input url. - * - `query` (Object): The url querystring, parsed as object. + * - `protocols` (Array): An array with the url protocols (usually it has one element). + * - `protocol` (String): The first protocol, `"ssh"` (if the url is a ssh url) or `"file"`. + * - `port` (null|Number): The domain port. + * - `resource` (String): The url domain (including subdomains). + * - `user` (String): The authentication user (usually for ssh urls). + * - `pathname` (String): The url pathname. + * - `hash` (String): The url hash. + * - `search` (String): The url querystring value. + * - `href` (String): The input url. + * - `query` (Object): The url querystring, parsed as object. */ -function parseUrl(url, normalize = false) { +const parseUrl = (url, normalize = false) => { + + // Constants + const GIT_RE = /((git@|http(s)?:\/\/)([\w\.@]+)(\/|:))(([\~,\w,\-,\_,\/]+)(.git){0,1}((\/){0,1}))/ + if (typeof url !== "string" || !url.trim()) { throw new Error("Invalid url.") } + if (normalize) { if (typeof normalize !== "object") { normalize = { @@ -44,7 +51,21 @@ function parseUrl(url, normalize = false) { } url = normalizeUrl(url, normalize) } + const parsed = parsePath(url) + + // Potential git-ssh urls + if (parsed.protocol === "file") { + const matched = parsed.href.match(GIT_RE) + if (matched) { + parsed.protocols = ["ssh"] + parsed.protocol = "ssh" + parsed.resource = matched[4] + parsed.user = "git" + parsed.pathname = `/${matched[6]}` + } + } + return parsed; } diff --git a/package.json b/package.json index 855044a..1ff55c1 100644 --- a/package.json +++ b/package.json @@ -31,10 +31,10 @@ "tester": "^1.3.1" }, "dependencies": { - "is-ssh": "^1.3.0", + "is-ssh": "^1.4.0", "normalize-url": "^6.1.0", - "parse-path": "^4.0.4", - "protocols": "^1.4.0" + "parse-path": "^5.0.0", + "protocols": "^2.0.1" }, "files": [ "bin/", @@ -56,4 +56,4 @@ "For low-level path parsing, check out [`parse-path`](https://github.com/IonicaBizau/parse-path). This very module is designed to parse urls. By default the urls are normalized." ] } -} \ No newline at end of file +} diff --git a/test/index.js b/test/index.js index 339af1f..e16affe 100644 --- a/test/index.js +++ b/test/index.js @@ -2,7 +2,6 @@ const parseUrl = require("../lib") , tester = require("tester") , normalizeUrl = require("normalize-url") - , qs = require("querystring") ; const INPUTS = [ @@ -11,12 +10,13 @@ const INPUTS = [ , { protocols: [ "http" ] , protocol: "http" - , port: null + , port: "" , resource: "ionicabizau.net" , user: "" , pathname: "/blog" , hash: "" , search: "" + , query: {} } ] , [ @@ -24,12 +24,13 @@ const INPUTS = [ , { protocols: ["http"] , protocol: "http" - , port: null + , port: "" , resource: "ionicabizau.net" , user: "" , pathname: "/foo.js" , hash: "" , search: "" + , query: {} } ] , [ @@ -37,12 +38,13 @@ const INPUTS = [ , { protocols: ["http"] , protocol: "http" - , port: null + , port: "" , resource: "domain.com" , user: "" , pathname: "/path/name" , hash: "some-hash?foo=bar" , search: "" + , query: {} } ] , [ @@ -50,25 +52,27 @@ const INPUTS = [ , { protocols: ["git", "ssh"] , protocol: "git" - , port: null + , port: "" , resource: "host.xz" , user: "git" , pathname: "/path/name.git" , hash: "" , search: "" + , query: {} } ] , [ ["git@github.com:IonicaBizau/git-stats.git", false] , { - protocols: [] + protocols: ["ssh"] , protocol: "ssh" - , port: null + , port: "" , resource: "github.com" , user: "git" , pathname: "/IonicaBizau/git-stats.git" , hash: "" , search: "" + , query: {} } ] , [ @@ -76,12 +80,13 @@ const INPUTS = [ , { protocols: [ "http" ] , protocol: "http" - , port: null + , port: "" , resource: "ionicabizau.net" , user: "" , pathname: "/with-true-normalize" , hash: "" , search: "" + , query: {} } ] ]; @@ -91,13 +96,15 @@ tester.describe("check urls", test => { let url = Array.isArray(c[0]) ? c[0][0] : c[0] test.should("support " + url, () => { const res = parseUrl(url, c[0][1] !== false); + if (c[0][1] !== false) { url = normalizeUrl(url, { stripHash: false }) } - c[1].query = qs.parse(c[1].search) - c[1].href = url + + c[1].href = c[1].href || url + c[1].password = c[1].password || "" test.expect(res).toEqual(c[1]); }); });