fix: built packages should not modify the original files in the store (#4898)

This commit is contained in:
Zoltan Kochan
2022-06-18 21:45:11 +03:00
committed by GitHub
parent 56cf04cb36
commit 0abfe17182
36 changed files with 326 additions and 91 deletions

View File

@@ -0,0 +1,5 @@
---
"@pnpm/build-modules": patch
---
`requiresBuild` may be of any value. This is just a workaround to a typing issue. `requiresBuild` will always be boolean.

View File

@@ -0,0 +1,5 @@
---
"@pnpm/resolve-dependencies": major
---
`requiresBuild` is sometimes a function that return a boolean promise.

View File

@@ -0,0 +1,7 @@
---
"@pnpm/core": patch
"@pnpm/headless": patch
"pnpm": patch
---
Packages that should be built are always cloned or copied from the store. This is required to prevent the postinstall scripts from modifying the original source files of the package.

View File

@@ -0,0 +1,5 @@
---
"@pnpm/package-requester": patch
---
Use `safe-promise-defer`.

View File

@@ -0,0 +1,6 @@
---
"@pnpm/create-cafs-store": minor
"@pnpm/fetcher-base": minor
---
New optional option added to package importer: `requiresBuild`. When `requiresBuild` is `true`, the package should only be imported using cloning or copying.

View File

@@ -0,0 +1,5 @@
---
"@pnpm/create-cafs-store": minor
---
New import method added: `clone-or-copy`.

View File

@@ -39,7 +39,7 @@
"@commitlint/prompt-cli": "^16.0.0",
"@pnpm/eslint-config": "workspace:*",
"@pnpm/meta-updater": "0.0.6",
"@pnpm/registry-mock": "2.19.0",
"@pnpm/registry-mock": "2.20.0",
"@pnpm/tsconfig": "workspace:*",
"@types/jest": "^27.4.0",
"@types/node": "^14.17.32",

View File

@@ -14,7 +14,8 @@ export interface DependenciesGraphNode {
isBuilt?: boolean
optional: boolean
optionalDependencies: Set<string>
requiresBuild?: boolean
// eslint-disable-next-line @typescript-eslint/no-explicit-any
requiresBuild?: boolean | any // this is a durty workaround added in https://github.com/pnpm/pnpm/pull/4898
}
export interface DependenciesGraph {

View File

@@ -76,7 +76,7 @@
"@pnpm/logger": "^4.0.0",
"@pnpm/package-store": "workspace:13.0.7",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "2.19.0",
"@pnpm/registry-mock": "2.20.0",
"@pnpm/store-path": "workspace:6.0.0",
"@pnpm/test-fixtures": "workspace:*",
"@types/fs-extra": "^9.0.5",

View File

@@ -843,8 +843,13 @@ const _installInContext: InstallFunction = async (projects, ctx, opts) => {
// we can use concat here because we always only append new packages, which are guaranteed to not be there by definition
ctx.pendingBuilds = ctx.pendingBuilds
.concat(
result.newDepPaths
.filter((depPath) => dependenciesGraph[depPath].requiresBuild)
await pFilter(result.newDepPaths,
(depPath) => {
const requiresBuild = dependenciesGraph[depPath].requiresBuild
if (typeof requiresBuild === 'function') return requiresBuild()
return requiresBuild
}
)
)
} else if (result.newDepPaths?.length) {
// postinstall hooks

View File

@@ -408,10 +408,14 @@ async function linkAllPkgs (
if (opts.sideEffectsCacheRead && filesResponse.sideEffects && !isEmpty(filesResponse.sideEffects)) {
targetEngine = calcDepState(depNode.depPath, opts.depGraph, opts.depsStateCache)
}
if (typeof depNode.requiresBuild === 'function') {
depNode.requiresBuild = await depNode.requiresBuild()
}
const { importMethod, isBuilt } = await storeController.importPackage(depNode.dir, {
filesResponse,
force: opts.force,
targetEngine,
requiresBuild: depNode.requiresBuild,
})
if (importMethod) {
progressLogger.debug({

View File

@@ -1,8 +1,8 @@
import { promises as fs } from 'fs'
import { promises as fs, readFileSync } from 'fs'
import path from 'path'
import { addDependenciesToPackage } from '@pnpm/core'
import { PackageFilesIndex } from '@pnpm/cafs'
import { REGISTRY_MOCK_PORT } from '@pnpm/registry-mock'
import { getFilePathInCafs, PackageFilesIndex } from '@pnpm/cafs'
import { getIntegrity, REGISTRY_MOCK_PORT } from '@pnpm/registry-mock'
import { prepareEmpty } from '@pnpm/prepare'
import { ENGINE_NAME } from '@pnpm/constants'
import rimraf from '@zkochan/rimraf'
@@ -159,3 +159,28 @@ test('uploading errors do not interrupt installation', async () => {
const filesIndex = await loadJsonFile<PackageFilesIndex>(filesIndexFile)
expect(filesIndex.sideEffects).toBeFalsy()
})
test('a postinstall script does not modify the original sources added to the store', async () => {
prepareEmpty()
const opts = await testDefaults({
fastUnpack: false,
sideEffectsCacheRead: true,
sideEffectsCacheWrite: true,
}, {}, {}, { packageImportMethod: 'hardlink' })
await addDependenciesToPackage({}, ['@pnpm/postinstall-modifies-source@1.0.0'], opts)
expect(readFileSync('node_modules/@pnpm/postinstall-modifies-source/empty-file.txt', 'utf8')).toContain('hello')
const cafsDir = path.join(opts.storeDir, 'files')
const filesIndexFile = getFilePathInCafs(cafsDir, getIntegrity('@pnpm/postinstall-modifies-source', '1.0.0'), 'index')
const filesIndex = await loadJsonFile<PackageFilesIndex>(filesIndexFile)
const patchedFileIntegrity = filesIndex.sideEffects?.[`${ENGINE_NAME}-{}`]['empty-file.txt']?.integrity
expect(patchedFileIntegrity).toBeTruthy()
const originalFileIntegrity = filesIndex.files['empty-file.txt'].integrity
expect(originalFileIntegrity).toBeTruthy()
// The integrity of the original file differs from the integrity of the patched file
expect(originalFileIntegrity).not.toEqual(patchedFileIntegrity)
expect(readFileSync(getFilePathInCafs(cafsDir, originalFileIntegrity, 'nonexec'), 'utf8')).toEqual('')
})

View File

@@ -19,13 +19,13 @@ interface ImportOptions {
type ImportFunction = (to: string, opts: ImportOptions) => Promise<string | undefined>
export default (
packageImportMethod?: 'auto' | 'hardlink' | 'copy' | 'clone'
packageImportMethod?: 'auto' | 'hardlink' | 'copy' | 'clone' | 'clone-or-copy'
): ImportFunction => {
const importPackage = createImportPackage(packageImportMethod)
return async (to, opts) => limitLinking(async () => importPackage(to, opts))
}
function createImportPackage (packageImportMethod?: 'auto' | 'hardlink' | 'copy' | 'clone') {
function createImportPackage (packageImportMethod?: 'auto' | 'hardlink' | 'copy' | 'clone' | 'clone-or-copy') {
// this works in the following way:
// - hardlink: hardlink the packages, no fallback
// - clone: clone the packages, no fallback
@@ -41,6 +41,8 @@ function createImportPackage (packageImportMethod?: 'auto' | 'hardlink' | 'copy'
case 'auto': {
return createAutoImporter()
}
case 'clone-or-copy':
return createCloneOrCopyImporter()
case 'copy':
packageImportMethodLogger.debug({ method: 'copy' })
return copyPkg
@@ -87,6 +89,29 @@ function createAutoImporter (): ImportFunction {
}
}
function createCloneOrCopyImporter (): ImportFunction {
let auto = initialAuto
return async (to, opts) => auto(to, opts)
async function initialAuto (
to: string,
opts: ImportOptions
): Promise<string | undefined> {
try {
if (!await clonePkg(to, opts)) return undefined
packageImportMethodLogger.debug({ method: 'clone' })
auto = clonePkg
return 'clone'
} catch (err: any) { // eslint-disable-line
// ignore
}
packageImportMethodLogger.debug({ method: 'copy' })
auto = copyPkg
return auto(to, opts)
}
}
async function clonePkg (
to: string,
opts: ImportOptions

View File

@@ -23,7 +23,10 @@ function createPackageImporter (
const gfm = getFlatMap.bind(null, opts.cafsDir)
return async (to, opts) => {
const { filesMap, isBuilt } = gfm(opts.filesResponse, opts.targetEngine)
const impPkg = cachedImporterCreator(opts.filesResponse.packageImportMethod ?? packageImportMethod)
const pkgImportMethod = (opts.requiresBuild && !isBuilt)
? 'clone-or-copy'
: (opts.filesResponse.packageImportMethod ?? packageImportMethod)
const impPkg = cachedImporterCreator(pkgImportMethod)
const importMethod = await impPkg(to, { filesMap, fromStore: opts.filesResponse.fromStore, force: opts.force })
return { importMethod, isBuilt }
}

View File

@@ -21,13 +21,16 @@ export type PackageFilesResponse = {
filesIndex: Record<string, PackageFileInfo>
})
export interface ImportPackageOpts {
requiresBuild?: boolean
targetEngine?: string
filesResponse: PackageFilesResponse
force: boolean
}
export type ImportPackageFunction = (
to: string,
opts: {
targetEngine?: string
filesResponse: PackageFilesResponse
force: boolean
}
opts: ImportPackageOpts
) => Promise<{ isBuilt: boolean, importMethod: undefined | string }>
export interface Cafs {

View File

@@ -22,7 +22,7 @@
"@pnpm/package-store": "workspace:13.0.7",
"@pnpm/prepare": "workspace:*",
"@pnpm/read-projects-context": "workspace:6.0.4",
"@pnpm/registry-mock": "2.19.0",
"@pnpm/registry-mock": "2.20.0",
"@pnpm/store-path": "workspace:6.0.0",
"@pnpm/test-fixtures": "workspace:*",
"@types/fs-extra": "^9.0.5",

View File

@@ -686,6 +686,7 @@ async function linkAllPkgs (
const { importMethod, isBuilt } = await storeController.importPackage(depNode.dir, {
filesResponse,
force: opts.force,
requiresBuild: depNode.requiresBuild,
targetEngine,
})
if (importMethod) {

View File

@@ -105,6 +105,7 @@ async function linkAllPkgsInOrder (
const { importMethod, isBuilt } = await storeController.importPackage(depNode.dir, {
filesResponse,
force: opts.force || depNode.depPath !== prevGraph[dir]?.depPath,
requiresBuild: depNode.requiresBuild,
targetEngine,
})
if (importMethod) {

View File

@@ -57,6 +57,7 @@
"promise-share": "^1.0.0",
"ramda": "^0.27.1",
"rename-overwrite": "^4.0.2",
"safe-promise-defer": "^1.0.1",
"semver": "^7.3.4",
"ssri": "^8.0.1"
},
@@ -65,7 +66,7 @@
"@pnpm/create-cafs-store": "workspace:1.0.3",
"@pnpm/logger": "^4.0.0",
"@pnpm/package-requester": "workspace:18.0.7",
"@pnpm/registry-mock": "2.19.0",
"@pnpm/registry-mock": "2.20.0",
"@pnpm/test-fixtures": "workspace:*",
"@types/normalize-path": "^3.0.0",
"@types/ramda": "0.27.39",

View File

@@ -51,7 +51,7 @@ import renameOverwrite from 'rename-overwrite'
import semver from 'semver'
import ssri from 'ssri'
import equalOrSemverEqual from './equalOrSemverEqual'
import safeDeferredPromise from './safeDeferredPromise'
import safePromiseDefer from 'safe-promise-defer'
const TARBALL_INTEGRITY_FILENAME = 'tarball-integrity'
const packageRequestLogger = logger('package-requester')
@@ -441,7 +441,7 @@ function fetchToStore (
if ((pkgFilesIndex?.files) != null) {
const manifest = opts.fetchRawManifest
? safeDeferredPromise<DependencyManifest | undefined>()
? safePromiseDefer<DependencyManifest | undefined>()
: undefined
if (
(
@@ -498,7 +498,7 @@ Actual package in the store by the given integrity: ${pkgFilesIndex.name}@${pkgF
const priority = (++ctx.requestsQueue['counter'] % ctx.requestsQueue['concurrency'] === 0 ? -1 : 1) * 1000 // eslint-disable-line
const fetchManifest = opts.fetchRawManifest
? safeDeferredPromise<DependencyManifest | undefined>()
? safePromiseDefer<DependencyManifest | undefined>()
: undefined
if (fetchManifest != null) {
fetchManifest()

View File

@@ -1,13 +0,0 @@
import pShare from 'promise-share'
export default function safeDeferredPromise<T> () {
let _resolve!: (v: T) => void
let _reject!: (err: Error) => void
const promiseFn = pShare(new Promise<T>((resolve, reject) => {
_resolve = resolve
_reject = reject
}))
return Object.assign(promiseFn, { resolve: _resolve, reject: _reject })
}

View File

@@ -39,7 +39,7 @@
"@pnpm/modules-yaml": "workspace:10.0.2",
"@pnpm/plugin-commands-installation": "workspace:10.1.1",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "2.19.0",
"@pnpm/registry-mock": "2.20.0",
"@pnpm/test-fixtures": "workspace:*",
"@types/is-ci": "^3.0.0",
"@types/proxyquire": "^1.3.28",

View File

@@ -38,7 +38,7 @@
"@pnpm/plugin-commands-installation": "workspace:10.1.1",
"@pnpm/plugin-commands-listing": "workspace:5.0.12",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "2.19.0",
"@pnpm/registry-mock": "2.20.0",
"@types/ramda": "0.27.39",
"execa": "npm:safe-execa@^0.1.1",
"strip-ansi": "^6.0.0",

View File

@@ -38,7 +38,7 @@
"@pnpm/plugin-commands-installation": "workspace:10.1.1",
"@pnpm/plugin-commands-outdated": "workspace:6.0.12",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "2.19.0",
"@pnpm/registry-mock": "2.20.0",
"@types/lru-cache": "^5.1.0",
"@types/ramda": "0.27.39",
"@types/wrap-ansi": "^3.0.0",

View File

@@ -39,7 +39,7 @@
"@pnpm/logger": "^4.0.0",
"@pnpm/plugin-commands-publishing": "workspace:5.0.13",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "2.19.0",
"@pnpm/registry-mock": "2.20.0",
"@types/cross-spawn": "^6.0.2",
"@types/is-ci": "^3.0.0",
"@types/is-windows": "^1.0.0",

View File

@@ -37,7 +37,7 @@
"@pnpm/logger": "^4.0.0",
"@pnpm/plugin-commands-rebuild": "workspace:6.1.11",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "2.19.0",
"@pnpm/registry-mock": "2.20.0",
"@pnpm/test-fixtures": "workspace:*",
"@types/ramda": "0.27.39",
"@types/semver": "^7.3.4",

View File

@@ -38,7 +38,7 @@
"@pnpm/logger": "^4.0.0",
"@pnpm/plugin-commands-script-runners": "workspace:5.0.15",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "2.19.0",
"@pnpm/registry-mock": "2.20.0",
"@types/is-windows": "^1.0.0",
"@types/ramda": "0.27.39",
"is-windows": "^1.0.2",

View File

@@ -38,7 +38,7 @@
"@pnpm/logger": "^4.0.0",
"@pnpm/plugin-commands-store": "workspace:5.1.11",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "2.19.0",
"@pnpm/registry-mock": "2.20.0",
"@types/archy": "0.0.31",
"@types/ramda": "0.27.39",
"@types/ssri": "^7.1.0",

View File

@@ -55,7 +55,7 @@
"@pnpm/prepare": "workspace:*",
"@pnpm/read-package-json": "workspace:6.0.3",
"@pnpm/read-project-manifest": "workspace:3.0.3",
"@pnpm/registry-mock": "2.19.0",
"@pnpm/registry-mock": "2.20.0",
"@pnpm/run-npm": "workspace:4.0.1",
"@pnpm/tabtab": "^0.1.2",
"@pnpm/types": "workspace:8.1.0",

View File

@@ -51,9 +51,11 @@
"is-inner-link": "^4.0.0",
"is-subdir": "^1.1.1",
"path-exists": "^4.0.0",
"promise-share": "^1.0.0",
"ramda": "^0.27.1",
"rename-overwrite": "^4.0.2",
"replace-string": "^3.1.0",
"safe-promise-defer": "^1.0.1",
"semver": "^7.3.4",
"semver-range-intersect": "^0.3.1",
"version-selector-type": "^3.0.0"

View File

@@ -19,6 +19,7 @@ import {
ProjectManifest,
Registries,
} from '@pnpm/types'
import promiseShare from 'promise-share'
import difference from 'ramda/src/difference'
import getWantedDependencies, { WantedDependency } from './getWantedDependencies'
import depPathToRef from './depPathToRef'
@@ -210,7 +211,7 @@ export default async function (
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
(opts.allowBuild != null && !opts.allowBuild(pkg.name)) ||
(opts.wantedLockfile.packages?.[depPath] == null) ||
pkg.requiresBuild
pkg.requiresBuild === true
) continue
pendingRequiresBuilds.push(depPath)
}
@@ -222,7 +223,7 @@ export default async function (
return {
dependenciesByProjectId,
dependenciesGraph,
finishLockfileUpdates: finishLockfileUpdates.bind(null, dependenciesGraph, pendingRequiresBuilds, newLockfile),
finishLockfileUpdates: promiseShare(finishLockfileUpdates(dependenciesGraph, pendingRequiresBuilds, newLockfile)),
outdatedDependencies,
linkedDependenciesByProjectId,
newLockfile,
@@ -239,15 +240,16 @@ async function finishLockfileUpdates (
) {
return Promise.all(pendingRequiresBuilds.map(async (depPath) => {
const depNode = dependenciesGraph[depPath]
let requiresBuild!: boolean
if (depNode.optional) {
// We assume that all optional dependencies have to be built.
// Optional dependencies are not always downloaded, so there is no way to know whether they need to be built or not.
depNode.requiresBuild = true
requiresBuild = true
} else if (depNode.fetchingBundledManifest != null) {
const filesResponse = await depNode.fetchingFiles()
// The npm team suggests to always read the package.json for deciding whether the package has lifecycle scripts
const pkgJson = await depNode.fetchingBundledManifest()
depNode.requiresBuild = Boolean(
requiresBuild = Boolean(
pkgJson?.scripts != null && (
Boolean(pkgJson.scripts.preinstall) ||
Boolean(pkgJson.scripts.install) ||
@@ -260,10 +262,13 @@ async function finishLockfileUpdates (
// This should never ever happen
throw new Error(`Cannot create ${WANTED_LOCKFILE} because raw manifest (aka package.json) wasn't fetched for "${depPath}"`)
}
if (typeof depNode.requiresBuild === 'function') {
depNode.requiresBuild['resolve'](requiresBuild)
}
// TODO: try to cover with unit test the case when entry is no longer available in lockfile
// It is an edge that probably happens if the entry is removed during lockfile prune
if (depNode.requiresBuild && newLockfile.packages![depPath]) {
if (requiresBuild && newLockfile.packages![depPath]) {
newLockfile.packages![depPath].requiresBuild = true
}
}))

View File

@@ -50,6 +50,7 @@ import {
splitNodeId,
} from './nodeIdUtils'
import wantedDepIsLocallyAvailable from './wantedDepIsLocallyAvailable'
import safePromiseDefer, { SafePromiseDefer } from 'safe-promise-defer'
const dependencyResolvedLogger = logger('_dependency_resolved')
@@ -196,7 +197,7 @@ export interface ResolvedPackage {
hasBundledDependencies: boolean
prepare: boolean
depPath: string
requiresBuild: boolean | undefined // added to fix issue #1201
requiresBuild: boolean | SafePromiseDefer<boolean>
additionalInfo: {
deprecated?: string
bundleDependencies?: string[]
@@ -1020,7 +1021,7 @@ function getResolvedPackage (
const peerDependencies = peerDependenciesWithoutOwn(options.pkg)
const requiresBuild = (options.allowBuild == null || options.allowBuild(options.pkg.name))
? ((options.dependencyLockfile != null) ? Boolean(options.dependencyLockfile.requiresBuild) : undefined)
? ((options.dependencyLockfile != null) ? Boolean(options.dependencyLockfile.requiresBuild) : safePromiseDefer<boolean>())
: false
return {

View File

@@ -156,7 +156,9 @@ function toLockfileDependency (
if (pkg.hasBin) {
result['hasBin'] = true
}
if (pkg.requiresBuild !== undefined) {
const requiresBuildIsKnown = typeof pkg.requiresBuild === 'boolean'
let pending = false
if (requiresBuildIsKnown) {
if (pkg.requiresBuild) {
result['requiresBuild'] = true
}
@@ -172,8 +174,11 @@ function toLockfileDependency (
result['requiresBuild'] = true
} else {
pendingRequiresBuilds.push(opts.depPath)
pending = true
}
if (!requiresBuildIsKnown && !pending) {
pkg.requiresBuild['resolve'](result['requiresBuild'] ?? false)
}
pkg.requiresBuild = result['requiresBuild']
/* eslint-enable @typescript-eslint/dot-notation */
return result
}

209
pnpm-lock.yaml generated
View File

@@ -41,7 +41,7 @@ importers:
'@commitlint/prompt-cli': ^16.0.0
'@pnpm/eslint-config': workspace:*
'@pnpm/meta-updater': 0.0.6
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@pnpm/tsconfig': workspace:*
'@types/jest': ^27.4.0
'@types/node': ^14.17.32
@@ -72,7 +72,7 @@ importers:
'@commitlint/prompt-cli': 16.3.0
'@pnpm/eslint-config': link:utils/eslint-config
'@pnpm/meta-updater': 0.0.6
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@pnpm/tsconfig': link:utils/tsconfig
'@types/jest': 27.5.2
'@types/node': 14.18.21
@@ -432,7 +432,7 @@ importers:
'@pnpm/read-modules-dir': workspace:4.0.0
'@pnpm/read-package-json': workspace:6.0.3
'@pnpm/read-project-manifest': workspace:3.0.3
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@pnpm/remove-bins': workspace:3.0.3
'@pnpm/resolve-dependencies': workspace:27.2.0
'@pnpm/resolver-base': workspace:9.0.2
@@ -539,7 +539,7 @@ importers:
'@pnpm/logger': 4.0.0
'@pnpm/package-store': link:../package-store
'@pnpm/prepare': link:../../privatePackages/prepare
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@pnpm/store-path': link:../store-path
'@pnpm/test-fixtures': link:../../privatePackages/test-fixtures
'@types/fs-extra': 9.0.13
@@ -1136,7 +1136,7 @@ importers:
'@pnpm/read-project-manifest': workspace:3.0.3
'@pnpm/read-projects-context': workspace:6.0.4
'@pnpm/real-hoist': workspace:0.2.4
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@pnpm/store-controller-types': workspace:13.0.3
'@pnpm/store-path': workspace:6.0.0
'@pnpm/symlink-dependency': workspace:5.0.2
@@ -1197,7 +1197,7 @@ importers:
'@pnpm/package-store': link:../package-store
'@pnpm/prepare': link:../../privatePackages/prepare
'@pnpm/read-projects-context': link:../read-projects-context
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@pnpm/store-path': link:../store-path
'@pnpm/test-fixtures': link:../../privatePackages/test-fixtures
'@types/fs-extra': 9.0.13
@@ -1871,7 +1871,7 @@ importers:
'@pnpm/package-is-installable': workspace:6.0.4
'@pnpm/package-requester': workspace:18.0.7
'@pnpm/read-package-json': workspace:6.0.3
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@pnpm/resolver-base': workspace:9.0.2
'@pnpm/store-controller-types': workspace:13.0.3
'@pnpm/test-fixtures': workspace:*
@@ -1892,6 +1892,7 @@ importers:
promise-share: ^1.0.0
ramda: ^0.27.1
rename-overwrite: ^4.0.2
safe-promise-defer: ^1.0.1
semver: ^7.3.4
ssri: ^8.0.1
tempy: ^1.0.0
@@ -1915,6 +1916,7 @@ importers:
promise-share: 1.0.0
ramda: 0.27.2
rename-overwrite: 4.0.2
safe-promise-defer: 1.0.1
semver: 7.3.7
ssri: 8.0.1
devDependencies:
@@ -1922,7 +1924,7 @@ importers:
'@pnpm/create-cafs-store': link:../create-cafs-store
'@pnpm/logger': 4.0.0
'@pnpm/package-requester': 'link:'
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@pnpm/test-fixtures': link:../../privatePackages/test-fixtures
'@types/normalize-path': 3.0.0
'@types/ramda': 0.27.39
@@ -2194,7 +2196,7 @@ importers:
'@pnpm/pnpmfile': workspace:2.0.3
'@pnpm/prepare': workspace:*
'@pnpm/read-project-manifest': workspace:3.0.3
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@pnpm/resolver-base': workspace:9.0.2
'@pnpm/semver-diff': ^1.0.2
'@pnpm/sort-packages': workspace:3.0.3
@@ -2291,7 +2293,7 @@ importers:
'@pnpm/modules-yaml': link:../modules-yaml
'@pnpm/plugin-commands-installation': 'link:'
'@pnpm/prepare': link:../../privatePackages/prepare
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@pnpm/test-fixtures': link:../../privatePackages/test-fixtures
'@types/is-ci': 3.0.0
'@types/proxyquire': 1.3.28
@@ -2322,7 +2324,7 @@ importers:
'@pnpm/plugin-commands-installation': workspace:10.1.1
'@pnpm/plugin-commands-listing': workspace:5.0.12
'@pnpm/prepare': workspace:*
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@pnpm/types': workspace:8.1.0
'@types/ramda': 0.27.39
execa: npm:safe-execa@^0.1.1
@@ -2346,7 +2348,7 @@ importers:
'@pnpm/plugin-commands-installation': link:../plugin-commands-installation
'@pnpm/plugin-commands-listing': 'link:'
'@pnpm/prepare': link:../../privatePackages/prepare
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@types/ramda': 0.27.39
execa: /safe-execa/0.1.1
strip-ansi: 6.0.1
@@ -2370,7 +2372,7 @@ importers:
'@pnpm/plugin-commands-installation': workspace:10.1.1
'@pnpm/plugin-commands-outdated': workspace:6.0.12
'@pnpm/prepare': workspace:*
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@pnpm/semver-diff': ^1.0.2
'@pnpm/store-path': workspace:6.0.0
'@pnpm/types': workspace:8.1.0
@@ -2413,7 +2415,7 @@ importers:
'@pnpm/plugin-commands-installation': link:../plugin-commands-installation
'@pnpm/plugin-commands-outdated': 'link:'
'@pnpm/prepare': link:../../privatePackages/prepare
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@types/lru-cache': 5.1.1
'@types/ramda': 0.27.39
'@types/wrap-ansi': 3.0.0
@@ -2434,7 +2436,7 @@ importers:
'@pnpm/pick-registry-for-package': workspace:3.0.2
'@pnpm/plugin-commands-publishing': workspace:5.0.13
'@pnpm/prepare': workspace:*
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@pnpm/resolver-base': workspace:9.0.2
'@pnpm/run-npm': workspace:4.0.1
'@pnpm/sort-packages': workspace:3.0.3
@@ -2498,7 +2500,7 @@ importers:
'@pnpm/logger': 4.0.0
'@pnpm/plugin-commands-publishing': 'link:'
'@pnpm/prepare': link:../../privatePackages/prepare
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@types/cross-spawn': 6.0.2
'@types/is-ci': 3.0.0
'@types/is-windows': 1.0.0
@@ -2536,7 +2538,7 @@ importers:
'@pnpm/normalize-registries': workspace:3.0.2
'@pnpm/plugin-commands-rebuild': workspace:6.1.11
'@pnpm/prepare': workspace:*
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@pnpm/sort-packages': workspace:3.0.3
'@pnpm/store-connection-manager': workspace:4.1.10
'@pnpm/store-controller-types': workspace:13.0.3
@@ -2595,7 +2597,7 @@ importers:
'@pnpm/logger': 4.0.0
'@pnpm/plugin-commands-rebuild': 'link:'
'@pnpm/prepare': link:../../privatePackages/prepare
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@pnpm/test-fixtures': link:../../privatePackages/test-fixtures
'@types/ramda': 0.27.39
'@types/semver': 7.3.9
@@ -2621,7 +2623,7 @@ importers:
'@pnpm/prepare': workspace:*
'@pnpm/read-package-json': workspace:6.0.3
'@pnpm/read-project-manifest': workspace:3.0.3
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@pnpm/sort-packages': workspace:3.0.3
'@pnpm/store-path': workspace:6.0.0
'@pnpm/types': workspace:8.1.0
@@ -2664,7 +2666,7 @@ importers:
'@pnpm/logger': 4.0.0
'@pnpm/plugin-commands-script-runners': 'link:'
'@pnpm/prepare': link:../../privatePackages/prepare
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@types/is-windows': 1.0.0
'@types/ramda': 0.27.39
is-windows: 1.0.2
@@ -2754,7 +2756,7 @@ importers:
'@pnpm/pick-registry-for-package': workspace:3.0.2
'@pnpm/plugin-commands-store': workspace:5.1.11
'@pnpm/prepare': workspace:*
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@pnpm/store-connection-manager': workspace:4.1.10
'@pnpm/store-controller-types': workspace:13.0.3
'@pnpm/store-path': workspace:6.0.0
@@ -2801,7 +2803,7 @@ importers:
'@pnpm/logger': 4.0.0
'@pnpm/plugin-commands-store': 'link:'
'@pnpm/prepare': link:../../privatePackages/prepare
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@types/archy': 0.0.31
'@types/ramda': 0.27.39
'@types/ssri': 7.1.1
@@ -2849,7 +2851,7 @@ importers:
'@pnpm/prepare': workspace:*
'@pnpm/read-package-json': workspace:6.0.3
'@pnpm/read-project-manifest': workspace:3.0.3
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@pnpm/run-npm': workspace:4.0.1
'@pnpm/tabtab': ^0.1.2
'@pnpm/types': workspace:8.1.0
@@ -2937,7 +2939,7 @@ importers:
'@pnpm/prepare': link:../../privatePackages/prepare
'@pnpm/read-package-json': link:../read-package-json
'@pnpm/read-project-manifest': link:../read-project-manifest
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@pnpm/run-npm': link:../run-npm
'@pnpm/tabtab': 0.1.2
'@pnpm/types': link:../types
@@ -3224,9 +3226,11 @@ importers:
is-inner-link: ^4.0.0
is-subdir: ^1.1.1
path-exists: ^4.0.0
promise-share: ^1.0.0
ramda: ^0.27.1
rename-overwrite: ^4.0.2
replace-string: ^3.1.0
safe-promise-defer: ^1.0.1
semver: ^7.3.4
semver-range-intersect: ^0.3.1
version-selector-type: ^3.0.0
@@ -3253,9 +3257,11 @@ importers:
is-inner-link: 4.0.0
is-subdir: 1.2.0
path-exists: 4.0.0
promise-share: 1.0.0
ramda: 0.27.2
rename-overwrite: 4.0.2
replace-string: 3.1.0
safe-promise-defer: 1.0.1
semver: 7.3.7
semver-range-intersect: 0.3.1
version-selector-type: 3.0.0
@@ -3535,7 +3541,7 @@ importers:
'@pnpm/constants': workspace:6.1.0
'@pnpm/lockfile-types': workspace:4.0.2
'@pnpm/modules-yaml': workspace:10.0.2
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@pnpm/types': workspace:8.1.0
'@types/is-windows': ^1.0.0
'@types/isexe': 2.0.0
@@ -3550,7 +3556,7 @@ importers:
'@pnpm/constants': link:../../packages/constants
'@pnpm/lockfile-types': link:../../packages/lockfile-types
'@pnpm/modules-yaml': link:../../packages/modules-yaml
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
'@pnpm/types': link:../../packages/types
is-windows: 1.0.2
isexe: 2.0.0
@@ -3567,11 +3573,11 @@ importers:
specifiers:
'@pnpm/assert-store': workspace:*
'@pnpm/cafs': workspace:4.0.4
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
path-exists: ^4.0.0
dependencies:
'@pnpm/cafs': link:../../packages/cafs
'@pnpm/registry-mock': 2.19.0
'@pnpm/registry-mock': 2.20.0
path-exists: 4.0.0
devDependencies:
'@pnpm/assert-store': 'link:'
@@ -5253,8 +5259,8 @@ packages:
strip-bom: 4.0.0
dev: true
/@pnpm/registry-mock/2.19.0:
resolution: {integrity: sha512-nPrpSr6PWl150NIY26FsXKqlk4NL6dR29HC+4H4pVUS6GZloQU/NUlwvLCJ6FrV16YyV6cOvbDMCxVjri1rltg==}
/@pnpm/registry-mock/2.20.0:
resolution: {integrity: sha512-ADVI/RsdN+l4GHD9gKJvXpNd/UBX5W0Nfv/PEuc4kf++aBzDvEHd2n0QAnk5LZTidCHXvYCagFgcCy/oFkkIJg==}
engines: {node: '>=10.13'}
hasBin: true
dependencies:
@@ -5264,7 +5270,7 @@ packages:
read-yaml-file: 2.1.0
rimraf: 3.0.2
tempy: 1.0.1
verdaccio: 5.11.0
verdaccio: 5.13.0
write-yaml-file: 4.2.0
transitivePeerDependencies:
- bufferutil
@@ -5437,7 +5443,7 @@ packages:
/@types/byline/4.2.33:
resolution: {integrity: sha512-LJYez7wrWcJQQDknqZtrZuExMGP0IXmPl1rOOGDqLbu+H7UNNRfKNuSxCBcQMLH1EfjeWidLedC/hCc5dDfBog==}
dependencies:
'@types/node': 17.0.41
'@types/node': 18.0.0
dev: true
/@types/cacheable-request/6.0.2:
@@ -5602,6 +5608,10 @@ packages:
/@types/node/17.0.41:
resolution: {integrity: sha512-xA6drNNeqb5YyV5fO3OAEsnXLfO7uF0whiOfPTz5AeDo8KeZFmODKnvwPymMNO8qE/an8pVY/O50tig2SQCrGw==}
/@types/node/18.0.0:
resolution: {integrity: sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==}
dev: true
/@types/normalize-package-data/2.4.1:
resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
dev: true
@@ -5942,6 +5952,13 @@ packages:
engines: {node: '>=8'}
dependencies:
lockfile: 1.0.4
dev: true
/@verdaccio/file-locking/10.3.0:
resolution: {integrity: sha512-FE5D5H4wy/nhgR/d2J5e1Na9kScj2wMjlLPBHz7XF4XZAVSRdm45+kL3ZmrfA6b2HTADP/uH7H05/cnAYW8bhw==}
engines: {node: '>=8'}
dependencies:
lockfile: 1.0.4
/@verdaccio/local-storage/10.2.1:
resolution: {integrity: sha512-0ff8TnHvhPu+HSZJvmm8Yb7VRGa/yf7vwpJMQngo2xYg++73CgnUP5hI65NJeKJyg8DX5E0YgCw6HoTbNxBxhg==}
@@ -5957,6 +5974,22 @@ packages:
mkdirp: 1.0.4
transitivePeerDependencies:
- supports-color
dev: true
/@verdaccio/local-storage/10.3.0:
resolution: {integrity: sha512-qpzYVqJ4NN9gYGkpuQ8N2IRRg6m8+dTvSZ69H/41rHEfeeC0LW3cZjQV7hZ8RfNNvY7hLtf1E+n6DKCGx/bSLg==}
engines: {node: '>=8'}
dependencies:
'@verdaccio/commons-api': 10.2.0
'@verdaccio/file-locking': 10.3.0
'@verdaccio/streams': 10.2.0
async: 3.2.3
debug: 4.3.4
lodash: 4.17.21
lowdb: 1.0.0
mkdirp: 1.0.4
transitivePeerDependencies:
- supports-color
/@verdaccio/readme/10.3.4:
resolution: {integrity: sha512-E4SHDjVt7eJ3CwNNvkB3N0zV3Zza8i6yQf6+qE4AZsy1L18OaxXBFmp4O4HxxIahB3npVhip230FVVAWUZjK+w==}
@@ -6598,6 +6631,9 @@ packages:
/async/3.2.3:
resolution: {integrity: sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==}
/async/3.2.4:
resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==}
/asynckit/0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
@@ -7664,6 +7700,10 @@ packages:
/dayjs/1.11.2:
resolution: {integrity: sha512-F4LXf1OeU9hrSYRPTTj/6FbO4HTjPKXvEIC1P2kcnFurViINCVk3ZV0xAS3XVx9MkMsXbbqlK6hjseaYbgKEHw==}
dev: true
/dayjs/1.11.3:
resolution: {integrity: sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A==}
/debug/2.6.9:
resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
@@ -9495,7 +9535,7 @@ packages:
source-map: 0.6.1
wordwrap: 1.0.0
optionalDependencies:
uglify-js: 3.16.0
uglify-js: 3.16.1
/har-schema/2.0.0:
resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==}
@@ -11131,11 +11171,11 @@ packages:
/lru-cache/7.10.1:
resolution: {integrity: sha512-BQuhQxPuRl79J5zSXRP+uNzPOyZw2oFI9JLRQ80XswSvg21KMKNtQza9eF42rfI/3Z40RvzBdXgziEkudzjo8A==}
engines: {node: '>=12'}
dev: false
/lru-cache/7.9.0:
resolution: {integrity: sha512-lkcNMUKqdJk96TuIXUidxaPuEg5sJo/+ZyVE2BDFnuZGzwXem7d8582eG8vbu4todLfT14snP6iHriCHXXi5Rw==}
engines: {node: '>=12'}
dev: true
/lru-queue/0.1.0:
resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==}
@@ -11249,6 +11289,11 @@ packages:
engines: {node: '>= 12'}
hasBin: true
/marked/4.0.17:
resolution: {integrity: sha512-Wfk0ATOK5iPxM4ptrORkFemqroz0ZDxp5MWfYA7H/F+wO17NRWV5Ypxi6p3g2Xmw2bKeiYOl6oVnLHKxBA0VhA==}
engines: {node: '>= 12'}
hasBin: true
/mdast-util-compact/1.0.4:
resolution: {integrity: sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg==}
dependencies:
@@ -11479,6 +11524,13 @@ packages:
engines: {node: '>=10'}
dependencies:
brace-expansion: 2.0.1
dev: true
/minimatch/5.1.0:
resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==}
engines: {node: '>=10'}
dependencies:
brace-expansion: 2.0.1
/minimist-options/4.1.0:
resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==}
@@ -11814,7 +11866,7 @@ packages:
resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
dependencies:
hosted-git-info: 3.0.8
resolve: 1.22.0
resolve: 1.22.1
semver: 5.7.1
validate-npm-package-license: 3.0.4
@@ -13185,6 +13237,14 @@ packages:
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
/resolve/1.22.1:
resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
hasBin: true
dependencies:
is-core-module: 2.9.0
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
/responselike/2.0.0:
resolution: {integrity: sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==}
dependencies:
@@ -13289,6 +13349,13 @@ packages:
execa: 5.1.1
path-name: 1.0.0
/safe-promise-defer/1.0.1:
resolution: {integrity: sha512-nKdAwtdSxWQpV2AIjU9rw5j/Pgt9+u+pegXJahWQY9D8G0tNvHnJnpL3zVJ1kKtWTo7s/Rvp9ZUDBtPPMpLctA==}
engines: {node: '>=12'}
dependencies:
promise-share: 1.0.0
dev: false
/safe-regex/1.1.0:
resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==}
dependencies:
@@ -14486,15 +14553,15 @@ packages:
is-typedarray: 1.0.0
/typedarray/0.0.6:
resolution: {integrity: sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=}
resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
/typescript/4.6.4:
resolution: {integrity: sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==}
engines: {node: '>=4.2.0'}
hasBin: true
/uglify-js/3.16.0:
resolution: {integrity: sha512-FEikl6bR30n0T3amyBh3LoiBdqHRy/f4H80+My34HOesOKyHfOsxAPAxOoqC0JUnC1amnO0IwkYC3sko51caSw==}
/uglify-js/3.16.1:
resolution: {integrity: sha512-X5BGTIDH8U6IQ1TIRP62YC36k+ULAa1d59BxlWvPUJ1NkW5L3FwcGfEzuVvGmhJFBu0YJ5Ge25tmRISqCmLiRQ==}
engines: {node: '>=0.8.0'}
hasBin: true
requiresBuild: true
@@ -14738,6 +14805,17 @@ packages:
bcryptjs: 2.4.3
http-errors: 1.8.1
unix-crypt-td-js: 1.1.4
dev: true
/verdaccio-htpasswd/10.4.0:
resolution: {integrity: sha512-Q5b8nVxoUDBXgzc7yIclnIcrGoBRYno+SVcv8+ZLz3H1KfTqSfn4+UBbb2mHEix7KNvk1W3KhHBG6n1dYRpC7A==}
engines: {node: '>=8'}
dependencies:
'@verdaccio/file-locking': 10.3.0
apache-md5: 1.1.7
bcryptjs: 2.4.3
http-errors: 1.8.1
unix-crypt-td-js: 1.1.4
/verdaccio/5.11.0:
resolution: {integrity: sha512-wKQ4dVBuUm+sHTakxlGPyOQSvJtpkzk7FTUKfGP92LV8AdQSyNflXomiP3KK7WfoG6Er18+aC+sDhosTs02l6g==}
@@ -14792,6 +14870,61 @@ packages:
- encoding
- supports-color
- utf-8-validate
dev: true
/verdaccio/5.13.0:
resolution: {integrity: sha512-0IVlOfpltlYusmUb/y3oK6kY4QfSHdGzgc3HB6NUhVe7nrCKa6qznLdW+eG3fk167xVpu/3OV5ipxUk/G5teGw==}
engines: {node: '>=12', npm: '>=6'}
hasBin: true
dependencies:
'@verdaccio/commons-api': 10.2.0
'@verdaccio/local-storage': 10.3.0
'@verdaccio/readme': 10.3.4
'@verdaccio/streams': 10.2.0
'@verdaccio/ui-theme': 6.0.0-6-next.24
async: 3.2.4
body-parser: 1.20.0
clipanion: 3.2.0-rc.6
compression: 1.7.4
cookies: 0.8.0
cors: 2.8.5
dayjs: 1.11.3
debug: 4.3.4
envinfo: 7.8.1
eslint-import-resolver-node: 0.3.6
express: 4.18.1
express-rate-limit: 5.5.1
fast-safe-stringify: 2.1.1
handlebars: 4.7.7
http-errors: 1.8.1
js-yaml: /@zkochan/js-yaml/0.0.6
JSONStream: 1.3.5
jsonwebtoken: 8.5.1
kleur: 4.1.4
lodash: 4.17.21
lru-cache: 7.10.1
lunr-mutable-indexes: 2.3.2
marked: 4.0.17
memoizee: 0.4.15
mime: 3.0.0
minimatch: 5.1.0
mkdirp: 1.0.4
mv: 2.1.1
pino: 6.14.0
pkginfo: 0.4.1
prettier-bytes: 1.0.4
pretty-ms: 7.0.1
request: 2.88.0
semver: 7.3.7
validator: 13.7.0
verdaccio-audit: 10.2.2
verdaccio-htpasswd: 10.4.0
transitivePeerDependencies:
- bufferutil
- canvas
- encoding
- supports-color
- utf-8-validate
/verror/1.10.0:
resolution: {integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=}

View File

@@ -44,7 +44,7 @@
"@pnpm/constants": "workspace:6.1.0",
"@pnpm/lockfile-types": "workspace:4.0.2",
"@pnpm/modules-yaml": "workspace:10.0.2",
"@pnpm/registry-mock": "2.19.0",
"@pnpm/registry-mock": "2.20.0",
"@pnpm/types": "workspace:8.1.0",
"is-windows": "^1.0.2",
"isexe": "2.0.0",

View File

@@ -41,7 +41,7 @@
},
"dependencies": {
"@pnpm/cafs": "workspace:4.0.4",
"@pnpm/registry-mock": "2.19.0",
"@pnpm/registry-mock": "2.20.0",
"path-exists": "^4.0.0"
},
"devDependencies": {