UNPKG

47.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';\nimport urlJoin from 'url-join';\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((base) =>\n urlJoin(base, endpoint, query ? `?${query}` : '')\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 urlJoin from 'url-join';\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 } = rawRepository;\n\n const parsedUrl = parseGitURL({ url });\n if (!parsedUrl) {\n return undefined;\n }\n\n return {\n type: 'git',\n url: parsedUrl,\n directory,\n };\n}\n\nfunction parseGitURL({ url }: { url: string }): string | undefined {\n const urlWithProtocol = url.includes(':')\n ? // A normal URL or a shortcut like `github:user/repository`\n url\n : // The short form github shortcut `user/repository`\n url.includes('/')\n ? `github:${url}`\n : // Not a URL\n '';\n try {\n const { protocol, hostname, pathname } = new URL(urlWithProtocol);\n const cleanPathname = pathname.replace(/\\.git$/, '');\n if (protocol === 'github:' || hostname === 'github.com') {\n return urlJoin('https://github.com', cleanPathname);\n }\n if (protocol === 'gist:' || hostname === 'gist.github.com') {\n return urlJoin('https://gist.github.com', cleanPathname);\n }\n if (protocol === 'bitbucket:' || hostname === 'bitbucket.org') {\n return urlJoin('https://bitbucket.org', cleanPathname);\n }\n if (protocol === 'gitlab:' || hostname === 'gitlab.com') {\n return urlJoin('https://gitlab.com', cleanPathname);\n }\n return urlWithProtocol;\n } catch {\n return undefined;\n }\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","super","statusText","this","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","base","urlJoin","lastError","err","getRawAbbreviatedPackument","Accept","fetchDownloadsFromRegistry","registryDownloadsAPI","normalizeRawDownloadPeriod","rawDownloadPeriod","Date","getDay","start","end","date","toISOString","split","extractRawPackageManifest","rawPackument","version","_distTags$version","distTags","versions","manifest","getRawPackument","getRawPackageManifest","normalizeRawLicense","rawLicense","normalizeRawRepository","rawRepository","includes","isRepository","normalizeRepository","directory","parsedUrl","urlWithProtocol","protocol","hostname","pathname","URL","cleanPathname","replace","parseGitURL","type","rawAbbreviatedPackument","id","modified","modifiedAt","normalizeRawAbbreviatedPackument","period","rawPackageManifest","_id","license","repository","_npmUser","publisher","createdAt","time","gitRepository","definitelyTypedName","types","typings","startsWith","toDefinitelyTypedName","deprecated","undefined","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