UNPKG

54.9 kBSource Map (JSON)View Raw
1{"version":3,"file":"query-registry.cjs.development.js","sources":["../src/data/registries.ts","../src/utils/normalize-raw-abbreviated-packument.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/endpoints/get-abbreviated-packument.ts","../src/utils/fetch-downloads-from-registry.ts","../src/utils/normalize-download-period.ts","../src/endpoints/get-daily-package-downloads.ts","../src/endpoints/get-daily-registry-downloads.ts","../src/endpoints/get-package-downloads.ts","../src/utils/extract-package-manifest.ts","../src/endpoints/get-raw-packument.ts","../src/endpoints/get-raw-package-manifest.ts","../src/utils/get-definitely-typed-name.ts","../src/utils/get-untyped-name.ts","../src/utils/normalize-raw-license.ts","../src/utils/normalize-raw-repository.ts","../src/utils/normalize-raw-package-manifest.ts","../src/endpoints/get-package-manifest.ts","../src/utils/normalize-raw-packument.ts","../src/endpoints/get-packument.ts","../src/endpoints/get-registry-downloads.ts","../src/endpoints/get-registry-metadata.ts","../src/utils/normalize-raw-search-criteria.ts","../src/endpoints/search-packages.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 { 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 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 { 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 { 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 { 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 { 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","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","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 { resource, full_name: repositoryID, filepath } = info;\n\n // Add domain to sources derived from npm-style shortcuts\n const host = resource\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 { 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 { 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 { 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 { 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 { 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';\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","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"],"names":["npmRegistry","cloudflareRegistry","yarnRegistry","npmRegistryMirrors","npmRegistryDownloadsAPI","normalizeRawAbbreviatedPackument","rawAbbreviatedPackument","distTags","name","id","modified","modifiedAt","FetchError","BaseError","constructor","url","response","statusText","InvalidPackageNameError","makeError","InvalidPackageVersionError","log","formatter","args","debug","logger","assertValidPackageName","validForOldPackages","validForNewPackages","validatePackageName","valid","maxItems","fiveMinutesTTL","cache","lru","fetch","headers","cached","cacheKey","JSON","stringify","cachedJSON","get","unfetch","ok","status","json","set","fetchFromRegistry","endpoint","query","registry","mirrors","urls","map","base","urlJoin","lastError","err","getRawAbbreviatedPackument","Accept","getAbbreviatedPackument","fetchDownloadsFromRegistry","registryDownloadsAPI","normalizeRawDownloadPeriod","rawDownloadPeriod","Date","getDay","start","end","date","toISOString","split","getDailyPackageDownloads","period","getDailyRegistryDownloads","getPackageDownloads","extractRawPackageManifest","rawPackument","version","versions","versionNumber","manifest","getRawPackument","getRawPackageManifest","getDefinitelyTypedName","rawPackageManifest","types","typings","definitelyTypedName","toDefinitelyTypedName","alreadyTyped","undefined","deprecated","startsWith","replace","getUntypedName","scopeOrName","scopedName","normalizeRawLicense","rawLicense","normalizeRawRepository","rawRepository","isRepository","normalizeRepository","includes","directory","repositoryDir","info","parseGitURL","resource","full_name","repositoryID","filepath","host","parsedDir","type","gitUrlParse","normalizeRawPackageManifest","_id","license","repository","_npmUser","publisher","createdAt","time","gitRepository","untypedName","getPackageManifest","packageManifest","normalizeRawPackument","versionsToTimestamps","Object","fromEntries","entries","filter","key","getPackument","getRegistryDownloads","getRegistryMetadata","normalizeRawSearchCriteria","rawSearchCriteria","value","join","searchPackages"],"mappings":"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"}
\No newline at end of file