diff --git a/readme.md b/readme.md index 1814497..d62dbf9 100644 --- a/readme.md +++ b/readme.md @@ -255,6 +255,12 @@ is.urlInstance(url); //=> true ``` +### .url(value) + +Returns `true` if `value` is a URL. + +Note: this only does basic checking using the [`URL` class](https://developer.mozilla.org/en-US/docs/Web/API/URL) constructor. + ##### .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..5294a77 100644 --- a/source/index.ts +++ b/source/index.ts @@ -189,6 +189,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 url = (value: unknown) => { + if (!string(value)) { + return false; + } + + try { + new URL(value); // tslint:disable-line no-unused-expression + return true; + } catch (_) { // tslint:disable-line no-unused + 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 98cb287..db56e3a 100644 --- a/source/tests/test.ts +++ b/source/tests/test.ts @@ -583,6 +583,15 @@ test('is.urlInstance', t => { t.false(is.urlInstance(null)); }); +test('is.url', t => { + const url = 'https://www.example.com'; + t.true(is.url(url)); + t.false(is.url(new URL(url))); + t.false(is.url({})); + t.false(is.url(undefined)); + t.false(is.url(null)); +}); + test('is.truthy', t => { t.true(is.truthy('unicorn')); t.true(is.truthy('🦄'));