"use strict"; const url = require("url"); const ValidationError = require("@validatem/error"); const isString = require("@validatem/is-string"); module.exports = function (protocols) { if (protocols != null && !Array.isArray(protocols)) { throw new Error(`Permitted protocol list must be an array`); } let protocolSet = (protocols != null) ? new Set(protocols.map((protocol) => protocol.toLowerCase())) : null; return [ isString, function isURL(value) { let parsed = url.parse(value); let slashes = (parsed.slashes === true) ? "//" : ""; let parsedProtocol = (parsed.protocol != null) ? parsed.protocol + slashes : null; if (parsedProtocol == null) { return new ValidationError("Must be a valid URL", { code: "validatem.is-url.invalid-url" }); } else if (protocolSet != null && !protocolSet.has(parsedProtocol.toLowerCase())) { let validProtocolList = protocols .map((protocol) => protocol.toUpperCase()) .join(", "); return new ValidationError(`Must be a URL with one of the following protocols: ${validProtocolList} - but got ${parsedProtocol.toUpperCase()} instead`, { code: "validatem.is-url.wrong-protocol" }); } else { return parsed; } } ]; };