char/avril
(wip) why'd you have to go and make things so complicaaaaated?
git clone https://git.t4t.associates/char/avril
bf382b3
main
1import { registerUncloneable } from "ext:web/serialization.js" ; 2import { 3ObjectSetPrototypeOf , 4StringPrototypeSlice , 5WeakMap , 6} from "ext:core/primordials" ; 7import { 8op_url_search_parse , 9op_url_search_serialize , 10op_url_set , 11} from "ext:core/ops" ; 12import type { SearchPair , URLParts } from "ext:core/ops" ; 13import type { URLSearchParams } from "./search_params.js" ; 14 15interface URLState { 16parts :URLParts ; 17searchParams :URLSearchParams ; 18} 19interface ParamsState { 20list :SearchPair []; 21url :URLState | null ; 22} 23 24const urls = new WeakMap < object , URLState >(); 25const params = new WeakMap < object , ParamsState >(); 26registerUncloneable ( urls ); 27registerUncloneable ( params ); 28 29function privateArray < T = unknown > () :T []; 30function privateArray < T extends unknown [] > ( value :T ) :T ; 31function privateArray ( value :unknown [] = []) :unknown [] { 32// Private storage must not invoke inherited numeric setters or Array species hooks. 33ObjectSetPrototypeOf ( value , null ); 34return value ; 35} 36function queryList ( parts :URLParts ) :SearchPair [] { 37const list = privateArray ( 38op_url_search_parse ( StringPrototypeSlice ( parts [ 9 ], 1 )), 39); 40for ( let index = 0 ; index < list . length ; index ++ ) privateArray ( list [ index ]); 41return list ; 42} 43function update ( value :ParamsState ) :void { 44if ( value . url ) { 45value . url . parts = op_url_set ([ 46value . url . parts [ 0 ], 47"search" , 48op_url_search_serialize ( value . list ), 49]); 50} 51} 52 53export { params , privateArray , queryList , update , urls }; 54export type { ParamsState };