fix: in a workspace, also include missing deeply linked workspace packages at headless installation (#5220)

Co-authored-by: Zoltan Kochan <z@kochan.io>

close #5034
This commit is contained in:
Kenrick
2022-10-14 04:48:40 +08:00
committed by GitHub
parent e35988d1f9
commit a236ecf573
30 changed files with 417 additions and 116 deletions

View File

@@ -0,0 +1,6 @@
---
"@pnpm/headless": patch
"pnpm": patch
---
Also include missing deeply linked workspace packages at headless installation [#5034](https://github.com/pnpm/pnpm/issues/5034).

View File

@@ -0,0 +1,5 @@
---
"@pnpm/filter-lockfile": major
---
Breaking change to the API. Also include missing deeply linked workspace packages at headless installation.

View File

@@ -0,0 +1,5 @@
link-workspace-packages = deep
prefer-workspace-packages = true
shared-workspace-lockfile = true
save-workspace-protocol = rolling
registry=http://localhost:4873

View File

@@ -0,0 +1,7 @@
{
"name": "root",
"version": "1.0.0",
"dependencies": {
"is-positive": "1.0.0"
}
}

View File

@@ -0,0 +1,9 @@
{
"name": "@kenrick95/internal-f",
"version": "1.0.0",
"dependencies": {
"is-positive": "1.0.0",
"is-negative": "1.0.0"
}
}

View File

@@ -0,0 +1,8 @@
{
"name": "@kenrick95/internal-g",
"version": "1.0.0",
"dependencies": {
"@pnpm.e2e/external-depend-on-internal-dep": "1.0.0",
"is-positive": "1.0.0"
}
}

View File

@@ -0,0 +1,43 @@
lockfileVersion: 5.4
importers:
.:
specifiers:
is-positive: 1.0.0
dependencies:
is-positive: 1.0.0
packages/f:
specifiers:
is-negative: 1.0.0
is-positive: 1.0.0
dependencies:
is-negative: 1.0.0
is-positive: 1.0.0
packages/g:
specifiers:
'@pnpm.e2e/external-depend-on-internal-dep': 1.0.0
is-positive: 1.0.0
dependencies:
'@pnpm.e2e/external-depend-on-internal-dep': 1.0.0
is-positive: 1.0.0
packages:
/@pnpm.e2e/external-depend-on-internal-dep/1.0.0:
resolution: {integrity: sha512-UPhSnFgg3p1acuOcuWgunypA7tTqhVCBUUC4laNotJw1RUbTldprdLJmrhOvGylvw4VBipHnXPm/y9wTIAf53A==}
dependencies:
'@pnpm.e2e/internal-f': link:packages/f
dev: false
/is-negative/1.0.0:
resolution: {integrity: sha512-1aKMsFUc7vYQGzt//8zhkjRWPoYkajY/I5MJEvrc0pDoHXrW7n5ri8DYxhy3rR+Dk0QFl7GjHHsZU1sppQrWtw==}
engines: {node: '>=0.10.0'}
dev: false
/is-positive/1.0.0:
resolution: {integrity: sha512-xxzPGZ4P2uN6rROUa5N9Z7zTX6ERuE0hs6GUOc/cKBLF2NqKc16UwqHMt3tFg4CO6EBTE5UecUasg+3jZx3Ckg==}
engines: {node: '>=0.10.0'}
dev: false

View File

@@ -0,0 +1,2 @@
packages:
- 'packages/**'

View File

@@ -39,7 +39,7 @@
"@commitlint/prompt-cli": "^17.1.2",
"@pnpm/eslint-config": "workspace:*",
"@pnpm/meta-updater": "0.2.0",
"@pnpm/registry-mock": "3.0.0",
"@pnpm/registry-mock": "3.1.0",
"@pnpm/tsconfig": "workspace:*",
"@types/jest": "^29.1.2",
"@types/node": "^14.18.29",

View File

@@ -75,7 +75,7 @@
"@pnpm/git-utils": "workspace:*",
"@pnpm/package-store": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.0.0",
"@pnpm/registry-mock": "3.1.0",
"@pnpm/store-path": "workspace:*",
"@pnpm/test-fixtures": "workspace:*",
"@types/fs-extra": "^9.0.13",

View File

@@ -29,30 +29,27 @@ export default function filterByImportersAndEngine (
lockfileDir: string
skipped: Set<string>
}
): Lockfile {
const importerDeps = importerIds
.map((importerId) => lockfile.importers[importerId])
.map((importer) => ({
...(opts.include.dependencies ? importer.dependencies : {}),
...(opts.include.devDependencies ? importer.devDependencies : {}),
...(opts.include.optionalDependencies ? importer.optionalDependencies : {}),
}))
.map(Object.entries)
const directDepPaths = unnest(importerDeps)
.map(([pkgName, ref]) => dp.refToRelative(ref, pkgName))
.filter((nodeId) => nodeId !== null) as string[]
): { lockfile: Lockfile, selectedImporterIds: string[] } {
const importerIdSet = new Set(importerIds) as Set<string>
const packages = (lockfile.packages != null)
? pickPkgsWithAllDeps(lockfile.packages, directDepPaths, {
currentEngine: opts.currentEngine,
engineStrict: opts.engineStrict,
failOnMissingDependencies: opts.failOnMissingDependencies,
include: opts.include,
includeIncompatiblePackages: opts.includeIncompatiblePackages === true,
lockfileDir: opts.lockfileDir,
skipped: opts.skipped,
})
: {}
const directDepPaths = toImporterDepPaths(lockfile, importerIds, {
include: opts.include,
importerIdSet,
})
const packages =
lockfile.packages != null
? pickPkgsWithAllDeps(lockfile, directDepPaths, importerIdSet, {
currentEngine: opts.currentEngine,
engineStrict: opts.engineStrict,
failOnMissingDependencies: opts.failOnMissingDependencies,
include: opts.include,
includeIncompatiblePackages:
opts.includeIncompatiblePackages === true,
lockfileDir: opts.lockfileDir,
skipped: opts.skipped,
})
: {}
const importers = importerIds.reduce((acc, importerId) => {
acc[importerId] = filterImporter(lockfile.importers[importerId], opts.include)
@@ -68,15 +65,19 @@ export default function filterByImportersAndEngine (
}, { ...lockfile.importers })
return {
...lockfile,
importers,
packages,
lockfile: {
...lockfile,
importers,
packages,
},
selectedImporterIds: Array.from(importerIdSet),
}
}
function pickPkgsWithAllDeps (
pkgSnapshots: PackageSnapshots,
lockfile: Lockfile,
depPaths: string[],
importerIdSet: Set<string>,
opts: {
currentEngine: {
nodeVersion: string
@@ -91,14 +92,15 @@ function pickPkgsWithAllDeps (
}
) {
const pickedPackages = {} as PackageSnapshots
pkgAllDeps({ pkgSnapshots, pickedPackages }, depPaths, true, opts)
pkgAllDeps({ lockfile, pickedPackages, importerIdSet }, depPaths, true, opts)
return pickedPackages
}
function pkgAllDeps (
ctx: {
pkgSnapshots: PackageSnapshots
lockfile: Lockfile
pickedPackages: PackageSnapshots
importerIdSet: Set<string>
},
depPaths: string[],
parentIsInstallable: boolean,
@@ -117,7 +119,7 @@ function pkgAllDeps (
) {
for (const depPath of depPaths) {
if (ctx.pickedPackages[depPath]) continue
const pkgSnapshot = ctx.pkgSnapshots[depPath]
const pkgSnapshot = ctx.lockfile.packages![depPath]
if (!pkgSnapshot && !depPath.startsWith('link:')) {
if (opts.failOnMissingDependencies) {
throw new LockfileMissingDependencyError(depPath)
@@ -140,13 +142,15 @@ function pkgAllDeps (
libc: pkgSnapshot.libc,
}
// TODO: depPath is not the package ID. Should be fixed
installable = opts.includeIncompatiblePackages || packageIsInstallable(pkgSnapshot.id ?? depPath, pkg, {
engineStrict: opts.engineStrict,
lockfileDir: opts.lockfileDir,
nodeVersion: opts.currentEngine.nodeVersion,
optional: pkgSnapshot.optional === true,
pnpmVersion: opts.currentEngine.pnpmVersion,
}) !== false
installable =
opts.includeIncompatiblePackages ||
packageIsInstallable(pkgSnapshot.id ?? depPath, pkg, {
engineStrict: opts.engineStrict,
lockfileDir: opts.lockfileDir,
nodeVersion: opts.currentEngine.nodeVersion,
optional: pkgSnapshot.optional === true,
pnpmVersion: opts.currentEngine.pnpmVersion,
}) !== false
if (!installable) {
if (!ctx.pickedPackages[depPath] && pkgSnapshot.optional === true) {
opts.skipped.add(depPath)
@@ -156,14 +160,69 @@ function pkgAllDeps (
}
}
ctx.pickedPackages[depPath] = pkgSnapshot
const nextRelDepPaths = Object.entries(
{
...pkgSnapshot.dependencies,
...(opts.include.optionalDependencies ? pkgSnapshot.optionalDependencies : {}),
const { depPaths: nextRelDepPaths, importerIds: additionalImporterIds } = parseDepRefs(Object.entries({
...pkgSnapshot.dependencies,
...(opts.include.optionalDependencies
? pkgSnapshot.optionalDependencies
: {}),
}), ctx.lockfile)
additionalImporterIds.forEach((importerId) => ctx.importerIdSet.add(importerId))
nextRelDepPaths.push(
...toImporterDepPaths(ctx.lockfile, additionalImporterIds, {
include: opts.include,
importerIdSet: ctx.importerIdSet,
})
.map(([pkgName, ref]) => dp.refToRelative(ref, pkgName))
.filter((nodeId) => nodeId !== null) as string[]
)
pkgAllDeps(ctx, nextRelDepPaths, installable, opts)
}
}
function toImporterDepPaths (
lockfile: Lockfile,
importerIds: string[],
opts: {
include: { [dependenciesField in DependenciesField]: boolean }
importerIdSet: Set<string>
}
): string[] {
const importerDeps = importerIds
.map(importerId => lockfile.importers[importerId])
.map(importer => ({
...(opts.include.dependencies ? importer.dependencies : {}),
...(opts.include.devDependencies ? importer.devDependencies : {}),
...(opts.include.optionalDependencies
? importer.optionalDependencies
: {}),
}))
.map(Object.entries)
const { depPaths, importerIds: nextImporterIds } = parseDepRefs(unnest(importerDeps), lockfile)
if (!nextImporterIds.length) {
return depPaths
}
nextImporterIds.forEach((importerId) => {
opts.importerIdSet.add(importerId)
})
return [
...depPaths,
...toImporterDepPaths(lockfile, nextImporterIds, opts),
]
}
function parseDepRefs (refsByPkgNames: Array<[string, string]>, lockfile: Lockfile) {
return refsByPkgNames
.reduce((acc, [pkgName, ref]) => {
if (ref.startsWith('link:')) {
const importerId = ref.substring(5)
if (lockfile.importers[importerId]) {
acc.importerIds.push(importerId)
}
return acc
}
const depPath = dp.refToRelative(ref, pkgName)
if (depPath == null) return acc
acc.depPaths.push(depPath)
return acc
}, { depPaths: [] as string[], importerIds: [] as string[] })
}

View File

@@ -119,7 +119,7 @@ test('filterByImportersAndEngine(): skip packages that are not installable', ()
}
)
expect(filteredLockfile).toStrictEqual({
expect(filteredLockfile.lockfile).toStrictEqual({
importers: {
'project-1': {
dependencies: {
@@ -298,7 +298,7 @@ test('filterByImportersAndEngine(): filter the packages that set os and cpu', ()
}
)
expect(filteredLockfile).toStrictEqual({
expect(filteredLockfile.lockfile).toStrictEqual({
importers: {
'project-1': {
dependencies: {
@@ -466,7 +466,7 @@ test('filterByImportersAndEngine(): filter the packages that set libc', () => {
}
)
expect(filteredLockfile).toStrictEqual({
expect(filteredLockfile.lockfile).toStrictEqual({
importers: {
'project-1': {
dependencies: {
@@ -537,4 +537,115 @@ test('filterByImportersAndEngine(): filter the packages that set libc', () => {
},
})
expect(Array.from(skippedPackages)).toStrictEqual(['/preserve-existing-skipped/1.0.0', '/optional-dep/1.0.0', '/foo/1.0.0'])
})
})
test('filterByImportersAndEngine(): includes linked packages', () => {
const filteredLockfile = filterLockfileByImportersAndEngine(
{
importers: {
'project-1': {
dependencies: {
'project-2': 'link:project-2',
},
devDependencies: {
},
optionalDependencies: {
},
specifiers: {
'project-2': '^1.0.0',
},
},
'project-2': {
dependencies: {
'project-3': 'link:project-3',
foo: '1.0.0',
},
specifiers: {
foo: '^1.0.0',
},
},
'project-3': {
dependencies: {
bar: '1.0.0',
},
specifiers: {
bar: '^1.0.0',
},
},
},
lockfileVersion: LOCKFILE_VERSION,
packages: {
'/bar/1.0.0': {
resolution: { integrity: '' },
},
'/foo/1.0.0': {
resolution: { integrity: '' },
},
},
},
['project-1'],
{
currentEngine: {
nodeVersion: '10.0.0',
pnpmVersion: '2.0.0',
},
engineStrict: true,
failOnMissingDependencies: true,
include: {
dependencies: true,
devDependencies: true,
optionalDependencies: true,
},
lockfileDir: process.cwd(),
skipped: new Set(),
}
)
expect(filteredLockfile.lockfile).toStrictEqual({
importers: {
'project-1': {
dependencies: {
'project-2': 'link:project-2',
},
devDependencies: {
},
optionalDependencies: {
},
specifiers: {
'project-2': '^1.0.0',
},
},
'project-2': {
dependencies: {
'project-3': 'link:project-3',
foo: '1.0.0',
},
specifiers: {
foo: '^1.0.0',
},
},
'project-3': {
dependencies: {
bar: '1.0.0',
},
specifiers: {
bar: '^1.0.0',
},
},
},
lockfileVersion: LOCKFILE_VERSION,
packages: {
'/bar/1.0.0': {
resolution: { integrity: '' },
},
'/foo/1.0.0': {
resolution: { integrity: '' },
},
},
})
expect(filteredLockfile.selectedImporterIds).toStrictEqual([
'project-1',
'project-2',
'project-3',
])
})

View File

@@ -22,7 +22,7 @@
"@pnpm/package-store": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/read-projects-context": "workspace:*",
"@pnpm/registry-mock": "3.0.0",
"@pnpm/registry-mock": "3.1.0",
"@pnpm/store-path": "workspace:*",
"@pnpm/test-fixtures": "workspace:*",
"@types/fs-extra": "^9.0.13",

View File

@@ -240,10 +240,10 @@ export async function headlessInstall (opts: HeadlessOptions) {
registries: opts.registries,
skipped,
}
const importerIds = (opts.ignorePackageManifest === true || opts.nodeLinker === 'hoisted')
const initialImporterIds = (opts.ignorePackageManifest === true || opts.nodeLinker === 'hoisted')
? Object.keys(wantedLockfile.importers)
: selectedProjects.map(({ id }) => id)
const filteredLockfile = filterLockfileByImportersAndEngine(wantedLockfile, importerIds, {
const { lockfile: filteredLockfile, selectedImporterIds: importerIds } = filterLockfileByImportersAndEngine(wantedLockfile, initialImporterIds, {
...filterOpts,
currentEngine: opts.currentEngine,
engineStrict: opts.engineStrict,
@@ -251,6 +251,18 @@ export async function headlessInstall (opts: HeadlessOptions) {
includeIncompatiblePackages: opts.force,
lockfileDir,
})
// Update selectedProjects to add missing projects. importerIds will have the updated ids, found from deeply linked workspace projects
const initialImporterIdSet = new Set(initialImporterIds)
const missingIds = importerIds.filter((importerId) => !initialImporterIdSet.has(importerId))
if (missingIds.length > 0) {
for (const project of Object.values(opts.allProjects)) {
if (missingIds.includes(project.id)) {
selectedProjects.push(project)
}
}
}
const lockfileToDepGraphOpts = {
...opts,
importerIds,

View File

@@ -831,3 +831,29 @@ test('installing in a workspace with node-linker=hoisted', async () => {
function readPkgVersion (dir: string): string {
return loadJsonFile.sync<{ version: string }>(path.join(dir, 'package.json')).version
}
test('installing a package deeply installs all required dependencies', async () => {
const workspaceFixture = f.prepare('workspace-external-depends-deep')
const projects = [
path.join(workspaceFixture),
path.join(workspaceFixture, 'packages/f'),
path.join(workspaceFixture, 'packages/g'),
workspaceFixture,
]
await headlessInstall(
await testDefaults({
lockfileDir: workspaceFixture,
projects,
selectedProjectDirs: [projects[2]],
})
)
for (const projectDir of projects) {
if (projectDir === workspaceFixture) {
continue
}
const projectAssertion = assertProject(projectDir)
expect(projectAssertion.requireModule('is-positive')).toBeTruthy()
}
})

View File

@@ -28,7 +28,7 @@ export default async function testDefaults (
let storeDir = opts?.storeDir ?? path.join(tmp, 'store')
const cacheDir = path.join(tmp, 'cache')
const lockfileDir = opts?.lockfileDir ?? process.cwd()
const { include, pendingBuilds, projects, registries } = await readProjectsContext(
const { include, pendingBuilds, projects } = await readProjectsContext(
opts.projects
? opts.projects.map((rootDir: string) => ({ rootDir }))
: [
@@ -75,12 +75,12 @@ export default async function testDefaults (
version: '1.0.0',
},
pendingBuilds,
selectedProjectDirs: projects.map((project) => project.rootDir),
selectedProjectDirs: opts.selectedProjectDirs ?? projects.map((project) => project.rootDir),
allProjects: fromPairs(
await Promise.all(projects.map(async (project) => [project.rootDir, { ...project, manifest: await safeReadPackageFromDir(project.rootDir) }]))
),
rawConfig: {},
registries: registries ?? {
registries: {
default: registry,
},
sideEffectsCache: true,

View File

@@ -67,7 +67,7 @@
"@pnpm/client": "workspace:*",
"@pnpm/create-cafs-store": "workspace:*",
"@pnpm/package-requester": "workspace:*",
"@pnpm/registry-mock": "3.0.0",
"@pnpm/registry-mock": "3.1.0",
"@pnpm/test-fixtures": "workspace:*",
"@types/normalize-path": "^3.0.0",
"@types/ramda": "0.28.15",

View File

@@ -42,7 +42,7 @@
"@pnpm/lockfile-types": "workspace:*",
"@pnpm/plugin-commands-deploy": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.0.0"
"@pnpm/registry-mock": "3.1.0"
},
"dependencies": {
"@pnpm/cli-utils": "workspace:*",

View File

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

View File

@@ -37,7 +37,7 @@
"@pnpm/plugin-commands-installation": "workspace:*",
"@pnpm/plugin-commands-listing": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.0.0",
"@pnpm/registry-mock": "3.1.0",
"@types/ramda": "0.28.15",
"execa": "npm:safe-execa@^0.1.2",
"strip-ansi": "^6.0.1",

View File

@@ -38,7 +38,7 @@
"@pnpm/plugin-commands-installation": "workspace:*",
"@pnpm/plugin-commands-outdated": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.0.0",
"@pnpm/registry-mock": "3.1.0",
"@types/ramda": "0.28.15",
"@types/wrap-ansi": "^3.0.0",
"@types/zkochan__table": "npm:@types/table@6.0.0"

View File

@@ -35,7 +35,7 @@
"devDependencies": {
"@pnpm/plugin-commands-patching": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.0.0",
"@pnpm/registry-mock": "3.1.0",
"@types/ramda": "0.28.15"
},
"dependencies": {

View File

@@ -38,7 +38,7 @@
"@pnpm/filter-workspace-packages": "workspace:*",
"@pnpm/plugin-commands-publishing": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.0.0",
"@pnpm/registry-mock": "3.1.0",
"@types/cross-spawn": "^6.0.2",
"@types/is-ci": "^3.0.0",
"@types/is-windows": "^1.0.0",

View File

@@ -36,7 +36,7 @@
"@pnpm/filter-workspace-packages": "workspace:*",
"@pnpm/plugin-commands-rebuild": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.0.0",
"@pnpm/registry-mock": "3.1.0",
"@pnpm/test-fixtures": "workspace:*",
"@types/ramda": "0.28.15",
"@types/semver": "7.3.12",

View File

@@ -37,7 +37,7 @@
"@pnpm/filter-workspace-packages": "workspace:*",
"@pnpm/plugin-commands-script-runners": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.0.0",
"@pnpm/registry-mock": "3.1.0",
"@types/is-windows": "^1.0.0",
"@types/ramda": "0.28.15",
"is-windows": "^1.0.2",

View File

@@ -37,7 +37,7 @@
"@pnpm/lockfile-file": "workspace:*",
"@pnpm/plugin-commands-store": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.0.0",
"@pnpm/registry-mock": "3.1.0",
"@types/archy": "0.0.32",
"@types/ramda": "0.28.15",
"@types/ssri": "^7.1.1",

View File

@@ -56,7 +56,7 @@
"@pnpm/prepare": "workspace:*",
"@pnpm/read-package-json": "workspace:*",
"@pnpm/read-project-manifest": "workspace:*",
"@pnpm/registry-mock": "3.0.0",
"@pnpm/registry-mock": "3.1.0",
"@pnpm/run-npm": "workspace:*",
"@pnpm/tabtab": "^0.1.2",
"@pnpm/types": "workspace:*",

102
pnpm-lock.yaml generated
View File

@@ -59,8 +59,8 @@ importers:
specifier: 0.2.0
version: 0.2.0_typanion@3.12.0
'@pnpm/registry-mock':
specifier: 3.0.0
version: 3.0.0_typanion@3.12.0
specifier: 3.1.0
version: 3.1.0_typanion@3.12.0
'@pnpm/tsconfig':
specifier: workspace:*
version: link:utils/tsconfig
@@ -726,8 +726,8 @@ importers:
specifier: workspace:*
version: link:../../privatePackages/prepare
'@pnpm/registry-mock':
specifier: 3.0.0
version: 3.0.0_typanion@3.12.0
specifier: 3.1.0
version: 3.1.0_typanion@3.12.0
'@pnpm/store-path':
specifier: workspace:*
version: link:../store-path
@@ -1655,8 +1655,8 @@ importers:
specifier: workspace:*
version: link:../read-projects-context
'@pnpm/registry-mock':
specifier: 3.0.0
version: 3.0.0_typanion@3.12.0
specifier: 3.1.0
version: 3.1.0_typanion@3.12.0
'@pnpm/store-path':
specifier: workspace:*
version: link:../store-path
@@ -2795,8 +2795,8 @@ importers:
specifier: workspace:*
version: 'link:'
'@pnpm/registry-mock':
specifier: 3.0.0
version: 3.0.0_typanion@3.12.0
specifier: 3.1.0
version: 3.1.0_typanion@3.12.0
'@pnpm/test-fixtures':
specifier: workspace:*
version: link:../../privatePackages/test-fixtures
@@ -3094,8 +3094,8 @@ importers:
specifier: workspace:*
version: link:../../privatePackages/prepare
'@pnpm/registry-mock':
specifier: 3.0.0
version: 3.0.0_typanion@3.12.0
specifier: 3.1.0
version: 3.1.0_typanion@3.12.0
packages/plugin-commands-env:
dependencies:
@@ -3361,8 +3361,8 @@ importers:
specifier: workspace:*
version: link:../../privatePackages/prepare
'@pnpm/registry-mock':
specifier: 3.0.0
version: 3.0.0_typanion@3.12.0
specifier: 3.1.0
version: 3.1.0_typanion@3.12.0
'@pnpm/test-fixtures':
specifier: workspace:*
version: link:../../privatePackages/test-fixtures
@@ -3461,8 +3461,8 @@ importers:
specifier: workspace:*
version: link:../../privatePackages/prepare
'@pnpm/registry-mock':
specifier: 3.0.0
version: 3.0.0_typanion@3.12.0
specifier: 3.1.0
version: 3.1.0_typanion@3.12.0
'@types/ramda':
specifier: 0.28.15
version: 0.28.15
@@ -3558,8 +3558,8 @@ importers:
specifier: workspace:*
version: link:../../privatePackages/prepare
'@pnpm/registry-mock':
specifier: 3.0.0
version: 3.0.0_typanion@3.12.0
specifier: 3.1.0
version: 3.1.0_typanion@3.12.0
'@types/ramda':
specifier: 0.28.15
version: 0.28.15
@@ -3625,8 +3625,8 @@ importers:
specifier: workspace:*
version: link:../../privatePackages/prepare
'@pnpm/registry-mock':
specifier: 3.0.0
version: 3.0.0_typanion@3.12.0
specifier: 3.1.0
version: 3.1.0_typanion@3.12.0
'@types/ramda':
specifier: 0.28.15
version: 0.28.15
@@ -3725,8 +3725,8 @@ importers:
specifier: workspace:*
version: link:../../privatePackages/prepare
'@pnpm/registry-mock':
specifier: 3.0.0
version: 3.0.0_typanion@3.12.0
specifier: 3.1.0
version: 3.1.0_typanion@3.12.0
'@types/cross-spawn':
specifier: ^6.0.2
version: 6.0.2
@@ -3879,8 +3879,8 @@ importers:
specifier: workspace:*
version: link:../../privatePackages/prepare
'@pnpm/registry-mock':
specifier: 3.0.0
version: 3.0.0_typanion@3.12.0
specifier: 3.1.0
version: 3.1.0_typanion@3.12.0
'@pnpm/test-fixtures':
specifier: workspace:*
version: link:../../privatePackages/test-fixtures
@@ -3985,8 +3985,8 @@ importers:
specifier: workspace:*
version: link:../../privatePackages/prepare
'@pnpm/registry-mock':
specifier: 3.0.0
version: 3.0.0_typanion@3.12.0
specifier: 3.1.0
version: 3.1.0_typanion@3.12.0
'@types/is-windows':
specifier: ^1.0.0
version: 1.0.0
@@ -4174,8 +4174,8 @@ importers:
specifier: workspace:*
version: link:../../privatePackages/prepare
'@pnpm/registry-mock':
specifier: 3.0.0
version: 3.0.0_typanion@3.12.0
specifier: 3.1.0
version: 3.1.0_typanion@3.12.0
'@types/archy':
specifier: 0.0.32
version: 0.0.32
@@ -4205,7 +4205,7 @@ importers:
optionalDependencies:
node-gyp:
specifier: ^9.2.0
version: 9.2.0
version: 9.3.0
devDependencies:
'@pnpm/assert-project':
specifier: workspace:*
@@ -4319,8 +4319,8 @@ importers:
specifier: workspace:*
version: link:../read-project-manifest
'@pnpm/registry-mock':
specifier: 3.0.0
version: 3.0.0_typanion@3.12.0
specifier: 3.1.0
version: 3.1.0_typanion@3.12.0
'@pnpm/run-npm':
specifier: workspace:*
version: link:../run-npm
@@ -5225,8 +5225,8 @@ importers:
specifier: workspace:*
version: link:../../packages/modules-yaml
'@pnpm/registry-mock':
specifier: 3.0.0
version: 3.0.0_typanion@3.12.0
specifier: 3.1.0
version: 3.1.0_typanion@3.12.0
'@pnpm/types':
specifier: workspace:*
version: link:../../packages/types
@@ -5265,8 +5265,8 @@ importers:
specifier: workspace:*
version: link:../../packages/cafs
'@pnpm/registry-mock':
specifier: 3.0.0
version: 3.0.0_typanion@3.12.0
specifier: 3.1.0
version: 3.1.0_typanion@3.12.0
path-exists:
specifier: ^4.0.0
version: 4.0.0
@@ -7698,8 +7698,8 @@ packages:
- typanion
dev: true
/@pnpm/registry-mock/3.0.0_typanion@3.12.0:
resolution: {integrity: sha512-/e6P2sVX+1frYDl7z4qAnRHEU2VG4RUu4vcsoSZdc9LFi93ZxQ9gbuF066aR+T3S+JcFFjHNZXfJUj8ZaTfssg==}
/@pnpm/registry-mock/3.1.0_typanion@3.12.0:
resolution: {integrity: sha512-uOWJxzqNOutPbeH+yQW+cYwg0yM1eCdaMWstlIVjBCCoJ2IEpwsi3KhQnCDmMKZbqqUdPDcHTQaYzMKVG0WAFQ==}
engines: {node: '>=10.13'}
hasBin: true
dependencies:
@@ -7977,7 +7977,7 @@ packages:
/@types/byline/4.2.33:
resolution: {integrity: sha512-LJYez7wrWcJQQDknqZtrZuExMGP0IXmPl1rOOGDqLbu+H7UNNRfKNuSxCBcQMLH1EfjeWidLedC/hCc5dDfBog==}
dependencies:
'@types/node': 18.8.4
'@types/node': 18.8.5
dev: true
/@types/cacheable-request/6.0.2:
@@ -8132,6 +8132,10 @@ packages:
/@types/node/18.8.4:
resolution: {integrity: sha512-WdlVphvfR/GJCLEMbNA8lJ0lhFNBj4SW3O+O5/cEGw9oYrv0al9zTwuQsq+myDUXgNx2jgBynoVgZ2MMJ6pbow==}
/@types/node/18.8.5:
resolution: {integrity: sha512-Bq7G3AErwe5A/Zki5fdD3O6+0zDChhg671NfPjtIcbtzDNZTv4NPKMRFr7gtYPG7y+B8uTiNK4Ngd9T0FTar6Q==}
dev: true
/@types/normalize-package-data/2.4.1:
resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
dev: true
@@ -9889,7 +9893,7 @@ packages:
hasBin: true
dependencies:
graceful-fs: 4.2.10
minimist: 1.2.6
minimist: 1.2.7
mkdirp: 0.5.6
rimraf: 2.7.1
@@ -10076,8 +10080,8 @@ packages:
engines: {node: '>=10'}
dev: true
/decimal.js/10.4.1:
resolution: {integrity: sha512-F29o+vci4DodHYT9UrR5IEbfBw9pE5eSapIJdTqXK5+6hq+t8VRxwQyKlW2i+KDKFkkJQRvFyI/QXD83h8LyQw==}
/decimal.js/10.4.2:
resolution: {integrity: sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==}
/decompress-maybe/1.0.0:
resolution: {integrity: sha512-av8/KhXWRUYQ7lGTl/9Gtizz3nQ+7NqDFm/I4Lx+JvTbzHiD4WqfqxMO4YYi91FTqffoBDCYPfIvofwQZwZ3ZQ==}
@@ -11728,7 +11732,7 @@ packages:
engines: {node: '>=0.4.7'}
hasBin: true
dependencies:
minimist: 1.2.6
minimist: 1.2.7
neo-async: 2.6.2
source-map: 0.6.1
wordwrap: 1.0.0
@@ -12857,7 +12861,7 @@ packages:
cssom: 0.4.4
cssstyle: 2.3.0
data-urls: 2.0.0
decimal.js: 10.4.1
decimal.js: 10.4.2
domexception: 2.0.1
escodegen: 2.0.0
form-data: 3.0.1
@@ -13612,6 +13616,9 @@ packages:
/minimist/1.2.6:
resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==}
/minimist/1.2.7:
resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==}
/minipass-collect/1.0.2:
resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==}
engines: {node: '>= 8'}
@@ -13699,7 +13706,7 @@ packages:
resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
hasBin: true
dependencies:
minimist: 1.2.6
minimist: 1.2.7
/mkdirp/1.0.4:
resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
@@ -13880,8 +13887,8 @@ packages:
- bluebird
- supports-color
/node-gyp/9.2.0:
resolution: {integrity: sha512-/+/YxGfIJOh/fnMsr4Ep0v6oOIjnO1BgLd2dcDspBX1spTkQU7xSIox5RdRE/2/Uq3ZwK8Z5swRIbMUmPlslmg==}
/node-gyp/9.3.0:
resolution: {integrity: sha512-A6rJWfXFz7TQNjpldJ915WFb1LnhO4lIve3ANPbWreuEoLoKlFT3sxIepPBkLhM27crW8YmN+pjlgbasH6cH/Q==}
engines: {node: ^12.22 || ^14.13 || >=16}
hasBin: true
requiresBuild: true
@@ -14034,6 +14041,7 @@ packages:
/npmlog/4.1.2:
resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==}
requiresBuild: true
dependencies:
are-we-there-yet: 1.1.7
console-control-strings: 1.1.0
@@ -14370,7 +14378,7 @@ packages:
fs-extra: 7.0.1
is-ci: 2.0.0
klaw-sync: 6.0.0
minimist: 1.2.6
minimist: 1.2.7
open: 7.4.2
rimraf: 2.7.1
semver: 5.7.1
@@ -17132,7 +17140,7 @@ time:
/@pnpm/npm-package-arg/1.0.0: '2022-06-28T12:48:31.287Z'
/@pnpm/os.env.path-extender/0.2.6: '2022-08-08T10:36:30.986Z'
/@pnpm/ramda/0.28.1: '2022-08-03T13:56:59.597Z'
/@pnpm/registry-mock/3.0.0: '2022-09-04T20:12:48.942Z'
/@pnpm/registry-mock/3.1.0: '2022-10-13T19:59:17.408Z'
/@pnpm/semver-diff/1.1.0: '2021-11-16T12:40:59.941Z'
/@pnpm/tabtab/0.1.2: '2021-03-05T17:31:19.932Z'
/@types/adm-zip/0.4.34: '2021-04-04T18:01:23.318Z'
@@ -17261,7 +17269,7 @@ time:
/micromatch/4.0.5: '2022-03-24T19:31:47.722Z'
/nock/13.2.9: '2022-07-19T18:34:55.582Z'
/node-fetch/3.0.0-beta.9: '2020-09-05T12:52:27.791Z'
/node-gyp/9.2.0: '2022-10-04T10:40:24.552Z'
/node-gyp/9.3.0: '2022-10-11T04:54:21.968Z'
/normalize-newline/3.0.0: '2016-09-06T12:35:43.571Z'
/normalize-package-data/4.0.1: '2022-08-15T21:03:50.558Z'
/normalize-path/3.0.0: '2018-04-19T14:54:47.609Z'

View File

@@ -44,7 +44,7 @@
"@pnpm/constants": "workspace:*",
"@pnpm/lockfile-types": "workspace:*",
"@pnpm/modules-yaml": "workspace:*",
"@pnpm/registry-mock": "3.0.0",
"@pnpm/registry-mock": "3.1.0",
"@pnpm/types": "workspace:*",
"is-windows": "^1.0.2",
"isexe": "2.0.0",

View File

@@ -41,7 +41,7 @@
},
"dependencies": {
"@pnpm/cafs": "workspace:*",
"@pnpm/registry-mock": "3.0.0",
"@pnpm/registry-mock": "3.1.0",
"path-exists": "^4.0.0"
},
"devDependencies": {