{"_id":"@021.is/spine-query","_rev":"2-76496e96d24d4874839367120230e347","name":"@021.is/spine-query","dist-tags":{"latest":"0.4.3"},"versions":{"0.4.0":{"name":"@021.is/spine-query","version":"0.4.0","license":"MIT","_id":"@021.is/spine-query@0.4.0","maintainers":[{"name":"edvone","email":"edvard@edvone.dev"}],"homepage":"https://github.com/021is/spine-ts#readme","bugs":{"url":"https://github.com/021is/spine-ts/issues"},"dist":{"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},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"e4434c6f59db8f586e0f05ffdb3b88a96e68e67b","scripts":{"build":"tsup src/index.ts --format esm --dts --clean","typecheck":"tsc --noEmit"},"_npmUser":{"name":"edvone","email":"edvard@edvone.dev"},"repository":{"url":"git+https://github.com/021is/spine-ts.git","type":"git","directory":"packages/query"},"_npmVersion":"10.9.4","description":"TanStack Query wrapper with sensible defaults: dedupe, SWR, no auto-refetch, query-key factory pattern. Reduces frontend → backend traffic.","directories":{},"_nodeVersion":"22.22.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/react":"^19.2.15"},"peerDependencies":{"react":"^19.2.6","@tanstack/react-query":"^5.100.14"},"peerDependenciesMeta":{"react":{"optional":false},"@tanstack/react-query":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/spine-query_0.4.0_1779981964647_0.09832826845840237","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@021.is/spine-query","version":"0.4.3","license":"MIT","description":"TanStack Query wrapper with sensible defaults: dedupe, SWR, no auto-refetch, query-key factory pattern. Reduces frontend → backend traffic.","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsup src/index.ts --format esm --dts --clean","typecheck":"tsc --noEmit"},"peerDependencies":{"@tanstack/react-query":"^5.100.14","react":"^19.2.6"},"peerDependenciesMeta":{"@tanstack/react-query":{"optional":false},"react":{"optional":false}},"devDependencies":{"@types/react":"^19.2.15"},"repository":{"type":"git","url":"git+https://github.com/021is/spine-ts.git","directory":"packages/query"},"publishConfig":{"access":"public"},"_id":"@021.is/spine-query@0.4.3","gitHead":"b9f9333776fa55686cc2feb05f851aa6000b0e05","bugs":{"url":"https://github.com/021is/spine-ts/issues"},"homepage":"https://github.com/021is/spine-ts#readme","_nodeVersion":"22.22.0","_npmVersion":"10.9.4","dist":{"integrity":"sha512-pGc84mKD41BN4AP67JjAnrcNy4RVewIma5M7fXNd/doihcNXclmCdKT/7zdN6WjUjjbpZk+/ncBUyPr6kpQi7g==","shasum":"896cc4b7c417b0b8fa05f27cdb1d4e521c7b9e77","tarball":"https://registry.npmjs.org/@021.is/spine-query/-/spine-query-0.4.3.tgz","fileCount":5,"unpackedSize":6485,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCsga7ftO/sneHExIblTKCdBWxDPm2VddFgrWyxLVEHOwIgcfH6V0j0L8Zvor9nFyMpf57qHbYcT7V8bV63vtwHEtM="}]},"_npmUser":{"name":"edvone","email":"edvard@edvone.dev"},"directories":{},"maintainers":[{"name":"edvone","email":"edvard@edvone.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/spine-query_0.4.3_1779995251589_0.8716883436626071"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-28T15:26:04.440Z","modified":"2026-05-28T19:07:31.881Z","0.4.0":"2026-05-28T15:26:04.786Z","0.4.3":"2026-05-28T19:07:31.728Z"},"bugs":{"url":"https://github.com/021is/spine-ts/issues"},"license":"MIT","homepage":"https://github.com/021is/spine-ts#readme","repository":{"type":"git","url":"git+https://github.com/021is/spine-ts.git","directory":"packages/query"},"description":"TanStack Query wrapper with sensible defaults: dedupe, SWR, no auto-refetch, query-key factory pattern. Reduces frontend → backend traffic.","maintainers":[{"name":"edvone","email":"edvard@edvone.dev"}],"readme":"# @021.is/spine-query\n\nTanStack Query wrapper with sensible defaults that minimize backend traffic. Plus a typed `makeKeys` factory for consistent, scoped query keys.\n\n## Why\n\nA 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**.\n\n## Defaults (built into `makeQueryClient`)\n\n| | Value | Why |\n|---|---|---|\n| `staleTime` | 60_000 (1 min) | Component swaps within a minute don't refetch |\n| `gcTime` | 5 * 60_000 (5 min) | Back-button warm hit |\n| `refetchOnWindowFocus` | false | Opt-in per query if needed |\n| `refetchOnReconnect` | false | Same — explicit > implicit |\n| `retry` | 1 | Don't thrash on failure |\n| `mutations.retry` | 0 | Never auto-retry mutations |\n\n## Use — client setup\n\n```tsx\nimport { QueryClientProvider } from \"@tanstack/react-query\";\nimport { makeQueryClient } from \"@021.is/spine-query\";\n\nconst qc = makeQueryClient();\n<QueryClientProvider client={qc}>{children}</QueryClientProvider>\n```\n\n## Use — typed query keys\n\n```ts\nimport { makeKeys } from \"@021.is/spine-query\";\n\nexport const eventKeys = makeKeys(\"events\", {\n  all: () => [],\n  byId: (id: string) => [id],\n  listByOrganizer: (orgId: string, status: \"draft\" | \"published\") => [\"by-org\", orgId, status],\n});\n\nuseQuery({ queryKey: eventKeys.byId(\"e_1\"), queryFn: () => fetchEvent(\"e_1\") });\nqueryClient.invalidateQueries({ queryKey: eventKeys.all() }); // wipes ALL event queries\n```\n\nResult: 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.\n\n## Override per query when needed\n\n```ts\nuseQuery({\n  queryKey: eventKeys.byId(id),\n  queryFn: () => fetchEvent(id),\n  refetchOnWindowFocus: true, // override the default for hot-status surfaces\n  staleTime: 5_000,\n});\n```\n","readmeFilename":"README.md"}