Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Refactor codebase, upgrade dependencies
  • Loading branch information
IonicaBizau committed Jun 27, 2022
1 parent fa488b2 commit 21c72ab
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 26 deletions.
45 changes: 33 additions & 12 deletions lib/index.js
@@ -1,8 +1,10 @@
"use strict"

// Dependencies
const parsePath = require("parse-path")
, normalizeUrl = require("normalize-url")


/**
* parseUrl
* Parses the input url.
Expand All @@ -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).
Expand All @@ -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 = {
Expand All @@ -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;
}

Expand Down
8 changes: 4 additions & 4 deletions package.json
Expand Up @@ -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/",
Expand All @@ -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."
]
}
}
}
27 changes: 17 additions & 10 deletions test/index.js
Expand Up @@ -2,7 +2,6 @@
const parseUrl = require("../lib")
, tester = require("tester")
, normalizeUrl = require("normalize-url")
, qs = require("querystring")
;

const INPUTS = [
Expand All @@ -11,77 +10,83 @@ const INPUTS = [
, {
protocols: [ "http" ]
, protocol: "http"
, port: null
, port: ""
, resource: "ionicabizau.net"
, user: ""
, pathname: "/blog"
, hash: ""
, search: ""
, query: {}
}
]
, [
"//ionicabizau.net/foo.js"
, {
protocols: ["http"]
, protocol: "http"
, port: null
, port: ""
, resource: "ionicabizau.net"
, user: ""
, pathname: "/foo.js"
, hash: ""
, search: ""
, query: {}
}
]
, [
"http://domain.com/path/name#some-hash?foo=bar"
, {
protocols: ["http"]
, protocol: "http"
, port: null
, port: ""
, resource: "domain.com"
, user: ""
, pathname: "/path/name"
, hash: "some-hash?foo=bar"
, search: ""
, query: {}
}
]
, [
["git+ssh://git@host.xz/path/name.git", false]
, {
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: {}
}
]
, [
["http://ionicabizau.net/with-true-normalize", true]
, {
protocols: [ "http" ]
, protocol: "http"
, port: null
, port: ""
, resource: "ionicabizau.net"
, user: ""
, pathname: "/with-true-normalize"
, hash: ""
, search: ""
, query: {}
}
]
];
Expand All @@ -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]);
});
});
Expand Down

0 comments on commit 21c72ab

Please sign in to comment.