import type {PackageJson} from 'type-fest'; type Person = Readonly; type PersonObject = Exclude; // eslint-disable-next-line unicorn/prevent-abbreviations type Dist = Readonly<{ /** The URL of the tarball containing the payload for the package. */ tarball: string; /** The SHA-1 sum of the tarball. */ shasum: string; /** A string in the format `-`. Refer to the {@link https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity Subresource Integrity} docs on MDN and the {@link https://github.com/npm/cacache#integrity `cacache`} package for more information. @since April 2017 */ integrity?: string; /** The number of files in the tarball, folder excluded. @since February 2018 */ fileCount?: number; /** The total bytes of the unpacked files in the tarball. @since February 2018 */ unpackedSize?: number; /** A PGP signature in the format `@:`. @since April 2018 @deprecated April 2023, see https://docs.npmjs.com/about-registry-signatures */ 'npm-signature'?: string; /** ECDSA signature(s). @see https://docs.npmjs.com/about-registry-signatures @since April 2023 */ signatures?: Array<{ /** A SHA-256 public key. */ keyid: string; sig: string; }>; }>; type AbbreviatedVersionPackageJsonFields = ( | 'dependencies' | 'optionalDependencies' | 'devDependencies' | 'bundleDependencies' | 'peerDependencies' | 'peerDependenciesMeta' | 'bin' | 'directories' | 'engines' | 'cpu' | 'os' | 'funding' ); type AbbreviatedVersion = Readonly<{ /** The name of the package. */ name: string; /** Package version, parseable by [`node-semver`](https://github.com/npm/node-semver). */ version: string; dist: Dist; /** The deprecation warnings message of this version. A version is deprecated if this field is set. */ deprecated?: string; /** Whether or not this version has a shrinkwrap used to install it. If this field is `undefined`, the client must determine through other means if a shrinkwrap exists. */ _hasShrinkwrap?: boolean; /** Whether or not this version has an `install` script. */ hasInstallScript?: boolean; }> & Pick, AbbreviatedVersionPackageJsonFields>; // eslint-disable-next-line unicorn/prevent-abbreviations type DistTags = { [tagName: string]: string; latest: string; }; type AbbreviatedMetadata = Readonly<{ /** The name of the package. */ name: string; /** An {@link https://en.wikipedia.org/wiki/ISO_8601#Combined_date_and_time_representations ISO timestamp} of the last time the package was modified. */ modified: string; 'dist-tags': DistTags; versions: Record; }>; type Repository = Readonly>; type HoistedPackageJsonFields = ( | 'author' | 'bugs' | 'contributors' | 'description' | 'homepage' | 'keywords' | 'license' ); // Hoisted from latest version type HoistedData = Readonly<{ /** People with permission to publish the package. Not authoritative but informational. */ maintainers?: PersonObject[]; repository?: Repository; }> & Pick, HoistedPackageJsonFields>; type FullVersion = Readonly<{ /** `package@version` */ _id: string; _shasum: string; _from: string; /** The version of npm used to publish the package. */ _npmVersion: string; /** The version of Node.js used to publish the package. */ _nodeVersion: string; /** The npm user who published this version. */ _npmUser: PersonObject; licenseText?: string; gitHead?: string; }> & Readonly> & Omit & HoistedData; type FullMetadata = Readonly<{ /** The name of the package, used as an ID in CouchDB. */ _id: string; /** The revision number of this version of the document in CouchDB. */ _rev: string; /** A mapping of versions to the time they were published. Each value is an {@link https://en.wikipedia.org/wiki/ISO_8601#Combined_date_and_time_representations ISO timestamp}. */ time: { [version: string]: string; /** When the package was created. */ created: string; /** When the package was last modified. */ modified: string; }; /** NPM users who have starred the package. */ users?: Readonly>; versions: Readonly>; }> & AbbreviatedMetadata & HoistedData; /** The error thrown when the given package version cannot be found. */ export class VersionNotFoundError extends Error { readonly name: 'VersionNotFoundError'; constructor(packageName: string, version: string); } /** The error thrown when the given package name cannot be found. */ export class PackageNotFoundError extends Error { readonly name: 'PackageNotFoundError'; constructor(packageName: string); } export type Options = Readonly<{ /** Package version such as `1.0.0` or a [dist tag](https://docs.npmjs.com/cli/dist-tag) such as `latest`. The version can also be in any format supported by the [semver](https://github.com/npm/node-semver) module. For example: - `1` - Get the latest `1.x.x` - `1.2` - Get the latest `1.2.x` - `^1.2.3` - Get the latest `1.x.x` but at least `1.2.3` - `~1.2.3` - Get the latest `1.2.x` but at least `1.2.3` @default 'latest' */ version?: string; /** By default, only an abbreviated metadata object is returned for performance reasons. [Read more.](https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md) @default false */ fullMetadata?: boolean; /** Return the [main entry](https://registry.npmjs.org/ava) containing all versions. @default false */ allVersions?: boolean; /** The registry URL is by default inferred from the npm defaults and `.npmrc`. This is beneficial as `package-json` and any project using it will work just like npm. This option is*only** intended for internal tools. You should __not__ use this option in reusable packages. Prefer just using `.npmrc` whenever possible. */ registryUrl?: string; /** Whether or not to omit deprecated versions of a package. If set, versions marked as deprecated on the registry are omitted from results. Providing a dist tag or a specific version will still return that version, even if it's deprecated. If no version can be found once deprecated versions are omitted, a `VersionNotFoundError` is thrown. @default true */ omitDeprecated?: boolean; }>; /** Get metadata of a package from the npm registry. @param packageName - Name of the package. @example ``` import packageJson from 'package-json'; console.log(await packageJson('ava')); //=> {name: 'ava', …} // Also works with scoped packages console.log(await packageJson('@sindresorhus/df')); ``` */ export default function packageJson(packageName: string, options?: ProvidedOptions): Promise<( ProvidedOptions extends {fullMetadata: true} ? ProvidedOptions extends {allVersions: true} ? FullMetadata : FullVersion & Pick : ProvidedOptions extends {allVersions: true} ? AbbreviatedMetadata : AbbreviatedVersion )>;