123 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "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);
 | |
|   }
 | |
| };
 |