Avoid `undefined` outer work unit store in use cache
The `outerWorkUnitStore` in the public cache context could previously be
`undefined`, which was needed when `"use cache"` was called without a
`WorkUnitStore` (e.g. inside `generateStaticParams`) and during
background revalidation of stale cache entries (SWR). With the previous
commit providing a `GenerateStaticParamsStore` for `generateStaticParams`,
the only remaining source of `undefined` was the SWR background
revalidation path, which intentionally discarded the store to prevent
cache life and tags from propagating back to the outer scope.
A `skipPropagation` flag was added to `CacheContext` to decouple the
propagation concern from the store reference. The SWR background regen
now passes `skipPropagation: true` while keeping the outer store intact
for reads (e.g. `implicitTags`). Previously, nested `"use cache"` calls
during SWR regen would pass empty `softTags` to `cacheHandler.get()`
because the store was `undefined`. Now they correctly receive the page's
implicit tags.
With `| undefined` removed from `PublicCacheContext.outerWorkUnitStore`,
all unnecessary existence checks (`?.`, `if (x)`, `case undefined:`,
ternaries) were cleaned up throughout `use-cache-wrapper.ts`, and the
`shouldForceRevalidate` and `shouldDiscardCacheEntry` signatures were
tightened from `WorkUnitStore | undefined` to `WorkUnitStore`.
Note that module-scope `"use cache"` usage (calling a cached function at
the top level of a module) was already prevented before this change by
the `WorkStore` check, which throws if no `WorkStore` is present. The
new `WorkUnitStore` check is an additional guard that comes after it.
This also unblocks a future change to support root params inside
`"use cache"` with cache keying. Since the outer work unit store is now
always defined, `rootParams` can be threaded from the outer store into
the cache store. The only exception will be `UnstableCacheStore`, which
doesn't carry `rootParams` and can't include them in its cache key.
A new `use-cache-swr` test suite was added with a persistent cache
handler that does not drop entries at revalidate time (unlike the default
in-memory handler), which enables testing the server-side SWR code path
that was previously uncovered.