fix(store): drop unreachable legacy StoreRuntime fallback
Fix round 2 for task 1: store-codegen.ts stopped emitting runtime: "legacy" actions in round 1, making the StoreRuntime variant and its resolution fallback dead. Narrows StoreRuntime to three variants and adds a regression test for the remaining options.runtime -> shared fallback chain. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -382,8 +382,7 @@ export function createStoreInstance<
|
|||||||
const definitions = Array.isArray(rawDefinitions) ? rawDefinitions : [rawDefinitions];
|
const definitions = Array.isArray(rawDefinitions) ? rawDefinitions : [rawDefinitions];
|
||||||
const selected =
|
const selected =
|
||||||
definitions.find((entry) => entry.runtime === options.runtime) ??
|
definitions.find((entry) => entry.runtime === options.runtime) ??
|
||||||
definitions.find((entry) => entry.runtime === "shared") ??
|
definitions.find((entry) => entry.runtime === "shared");
|
||||||
definitions.find((entry) => entry.runtime === "legacy");
|
|
||||||
if (!selected) continue;
|
if (!selected) continue;
|
||||||
Reflect.set(actions, name, async (...args: unknown[]) => {
|
Reflect.set(actions, name, async (...args: unknown[]) => {
|
||||||
currentAction = name;
|
currentAction = name;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
export type StoreKind = "global" | "page";
|
export type StoreKind = "global" | "page";
|
||||||
export type StoreRuntime = "shared" | "client" | "server" | "legacy";
|
export type StoreRuntime = "shared" | "client" | "server";
|
||||||
export type PersistenceStorage = "memory" | "session" | "local";
|
export type PersistenceStorage = "memory" | "session" | "local";
|
||||||
/** Broad callable constraint that preserves each action's concrete parameters and return type. */
|
/** Broad callable constraint that preserves each action's concrete parameters and return type. */
|
||||||
export type StoreFunction = (...args: any[]) => unknown;
|
export type StoreFunction = (...args: any[]) => unknown;
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
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({
|
||||||
|
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);
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user