Files
pnpm/testing/temp-store/src/index.ts
Marvin Hagemeister 49e6074644 test: replace @pnpm/registry-mock with an in-repo in-process registry (#11927)
Replace the external `@pnpm/registry-mock` (Verdaccio) test dependency with an in-repo, in-process registry that serves package fixtures to **both** the pacquet Rust tests and the pnpm CLI (Jest) tests. No separately managed registry process is needed.

### How it works

- **Fixtures** live at `registry/.fixtures/packages/<name>/<version>/…`, moved verbatim from [`pnpm/registry-mock`](https://github.com/pnpm/registry-mock) (keyed by each `package.json`'s `name`+`version`).
- **`pnpm-registry-fixtures`** builds verdaccio-shaped storage from those fixtures; the in-tree **`pnpm-registry`** crate serves it.
  - Files whose names differ only by case (`@pnpm.e2e/with-same-file-in-different-cases`) and `bundleDependencies` trees are composed **in memory** by the builder, since neither can be committed to the working tree.
- **pacquet**: `pacquet-testing-utils`' `TestRegistry` starts the server lazily (once per process) in proxy mode, serving `@pnpm.e2e` fixtures locally and falling through to the npm uplink for real packages (`is-positive`, `is-negative`, …) — matching how registry-mock behaved.
- **pnpm CLI**: the `with-registry` Jest `globalSetup` builds storage from the fixtures via the new `pnpm-registry-prepare` binary (built from source in the Test CI job) and serves it with `pnpm-registry`. `REGISTRY_MOCK_PORT` / `REGISTRY_MOCK_CREDENTIALS` / `getIntegrity` now come from `@pnpm/testing.registry-mock`.

### Result

`@pnpm/registry-mock` is removed from every manifest, the catalog, and `packageExtensions`; `cargo test` / `cargo nextest run` / `just test` and the pnpm CLI Jest suites all run registry-backed tests without launching Verdaccio.
2026-05-29 14:35:45 +02:00

66 lines
1.9 KiB
TypeScript

import * as path from 'node:path'
import { type ClientOptions, createClient } from '@pnpm/installing.client'
import type { ResolutionVerifier } from '@pnpm/resolving.resolver-base'
import { createPackageStore, type CreatePackageStoreOptions } from '@pnpm/store.controller'
import type { StoreController } from '@pnpm/store.controller-types'
import { StoreIndex } from '@pnpm/store.index'
import { REGISTRY_MOCK_PORT } from '@pnpm/testing.registry-mock'
const registry = `http://localhost:${REGISTRY_MOCK_PORT}/`
export interface CreateTempStoreResult {
storeController: StoreController
storeDir: string
cacheDir: string
resolutionVerifiers: ResolutionVerifier[]
}
export function createTempStore (opts?: {
fastUnpack?: boolean
storeDir?: string
clientOptions?: Partial<ClientOptions>
storeOptions?: CreatePackageStoreOptions
}): CreateTempStoreResult {
const configByUri: ClientOptions['configByUri'] = {}
const cacheDir = path.resolve('cache')
const storeDir = opts?.storeDir ?? path.resolve('.store')
const storeIndex = new StoreIndex(storeDir)
const { resolve, fetchers, clearResolutionCache, resolutionVerifiers } = createClient({
configByUri,
retry: {
retries: 4,
factor: 10,
maxTimeout: 60_000,
minTimeout: 10_000,
},
cacheDir,
storeDir,
storeIndex,
registries: {
default: registry,
},
...opts?.clientOptions,
})
const storeController = createPackageStore(
resolve,
fetchers,
{
cacheDir,
ignoreFile: opts?.fastUnpack === false ? undefined : (filename) => filename !== 'package.json',
storeDir,
storeIndex,
verifyStoreIntegrity: true,
virtualStoreDirMaxLength: process.platform === 'win32' ? 60 : 120,
clearResolutionCache,
...opts?.storeOptions,
}
)
return {
storeController,
storeDir,
cacheDir,
resolutionVerifiers,
}
}