관리-도구
편집 파일: index.js
'use strict' const npa = require('npm-package-arg') const npmFetch = require('npm-registry-fetch') const npar = (spec) => { spec = npa(spec) if (!spec.registry) { throw new Error('must use package name only') } return spec } const parseTeam = (scopeTeam) => { let slice = 0 if (scopeTeam.startsWith('@')) { slice = 1 } const [scope, team] = scopeTeam.slice(slice).split(':').map(encodeURIComponent) return { scope, team } } const getPackages = async (scopeTeam, opts) => { const { scope, team } = parseTeam(scopeTeam) let uri if (team) { uri = `/-/team/${scope}/${team}/package` } else { uri = `/-/org/${scope}/package` } try { return await npmFetch.json(uri, opts) } catch (err) { if (err.code === 'E404') { uri = `/-/user/${scope}/package` return npmFetch.json(uri, opts) } throw err } } const getCollaborators = async (pkg, opts) => { const spec = npar(pkg) const uri = `/-/package/${spec.escapedName}/collaborators` return npmFetch.json(uri, opts) } const getVisibility = async (pkg, opts) => { const spec = npar(pkg) const uri = `/-/package/${spec.escapedName}/visibility` return npmFetch.json(uri, opts) } const setAccess = async (pkg, access, opts) => { const spec = npar(pkg) const uri = `/-/package/${spec.escapedName}/access` await npmFetch(uri, { ...opts, method: 'POST', body: { access }, spec, ignoreBody: true, }) return true } const setMfa = async (pkg, level, opts) => { const spec = npar(pkg) const body = {} switch (level) { case 'none': body.publish_requires_tfa = false break case 'publish': // tfa is required, automation tokens can not override tfa body.publish_requires_tfa = true body.automation_token_overrides_tfa = false break case 'automation': // tfa is required, automation tokens can override tfa body.publish_requires_tfa = true body.automation_token_overrides_tfa = true break default: throw new Error(`Invalid mfa setting ${level}`) } const uri = `/-/package/${spec.escapedName}/access` await npmFetch(uri, { ...opts, method: 'POST', body, spec, ignoreBody: true, }) return true } const setPermissions = async (scopeTeam, pkg, permissions, opts) => { const spec = npar(pkg) const { scope, team } = parseTeam(scopeTeam) if (!scope || !team) { throw new Error('team must be in format `scope:team`') } const uri = `/-/team/${scope}/${team}/package` await npmFetch(uri, { ...opts, method: 'PUT', body: { package: spec.name, permissions }, scope, spec, ignoreBody: true, }) return true } const removePermissions = async (scopeTeam, pkg, opts) => { const spec = npar(pkg) const { scope, team } = parseTeam(scopeTeam) const uri = `/-/team/${scope}/${team}/package` await npmFetch(uri, { ...opts, method: 'DELETE', body: { package: spec.name }, scope, spec, ignoreBody: true, }) return true } module.exports = { getCollaborators, getPackages, getVisibility, removePermissions, setAccess, setMfa, setPermissions, }