site-panzai/node_modules/encodeurl/index.js
2026-11-13 13:57:04 +01:00

58 lines
1.6 KiB
JavaScript

/*!
* encodeurl
* Copyright(c) 2016 Douglas Christopher Wilson
* MIT Licensed
*/
'use strict'
/**
* Module exports.
* @public
*/
module.exports = encodeUrl
/**
* RegExp to match non-URL code points, *after* encoding (i.e. not including "%")
* and including invalid escape sequences.
* Group up to 1024 character and percent runs per replacement to reduce calls
* to encodeURI while bounding RegExp stack use. Character runs stay intact so
* surrogate pairs are never split between replacements.
* @private
*/
var ENCODE_CHARS_REGEXP = /(?:[^\x21\x23-\x3B\x3D\x3F-\x5F\x61-\x7A\x7C\x7E]+|%+(?![0-9A-Fa-f]{2})){1,1024}/g
/**
* RegExp to match surrogate pairs and unpaired surrogates.
* @private
*/
var SURROGATE_REGEXP = /([\uD800-\uDBFF][\uDC00-\uDFFF])|[\uD800-\uDFFF]/g
/**
* Encode a URL to a percent-encoded form, excluding already-encoded sequences.
*
* This function will take an already-encoded URL and encode all the non-URL
* code points. This function will not encode the "%" character unless it is
* not part of a valid sequence (`%20` will be left as-is, but `%foo` will
* be encoded as `%25foo`).
*
* This encode is meant to be "safe" and does not throw errors. It will try as
* hard as it can to properly encode the given URL, including replacing any raw,
* unpaired surrogate pairs with the Unicode replacement character prior to
* encoding.
*
* @param {string} url
* @return {string}
* @public
*/
function encodeUrl (url) {
return String(url)
.replace(SURROGATE_REGEXP, function (_, pair) {
return pair || '\uFFFD'
})
.replace(ENCODE_CHARS_REGEXP, encodeURI)
}