{"_id":"@api-hooks/nuget","name":"@api-hooks/nuget","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@api-hooks/nuget","version":"1.0.0","description":"React hooks for the NuGet REST API, built on @tanstack/react-query","keywords":["react","hooks","nuget","registry","dotnet","api","react-query","tanstack"],"license":"MIT","homepage":"https://github.com/ElJijuna/api-hooks#readme","repository":{"type":"git","url":"git+https://github.com/ElJijuna/api-hooks.git","directory":"packages/nuget"},"bugs":{"url":"https://github.com/ElJijuna/api-hooks/issues"},"publishConfig":{"access":"public"},"type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"}},"sideEffects":false,"scripts":{"build":"vite build && tsc --emitDeclarationOnly --declarationMap","dev":"vite build --watch","test":"jest --passWithNoTests","test:coverage":"jest --coverage --passWithNoTests","typecheck":"tsc --noEmit","docs":"typedoc"},"peerDependencies":{"@tanstack/react-query":"^5.0.0","react":">=19.0.0"},"dependencies":{"nuget-api-client":"^1.0.0"},"devDependencies":{"@tanstack/react-query":"^5.101.0","@testing-library/react":"^16.3.2","jest":"^30.4.2","jest-environment-jsdom":"^30.4.1","react":"^19.2.7","react-dom":"^19.2.7","typedoc":"^0.28.19","vite":"^8.0.16","vite-magic-tree-shaking":"^1.0.0"},"author":{"name":"pilmee","email":"pilmee@gmail.com","url":"https://github.com/ElJijuna"},"gitHead":"b447f9028e3572e555f25e5014edc78f3ae12a60","_id":"@api-hooks/nuget@1.0.0","_nodeVersion":"22.23.1","_npmVersion":"11.18.0","dist":{"integrity":"sha512-s5RwlEVovSxpGK3Anvs3dG0RTyYtCDG9LXS5sB/MmVqlYlc843BpzCOaYxF2aKj1qV26wld6PBPwG6O9ebfdJg==","shasum":"efab0b6d99f088cb96b5bb94fd2378e264e06b37","tarball":"https://registry.npmjs.org/@api-hooks/nuget/-/nuget-1.0.0.tgz","fileCount":43,"unpackedSize":42374,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDE7u5BwEwv6d6Pft/alv41Q76LcXca9/mW90/FPwBH5wIhANqzViYxzGqHi0AnU5SBCbAVX9ap9YYcvuSlBi+PXgpK"}]},"_npmUser":{"name":"pilmee","email":"pilmee@gmail.com"},"directories":{},"maintainers":[{"name":"pilmee","email":"pilmee@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nuget_1.0.0_1782996534986_0.9187703495380808"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-02T12:48:54.759Z","1.0.0":"2026-07-02T12:48:55.123Z","modified":"2026-07-02T12:48:55.452Z"},"maintainers":[{"name":"pilmee","email":"pilmee@gmail.com"}],"description":"React hooks for the NuGet REST API, built on @tanstack/react-query","homepage":"https://github.com/ElJijuna/api-hooks#readme","keywords":["react","hooks","nuget","registry","dotnet","api","react-query","tanstack"],"repository":{"type":"git","url":"git+https://github.com/ElJijuna/api-hooks.git","directory":"packages/nuget"},"author":{"name":"pilmee","email":"pilmee@gmail.com","url":"https://github.com/ElJijuna"},"bugs":{"url":"https://github.com/ElJijuna/api-hooks/issues"},"license":"MIT","readme":"# @api-hooks/nuget\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/ElJijuna/api-hooks/main/public/assets/api-hooks.png\" alt=\"api-hooks logo\" width=\"240\" />\n</p>\n\nReact hooks for the [NuGet REST API](https://learn.microsoft.com/en-us/nuget/api/overview), built on [`nuget-api-client`](https://www.npmjs.com/package/nuget-api-client) and [`@tanstack/react-query`](https://tanstack.com/query).\n\n[![npm](https://img.shields.io/npm/v/@api-hooks/nuget)](https://www.npmjs.com/package/@api-hooks/nuget)\n[![npm downloads](https://img.shields.io/npm/dm/@api-hooks/nuget)](https://www.npmjs.com/package/@api-hooks/nuget)\n[![CI](https://github.com/ElJijuna/api-hooks/actions/workflows/ci.yml/badge.svg)](https://github.com/ElJijuna/api-hooks/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](../../LICENSE)\n[![TypeScript](https://img.shields.io/badge/TypeScript-strict-blue?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)\n\n## Requirements\n\n| Peer dependency | Version |\n| --------------- | ------- |\n| `react` | `>=19.0.0` |\n| `@tanstack/react-query` | `^5.0.0` |\n\n## Installation\n\n```bash\nnpm install @api-hooks/nuget @tanstack/react-query\n```\n\n## Setup\n\nWrap your application with a `QueryClientProvider` and a `NuGetClientProvider` once at the root:\n\n```tsx\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { NuGetClientProvider } from '@api-hooks/nuget';\n\nconst queryClient = new QueryClient();\n\nexport default function App() {\n  return (\n    <QueryClientProvider client={queryClient}>\n      <NuGetClientProvider>\n        <YourApp />\n      </NuGetClientProvider>\n    </QueryClientProvider>\n  );\n}\n```\n\nBy default, requests go to `nuget.org` (`api.nuget.org` / `azuresearch-usnc.nuget.org`). To point at a private feed (Azure Artifacts, GitHub Packages, etc.), pass `registryUrl`/`searchUrl`/`apiKey` through `NuGetClientProvider`:\n\n```tsx\n<NuGetClientProvider\n  options={{\n    registryUrl: 'https://my-feed.example.com',\n    searchUrl: 'https://my-feed.example.com/search',\n    apiKey: 'my-api-key',\n  }}\n>\n  <YourApp />\n</NuGetClientProvider>\n```\n\n`NuGetClientProvider` is optional — hooks fall back to a default `NuGetClient` (pointed at `nuget.org`) when no provider is present.\n\n## Hooks\n\nQuery hooks return a [`UseQueryResult`](https://tanstack.com/query/latest/docs/framework/react/reference/useQuery) — you get the full TanStack Query API: `data`, `isLoading`, `isFetching`, `isError`, `error`, `refetch`, and more. `useNuGetSearchInfinite` returns a [`UseInfiniteQueryResult`](https://tanstack.com/query/latest/docs/framework/react/reference/useInfiniteQuery).\n\n| Hook | Description | Returns |\n| ---- | ----------- | ------- |\n| [`useNuGetSearch(params?, options?)`](#usenugetsearchparams-options) | Search NuGet packages | `NuGetSearchResult` |\n| [`useNuGetSearchInfinite(options?)`](#usenugetsearchinfiniteoptions) | Infinite-scroll variant of `useNuGetSearch` | `InfiniteData<NuGetSearchResult>` |\n| [`useNuGetAutocomplete(params?, options?)`](#usenugetautocompleteparams-options) | Autocomplete package IDs | `NuGetAutocompleteResult` |\n| [`useNuGetPackageVersions(id, options?)`](#usenugetpackageversionsid-options) | All published versions of a package | `string[]` |\n| [`useNuGetPackageVersion(id, version, options?)`](#usenugetpackageversionid-version-options) | Catalog entry for a specific version | `NuGetCatalogEntry` |\n| [`useNuGetPackageLatest(id, options?)`](#usenugetpackagelatestid-options) | Catalog entry for the latest listed version | `NuGetCatalogEntry` |\n\n---\n\n## API Reference\n\n### `useNuGetSearch(params?, options?)`\n\nSearches NuGet packages using the NuGet Search Query Service.\n\n```tsx\nimport { useNuGetSearch } from '@api-hooks/nuget';\n\nfunction PackageSearch() {\n  const { data, isLoading } = useNuGetSearch({ query: 'json serializer', take: 10 });\n\n  if (isLoading) return <p>Loading…</p>;\n\n  return (\n    <ul>\n      {data?.data.map(pkg => (\n        <li key={pkg.id}>{pkg.id} — {pkg.version} ({pkg.totalDownloads} downloads)</li>\n      ))}\n    </ul>\n  );\n}\n```\n\n| Option | Type | Default | Description |\n| ------ | ---- | ------- | ----------- |\n| `enabled` | `boolean` | `true` | Disable the query |\n| `queryOptions` | `QueryOverrides<TData>` | `undefined` | Override TanStack Query options (`staleTime`, `retry`, `gcTime`, `select`, etc.) |\n\n---\n\n### `useNuGetSearchInfinite(options?)`\n\nInfinite-scroll variant of `useNuGetSearch`. Each page is fetched by advancing the `skip` offset by `take`. Call `fetchNextPage()` to load the next batch — results accumulate in `data.pages`.\n\n```tsx\nimport { useNuGetSearchInfinite } from '@api-hooks/nuget';\n\nfunction PackageSearchInfinite() {\n  const { data, fetchNextPage, hasNextPage } = useNuGetSearchInfinite({ query: 'logging' });\n\n  return (\n    <>\n      {data?.pages.flatMap(page => page.data).map(pkg => (\n        <div key={pkg.id}>{pkg.id}</div>\n      ))}\n      {hasNextPage && <button onClick={() => fetchNextPage()}>Load more</button>}\n    </>\n  );\n}\n```\n\n| Option | Type | Default | Description |\n| ------ | ---- | ------- | ----------- |\n| `query` | `string` | `undefined` | Search query |\n| `take` | `number` | `20` | Page size |\n| `prerelease` | `boolean` | `false` | Include prerelease versions |\n| `enabled` | `boolean` | `true` | Disable the query |\n| `queryOptions` | `InfiniteQueryOverrides<TData>` | `undefined` | Override TanStack Query options |\n\n---\n\n### `useNuGetAutocomplete(params?, options?)`\n\nAutocompletes NuGet package IDs by prefix.\n\n```tsx\nimport { useNuGetAutocomplete } from '@api-hooks/nuget';\n\nfunction PackageAutocomplete({ q }: { q: string }) {\n  const { data } = useNuGetAutocomplete({ q });\n\n  return <ul>{data?.data.map(id => <li key={id}>{id}</li>)}</ul>;\n}\n```\n\n| Option | Type | Default | Description |\n| ------ | ---- | ------- | ----------- |\n| `enabled` | `boolean` | `true` | Disable the query |\n| `queryOptions` | `QueryOverrides<TData>` | `undefined` | Override TanStack Query options (`staleTime`, `retry`, `gcTime`, `select`, etc.) |\n\n---\n\n### `useNuGetPackageVersions(id, options?)`\n\nFetches all published versions of a NuGet package, ordered oldest → newest.\n\n```tsx\nimport { useNuGetPackageVersions } from '@api-hooks/nuget';\n\nfunction VersionList() {\n  const { data } = useNuGetPackageVersions('Newtonsoft.Json');\n\n  return <ul>{data?.map(v => <li key={v}>{v}</li>)}</ul>;\n}\n```\n\n| Option | Type | Default | Description |\n| ------ | ---- | ------- | ----------- |\n| `enabled` | `boolean` | `true` | Disable the query (also disabled when `id` is empty) |\n| `queryOptions` | `QueryOverrides<TData>` | `undefined` | Override TanStack Query options (`staleTime`, `retry`, `gcTime`, `select`, etc.) |\n\n---\n\n### `useNuGetPackageVersion(id, version, options?)`\n\nFetches the catalog entry (metadata) for a specific published version of a NuGet package.\n\n```tsx\nimport { useNuGetPackageVersion } from '@api-hooks/nuget';\n\nfunction VersionDetail() {\n  const { data } = useNuGetPackageVersion('Newtonsoft.Json', '13.0.3');\n\n  return <p>{data?.authors} — {data?.published}</p>;\n}\n```\n\n| Option | Type | Default | Description |\n| ------ | ---- | ------- | ----------- |\n| `enabled` | `boolean` | `true` | Disable the query (also disabled when `id` or `version` is empty) |\n| `queryOptions` | `QueryOverrides<TData>` | `undefined` | Override TanStack Query options (`staleTime`, `retry`, `gcTime`, `select`, etc.) |\n\n---\n\n### `useNuGetPackageLatest(id, options?)`\n\nFetches the catalog entry for the latest listed (stable) version of a NuGet package.\n\n```tsx\nimport { useNuGetPackageLatest } from '@api-hooks/nuget';\n\nfunction LatestVersion() {\n  const { data } = useNuGetPackageLatest('Newtonsoft.Json');\n\n  return <p>Latest: {data?.version}</p>;\n}\n```\n\n| Option | Type | Default | Description |\n| ------ | ---- | ------- | ----------- |\n| `enabled` | `boolean` | `true` | Disable the query (also disabled when `id` is empty) |\n| `queryOptions` | `QueryOverrides<TData>` | `undefined` | Override TanStack Query options (`staleTime`, `retry`, `gcTime`, `select`, etc.) |\n\n---\n\n## License\n\nMIT © [ElJijuna](https://github.com/ElJijuna)\n","readmeFilename":"README.md","_rev":"1-50f0c29e6b58ae7676e219b7c2733592"}