From f63c034c6a1b1ffb4cf9da36595cfbe5bcdd6a5b Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Thu, 22 Jul 2021 04:15:07 +0300 Subject: [PATCH] feat(pack): do not pass thru to npm pack (#3608) --- .changeset/fair-ears-argue.md | 5 + .changeset/smart-panthers-roll.md | 5 + .changeset/warm-rocks-sit.md | 5 + packages/cafs/package.json | 2 +- .../plugin-commands-publishing/package.json | 6 +- .../plugin-commands-publishing/src/pack.ts | 80 ++++++++-- .../plugin-commands-publishing/src/publish.ts | 141 +++++------------- .../plugin-commands-publishing/test/pack.ts | 62 +++++++- .../test/publish.ts | 18 ++- .../test/recursivePublish.ts | 11 +- pnpm-lock.yaml | 58 ++++++- 11 files changed, 259 insertions(+), 134 deletions(-) create mode 100644 .changeset/fair-ears-argue.md create mode 100644 .changeset/smart-panthers-roll.md create mode 100644 .changeset/warm-rocks-sit.md diff --git a/.changeset/fair-ears-argue.md b/.changeset/fair-ears-argue.md new file mode 100644 index 0000000000..a87c1b1f4c --- /dev/null +++ b/.changeset/fair-ears-argue.md @@ -0,0 +1,5 @@ +--- +"@pnpm/plugin-commands-publishing": minor +--- + +`pnpm pack` uses its own inhouse implementation. `pnpm pack` is not using `npm pack`. diff --git a/.changeset/smart-panthers-roll.md b/.changeset/smart-panthers-roll.md new file mode 100644 index 0000000000..3d90012eb3 --- /dev/null +++ b/.changeset/smart-panthers-roll.md @@ -0,0 +1,5 @@ +--- +"@pnpm/plugin-commands-publishing": minor +--- + +Run prepublish and prepublishOnly before packing a package. diff --git a/.changeset/warm-rocks-sit.md b/.changeset/warm-rocks-sit.md new file mode 100644 index 0000000000..c67034de3a --- /dev/null +++ b/.changeset/warm-rocks-sit.md @@ -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). diff --git a/packages/cafs/package.json b/packages/cafs/package.json index 3a6a5a6f79..05182f121f 100644 --- a/packages/cafs/package.json +++ b/packages/cafs/package.json @@ -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", diff --git a/packages/plugin-commands-publishing/package.json b/packages/plugin-commands-publishing/package.json index 0ba6d4021b..b268f2e86d 100644 --- a/packages/plugin-commands-publishing/package.json +++ b/packages/plugin-commands-publishing/package.json @@ -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": { diff --git a/packages/plugin-commands-publishing/src/pack.ts b/packages/plugin-commands-publishing/src/pack.ts index 6ca0cd2dfc..44945fe167 100644 --- a/packages/plugin-commands-publishing/src/pack.ts +++ b/packages/plugin-commands-publishing/src/pack.ts @@ -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 export function rcOptionsTypes () { return { @@ -27,25 +39,63 @@ export function help () { } export async function handler ( - opts: Pick & { + opts: Pick & Pick & Partial> & { 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 = 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, projectDir: string): Promise { + 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) + }) } diff --git a/packages/plugin-commands-publishing/src/publish.ts b/packages/plugin-commands-publishing/src/publish.ts index e662715cba..0ca1027554 100644 --- a/packages/plugin-commands-publishing/src/publish.ts +++ b/packages/plugin-commands-publishing/src/publish.ts @@ -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 - -export async function fakeRegularManifest ( - opts: { - engineStrict?: boolean - dir: string - workspaceDir: string - }, - fn: () => Promise -) { - // 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 -} diff --git a/packages/plugin-commands-publishing/test/pack.ts b/packages/plugin-commands-publishing/test/pack.ts index 81d08e10ba..54926c9144 100644 --- a/packages/plugin-commands-publishing/test/pack.ts +++ b/packages/plugin-commands-publishing/test/pack.ts @@ -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() +}) diff --git a/packages/plugin-commands-publishing/test/publish.ts b/packages/plugin-commands-publishing/test/publish.ts index 2b18ac3ebb..8d8c2f002d 100644 --- a/packages/plugin-commands-publishing/test/publish.ts +++ b/packages/plugin-commands-publishing/test/publish.ts @@ -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') diff --git a/packages/plugin-commands-publishing/test/recursivePublish.ts b/packages/plugin-commands-publishing/test/recursivePublish.ts index 94bf8efa78..6a0a5961e1 100644 --- a/packages/plugin-commands-publishing/test/recursivePublish.ts +++ b/packages/plugin-commands-publishing/test/recursivePublish.ts @@ -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' }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1d31d59ba6..3b4da0bca6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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==}