🍪 Universal accessible hard-baked cookies for SvelteKit
From a single schema, type-defined cookies can be accessed in any environment.
npm i svelte-baked-cookie
bakery
function to define the cookie type and get bake
and rebake
.
See ts-serde for more information on type guard// bakery.js
import { bakery } from 'svelte-baked-cookie'
import { json, number, string } from 'svelte-baked-cookie/serde'
export const { bake, rebake } = bakery(
{
key1: string,
key2: number,
key3: json(
(x): x is string[] =>
Array.isArray(x) && x.every((y) => typeof y === 'string'),
[]
)
}
// {
// CookieSetOptions: (optional)
// }
)
cookies
object obtained from load
, etc. to the bake
function.// +layout.server.js
import { bake } from './bakery.js'
export const load = ({ cookies }) => {
const { bakedCookies } = bake(cookies)
// string
const str = bakedCookies.key1
// number
const num = bakedCookies.key2
// string[]
bakedCookies.key3 = ['value', 'set', 'by', 'server']
return {
// ...
}
}
rebake
function can be used directly to obtain a writable
svelte-store of typed cookies.<!-- +page.svelte -->
<script>
import { rebake } from './bakery.js'
const cookies = rebake()
// key1: string
// key2: number
// key3: string[]
// string
console.log(cookies.key1)
// string
cookies.key2 = 123
// string[]
cookies.key3 = ['value', 'set', 'by', 'client']
</script>
pie
from +layout.server.js, etc. and make it the dough
of rebake
.// +layout.server.ts
import { bake } from './bakery.js'
export const load = ({ cookies }) => {
const { bakedCookies, pie } = bake(cookies)
// ...
return {
pie
}
}
<!-- +layout.svelte -->
<script>
import { rebake } from './bakery.js'
let { data } = $props()
let pie = $derived(data.pie)
// key1: string
// key2: number
// key3: string[]
let cookies = $derived(rebake(pie))
</script>
This is optional, but it provides full consistency and typed cookie access to the application.