From ba8e70c436625117af452d6de07797c9f313732b Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Sun, 25 Dec 2022 03:55:51 +0200 Subject: [PATCH] fix: run prepublish scripts of packages installed from Git close #5826 --- .changeset/lucky-pugs-sell.md | 6 +++++ exec/prepare-package/package.json | 3 ++- exec/prepare-package/src/index.ts | 40 ++++++++++++++++++++++++------ exec/prepare-package/tsconfig.json | 3 +++ pnpm-lock.yaml | 3 +++ 5 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 .changeset/lucky-pugs-sell.md diff --git a/.changeset/lucky-pugs-sell.md b/.changeset/lucky-pugs-sell.md new file mode 100644 index 00000000000..4aa4e276847 --- /dev/null +++ b/.changeset/lucky-pugs-sell.md @@ -0,0 +1,6 @@ +--- +"@pnpm/prepare-package": patch +"pnpm": patch +--- + +Run the prepublish scripts of packages installed from Git [#5826](https://github.com/pnpm/pnpm/issues/5826). diff --git a/exec/prepare-package/package.json b/exec/prepare-package/package.json index 2fc44075972..30a99a2892c 100644 --- a/exec/prepare-package/package.json +++ b/exec/prepare-package/package.json @@ -36,7 +36,8 @@ }, "funding": "https://opencollective.com/pnpm", "devDependencies": { - "@pnpm/prepare-package": "workspace:*" + "@pnpm/prepare-package": "workspace:*", + "@pnpm/types": "workspace:*" }, "exports": { ".": "./lib/index.js" diff --git a/exec/prepare-package/src/index.ts b/exec/prepare-package/src/index.ts index 7127811834f..7817eed45d4 100644 --- a/exec/prepare-package/src/index.ts +++ b/exec/prepare-package/src/index.ts @@ -1,19 +1,45 @@ import path from 'path' import { PnpmError } from '@pnpm/error' import { safeReadPackageJsonFromDir } from '@pnpm/read-package-json' +import { PackageScripts } from '@pnpm/types' import rimraf from '@zkochan/rimraf' import execa from 'execa' import preferredPM from 'preferred-pm' +const PREPARE_SCRIPTS = [ + 'preinstall', + 'install', + 'postinstall', + 'prepare', +] + +const PREPUBLISH_SCRIPTS = [ + 'prepublish', + 'prepublishOnly', + 'prepack', + 'publish', + 'postpublish', +] + export async function preparePackage (pkgDir: string) { const manifest = await safeReadPackageJsonFromDir(pkgDir) - if (manifest?.scripts?.prepare != null && manifest.scripts.prepare !== '') { - const pm = (await preferredPM(pkgDir))?.name ?? 'npm' - try { - await execa(pm, ['install'], { cwd: pkgDir }) - } catch (err: any) { // eslint-disable-line - throw new PnpmError('PREPARE_PKG_FAILURE', err.shortMessage ?? err.message) + if (manifest?.scripts == null || !packageShouldBeBuilt(manifest.scripts)) return + const pm = (await preferredPM(pkgDir))?.name ?? 'npm' + try { + await execa(pm, ['install'], { cwd: pkgDir }) + for (const scriptName of PREPUBLISH_SCRIPTS) { + if (manifest.scripts[scriptName] == null || manifest.scripts[scriptName] === '') continue + await execa(pm, ['run', scriptName], { cwd: pkgDir }) } - await rimraf(path.join(pkgDir, 'node_modules')) + } catch (err: any) { // eslint-disable-line + throw new PnpmError('PREPARE_PKG_FAILURE', err.shortMessage ?? err.message) } + await rimraf(path.join(pkgDir, 'node_modules')) +} + +function packageShouldBeBuilt (packageScripts: PackageScripts): boolean { + return [ + ...PREPUBLISH_SCRIPTS, + ...PREPARE_SCRIPTS, + ].some((scriptName) => packageScripts[scriptName] != null && packageScripts[scriptName] !== '') } diff --git a/exec/prepare-package/tsconfig.json b/exec/prepare-package/tsconfig.json index 690769fe4f1..d5299d60565 100644 --- a/exec/prepare-package/tsconfig.json +++ b/exec/prepare-package/tsconfig.json @@ -12,6 +12,9 @@ { "path": "../../packages/error" }, + { + "path": "../../packages/types" + }, { "path": "../../pkg-manifest/read-package-json" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 76652c511d6..febc8bf3618 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1242,6 +1242,9 @@ importers: '@pnpm/prepare-package': specifier: workspace:* version: 'link:' + '@pnpm/types': + specifier: workspace:* + version: link:../../packages/types exec/run-npm: dependencies: