123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- const { resolve } = require('path')
- const log = require('npmlog')
- const rpj = require('read-package-json-fast')
- const PackageJson = require('@npmcli/package-json')
- const BaseCommand = require('./base-command.js')
- class SetScript extends BaseCommand {
- /* istanbul ignore next - see test/lib/load-all-commands.js */
- static get description () {
- return 'Set tasks in the scripts section of package.json'
- }
- /* istanbul ignore next - see test/lib/load-all-commands.js */
- static get params () {
- return ['workspace', 'workspaces', 'include-workspace-root']
- }
- /* istanbul ignore next - see test/lib/load-all-commands.js */
- static get name () {
- return 'set-script'
- }
- /* istanbul ignore next - see test/lib/load-all-commands.js */
- static get usage () {
- return ['[<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}`)
- }
- exec (args, cb) {
- this.setScript(args).then(() => cb()).catch(cb)
- }
- async setScript (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`)
- }
- execWorkspaces (args, filters, cb) {
- this.setScriptWorkspaces(args, filters).then(() => cb()).catch(cb)
- }
- async setScriptWorkspaces (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
|