Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 18 additions & 2 deletions src/lib/sveltekit-search-params.svelte.ts
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,10 @@ function create_recursive_proxy<
navigator?: ReturnType<typeof create_root_navigator>,
) {
return new Proxy<LooseAutocomplete<Options<T>>>(
target as LooseAutocomplete<Options<T>>,
target as LooseAutocomplete<Options<T>> & {
toJSON: () => Options<T>,
$parsed: () => Options<T>
},
{
get(target, name) {
// we use the RAW symbol to get the original target (this is currently not used but better have it)
Expand Down Expand Up @@ -236,6 +239,16 @@ function create_recursive_proxy<
return values;
};
}
// special case for JSON.stringify
if (name === '$parsed') {
return () => {
// snapshot the cache
const values = $state.snapshot(cache);
// on the server that's enough
if (!browser) return values;
return values;
};
}

const value =
cache[name as never] ??
Expand Down Expand Up @@ -326,7 +339,10 @@ export function queryParameters<
>(
options?: T,
navigation_options: NavigationOptions = {},
): LooseAutocomplete<Options<T>> {
): LooseAutocomplete<Options<T>> & {
toJSON: () => Options<T>;
$parsed: () => Options<T>
} {
const { showDefaults: show_defaults = true } = navigation_options;
// keeps all the deriveds for every single property
const cache: Partial<T> = {};
Expand Down
2 changes: 2 additions & 0 deletions src/routes/+page.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import BrowserWindow from "./BrowserWindow.svelte";
import "../assets/fonts.css";
import { typewriter } from "svelte-typewriter-store";
import Demo from "./Demo.svelte";
const store = typewriter(["pablopang", "rich_harris", "albert_einstein"], 30);
</script>

Expand Down Expand Up @@ -35,6 +36,7 @@
<code class="npm">npm i sveltekit-search-params -D</code>
</div>
<div class="wrapper">
<Demo />
<BrowserWindow title="" url={`https://my.app?username=${$store}`}>
<div class="content">
<input readonly value={$store} /> <br />
Expand Down
18 changes: 18 additions & 0 deletions src/routes/Demo.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<script>
import { queryParameters, ssp } from "$lib";

const params = queryParameters({
q: ssp.string(),
page: ssp.number(1)
})

let parsed = $derived(params.$parsed());
</script>

Defined: {JSON.stringify(parsed)}<br>
All: {JSON.stringify(params.toJSON())}
<br><br>
<input bind:value={params.q}/><br>
<button disabled={params.page < 2} onclick={() => params.page--}>Previous</button>
<button onclick={() => params.page++}>Next</button><br>
<br>