mirror of
https://github.com/pnpm/pnpm.git
synced 2026-08-04 12:03:10 -04:00
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:
246
.github/scripts/verify-packed-package-payload.mjs
vendored
246
.github/scripts/verify-packed-package-payload.mjs
vendored
@@ -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)
|
||||
}
|
||||
78
.github/workflows/release.yml
vendored
78
.github/workflows/release.yml
vendored
@@ -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`.
|
||||
|
||||
@@ -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
100
pnpm-lock.yaml
generated
@@ -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'
|
||||
|
||||
@@ -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:"
|
||||
|
||||
@@ -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:*",
|
||||
|
||||
Reference in New Issue
Block a user