chore(release): drop the packing workarounds and pin pacquet 12.0.0-alpha.19 (#13241)

* chore(release): drop the packing workarounds now that pacquet 12.0.0-alpha.19 is pinned

The pinned pacquet now carries the fs-packlist fix from
https://github.com/pnpm/pnpm/pull/13231, so a files allowlist wins over
workspace-inherited ignore rules and the release workflow no longer
needs to neutralize them: remove the empty pnpm11/pnpm/.npmignore
override, the temporary root .gitignore shadow, and the pre-publish
payload verification step (with its script) that guarded against the
now-fixed empty-tarball packing bug. The payload-verify step was also
what broke the v11.17.0 release: its filtered pn list fired a
verifyDepsBeforeRun auto-install that pruned the excluded pnpm
project's node_modules, so the darwin-arm64 artifact's prepublishOnly
could no longer resolve symlink-dir.

`@pnpm/prepare` and `@pnpm/prepare-temp-dir` were the only
publishable packages without a files allowlist; their lib/ payload
survived packing only through the .gitignore shadow. Give them files
allowlists so their tarballs no longer depend on workspace ignore
state.

* chore: record the pacquet 12.0.0-alpha.19 pin in the lockfile

* chore: drop the changeset - both files-allowlist fixes ship without a new version

The pending `@pnpm/prepare` 1100.0.22 is not on npm yet, so the rerun
of the v11.17.0 release publishes it with the files allowlist already
in place. `@pnpm/prepare-temp-dir` 1100.0.1 is already published with
correct tarball content (packed under the .gitignore shadow), so its
manifest-only change needs no republish. A changeset would only
schedule a patch release whose sole delta is the manifest field.
This commit is contained in:
Zoltan Kochan
2026-07-23 18:13:15 +02:00
committed by GitHub
parent d1d53e484b
commit 5819fc671e
6 changed files with 58 additions and 376 deletions

View File

@@ -1,246 +0,0 @@
#!/usr/bin/env node
// Verifies that packed tarballs contain every payload file the manifest
// declares (`files`, `main`, `module`, `types`, `exports`, `browser`,
// `bin`, `publishConfig.executableFiles`), so a packing regression fails
// the release before the first immutable npm publish
// (https://github.com/pnpm/pnpm/issues/13164).
//
// Release mode consumes the output of `pnpm pack --dry-run --json`
// (an entry per project with the tarball's file list), so no tarball is
// ever written or read. The single-package mode reads one real tarball's
// listing for debugging, e.g. against a downloaded npm artifact.
import { lstatSync, readFileSync, readdirSync } from 'node:fs'
import { basename, isAbsolute, posix, relative, resolve } from 'node:path'
import { spawnSync } from 'node:child_process'
const args = parseArgs(process.argv.slice(2))
if (args.projects) {
verifyPackedProjects(args)
} else if (args.packageDir && args.tarball) {
verifyPackage(args.packageDir, readTarballListing(args.tarball), args.tarball)
} else {
usage('expected either --projects/--pack-json or --package-dir/--tarball')
}
function verifyPackedProjects ({ projects, packJsons }) {
if (packJsons.length === 0) usage('missing --pack-json')
const packedById = new Map()
for (const packJson of packJsons) {
for (const packedPackage of normalizeArray(readJson(packJson))) {
if (!Array.isArray(packedPackage.files)) {
throw new Error(`Packed entry for ${packedPackage.name}@${packedPackage.version} carries no file list; pass the output of \`pnpm pack --dry-run --json\``)
}
packedById.set(
`${packedPackage.name}@${packedPackage.version}`,
new Set(packedPackage.files.map((file) => file.path))
)
}
}
const publishable = readJson(projects).filter(
(project) => !project.private && project.name && project.version && project.path
)
if (publishable.length === 0) {
throw new Error(`No publishable projects listed in ${projects}`)
}
const failures = []
const unpacked = publishable.filter((project) => !packedById.has(`${project.name}@${project.version}`))
if (unpacked.length > 0) {
failures.push(`Publishable projects missing from the pack result: ${unpacked.map((project) => project.name).join(', ')}`)
}
for (const project of publishable) {
const packedFiles = packedById.get(`${project.name}@${project.version}`)
if (!packedFiles) continue
try {
verifyPackage(project.path, packedFiles, 'pack result')
} catch (error) {
failures.push(error.message)
}
}
if (failures.length > 0) {
throw new Error(`Payload verification failed:\n\n${failures.join('\n\n')}`)
}
console.log(`Verified payloads of ${publishable.length} packages`)
}
function verifyPackage (packageDir, packedFiles, packedSource) {
const packageRoot = resolve(packageDir)
const manifest = readJson(resolve(packageRoot, 'package.json'))
const expectedFiles = collectExpectedFiles(packageRoot, manifest)
if (expectedFiles.size === 0) {
console.log(`No literal package payload files declared by ${manifest.name ?? packageDir}`)
return
}
const missing = [...expectedFiles].filter((file) => !packedFiles.has(file)).sort()
if (missing.length > 0) {
throw new Error(`Payload files of ${manifest.name ?? packageDir} missing from ${packedSource}:\n ${missing.join('\n ')}`)
}
console.log(`Verified ${expectedFiles.size} payload files for ${manifest.name ?? packageDir}`)
}
function collectExpectedFiles (packageDir, manifest) {
const files = new Set()
const excluded = (manifest.files ?? [])
.filter((file) => typeof file === 'string' && file.startsWith('!'))
.map((file) => globMatcher(file.slice(1)))
const add = (file) => {
if (typeof file !== 'string' || file.length === 0) return
if (file === 'package.json' || file === './package.json') return
if (!file.startsWith('./') && file.startsWith('.') && !file.startsWith('..')) return
const relative = normalizeRelative(file)
if (relative === 'package.json') return
if (isExcluded(relative, excluded)) return
const source = resolvePayloadPath(packageDir, relative)
const stat = lstatSync(source, { throwIfNoEntry: false })
if (stat?.isSymbolicLink()) {
throw new Error(`Payload file cannot be a symlink: ${source}`)
}
if (stat?.isFile()) {
files.add(relative)
return
}
if (!stat?.isDirectory()) {
throw new Error(`Missing payload file ${source}`)
}
for (const entry of readdirSync(source, { withFileTypes: true })) {
add(posix.join(relative, entry.name))
}
}
for (const file of manifest.files ?? []) {
if (typeof file === 'string' && !file.startsWith('!') && !/[?*[]/.test(file)) add(file)
}
add(manifest.main)
add(manifest.module)
add(manifest.types)
add(manifest.typings)
addExportTargets(manifest.exports, add)
addExportTargets(manifest.browser, add)
for (const file of Object.values(typeof manifest.bin === 'string' ? { default: manifest.bin } : manifest.bin ?? {})) add(file)
for (const file of manifest.publishConfig?.executableFiles ?? []) add(file)
return files
}
function addExportTargets (value, add) {
if (typeof value === 'string') {
if (value.startsWith('./')) add(value)
return
}
if (Array.isArray(value)) {
for (const item of value) addExportTargets(item, add)
return
}
if (value && typeof value === 'object') {
for (const item of Object.values(value)) addExportTargets(item, add)
}
}
function readTarballListing (tarball) {
const result = spawnSync('tar', ['-tf', tarball], {
encoding: 'utf8',
maxBuffer: 1024 * 1024 * 64,
})
if (result.error) {
throw new Error(`Failed to list ${tarball}: ${result.error.message}`)
}
if (result.status !== 0) {
throw new Error(`Failed to list ${tarball}${result.stderr ? `\n${result.stderr}` : ''}`)
}
return new Set(
result.stdout
.split('\n')
.filter((entry) => entry.startsWith('package/'))
.map((entry) => entry.slice('package/'.length))
)
}
function globMatcher (pattern) {
const normalized = normalizeRelative(pattern)
const regexp = globToRegExp(normalized)
const basenameRegexp = normalized.includes('/') ? null : globToRegExp(normalized)
return (file) => regexp.test(file) || (basenameRegexp?.test(basename(file)) ?? false)
}
function isExcluded (file, excluded) {
return excluded.some((matcher) => matcher(file))
}
function globToRegExp (pattern) {
return new RegExp(
'^' +
pattern
.replace(/[.$+^{}()|[\]\\]/g, '\\$&')
.replace(/\*\*\//g, '\x00')
.replace(/\*\*/g, '\x01')
.replace(/\*/g, '[^/]*')
.replace(/\?/g, '[^/]')
.replace(/\x00/g, '(?:.*/)?')
.replace(/\x01/g, '.*') +
'$'
)
}
function normalizeRelative (file) {
const normalizedInput = file.replace(/\\/g, '/')
if (normalizedInput.startsWith('/') || /^[A-Za-z]:\//.test(normalizedInput)) {
throw new Error(`Payload file path must be relative: ${file}`)
}
const normalized = posix.normalize(normalizedInput.replace(/^\.\//, ''))
if (normalized === '.' || normalized === '..' || normalized.startsWith('../') || normalized.split('/').includes('..')) {
throw new Error(`Payload file path escapes package directory: ${file}`)
}
return normalized
}
function resolvePayloadPath (packageDir, file) {
const source = resolve(packageDir, file)
const relativeSource = relative(packageDir, source)
if (relativeSource === '' || relativeSource.startsWith('..') || isAbsolute(relativeSource)) {
throw new Error(`Payload file path escapes package directory: ${file}`)
}
return source
}
function readJson (file) {
return JSON.parse(readFileSync(file, 'utf8'))
}
function normalizeArray (value) {
return Array.isArray(value) ? value : [value]
}
function parseArgs (rawArgs) {
const args = { packJsons: [] }
for (let i = 0; i < rawArgs.length; i++) {
const arg = rawArgs[i]
if (arg === '--projects') {
args.projects = rawArgs[++i]
} else if (arg === '--pack-json') {
args.packJsons.push(rawArgs[++i])
} else if (arg === '--package-dir') {
args.packageDir = rawArgs[++i]
} else if (arg === '--tarball') {
args.tarball = rawArgs[++i]
} else {
usage(`unknown argument: ${arg}`)
}
}
return args
}
function usage (message) {
console.error(message)
console.error(`Usage:
verify-packed-package-payload.mjs --projects <projects.json> --pack-json <pack.json> [--pack-json <more.json>...]
verify-packed-package-payload.mjs --package-dir <dir> --tarball <file>`)
process.exit(1)
}

View File

@@ -204,19 +204,6 @@ jobs:
uses: pnpm/setup@77cf06832101b3ac8c65caaf76a21643936d07a4
with:
runtime: node@26.5.0
- name: Override workspace ignores for the TypeScript pnpm package
run: ': > pnpm11/pnpm/.npmignore'
- name: Shadow the root .gitignore for packing (TEMPORARY)
# The pinned pacquet (12.0.0-alpha.13 and later, until the fix from
# https://github.com/pnpm/pnpm/pull/13231 ships) lets workspace-root
# ignore rules exclude files matched by a package's `files` allowlist,
# so every lib package published with it shipped nearly empty:
# https://github.com/pnpm/pnpm/issues/13164. The packlist prefers a
# root .npmignore over the root .gitignore, so shadow the .gitignore
# with only its junk rules (crucially not `lib`/`dist`, the compiled
# payload of every lib package). Remove this step once
# `packageManager` pins a pacquet release that carries the fix.
run: printf '*.tsbuildinfo\n*.log\n' > .npmignore
- name: Build TypeScript executable artifacts
run: pn --filter=@pnpm/exe run build-artifacts
@@ -371,19 +358,6 @@ jobs:
uses: pnpm/setup@77cf06832101b3ac8c65caaf76a21643936d07a4
with:
runtime: node@26.5.0
- name: Override workspace ignores for the TypeScript pnpm package
run: ': > pnpm11/pnpm/.npmignore'
- name: Shadow the root .gitignore for packing (TEMPORARY)
# The pinned pacquet (12.0.0-alpha.13 and later, until the fix from
# https://github.com/pnpm/pnpm/pull/13231 ships) lets workspace-root
# ignore rules exclude files matched by a package's `files` allowlist,
# so every lib package published with it shipped nearly empty:
# https://github.com/pnpm/pnpm/issues/13164. The packlist prefers a
# root .npmignore over the root .gitignore, so shadow the .gitignore
# with only its junk rules (crucially not `lib`/`dist`, the compiled
# payload of every lib package). Remove this step once
# `packageManager` pins a pacquet release that carries the fix.
run: printf '*.tsbuildinfo\n*.log\n' > .npmignore
# The publish phase is split into three sequential steps to control which packages
# use trusted publishing (OIDC) vs. a static token. `pnpm publish` currently bails
# out of OIDC as soon as a static `_authToken` is configured, so the only way to
@@ -392,58 +366,6 @@ jobs:
# for the longer-term fix that lets OIDC override a configured token.
- name: Build TypeScript executable artifacts
run: pn --filter=@pnpm/exe run build-artifacts
- name: Verify internal workspace package payloads
# A dry-run recursive pack runs the exact packing code the publish
# steps below will use and reports every tarball's file list, so a
# packing regression fails here, before the first immutable npm
# publish. `pnpm pack` does not run `prepublishOnly`, so the
# publishable projects' src tsconfigs are built first — only those:
# the typecheck-everything graph also drags in test tsconfigs,
# whose devDependencies this runner's install does not provide
# (mostly warm after the build-artifacts step above anyway). The
# publishable projects are selected by explicit name filters:
# unlike recursive publish, recursive pack does not skip private
# packages, and packing the private workspace root would walk the
# whole repository.
run: |
set -euo pipefail
verify_dir=$(mktemp -d)
pn list --filter=!pnpm --filter=!@pnpm/exe --depth=-1 --json > "$verify_dir/projects.json"
filters=()
tsconfig_dirs=()
while IFS=$'\t' read -r name dir; do
filters+=("--filter=$name")
if [ -n "$dir" ]; then
tsconfig_dirs+=("$dir")
fi
done < <(node -e '
const { existsSync } = require("node:fs")
const { join } = require("node:path")
const projects = JSON.parse(require("node:fs").readFileSync(process.argv[1], "utf8"))
for (const project of projects) {
if (!project.private && project.name && project.version && project.path) {
const dir = existsSync(join(project.path, "tsconfig.json")) ? project.path : ""
console.log(`${project.name}\t${dir}`)
}
}
' "$verify_dir/projects.json")
pn exec tsgo --build "${tsconfig_dirs[@]}"
# Recursive pack runs one project at a time, so pack in four
# concurrent chunks; dry-run packing only reads the tree.
chunk_size=$(( (${#filters[@]} + 3) / 4 ))
pack_pids=()
verify_args=(--projects "$verify_dir/projects.json")
for start in $(seq 0 "$chunk_size" $(( ${#filters[@]} - 1 ))); do
pn pack --dry-run --json "${filters[@]:start:chunk_size}" > "$verify_dir/pack-$start.json" &
pack_pids+=($!)
verify_args+=(--pack-json "$verify_dir/pack-$start.json")
done
for pid in "${pack_pids[@]}"; do
wait "$pid"
done
node .github/scripts/verify-packed-package-payload.mjs "${verify_args[@]}"
- name: Publish @pnpm/exe (trusted publishing)
# No NPM_TOKEN: pnpm has no static token to short-circuit on, so it will perform
# the OIDC token exchange against npm's trusted-publishing config for `@pnpm/exe`.

View File

@@ -59,11 +59,11 @@
"shx": "catalog:",
"typescript": "catalog:"
},
"packageManager": "pnpm@12.0.0-alpha.18",
"packageManager": "pnpm@12.0.0-alpha.19",
"devEngines": {
"packageManager": {
"name": "pnpm",
"version": "12.0.0-alpha.18",
"version": "12.0.0-alpha.19",
"onFail": "download"
},
"runtime": {

100
pnpm-lock.yaml generated
View File

@@ -7,115 +7,115 @@ importers:
configDependencies: {}
packageManagerDependencies:
'@pnpm/exe':
specifier: 12.0.0-alpha.18
version: 12.0.0-alpha.18
specifier: 12.0.0-alpha.19
version: 12.0.0-alpha.19
pnpm:
specifier: 12.0.0-alpha.18
version: 12.0.0-alpha.18
specifier: 12.0.0-alpha.19
version: 12.0.0-alpha.19
packages:
'@pnpm/exe.darwin-arm64@12.0.0-alpha.18':
resolution: {integrity: sha512-/cm02lfYwloOm6IUps/0mkCdrd+5XSb/9ZVULmJhmk98cGaRWkMLACr5KI2UQFlXn1MfV9UZtBisrdmgJEJUQw==}
'@pnpm/exe.darwin-arm64@12.0.0-alpha.19':
resolution: {integrity: sha512-R0A9WtrD8w1iug7cxxkWjFCI1lB/gURBUcXLhSa3toIC9PNhonyuVTwNpIgUvm7WCShiIRUMQRtuaBBHbW21vQ==}
cpu: [arm64]
os: [darwin]
'@pnpm/exe.darwin-x64@12.0.0-alpha.18':
resolution: {integrity: sha512-Ps+UBJELsd+MWGiiQJblYcHTAfKbzq+dnWNyu0N3nNSK5OKdYUZbtRuqhTToFAVlZgtylwWrrhqmntpJzCLt+g==}
'@pnpm/exe.darwin-x64@12.0.0-alpha.19':
resolution: {integrity: sha512-jiKscL8jcKoeSf7qwVWpLzOqXK0ZNnlDbr5kFkwP9k18T3pLVhzk5iFL3WZEmYgo2rwDDdNyAIy+ZG11Fy90Tw==}
cpu: [x64]
os: [darwin]
'@pnpm/exe.linux-arm64-musl@12.0.0-alpha.18':
resolution: {integrity: sha512-uiCEuHjWQ1ss2DqRx/h8bX9qvmCjYsXMdpARVwZWVIHGOWEaVQQG3Aaj91tyv0HB4XlzXnVQsWf+3BPRInkNTw==}
'@pnpm/exe.linux-arm64-musl@12.0.0-alpha.19':
resolution: {integrity: sha512-xYncJzTYV+yudKycfe/7SZ7TP/hppLtJFlvLKL5uYt1SNjVds/IMQqV8TaNDnmDUlqlld0Xrtx1KJXa4EfOXyA==}
cpu: [arm64]
os: [linux]
libc: [musl]
'@pnpm/exe.linux-arm64@12.0.0-alpha.18':
resolution: {integrity: sha512-rhkide4Mkl59gDH/tv5eggKrpBgiuLzo0Ehy5fpYhpAEyCB9KuNJ6cYYTL35A6JY8eUXGTgnsSOAxdekWjgnBw==}
'@pnpm/exe.linux-arm64@12.0.0-alpha.19':
resolution: {integrity: sha512-V4SvOnxjpRYXxoNxrIkTbZc24fAGri9lm2cqfD9GgWoARDA6amAymP64mcFL1JQ8D19PtZkNVV7FvVUhjnRsew==}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@pnpm/exe.linux-x64-musl@12.0.0-alpha.18':
resolution: {integrity: sha512-IjvHT7TcqVvuOAWV/ukHUcOTn9HmDsyuyKSGI9crX93bKBrsE3cyT1CVSo95sxzJHPcaqGDQjQDR13nmJXao7A==}
'@pnpm/exe.linux-x64-musl@12.0.0-alpha.19':
resolution: {integrity: sha512-/K+Sute5ag6oGLeff5kdAdvl6Pok3+w6WZWuDxprgU4Ds3pdRCJ0uaK6Pga4W5A+/gUKIc5CbMj5vWJcZkiRUg==}
cpu: [x64]
os: [linux]
libc: [musl]
'@pnpm/exe.linux-x64@12.0.0-alpha.18':
resolution: {integrity: sha512-Ja+M9K31+K+l6MtOlfKUROtaXPP4JYjAj6eMUU4lMk+ffvsgda8v0NLOSLHygNk2Z4NVW3MsNwtUKvVr6K7arQ==}
'@pnpm/exe.linux-x64@12.0.0-alpha.19':
resolution: {integrity: sha512-lA5+IkSmDGftckmYEkW9jcluKPHi0DqiCffL/jguJOzsdR6hUb6APERE9V45udKgOpQP+GR3mnWGzkD9LRmkXQ==}
cpu: [x64]
os: [linux]
libc: [glibc]
'@pnpm/exe.win32-arm64@12.0.0-alpha.18':
resolution: {integrity: sha512-aAn7it8hAevDJCeo3Qch5zs2+OU/P5mQ7CabtsZDIQG0SWnMCDolYF6XuAyqIagxBdfD3EpWb9CsJO8Hlo+vXA==}
'@pnpm/exe.win32-arm64@12.0.0-alpha.19':
resolution: {integrity: sha512-1d+yO16rY3JqWzO7hen7bjzdCUGX9kpUsR4FZqcJQWIWdOpLlBodp/8whOj5m7pg9ZkUUipY7Jhj56ojuPRF1g==}
cpu: [arm64]
os: [win32]
'@pnpm/exe.win32-x64@12.0.0-alpha.18':
resolution: {integrity: sha512-PhnRvniJ4kZoGeNbfgok3j2niFgICOVpitealSAB4ehhm848+ozPrXXKkeN6uOTjxsJ+NqaceiAezdr+lRbNpg==}
'@pnpm/exe.win32-x64@12.0.0-alpha.19':
resolution: {integrity: sha512-8WXhSxRs63O5p6IGwAC81CQy5yiliULQeXA6KrLtF+YyVzxI9FTTmLFVwTCwFoigkiosc2SC7Qkr/00G/cfOIQ==}
cpu: [x64]
os: [win32]
'@pnpm/exe@12.0.0-alpha.18':
resolution: {integrity: sha512-Ub4IG/78ZQl+SVP9U6/HWmvsG5g2hD7cRkvc3TYIckxxwMUFjOP3b6RwJELWR+27pjqY8mLGZH9X2BuXJTICsQ==}
'@pnpm/exe@12.0.0-alpha.19':
resolution: {integrity: sha512-Qb3nAS1ydU7rwJy1BNjpMDQ5BLGAQ4+oUzRPCO8D8cuVq04WtXfu7sIjwQ29pGX1PvUYTovU18asvzaytadDgg==}
engines: {node: '>=18.*'}
hasBin: true
pnpm@12.0.0-alpha.18:
resolution: {integrity: sha512-Re4kTj/DXeoRIh2wzoRuBQR/BtImPDnXDLRhOuJ2rSw2mHz9fMYGNgebvt7cqhfe1Qgvw4x3P/SBLmN/G7Z3hQ==}
pnpm@12.0.0-alpha.19:
resolution: {integrity: sha512-bgTK3SxlO+IlEbFpQocu3XJ6VWggkbE5WVdYr2psgozP6qXUHzjlqMOHznsIxkqHq6sCKpzKYanEg+iA8nf0zg==}
engines: {node: '>=18.*'}
hasBin: true
snapshots:
'@pnpm/exe.darwin-arm64@12.0.0-alpha.18':
'@pnpm/exe.darwin-arm64@12.0.0-alpha.19':
optional: true
'@pnpm/exe.darwin-x64@12.0.0-alpha.18':
'@pnpm/exe.darwin-x64@12.0.0-alpha.19':
optional: true
'@pnpm/exe.linux-arm64-musl@12.0.0-alpha.18':
'@pnpm/exe.linux-arm64-musl@12.0.0-alpha.19':
optional: true
'@pnpm/exe.linux-arm64@12.0.0-alpha.18':
'@pnpm/exe.linux-arm64@12.0.0-alpha.19':
optional: true
'@pnpm/exe.linux-x64-musl@12.0.0-alpha.18':
'@pnpm/exe.linux-x64-musl@12.0.0-alpha.19':
optional: true
'@pnpm/exe.linux-x64@12.0.0-alpha.18':
'@pnpm/exe.linux-x64@12.0.0-alpha.19':
optional: true
'@pnpm/exe.win32-arm64@12.0.0-alpha.18':
'@pnpm/exe.win32-arm64@12.0.0-alpha.19':
optional: true
'@pnpm/exe.win32-x64@12.0.0-alpha.18':
'@pnpm/exe.win32-x64@12.0.0-alpha.19':
optional: true
'@pnpm/exe@12.0.0-alpha.18':
'@pnpm/exe@12.0.0-alpha.19':
optionalDependencies:
'@pnpm/exe.darwin-arm64': 12.0.0-alpha.18
'@pnpm/exe.darwin-x64': 12.0.0-alpha.18
'@pnpm/exe.linux-arm64': 12.0.0-alpha.18
'@pnpm/exe.linux-arm64-musl': 12.0.0-alpha.18
'@pnpm/exe.linux-x64': 12.0.0-alpha.18
'@pnpm/exe.linux-x64-musl': 12.0.0-alpha.18
'@pnpm/exe.win32-arm64': 12.0.0-alpha.18
'@pnpm/exe.win32-x64': 12.0.0-alpha.18
'@pnpm/exe.darwin-arm64': 12.0.0-alpha.19
'@pnpm/exe.darwin-x64': 12.0.0-alpha.19
'@pnpm/exe.linux-arm64': 12.0.0-alpha.19
'@pnpm/exe.linux-arm64-musl': 12.0.0-alpha.19
'@pnpm/exe.linux-x64': 12.0.0-alpha.19
'@pnpm/exe.linux-x64-musl': 12.0.0-alpha.19
'@pnpm/exe.win32-arm64': 12.0.0-alpha.19
'@pnpm/exe.win32-x64': 12.0.0-alpha.19
pnpm@12.0.0-alpha.18:
pnpm@12.0.0-alpha.19:
optionalDependencies:
'@pnpm/exe.darwin-arm64': 12.0.0-alpha.18
'@pnpm/exe.darwin-x64': 12.0.0-alpha.18
'@pnpm/exe.linux-arm64': 12.0.0-alpha.18
'@pnpm/exe.linux-arm64-musl': 12.0.0-alpha.18
'@pnpm/exe.linux-x64': 12.0.0-alpha.18
'@pnpm/exe.linux-x64-musl': 12.0.0-alpha.18
'@pnpm/exe.win32-arm64': 12.0.0-alpha.18
'@pnpm/exe.win32-x64': 12.0.0-alpha.18
'@pnpm/exe.darwin-arm64': 12.0.0-alpha.19
'@pnpm/exe.darwin-x64': 12.0.0-alpha.19
'@pnpm/exe.linux-arm64': 12.0.0-alpha.19
'@pnpm/exe.linux-arm64-musl': 12.0.0-alpha.19
'@pnpm/exe.linux-x64': 12.0.0-alpha.19
'@pnpm/exe.linux-x64-musl': 12.0.0-alpha.19
'@pnpm/exe.win32-arm64': 12.0.0-alpha.19
'@pnpm/exe.win32-x64': 12.0.0-alpha.19
---
lockfileVersion: '9.0'

View File

@@ -4,6 +4,9 @@
"main": "lib/index.js",
"type": "module",
"types": "lib/index.d.ts",
"files": [
"lib/"
],
"devDependencies": {
"@pnpm/prepare-temp-dir": "workspace:*",
"@types/node": "catalog:"

View File

@@ -4,6 +4,9 @@
"main": "lib/index.js",
"types": "lib/index.d.ts",
"type": "module",
"files": [
"lib/"
],
"dependencies": {
"@pnpm/assert-project": "workspace:*",
"@pnpm/prepare-temp-dir": "workspace:*",