Observed since 20 Oct, 22:00 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
@021.is/spine-query
TanStack Query wrapper with sensible defaults: dedupe, SWR, no auto-refetch, query-key factory pattern. Reduces frontend → backend traffic.
TanStack Query wrapper with sensible defaults that minimize backend traffic. Plus a typed makeKeys factory for consistent, scoped query keys.
A production app hit a real rate-limit because 10 components were each calling the same endpoint. TanStack Query's defaults (refetchOnFocus: true, staleTime: 0) make this worse, not better. spine-query tunes for don't hammer.
makeQueryClient)| Value | Why | |
|---|---|---|
staleTime | 60_000 (1 min) | Component swaps within a minute don't refetch |
gcTime | 5 * 60_000 (5 min) | Back-button warm hit |
refetchOnWindowFocus | false | Opt-in per query if needed |
refetchOnReconnect | false | Same — explicit > implicit |
retry | 1 | Don't thrash on failure |
mutations.retry | 0 | Never auto-retry mutations |
import { QueryClientProvider } from "@tanstack/react-query";
import { makeQueryClient } from "@021.is/spine-query";
const qc = makeQueryClient();
<QueryClientProvider client={qc}>{children}</QueryClientProvider>
import { makeKeys } from "@021.is/spine-query";
export const eventKeys = makeKeys("events", {
all: () => [],
byId: (id: string) => [id],
listByOrganizer: (orgId: string, status: "draft" | "published") => ["by-org", orgId, status],
});
useQuery({ queryKey: eventKeys.byId("e_1"), queryFn: () => fetchEvent("e_1") });
queryClient.invalidateQueries({ queryKey: eventKeys.all() }); // wipes ALL event queries
Result: every key is prefixed with the scope (["events", "e_1"], ["events", "by-org", "o_1", "published"]). Invalidation is reliable; typos are caught at compile time.
useQuery({
queryKey: eventKeys.byId(id),
queryFn: () => fetchEvent(id),
refetchOnWindowFocus: true, // override the default for hot-status surfaces
staleTime: 5_000,
});
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
@types/reactEnvironment{
"local_name": "@types/react",
"alias": false,
"peer_metadata": null
} | ^19.2.15 | development |
reactEnvironment{
"local_name": "react",
"alias": false,
"peer_metadata": {
"optional": false
}
} | ^19.2.6 | peer |
@tanstack/react-queryEnvironment{
"local_name": "@tanstack/react-query",
"alias": false,
"peer_metadata": {
"optional": false
}
} | ^5.100.14 | peer |
Source distribution
{
"shasum": "a91739a2237f5c9f5a18b5f776503c0d322f2df9",
"tarball": "https://registry.npmjs.org/@021.is/spine-query/-/spine-query-0.4.0.tgz",
"fileCount": 4,
"integrity": "sha512-YRNNkPLUIWB0Hgs4fOl+Q6aUGWDxux1V1aw3PFS9iFcsgzTgy2riodXl01gSod/I40bc9lPebOdbsmBfByAF+A==",
"signatures": [
{
"sig": "MEUCIEj+E8VGwPW7ICkwt4LJuPrDtiN9TX4yrpqJ/9y84yEKAiEAl2rekXsUrDSmoZuJS3Zevkmc3eGBI5GXjvPUHj67KBY=",
"keyid": "SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"
}
],
"unpackedSize": 5059
}Observed since 20 Oct, 22:00 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:622af032d486e95b5e93f65cdd7dd2b41a28981b9bf545fe5ee3b44c8feb56a7