data_normalize-url.js

/**
 * @module normalizeUrl
 * @description Normalizes a URL by ensuring it starts with 'http://' or 'https://'.
 * It handles various cases including empty strings, existing protocols, and protocol-relative URLs.
 *
 * @since 4.0.4
 *
 * @param {string} url The URL to be normalized. This can be a string representing a URL, an empty string, or a falsy value.
 *
 * @return {string} Returns the normalized URL.
 *                  - If the input is falsy or an empty string (after trimming), returns an empty string.
 *                  - If the input is a valid URL (starts with http:// or https://), returns it as is (after trimming).
 *                  - If the input is a protocol-relative URL (starts with //), prepends 'https://' (after trimming).
 *                  - Otherwise, prepends 'https://' to the input (after trimming).
 *
 * @example
 * import { normalizeUrl } from "@gravityforms/utils";
 *
 * normalizeUrl( 'example.com' ); // 'https://example.com'
 * normalizeUrl( ' http://example.com ' ); // 'http://example.com'
 * normalizeUrl( 'https://example.com' ); // 'https://example.com'
 * normalizeUrl( '//example.com' ); // 'https://example.com'
 * normalizeUrl( ' example.com/path?query=value ' ); // 'https://example.com/path?query=value'
 * normalizeUrl( null ); // ''
 * normalizeUrl( undefined ); // ''
 * normalizeUrl( '' ); // ''
 * normalizeUrl( '   ' ); // ''
 *
 */
export default function normalizeUrl( url ) {
	if ( ! url ) {
		return '';
	}

	const trimmedUrl = url.trim();

	if ( trimmedUrl === '' ) {
		return '';
	}

	if ( /^https?:\/\//i.test( trimmedUrl ) ) {
		return trimmedUrl;
	}

	if ( trimmedUrl.startsWith( '//' ) ) {
		return `https:${ trimmedUrl }`;
	}

	return `https://${ trimmedUrl }`;
}