feat(pack): do not pass thru to npm pack (#3608)

This commit is contained in:
Zoltan Kochan
2021-07-22 04:15:07 +03:00
committed by GitHub
parent 53b7d5c9e9
commit f63c034c6a
11 changed files with 259 additions and 134 deletions

View File

@@ -0,0 +1,5 @@
---
"@pnpm/plugin-commands-publishing": minor
---
`pnpm pack` uses its own inhouse implementation. `pnpm pack` is not using `npm pack`.

View File

@@ -0,0 +1,5 @@
---
"@pnpm/plugin-commands-publishing": minor
---
Run prepublish and prepublishOnly before packing a package.

View File

@@ -0,0 +1,5 @@
---
"@pnpm/plugin-commands-publishing": patch
---
Do not modify the package.json file before packing the package. Do not copy LICENSE files from the root of the workspace (the files are still packed).

View File

@@ -26,7 +26,7 @@
"rename-overwrite": "^4.0.0",
"ssri": "^8.0.1",
"strip-bom": "^4.0.0",
"tar-stream": "^2.1.4"
"tar-stream": "^2.2.0"
},
"devDependencies": {
"@types/concat-stream": "^1.6.0",

View File

@@ -37,6 +37,8 @@
"@pnpm/logger": "^4.0.0",
"@pnpm/prepare": "workspace:0.0.25",
"@types/cross-spawn": "^6.0.2",
"@types/gunzip-maybe": "^1.4.0",
"@types/npm-packlist": "^1.1.2",
"@types/proxyquire": "^1.3.28",
"@types/ramda": "0.27.39",
"@types/sinon": "^9.0.11",
@@ -62,13 +64,15 @@
"@pnpm/sort-packages": "workspace:2.1.0",
"@pnpm/types": "workspace:7.3.0",
"@zkochan/rimraf": "^2.1.1",
"cp-file": "^9.0.0",
"enquirer": "^2.3.6",
"fast-glob": "^3.2.4",
"gunzip-maybe": "^1.4.2",
"npm-packlist": "^2.2.2",
"p-filter": "^2.1.0",
"ramda": "^0.27.1",
"realpath-missing": "^1.1.0",
"render-help": "^1.0.1",
"tar-stream": "^2.2.0",
"write-json-file": "^4.3.0"
},
"peerDependencies": {

View File

@@ -1,8 +1,20 @@
import { types as allTypes, UniversalOptions } from '@pnpm/config'
import runNpm from '@pnpm/run-npm'
import fs from 'fs'
import path from 'path'
import { types as allTypes, UniversalOptions, Config } from '@pnpm/config'
import { readProjectManifest } from '@pnpm/cli-utils'
import exportableManifest from '@pnpm/exportable-manifest'
import fg from 'fast-glob'
import gunzip from 'gunzip-maybe'
import pick from 'ramda/src/pick'
import realpathMissing from 'realpath-missing'
import renderHelp from 'render-help'
import { fakeRegularManifest } from './publish'
import tar from 'tar-stream'
import packlist from 'npm-packlist'
import fromPairs from 'ramda/src/fromPairs'
import { runScriptsIfPresent } from './publish'
const LICENSE_GLOB = 'LICEN{S,C}E{,.*}'
const findLicenses = fg.bind(fg, [LICENSE_GLOB]) as (opts: { cwd: string }) => Promise<string[]>
export function rcOptionsTypes () {
return {
@@ -27,25 +39,63 @@ export function help () {
}
export async function handler (
opts: Pick<UniversalOptions, 'dir'> & {
opts: Pick<UniversalOptions, 'dir'> & Pick<Config, 'ignoreScripts' | 'rawConfig'> & Partial<Pick<Config, 'extraBinPaths'>> & {
argv: {
original: string[]
}
engineStrict?: boolean
npmPath?: string
workspaceDir?: string
}
) {
let _status!: number
await fakeRegularManifest({
dir: opts.dir,
engineStrict: opts.engineStrict,
workspaceDir: opts.workspaceDir ?? opts.dir,
}, async () => {
const { status } = await runNpm(opts.npmPath, ['pack', ...opts.argv.original.slice(1)])
_status = status!
const { manifest } = await readProjectManifest(opts.dir, opts)
const _runScriptsIfPresent = runScriptsIfPresent.bind(null, {
depPath: opts.dir,
extraBinPaths: opts.extraBinPaths,
pkgRoot: opts.dir,
rawConfig: opts.rawConfig,
rootModulesDir: await realpathMissing(path.join(opts.dir, 'node_modules')),
stdio: 'inherit',
unsafePerm: true, // when running scripts explicitly, assume that they're trusted.
})
if (_status !== 0) {
process.exit(_status)
if (!opts.ignoreScripts) {
await _runScriptsIfPresent([
'prepublish',
'prepare',
'prepublishOnly',
'prepack',
], manifest)
}
const tarballName = `${manifest.name!.replace('@', '').replace('/', '-')}-${manifest.version!}.tgz`
const files = await packlist({ path: opts.dir })
const filesMap: Record<string, string> = fromPairs(files.map((file) => [`package/${file}`, path.join(opts.dir, file)]))
if (opts.workspaceDir != null && opts.dir !== opts.workspaceDir && !files.some((file) => /LICEN[CS]E(\..+)?/i.test(file))) {
const licenses = await findLicenses({ cwd: opts.workspaceDir })
for (const license of licenses) {
filesMap[`package/${license}`] = path.join(opts.workspaceDir, license)
}
}
await packPkg(path.join(opts.dir, tarballName), filesMap, opts.dir)
if (!opts.ignoreScripts) {
await _runScriptsIfPresent(['postpack'], manifest)
}
return tarballName
}
async function packPkg (destFile: string, filesMap: Record<string, string>, projectDir: string): Promise<void> {
const pack = tar.pack()
for (const [name, source] of Object.entries(filesMap)) {
if (/^package\/package\.(json|json5|yaml)/.test(name)) {
const { manifest } = await readProjectManifest(projectDir, {})
const publishManifest = await exportableManifest(projectDir, manifest)
pack.entry({ name: 'package/package.json' }, JSON.stringify(publishManifest, null, 2))
continue
}
pack.entry({ name }, fs.readFileSync(source))
}
const tarball = fs.createWriteStream(destFile)
pack.pipe(gunzip()).pipe(tarball)
pack.finalize()
return new Promise((resolve, reject) => {
tarball.on('close', () => resolve()).on('error', reject)
})
}

View File

@@ -3,19 +3,15 @@ import path from 'path'
import { docsUrl, readProjectManifest } from '@pnpm/cli-utils'
import { Config, types as allTypes } from '@pnpm/config'
import PnpmError from '@pnpm/error'
import exportableManifest from '@pnpm/exportable-manifest'
import runLifecycleHooks, { RunLifecycleHookOptions } from '@pnpm/lifecycle'
import runNpm from '@pnpm/run-npm'
import { ProjectManifest } from '@pnpm/types'
import { prompt } from 'enquirer'
import rimraf from '@zkochan/rimraf'
import cpFile from 'cp-file'
import fg from 'fast-glob'
import equals from 'ramda/src/equals'
import pick from 'ramda/src/pick'
import realpathMissing from 'realpath-missing'
import renderHelp from 'render-help'
import writeJsonFile from 'write-json-file'
import * as pack from './pack'
import recursivePublish, { PublishRecursiveOpts } from './recursivePublish'
import { getCurrentBranch, isGitRepo, isRemoteHistoryClean, isWorkingTreeClean } from './gitChecks'
@@ -159,58 +155,44 @@ Do you want to continue?`,
stdio: 'inherit',
unsafePerm: true, // when running scripts explicitly, assume that they're trusted.
})
let _status!: number
const { manifest } = await readProjectManifest(dir, opts)
// Unfortunately, we cannot support postpack at the moment
if (!opts.ignoreScripts) {
await _runScriptsIfPresent([
'prepublish',
'prepare',
'prepublishOnly',
'prepack',
], manifest)
let args = opts.argv.original.slice(1)
if (dirInParams) {
args = args.filter(arg => arg !== params[0])
}
await fakeRegularManifest(
{
dir,
engineStrict: opts.engineStrict,
workspaceDir: opts.workspaceDir ?? dir,
},
async () => {
let args = opts.argv.original.slice(1)
if (dirInParams) {
args = args.filter(arg => arg !== params[0])
}
const index = args.indexOf('--publish-branch')
if (index !== -1) {
// If --publish-branch follows with another cli option, only remove this argument
// otherwise remove the following argument as well
if (args[index + 1]?.startsWith('-')) {
args.splice(index, 1)
} else {
args.splice(index, 2)
}
}
const cwd = manifest.publishConfig?.directory ? path.join(dir, manifest.publishConfig.directory) : dir
const localNpmrc = path.join(cwd, '.npmrc')
const copyNpmrc = !existsSync(localNpmrc) && opts.workspaceDir && existsSync(path.join(opts.workspaceDir, '.npmrc'))
if (copyNpmrc && opts.workspaceDir) {
await fs.copyFile(path.join(opts.workspaceDir, '.npmrc'), localNpmrc)
}
const { status } = runNpm(opts.npmPath, ['publish', '--ignore-scripts', ...args], {
cwd,
})
if (copyNpmrc) {
await rimraf(localNpmrc)
}
_status = status!
const index = args.indexOf('--publish-branch')
if (index !== -1) {
// If --publish-branch follows with another cli option, only remove this argument
// otherwise remove the following argument as well
if (args[index + 1]?.startsWith('-')) {
args.splice(index, 1)
} else {
args.splice(index, 2)
}
)
if (_status !== 0) {
process.exit(_status)
}
const cwd = manifest.publishConfig?.directory ? path.join(dir, manifest.publishConfig.directory) : dir
const localNpmrc = path.join(cwd, '.npmrc')
const copyNpmrc = !existsSync(localNpmrc) && opts.workspaceDir && existsSync(path.join(opts.workspaceDir, '.npmrc'))
if (copyNpmrc && opts.workspaceDir) {
await fs.copyFile(path.join(opts.workspaceDir, '.npmrc'), localNpmrc)
}
const tarballName = await pack.handler({
...opts,
dir: cwd,
})
const { status } = runNpm(opts.npmPath, ['publish', '--ignore-scripts', tarballName, ...args], {
cwd,
})
await rimraf(path.join(cwd, tarballName))
if (copyNpmrc) {
await rimraf(localNpmrc)
}
if (status != null && status !== 0) {
process.exit(status)
}
if (!opts.ignoreScripts) {
await _runScriptsIfPresent([
@@ -221,7 +203,7 @@ Do you want to continue?`,
return { manifest }
}
async function runScriptsIfPresent (
export async function runScriptsIfPresent (
opts: RunLifecycleHookOptions,
scriptNames: string[],
manifest: ProjectManifest
@@ -231,54 +213,3 @@ async function runScriptsIfPresent (
await runLifecycleHooks(scriptName, manifest, opts)
}
}
const LICENSE_GLOB = 'LICEN{S,C}E{,.*}'
const findLicenses = fg.bind(fg, [LICENSE_GLOB]) as (opts: { cwd: string }) => Promise<string[]>
export async function fakeRegularManifest (
opts: {
engineStrict?: boolean
dir: string
workspaceDir: string
},
fn: () => Promise<void>
) {
// If a workspace package has no License of its own,
// license files from the root of the workspace are used
const copiedLicenses: string[] = opts.dir !== opts.workspaceDir && (await findLicenses({ cwd: opts.dir })).length === 0
? await copyLicenses(opts.workspaceDir, opts.dir)
: []
const { fileName, manifest, writeProjectManifest } = await readProjectManifest(opts.dir, opts)
const publishManifest = await exportableManifest(opts.dir, manifest)
const replaceManifest = fileName !== 'package.json' || !equals(manifest, publishManifest)
if (replaceManifest) {
await rimraf(path.join(opts.dir, fileName))
await writeJsonFile(path.join(opts.dir, 'package.json'), publishManifest)
}
await fn()
if (replaceManifest) {
await rimraf(path.join(opts.dir, 'package.json'))
await writeProjectManifest(manifest, true)
}
await Promise.all(
copiedLicenses.map(async (copiedLicense) => fs.unlink(copiedLicense))
)
}
async function copyLicenses (sourceDir: string, destDir: string) {
const licenses = await findLicenses({ cwd: sourceDir })
if (licenses.length === 0) return []
const copiedLicenses: string[] = []
await Promise.all(
licenses
.map((licenseRelPath) => path.join(sourceDir, licenseRelPath))
.map((licensePath) => {
const licenseCopyDest = path.join(destDir, path.basename(licensePath))
copiedLicenses.push(licenseCopyDest)
return cpFile(licensePath, licenseCopyDest)
})
)
return copiedLicenses
}

View File

@@ -1,6 +1,7 @@
import { pack } from '@pnpm/plugin-commands-publishing'
import prepare from '@pnpm/prepare'
import exists from 'path-exists'
import { DEFAULT_OPTS } from './utils'
test('pack: package with package.json', async () => {
prepare({
@@ -8,7 +9,12 @@ test('pack: package with package.json', async () => {
version: '0.0.0',
})
await pack.handler({ argv: { original: [] }, dir: process.cwd() })
await pack.handler({
...DEFAULT_OPTS,
argv: { original: [] },
dir: process.cwd(),
extraBinPaths: [],
})
expect(await exists('test-publish-package.json-0.0.0.tgz')).toBeTruthy()
expect(await exists('package.json')).toBeTruthy()
@@ -20,7 +26,12 @@ test('pack: package with package.yaml', async () => {
version: '0.0.0',
}, { manifestFormat: 'YAML' })
await pack.handler({ argv: { original: [] }, dir: process.cwd() })
await pack.handler({
...DEFAULT_OPTS,
argv: { original: [] },
dir: process.cwd(),
extraBinPaths: [],
})
expect(await exists('test-publish-package.yaml-0.0.0.tgz')).toBeTruthy()
expect(await exists('package.yaml')).toBeTruthy()
@@ -33,9 +44,54 @@ test('pack: package with package.json5', async () => {
version: '0.0.0',
}, { manifestFormat: 'JSON5' })
await pack.handler({ argv: { original: [] }, dir: process.cwd() })
await pack.handler({
...DEFAULT_OPTS,
argv: { original: [] },
dir: process.cwd(),
extraBinPaths: [],
})
expect(await exists('test-publish-package.json5-0.0.0.tgz')).toBeTruthy()
expect(await exists('package.json5')).toBeTruthy()
expect(await exists('package.json')).toBeFalsy()
})
test('pack a package with scoped name', async () => {
prepare({
name: '@pnpm/test-scope',
version: '0.0.0',
})
await pack.handler({
...DEFAULT_OPTS,
argv: { original: [] },
dir: process.cwd(),
extraBinPaths: [],
})
expect(await exists('pnpm-test-scope-0.0.0.tgz')).toBeTruthy()
})
test('pack: runs prepack, prepare, and postpack', async () => {
prepare({
name: 'test-publish-package.json',
version: '0.0.0',
scripts: {
prepack: 'node -e "require(\'fs\').writeFileSync(\'prepack\', \'\')"',
prepare: 'node -e "require(\'fs\').writeFileSync(\'prepare\', \'\')"',
postpack: 'node -e "require(\'fs\').writeFileSync(\'postpack\', \'\')"',
},
})
await pack.handler({
...DEFAULT_OPTS,
argv: { original: [] },
dir: process.cwd(),
extraBinPaths: [],
})
expect(await exists('test-publish-package.json-0.0.0.tgz')).toBeTruthy()
expect(await exists('prepack')).toBeTruthy()
expect(await exists('prepare')).toBeTruthy()
expect(await exists('postpack')).toBeTruthy()
})

View File

@@ -32,6 +32,8 @@ test('publish: package with package.json', async () => {
argv: { original: ['publish', ...CREDENTIALS] },
dir: process.cwd(),
}, [])
expect(await exists('test-publish-package.json-0.0.0.tgz')).toBeFalsy()
})
test('publish: package with package.yaml', async () => {
@@ -106,10 +108,22 @@ skipOnWindowsCI('pack packages with workspace LICENSE if no own LICENSE is prese
await fs.writeFile('project-2/LICENSE', 'project-2 license', 'utf8')
process.chdir('project-1')
await pack.handler({ argv: { original: [] }, dir: process.cwd(), workspaceDir })
await pack.handler({
...DEFAULT_OPTS,
argv: { original: [] },
dir: process.cwd(),
extraBinPaths: [],
workspaceDir,
})
process.chdir('../project-2')
await pack.handler({ argv: { original: [] }, dir: process.cwd(), workspaceDir })
await pack.handler({
...DEFAULT_OPTS,
argv: { original: [] },
dir: process.cwd(),
extraBinPaths: [],
workspaceDir,
})
process.chdir('../target')

View File

@@ -18,8 +18,11 @@ registry=http://localhost:${REGISTRY_MOCK_PORT}/
//localhost:${REGISTRY_MOCK_PORT}/:email=foo@bar.net`
test('recursive publish', async () => {
// This suffix is added to the package name to avoid issue if Jest reruns the test
const SUFFIX = Date.now()
const pkg1 = {
name: '@pnpmtest/test-recursive-publish-project-1',
name: `@pnpmtest/test-recursive-publish-project-1-${SUFFIX}`,
version: '1.0.0',
dependencies: {
@@ -27,7 +30,7 @@ test('recursive publish', async () => {
},
}
const pkg2 = {
name: '@pnpmtest/test-recursive-publish-project-2',
name: `@pnpmtest/test-recursive-publish-project-2-${SUFFIX}`,
version: '1.0.0',
dependencies: {
@@ -96,11 +99,11 @@ test('recursive publish', async () => {
{
const { stdout } = await execa('npm', ['view', pkg1.name, 'versions', '--registry', `http://localhost:${REGISTRY_MOCK_PORT}`, '--json'])
expect(JSON.parse(stdout.toString())).toStrictEqual([pkg1.version])
expect(JSON.parse(stdout.toString())).toStrictEqual(pkg1.version)
}
{
const { stdout } = await execa('npm', ['view', pkg2.name, 'versions', '--registry', `http://localhost:${REGISTRY_MOCK_PORT}`, '--json'])
expect(JSON.parse(stdout.toString())).toStrictEqual([pkg2.version])
expect(JSON.parse(stdout.toString())).toStrictEqual(pkg2.version)
}
await projects[pkg1.name].writePackageJson({ ...pkg1, version: '2.0.0' })

58
pnpm-lock.yaml generated
View File

@@ -204,7 +204,7 @@ importers:
rename-overwrite: ^4.0.0
ssri: ^8.0.1
strip-bom: ^4.0.0
tar-stream: ^2.1.4
tar-stream: ^2.2.0
tempy: ^1.0.0
dependencies:
'@pnpm/fetcher-base': link:../fetcher-base
@@ -2071,23 +2071,27 @@ importers:
'@pnpm/sort-packages': workspace:2.1.0
'@pnpm/types': workspace:7.3.0
'@types/cross-spawn': ^6.0.2
'@types/gunzip-maybe': ^1.4.0
'@types/npm-packlist': ^1.1.2
'@types/proxyquire': ^1.3.28
'@types/ramda': 0.27.39
'@types/sinon': ^9.0.11
'@zkochan/rimraf': ^2.1.1
cp-file: ^9.0.0
cross-spawn: ^7.0.3
enquirer: ^2.3.6
execa: ^5.0.0
fast-glob: ^3.2.4
gunzip-maybe: ^1.4.2
is-ci: ^3.0.0
is-windows: ^1.0.2
load-json-file: ^6.2.0
npm-packlist: ^2.2.2
p-filter: ^2.1.0
path-exists: ^4.0.0
ramda: ^0.27.1
realpath-missing: ^1.1.0
render-help: ^1.0.1
tar-stream: ^2.2.0
tempy: ^1.0.0
write-json-file: ^4.3.0
write-yaml-file: ^4.2.0
@@ -2104,13 +2108,15 @@ importers:
'@pnpm/sort-packages': link:../sort-packages
'@pnpm/types': link:../types
'@zkochan/rimraf': 2.1.1
cp-file: 9.1.0
enquirer: 2.3.6
fast-glob: 3.2.7
gunzip-maybe: 1.4.2
npm-packlist: 2.2.2
p-filter: 2.1.0
ramda: 0.27.1
realpath-missing: 1.1.0
render-help: 1.0.2
tar-stream: 2.2.0
write-json-file: 4.3.0
devDependencies:
'@pnpm/filter-workspace-packages': link:../filter-workspace-packages
@@ -2118,6 +2124,8 @@ importers:
'@pnpm/plugin-commands-publishing': 'link:'
'@pnpm/prepare': link:../../privatePackages/prepare
'@types/cross-spawn': 6.0.2
'@types/gunzip-maybe': 1.4.0
'@types/npm-packlist': 1.1.2
'@types/proxyquire': 1.3.28
'@types/ramda': 0.27.39
'@types/sinon': 9.0.11
@@ -4736,6 +4744,12 @@ packages:
'@types/node': 14.17.5
dev: true
/@types/gunzip-maybe/1.4.0:
resolution: {integrity: sha512-dFP9GrYAR9KhsjTkWJ8q8Gsfql75YIKcg9DuQOj/IrlPzR7W+1zX+cclw1McV82UXAQ+Lpufvgk3e9bC8+HzgA==}
dependencies:
'@types/node': 16.4.0
dev: true
/@types/hosted-git-info/3.0.2:
resolution: {integrity: sha512-RURNTeEFUwF+ifnp7kK3WLLlTmBSlRynLNS9jeAsI6RHtSrupV0l0nO6kmpaz75EUJVexy348bR452SvmH98vQ==}
dev: true
@@ -4854,6 +4868,10 @@ packages:
/@types/node/16.3.3:
resolution: {integrity: sha512-8h7k1YgQKxKXWckzFCMfsIwn0Y61UK6tlD6y2lOb3hTOIMlK3t9/QwHOhc81TwU+RMf0As5fj7NPjroERCnejQ==}
/@types/node/16.4.0:
resolution: {integrity: sha512-HrJuE7Mlqcjj+00JqMWpZ3tY8w7EUd+S0U3L1+PQSWiXZbOgyQDvi+ogoUxaHApPJq5diKxYBQwA3iIlNcPqOg==}
dev: true
/@types/normalize-package-data/2.4.1:
resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
dev: true
@@ -4861,6 +4879,10 @@ packages:
/@types/normalize-path/3.0.0:
resolution: {integrity: sha512-Nd8y/5t/7CRakPYiyPzr/IAfYusy1FkcZYFEAcoMZkwpJv2n4Wm+olW+e7xBdHEXhOnWdG9ddbar0gqZWS4x5Q==}
/@types/npm-packlist/1.1.2:
resolution: {integrity: sha512-9NYoEH87t90e6dkaQOuUTY/R1xUE0a67sXzJBuAB+b+/z4FysHFD19g/O154ToGjyWqKYkezVUtuBdtfd4hyfw==}
dev: true
/@types/parse-json/4.0.0:
resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==}
dev: true
@@ -6820,6 +6842,7 @@ packages:
make-dir: 3.1.0
nested-error-stacks: 2.1.0
p-event: 4.2.0
dev: true
/cpr/3.0.1:
resolution: {integrity: sha1-uaVQOLfNgaNcF7l2GJW9hJau8eU=}
@@ -8832,6 +8855,12 @@ packages:
/ieee754/1.2.1:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
/ignore-walk/3.0.4:
resolution: {integrity: sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==}
dependencies:
minimatch: 3.0.4
dev: false
/ignore/4.0.6:
resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==}
engines: {node: '>= 4'}
@@ -10855,6 +10884,7 @@ packages:
/nested-error-stacks/2.1.0:
resolution: {integrity: sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==}
dev: true
/next-path/1.0.0:
resolution: {integrity: sha1-gixFgNer54PfGZZbeJYiyoAWA+Q=}
@@ -11014,6 +11044,16 @@ packages:
once: 1.4.0
dev: true
/npm-bundled/1.1.2:
resolution: {integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==}
dependencies:
npm-normalize-package-bin: 1.0.1
dev: false
/npm-normalize-package-bin/1.0.1:
resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==}
dev: false
/npm-package-arg/4.2.1:
resolution: {integrity: sha1-WTMD/eqF98Qid18X+et2cPaA4+w=}
dependencies:
@@ -11021,6 +11061,17 @@ packages:
semver: 5.7.1
dev: true
/npm-packlist/2.2.2:
resolution: {integrity: sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==}
engines: {node: '>=10'}
hasBin: true
dependencies:
glob: 7.1.7
ignore-walk: 3.0.4
npm-bundled: 1.1.2
npm-normalize-package-bin: 1.0.1
dev: false
/npm-run-all/4.1.5:
resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==}
engines: {node: '>= 4'}
@@ -11248,6 +11299,7 @@ packages:
engines: {node: '>=8'}
dependencies:
p-timeout: 3.2.0
dev: true
/p-every/2.0.0:
resolution: {integrity: sha512-MCz9DqD5opPC48Zsd+BHm56O/HfhYIQQtupfDzhXoVgQdg/Ux4F8/JcdRuQ+arq7zD5fB6zP3axbH3d9Nr8dlw==}