normalize-url
Advanced tools
Comparing version 6.1.0 to 7.0.0
378
index.d.ts
@@ -1,247 +0,245 @@ | ||
declare namespace normalizeUrl { | ||
interface Options { | ||
/** | ||
@default 'http:' | ||
*/ | ||
readonly defaultProtocol?: string; | ||
export interface Options { | ||
/** | ||
@default 'http:' | ||
*/ | ||
readonly defaultProtocol?: string; | ||
/** | ||
Prepends `defaultProtocol` to the URL if it's protocol-relative. | ||
/** | ||
Prepends `defaultProtocol` to the URL if it's protocol-relative. | ||
@default true | ||
@default true | ||
@example | ||
``` | ||
normalizeUrl('//sindresorhus.com:80/'); | ||
//=> 'http://sindresorhus.com' | ||
@example | ||
``` | ||
normalizeUrl('//sindresorhus.com:80/'); | ||
//=> 'http://sindresorhus.com' | ||
normalizeUrl('//sindresorhus.com:80/', {normalizeProtocol: false}); | ||
//=> '//sindresorhus.com' | ||
``` | ||
*/ | ||
readonly normalizeProtocol?: boolean; | ||
normalizeUrl('//sindresorhus.com:80/', {normalizeProtocol: false}); | ||
//=> '//sindresorhus.com' | ||
``` | ||
*/ | ||
readonly normalizeProtocol?: boolean; | ||
/** | ||
Normalizes `https:` URLs to `http:`. | ||
/** | ||
Normalizes `https:` URLs to `http:`. | ||
@default false | ||
@default false | ||
@example | ||
``` | ||
normalizeUrl('https://sindresorhus.com:80/'); | ||
//=> 'https://sindresorhus.com' | ||
@example | ||
``` | ||
normalizeUrl('https://sindresorhus.com:80/'); | ||
//=> 'https://sindresorhus.com' | ||
normalizeUrl('https://sindresorhus.com:80/', {forceHttp: true}); | ||
//=> 'http://sindresorhus.com' | ||
``` | ||
*/ | ||
readonly forceHttp?: boolean; | ||
normalizeUrl('https://sindresorhus.com:80/', {forceHttp: true}); | ||
//=> 'http://sindresorhus.com' | ||
``` | ||
*/ | ||
readonly forceHttp?: boolean; | ||
/** | ||
Normalizes `http:` URLs to `https:`. | ||
/** | ||
Normalizes `http:` URLs to `https:`. | ||
This option can't be used with the `forceHttp` option at the same time. | ||
This option can't be used with the `forceHttp` option at the same time. | ||
@default false | ||
@default false | ||
@example | ||
``` | ||
normalizeUrl('https://sindresorhus.com:80/'); | ||
//=> 'https://sindresorhus.com' | ||
@example | ||
``` | ||
normalizeUrl('https://sindresorhus.com:80/'); | ||
//=> 'https://sindresorhus.com' | ||
normalizeUrl('http://sindresorhus.com:80/', {forceHttps: true}); | ||
//=> 'https://sindresorhus.com' | ||
``` | ||
*/ | ||
readonly forceHttps?: boolean; | ||
normalizeUrl('http://sindresorhus.com:80/', {forceHttps: true}); | ||
//=> 'https://sindresorhus.com' | ||
``` | ||
*/ | ||
readonly forceHttps?: boolean; | ||
/** | ||
Strip the [authentication](https://en.wikipedia.org/wiki/Basic_access_authentication) part of a URL. | ||
/** | ||
Strip the [authentication](https://en.wikipedia.org/wiki/Basic_access_authentication) part of a URL. | ||
@default true | ||
@default true | ||
@example | ||
``` | ||
normalizeUrl('user:password@sindresorhus.com'); | ||
//=> 'https://sindresorhus.com' | ||
@example | ||
``` | ||
normalizeUrl('user:password@sindresorhus.com'); | ||
//=> 'https://sindresorhus.com' | ||
normalizeUrl('user:password@sindresorhus.com', {stripAuthentication: false}); | ||
//=> 'https://user:password@sindresorhus.com' | ||
``` | ||
*/ | ||
readonly stripAuthentication?: boolean; | ||
normalizeUrl('user:password@sindresorhus.com', {stripAuthentication: false}); | ||
//=> 'https://user:password@sindresorhus.com' | ||
``` | ||
*/ | ||
readonly stripAuthentication?: boolean; | ||
/** | ||
Removes hash from the URL. | ||
/** | ||
Removes hash from the URL. | ||
@default false | ||
@default false | ||
@example | ||
``` | ||
normalizeUrl('sindresorhus.com/about.html#contact'); | ||
//=> 'http://sindresorhus.com/about.html#contact' | ||
@example | ||
``` | ||
normalizeUrl('sindresorhus.com/about.html#contact'); | ||
//=> 'http://sindresorhus.com/about.html#contact' | ||
normalizeUrl('sindresorhus.com/about.html#contact', {stripHash: true}); | ||
//=> 'http://sindresorhus.com/about.html' | ||
``` | ||
*/ | ||
readonly stripHash?: boolean; | ||
normalizeUrl('sindresorhus.com/about.html#contact', {stripHash: true}); | ||
//=> 'http://sindresorhus.com/about.html' | ||
``` | ||
*/ | ||
readonly stripHash?: boolean; | ||
/** | ||
Removes HTTP(S) protocol from an URL `http://sindresorhus.com` → `sindresorhus.com`. | ||
/** | ||
Removes HTTP(S) protocol from an URL `http://sindresorhus.com` → `sindresorhus.com`. | ||
@default false | ||
@default false | ||
@example | ||
``` | ||
normalizeUrl('https://sindresorhus.com'); | ||
//=> 'https://sindresorhus.com' | ||
@example | ||
``` | ||
normalizeUrl('https://sindresorhus.com'); | ||
//=> 'https://sindresorhus.com' | ||
normalizeUrl('sindresorhus.com', {stripProtocol: true}); | ||
//=> 'sindresorhus.com' | ||
``` | ||
*/ | ||
readonly stripProtocol?: boolean; | ||
normalizeUrl('sindresorhus.com', {stripProtocol: true}); | ||
//=> 'sindresorhus.com' | ||
``` | ||
*/ | ||
readonly stripProtocol?: boolean; | ||
/** | ||
Strip the [text fragment](https://web.dev/text-fragments/) part of the URL | ||
/** | ||
Strip the [text fragment](https://web.dev/text-fragments/) part of the URL | ||
__Note:__ The text fragment will always be removed if the `stripHash` option is set to `true`, as the hash contains the text fragment. | ||
__Note:__ The text fragment will always be removed if the `stripHash` option is set to `true`, as the hash contains the text fragment. | ||
@default true | ||
@default true | ||
@example | ||
``` | ||
normalizeUrl('http://sindresorhus.com/about.html#:~:text=hello'); | ||
//=> 'http://sindresorhus.com/about.html#' | ||
@example | ||
``` | ||
normalizeUrl('http://sindresorhus.com/about.html#:~:text=hello'); | ||
//=> 'http://sindresorhus.com/about.html#' | ||
normalizeUrl('http://sindresorhus.com/about.html#section:~:text=hello'); | ||
//=> 'http://sindresorhus.com/about.html#section' | ||
normalizeUrl('http://sindresorhus.com/about.html#section:~:text=hello'); | ||
//=> 'http://sindresorhus.com/about.html#section' | ||
normalizeUrl('http://sindresorhus.com/about.html#:~:text=hello', {stripTextFragment: false}); | ||
//=> 'http://sindresorhus.com/about.html#:~:text=hello' | ||
normalizeUrl('http://sindresorhus.com/about.html#:~:text=hello', {stripTextFragment: false}); | ||
//=> 'http://sindresorhus.com/about.html#:~:text=hello' | ||
normalizeUrl('http://sindresorhus.com/about.html#section:~:text=hello', {stripTextFragment: false}); | ||
//=> 'http://sindresorhus.com/about.html#section:~:text=hello' | ||
``` | ||
*/ | ||
readonly stripTextFragment?: boolean; | ||
normalizeUrl('http://sindresorhus.com/about.html#section:~:text=hello', {stripTextFragment: false}); | ||
//=> 'http://sindresorhus.com/about.html#section:~:text=hello' | ||
``` | ||
*/ | ||
readonly stripTextFragment?: boolean; | ||
/** | ||
Removes `www.` from the URL. | ||
/** | ||
Removes `www.` from the URL. | ||
@default true | ||
@default true | ||
@example | ||
``` | ||
normalizeUrl('http://www.sindresorhus.com'); | ||
//=> 'http://sindresorhus.com' | ||
@example | ||
``` | ||
normalizeUrl('http://www.sindresorhus.com'); | ||
//=> 'http://sindresorhus.com' | ||
normalizeUrl('http://www.sindresorhus.com', {stripWWW: false}); | ||
//=> 'http://www.sindresorhus.com' | ||
``` | ||
*/ | ||
readonly stripWWW?: boolean; | ||
normalizeUrl('http://www.sindresorhus.com', {stripWWW: false}); | ||
//=> 'http://www.sindresorhus.com' | ||
``` | ||
*/ | ||
readonly stripWWW?: boolean; | ||
/** | ||
Removes query parameters that matches any of the provided strings or regexes. | ||
/** | ||
Removes query parameters that matches any of the provided strings or regexes. | ||
@default [/^utm_\w+/i] | ||
@default [/^utm_\w+/i] | ||
@example | ||
``` | ||
normalizeUrl('www.sindresorhus.com?foo=bar&ref=test_ref', { | ||
removeQueryParameters: ['ref'] | ||
}); | ||
//=> 'http://sindresorhus.com/?foo=bar' | ||
``` | ||
@example | ||
``` | ||
normalizeUrl('www.sindresorhus.com?foo=bar&ref=test_ref', { | ||
removeQueryParameters: ['ref'] | ||
}); | ||
//=> 'http://sindresorhus.com/?foo=bar' | ||
``` | ||
If a boolean is provided, `true` will remove all the query parameters. | ||
If a boolean is provided, `true` will remove all the query parameters. | ||
``` | ||
normalizeUrl('www.sindresorhus.com?foo=bar', { | ||
removeQueryParameters: true | ||
}); | ||
//=> 'http://sindresorhus.com' | ||
``` | ||
``` | ||
normalizeUrl('www.sindresorhus.com?foo=bar', { | ||
removeQueryParameters: true | ||
}); | ||
//=> 'http://sindresorhus.com' | ||
``` | ||
`false` will not remove any query parameter. | ||
`false` will not remove any query parameter. | ||
``` | ||
normalizeUrl('www.sindresorhus.com?foo=bar&utm_medium=test&ref=test_ref', { | ||
removeQueryParameters: false | ||
}); | ||
//=> 'http://www.sindresorhus.com/?foo=bar&ref=test_ref&utm_medium=test' | ||
``` | ||
*/ | ||
readonly removeQueryParameters?: ReadonlyArray<RegExp | string> | boolean; | ||
``` | ||
normalizeUrl('www.sindresorhus.com?foo=bar&utm_medium=test&ref=test_ref', { | ||
removeQueryParameters: false | ||
}); | ||
//=> 'http://www.sindresorhus.com/?foo=bar&ref=test_ref&utm_medium=test' | ||
``` | ||
*/ | ||
readonly removeQueryParameters?: ReadonlyArray<RegExp | string> | boolean; | ||
/** | ||
Removes trailing slash. | ||
/** | ||
Removes trailing slash. | ||
__Note__: Trailing slash is always removed if the URL doesn't have a pathname unless the `removeSingleSlash` option is set to `false`. | ||
__Note__: Trailing slash is always removed if the URL doesn't have a pathname unless the `removeSingleSlash` option is set to `false`. | ||
@default true | ||
@default true | ||
@example | ||
``` | ||
normalizeUrl('http://sindresorhus.com/redirect/'); | ||
//=> 'http://sindresorhus.com/redirect' | ||
@example | ||
``` | ||
normalizeUrl('http://sindresorhus.com/redirect/'); | ||
//=> 'http://sindresorhus.com/redirect' | ||
normalizeUrl('http://sindresorhus.com/redirect/', {removeTrailingSlash: false}); | ||
//=> 'http://sindresorhus.com/redirect/' | ||
normalizeUrl('http://sindresorhus.com/redirect/', {removeTrailingSlash: false}); | ||
//=> 'http://sindresorhus.com/redirect/' | ||
normalizeUrl('http://sindresorhus.com/', {removeTrailingSlash: false}); | ||
//=> 'http://sindresorhus.com' | ||
``` | ||
*/ | ||
readonly removeTrailingSlash?: boolean; | ||
normalizeUrl('http://sindresorhus.com/', {removeTrailingSlash: false}); | ||
//=> 'http://sindresorhus.com' | ||
``` | ||
*/ | ||
readonly removeTrailingSlash?: boolean; | ||
/** | ||
Remove a sole `/` pathname in the output. This option is independant of `removeTrailingSlash`. | ||
/** | ||
Remove a sole `/` pathname in the output. This option is independant of `removeTrailingSlash`. | ||
@default true | ||
@default true | ||
@example | ||
``` | ||
normalizeUrl('https://sindresorhus.com/'); | ||
//=> 'https://sindresorhus.com' | ||
@example | ||
``` | ||
normalizeUrl('https://sindresorhus.com/'); | ||
//=> 'https://sindresorhus.com' | ||
normalizeUrl('https://sindresorhus.com/', {removeSingleSlash: false}); | ||
//=> 'https://sindresorhus.com/' | ||
``` | ||
*/ | ||
readonly removeSingleSlash?: boolean; | ||
normalizeUrl('https://sindresorhus.com/', {removeSingleSlash: false}); | ||
//=> 'https://sindresorhus.com/' | ||
``` | ||
*/ | ||
readonly removeSingleSlash?: boolean; | ||
/** | ||
Removes the default directory index file from path that matches any of the provided strings or regexes. | ||
When `true`, the regex `/^index\.[a-z]+$/` is used. | ||
/** | ||
Removes the default directory index file from path that matches any of the provided strings or regexes. | ||
When `true`, the regex `/^index\.[a-z]+$/` is used. | ||
@default false | ||
@default false | ||
@example | ||
``` | ||
normalizeUrl('www.sindresorhus.com/foo/default.php', { | ||
removeDirectoryIndex: [/^default\.[a-z]+$/] | ||
}); | ||
//=> 'http://sindresorhus.com/foo' | ||
``` | ||
*/ | ||
readonly removeDirectoryIndex?: ReadonlyArray<RegExp | string>; | ||
@example | ||
``` | ||
normalizeUrl('www.sindresorhus.com/foo/default.php', { | ||
removeDirectoryIndex: [/^default\.[a-z]+$/] | ||
}); | ||
//=> 'http://sindresorhus.com/foo' | ||
``` | ||
*/ | ||
readonly removeDirectoryIndex?: ReadonlyArray<RegExp | string>; | ||
/** | ||
Sorts the query parameters alphabetically by key. | ||
/** | ||
Sorts the query parameters alphabetically by key. | ||
@default true | ||
@default true | ||
@example | ||
``` | ||
normalizeUrl('www.sindresorhus.com?b=two&a=one&c=three', { | ||
sortQueryParameters: false | ||
}); | ||
//=> 'http://sindresorhus.com/?b=two&a=one&c=three' | ||
``` | ||
*/ | ||
readonly sortQueryParameters?: boolean; | ||
} | ||
@example | ||
``` | ||
normalizeUrl('www.sindresorhus.com?b=two&a=one&c=three', { | ||
sortQueryParameters: false | ||
}); | ||
//=> 'http://sindresorhus.com/?b=two&a=one&c=three' | ||
``` | ||
*/ | ||
readonly sortQueryParameters?: boolean; | ||
} | ||
@@ -256,3 +254,3 @@ | ||
``` | ||
import normalizeUrl = require('normalize-url'); | ||
import normalizeUrl from 'normalize-url'; | ||
@@ -266,4 +264,2 @@ normalizeUrl('sindresorhus.com'); | ||
*/ | ||
declare function normalizeUrl(url: string, options?: normalizeUrl.Options): string; | ||
export = normalizeUrl; | ||
export default function normalizeUrl(url: string, options?: Options): string; |
76
index.js
@@ -1,3 +0,1 @@ | ||
'use strict'; | ||
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs | ||
@@ -7,5 +5,3 @@ const DATA_URL_DEFAULT_MIME_TYPE = 'text/plain'; | ||
const testParameter = (name, filters) => { | ||
return filters.some(filter => filter instanceof RegExp ? filter.test(name) : filter === name); | ||
}; | ||
const testParameter = (name, filters) => filters.some(filter => filter instanceof RegExp ? filter.test(name) : filter === name); | ||
@@ -49,3 +45,3 @@ const normalizeDataURL = (urlString, {stripHash}) => { | ||
const normalizedMediaType = [ | ||
...attributes | ||
...attributes, | ||
]; | ||
@@ -57,3 +53,3 @@ | ||
if (normalizedMediaType.length !== 0 || (mimeType && mimeType !== DATA_URL_DEFAULT_MIME_TYPE)) { | ||
if (normalizedMediaType.length > 0 || (mimeType && mimeType !== DATA_URL_DEFAULT_MIME_TYPE)) { | ||
normalizedMediaType.unshift(mimeType); | ||
@@ -65,3 +61,3 @@ } | ||
const normalizeUrl = (urlString, options) => { | ||
export default function normalizeUrl(urlString, options) { | ||
options = { | ||
@@ -81,3 +77,3 @@ defaultProtocol: 'http:', | ||
sortQueryParameters: true, | ||
...options | ||
...options, | ||
}; | ||
@@ -104,3 +100,3 @@ | ||
const urlObj = new URL(urlString); | ||
const urlObject = new URL(urlString); | ||
@@ -111,8 +107,8 @@ if (options.forceHttp && options.forceHttps) { | ||
if (options.forceHttp && urlObj.protocol === 'https:') { | ||
urlObj.protocol = 'http:'; | ||
if (options.forceHttp && urlObject.protocol === 'https:') { | ||
urlObject.protocol = 'http:'; | ||
} | ||
if (options.forceHttps && urlObj.protocol === 'http:') { | ||
urlObj.protocol = 'https:'; | ||
if (options.forceHttps && urlObject.protocol === 'http:') { | ||
urlObject.protocol = 'https:'; | ||
} | ||
@@ -122,4 +118,4 @@ | ||
if (options.stripAuthentication) { | ||
urlObj.username = ''; | ||
urlObj.password = ''; | ||
urlObject.username = ''; | ||
urlObject.password = ''; | ||
} | ||
@@ -129,17 +125,17 @@ | ||
if (options.stripHash) { | ||
urlObj.hash = ''; | ||
urlObject.hash = ''; | ||
} else if (options.stripTextFragment) { | ||
urlObj.hash = urlObj.hash.replace(/#?:~:text.*?$/i, ''); | ||
urlObject.hash = urlObject.hash.replace(/#?:~:text.*?$/i, ''); | ||
} | ||
// Remove duplicate slashes if not preceded by a protocol | ||
if (urlObj.pathname) { | ||
urlObj.pathname = urlObj.pathname.replace(/(?<!\b(?:[a-z][a-z\d+\-.]{1,50}:))\/{2,}/g, '/'); | ||
if (urlObject.pathname) { | ||
urlObject.pathname = urlObject.pathname.replace(/(?<!\b[a-z][a-z\d+\-.]{1,50}:)\/{2,}/g, '/'); | ||
} | ||
// Decode URI octets | ||
if (urlObj.pathname) { | ||
if (urlObject.pathname) { | ||
try { | ||
urlObj.pathname = decodeURI(urlObj.pathname); | ||
} catch (_) {} | ||
urlObject.pathname = decodeURI(urlObject.pathname); | ||
} catch {} | ||
} | ||
@@ -153,17 +149,17 @@ | ||
if (Array.isArray(options.removeDirectoryIndex) && options.removeDirectoryIndex.length > 0) { | ||
let pathComponents = urlObj.pathname.split('/'); | ||
let pathComponents = urlObject.pathname.split('/'); | ||
const lastComponent = pathComponents[pathComponents.length - 1]; | ||
if (testParameter(lastComponent, options.removeDirectoryIndex)) { | ||
pathComponents = pathComponents.slice(0, pathComponents.length - 1); | ||
urlObj.pathname = pathComponents.slice(1).join('/') + '/'; | ||
pathComponents = pathComponents.slice(0, -1); | ||
urlObject.pathname = pathComponents.slice(1).join('/') + '/'; | ||
} | ||
} | ||
if (urlObj.hostname) { | ||
if (urlObject.hostname) { | ||
// Remove trailing dot | ||
urlObj.hostname = urlObj.hostname.replace(/\.$/, ''); | ||
urlObject.hostname = urlObject.hostname.replace(/\.$/, ''); | ||
// Remove `www.` | ||
if (options.stripWWW && /^www\.(?!www\.)(?:[a-z\-\d]{1,63})\.(?:[a-z.\-\d]{2,63})$/.test(urlObj.hostname)) { | ||
if (options.stripWWW && /^www\.(?!www\.)[a-z\-\d]{1,63}\.[a-z.\-\d]{2,63}$/.test(urlObject.hostname)) { | ||
// Each label should be max 63 at length (min: 1). | ||
@@ -173,3 +169,3 @@ // Source: https://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names | ||
// It is technically possible to have a single character TLD, but none currently exist. | ||
urlObj.hostname = urlObj.hostname.replace(/^www\./, ''); | ||
urlObject.hostname = urlObject.hostname.replace(/^www\./, ''); | ||
} | ||
@@ -180,5 +176,5 @@ } | ||
if (Array.isArray(options.removeQueryParameters)) { | ||
for (const key of [...urlObj.searchParams.keys()]) { | ||
for (const key of [...urlObject.searchParams.keys()]) { | ||
if (testParameter(key, options.removeQueryParameters)) { | ||
urlObj.searchParams.delete(key); | ||
urlObject.searchParams.delete(key); | ||
} | ||
@@ -189,3 +185,3 @@ } | ||
if (options.removeQueryParameters === true) { | ||
urlObj.search = ''; | ||
urlObject.search = ''; | ||
} | ||
@@ -195,7 +191,7 @@ | ||
if (options.sortQueryParameters) { | ||
urlObj.searchParams.sort(); | ||
urlObject.searchParams.sort(); | ||
} | ||
if (options.removeTrailingSlash) { | ||
urlObj.pathname = urlObj.pathname.replace(/\/$/, ''); | ||
urlObject.pathname = urlObject.pathname.replace(/\/$/, ''); | ||
} | ||
@@ -206,5 +202,5 @@ | ||
// Take advantage of many of the Node `url` normalizations | ||
urlString = urlObj.toString(); | ||
urlString = urlObject.toString(); | ||
if (!options.removeSingleSlash && urlObj.pathname === '/' && !oldUrlString.endsWith('/') && urlObj.hash === '') { | ||
if (!options.removeSingleSlash && urlObject.pathname === '/' && !oldUrlString.endsWith('/') && urlObject.hash === '') { | ||
urlString = urlString.replace(/\/$/, ''); | ||
@@ -214,3 +210,3 @@ } | ||
// Remove ending `/` unless removeSingleSlash is false | ||
if ((options.removeTrailingSlash || urlObj.pathname === '/') && urlObj.hash === '' && options.removeSingleSlash) { | ||
if ((options.removeTrailingSlash || urlObject.pathname === '/') && urlObject.hash === '' && options.removeSingleSlash) { | ||
urlString = urlString.replace(/\/$/, ''); | ||
@@ -230,4 +226,2 @@ } | ||
return urlString; | ||
}; | ||
module.exports = normalizeUrl; | ||
} |
{ | ||
"name": "normalize-url", | ||
"version": "6.1.0", | ||
"version": "7.0.0", | ||
"description": "Normalize a URL", | ||
@@ -13,4 +13,6 @@ "license": "MIT", | ||
}, | ||
"type": "module", | ||
"exports": "./index.js", | ||
"engines": { | ||
"node": ">=10" | ||
"node": ">=12.20" | ||
}, | ||
@@ -40,6 +42,6 @@ "scripts": { | ||
"devDependencies": { | ||
"ava": "^2.4.0", | ||
"nyc": "^15.0.0", | ||
"tsd": "^0.11.0", | ||
"xo": "^0.25.3" | ||
"ava": "^3.15.0", | ||
"nyc": "^15.1.0", | ||
"tsd": "^0.17.0", | ||
"xo": "^0.41.0" | ||
}, | ||
@@ -46,0 +48,0 @@ "nyc": { |
@@ -18,3 +18,3 @@ # normalize-url [![Coverage Status](https://codecov.io/gh/sindresorhus/normalize-url/branch/main/graph/badge.svg)](https://codecov.io/gh/sindresorhus/normalize-url) | ||
```js | ||
const normalizeUrl = require('normalize-url'); | ||
import normalizeUrl from 'normalize-url'; | ||
@@ -21,0 +21,0 @@ normalizeUrl('sindresorhus.com'); |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Yes
21063
366