diff --git a/readme.md b/readme.md index 1814497..97c023b 100644 --- a/readme.md +++ b/readme.md @@ -255,6 +255,22 @@ is.urlInstance(url); //=> true ``` +### .url(value) + +Returns `true` if `value` is a URL string. + +Note: this only does basic checking using the [`URL` class](https://developer.mozilla.org/en-US/docs/Web/API/URL) constructor. + +```js +const url = 'https://example.com'; + +is.url(url); +//=> true + +is.url(new URL(url)); +//=> false +``` + ##### .truthy(value) Returns `true` for all values that evaluate to true in a boolean context: diff --git a/source/index.ts b/source/index.ts index 37e775b..31fdc6d 100644 --- a/source/index.ts +++ b/source/index.ts @@ -3,6 +3,7 @@ /// /// import symbolObservable from 'symbol-observable'; +import {URL} from 'url'; type TypedArray = Int8Array | Uint8Array | Uint8ClampedArray | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array; type Primitive = null | undefined | string | number | boolean | Symbol; @@ -189,6 +190,19 @@ namespace is { // tslint:disable-line:no-namespace export const directInstanceOf = (instance: unknown, klass: Class): instance is T => Object.getPrototypeOf(instance) === klass.prototype; export const urlInstance = (value: unknown): value is URL => isObjectOfType(TypeName.URL)(value); + export const urlString = (value: unknown) => { + if (!string(value)) { + return false; + } + + try { + new URL(value); // tslint:disable-line no-unused-expression + return true; + } catch { + return false; + } + }; + export const truthy = (value: unknown) => Boolean(value); export const falsy = (value: unknown) => !value; diff --git a/source/tests/test.ts b/source/tests/test.ts index 3dd2f59..15bc9bf 100644 --- a/source/tests/test.ts +++ b/source/tests/test.ts @@ -576,13 +576,22 @@ test('is.directInstanceOf', t => { }); test('is.urlInstance', t => { - const url = new URL('https://www.example.com'); + const url = new URL('https://example.com'); t.true(is.urlInstance(url)); t.false(is.urlInstance({})); t.false(is.urlInstance(undefined)); t.false(is.urlInstance(null)); }); +test('is.urlString', t => { + const url = 'https://example.com'; + t.true(is.urlString(url)); + t.false(is.urlString(new URL(url))); + t.false(is.urlString({})); + t.false(is.urlString(undefined)); + t.false(is.urlString(null)); +}); + test('is.truthy', t => { t.true(is.truthy('unicorn')); t.true(is.truthy('🦄'));