preserve-qs
Version:
Preserve querystrings during redirect and creating new URLs for Node.js and browser environments (supports Lad, Koa, Express, and Connect)
48 lines (37 loc) • 6.99 kB
JavaScript
;
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var URL = require('url-parse');
var preserveQs = function preserveQs(ctx, str) {
var override = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var blacklist = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
if (Array.isArray(override)) {
blacklist = override;
override = {};
}
var originalUrl = void 0;
// support Node.js (Koa/Express) and browser environments
if (typeof ctx === 'string') originalUrl = ctx;else if ((typeof ctx === 'undefined' ? 'undefined' : _typeof(ctx)) === 'object') {
if (_typeof(ctx.request) === 'object' && typeof ctx.request.originalUrl === 'string') {
;
originalUrl = ctx.request.originalUrl;
} else if (typeof ctx.originalUrl === 'string') {
;
originalUrl = ctx.originalUrl;
} else if (_typeof(ctx.location) === 'object' && typeof ctx.location.pathname === 'string' && typeof ctx.location.search === 'string') originalUrl = ctx.location.pathname + ctx.location.search;
}
// throw an error if we didn't have a valid original URL passed
if (!originalUrl || typeof originalUrl !== 'string') throw new Error('URL could not be parsed');
// throw an error if we didn't have a valid string passed
if (!str || typeof str !== 'string') throw new Error('New path must be a string');
originalUrl = new URL(originalUrl);
var url = new URL(str);
var path = url.origin === 'null' ? url.pathname : '' + url.origin + url.pathname;
var query = Object.assign({}, URL.qs.parse(originalUrl.query), URL.qs.parse(url.query), override);
if (Array.isArray(blacklist) && blacklist.length > 0) blacklist.forEach(function (prop) {
delete query[prop];
});
var qs = URL.qs.stringify(query, true);
return path + qs;
};
module.exports = preserveQs;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJVUkwiLCJyZXF1aXJlIiwicHJlc2VydmVRcyIsImN0eCIsInN0ciIsIm92ZXJyaWRlIiwiYmxhY2tsaXN0IiwiQXJyYXkiLCJpc0FycmF5Iiwib3JpZ2luYWxVcmwiLCJyZXF1ZXN0IiwibG9jYXRpb24iLCJwYXRobmFtZSIsInNlYXJjaCIsIkVycm9yIiwidXJsIiwicGF0aCIsIm9yaWdpbiIsInF1ZXJ5IiwiT2JqZWN0IiwiYXNzaWduIiwicXMiLCJwYXJzZSIsImxlbmd0aCIsImZvckVhY2giLCJwcm9wIiwic3RyaW5naWZ5IiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLElBQU1BLE1BQU1DLFFBQVEsV0FBUixDQUFaOztBQUVBLElBQU1DLGFBQWEsU0FBYkEsVUFBYSxDQUFDQyxHQUFELEVBQU1DLEdBQU4sRUFBNkM7QUFBQSxNQUFsQ0MsUUFBa0MsdUVBQXZCLEVBQXVCO0FBQUEsTUFBbkJDLFNBQW1CLHVFQUFQLEVBQU87O0FBQzlELE1BQUlDLE1BQU1DLE9BQU4sQ0FBY0gsUUFBZCxDQUFKLEVBQTZCO0FBQzNCQyxnQkFBWUQsUUFBWjtBQUNBQSxlQUFXLEVBQVg7QUFDRDs7QUFFRCxNQUFJSSxvQkFBSjs7QUFFQTtBQUNBLE1BQUksT0FBT04sR0FBUCxLQUFlLFFBQW5CLEVBQTZCTSxjQUFjTixHQUFkLENBQTdCLEtBQ0ssSUFBSSxRQUFPQSxHQUFQLHlDQUFPQSxHQUFQLE9BQWUsUUFBbkIsRUFBNkI7QUFDaEMsUUFDRSxRQUFPQSxJQUFJTyxPQUFYLE1BQXVCLFFBQXZCLElBQ0EsT0FBT1AsSUFBSU8sT0FBSixDQUFZRCxXQUFuQixLQUFtQyxRQUZyQztBQUlFO0FBQUdBLGlCQUpMLEdBSXFCTixJQUFJTyxPQUp6QixDQUlLRCxXQUpMO0FBQUEsV0FLSyxJQUFJLE9BQU9OLElBQUlNLFdBQVgsS0FBMkIsUUFBL0I7QUFBeUM7QUFBR0EsaUJBQTVDLEdBQTRETixHQUE1RCxDQUE0Q00sV0FBNUM7QUFBQSxXQUNBLElBQ0gsUUFBT04sSUFBSVEsUUFBWCxNQUF3QixRQUF4QixJQUNBLE9BQU9SLElBQUlRLFFBQUosQ0FBYUMsUUFBcEIsS0FBaUMsUUFEakMsSUFFQSxPQUFPVCxJQUFJUSxRQUFKLENBQWFFLE1BQXBCLEtBQStCLFFBSDVCLEVBS0hKLGNBQWNOLElBQUlRLFFBQUosQ0FBYUMsUUFBYixHQUF3QlQsSUFBSVEsUUFBSixDQUFhRSxNQUFuRDtBQUNIOztBQUVEO0FBQ0EsTUFBSSxDQUFDSixXQUFELElBQWdCLE9BQU9BLFdBQVAsS0FBdUIsUUFBM0MsRUFDRSxNQUFNLElBQUlLLEtBQUosQ0FBVSx5QkFBVixDQUFOOztBQUVGO0FBQ0EsTUFBSSxDQUFDVixHQUFELElBQVEsT0FBT0EsR0FBUCxLQUFlLFFBQTNCLEVBQ0UsTUFBTSxJQUFJVSxLQUFKLENBQVUsMkJBQVYsQ0FBTjs7QUFFRkwsZ0JBQWMsSUFBSVQsR0FBSixDQUFRUyxXQUFSLENBQWQ7O0FBRUEsTUFBTU0sTUFBTSxJQUFJZixHQUFKLENBQVFJLEdBQVIsQ0FBWjtBQUNBLE1BQU1ZLE9BQ0pELElBQUlFLE1BQUosS0FBZSxNQUFmLEdBQXdCRixJQUFJSCxRQUE1QixRQUEwQ0csSUFBSUUsTUFBOUMsR0FBdURGLElBQUlILFFBRDdEO0FBRUEsTUFBTU0sUUFBUUMsT0FBT0MsTUFBUCxDQUNaLEVBRFksRUFFWnBCLElBQUlxQixFQUFKLENBQU9DLEtBQVAsQ0FBYWIsWUFBWVMsS0FBekIsQ0FGWSxFQUdabEIsSUFBSXFCLEVBQUosQ0FBT0MsS0FBUCxDQUFhUCxJQUFJRyxLQUFqQixDQUhZLEVBSVpiLFFBSlksQ0FBZDtBQU1BLE1BQUlFLE1BQU1DLE9BQU4sQ0FBY0YsU0FBZCxLQUE0QkEsVUFBVWlCLE1BQVYsR0FBbUIsQ0FBbkQsRUFDRWpCLFVBQVVrQixPQUFWLENBQWtCLGdCQUFRO0FBQ3hCLFdBQU9OLE1BQU1PLElBQU4sQ0FBUDtBQUNELEdBRkQ7QUFHRixNQUFNSixLQUFLckIsSUFBSXFCLEVBQUosQ0FBT0ssU0FBUCxDQUFpQlIsS0FBakIsRUFBd0IsSUFBeEIsQ0FBWDtBQUNBLFNBQU9GLE9BQU9LLEVBQWQ7QUFDRCxDQWxERDs7QUFvREFNLE9BQU9DLE9BQVAsR0FBaUIxQixVQUFqQiIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IFVSTCA9IHJlcXVpcmUoJ3VybC1wYXJzZScpO1xuXG5jb25zdCBwcmVzZXJ2ZVFzID0gKGN0eCwgc3RyLCBvdmVycmlkZSA9IHt9LCBibGFja2xpc3QgPSBbXSkgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShvdmVycmlkZSkpIHtcbiAgICBibGFja2xpc3QgPSBvdmVycmlkZTtcbiAgICBvdmVycmlkZSA9IHt9O1xuICB9XG5cbiAgbGV0IG9yaWdpbmFsVXJsO1xuXG4gIC8vIHN1cHBvcnQgTm9kZS5qcyAoS29hL0V4cHJlc3MpIGFuZCBicm93c2VyIGVudmlyb25tZW50c1xuICBpZiAodHlwZW9mIGN0eCA9PT0gJ3N0cmluZycpIG9yaWdpbmFsVXJsID0gY3R4O1xuICBlbHNlIGlmICh0eXBlb2YgY3R4ID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBjdHgucmVxdWVzdCA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHR5cGVvZiBjdHgucmVxdWVzdC5vcmlnaW5hbFVybCA9PT0gJ3N0cmluZydcbiAgICApXG4gICAgICAoeyBvcmlnaW5hbFVybCB9ID0gY3R4LnJlcXVlc3QpO1xuICAgIGVsc2UgaWYgKHR5cGVvZiBjdHgub3JpZ2luYWxVcmwgPT09ICdzdHJpbmcnKSAoeyBvcmlnaW5hbFVybCB9ID0gY3R4KTtcbiAgICBlbHNlIGlmIChcbiAgICAgIHR5cGVvZiBjdHgubG9jYXRpb24gPT09ICdvYmplY3QnICYmXG4gICAgICB0eXBlb2YgY3R4LmxvY2F0aW9uLnBhdGhuYW1lID09PSAnc3RyaW5nJyAmJlxuICAgICAgdHlwZW9mIGN0eC5sb2NhdGlvbi5zZWFyY2ggPT09ICdzdHJpbmcnXG4gICAgKVxuICAgICAgb3JpZ2luYWxVcmwgPSBjdHgubG9jYXRpb24ucGF0aG5hbWUgKyBjdHgubG9jYXRpb24uc2VhcmNoO1xuICB9XG5cbiAgLy8gdGhyb3cgYW4gZXJyb3IgaWYgd2UgZGlkbid0IGhhdmUgYSB2YWxpZCBvcmlnaW5hbCBVUkwgcGFzc2VkXG4gIGlmICghb3JpZ2luYWxVcmwgfHwgdHlwZW9mIG9yaWdpbmFsVXJsICE9PSAnc3RyaW5nJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VSTCBjb3VsZCBub3QgYmUgcGFyc2VkJyk7XG5cbiAgLy8gdGhyb3cgYW4gZXJyb3IgaWYgd2UgZGlkbid0IGhhdmUgYSB2YWxpZCBzdHJpbmcgcGFzc2VkXG4gIGlmICghc3RyIHx8IHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKVxuICAgIHRocm93IG5ldyBFcnJvcignTmV3IHBhdGggbXVzdCBiZSBhIHN0cmluZycpO1xuXG4gIG9yaWdpbmFsVXJsID0gbmV3IFVSTChvcmlnaW5hbFVybCk7XG5cbiAgY29uc3QgdXJsID0gbmV3IFVSTChzdHIpO1xuICBjb25zdCBwYXRoID1cbiAgICB1cmwub3JpZ2luID09PSAnbnVsbCcgPyB1cmwucGF0aG5hbWUgOiBgJHt1cmwub3JpZ2lufSR7dXJsLnBhdGhuYW1lfWA7XG4gIGNvbnN0IHF1ZXJ5ID0gT2JqZWN0LmFzc2lnbihcbiAgICB7fSxcbiAgICBVUkwucXMucGFyc2Uob3JpZ2luYWxVcmwucXVlcnkpLFxuICAgIFVSTC5xcy5wYXJzZSh1cmwucXVlcnkpLFxuICAgIG92ZXJyaWRlXG4gICk7XG4gIGlmIChBcnJheS5pc0FycmF5KGJsYWNrbGlzdCkgJiYgYmxhY2tsaXN0Lmxlbmd0aCA+IDApXG4gICAgYmxhY2tsaXN0LmZvckVhY2gocHJvcCA9PiB7XG4gICAgICBkZWxldGUgcXVlcnlbcHJvcF07XG4gICAgfSk7XG4gIGNvbnN0IHFzID0gVVJMLnFzLnN0cmluZ2lmeShxdWVyeSwgdHJ1ZSk7XG4gIHJldHVybiBwYXRoICsgcXM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHByZXNlcnZlUXM7XG4iXX0=