94 lines
2.5 KiB
JavaScript
94 lines
2.5 KiB
JavaScript
const { resolve } = require('path')
|
||
const rpj = require('read-package-json-fast')
|
||
const PackageJson = require('@npmcli/package-json')
|
||
const log = require('../utils/log-shim')
|
||
|
||
const BaseCommand = require('../base-command.js')
|
||
class SetScript extends BaseCommand {
|
||
static description = 'Set tasks in the scripts section of package.json'
|
||
static params = ['workspace', 'workspaces', 'include-workspace-root']
|
||
static name = 'set-script'
|
||
static usage = ['[<script>] [<command>]']
|
||
|
||
async completion (opts) {
|
||
const argv = opts.conf.argv.remain
|
||
if (argv.length === 2) {
|
||
// find the script name
|
||
const json = resolve(this.npm.localPrefix, 'package.json')
|
||
const { scripts = {} } = await rpj(json).catch(er => ({}))
|
||
return Object.keys(scripts)
|
||
}
|
||
}
|
||
|
||
validate (args) {
|
||
if (process.env.npm_lifecycle_event === 'postinstall') {
|
||
throw new Error('Scripts can’t set from the postinstall script')
|
||
}
|
||
|
||
// Parse arguments
|
||
if (args.length !== 2) {
|
||
throw new Error(`Expected 2 arguments: got ${args.length}`)
|
||
}
|
||
}
|
||
|
||
async exec (args) {
|
||
this.validate(args)
|
||
const warn = await this.doSetScript(this.npm.localPrefix, args[0], args[1])
|
||
if (warn) {
|
||
log.warn('set-script', `Script "${args[0]}" was overwritten`)
|
||
}
|
||
}
|
||
|
||
async execWorkspaces (args, filters) {
|
||
this.validate(args)
|
||
await this.setWorkspaces(filters)
|
||
|
||
for (const [name, path] of this.workspaces) {
|
||
try {
|
||
const warn = await this.doSetScript(path, args[0], args[1])
|
||
if (warn) {
|
||
log.warn('set-script', `Script "${args[0]}" was overwritten`)
|
||
log.warn(` in workspace: ${name}`)
|
||
log.warn(` at location: ${path}`)
|
||
}
|
||
} catch (err) {
|
||
log.error('set-script', err.message)
|
||
log.error(` in workspace: ${name}`)
|
||
log.error(` at location: ${path}`)
|
||
process.exitCode = 1
|
||
}
|
||
}
|
||
}
|
||
|
||
// returns a Boolean that will be true if
|
||
// the requested script was overwritten
|
||
// and false if it was set as a new script
|
||
async doSetScript (path, name, value) {
|
||
let warn = false
|
||
|
||
const pkgJson = await PackageJson.load(path)
|
||
const { scripts } = pkgJson.content
|
||
|
||
const overwriting =
|
||
scripts
|
||
&& scripts[name]
|
||
&& scripts[name] !== value
|
||
|
||
if (overwriting) {
|
||
warn = true
|
||
}
|
||
|
||
pkgJson.update({
|
||
scripts: {
|
||
...scripts,
|
||
[name]: value,
|
||
},
|
||
})
|
||
|
||
await pkgJson.save()
|
||
|
||
return warn
|
||
}
|
||
}
|
||
module.exports = SetScript
|