Skip to content

API Reference

Factory function that creates a reactive query string utility.

import { createQsUtils } from "@vp-tw/nanostores-qs";
const qsUtils = createQsUtils(options?);
Option Type Description
qs { parse, stringify } Custom query string library (default: URLSearchParams)
isEqual (a, b) => boolean Custom equality check (default: es-toolkit isEqual)
Property Type Description
$search ReadableAtom<string> Current window.location.search string
$urlSearchParams ReadableAtom<URLSearchParams> Parsed URLSearchParams from $search
$qs ReadableAtom<Record<string, unknown>> Parsed query object
createSearchParamStore (name, config?) => Store Create a single-parameter store
createSearchParamsStore (configs) => Store Create a multi-parameter store
destroy () => void Remove event listeners and unpatch history

Create a reactive store for a single URL query parameter.

import * as presets from "@vp-tw/nanostores-qs/presets";
const store = qsUtils.createSearchParamStore("page", presets.integer({ default: 1, min: 0 }));
Parameter Type Description
name string Query parameter name
config Config Preset config or plain config object
Property / Method Type Description
$value ReadableAtom<T> Current decoded value
$resolved ReadableAtom<R> Resolved value (same as $value if no resolve set)
update(value, options?) void Update URL with new value
update.dry(value) string Compute next search string without side effects

Create a reactive store for multiple URL query parameters.

const store = qsUtils.createSearchParamsStore({
page: presets.integer({ default: 1, min: 0 }),
sort: presets.enum(["newest", "oldest"]),
});

An object mapping parameter names to preset configs.

Property / Method Type Description
$values ReadableAtom<Record<string, T>> All current decoded values
$resolved ReadableAtom<Record<string, R>> Resolved values (same as $values if no resolve set)
update(key, value, options?) void Update a single parameter
update.dry(key, value) string Dry-run for single parameter
updateAll(values, options?) void Update all parameters atomically
updateAll.dry(values) string Dry-run for all parameters

All update and updateAll calls accept an options object:

Option Type Default Description
replace boolean false Use replaceState instead of pushState
keepHash boolean false Preserve current URL hash
state unknown — Custom state for History API
force boolean false Bypass equality check

  • When window is unavailable (SSR), the internal search defaults to an empty string; listeners are not attached.
  • The utility listens to popstate and patches pushState/replaceState to stay reactive.