You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							122 lines
						
					
					
						
							2.6 KiB
						
					
					
				
			
		
		
	
	
							122 lines
						
					
					
						
							2.6 KiB
						
					
					
				"use strict"; | 
						|
const stableSortBy = require("lodash.sortby"); | 
						|
const urlencoded = require("./urlencoded"); | 
						|
 | 
						|
exports.implementation = class URLSearchParamsImpl { | 
						|
  constructor(constructorArgs, { doNotStripQMark = false }) { | 
						|
    let init = constructorArgs[0]; | 
						|
    this._list = []; | 
						|
    this._url = null; | 
						|
 | 
						|
    if (!doNotStripQMark && typeof init === "string" && init[0] === "?") { | 
						|
      init = init.slice(1); | 
						|
    } | 
						|
 | 
						|
    if (Array.isArray(init)) { | 
						|
      for (const pair of init) { | 
						|
        if (pair.length !== 2) { | 
						|
          throw new TypeError("Failed to construct 'URLSearchParams': parameter 1 sequence's element does not " + | 
						|
                              "contain exactly two elements."); | 
						|
        } | 
						|
        this._list.push([pair[0], pair[1]]); | 
						|
      } | 
						|
    } else if (typeof init === "object" && Object.getPrototypeOf(init) === null) { | 
						|
      for (const name of Object.keys(init)) { | 
						|
        const value = init[name]; | 
						|
        this._list.push([name, value]); | 
						|
      } | 
						|
    } else { | 
						|
      this._list = urlencoded.parseUrlencoded(init); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  _updateSteps() { | 
						|
    if (this._url !== null) { | 
						|
      let query = urlencoded.serializeUrlencoded(this._list); | 
						|
      if (query === "") { | 
						|
        query = null; | 
						|
      } | 
						|
      this._url._url.query = query; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  append(name, value) { | 
						|
    this._list.push([name, value]); | 
						|
    this._updateSteps(); | 
						|
  } | 
						|
 | 
						|
  delete(name) { | 
						|
    let i = 0; | 
						|
    while (i < this._list.length) { | 
						|
      if (this._list[i][0] === name) { | 
						|
        this._list.splice(i, 1); | 
						|
      } else { | 
						|
        i++; | 
						|
      } | 
						|
    } | 
						|
    this._updateSteps(); | 
						|
  } | 
						|
 | 
						|
  get(name) { | 
						|
    for (const tuple of this._list) { | 
						|
      if (tuple[0] === name) { | 
						|
        return tuple[1]; | 
						|
      } | 
						|
    } | 
						|
    return null; | 
						|
  } | 
						|
 | 
						|
  getAll(name) { | 
						|
    const output = []; | 
						|
    for (const tuple of this._list) { | 
						|
      if (tuple[0] === name) { | 
						|
        output.push(tuple[1]); | 
						|
      } | 
						|
    } | 
						|
    return output; | 
						|
  } | 
						|
 | 
						|
  has(name) { | 
						|
    for (const tuple of this._list) { | 
						|
      if (tuple[0] === name) { | 
						|
        return true; | 
						|
      } | 
						|
    } | 
						|
    return false; | 
						|
  } | 
						|
 | 
						|
  set(name, value) { | 
						|
    let found = false; | 
						|
    let i = 0; | 
						|
    while (i < this._list.length) { | 
						|
      if (this._list[i][0] === name) { | 
						|
        if (found) { | 
						|
          this._list.splice(i, 1); | 
						|
        } else { | 
						|
          found = true; | 
						|
          this._list[i][1] = value; | 
						|
          i++; | 
						|
        } | 
						|
      } else { | 
						|
        i++; | 
						|
      } | 
						|
    } | 
						|
    if (!found) { | 
						|
      this._list.push([name, value]); | 
						|
    } | 
						|
    this._updateSteps(); | 
						|
  } | 
						|
 | 
						|
  sort() { | 
						|
    this._list = stableSortBy(this._list, [0]); | 
						|
    this._updateSteps(); | 
						|
  } | 
						|
 | 
						|
  [Symbol.iterator]() { | 
						|
    return this._list[Symbol.iterator](); | 
						|
  } | 
						|
 | 
						|
  toString() { | 
						|
    return urlencoded.serializeUrlencoded(this._list); | 
						|
  } | 
						|
};
 | 
						|
 |