Skip to content

Commit

Permalink
feat: "pnpm run" supports package.{json5,yaml}
Browse files Browse the repository at this point in the history
ref #1803
  • Loading branch information
zkochan committed May 2, 2019
1 parent a114025 commit 063368b
Show file tree
Hide file tree
Showing 6 changed files with 68 additions and 6 deletions.
26 changes: 22 additions & 4 deletions packages/lifecycle/src/runLifecycleHook.ts
@@ -1,13 +1,14 @@
import { lifecycleLogger } from '@pnpm/core-loggers'
import { PackageJson } from '@pnpm/types'
import { DependencyManifest, ImporterManifest } from '@pnpm/types'
import lifecycle = require('@zkochan/npm-lifecycle')

function noop () {} // tslint:disable-line:no-empty

export default async function runLifecycleHook (
stage: string,
pkg: PackageJson,
manifest: ImporterManifest | DependencyManifest,
opts: {
args?: string[],
depPath: string,
optional?: boolean,
pkgRoot: string,
Expand All @@ -22,13 +23,20 @@ export default async function runLifecycleHook (
lifecycleLogger.debug({
depPath: opts.depPath,
optional,
script: pkg.scripts![stage],
script: manifest.scripts![stage],
stage,
wd: opts.pkgRoot,
})
}

return lifecycle(pkg, stage, opts.pkgRoot, {
const m = { _id: getId(manifest), ...manifest }
if (opts.args && opts.args.length && m.scripts && m.scripts[stage]) {
m.scripts = {
...m.scripts,
[stage]: `${m.scripts[stage]} ${opts.args.map((arg) => `"${arg}"`).join(' ')}`,
}
}
return lifecycle(m, stage, opts.pkgRoot, {
config: opts.rawNpmConfig,
dir: opts.rootNodeModulesDir,
log: {
Expand Down Expand Up @@ -76,3 +84,13 @@ export default async function runLifecycleHook (
}
}
}

function getId (manifest: ImporterManifest | DependencyManifest) {
if (!manifest.name) {
return undefined
}
if (!manifest.version) {
return manifest.name
}
return `${manifest.name}@${manifest.version}`
}
2 changes: 0 additions & 2 deletions packages/pnpm/src/bin/pnpm.ts
Expand Up @@ -66,8 +66,6 @@ if (argv.includes('--help') || argv.includes('-h') || argv.includes('--h')) {
case 't':
case 'tst':
case 'test':
case 'run':
case 'run-script':
if (argv.includes('--filter')) {
await runPnpm()
} else {
Expand Down
2 changes: 2 additions & 0 deletions packages/pnpm/src/cmd/index.ts
Expand Up @@ -9,6 +9,7 @@ import prune from './prune'
import rebuild from './rebuild'
import recursive from './recursive'
import root from './root'
import run from './run'
import server from './server'
import store from './store'
import uninstall from './uninstall'
Expand All @@ -27,6 +28,7 @@ export default {
rebuild,
recursive,
root,
run,
server,
store,
uninstall,
Expand Down
42 changes: 42 additions & 0 deletions packages/pnpm/src/cmd/run.ts
@@ -0,0 +1,42 @@
import runLifecycleHooks from '@pnpm/lifecycle'
import { readImporterManifestOnly } from '@pnpm/read-importer-manifest'
import { realNodeModulesDir } from '@pnpm/utils'

export default async function (
args: string[],
opts: {
prefix: string,
rawNpmConfig: object,
argv: {
cooked: string[],
original: string[],
remain: string[],
},
},
command: string,
) {
const manifest = await readImporterManifestOnly(opts.prefix)
const scriptName = args[0]
if (!manifest.scripts || !manifest.scripts[scriptName]) {
const err = new Error(`Missing script: ${scriptName}`)
err['code'] = 'ERR_PNPM_NO_SCRIPT'
throw err
}
const dashDashIndex = opts.argv.cooked.indexOf('--')
const lifecycleOpts = {
args: dashDashIndex === -1 ? [] : opts.argv.cooked.slice(dashDashIndex + 1),
depPath: opts.prefix,
pkgRoot: opts.prefix,
rawNpmConfig: opts.rawNpmConfig,
rootNodeModulesDir: await realNodeModulesDir(opts.prefix),
stdio: 'inherit',
unsafePerm: true, // when running scripts explicitly, assume that they're trusted.
}
if (manifest.scripts[`pre${scriptName}`]) {
await runLifecycleHooks(`pre${scriptName}`, manifest, lifecycleOpts)
}
await runLifecycleHooks(scriptName, manifest, lifecycleOpts)
if (manifest.scripts[`post${scriptName}`]) {
await runLifecycleHooks(`post${scriptName}`, manifest, lifecycleOpts)
}
}
1 change: 1 addition & 0 deletions packages/pnpm/src/main.ts
Expand Up @@ -181,6 +181,7 @@ export default async function run (argv: string[]) {
optionalDependencies: opts.optional !== false,
}
opts.forceSharedLockfile = typeof opts.workspacePrefix === 'string' && opts.sharedWorkspaceLockfile === true
opts.argv = cliConf.argv
if (opts.filter) {
Array.prototype.push.apply(opts.filter, filterArgs)
} else {
Expand Down
1 change: 1 addition & 0 deletions packages/pnpm/test/run.ts
Expand Up @@ -4,6 +4,7 @@ import promisifyTape from 'tape-promise'
import { execPnpmSync } from './utils'

const test = promisifyTape(tape)
const testOnly = promisifyTape(tape.only)

test('pnpm run: returns correct exit code', async (t: tape.Test) => {
const project = prepare(t, {
Expand Down

0 comments on commit 063368b

Please sign in to comment.