12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- const fetch = require('npm-registry-fetch')
- const log = require('npmlog')
- const npa = require('npm-package-arg')
- const getIdentity = require('./utils/get-identity')
- const BaseCommand = require('./base-command.js')
- class Star extends BaseCommand {
- static get description () {
- return 'Mark your favorite packages'
- }
- /* istanbul ignore next - see test/lib/load-all-commands.js */
- static get name () {
- return 'star'
- }
- /* istanbul ignore next - see test/lib/load-all-commands.js */
- static get usage () {
- return ['[<pkg>...]']
- }
- /* istanbul ignore next - see test/lib/load-all-commands.js */
- static get params () {
- return [
- 'registry',
- 'unicode',
- ]
- }
- exec (args, cb) {
- this.star(args).then(() => cb()).catch(cb)
- }
- async star (args) {
- if (!args.length)
- throw new Error(this.usage)
- // if we're unstarring, then show an empty star image
- // otherwise, show the full star image
- const unicode = this.npm.config.get('unicode')
- const unstar = this.npm.config.get('star.unstar')
- const full = unicode ? '\u2605 ' : '(*)'
- const empty = unicode ? '\u2606 ' : '( )'
- const show = unstar ? empty : full
- const pkgs = args.map(npa)
- for (const pkg of pkgs) {
- const [username, fullData] = await Promise.all([
- getIdentity(this.npm, this.npm.flatOptions),
- fetch.json(pkg.escapedName, {
- ...this.npm.flatOptions,
- spec: pkg,
- query: { write: true },
- preferOnline: true,
- }),
- ])
- if (!username)
- throw new Error('You need to be logged in!')
- const body = {
- _id: fullData._id,
- _rev: fullData._rev,
- users: fullData.users || {},
- }
- if (!unstar) {
- log.info('star', 'starring', body._id)
- body.users[username] = true
- log.verbose('star', 'starring', body)
- } else {
- delete body.users[username]
- log.info('unstar', 'unstarring', body._id)
- log.verbose('unstar', 'unstarring', body)
- }
- const data = await fetch.json(pkg.escapedName, {
- ...this.npm.flatOptions,
- spec: pkg,
- method: 'PUT',
- body,
- })
- this.npm.output(show + ' ' + pkg.name)
- log.verbose('star', data)
- return data
- }
- }
- }
- module.exports = Star
|