API
@k8ordo/stateがexportする関数と型の一覧です。useAppStateだけはClient Componentの中で使うフックで、ほかの関数はサーバーでもクライアントでも呼べます。
このページの内容
definePageState
import元 @k8ordo/state
ページの状態を定義します。urlはURLのクエリに、entryは履歴エントリの隠れた状態に置きます。
definePageState<Url, Entry>(
key: string,
config: { url?: Url; entry?: Entry },
): PageState<Url, Entry>引数
keystring- 状態の名前。
entryの値を置く名前空間と、ストアの登録に使います。 config{ url?: StateSchema; entry?: StateSchema }urlとentryのスキーマ。少なくともどちらか1つを渡します。
戻り値
PageState<Url, Entry> — サーバーからもクライアントからもimportできる、純粋な定義。
フィールド
kind'page'- 定義の種類。
useAppStateは、これを見てストアを選びます。 keystring- 1つ目の引数に渡したキー。
urlUrl- 渡した
urlのスキーマ。@k8ordo/serverのsearchや、@k8ordo/formのformFieldsに渡します。 entryEntry- 渡した
entryのスキーマ。 parseUrl(input: UrlInput) => OutputOf<Url>urlを読みます。欠けたパラメータには既定値を入れ、スキーマに合わない値はフィールドごとに既定値に戻します。投げることはありません。href(path, values?) => string- リンクを作ります。指定しなかったフィールドは既定値として扱い、既定値と同じフィールドはクエリから省きます。Viteの
baseを前に付けます。 search(values?) => string- クエリ文字列だけを、
?を付けずに返します。
注意
- どのフィールドも
.default()か.optional()を持たなければなりません。無いと、モジュールの読み込みで投げます。 urlの真偽値はz.stringbool()で、配列は.default([])で書きます。ほかの綴りは、読み込みで拒まれます。- 同じフィールドを
urlとentryの両方に書くと、型エラーになり、実行時にも投げます。どちらも渡さないときも投げます。 - 戻り値の型は
PageStateとしてexportしています。
state.tsexport const listState = definePageState('product-list', {
url: z.object({
page: z.coerce.number().int().min(1).default(1),
}),
entry: z.object({
expanded: z.array(z.string()).default([]),
}),
});urlReader
import元 @k8ordo/state
urlのスキーマだけから、parseUrlと同じ読み方をする関数を作ります。定義ではなく、スキーマだけを渡されたコードのためのものです。
urlReader<Url extends StateSchema>(
schema: Url,
): (input: UrlInput) => output<Url>引数
schemaStateSchemaurlのスキーマ。
戻り値
(input: UrlInput) => output<Url> — クエリを読む関数。読み方を組み立てるのは、urlReaderを呼んだときの1回だけです。
注意
@k8ordo/serverは、searchをexportしたページのクエリをこれで読んでいます。
defineLocalState
import元 @k8ordo/state
localStorageに置く状態を定義します。消すまで残り、同じ端末のすべてのタブで共有されます。
defineLocalState<Schema>(
key: string,
schema: Schema,
versioning?: Versioning<Schema>,
): LocalState<Schema>引数
keystring- 状態の名前。localStorageのキーは
k8ordo-state:<key>になります。 schemaStateSchema- 保存する値のスキーマ。どのフィールドも
.default()か.optional()を持たなければなりません。 versioningVersioning- 保存した形を変えたときの
versionとmigrate。省くと、行は値のオブジェクトそのものになります。
戻り値
LocalState<Schema> — localStorageの状態の定義。
フィールド
kind'local'- 定義の種類。
useAppStateは、これを見てストアを選びます。 keystring- 1つ目の引数に渡したキー。
schemaSchema- 渡したスキーマ。
storageKeystring- 値を保存するlocalStorageのキー。
k8ordo-state:<key>です。 inlineRead() => string- インラインの
<script>に埋め込むJavaScriptの式。ブラウザで評価すると、保存された行のオブジェクトかnullになります。
注意
- 値はJSONで保存するので、フィールドはJSONで表せる型にします。スキーマは、自分の出力を受け付けなければなりません。
- ほかのタブの書き込みは、
storageイベントで届きます。 - 戻り値の型は
LocalStateとしてexportしています。
defineSessionState
import元 @k8ordo/state
sessionStorageに置く状態を定義します。再読み込みでは残り、タブを閉じると消えます。
defineSessionState<Schema>(
key: string,
schema: Schema,
): SessionState<Schema>引数
keystring- 状態の名前。sessionStorageのキーは
k8ordo-state:<key>になります。 schemaStateSchema- 保存する値のスキーマ。どのフィールドも
.default()か.optional()を持たなければなりません。
戻り値
SessionState<Schema> — sessionStorageの状態の定義。
フィールド
kind'session'- 定義の種類。
useAppStateは、これを見てストアを選びます。 keystring- 1つ目の引数に渡したキー。
schemaSchema- 渡したスキーマ。
storageKeystring- 値を保存するsessionStorageのキー。
k8ordo-state:<key>です。 inlineRead() => string- インラインの
<script>に埋め込むJavaScriptの式。sessionStorageを読みます。
注意
versionとmigrateは取りません。- 同じキーの
defineLocalStateとは、別の状態です。 - 戻り値の型は
SessionStateとしてexportしています。
defineCookieState
import元 @k8ordo/state
Cookieに置く状態を定義します。ブラウザが書き、リクエストのたびにサーバーへ届きます。
defineCookieState<Schema>(
key: string,
schema: Schema,
versioning?: Versioning<Schema>,
): CookieState<Schema>引数
keystring- 状態の名前。Cookieの名前は
k8ordo-state.<key>になります。英数字と、HTTPのtokenに入る記号だけが使えます。 schemaStateSchema- 保存する値のスキーマ。どのフィールドも
.default()か.optional()を持たなければなりません。 versioningVersioning- 保存した形を変えたときの
versionとmigrate。省くと、行は値のオブジェクトそのものになります。
戻り値
CookieState<Schema> — Cookieの状態の定義。
フィールド
kind'cookie'- 定義の種類。
useAppStateは、これを見てストアを選びます。 keystring- 1つ目の引数に渡したキー。
schemaSchema- 渡したスキーマ。
cookieNamestring- 値を保存するCookieの名前。
k8ordo-state.<key>です。 parseCookies(cookies: ReadonlyMap<string, string>) => output<Schema>- リクエストのCookieから値を読みます。値をパーセントデコードした
Mapを渡し、@k8ordo/serverならrequest.cookiesをそのまま渡せます。古い版の値は移行して読みますが、書き戻しません。 cookieValue(values?) => string- サーバーが同じCookieを書くときの値。スキーマに通してから、エンコードしていないJSONを返します。指定しなかったフィールドは既定値です。
注意
- ブラウザはCookie Store APIで、
Path=/とSameSite=Lax、400日のMax-Ageを付けて書きます。APIがSecureも付けます。 HttpOnlyにはできないので、秘密は置かないでください。- 名前と値を合わせて4KBを超えると、書き込みのハンドルがrejectします。
- 戻り値の型は
CookieStateとしてexportしています。
defineMemoryState
import元 @k8ordo/state
JavaScriptの実行環境に置く、型の付いた共有の箱を定義します。再読み込みで初期値に戻ります。
defineMemoryState<Values>(
key: string,
initial: Values,
): MemoryState<Values>引数
keystring- 状態の名前。ストアの登録に使います。
initialValues- 初期値。型とキーの集まりもここから決まり、サーバーの描画にも使います。
戻り値
MemoryState<Values> — メモリの状態の定義。
フィールド
kind'memory'- 定義の種類。
useAppStateは、これを見てストアを選びます。 keystring- 1つ目の引数に渡したキー。
initialReadonly<Values>- 渡した初期値の写し。
注意
- スキーマはありません。値が実行環境の外へ出ないからです。
- 値は書き換えずに、
update()で置き換えます。update()はまとめず、呼ぶたびにその場で反映します。 - 戻り値の型は
MemoryStateとしてexportしています。
useAppState
import元 @k8ordo/state
定義の今の値と、値を変えるupdateを返します。どの種類の定義にも使える、Client Componentのフックです。
useAppState(def, options?): [state, update]
useAppState(def, keys, options?): [Pick<state, Key>, update]引数
defAnyState- 読み書きする定義。
keysreadonly Key[]- 購読するキー。そのキーが変わったときだけ再描画します。
[]なら何も購読しません。 options{ initialUrl? } | { initialCookie? }- サーバーで読んだ値。
initialUrlはurlを持つページの状態にだけ、initialCookieはCookieの状態にだけ渡せます。
戻り値
[state, update] — 今の値と、値を変える関数。
注意
- ページの状態の値は、
urlとentryを平らにまとめたものです。 - サーバーの描画とハイドレーションの描画は、既定値で行います。
initialUrlやinitialCookieを渡せばその値で、メモリなら初期値で描きます。 update(patch, options?)は、その場で値を反映してUpdateHandleを返します。同じハンドラの中の呼び出しは、1回の書き込みにまとめます。optionsはページの状態にだけあります。- Providerは要りません。ストアは、最初に呼ばれたときに作られます。
pager.tsxconst [{ page }, update] = useAppState(listState, ['page']);
update({ page: page + 1 }, { history: 'push' });UpdateHandle
import元 @k8ordo/state
update()が返す、2つのPromiseを持つオブジェクトです。navigation.navigate()が返すものと同じ形です。
type UpdateHandle = {
committed: Promise<void>;
finished: Promise<void>;
};フィールド
committedPromise<void>- 書き込みが置き場所に入ったときに解決します。
finishedPromise<void>- 書き込みのあとでルーターがする処理まで、すべて終わったときに解決します。
注意
- 無視してもlintに掛からず、rejectも表に出ません。
- 追い越された遷移は
AbortErrorで、保存に失敗した書き込みはそのエラーでrejectします。
UpdateOptions
import元 @k8ordo/state
ページの状態のupdate()が取る、2つ目の引数の型です。
type UpdateOptions = {
history?: 'push' | 'replace';
};フィールド
history'push' | 'replace'- 既定は
'replace'です。'push'は、urlの値が変わるときだけ新しい履歴エントリを積みます。
注意
- ページの状態以外の
update()には、この引数がありません。
Versioning
import元 @k8ordo/state
defineLocalStateとdefineCookieStateが取る、3つ目の引数の型です。
type Versioning<Schema> = {
version: number;
migrate: (
old: Readonly<Record<string, unknown>>,
fromVersion: number,
) => { readonly [Key in keyof input<Schema>]?: unknown };
};フィールド
versionnumber- 今の版。1以上の整数です。
migrate(old, fromVersion) => values- 古い版の値を、今の形に読み替えます。
fromVersionは行を書いたときの版で、版の無い行は0です。
注意
- 返した値は、スキーマでフィールドごとに拾われます。
migrateが投げると、何も保存されていないものとして読み、行には触りません。
Register
import元 @k8ordo/state
hrefに渡すパスを型で確かめるために、アプリが拡張するインターフェースです。
declare module '@k8ordo/state' {
interface Register {
routes: typeof routes;
}
}フィールド
routestypeof routes@k8ordo/routerのルート表の型。パスを、表のパターンと区切りごとに照らし合わせます。pathstring- 表を持たないルーターのパスのunion。
routesがあれば、そちらが優先されます。
注意
@k8ordo/staticと@k8ordo/serverでは、.k8ordo/register.gen.tsに生成されます。- 拡張はアプリケーションの中でだけ行います。
- 検査は
RegisteredPath<Path>としてもexportしています。受け付けるパスならPathに、拒むならneverになります。
resetStateRegistry
import元 @k8ordo/state
ブラウザのストアの登録表を空にします。テストの間で、状態を持ち越さないためのものです。
resetStateRegistry(): void注意
- 先にコンポーネントをアンマウントしてください。
- 保存した行は消えません。
storageKeyやcookieNameで消します。
OutputOf
import元 @k8ordo/state
スキーマの出力の型です。initialUrlやinitialCookieを受け取るpropsの型を書くときに使います。
type OutputOf<Schema> = Schema extends StateSchema
? output<Schema>
: Record<never, never>;注意
OutputOf<typeof listState.url>のように、定義のスキーマを渡します。スキーマが無いundefinedのときは、空のオブジェクトの型です。
StateSchema
import元 @k8ordo/state
定義が受け取るスキーマの型です。zodとzod/miniのz.object()に共通する部分なので、どちらで書いたスキーマも渡せます。
type StateSchema<Shape extends $ZodShape = $ZodShape> =
$ZodObject<Shape> & { shape: Shape };UrlInput
import元 @k8ordo/state
parseUrlと、urlReaderが返す関数が受け取るクエリの型です。URLSearchParamsか、フレームワークがページに渡す形のオブジェクトです。
type UrlInput =
| URLSearchParams
| Readonly<Record<string, string | readonly string[] | undefined>>;AnyState
import元 @k8ordo/state
すべての種類の定義のunionです。どの定義でも受け取る関数を型付けするときに使います。
type AnyState =
| PageState
| LocalState
| SessionState
| CookieState
| MemoryState;