UNPKG

46.8 kBSource Map (JSON)View Raw
1{"version":3,"file":"query-registry.cjs.production.min.js","sources":["../src/data/registries.ts","../src/utils/errors.ts","../src/utils/log.ts","../src/utils/assert-valid-package-name.ts","../src/utils/fetch.ts","../src/utils/fetch-from-registry.ts","../src/endpoints/get-raw-abbreviated-packument.ts","../src/utils/fetch-downloads-from-registry.ts","../src/utils/normalize-download-period.ts","../src/utils/extract-package-manifest.ts","../src/endpoints/get-raw-packument.ts","../src/endpoints/get-raw-package-manifest.ts","../src/utils/normalize-raw-license.ts","../src/utils/normalize-raw-repository.ts","../src/endpoints/get-abbreviated-packument.ts","../src/utils/normalize-raw-abbreviated-packument.ts","../src/endpoints/get-daily-package-downloads.ts","../src/endpoints/get-daily-registry-downloads.ts","../src/endpoints/get-package-downloads.ts","../src/endpoints/get-package-manifest.ts","../src/utils/normalize-raw-package-manifest.ts","../src/utils/get-definitely-typed-name.ts","../src/utils/get-untyped-name.ts","../src/endpoints/get-packument.ts","../src/utils/normalize-raw-packument.ts","../src/endpoints/get-registry-downloads.ts","../src/endpoints/get-registry-metadata.ts","../src/endpoints/search-packages.ts","../src/utils/normalize-raw-search-criteria.ts"],"sourcesContent":["/**\n * npm registry\n *\n * @see {@link https://registry.npmjs.org}\n */\nexport const npmRegistry = 'https://registry.npmjs.org';\n\n/**\n * npm registry mirror by Cloudflare\n *\n * @remarks\n * This registry has CORS enabled and can be used to retrieve\n * package manifests and packuments in the browser.\n *\n * @see {@link https://npmjs.cf}\n * @see {@link https://registry.npmjs.cf}\n */\nexport const cloudflareRegistry = 'https://registry.npmjs.cf';\n\n/**\n * npm registry mirror by Yarn\n *\n * @see {@link https://registry.yarnpkg.com}\n */\nexport const yarnRegistry = 'https://registry.yarnpkg.com';\n\n/**\n * Mirrors of the npm registry.\n *\n * @see {@link cloudflareRegistry}\n * @see {@link yarnRegistry}\n */\nexport const npmRegistryMirrors = [cloudflareRegistry, yarnRegistry];\n\n/**\n * Downloads API for the npm registry\n *\n * @see {@link https://api.npmjs.org}\n */\nexport const npmRegistryDownloadsAPI = 'https://api.npmjs.org';\n","import makeError, { BaseError } from 'make-error';\n\n/**\n * `FetchError` represents an error that happened when fetching a URL.\n *\n * The `instanceof` operator can be used to check for this error.\n */\nexport class FetchError extends BaseError {\n constructor(\n /** URL originally fetched */\n readonly url: string,\n\n /** Response received */\n readonly response: Response\n ) {\n super(\n `fetch: request to ${url} failed with status ${response.statusText}`\n );\n }\n}\n\n/**\n * `InvalidPackageNameError` is thrown when the name of a package\n * is not valid according to the npm registry naming rules.\n *\n * The `instanceof` operator can be used to check for this error.\n *\n * @see {@link https://www.npmjs.com/package/validate-npm-package-name}\n */\nexport const InvalidPackageNameError = makeError('InvalidPackageNameError');\n\n/**\n * `InvalidPackageVersionError` is thrown when a package's version does not exist.\n *\n * The `instanceof` operator can be used to check for this error.\n */\nexport const InvalidPackageVersionError = makeError(\n 'InvalidPackageVersionError'\n);\n","export async function log(formatter: any, ...args: any[]): Promise<void> {\n if (process.env.NODE_ENV !== 'production') {\n try {\n const { debug } = await import('debug');\n const logger = debug('query-registry');\n logger(formatter, args);\n } catch {}\n }\n}\n","import validatePackageName from 'validate-npm-package-name';\nimport { InvalidPackageNameError } from './errors';\nimport { log } from './log';\n\nexport function assertValidPackageName({ name }: { name: string }): void {\n const { validForOldPackages, validForNewPackages } =\n validatePackageName(name);\n const valid = validForOldPackages || validForNewPackages;\n if (!valid) {\n log('assertValidPackageName: invalid package name: %O', { name });\n throw new InvalidPackageNameError(`invalid package name: '${name}'`);\n }\n}\n","import unfetch from 'isomorphic-unfetch';\nimport lru from 'tiny-lru';\nimport { FetchError } from './errors';\nimport { log } from './log';\n\nconst maxItems = 250;\nconst fiveMinutesTTL = 5 * 60 * 1000;\nconst cache = lru(maxItems, fiveMinutesTTL);\n\nexport async function fetch({\n url,\n headers,\n cached = true,\n}: {\n url: string;\n headers?: Record<string, string>;\n cached?: boolean;\n}): Promise<any> {\n const cacheKey = `headers=${JSON.stringify(headers)};url=${url}`;\n const cachedJSON = cache.get(cacheKey);\n if (cached && cachedJSON) {\n log('fetch: returning cached response: %O', {\n cacheKey,\n url,\n cachedJSON,\n });\n return cachedJSON;\n }\n\n const response = await unfetch(url, { headers });\n if (!response.ok) {\n log('fetch: request failed: %O', {\n url,\n headers,\n status: response.statusText,\n response,\n });\n throw new FetchError(url, response);\n }\n\n const json = await response.json();\n if (cached) {\n cache.set(cacheKey, json);\n }\n\n log('fetch: returning fresh response: %O', { url, json });\n return json;\n}\n","import { npmRegistry, npmRegistryMirrors } from '../data/registries';\nimport { FetchError } from './errors';\nimport { fetch } from './fetch';\nimport { log } from './log';\n\nexport async function fetchFromRegistry<T>({\n endpoint,\n headers,\n query,\n registry = npmRegistry,\n mirrors = npmRegistryMirrors,\n cached,\n}: {\n endpoint: string;\n headers?: Record<string, string>;\n query?: string;\n registry?: string;\n mirrors?: string[];\n cached?: boolean;\n}): Promise<T> {\n const urls = [registry, ...mirrors].map((host) => {\n const url = new URL(endpoint, host);\n url.search = query ?? '';\n return url.href;\n });\n\n let lastError: FetchError | undefined;\n for (const url of urls) {\n try {\n const json = await fetch({ url, headers, cached });\n return json as T;\n } catch (err) {\n // Keep last fetch error\n lastError = err as any;\n }\n }\n\n log(\n 'fetchFromRegistry: cannot retrieve data from registry or mirrors: %O',\n {\n endpoint,\n headers,\n query,\n registry,\n mirrors,\n lastError,\n }\n );\n throw lastError;\n}\n","import { RawAbbreviatedPackument } from '../types/raw-abbreviated-packument';\nimport { assertValidPackageName } from '../utils/assert-valid-package-name';\nimport { fetchFromRegistry } from '../utils/fetch-from-registry';\n\n/**\n * `getRawAbbreviatedPackument` returns the abbreviated packument (package document)\n * containing only the metadata necessary to install a package present on the registry.\n *\n * Note: the abbreviated packument is returned as retrieved from the registry.\n *\n * @param name - package name\n * @param registry - URL of the registry (default: npm registry)\n * @param mirrors - URLs of the registry mirrors (default: npm registry mirrors)\n * @param cached - accept cached responses (default: `true`)\n *\n * @example\n * Get the abbreviated packument for package `query-registry` from the npm registry:\n *\n * ```typescript\n * import { getRawAbbreviatedPackument } from 'query-registry';\n *\n * (async () => {\n * const packument = await getRawAbbreviatedPackument({ name: 'query-registry' });\n *\n * // Output: 'query-registry'\n * console.log(packument.name);\n * })();\n * ```\n *\n * @see {@link RawAbbreviatedPackument}\n * @see {@link npmRegistry}\n * @see {@link npmRegistryMirrors}\n */\nexport async function getRawAbbreviatedPackument({\n name,\n registry,\n mirrors,\n cached,\n}: {\n name: string;\n registry?: string;\n mirrors?: string[];\n cached?: boolean;\n}): Promise<RawAbbreviatedPackument> {\n assertValidPackageName({ name });\n\n const endpoint = `/${name}`;\n const headers = { Accept: 'application/vnd.npm.install-v1+json' };\n return fetchFromRegistry({ endpoint, headers, registry, mirrors, cached });\n}\n","import { npmRegistryDownloadsAPI } from '../data/registries';\nimport { fetchFromRegistry } from './fetch-from-registry';\n\nexport async function fetchDownloadsFromRegistry<T>({\n endpoint,\n registryDownloadsAPI = npmRegistryDownloadsAPI,\n cached,\n}: {\n endpoint: string;\n registryDownloadsAPI?: string;\n cached?: boolean;\n}): Promise<T> {\n return fetchFromRegistry({\n endpoint,\n registry: registryDownloadsAPI,\n mirrors: [],\n cached,\n });\n}\n","import { DownloadPeriod } from '../types/download-period';\n\nexport function normalizeRawDownloadPeriod({\n rawDownloadPeriod = 'last-week',\n}: {\n rawDownloadPeriod?: DownloadPeriod;\n}): string {\n if (typeof rawDownloadPeriod === 'string') {\n return rawDownloadPeriod;\n }\n\n if (rawDownloadPeriod instanceof Date) {\n return getDay(rawDownloadPeriod);\n }\n\n const { start, end } = rawDownloadPeriod;\n return `${getDay(start)}:${getDay(end)}`;\n}\n\nfunction getDay(date: Date): string {\n return date.toISOString().split('T')[0]!;\n}\n","import { RawPackageManifest } from '../types/raw-package-manifest';\nimport { RawPackument } from '../types/raw-packument';\nimport { InvalidPackageVersionError } from './errors';\nimport { log } from './log';\n\nexport function extractRawPackageManifest({\n rawPackument,\n version = 'latest',\n}: {\n rawPackument: RawPackument;\n version?: string;\n}): RawPackageManifest {\n const { name, 'dist-tags': distTags, versions } = rawPackument;\n const versionNumber = distTags[version] ?? version;\n const manifest = versions[versionNumber];\n if (!manifest) {\n log('getPackageManifest: invalid package version: %O', {\n name,\n version,\n });\n throw new InvalidPackageVersionError(\n `invalid package version: '${name}@${version}'`\n );\n }\n\n return manifest;\n}\n","import { RawPackument } from '../types/raw-packument';\nimport { assertValidPackageName } from '../utils/assert-valid-package-name';\nimport { fetchFromRegistry } from '../utils/fetch-from-registry';\n\n/**\n * `getRawPackument` returns the packument (package document) containing\n * all the metadata about a package present on the registry.\n *\n * Note: the packument is returned as retrieved from the registry.\n *\n * @param name - package name\n * @param registry - URL of the registry (default: npm registry)\n * @param mirrors - URLs of the registry mirrors (default: npm registry mirrors)\n * @param cached - accept cached responses (default: `true`)\n *\n * @example\n * Get the packument for package `query-registry` from the npm registry:\n *\n * ```typescript\n * import { getRawPackument } from 'query-registry';\n *\n * (async () => {\n * const packument = await getRawPackument({ name: 'query-registry' });\n *\n * // Output: 'query-registry'\n * console.log(packument.name);\n * })();\n * ```\n *\n * @see {@link RawPackument}\n * @see {@link npmRegistry}\n * @see {@link npmRegistryMirrors}\n */\nexport async function getRawPackument({\n name,\n registry,\n mirrors,\n cached,\n}: {\n name: string;\n registry?: string;\n mirrors?: string[];\n cached?: boolean;\n}): Promise<RawPackument> {\n assertValidPackageName({ name });\n\n const endpoint = `/${name}`;\n return fetchFromRegistry({ endpoint, registry, mirrors, cached });\n}\n","import { RawPackageManifest } from '../types/raw-package-manifest';\nimport { extractRawPackageManifest } from '../utils/extract-package-manifest';\nimport { getRawPackument } from './get-raw-packument';\n\n/**\n * `getRawPackageManifest` returns the manifest describing\n * a specific version of a package.\n *\n * Note: the manifest is returned as retrieved from the registry.\n *\n * @param name - package name\n * @param version - package version (default: `latest`)\n * @param registry - URL of the registry (default: npm registry)\n * @param mirrors - URLs of the registry mirrors (default: npm registry mirrors)\n * @param cached - accept cached responses (default: `true`)\n *\n * @example\n * Get the latest manifest for package `query-registry` from the npm registry:\n *\n * ```typescript\n * import { getRawPackageManifest } from 'query-registry';\n *\n * (async () => {\n * const manifest = await getRawPackageManifest({ name: 'query-registry' });\n *\n * // Output: 'query-registry'\n * console.log(manifest.name);\n * })();\n * ```\n *\n * @example\n * Get the manifest for package `query-registry@1.0.0` from the npm registry:\n *\n * ```typescript\n * import { getRawPackageManifest } from 'query-registry';\n *\n * (async () => {\n * const manifest = await getRawPackageManifest({ name: 'query-registry', version: '1.0.0' });\n *\n * // Output: 'query-registry'\n * console.log(manifest.name);\n *\n * // Output: '1.0.0'\n * console.log(manifest.version);\n * })();\n * ```\n *\n * @see {@link RawPackageManifest}\n * @see {@link npmRegistry}\n * @see {@link npmRegistryMirrors}\n */\nexport async function getRawPackageManifest({\n name,\n version,\n registry,\n mirrors,\n cached,\n}: {\n name: string;\n version?: string;\n registry?: string;\n mirrors?: string[];\n cached?: boolean;\n}): Promise<RawPackageManifest> {\n const rawPackument = await getRawPackument({\n name,\n registry,\n mirrors,\n cached,\n });\n\n return extractRawPackageManifest({ rawPackument, version });\n}\n","export function normalizeRawLicense({\n rawLicense,\n}: {\n rawLicense?: any;\n}): string | undefined {\n if (!rawLicense) {\n return undefined;\n }\n\n if (typeof rawLicense !== 'string') {\n return undefined;\n }\n\n return rawLicense;\n}\n","import gitUrlParse from 'git-url-parse';\nimport { GitRepository } from '../types/git-repository';\nimport { Repository } from '../types/repository';\n\nexport function normalizeRawRepository({\n rawRepository,\n}: {\n rawRepository?: any;\n}): GitRepository | undefined {\n if (isRepository(rawRepository)) {\n return normalizeRepository({ rawRepository });\n }\n\n if (typeof rawRepository === 'string') {\n return normalizeRepository({\n rawRepository: { url: rawRepository },\n });\n }\n\n return undefined;\n}\n\nfunction isRepository(rawRepository: any): rawRepository is Repository {\n return (\n rawRepository &&\n typeof rawRepository === 'object' &&\n typeof rawRepository['url'] === 'string' &&\n ['string', 'undefined'].includes(typeof rawRepository['type']) &&\n ['string', 'undefined'].includes(typeof rawRepository['directory'])\n );\n}\n\nfunction normalizeRepository({\n rawRepository,\n}: {\n rawRepository: Repository;\n}): GitRepository | undefined {\n const { url, directory: repositoryDir } = rawRepository;\n\n const info = parseGitURL({ url });\n if (!info) {\n return undefined;\n }\n\n const { source, full_name: repositoryID, filepath } = info;\n\n // Add domain to sources derived from npm-style shortcuts\n const host = source\n .replace(/^$/, 'github.com')\n .replace(/^github$/, 'github.com')\n .replace(/^gitlab$/, 'gitlab.com')\n .replace(/^bitbucket$/, 'bitbucket.org');\n\n const parsedDir = filepath !== '' ? filepath : undefined;\n\n return {\n type: 'git',\n url: `https://${host}/${repositoryID}`,\n directory: repositoryDir ?? parsedDir,\n };\n}\n\nfunction parseGitURL({ url }: { url: string }): gitUrlParse.GitUrl | undefined {\n let info;\n try {\n info = gitUrlParse(url);\n } catch {}\n return info;\n}\n","import { AbbreviatedPackument } from '../types/abbreviated-packument';\nimport { normalizeRawAbbreviatedPackument } from '../utils/normalize-raw-abbreviated-packument';\nimport { getRawAbbreviatedPackument } from './get-raw-abbreviated-packument';\n\n/**\n * `getAbbreviatedPackument` returns the abbreviated packument (package document)\n * containing only the metadata necessary to install a package present on the registry.\n *\n * @remarks\n * To get all the metadata (full packument) about a package see {@link getPackument}.\n *\n * @param name - package name\n * @param registry - URL of the registry (default: npm registry)\n * @param mirrors - URLs of the registry mirrors (default: npm registry mirrors)\n * @param cached - accept cached responses (default: `true`)\n *\n * @example\n * Get the abbreviated packument for package `query-registry` from the npm registry:\n *\n * ```typescript\n * import { getAbbreviatedPackument } from 'query-registry';\n *\n * (async () => {\n * const packument = await getAbbreviatedPackument({ name: 'query-registry' });\n *\n * // Output: 'query-registry'\n * console.log(packument.name);\n * })();\n * ```\n *\n * @see {@link AbbreviatedPackument}\n * @see {@link RawAbbreviatedPackument}\n * @see {@link npmRegistry}\n * @see {@link npmRegistryMirrors}\n */\nexport async function getAbbreviatedPackument({\n name,\n registry,\n mirrors,\n cached,\n}: {\n name: string;\n registry?: string;\n mirrors?: string[];\n cached?: boolean;\n}): Promise<AbbreviatedPackument> {\n const rawAbbreviatedPackument = await getRawAbbreviatedPackument({\n name,\n registry,\n mirrors,\n cached,\n });\n return normalizeRawAbbreviatedPackument({ rawAbbreviatedPackument });\n}\n","import { AbbreviatedPackument } from '../types/abbreviated-packument';\nimport { RawAbbreviatedPackument } from '../types/raw-abbreviated-packument';\n\nexport function normalizeRawAbbreviatedPackument({\n rawAbbreviatedPackument,\n}: {\n rawAbbreviatedPackument: RawAbbreviatedPackument;\n}): AbbreviatedPackument {\n const {\n 'dist-tags': distTags,\n name: id,\n modified: modifiedAt,\n } = rawAbbreviatedPackument;\n return {\n ...rawAbbreviatedPackument,\n id,\n distTags,\n modifiedAt,\n };\n}\n","import { DownloadPeriod } from '../types/download-period';\nimport { DailyPackageDownloads } from '../types/downloads';\nimport { assertValidPackageName } from '../utils/assert-valid-package-name';\nimport { fetchDownloadsFromRegistry } from '../utils/fetch-downloads-from-registry';\nimport { normalizeRawDownloadPeriod } from '../utils/normalize-download-period';\n\n/**\n * `getDailyPackageDownloads` returns the number of downloads for a package\n * for each day in a given time period.\n *\n * @param name - package name\n * @param period - time period in which downloads happened (default: `last-week`)\n * @param registryDownloadsAPI - URL of the registry's downloads API (default: npm registry)\n * @param cached - accept cached responses (default: `true`)\n *\n * @example\n * Get the day by day weekly downloads for package `query-registry` from the npm registry:\n *\n * ```typescript\n * import { getDailyPackageDownloads } from 'query-registry';\n *\n * (async () => {\n * const downloads = await getDailyPackageDownloads({ name: 'query-registry' });\n *\n * // Output: 'query-registry'\n * console.log(downloads.package);\n *\n * // Output: 'number'\n * console.log(typeof downloads.downloads[0].downloads);\n * })();\n * ```\n *\n * @example\n * Get the day by day monthly downloads for package `query-registry` from the npm registry:\n *\n * ```typescript\n * import { getDailyPackageDownloads } from 'query-registry';\n *\n * (async () => {\n * const downloads = await getDailyPackageDownloads({ name: 'query-registry', period: 'last-month' });\n *\n * // Output: 'query-registry'\n * console.log(downloads.package);\n *\n * // Output: 'number'\n * console.log(typeof downloads.downloads[0].downloads);\n * })();\n * ```\n *\n * @see {@link DailyPackageDownloads}\n * @see {@link DownloadPeriod}\n * @see {@link npmRegistryDownloadsAPI}\n * @see {@link https://github.com/npm/registry/blob/master/docs/download-counts.md#ranges}\n */\nexport async function getDailyPackageDownloads({\n name,\n period: rawDownloadPeriod,\n registryDownloadsAPI,\n cached,\n}: {\n name: string;\n period?: DownloadPeriod;\n registryDownloadsAPI?: string;\n cached?: boolean;\n}): Promise<DailyPackageDownloads> {\n assertValidPackageName({ name });\n\n const period = normalizeRawDownloadPeriod({ rawDownloadPeriod });\n const endpoint = `/downloads/range/${period}/${name}`;\n return fetchDownloadsFromRegistry({\n endpoint,\n registryDownloadsAPI,\n cached,\n });\n}\n","import { DownloadPeriod } from '../types/download-period';\nimport { DailyRegistryDownloads } from '../types/downloads';\nimport { fetchDownloadsFromRegistry } from '../utils/fetch-downloads-from-registry';\nimport { normalizeRawDownloadPeriod } from '../utils/normalize-download-period';\n\n/**\n * `getDailyRegistryDownloads` returns the number of downloads for all registry packages\n * for each day in a given time period.\n *\n * @param period - time period in which downloads happened (default: `last-week`)\n * @param registryDownloadsAPI - URL of the registry's downloads API (default: npm registry)\n * @param cached - accept cached responses (default: `true`)\n *\n * @example\n * Get the day by day weekly downloads for the npm registry:\n *\n * ```typescript\n * import { getDailyRegistryDownloads } from 'query-registry';\n *\n * (async () => {\n * const downloads = await getDailyRegistryDownloads();\n *\n * // Output: 'number'\n * console.log(typeof downloads.downloads[0].downloads);\n * })();\n * ```\n *\n * @example\n * Get the day by day monthly downloads for the npm registry:\n *\n * ```typescript\n * import { getDailyRegistryDownloads } from 'query-registry';\n *\n * (async () => {\n * const downloads = await getDailyRegistryDownloads({ period: 'last-month' });\n *\n * // Output: 'number'\n * console.log(typeof downloads.downloads[0].downloads);\n * })();\n * ```\n *\n * @see {@link DailyRegistryDownloads}\n * @see {@link DownloadPeriod}\n * @see {@link npmRegistryDownloadsAPI}\n * @see {@link https://github.com/npm/registry/blob/master/docs/download-counts.md#ranges}\n */\nexport async function getDailyRegistryDownloads({\n period: rawDownloadPeriod,\n registryDownloadsAPI,\n cached,\n}: {\n period?: DownloadPeriod;\n registryDownloadsAPI?: string;\n cached?: boolean;\n} = {}): Promise<DailyRegistryDownloads> {\n const period = normalizeRawDownloadPeriod({ rawDownloadPeriod });\n const endpoint = `/downloads/range/${period}`;\n return fetchDownloadsFromRegistry({\n endpoint,\n registryDownloadsAPI,\n cached,\n });\n}\n","import { DownloadPeriod } from '../types/download-period';\nimport { PackageDownloads } from '../types/downloads';\nimport { assertValidPackageName } from '../utils/assert-valid-package-name';\nimport { fetchDownloadsFromRegistry } from '../utils/fetch-downloads-from-registry';\nimport { normalizeRawDownloadPeriod } from '../utils/normalize-download-period';\n\n/**\n * `getPackageDownloads` returns the number of downloads for a package\n * in a given time period.\n *\n * @param name - package name\n * @param period - time period in which downloads happened (default: `last-week`)\n * @param registryDownloadsAPI - URL of the registry's downloads API (default: npm registry)\n * @param cached - accept cached responses (default: `true`)\n *\n * @example\n * Get the weekly downloads for package `query-registry` from the npm registry:\n *\n * ```typescript\n * import { getPackageDownloads } from 'query-registry';\n *\n * (async () => {\n * const downloads = await getPackageDownloads({ name: 'query-registry' });\n *\n * // Output: 'query-registry'\n * console.log(downloads.package);\n *\n * // Output: 'number'\n * console.log(typeof downloads.downloads);\n * })();\n * ```\n *\n * @example\n * Get the monthly downloads for package `query-registry` from the npm registry:\n *\n * ```typescript\n * import { getPackageDownloads } from 'query-registry';\n *\n * (async () => {\n * const downloads = await getPackageDownloads({ name: 'query-registry', period: 'last-month' });\n *\n * // Output: 'query-registry'\n * console.log(downloads.package);\n *\n * // Output: 'number'\n * console.log(typeof downloads.downloads);\n * })();\n * ```\n *\n * @see {@link PackageDownloads}\n * @see {@link DownloadPeriod}\n * @see {@link npmRegistryDownloadsAPI}\n * @see {@link https://github.com/npm/registry/blob/master/docs/download-counts.md#point-values}\n */\nexport async function getPackageDownloads({\n name,\n period: rawDownloadPeriod,\n registryDownloadsAPI,\n cached,\n}: {\n name: string;\n period?: DownloadPeriod;\n registryDownloadsAPI?: string;\n cached?: boolean;\n}): Promise<PackageDownloads> {\n assertValidPackageName({ name });\n\n const period = normalizeRawDownloadPeriod({ rawDownloadPeriod });\n const endpoint = `/downloads/point/${period}/${name}`;\n return fetchDownloadsFromRegistry({\n endpoint,\n registryDownloadsAPI,\n cached,\n });\n}\n","import { PackageManifest } from '../types/package-manifest';\nimport { extractRawPackageManifest } from '../utils/extract-package-manifest';\nimport { normalizeRawPackageManifest } from '../utils/normalize-raw-package-manifest';\nimport { getRawPackument } from './get-raw-packument';\n\n/**\n * `getPackageManifest` returns the manifest describing\n * a specific version of a package.\n *\n * @param name - package name\n * @param version - package version (default: `latest`)\n * @param registry - URL of the registry (default: npm registry)\n * @param mirrors - URLs of the registry mirrors (default: npm registry mirrors)\n * @param cached - accept cached responses (default: `true`)\n *\n * @example\n * Get the latest manifest for package `query-registry` from the npm registry:\n *\n * ```typescript\n * import { getPackageManifest } from 'query-registry';\n *\n * (async () => {\n * const manifest = await getPackageManifest({ name: 'query-registry' });\n *\n * // Output: 'query-registry'\n * console.log(manifest.name);\n * })();\n * ```\n *\n * @example\n * Get the manifest for package `query-registry@1.0.0` from the npm registry:\n *\n * ```typescript\n * import { getPackageManifest } from 'query-registry';\n *\n * (async () => {\n * const manifest = await getPackageManifest({ name: 'query-registry', version: '1.0.0' });\n *\n * // Output: 'query-registry'\n * console.log(manifest.name);\n *\n * // Output: '1.0.0'\n * console.log(manifest.version);\n * })();\n * ```\n *\n * @see {@link PackageManifest}\n * @see {@link RawPackageManifest}\n * @see {@link npmRegistry}\n * @see {@link npmRegistryMirrors}\n */\nexport async function getPackageManifest({\n name,\n version,\n registry,\n mirrors,\n cached,\n}: {\n name: string;\n version?: string;\n registry?: string;\n mirrors?: string[];\n cached?: boolean;\n}): Promise<PackageManifest> {\n const rawPackument = await getRawPackument({\n name,\n registry,\n mirrors,\n cached,\n });\n\n const rawPackageManifest = extractRawPackageManifest({\n rawPackument,\n version,\n });\n\n const packageManifest = await normalizeRawPackageManifest({\n rawPackageManifest,\n rawPackument,\n registry,\n mirrors,\n cached,\n });\n\n return packageManifest;\n}\n","import { PackageManifest } from '../types/package-manifest';\nimport { RawPackageManifest } from '../types/raw-package-manifest';\nimport { RawPackument } from '../types/raw-packument';\nimport { getDefinitelyTypedName } from './get-definitely-typed-name';\nimport { getUntypedName } from './get-untyped-name';\nimport { normalizeRawLicense } from './normalize-raw-license';\nimport { normalizeRawRepository } from './normalize-raw-repository';\n\nexport async function normalizeRawPackageManifest({\n rawPackageManifest,\n rawPackument,\n registry,\n mirrors,\n cached,\n}: {\n rawPackageManifest: RawPackageManifest;\n rawPackument: RawPackument;\n registry?: string;\n mirrors?: string[];\n cached?: boolean;\n}): Promise<PackageManifest> {\n const {\n _id: id,\n name,\n version,\n license: rawLicense,\n repository: rawRepository,\n _npmUser: publisher,\n } = rawPackageManifest;\n\n const createdAt = rawPackument.time[version]!;\n const license = normalizeRawLicense({ rawLicense });\n const gitRepository = normalizeRawRepository({ rawRepository });\n const definitelyTypedName = await getDefinitelyTypedName({\n rawPackageManifest,\n registry,\n mirrors,\n cached,\n });\n const untypedName = getUntypedName({ name });\n\n return {\n ...rawPackageManifest,\n id,\n createdAt,\n publisher,\n license,\n gitRepository,\n definitelyTypedName,\n untypedName,\n };\n}\n","import { getRawPackageManifest } from '../endpoints/get-raw-package-manifest';\nimport { RawPackageManifest } from '../types/raw-package-manifest';\n\nexport async function getDefinitelyTypedName({\n rawPackageManifest,\n registry,\n mirrors,\n cached,\n}: {\n rawPackageManifest: RawPackageManifest;\n registry?: string;\n mirrors?: string[];\n cached?: boolean;\n}): Promise<string | undefined> {\n const { name, types, typings } = rawPackageManifest;\n const definitelyTypedName = toDefinitelyTypedName({ name });\n const alreadyTyped = name === definitelyTypedName || !!types || !!typings;\n if (alreadyTyped) {\n return undefined;\n }\n\n let ok = false;\n try {\n const { deprecated } = await getRawPackageManifest({\n name: definitelyTypedName,\n registry,\n mirrors,\n cached,\n });\n ok = deprecated === undefined;\n } catch {}\n return ok ? definitelyTypedName : undefined;\n}\n\n/**\n * `toDefinitelyTypedName` returns the name of the corresponding\n * DefinitelyTyped package (for example,\n * `foo` => `@types/foo`,\n * `@bar/baz` => `@types/bar__baz`).\n */\nfunction toDefinitelyTypedName({ name }: { name: string }): string {\n return name.startsWith('@types/')\n ? name\n : `@types/${name.replace('@', '').replace('/', '__')}`;\n}\n","/**\n * `getUntypedName` returns the name of the normal package\n * corresponding to a DefinitelyTyped package.\n */\nexport function getUntypedName({ name }: { name: string }): string | undefined {\n if (!name.startsWith('@types/')) {\n return undefined;\n }\n\n // ['foo', undefined] or ['@bar', 'baz']\n const [scopeOrName, scopedName] = name.replace('@types/', '').split('__');\n\n return scopedName ? `@${scopeOrName}/${scopedName}` : scopeOrName;\n}\n","import { Packument } from '../types/packument';\nimport { normalizeRawPackument } from '../utils/normalize-raw-packument';\nimport { getRawPackument } from './get-raw-packument';\n\n/**\n * `getPackument` returns the packument (package document) containing\n * all the metadata about a package present on the registry.\n *\n * @param name - package name\n * @param registry - URL of the registry (default: npm registry)\n * @param mirrors - URLs of the registry mirrors (default: npm registry mirrors)\n * @param cached - accept cached responses (default: `true`)\n *\n * @example\n * Get the packument for package `query-registry` from the npm registry:\n *\n * ```typescript\n * import { getPackument } from 'query-registry';\n *\n * (async () => {\n * const packument = await getPackument({ name: 'query-registry' });\n *\n * // Output: 'query-registry'\n * console.log(packument.name);\n * })();\n * ```\n *\n * @see {@link Packument}\n * @see {@link RawPackument}\n * @see {@link npmRegistry}\n * @see {@link npmRegistryMirrors}\n */\nexport async function getPackument({\n name,\n registry,\n mirrors,\n cached,\n}: {\n name: string;\n registry?: string;\n mirrors?: string[];\n cached?: boolean;\n}): Promise<Packument> {\n const rawPackument = await getRawPackument({\n name,\n registry,\n mirrors,\n cached,\n });\n return normalizeRawPackument({ rawPackument });\n}\n","import { Packument } from '../types/packument';\nimport { RawPackument } from '../types/raw-packument';\nimport { normalizeRawLicense } from './normalize-raw-license';\nimport { normalizeRawRepository } from './normalize-raw-repository';\n\nexport function normalizeRawPackument({\n rawPackument,\n}: {\n rawPackument: RawPackument;\n}): Packument {\n const {\n _id: id,\n 'dist-tags': distTags,\n time,\n license: rawLicense,\n repository: rawRepository,\n } = rawPackument;\n const license = normalizeRawLicense({ rawLicense });\n const gitRepository = normalizeRawRepository({ rawRepository });\n const versionsToTimestamps = Object.fromEntries(\n Object.entries(time).filter(([key]) => {\n return !['created', 'modified'].includes(key);\n })\n );\n\n return {\n ...rawPackument,\n id,\n distTags,\n versionsToTimestamps,\n license,\n gitRepository,\n };\n}\n","import { DownloadPeriod } from '../types/download-period';\nimport { RegistryDownloads } from '../types/downloads';\nimport { fetchDownloadsFromRegistry } from '../utils/fetch-downloads-from-registry';\nimport { normalizeRawDownloadPeriod } from '../utils/normalize-download-period';\n\n/**\n * `getRegistryDownloads` returns the number of downloads for all registry packages\n * in a given time period.\n *\n * @param period - time period in which downloads happened (default: `last-week`)\n * @param registryDownloadsAPI - URL of the registry's downloads API (default: npm registry)\n * @param cached - accept cached responses (default: `true`)\n *\n * @example\n * Get the weekly downloads for the npm registry:\n *\n * ```typescript\n * import { getRegistryDownloads } from 'query-registry';\n *\n * (async () => {\n * const downloads = await getRegistryDownloads();\n *\n * // Output: 'number'\n * console.log(typeof downloads.downloads);\n * })();\n * ```\n *\n * @example\n * Get the monthly downloads for the npm registry:\n *\n * ```typescript\n * import { getRegistryDownloads } from 'query-registry';\n *\n * (async () => {\n * const downloads = await getRegistryDownloads({ period: 'last-month' });\n *\n * // Output: 'number'\n * console.log(typeof downloads.downloads);\n * })();\n * ```\n *\n * @see {@link RegistryDownloads}\n * @see {@link DownloadPeriod}\n * @see {@link npmRegistryDownloadsAPI}\n * @see {@link https://github.com/npm/registry/blob/master/docs/download-counts.md#point-values}\n */\nexport async function getRegistryDownloads({\n period: rawDownloadPeriod,\n registryDownloadsAPI,\n cached,\n}: {\n period?: DownloadPeriod;\n registryDownloadsAPI?: string;\n cached?: boolean;\n} = {}): Promise<RegistryDownloads> {\n const period = normalizeRawDownloadPeriod({ rawDownloadPeriod });\n const endpoint = `/downloads/point/${period}`;\n return fetchDownloadsFromRegistry({\n endpoint,\n registryDownloadsAPI,\n cached,\n });\n}\n","import { RegistryMetadata } from '../types/registry-metadata';\nimport { fetchFromRegistry } from '../utils/fetch-from-registry';\n\n/**\n * `getRegistryMetadata` returns the metadata describing the registry itself.\n *\n * @param registry - URL of the registry (default: npm registry)\n * @param cached - accept cached responses (default: `true`)\n *\n * @example\n * Get the metadata for the npm registry:\n *\n * ```typescript\n * import { getRegistryMetadata } from 'query-registry';\n *\n * (async () => {\n * const metadata = await getRegistryMetadata();\n *\n * // Output: 'registry'\n * console.log(metadata.db_name);\n * })();\n * ```\n *\n * @example\n * Get the metadata for a custom registry:\n *\n * ```typescript\n * import { getRegistryMetadata } from 'query-registry';\n *\n * (async () => {\n * const metadata = await getRegistryMetadata({ registry: 'https://example.com' });\n * })();\n * ```\n *\n * @see {@link RegistryMetadata}\n * @see {@link npmRegistry}\n */\nexport async function getRegistryMetadata({\n registry,\n cached,\n}: {\n registry?: string;\n cached?: boolean;\n} = {}): Promise<RegistryMetadata> {\n const endpoint = '/';\n return fetchFromRegistry({ registry, mirrors: [], endpoint, cached });\n}\n","import { SearchCriteria } from '../types/search-criteria';\nimport { SearchResults } from '../types/search-results';\nimport { fetchFromRegistry } from '../utils/fetch-from-registry';\nimport { normalizeRawSearchCriteria } from '../utils/normalize-raw-search-criteria';\n\n/**\n * `searchPackages` returns the packages corresponding to a given query.\n *\n * @param query - one or more search criteria\n * @param registry - URL of the registry (default: npm registry)\n * @param mirrors - URLs of the registry mirrors (default: npm registry mirrors)\n * @param cached - accept cached responses (default: `true`)\n *\n * @example\n * Get the search results for text query `query-registry` from the npm registry:\n *\n * ```typescript\n * import { searchPackages } from 'query-registry';\n *\n * (async () => {\n * const results = await searchPackages({ query: { text: 'query-registry' } });\n *\n * // Output: 'query-registry'\n * console.log(results.objects[0].package.name);\n * })();\n * ```\n *\n * @see {@link SearchResults}\n * @see {@link SearchCriteria}\n * @see {@link npmRegistry}\n * @see {@link npmRegistryMirrors}\n */\nexport async function searchPackages({\n query: rawSearchCriteria,\n registry,\n mirrors,\n cached,\n}: {\n query: SearchCriteria;\n registry?: string;\n mirrors?: string[];\n cached?: boolean;\n}): Promise<SearchResults> {\n const endpoint = '/-/v1/search';\n const query = normalizeRawSearchCriteria({ rawSearchCriteria });\n return fetchFromRegistry({ endpoint, query, registry, mirrors, cached });\n}\n","import { SearchCriteria } from '../types/search-criteria';\n\nexport function normalizeRawSearchCriteria({\n rawSearchCriteria,\n}: {\n rawSearchCriteria: SearchCriteria;\n}): string {\n // Convert SearchCriteria to a URL query string\n return Object.entries(rawSearchCriteria)\n .filter(([, value]) => ['string', 'number'].includes(typeof value))\n .map(([key, value]) => `${key}=${value}`)\n .join('&');\n}\n"],"names":["npmRegistryMirrors","FetchError","BaseError","constructor","url","response","statusText","InvalidPackageNameError","makeError","InvalidPackageVersionError","async","log","formatter","args","assertValidPackageName","name","validForOldPackages","validForNewPackages","validatePackageName","cache","lru","fetch","headers","cached","cacheKey","JSON","stringify","cachedJSON","get","unfetch","ok","json","set","fetchFromRegistry","endpoint","query","registry","mirrors","urls","map","host","URL","search","href","lastError","err","getRawAbbreviatedPackument","Accept","fetchDownloadsFromRegistry","registryDownloadsAPI","normalizeRawDownloadPeriod","rawDownloadPeriod","Date","getDay","start","end","date","toISOString","split","extractRawPackageManifest","rawPackument","version","distTags","versions","manifest","getRawPackument","getRawPackageManifest","normalizeRawLicense","rawLicense","normalizeRawRepository","rawRepository","includes","isRepository","normalizeRepository","directory","repositoryDir","info","gitUrlParse","parseGitURL","source","full_name","repositoryID","filepath","type","replace","undefined","rawAbbreviatedPackument","id","modified","modifiedAt","normalizeRawAbbreviatedPackument","period","rawPackageManifest","_id","license","repository","_npmUser","publisher","createdAt","time","gitRepository","definitelyTypedName","types","typings","startsWith","toDefinitelyTypedName","deprecated","getDefinitelyTypedName","untypedName","scopeOrName","scopedName","getUntypedName","normalizeRawPackageManifest","versionsToTimestamps","Object","fromEntries","entries","filter","key","normalizeRawPackument","rawSearchCriteria","value","join","normalizeRawSearchCriteria"],"mappings":"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"}
\No newline at end of file