Skip to content

Commit

Permalink
feat: withHttp, withHttps, withoutProtocol, withProtocol (#48)
Browse files Browse the repository at this point in the history
  • Loading branch information
divine committed Mar 16, 2022
1 parent f83abe0 commit f8ee0c0
Show file tree
Hide file tree
Showing 3 changed files with 130 additions and 1 deletion.
36 changes: 36 additions & 0 deletions README.md
Expand Up @@ -158,6 +158,42 @@ Check if a path starts with `./` or `../`.
isRelative('./foo')
```

### `withHttp`

Ensures url protocol is `http`

```ts
// Result: http://example.com
withHttp('https://example.com')
```

### `withHttps`

Ensures url protocol is `https`

```ts
// Result: https://example.com
withHttps('http://example.com')
```

### `withProtocol`

Changes url protocol passed as second argument

```ts
// Result: ftp://example.com
withProtocol('http://example.com', 'ftp://')
```

### `withoutProtocol`

Removes url protocol

```ts
// Result: example.com
withoutProtocol('http://example.com')
```

## License

[MIT](./LICENSE)
Expand Down
16 changes: 16 additions & 0 deletions src/utils.ts
Expand Up @@ -109,6 +109,22 @@ export function joinURL (base: string, ...input: string[]): string {
return url
}

export function withHttp (input: string): string {
return withProtocol(input, 'http://')
}

export function withHttps (input: string): string {
return withProtocol(input, 'https://')
}

export function withoutProtocol (input: string): string {
return withProtocol(input, '')
}

export function withProtocol (input: string, protocol: string): string {
return input.replace(/^\w+:(\/\/)?/, protocol)
}

// $URL based utils

export function createURL (input: string): $URL {
Expand Down
79 changes: 78 additions & 1 deletion test/utilities.test.ts
@@ -1,5 +1,14 @@
import { describe, expect, test } from 'vitest'
import { hasProtocol, isRelative, parsePath, stringifyParsedURL } from '../src'
import {
hasProtocol,
isRelative,
parsePath,
stringifyParsedURL,
withHttp,
withHttps,
withoutProtocol,
withProtocol
} from '../src'

describe('hasProtocol', () => {
const tests = [
Expand Down Expand Up @@ -60,3 +69,71 @@ describe('stringifyParsedURL', () => {
})
}
})

describe('withHttp', () => {
const tests = [
{ input: 'https://example.com', out: 'http://example.com' },
{ input: 'ftp://example.com/test?foo', out: 'http://example.com/test?foo' },
{ input: 'https://foo.com/test?query=123#hash', out: 'http://foo.com/test?query=123#hash' },
{ input: 'file:///home/user', out: 'http:///home/user' }
]

for (const t of tests) {
test(t.input.toString(), () => {
expect(withHttp(t.input)).toBe(t.out)
})
}
})

describe('withHttps', () => {
const tests = [
{ input: 'http://example.com', out: 'https://example.com' },
{ input: 'ftp://example.com/test?foo', out: 'https://example.com/test?foo' },
{ input: 'http://foo.com/test?query=123#hash', out: 'https://foo.com/test?query=123#hash' },
{ input: 'file:///home/user', out: 'https:///home/user' }
]

for (const t of tests) {
test(t.input.toString(), () => {
expect(withHttps(t.input)).toBe(t.out)
})
}
})

describe('withProtocol', () => {
const tests = [
{ input: 'http://example.com', protocol: 'https://', out: 'https://example.com' },
{ input: 'https://example.com', protocol: 'http://', out: 'http://example.com' },
{ input: 'ftp://example.com/test?foo', protocol: 'http://', out: 'http://example.com/test?foo' },
{ input: 'http://foo.com/test?query=123#hash', protocol: 'ftp://', out: 'ftp://foo.com/test?query=123#hash' },
{ input: 'file:///home/user', protocol: 'https://', out: 'https:///home/user' },
{ input: 'tel:1234567890', protocol: 'skype:', out: 'skype:1234567890' },
{ input: 'tel://+1234567890', protocol: 'callto://', out: 'callto://+1234567890' }
]

for (const t of tests) {
test(t.input.toString(), () => {
expect(withProtocol(t.input, t.protocol)).toBe(t.out)
})
}
})

describe('withoutProtocol', () => {
const tests = [
{ input: 'http://example.com', out: 'example.com' },
{ input: 'https://example.com', out: 'example.com' },
{ input: 'ftp://example.com/test?foo', out: 'example.com/test?foo' },
{ input: 'http://foo.com/test?query=123#hash', out: 'foo.com/test?query=123#hash' },
{ input: 'file:///home/user', out: '/home/user' },
{ input: 'tel:1234567890', out: '1234567890' },
{ input: 'mailto:support@example.com', out: 'support@example.com' },
{ input: 'skype:1234567890', out: '1234567890' },
{ input: 'callto://+1234567890', out: '+1234567890' }
]

for (const t of tests) {
test(t.input.toString(), () => {
expect(withoutProtocol(t.input)).toBe(t.out)
})
}
})

0 comments on commit f8ee0c0

Please sign in to comment.