test: create a helper package for creating a temp store for testing (#9343)

This commit is contained in:
Zoltan Kochan
2025-03-28 09:21:29 +01:00
committed by GitHub
parent 79c4466e79
commit a54d3adbd5
17 changed files with 222 additions and 99 deletions

View File

@@ -0,0 +1,5 @@
---
"@pnpm/testing.temp-store": major
---
Initial release.

View File

@@ -0,0 +1,5 @@
---
"@pnpm/package-store": minor
---
Export `CreatePackageStoreOptions`.

View File

@@ -124,12 +124,10 @@
"devDependencies": {
"@pnpm/assert-project": "workspace:*",
"@pnpm/assert-store": "workspace:*",
"@pnpm/client": "workspace:*",
"@pnpm/core": "workspace:*",
"@pnpm/git-utils": "workspace:*",
"@pnpm/lockfile.types": "workspace:*",
"@pnpm/logger": "workspace:*",
"@pnpm/package-store": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/read-package-json": "workspace:*",
"@pnpm/registry-mock": "catalog:",
@@ -137,6 +135,7 @@
"@pnpm/store.cafs": "workspace:*",
"@pnpm/test-fixtures": "workspace:*",
"@pnpm/test-ipc-server": "workspace:*",
"@pnpm/testing.temp-store": "workspace:*",
"@types/fs-extra": "catalog:",
"@types/is-windows": "catalog:",
"@types/normalize-path": "catalog:",

View File

@@ -1,6 +1,4 @@
import * as path from 'path'
import { createClient } from '@pnpm/client'
import { createPackageStore } from '@pnpm/package-store'
import { createTempStore } from '@pnpm/testing.temp-store'
import { REGISTRY_MOCK_PORT } from '@pnpm/registry-mock'
import { type StoreController } from '@pnpm/store-controller-types'
import { type Registries } from '@pnpm/types'
@@ -8,13 +6,6 @@ import { type InstallOptions } from '@pnpm/core'
const registry = `http://localhost:${REGISTRY_MOCK_PORT}/`
const retryOpts = {
retries: 4,
retryFactor: 10,
retryMaxtimeout: 60_000,
retryMintimeout: 10_000,
}
export function testDefaults<T> (
opts?: T & {
fastUnpack?: boolean
@@ -32,28 +23,14 @@ export function testDefaults<T> (
storeDir: string
} &
T {
const authConfig = { registry }
const cacheDir = path.resolve('cache')
const { resolve, fetchers, clearResolutionCache } = createClient({
authConfig,
rawConfig: {},
retry: retryOpts,
cacheDir,
...resolveOpts,
...fetchOpts,
const { storeController, storeDir, cacheDir } = createTempStore({
...opts,
clientOptions: {
...resolveOpts,
...fetchOpts,
},
storeOptions: storeOpts,
})
const storeDir = opts?.storeDir ?? path.resolve('.store')
const storeController = createPackageStore(
resolve,
fetchers,
{
ignoreFile: opts?.fastUnpack === false ? undefined : (filename) => filename !== 'package.json',
storeDir,
verifyStoreIntegrity: true,
clearResolutionCache,
...storeOpts,
}
)
const result = {
cacheDir,
neverBuiltDependencies: [] as string[],

View File

@@ -144,9 +144,6 @@
{
"path": "../../store/cafs"
},
{
"path": "../../store/package-store"
},
{
"path": "../../store/store-controller-types"
},
@@ -154,10 +151,10 @@
"path": "../../store/store-path"
},
{
"path": "../../worker"
"path": "../../testing/temp-store"
},
{
"path": "../client"
"path": "../../worker"
},
{
"path": "../direct-dep-linker"

View File

@@ -78,11 +78,9 @@
},
"devDependencies": {
"@pnpm/assert-project": "workspace:*",
"@pnpm/client": "workspace:*",
"@pnpm/crypto.object-hasher": "workspace:*",
"@pnpm/headless": "workspace:*",
"@pnpm/logger": "workspace:*",
"@pnpm/package-store": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/read-projects-context": "workspace:*",
"@pnpm/registry-mock": "catalog:",
@@ -90,6 +88,7 @@
"@pnpm/store.cafs": "workspace:*",
"@pnpm/test-fixtures": "workspace:*",
"@pnpm/test-ipc-server": "workspace:*",
"@pnpm/testing.temp-store": "workspace:*",
"@types/fs-extra": "catalog:",
"@types/ramda": "catalog:",
"@types/rimraf": "catalog:",

View File

@@ -1,22 +1,14 @@
import path from 'path'
import { createClient } from '@pnpm/client'
import { type HeadlessOptions } from '@pnpm/headless'
import { createPackageStore } from '@pnpm/package-store'
import { safeReadPackageJsonFromDir } from '@pnpm/read-package-json'
import { readProjectsContext } from '@pnpm/read-projects-context'
import { REGISTRY_MOCK_PORT } from '@pnpm/registry-mock'
import { getStorePath } from '@pnpm/store-path'
import { createTempStore } from '@pnpm/testing.temp-store'
import tempy from 'tempy'
const registry = `http://localhost:${REGISTRY_MOCK_PORT}/`
const retryOpts = {
factor: 10,
retries: 2,
retryMaxtimeout: 60_000,
retryMintimeout: 10_000,
}
export async function testDefaults (
opts?: any, // eslint-disable-line
resolveOpts?: any, // eslint-disable-line
@@ -25,7 +17,6 @@ export async function testDefaults (
): Promise<HeadlessOptions> {
const tmp = tempy.directory()
let storeDir = opts?.storeDir ?? path.join(tmp, 'store')
const cacheDir = path.join(tmp, 'cache')
const lockfileDir = opts?.lockfileDir ?? process.cwd()
const { include, pendingBuilds, projects } = await readProjectsContext(
opts.projects
@@ -42,22 +33,14 @@ export async function testDefaults (
storePath: storeDir,
pnpmHomeDir: '',
})
const authConfig = { registry }
const { resolve, fetchers, clearResolutionCache } = createClient({
authConfig,
rawConfig: {},
retry: retryOpts,
cacheDir,
...resolveOpts,
...fetchOpts,
})
const storeController = createPackageStore(
resolve,
fetchers,
const { storeController } = createTempStore(
{
storeDir,
clearResolutionCache,
...storeOpts,
clientOptions: {
...resolveOpts,
...fetchOpts,
},
storeOptions: storeOpts,
}
)
return {

View File

@@ -84,9 +84,6 @@
{
"path": "../../store/cafs"
},
{
"path": "../../store/package-store"
},
{
"path": "../../store/store-controller-types"
},
@@ -94,10 +91,10 @@
"path": "../../store/store-path"
},
{
"path": "../../worker"
"path": "../../testing/temp-store"
},
{
"path": "../client"
"path": "../../worker"
},
{
"path": "../direct-dep-linker"

37
pnpm-lock.yaml generated
View File

@@ -4614,9 +4614,6 @@ importers:
'@pnpm/assert-store':
specifier: workspace:*
version: link:../../__utils__/assert-store
'@pnpm/client':
specifier: workspace:*
version: link:../client
'@pnpm/core':
specifier: workspace:*
version: 'link:'
@@ -4629,9 +4626,6 @@ importers:
'@pnpm/logger':
specifier: workspace:*
version: link:../../packages/logger
'@pnpm/package-store':
specifier: workspace:*
version: link:../../store/package-store
'@pnpm/prepare':
specifier: workspace:*
version: link:../../__utils__/prepare
@@ -4653,6 +4647,9 @@ importers:
'@pnpm/test-ipc-server':
specifier: workspace:*
version: link:../../__utils__/test-ipc-server
'@pnpm/testing.temp-store':
specifier: workspace:*
version: link:../../testing/temp-store
'@types/fs-extra':
specifier: 'catalog:'
version: 9.0.13
@@ -4893,9 +4890,6 @@ importers:
'@pnpm/assert-project':
specifier: workspace:*
version: link:../../__utils__/assert-project
'@pnpm/client':
specifier: workspace:*
version: link:../client
'@pnpm/crypto.object-hasher':
specifier: workspace:*
version: link:../../crypto/object-hasher
@@ -4905,9 +4899,6 @@ importers:
'@pnpm/logger':
specifier: workspace:*
version: link:../../packages/logger
'@pnpm/package-store':
specifier: workspace:*
version: link:../../store/package-store
'@pnpm/prepare':
specifier: workspace:*
version: link:../../__utils__/prepare
@@ -4929,6 +4920,9 @@ importers:
'@pnpm/test-ipc-server':
specifier: workspace:*
version: link:../../__utils__/test-ipc-server
'@pnpm/testing.temp-store':
specifier: workspace:*
version: link:../../testing/temp-store
'@types/fs-extra':
specifier: 'catalog:'
version: 9.0.13
@@ -7877,6 +7871,25 @@ importers:
specifier: 'catalog:'
version: 3.0.2
testing/temp-store:
dependencies:
'@pnpm/client':
specifier: workspace:*
version: link:../../pkg-manager/client
'@pnpm/package-store':
specifier: workspace:*
version: link:../../store/package-store
'@pnpm/registry-mock':
specifier: 'catalog:'
version: 4.2.0(encoding@0.1.13)(typanion@3.14.0)
'@pnpm/store-controller-types':
specifier: workspace:*
version: link:../../store/store-controller-types
devDependencies:
'@pnpm/testing.temp-store':
specifier: workspace:*
version: 'link:'
text/comments-parser:
dependencies:
strip-comments-strings:

View File

@@ -43,6 +43,7 @@ packages:
- patching/*
- pnpm
- pnpm/dev
- testing/*
- tools/*
- worker
- pnpm/artifacts/*

View File

@@ -1,3 +1,3 @@
export { createPackageStore, type CafsLocker } from './storeController'
export { createPackageStore, type CafsLocker, type CreatePackageStoreOptions } from './storeController'
export * from '@pnpm/store-controller-types'

View File

@@ -13,26 +13,28 @@ import { prune } from './prune'
export { type CafsLocker }
export interface CreatePackageStoreOptions {
cafsLocker?: CafsLocker
engineStrict?: boolean
force?: boolean
nodeVersion?: string
importPackage?: ImportIndexedPackageAsync
pnpmVersion?: string
ignoreFile?: (filename: string) => boolean
cacheDir: string
storeDir: string
networkConcurrency?: number
packageImportMethod?: 'auto' | 'hardlink' | 'copy' | 'clone' | 'clone-or-copy'
verifyStoreIntegrity: boolean
virtualStoreDirMaxLength: number
strictStorePkgContentCheck?: boolean
clearResolutionCache: () => void
}
export function createPackageStore (
resolve: ResolveFunction,
fetchers: Fetchers,
initOpts: {
cafsLocker?: CafsLocker
engineStrict?: boolean
force?: boolean
nodeVersion?: string
importPackage?: ImportIndexedPackageAsync
pnpmVersion?: string
ignoreFile?: (filename: string) => boolean
cacheDir: string
storeDir: string
networkConcurrency?: number
packageImportMethod?: 'auto' | 'hardlink' | 'copy' | 'clone' | 'clone-or-copy'
verifyStoreIntegrity: boolean
virtualStoreDirMaxLength: number
strictStorePkgContentCheck?: boolean
clearResolutionCache: () => void
}
initOpts: CreatePackageStoreOptions
): StoreController {
const storeDir = initOpts.storeDir
if (!fs.existsSync(path.join(storeDir, 'files'))) {

View File

@@ -0,0 +1,13 @@
# @pnpm/testing.temp-store
> A temporary store for testing purposes
## Install
```
pnpm add @pnpm/testing.temp-store
```
## License
[MIT](LICENSE)

View File

@@ -0,0 +1,48 @@
{
"name": "@pnpm/testing.temp-store",
"version": "1000.0.0-0",
"description": "A temporary store for testing purposes",
"keywords": [
"pnpm",
"pnpm10",
"store"
],
"license": "MIT",
"funding": "https://opencollective.com/pnpm",
"repository": "https://github.com/pnpm/pnpm/blob/main/testing/temp-store",
"homepage": "https://github.com/pnpm/pnpm/blob/main/testing/temp-store#readme",
"bugs": {
"url": "https://github.com/pnpm/pnpm/issues"
},
"main": "lib/index.js",
"types": "lib/index.d.ts",
"exports": {
".": "./lib/index.js"
},
"files": [
"lib",
"!*.map"
],
"scripts": {
"prepublishOnly": "pnpm run compile",
"lint": "eslint \"src/**/*.ts\"",
"test": "pnpm run compile",
"start": "tsc --watch",
"compile": "tsc --build && pnpm run lint --fix"
},
"dependencies": {
"@pnpm/client": "workspace:*",
"@pnpm/package-store": "workspace:*",
"@pnpm/registry-mock": "catalog:",
"@pnpm/store-controller-types": "workspace:*"
},
"devDependencies": {
"@pnpm/testing.temp-store": "workspace:*"
},
"engines": {
"node": ">=18.12"
},
"jest": {
"preset": "@pnpm/jest-config"
}
}

View File

@@ -0,0 +1,54 @@
import * as path from 'path'
import { type ClientOptions, createClient } from '@pnpm/client'
import { createPackageStore, type CreatePackageStoreOptions } from '@pnpm/package-store'
import { REGISTRY_MOCK_PORT } from '@pnpm/registry-mock'
import { type StoreController } from '@pnpm/store-controller-types'
const registry = `http://localhost:${REGISTRY_MOCK_PORT}/`
export interface CreateTempStoreResult {
storeController: StoreController
storeDir: string
cacheDir: string
}
export function createTempStore (opts?: {
fastUnpack?: boolean
storeDir?: string
clientOptions?: ClientOptions
storeOptions?: CreatePackageStoreOptions
}): CreateTempStoreResult {
const authConfig = { registry }
const cacheDir = path.resolve('cache')
const { resolve, fetchers, clearResolutionCache } = createClient({
authConfig,
rawConfig: {},
retry: {
retries: 4,
factor: 10,
maxTimeout: 60_000,
minTimeout: 10_000,
},
cacheDir,
...opts?.clientOptions,
})
const storeDir = opts?.storeDir ?? path.resolve('.store')
const storeController = createPackageStore(
resolve,
fetchers,
{
cacheDir,
ignoreFile: opts?.fastUnpack === false ? undefined : (filename) => filename !== 'package.json',
storeDir,
verifyStoreIntegrity: true,
virtualStoreDirMaxLength: process.platform === 'win32' ? 60 : 120,
clearResolutionCache,
...opts?.storeOptions,
}
)
return {
storeController,
storeDir,
cacheDir,
}
}

View File

@@ -0,0 +1,22 @@
{
"extends": "@pnpm/tsconfig",
"compilerOptions": {
"outDir": "lib",
"rootDir": "src"
},
"include": [
"src/**/*.ts",
"../../__typings__/**/*.d.ts"
],
"references": [
{
"path": "../../pkg-manager/client"
},
{
"path": "../../store/package-store"
},
{
"path": "../../store/store-controller-types"
}
]
}

View File

@@ -0,0 +1,8 @@
{
"extends": "./tsconfig.json",
"include": [
"src/**/*.ts",
"test/**/*.ts",
"../../__typings__/**/*.d.ts"
]
}