The single-branch 'shared'-only action fixture failed to infer through defineStore's actions generic, typing store.increment as never and failing bun run typecheck (TS2349) even though bun test passed. Explicit type arguments fix the inference without weakening the test. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
48 lines
1.8 KiB
TypeScript
48 lines
1.8 KiB
TypeScript
import { expect, test } from "bun:test";
|
|
import { createStoreContainer, defineStore } from "../src/index.ts";
|
|
|
|
// Regression guard for the removed `"legacy"` StoreRuntime fallback.
|
|
//
|
|
// `createStoreInstance` resolves an action definition by walking:
|
|
// exact `options.runtime` match -> "shared" match -> (previously) "legacy" match
|
|
// The `"legacy"` step was dead (nothing ever produced a `runtime: "legacy"`
|
|
// action once `store-codegen.ts` stopped emitting it) and has been removed.
|
|
// This test locks in the remaining `options.runtime` -> `"shared"` chain so a
|
|
// future edit can't silently drop the `"shared"` fallback too.
|
|
const OnlySharedActionStore = defineStore<
|
|
{ count: number },
|
|
Record<string, never>,
|
|
{ increment: (amount?: number) => void }
|
|
>({
|
|
name: "OnlySharedActionStore",
|
|
kind: "global" as const,
|
|
createSharedState: () => ({ count: 0 }),
|
|
actions: {
|
|
// No "client" or "server" definition exists for this action — only
|
|
// "shared". A server-runtime container must still resolve it via the
|
|
// "shared" fallback.
|
|
increment: [
|
|
{
|
|
runtime: "shared" as const,
|
|
handler: ({ state }: any, amount = 1) => {
|
|
state.count += amount;
|
|
},
|
|
},
|
|
],
|
|
},
|
|
});
|
|
|
|
test("an action with only a shared definition resolves via the shared fallback on the server runtime", async () => {
|
|
const container = createStoreContainer({ runtime: "server", request: {} });
|
|
const store = await container.use(OnlySharedActionStore);
|
|
await store.increment(5);
|
|
expect(store.count).toBe(5);
|
|
});
|
|
|
|
test("an action with only a shared definition resolves via the shared fallback on the client runtime", async () => {
|
|
const container = createStoreContainer({ runtime: "client" });
|
|
const store = await container.use(OnlySharedActionStore);
|
|
await store.increment(3);
|
|
expect(store.count).toBe(3);
|
|
});
|