@types/pacote
Version:
TypeScript definitions for pacote
345 lines (318 loc) • 11.3 kB
TypeScript
/// <reference types="node" />
import npmFetch = require("npm-registry-fetch");
import { Logger } from "npmlog";
import { Integrity } from "ssri";
import { Transform } from "stream";
export interface PackageDist {
/**
* The url to the associated package artifact. (Copied by Pacote to
* `manifest._resolved`.)
*/
tarball: string;
/**
* The integrity SRI string for the artifact. This may not be present for
* older packages on the npm registry. (Copied by Pacote to
* `manifest._integrity`.)
*/
integrity?: string | undefined;
/**
* Legacy integrity value. Hexadecimal-encoded sha1 hash. (Converted to an
* SRI string and copied by Pacote to `manifest._integrity` when
* `dist.integrity` is not present.)
*/
shasum?: string | undefined;
/**
* Number of files in the tarball.
*/
fileCount?: number | undefined;
/**
* Size on disk of the package when unpacked.
*/
unpackedSize?: number | undefined;
/**
* A signature of the package by the
* [`npmregistry`](https://keybase.io/npmregistry) Keybase account.
* (Obviously only present for packages published to
* https://registry.npmjs.org.)
*/
"npm-signature"?: string | undefined;
}
export interface Person {
name: string;
email?: string | undefined;
url?: string | undefined;
}
/**
* Properties that can appear on both packuments and manifests. These usually
* only appear when requesting with `fullMetadata = true`.
*/
export interface CommonMetadata {
author?: Person | undefined;
bugs?: {
url?: string | undefined;
email?: string | undefined;
} | undefined;
contributors?: Person[] | undefined;
homepage?: string | undefined;
keywords?: string[] | undefined;
license?: string | undefined;
maintainers: Person[];
readme?: string | undefined;
readmeFilename?: string | undefined;
repository?: {
type?: string | undefined;
url?: string | undefined;
directory?: string | undefined;
} | undefined;
users?: Record<string, boolean> | undefined;
}
/**
* A `manifest` is similar to a `package.json` file. However, it has a few
* pieces of extra metadata, and sometimes lacks metadata that is inessential to
* package installation.
*/
export interface Manifest extends CommonMetadata {
name: string;
version: string;
dist: PackageDist;
// These properties usually appear in all requests.
dependencies?: Record<string, string> | undefined;
optionalDependencies?: Record<string, string> | undefined;
devDependencies?: Record<string, string> | undefined;
peerDependencies?: Record<string, string> | undefined;
bundledDependencies?: false | string[] | undefined;
bin?: Record<string, string> | undefined;
directories?: Record<string, string> | undefined;
engines?: Record<string, string> | undefined;
// These properties usually only appear when fullMetadata = true.
browser?: string | undefined;
config?: Record<string, unknown> | undefined;
cpu?: string[] | undefined;
description?: string | undefined;
files?: string[] | undefined;
main?: string | undefined;
man?: string | string[] | undefined;
os?: string[] | undefined;
publishConfig?: Record<string, unknown> | undefined;
scripts?: Record<string, string> | undefined;
_id: string;
_nodeVersion: string;
_npmVersion: string;
_npmUser: Person;
// Non-standard properties from package.json may also appear.
[key: string]: unknown;
}
export type AbbreviatedManifest = Pick<
Manifest,
| "name"
| "version"
| "bin"
| "directories"
| "dependencies"
| "devDependencies"
| "peerDependencies"
| "bundledDependencies"
| "optionalDependencies"
| "engines"
| "dist"
| "deprecated"
>;
/**
* A packument is the top-level package document that lists the set of manifests
* for available versions for a package.
*
* When a packument is fetched with `accept: application/vnd.npm.install-v1+json`
* in the HTTP headers, only the most minimum necessary metadata is returned.
* Additional metadata is returned when fetched with only `accept: application/json`.
*/
export interface Packument extends CommonMetadata {
name: string;
/**
* An object where each key is a version, and each value is the manifest for
* that version.
*/
versions: Record<string, Manifest>;
/**
* An object mapping dist-tags to version numbers. This is how `foo@latest`
* gets turned into `foo@1.2.3`.
*/
"dist-tags": { latest: string } & Record<string, string>;
/**
* In the full packument, an object mapping version numbers to publication
* times, for the `opts.before` functionality.
*/
time: Record<string, string> & {
created: string;
modified: string;
};
}
export type AbbreviatedPackument = {
versions: Record<string, AbbreviatedManifest>;
} & Pick<Packument, "name" | "dist-tags">;
export interface FetchResult {
/**
* A normalized form of the spec passed in as an argument.
*/
from: string;
/**
* The tarball url or file path where the package artifact can be found.
*/
resolved: string;
/**
* The integrity value for the package artifact.
*/
integrity: string;
}
export interface ManifestResult {
/**
* A normalized form of the spec passed in as an argument.
*/
_from: string;
/**
* The tarball url or file path where the package artifact can be found.
*/
_resolved: string;
/**
* The integrity value for the package artifact.
*/
_integrity: string;
/**
* The canonical spec of this package version: name@version.
*/
_id: string;
}
export interface PackumentResult {
/**
* The size of the packument.
*/
_contentLength: number;
}
export interface PacoteOptions {
/**
* Where to store cache entries and temp files. Passed to
* [`cacache`](http://npm.im/cacache). Defaults to the same cache directory
* that npm will use by default, based on platform and environment.
*/
cache?: string | undefined;
/**
* Base folder for resolving relative `file:` dependencies.
*/
where?: string | undefined;
/**
* Shortcut for looking up resolved values. Should be specified if known.
*/
resolved?: string | undefined;
/**
* Expected integrity of fetched package tarball. If specified, tarballs
* with mismatched integrity values will raise an `EINTEGRITY` error.
*/
integrity?: string | Integrity | undefined;
/**
* Permission mode mask for extracted files and directories. Defaults to
* `0o22`.
*/
umask?: number | undefined;
/**
* Minimum permission mode for extracted files. Defaults to `0o666`.
*/
fmode?: number | undefined;
/**
* Minimum permission mode for extracted directories. Defaults to `0o777`.
*/
dmode?: number | undefined;
/**
* A logger object with methods for various log levels. Typically, this will
* be [`npmlog`](http://npm.im/npmlog) in the npm CLI use case, but if not
* specified, the default is a logger that emits 'log' events on the process
* object.
*/
log?: Logger | undefined;
/**
* Prefer to revalidate cache entries, even when it would not be strictly
* necessary. Default `false`.
*/
preferOnline?: boolean | undefined;
/**
* When picking a manifest from a packument, only consider packages
* published before the specified date. Default `null`.
*/
before?: Date | null | undefined;
/**
* The default `dist-tag` to use when choosing a manifest from a packument.
* Defaults to `latest`.
*/
defaultTag?: string | undefined;
/**
* The npm registry to use by default. Defaults to
* `https://registry.npmjs.org/`.
*/
registry?: string | undefined;
/**
* Fetch the full metadata from the registry for packuments, including
* information not strictly required for installation (author, description,
* etc.) Defaults to `true` when `before` is set, since the version publish
* time is part of the extended packument metadata.
*/
fullMetadata?: boolean | undefined;
/**
* you usually don't want to fetch the same packument multiple times in
* the span of a given script or command, no matter how many pacote calls
* are made, so this lets us avoid doing that. It's only relevant for
* registry fetchers, because other types simulate their packument from
* the manifest, which they memoize on this.package, so it's very cheap
* already.
*/
packumentCache?: Map<string, Packument> | undefined;
}
export type Options = PacoteOptions & npmFetch.Options;
/**
* Resolve a specifier like `foo@latest` or `github:user/project` all the way to
* a tarball url, tarball file, or git repo with commit hash.
*/
export function resolve(spec: string, opts?: Options): Promise<string>;
/**
* Extract a package's tarball into a destination folder. Returns a promise that
* resolves to the `{from,integrity,resolved}` of the extracted package.
*/
export function extract(spec: string, dest?: string, opts?: Options): Promise<FetchResult>;
/**
* Fetch (or simulate) a package's manifest (basically, the `package.json` file,
* plus a bit of metadata).
*/
export function manifest(
spec: string,
opts: Options & ({ before: Date } | { fullMetadata: true }),
): Promise<Manifest & ManifestResult>;
export function manifest(spec: string, opts?: Options): Promise<AbbreviatedManifest & ManifestResult>;
/**
* Fetch (or simulate) a package's packument (basically, the top-level package
* document listing all the manifests that the registry returns).
*/
export function packument(spec: string, opts: Options & { fullMetadata: true }): Promise<Packument & PackumentResult>;
export function packument(spec: string, opts?: Options): Promise<AbbreviatedPackument & PackumentResult>;
/**
* Get a package tarball data as a buffer in memory.
*/
export function tarball(spec: string, opts?: Options): Promise<Buffer & FetchResult>;
export namespace tarball {
/**
* Save a package tarball data to a file on disk.
*/
function file(spec: string, dest: string, opts?: Options): Promise<FetchResult>;
/**
* Fetch a tarball and make the stream available to the streamHandler
* function.
*
* This is mostly an internal function, but it is exposed because it does
* provide some functionality that may be difficult to achieve otherwise.
*
* The `streamHandler` function MUST return a Promise that resolves when the
* stream (and all associated work) is ended, or rejects if the stream has
* an error.
*
* The `streamHandler` function MAY be called multiple times, as Pacote
* retries requests in some scenarios, such as cache corruption or retriable
* network failures.
*/
function stream<T>(spec: string, streamHandler: (stream: Transform) => Promise<T>, opts?: Options): Promise<T>;
}