import { registerUncloneable } from "ext:web/serialization.js"; import { ObjectSetPrototypeOf, StringPrototypeSlice, WeakMap, } from "ext:core/primordials"; import { op_url_search_parse, op_url_search_serialize, op_url_set, } from "ext:core/ops"; import type { SearchPair, URLParts } from "ext:core/ops"; import type { URLSearchParams } from "./search_params.js"; interface URLState { parts: URLParts; searchParams: URLSearchParams; } interface ParamsState { list: SearchPair[]; url: URLState | null; } const urls = new WeakMap(); const params = new WeakMap(); registerUncloneable(urls); registerUncloneable(params); function privateArray(): T[]; function privateArray(value: T): T; function privateArray(value: unknown[] = []): unknown[] { // Private storage must not invoke inherited numeric setters or Array species hooks. ObjectSetPrototypeOf(value, null); return value; } function queryList(parts: URLParts): SearchPair[] { const list = privateArray( op_url_search_parse(StringPrototypeSlice(parts[9], 1)), ); for (let index = 0; index < list.length; index++) privateArray(list[index]); return list; } function update(value: ParamsState): void { if (value.url) { value.url.parts = op_url_set([ value.url.parts[0], "search", op_url_search_serialize(value.list), ]); } } export { params, privateArray, queryList, update, urls }; export type { ParamsState };