Skip to content

Commit

Permalink
Add TypeScript definition (#88)
Browse files Browse the repository at this point in the history
  • Loading branch information
BendingBender authored and sindresorhus committed Feb 28, 2019
1 parent b4201b4 commit 35ce2d4
Show file tree
Hide file tree
Showing 4 changed files with 218 additions and 5 deletions.
183 changes: 183 additions & 0 deletions index.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
export interface Options {
/**
* @default 'http:'
*/
readonly defaultProtocol?: string;

/**
* Prepends `defaultProtocol` to the URL if it's protocol-relative.
*
* @default true
*
* @example
*
* normalizeUrl('//sindresorhus.com:80/');
* //=> 'http://sindresorhus.com'
*
* normalizeUrl('//sindresorhus.com:80/', {normalizeProtocol: false});
* //=> '//sindresorhus.com'
*/
readonly normalizeProtocol?: boolean;

/**
* Normalizes `https:` URLs to `http:`.
*
* @default false
*
* @example
*
* normalizeUrl('https://sindresorhus.com:80/');
* //=> 'https://sindresorhus.com'
*
* normalizeUrl('https://sindresorhus.com:80/', {forceHttp: true});
* //=> 'http://sindresorhus.com'
*/
readonly forceHttp?: boolean;

/**
* Normalizes `http:` URLs to `https:`.
*
* This option can't be used with the `forceHttp` option at the same time.
*
* @default false
*
* @example
*
* normalizeUrl('https://sindresorhus.com:80/');
* //=> 'https://sindresorhus.com'
*
* 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.
*
* @default true
*
* @example
*
* normalizeUrl('user:password@sindresorhus.com');
* //=> 'https://sindresorhus.com'
*
* normalizeUrl('user:password@sindresorhus.com', {stripAuthentication: false});
* //=> 'https://user:password@sindresorhus.com'
*/
readonly stripAuthentication?: boolean;

/**
* Removes hash from the URL.
*
* @default false
*
* @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;

/**
* Removes HTTP(S) protocol from an URL `http://sindresorhus.com` → `sindresorhus.com`.
*
* @default false
*
* @example
*
* normalizeUrl('https://sindresorhus.com');
* //=> 'https://sindresorhus.com'
*
* normalizeUrl('sindresorhus.com', {stripProtocol: true});
* //=> 'sindresorhus.com'
*/
readonly stripProtocol?: boolean;

/**
* Removes `www.` from the URL.
*
* @default true
*
* @example
*
* normalizeUrl('http://www.sindresorhus.com');
* //=> 'http://sindresorhus.com'
*
* 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.
*
* @default [/^utm_\w+/i]
*
* @example
*
* normalizeUrl('www.sindresorhus.com?foo=bar&ref=test_ref', {
* removeQueryParameters: ['ref']
* });
* //=> 'http://sindresorhus.com/?foo=bar'
*/
readonly removeQueryParameters?: (RegExp | string)[];

/**
* Removes trailing slash.
*
* **Note**: Trailing slash is always removed if the URL doesn't have a pathname.
*
* @default true
*
* @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/', {removeTrailingSlash: false});
* //=> 'http://sindresorhus.com'
*/
readonly removeTrailingSlash?: 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.
*
* @default false
*
* @example
*
* normalizeUrl('www.sindresorhus.com/foo/default.php', {
* removeDirectoryIndex: [/^default\.[a-z]+$/]
* });
* //=> 'http://sindresorhus.com/foo'
*/
readonly removeDirectoryIndex?: (RegExp | string)[];

/**
* Sorts the query parameters alphabetically by key.
*
* @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;
}

/**
* [Normalize](https://en.wikipedia.org/wiki/URL_normalization) a URL.
*
* @param url - URL to normalize.
*/
export default function normalizeUrl(url: string, options?: Options): string;
6 changes: 5 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ const testParameter = (name, filters) => {
return filters.some(filter => filter instanceof RegExp ? filter.test(name) : filter === name);
};

module.exports = (urlString, options) => {
const normalizeUrl = (urlString, options) => {
options = {
defaultProtocol: 'http:',
normalizeProtocol: true,
Expand Down Expand Up @@ -78,6 +78,7 @@ module.exports = (urlString, options) => {
if (/^(?!\/)/g.test(p1)) {
return `${p1}/`;
}

return '/';
});
}
Expand Down Expand Up @@ -153,3 +154,6 @@ module.exports = (urlString, options) => {

return urlString;
};

module.exports = normalizeUrl;
module.exports.default = normalizeUrl;
24 changes: 24 additions & 0 deletions index.test-d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import {expectType} from 'tsd-check';
import normalizeUrl from '.';

expectType<string>(normalizeUrl('sindresorhus.com'));
expectType<string>(normalizeUrl('HTTP://xn--xample-hva.com:80/?b=bar&a=foo'));

normalizeUrl('//sindresorhus.com:80/', {defaultProtocol: 'https:'});
normalizeUrl('//sindresorhus.com:80/', {normalizeProtocol: false});
normalizeUrl('https://sindresorhus.com:80/', {forceHttp: true});
normalizeUrl('http://sindresorhus.com:80/', {forceHttps: true});
normalizeUrl('user:password@sindresorhus.com', {stripAuthentication: false});
normalizeUrl('sindresorhus.com/about.html#contact', {stripHash: true});
normalizeUrl('https://sindresorhus.com', {stripProtocol: true});
normalizeUrl('http://www.sindresorhus.com', {stripWWW: false});
normalizeUrl('www.sindresorhus.com?foo=bar&ref=test_ref', {
removeQueryParameters: ['ref', /test/]
});
normalizeUrl('http://sindresorhus.com/', {removeTrailingSlash: false});
normalizeUrl('www.sindresorhus.com/foo/default.php', {
removeDirectoryIndex: [/^default\.[a-z]+$/, 'foo']
});
normalizeUrl('www.sindresorhus.com?b=two&a=one&c=three', {
sortQueryParameters: false
});
10 changes: 6 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,11 @@
"node": ">=8"
},
"scripts": {
"test": "xo && nyc ava"
"test": "xo && nyc ava && tsd-check"
},
"files": [
"index.js"
"index.js",
"index.d.ts"
],
"keywords": [
"normalize",
Expand All @@ -34,9 +35,10 @@
"canonical"
],
"devDependencies": {
"ava": "^0.25.0",
"ava": "^1.2.1",
"coveralls": "^3.0.0",
"nyc": "^13.1.0",
"xo": "^0.23.0"
"tsd-check": "^0.3.0",
"xo": "^0.24.0"
}
}

0 comments on commit 35ce2d4

Please sign in to comment.