From 02a3cc984bd310dab11b9c9b286944ce458adc6b Mon Sep 17 00:00:00 2001 From: Mike Date: Fri, 14 Feb 2020 09:07:29 -0500 Subject: [PATCH] fix: prototypal inheritance --- src/parameters.js | 91 +++++++++++++++++++++++++---------------------- 1 file changed, 49 insertions(+), 42 deletions(-) diff --git a/src/parameters.js b/src/parameters.js index 2830874..ab692e8 100644 --- a/src/parameters.js +++ b/src/parameters.js @@ -1,3 +1,4 @@ +/* eslint-disable func-names */ import flat from 'flat'; import { isEmpty, @@ -6,51 +7,57 @@ import { asInverted, } from './utils'; -export default class extends URLSearchParams { - populate(a = {}) { - return Object.entries(a).reduce( - (acc, [key, value]) => - Object.assign(acc, { - [key]: Array.isArray(value) - ? this.getAll(`${key}[]`) - : this.get(key) || value, - }), - {}, - ); +/** + * @NOTE + * Class inheritance was not working in production envs + * Prototypes seem to register more consistently. + */ + +URLSearchParams.prototype.populate = function(a = {}) { + return Object.entries(a).reduce( + (acc, [key, value]) => + Object.assign(acc, { + [key]: Array.isArray(value) + ? this.getAll(`${key}[]`) + : this.get(key) || value, + }), + {}, + ); +}; + +URLSearchParams.prototype.serializeAndAssign = function( + key, + v, +) { + const arr = serializeArray(v); + if (arr.length) { + this.set(asInverted(key, arr), asEmpty(arr)); + } else { + this.delete(key); } +}; - serializeAndAssign(key, v) { - const arr = serializeArray(v); - if (arr.length) { - this.set(asInverted(key, arr), asEmpty(arr)); - } else { +URLSearchParams.prototype.merge = function(a) { + Object.entries(a).forEach(([key, v]) => { + if (isEmpty(v)) { this.delete(key); + } else if (Array.isArray(v)) { + this.serializeAndAssign(key, v); + } else if (typeof v === 'object') { + Object.entries(flat(v, { safe: true })).forEach( + ([name, value]) => { + this.serializeAndAssign(`${key}.${name}`, value); + }, + ); + } else { + this.set(asInverted(key, v), asEmpty(v)); } - } + }); +}; - merge(a) { - Object.entries(a).forEach(([key, v]) => { - if (isEmpty(v)) { - this.delete(key); - } else if (Array.isArray(v)) { - this.serializeAndAssign(key, v); - } else if (typeof v === 'object') { - Object.entries(flat(v, { safe: true })).forEach( - ([name, value]) => { - this.serializeAndAssign( - `${key}.${name}`, - value, - ); - }, - ); - } else { - this.set(asInverted(key, v), asEmpty(v)); - } - }); - } +URLSearchParams.prototype.redirectStr = function() { + const str = this.toString(); + return str ? `?${str}` : '?'; +}; - redirectStr() { - const str = this.toString(); - return str ? `?${str}` : '?'; - } -} +export default URLSearchParams;