@techsio/storefront-data
Version:
Medusa-first storefront data layer built on TanStack Query.
192 lines (132 loc) • 5.84 kB
Markdown
---
name: audit-storefront-before-release
description: >
Load this skill before releasing a storefront that uses
@techsio/storefront-data. Use it to audit SSR hydration, query-key identity,
storage degradation, cart cache sync, and selected payment-session checkout
behavior so the storefront does not ship with a hidden split source of truth.
type: lifecycle
library: "@techsio/storefront-data"
library_version: "0.1.0"
requires:
- implement-ssr-prefetch-and-query-client-boundaries
- implement-cart-and-checkout-platform-flows
- configure-pagination-prefetch-and-cache-policy
sources:
- "TechsioCZ/new-engine:libs/storefront-data/README.md"
- "TechsioCZ/new-engine:libs/storefront-data/tests/ssr-hydration.smoke.test.tsx"
- "TechsioCZ/new-engine:libs/storefront-data/tests/shared.browser-storage.test.ts"
- "TechsioCZ/new-engine:libs/storefront-data/tests/cart.cache-sync.test.ts"
- "TechsioCZ/new-engine:libs/storefront-data/tests/medusa.flow.test.tsx"
---
This skill builds on the SSR, cart/checkout, and cache-policy skills. Use it when the app is already wired and you want a release-time audit.
# Audit storefront before release
Run through each section before shipping.
## SSR and hydration checks
### Check: server prefetch reuses the client cache after hydration
Expected:
```tsx
import { getServerQueryClient } from "@techsio/storefront-data/server/get-query-client"
import { storefront } from "@/src/lib/storefront"
const queryClient = getServerQueryClient()
await queryClient.prefetchQuery(
storefront.hooks.products.getListQueryOptions({
region_id: "reg_123",
country_code: "cz",
limit: 24,
})
)
```
Fail condition: the hydrated client immediately refetches the same data because the server and client query inputs differ.
Fix: reuse the exact hook-owned query options and pass the same region-sensitive inputs on both sides.
### Check: no client bundle imports `server/get-query-client`
Expected:
```tsx
"use client"
import { StorefrontDataProvider } from "@techsio/storefront-data/client/provider"
```
Fail condition: a client component imports `@techsio/storefront-data/server/get-query-client`.
Fix: keep server query-client work in Server Components and the provider in client code.
## Cache and storage checks
### Check: the storefront is not writing active-cart state with app-local query keys
Expected:
```ts
import { syncCartCaches } from "@techsio/storefront-data/shared/cart-cache-sync"
import { storefront } from "@/src/lib/storefront"
syncCartCaches(queryClient, storefront.queryKeys.cart, cart)
```
Fail condition: app code calls `setQueryData` or `invalidateQueries` with hand-written cart keys.
Fix: reuse the shared cart-cache sync helpers and preset query keys.
### Check: cart persistence still behaves when storage is unavailable
Expected:
```ts
import { createLocalStorageValueStore } from "@techsio/storefront-data/shared/storage-value-store"
const cartStorage = createLocalStorageValueStore({
key: "shop-cart-id",
})
```
Fail condition: the app assumes `localStorage` is always available or crashes when storage access fails.
Fix: keep the shared storage seam and test the screen with storage disabled or unavailable.
## Checkout checks
### Check: selected payment-session behavior is exercised
Expected:
```ts
const completeCheckout = storefront.flows.checkout.useCompleteCheckout({
cartId,
regionId,
})
```
Fail condition: only the happy path is tested where the first payment session already matches the desired provider.
Fix: exercise selected-session reuse, missing-session cases, and stage-specific checkout errors.
### Check: the flow layer owns checkout completion
Expected:
```ts
const completeCheckout = storefront.flows.checkout.useCompleteCheckout({
cartId,
regionId,
})
await completeCheckout.mutateAsync()
```
Fail condition: the app completes checkout through direct SDK calls or custom mutations.
Fix: route checkout completion back through the shared flow wrappers.
## Common Mistakes
### CRITICAL Browser-only happy-path verification
Wrong:
```txt
Only test the screen after `pnpm dev` with client-side navigation.
```
Correct:
```txt
Test an SSR-prefetched route and confirm the hydrated client reuses the prefetched cache.
```
A storefront can look correct in client-only testing while still breaking in App Router SSR or hydration.
Source: `libs/storefront-data/tests/ssr-hydration.smoke.test.tsx`
### HIGH Skipping selected-payment-session edge cases
Wrong:
```txt
Only test one checkout path where the first payment session already matches the final provider.
```
Correct:
```txt
Test selected-session reuse, missing-session cases, and staged checkout errors.
```
The hard checkout failures live in selected-session and stage-specific behavior, not only in the happy path.
Source: `libs/storefront-data/tests/medusa.flow.test.tsx`
### HIGH Ignoring storage degradation and cross-tab behavior
Wrong:
```txt
Assume localStorage always exists and one tab is enough to validate cart persistence.
```
Correct:
```txt
Check cart persistence when storage is unavailable and when another tab mutates the same key.
```
Shared browser storage is part of the platform contract. Release review has to include degraded storage and cross-tab synchronization paths.
Source: `libs/storefront-data/src/shared/storage-value-store.ts`, `libs/storefront-data/tests/shared.browser-storage.test.ts`
## Pre-Deploy Summary
- [ ] Server-prefetched routes hydrate without key drift
- [ ] No client code imports `server/get-query-client`
- [ ] Cart cache sync uses shared helpers and preset query keys
- [ ] Storage degradation and cross-tab cart behavior were checked
- [ ] Checkout completion goes through the shared flow layer
- [ ] Selected payment-session and staged error cases were exercised