Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/npm/cli.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKat Marchán <kzm@sykosomatic.org>2015-08-14 09:27:33 +0300
committerRebecca Turner <me@re-becca.org>2015-08-14 22:25:49 +0300
commit4b72a5490dfa2361e68e10c711fee86bd505b3c9 (patch)
treed9311c940a9aa901d79780288c3351798cb7b936 /node_modules/npm-registry-client
parentb15205d593250fd4019ccc8ee36b64e7a00f9e09 (diff)
npm-registry-client@7.0.1
PR-URL: https://github.com/npm/npm/pull/9011
Diffstat (limited to 'node_modules/npm-registry-client')
-rw-r--r--node_modules/npm-registry-client/lib/access.js165
-rw-r--r--node_modules/npm-registry-client/lib/request.js31
-rw-r--r--node_modules/npm-registry-client/lib/team.js105
-rw-r--r--node_modules/npm-registry-client/node_modules/chownr/LICENCE25
-rw-r--r--node_modules/npm-registry-client/node_modules/chownr/LICENSE15
-rw-r--r--node_modules/npm-registry-client/node_modules/chownr/README.md3
-rw-r--r--node_modules/npm-registry-client/node_modules/chownr/chownr.js41
-rw-r--r--node_modules/npm-registry-client/node_modules/chownr/package.json76
-rw-r--r--node_modules/npm-registry-client/node_modules/chownr/test/basic.js85
-rw-r--r--node_modules/npm-registry-client/node_modules/chownr/test/sync.js80
-rw-r--r--node_modules/npm-registry-client/package.json37
-rw-r--r--node_modules/npm-registry-client/test/access.js337
-rw-r--r--node_modules/npm-registry-client/test/fetch-404.js27
-rw-r--r--node_modules/npm-registry-client/test/request.js17
-rw-r--r--node_modules/npm-registry-client/test/team.js210
15 files changed, 793 insertions, 461 deletions
diff --git a/node_modules/npm-registry-client/lib/access.js b/node_modules/npm-registry-client/lib/access.js
index b671f6b5f..badb770ea 100644
--- a/node_modules/npm-registry-client/lib/access.js
+++ b/node_modules/npm-registry-client/lib/access.js
@@ -1,30 +1,153 @@
module.exports = access
var assert = require('assert')
+var url = require('url')
+var npa = require('npm-package-arg')
+var subcommands = {}
-function access (uri, params, cb) {
- assert(typeof uri === 'string', 'must pass registry URI to access')
- assert(params && typeof params === 'object', 'must pass params to access')
- assert(typeof cb === 'function', 'muss pass callback to access')
-
- assert(typeof params.level === 'string', 'must pass level to access')
- assert(
- ['public', 'restricted'].indexOf(params.level) !== -1,
- "access level must be either 'public' or 'restricted'"
- )
- assert(
- params.auth && typeof params.auth === 'object',
- 'must pass auth to access'
- )
-
- var body = {
- access: params.level
- }
+function access (sub, uri, params, cb) {
+ accessAssertions(sub, uri, params, cb)
+ return subcommands[sub].call(this, uri, params, cb)
+}
+
+subcommands.public = function (uri, params, cb) {
+ return setAccess.call(this, 'public', uri, params, cb)
+}
+subcommands.restricted = function (uri, params, cb) {
+ return setAccess.call(this, 'restricted', uri, params, cb)
+}
- var options = {
+function setAccess (access, uri, params, cb) {
+ return this.request(apiUri(uri, 'package', params.package, 'access'), {
method: 'POST',
- body: JSON.stringify(body),
+ auth: params.auth,
+ body: JSON.stringify({ access: access })
+ }, cb)
+}
+
+subcommands.grant = function (uri, params, cb) {
+ var reqUri = apiUri(uri, 'team', params.scope, params.team, 'package')
+ return this.request(reqUri, {
+ method: 'PUT',
+ auth: params.auth,
+ body: JSON.stringify({
+ permissions: params.permissions,
+ package: params.package
+ })
+ }, cb)
+}
+
+subcommands.revoke = function (uri, params, cb) {
+ var reqUri = apiUri(uri, 'team', params.scope, params.team, 'package')
+ return this.request(reqUri, {
+ method: 'DELETE',
+ auth: params.auth,
+ body: JSON.stringify({
+ package: params.package
+ })
+ }, cb)
+}
+
+subcommands['ls-packages'] = function (uri, params, cb, type) {
+ type = type || (params.team ? 'team' : 'org')
+ var client = this
+ var uriParams = '?format=cli'
+ var reqUri = apiUri(uri, type, params.scope, params.team, 'package')
+ return client.request(reqUri + uriParams, {
+ method: 'GET',
+ auth: params.auth
+ }, function (err, perms) {
+ if (err && err.statusCode === 404 && type === 'org') {
+ subcommands['ls-packages'].call(client, uri, params, cb, 'user')
+ } else {
+ cb(err, perms && translatePermissions(perms))
+ }
+ })
+}
+
+subcommands['ls-collaborators'] = function (uri, params, cb) {
+ var uriParams = '?format=cli'
+ if (params.user) {
+ uriParams += ('&user=' + encodeURIComponent(params.user))
+ }
+ var reqUri = apiUri(uri, 'package', params.package, 'collaborators')
+ return this.request(reqUri + uriParams, {
+ method: 'GET',
auth: params.auth
+ }, function (err, perms) {
+ cb(err, perms && translatePermissions(perms))
+ })
+}
+
+subcommands.edit = function () {
+ throw new Error('edit subcommand is not implemented yet')
+}
+
+function apiUri (registryUri) {
+ var path = Array.prototype.slice.call(arguments, 1)
+ .filter(function (x) { return x })
+ .map(encodeURIComponent)
+ .join('/')
+ return url.resolve(registryUri, '-/' + path)
+}
+
+function accessAssertions (subcommand, uri, params, cb) {
+ assert(subcommands.hasOwnProperty(subcommand),
+ 'access subcommand must be one of ' +
+ Object.keys(subcommands).join(', '))
+ typeChecks({
+ 'uri': [uri, 'string'],
+ 'params': [params, 'object'],
+ 'auth': [params.auth, 'object'],
+ 'callback': [cb, 'function']
+ })
+ if (contains([
+ 'public', 'restricted', 'grant', 'revoke', 'ls-collaborators'
+ ], subcommand)) {
+ typeChecks({ 'package': [params.package, 'string']})
+ assert(!!npa(params.package).scope,
+ 'access commands are only accessible for scoped packages')
+ }
+ if (contains(['grant', 'revoke', 'ls-packages'], subcommand)) {
+ typeChecks({ 'scope': [params.scope, 'string']})
+ }
+ if (contains(['grant', 'revoke'], subcommand)) {
+ typeChecks({ 'team': [params.team, 'string']})
+ }
+ if (subcommand === 'grant') {
+ typeChecks({ 'permissions': [params.permissions, 'string']})
+ assert(params.permissions === 'read-only' ||
+ params.permissions === 'read-write',
+ 'permissions must be either read-only or read-write')
+ }
+}
+
+function typeChecks (specs) {
+ Object.keys(specs).forEach(function (key) {
+ var checks = specs[key]
+ assert(typeof checks[0] === checks[1],
+ key + ' is required and must be of type ' + checks[1])
+ })
+}
+
+function contains (arr, item) {
+ return arr.indexOf(item) !== -1
+}
+
+function translatePermissions (perms) {
+ var newPerms = {}
+ for (var key in perms) {
+ if (perms.hasOwnProperty(key)) {
+ if (perms[key] === 'read') {
+ newPerms[key] = 'read-only'
+ } else if (perms[key] === 'write') {
+ newPerms[key] = 'read-write'
+ } else {
+ // This shouldn't happen, but let's not break things
+ // if the API starts returning different things.
+ newPerms[key] = perms[key]
+ }
+ }
}
- this.request(uri, options, cb)
+ return newPerms
}
diff --git a/node_modules/npm-registry-client/lib/request.js b/node_modules/npm-registry-client/lib/request.js
index 168a9d160..e4dc39957 100644
--- a/node_modules/npm-registry-client/lib/request.js
+++ b/node_modules/npm-registry-client/lib/request.js
@@ -9,6 +9,7 @@ var assert = require('assert')
var url = require('url')
var zlib = require('zlib')
var Stream = require('stream').Stream
+var STATUS_CODES = require('http').STATUS_CODES
var request = require('request')
var once = require('once')
@@ -208,8 +209,9 @@ function requestDone (method, where, cb) {
// expect data with any error codes
if (!data && response.statusCode >= 400) {
+ var code = response.statusCode
return cb(
- response.statusCode + ' ' + require('http').STATUS_CODES[response.statusCode],
+ makeError(code + ' ' + STATUS_CODES[code], null, code),
null,
data,
response
@@ -236,22 +238,33 @@ function requestDone (method, where, cb) {
}
if (!parsed.error) {
- er = new Error(
+ er = makeError(
'Registry returned ' + response.statusCode +
' for ' + method +
- ' on ' + where
+ ' on ' + where,
+ name,
+ response.statusCode
)
} else if (name && parsed.error === 'not_found') {
- er = new Error('404 Not Found: ' + name)
+ er = makeError('404 Not Found: ' + name, name, response.statusCode)
} else {
- er = new Error(
- parsed.error + ' ' + (parsed.reason || '') + ': ' + (name || w)
+ er = makeError(
+ parsed.error + ' ' + (parsed.reason || '') + ': ' + (name || w),
+ name,
+ response.statusCode
)
}
- if (name) er.pkgid = name
- er.statusCode = response.statusCode
- er.code = 'E' + er.statusCode
}
return cb(er, parsed, data, response)
}.bind(this)
}
+
+function makeError (message, name, code) {
+ var er = new Error(message)
+ if (name) er.pkgid = name
+ if (code) {
+ er.statusCode = code
+ er.code = 'E' + code
+ }
+ return er
+}
diff --git a/node_modules/npm-registry-client/lib/team.js b/node_modules/npm-registry-client/lib/team.js
new file mode 100644
index 000000000..3e3794e04
--- /dev/null
+++ b/node_modules/npm-registry-client/lib/team.js
@@ -0,0 +1,105 @@
+module.exports = team
+
+var assert = require('assert')
+var url = require('url')
+
+var subcommands = {}
+
+function team (sub, uri, params, cb) {
+ teamAssertions(sub, uri, params, cb)
+ return subcommands[sub].call(this, uri, params, cb)
+}
+
+subcommands.create = function (uri, params, cb) {
+ return this.request(apiUri(uri, 'org', params.scope, 'team'), {
+ method: 'PUT',
+ auth: params.auth,
+ body: JSON.stringify({
+ name: params.team
+ })
+ }, cb)
+}
+
+subcommands.destroy = function (uri, params, cb) {
+ return this.request(apiUri(uri, 'team', params.scope, params.team), {
+ method: 'DELETE',
+ auth: params.auth
+ }, cb)
+}
+
+subcommands.add = function (uri, params, cb) {
+ return this.request(apiUri(uri, 'team', params.scope, params.team, 'user'), {
+ method: 'PUT',
+ auth: params.auth,
+ body: JSON.stringify({
+ user: params.user
+ })
+ }, cb)
+}
+
+subcommands.rm = function (uri, params, cb) {
+ return this.request(apiUri(uri, 'team', params.scope, params.team, 'user'), {
+ method: 'DELETE',
+ auth: params.auth,
+ body: JSON.stringify({
+ user: params.user
+ })
+ }, cb)
+}
+
+subcommands.ls = function (uri, params, cb) {
+ var uriParams = '?format=cli'
+ if (params.team) {
+ var reqUri = apiUri(
+ uri, 'team', params.scope, params.team, 'user') + uriParams
+ return this.request(reqUri, {
+ method: 'GET',
+ auth: params.auth
+ }, cb)
+ } else {
+ return this.request(apiUri(uri, 'org', params.scope, 'team') + uriParams, {
+ method: 'GET',
+ auth: params.auth
+ }, cb)
+ }
+}
+
+// TODO - we punted this to v2
+// subcommands.edit = function (uri, params, cb) {
+// return this.request(apiUri(uri, 'team', params.scope, params.team, 'user'), {
+// method: 'POST',
+// auth: params.auth,
+// body: JSON.stringify({
+// users: params.users
+// })
+// }, cb)
+// }
+
+function apiUri (registryUri) {
+ var path = Array.prototype.slice.call(arguments, 1)
+ .map(encodeURIComponent)
+ .join('/')
+ return url.resolve(registryUri, '-/' + path)
+}
+
+function teamAssertions (subcommand, uri, params, cb) {
+ assert(subcommand, 'subcommand is required')
+ assert(subcommands.hasOwnProperty(subcommand),
+ 'team subcommand must be one of ' + Object.keys(subcommands))
+ assert(typeof uri === 'string', 'registry URI is required')
+ assert(typeof params === 'object', 'params are required')
+ assert(typeof params.auth === 'object', 'auth is required')
+ assert(typeof params.scope === 'string', 'scope is required')
+ assert(!cb || typeof cb === 'function', 'callback must be a function')
+ if (subcommand !== 'ls') {
+ assert(typeof params.team === 'string', 'team name is required')
+ }
+ if (subcommand === 'rm' || subcommand === 'add') {
+ assert(typeof params.user === 'string', 'user is required')
+ }
+ if (subcommand === 'edit') {
+ assert(typeof params.users === 'object' &&
+ params.users.length != null,
+ 'users is required')
+ }
+}
diff --git a/node_modules/npm-registry-client/node_modules/chownr/LICENCE b/node_modules/npm-registry-client/node_modules/chownr/LICENCE
deleted file mode 100644
index 74489e2e2..000000000
--- a/node_modules/npm-registry-client/node_modules/chownr/LICENCE
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright (c) Isaac Z. Schlueter
-All rights reserved.
-
-The BSD License
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
-``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
diff --git a/node_modules/npm-registry-client/node_modules/chownr/LICENSE b/node_modules/npm-registry-client/node_modules/chownr/LICENSE
deleted file mode 100644
index 19129e315..000000000
--- a/node_modules/npm-registry-client/node_modules/chownr/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/npm-registry-client/node_modules/chownr/README.md b/node_modules/npm-registry-client/node_modules/chownr/README.md
deleted file mode 100644
index 70e9a54a3..000000000
--- a/node_modules/npm-registry-client/node_modules/chownr/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-Like `chown -R`.
-
-Takes the same arguments as `fs.chown()`
diff --git a/node_modules/npm-registry-client/node_modules/chownr/chownr.js b/node_modules/npm-registry-client/node_modules/chownr/chownr.js
deleted file mode 100644
index 598b8f844..000000000
--- a/node_modules/npm-registry-client/node_modules/chownr/chownr.js
+++ /dev/null
@@ -1,41 +0,0 @@
-module.exports = chownr
-chownr.sync = chownrSync
-
-var fs = require("fs")
-, path = require("path")
-
-function chownr (p, uid, gid, cb) {
- fs.readdir(p, function (er, children) {
- // any error other than ENOTDIR means it's not readable, or
- // doesn't exist. give up.
- if (er && er.code !== "ENOTDIR") return cb(er)
- if (er || !children.length) return fs.chown(p, uid, gid, cb)
-
- var len = children.length
- , errState = null
- children.forEach(function (child) {
- chownr(path.resolve(p, child), uid, gid, then)
- })
- function then (er) {
- if (errState) return
- if (er) return cb(errState = er)
- if (-- len === 0) return fs.chown(p, uid, gid, cb)
- }
- })
-}
-
-function chownrSync (p, uid, gid) {
- var children
- try {
- children = fs.readdirSync(p)
- } catch (er) {
- if (er && er.code === "ENOTDIR") return fs.chownSync(p, uid, gid)
- throw er
- }
- if (!children.length) return fs.chownSync(p, uid, gid)
-
- children.forEach(function (child) {
- chownrSync(path.resolve(p, child), uid, gid)
- })
- return fs.chownSync(p, uid, gid)
-}
diff --git a/node_modules/npm-registry-client/node_modules/chownr/package.json b/node_modules/npm-registry-client/node_modules/chownr/package.json
deleted file mode 100644
index 61ecb8fd3..000000000
--- a/node_modules/npm-registry-client/node_modules/chownr/package.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
- "_args": [
- [
- "chownr@0",
- "/Users/rebecca/code/npm/node_modules/npm-registry-client"
- ]
- ],
- "_from": "chownr@>=0.0.0 <1.0.0",
- "_id": "chownr@0.0.2",
- "_inCache": true,
- "_location": "/npm-registry-client/chownr",
- "_nodeVersion": "2.0.1",
- "_npmUser": {
- "email": "isaacs@npmjs.com",
- "name": "isaacs"
- },
- "_npmVersion": "2.10.0",
- "_phantomChildren": {},
- "_requested": {
- "name": "chownr",
- "raw": "chownr@0",
- "rawSpec": "0",
- "scope": null,
- "spec": ">=0.0.0 <1.0.0",
- "type": "range"
- },
- "_requiredBy": [
- "/npm-registry-client"
- ],
- "_resolved": "https://registry.npmjs.org/chownr/-/chownr-0.0.2.tgz",
- "_shasum": "2f9aebf746f90808ce00607b72ba73b41604c485",
- "_shrinkwrap": null,
- "_spec": "chownr@0",
- "_where": "/Users/rebecca/code/npm/node_modules/npm-registry-client",
- "author": {
- "email": "i@izs.me",
- "name": "Isaac Z. Schlueter",
- "url": "http://blog.izs.me/"
- },
- "bugs": {
- "url": "https://github.com/isaacs/chownr/issues"
- },
- "dependencies": {},
- "description": "like `chown -R`",
- "devDependencies": {
- "mkdirp": "0.3",
- "rimraf": "",
- "tap": "0.2"
- },
- "directories": {},
- "dist": {
- "shasum": "2f9aebf746f90808ce00607b72ba73b41604c485",
- "tarball": "http://registry.npmjs.org/chownr/-/chownr-0.0.2.tgz"
- },
- "gitHead": "3cafeb70b2c343e893f710750406b3909ec537cb",
- "homepage": "https://github.com/isaacs/chownr#readme",
- "installable": true,
- "license": "ISC",
- "main": "chownr.js",
- "maintainers": [
- {
- "name": "isaacs",
- "email": "i@izs.me"
- }
- ],
- "name": "chownr",
- "optionalDependencies": {},
- "repository": {
- "type": "git",
- "url": "git://github.com/isaacs/chownr.git"
- },
- "scripts": {
- "test": "tap test/*.js"
- },
- "version": "0.0.2"
-}
diff --git a/node_modules/npm-registry-client/node_modules/chownr/test/basic.js b/node_modules/npm-registry-client/node_modules/chownr/test/basic.js
deleted file mode 100644
index e76fb5efc..000000000
--- a/node_modules/npm-registry-client/node_modules/chownr/test/basic.js
+++ /dev/null
@@ -1,85 +0,0 @@
-if (!process.getuid || !process.getgid) {
- throw new Error("Tests require getuid/getgid support")
-}
-
-var curUid = +process.getuid()
-, curGid = +process.getgid()
-, chownr = require("../")
-, test = require("tap").test
-, mkdirp = require("mkdirp")
-, rimraf = require("rimraf")
-, fs = require("fs")
-
-// sniff the 'id' command for other groups that i can legally assign to
-var exec = require("child_process").exec
-, groups
-, dirs = []
-
-exec("id", function (code, output) {
- if (code) throw new Error("failed to run 'id' command")
- groups = output.trim().split("groups=")[1].split(",").map(function (s) {
- return parseInt(s, 10)
- }).filter(function (g) {
- return g !== curGid
- })
-
- console.error([curUid, groups[0]], "uid, gid")
-
- rimraf("/tmp/chownr", function (er) {
- if (er) throw er
- var cnt = 5
- for (var i = 0; i < 5; i ++) {
- mkdirp(getDir(), then)
- }
- function then (er) {
- if (er) throw er
- if (-- cnt === 0) {
- runTest()
- }
- }
- })
-})
-
-function getDir () {
- var dir = "/tmp/chownr"
-
- dir += "/" + Math.floor(Math.random() * Math.pow(16,4)).toString(16)
- dirs.push(dir)
- dir += "/" + Math.floor(Math.random() * Math.pow(16,4)).toString(16)
- dirs.push(dir)
- dir += "/" + Math.floor(Math.random() * Math.pow(16,4)).toString(16)
- dirs.push(dir)
- return dir
-}
-
-function runTest () {
- test("should complete successfully", function (t) {
- console.error("calling chownr", curUid, groups[0], typeof curUid, typeof groups[0])
- chownr("/tmp/chownr", curUid, groups[0], function (er) {
- t.ifError(er)
- t.end()
- })
- })
-
- dirs.forEach(function (dir) {
- test("verify "+dir, function (t) {
- fs.stat(dir, function (er, st) {
- if (er) {
- t.ifError(er)
- return t.end()
- }
- t.equal(st.uid, curUid, "uid should be " + curUid)
- t.equal(st.gid, groups[0], "gid should be "+groups[0])
- t.end()
- })
- })
- })
-
- test("cleanup", function (t) {
- rimraf("/tmp/chownr/", function (er) {
- t.ifError(er)
- t.end()
- })
- })
-}
-
diff --git a/node_modules/npm-registry-client/node_modules/chownr/test/sync.js b/node_modules/npm-registry-client/node_modules/chownr/test/sync.js
deleted file mode 100644
index 81d554b3c..000000000
--- a/node_modules/npm-registry-client/node_modules/chownr/test/sync.js
+++ /dev/null
@@ -1,80 +0,0 @@
-if (!process.getuid || !process.getgid) {
- throw new Error("Tests require getuid/getgid support")
-}
-
-var curUid = +process.getuid()
-, curGid = +process.getgid()
-, chownr = require("../")
-, test = require("tap").test
-, mkdirp = require("mkdirp")
-, rimraf = require("rimraf")
-, fs = require("fs")
-
-// sniff the 'id' command for other groups that i can legally assign to
-var exec = require("child_process").exec
-, groups
-, dirs = []
-
-exec("id", function (code, output) {
- if (code) throw new Error("failed to run 'id' command")
- groups = output.trim().split("groups=")[1].split(",").map(function (s) {
- return parseInt(s, 10)
- }).filter(function (g) {
- return g !== curGid
- })
-
- console.error([curUid, groups[0]], "uid, gid")
-
- rimraf("/tmp/chownr", function (er) {
- if (er) throw er
- var cnt = 5
- for (var i = 0; i < 5; i ++) {
- mkdirp(getDir(), then)
- }
- function then (er) {
- if (er) throw er
- if (-- cnt === 0) {
- runTest()
- }
- }
- })
-})
-
-function getDir () {
- var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
- var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
- var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
- var dir = "/tmp/chownr/" + [x,y,z].join("/")
- dirs.push(dir)
- return dir
-}
-
-function runTest () {
- test("should complete successfully", function (t) {
- console.error("calling chownr", curUid, groups[0], typeof curUid, typeof groups[0])
- chownr.sync("/tmp/chownr", curUid, groups[0])
- t.end()
- })
-
- dirs.forEach(function (dir) {
- test("verify "+dir, function (t) {
- fs.stat(dir, function (er, st) {
- if (er) {
- t.ifError(er)
- return t.end()
- }
- t.equal(st.uid, curUid, "uid should be " + curUid)
- t.equal(st.gid, groups[0], "gid should be "+groups[0])
- t.end()
- })
- })
- })
-
- test("cleanup", function (t) {
- rimraf("/tmp/chownr/", function (er) {
- t.ifError(er)
- t.end()
- })
- })
-}
-
diff --git a/node_modules/npm-registry-client/package.json b/node_modules/npm-registry-client/package.json
index bc190fabd..d84d5028c 100644
--- a/node_modules/npm-registry-client/package.json
+++ b/node_modules/npm-registry-client/package.json
@@ -1,36 +1,36 @@
{
"_args": [
[
- "npm-registry-client@~6.5.1",
+ "npm-registry-client@~7.0.1",
"/Users/rebecca/code/npm"
]
],
- "_from": "npm-registry-client@>=6.5.1 <6.6.0",
- "_id": "npm-registry-client@6.5.1",
+ "_from": "npm-registry-client@>=7.0.1 <7.1.0",
+ "_id": "npm-registry-client@7.0.1",
"_inCache": true,
"_location": "/npm-registry-client",
- "_nodeVersion": "2.3.1",
+ "_nodeVersion": "2.2.2",
"_npmUser": {
- "email": "ogd@aoaioxxysz.net",
- "name": "othiym23"
+ "email": "kat@sykosomatic.org",
+ "name": "zkat"
},
- "_npmVersion": "2.13.1",
+ "_npmVersion": "2.13.5",
"_phantomChildren": {},
"_requested": {
"name": "npm-registry-client",
- "raw": "npm-registry-client@~6.5.1",
- "rawSpec": "~6.5.1",
+ "raw": "npm-registry-client@~7.0.1",
+ "rawSpec": "~7.0.1",
"scope": null,
- "spec": ">=6.5.1 <6.6.0",
+ "spec": ">=7.0.1 <7.1.0",
"type": "range"
},
"_requiredBy": [
"/"
],
- "_resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-6.5.1.tgz",
- "_shasum": "328d2088252b69fa541c3dd9f7690288661592a1",
+ "_resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-7.0.1.tgz",
+ "_shasum": "1184253d2085dcaa01a394cfdd66f2dad0d26feb",
"_shrinkwrap": null,
- "_spec": "npm-registry-client@~6.5.1",
+ "_spec": "npm-registry-client@~7.0.1",
"_where": "/Users/rebecca/code/npm",
"author": {
"email": "i@izs.me",
@@ -41,7 +41,7 @@
"url": "https://github.com/isaacs/npm-registry-client/issues"
},
"dependencies": {
- "chownr": "0",
+ "chownr": "^1.0.1",
"concat-stream": "^1.4.6",
"graceful-fs": "^3.0.0",
"mkdirp": "^0.5.0",
@@ -64,11 +64,12 @@
},
"directories": {},
"dist": {
- "shasum": "328d2088252b69fa541c3dd9f7690288661592a1",
- "tarball": "http://registry.npmjs.org/npm-registry-client/-/npm-registry-client-6.5.1.tgz"
+ "shasum": "1184253d2085dcaa01a394cfdd66f2dad0d26feb",
+ "tarball": "http://registry.npmjs.org/npm-registry-client/-/npm-registry-client-7.0.1.tgz"
},
- "gitHead": "dbb351ae906f40be03f21bbe28bd392a380dc7bb",
+ "gitHead": "250563a6a64f73e5e683e75aa21d36739f63159a",
"homepage": "https://github.com/isaacs/npm-registry-client#readme",
+ "installable": true,
"license": "ISC",
"main": "index.js",
"maintainers": [
@@ -99,5 +100,5 @@
"scripts": {
"test": "standard && tap test/*.js"
},
- "version": "6.5.1"
+ "version": "7.0.1"
}
diff --git a/node_modules/npm-registry-client/test/access.js b/node_modules/npm-registry-client/test/access.js
index 4081c329f..ba0fb2c81 100644
--- a/node_modules/npm-registry-client/test/access.js
+++ b/node_modules/npm-registry-client/test/access.js
@@ -6,91 +6,292 @@ var client = common.freshClient()
function nop () {}
-var URI = 'http://localhost:1337/-/package/underscore/access'
-var TOKEN = 'foo'
-var AUTH = {
- token: TOKEN
-}
-var LEVEL = 'public'
+var URI = 'http://localhost:1337'
var PARAMS = {
- level: LEVEL,
- auth: AUTH
+ auth: { token: 'foo' },
+ scope: 'myorg',
+ team: 'myteam',
+ package: '@foo/bar',
+ permissions: 'read-write'
}
-test('access call contract', function (t) {
- t.throws(function () {
- client.access(undefined, AUTH, nop)
- }, 'requires a URI')
-
- t.throws(function () {
- client.access([], PARAMS, nop)
- }, 'requires URI to be a string')
-
- t.throws(function () {
- client.access(URI, undefined, nop)
- }, 'requires params object')
-
- t.throws(function () {
- client.access(URI, '', nop)
- }, 'params must be object')
-
- t.throws(function () {
- client.access(URI, PARAMS, undefined)
- }, 'requires callback')
-
- t.throws(function () {
- client.access(URI, PARAMS, 'callback')
- }, 'callback must be function')
-
- t.throws(
- function () {
- var params = {
- auth: AUTH
- }
- client.access(URI, params, nop)
- },
- { name: 'AssertionError', message: 'must pass level to access' },
- 'access must include level'
- )
-
- t.throws(
- function () {
- var params = {
- level: LEVEL
- }
- client.access(URI, params, nop)
- },
- { name: 'AssertionError', message: 'must pass auth to access' },
- 'access must include auth'
- )
+var commands = [
+ 'public', 'restricted', 'grant', 'revoke', 'ls-packages', 'ls-collaborators'
+]
- t.end()
+test('access public', function (t) {
+ server.expect('POST', '/-/package/%40foo%2Fbar/access', function (req, res) {
+ t.equal(req.method, 'POST')
+ onJsonReq(req, function (json) {
+ t.deepEqual(json, { access: 'public' })
+ res.statusCode = 200
+ res.json({ accessChanged: true })
+ })
+ })
+ var params = Object.create(PARAMS)
+ params.package = '@foo/bar'
+ client.access('public', URI, params, function (error, data) {
+ t.ifError(error, 'no errors')
+ t.ok(data.accessChanged, 'access level set')
+ t.end()
+ })
})
-test('set access level on a package', function (t) {
- server.expect('POST', '/-/package/underscore/access', function (req, res) {
+test('access restricted', function (t) {
+ server.expect('POST', '/-/package/%40foo%2Fbar/access', function (req, res) {
t.equal(req.method, 'POST')
-
- var b = ''
- req.setEncoding('utf8')
- req.on('data', function (d) {
- b += d
+ onJsonReq(req, function (json) {
+ t.deepEqual(json, { access: 'restricted' })
+ res.statusCode = 200
+ res.json({ accessChanged: true })
})
+ })
+ client.access('restricted', URI, PARAMS, function (error, data) {
+ t.ifError(error, 'no errors')
+ t.ok(data.accessChanged, 'access level set')
+ t.end()
+ })
+})
- req.on('end', function () {
- var updated = JSON.parse(b)
-
- t.deepEqual(updated, { access: 'public' })
-
+test('access grant basic', function (t) {
+ server.expect('PUT', '/-/team/myorg/myteam/package', function (req, res) {
+ t.equal(req.method, 'PUT')
+ onJsonReq(req, function (json) {
+ t.deepEqual(json, {
+ permissions: PARAMS.permissions,
+ package: PARAMS.package
+ })
res.statusCode = 201
res.json({ accessChanged: true })
})
})
+ client.access('grant', URI, PARAMS, function (error, data) {
+ t.ifError(error, 'no errors')
+ t.ok(data.accessChanged, 'access level set')
+ t.end()
+ })
+})
- client.access(URI, PARAMS, function (error, data) {
+test('access revoke basic', function (t) {
+ server.expect('DELETE', '/-/team/myorg/myteam/package', function (req, res) {
+ t.equal(req.method, 'DELETE')
+ onJsonReq(req, function (json) {
+ t.deepEqual(json, {
+ package: PARAMS.package
+ })
+ res.statusCode = 200
+ res.json({ accessChanged: true })
+ })
+ })
+ client.access('revoke', URI, PARAMS, function (error, data) {
t.ifError(error, 'no errors')
t.ok(data.accessChanged, 'access level set')
+ t.end()
+ })
+})
+
+test('ls-packages on team', function (t) {
+ var serverPackages = {
+ '@foo/bar': 'write',
+ '@foo/util': 'read'
+ }
+ var clientPackages = {
+ '@foo/bar': 'read-write',
+ '@foo/util': 'read-only'
+ }
+ var uri = '/-/team/myorg/myteam/package?format=cli'
+ server.expect('GET', uri, function (req, res) {
+ t.equal(req.method, 'GET')
+ res.statusCode = 200
+ res.json(serverPackages)
+ })
+ client.access('ls-packages', URI, PARAMS, function (error, data) {
+ t.ifError(error, 'no errors')
+ t.same(data, clientPackages)
+ t.end()
+ })
+})
+
+test('ls-packages on org', function (t) {
+ var serverPackages = {
+ '@foo/bar': 'write',
+ '@foo/util': 'read'
+ }
+ var clientPackages = {
+ '@foo/bar': 'read-write',
+ '@foo/util': 'read-only'
+ }
+ var uri = '/-/org/myorg/package?format=cli'
+ server.expect('GET', uri, function (req, res) {
+ t.equal(req.method, 'GET')
+ res.statusCode = 200
+ res.json(serverPackages)
+ })
+ var params = Object.create(PARAMS)
+ params.team = null
+ client.access('ls-packages', URI, params, function (error, data) {
+ t.ifError(error, 'no errors')
+ t.same(data, clientPackages)
+ t.end()
+ })
+})
+test('ls-packages on user', function (t) {
+ var serverPackages = {
+ '@foo/bar': 'write',
+ '@foo/util': 'read'
+ }
+ var clientPackages = {
+ '@foo/bar': 'read-write',
+ '@foo/util': 'read-only'
+ }
+ var firstUri = '/-/org/myorg/package?format=cli'
+ server.expect('GET', firstUri, function (req, res) {
+ t.equal(req.method, 'GET')
+ res.statusCode = 404
+ res.json({error: 'not found'})
+ })
+ var secondUri = '/-/user/myorg/package?format=cli'
+ server.expect('GET', secondUri, function (req, res) {
+ t.equal(req.method, 'GET')
+ res.statusCode = 200
+ res.json(serverPackages)
+ })
+ var params = Object.create(PARAMS)
+ params.team = null
+ client.access('ls-packages', URI, params, function (error, data) {
+ t.ifError(error, 'no errors')
+ t.same(data, clientPackages)
t.end()
})
})
+
+test('ls-collaborators', function (t) {
+ var serverCollaborators = {
+ 'myorg:myteam': 'write',
+ 'myorg:anotherteam': 'read'
+ }
+ var clientCollaborators = {
+ 'myorg:myteam': 'read-write',
+ 'myorg:anotherteam': 'read-only'
+ }
+ var uri = '/-/package/%40foo%2Fbar/collaborators?format=cli'
+ server.expect('GET', uri, function (req, res) {
+ t.equal(req.method, 'GET')
+ res.statusCode = 200
+ res.json(serverCollaborators)
+ })
+ client.access('ls-collaborators', URI, PARAMS, function (error, data) {
+ t.ifError(error, 'no errors')
+ t.same(data, clientCollaborators)
+ t.end()
+ })
+})
+
+test('ls-collaborators w/ scope', function (t) {
+ var serverCollaborators = {
+ 'myorg:myteam': 'write',
+ 'myorg:anotherteam': 'read'
+ }
+ var clientCollaborators = {
+ 'myorg:myteam': 'read-write',
+ 'myorg:anotherteam': 'read-only'
+ }
+ var uri = '/-/package/%40foo%2Fbar/collaborators?format=cli&user=zkat'
+ server.expect('GET', uri, function (req, res) {
+ t.equal(req.method, 'GET')
+ res.statusCode = 200
+ res.json(serverCollaborators)
+ })
+ var params = Object.create(PARAMS)
+ params.user = 'zkat'
+ client.access('ls-collaborators', URI, params, function (error, data) {
+ t.ifError(error, 'no errors')
+ t.same(data, clientCollaborators)
+ t.end()
+ })
+})
+
+test('access command base validation', function (t) {
+ t.throws(function () {
+ client.access(undefined, URI, PARAMS, nop)
+ }, 'command is required')
+ t.throws(function () {
+ client.access('whoops', URI, PARAMS, nop)
+ }, 'command must be a valid subcommand')
+ commands.forEach(function (cmd) {
+ t.throws(function () {
+ client.access(cmd, undefined, PARAMS, nop)
+ }, 'registry URI is required')
+ t.throws(function () {
+ client.access(cmd, URI, undefined, nop)
+ }, 'params is required')
+ t.throws(function () {
+ client.access(cmd, URI, '', nop)
+ }, 'params must be an object')
+ t.throws(function () {
+ client.access(cmd, URI, {scope: 'o', team: 't'}, nop)
+ }, 'auth is required')
+ t.throws(function () {
+ client.access(cmd, URI, {auth: 5, scope: 'o', team: 't'}, nop)
+ }, 'auth must be an object')
+ t.throws(function () {
+ client.access(cmd, URI, PARAMS, {})
+ }, 'callback must be a function')
+ t.throws(function () {
+ client.access(cmd, URI, PARAMS, undefined)
+ }, 'callback is required')
+ if (contains([
+ 'public', 'restricted', 'grant', 'revoke', 'ls-collaborators'
+ ], cmd)) {
+ t.throws(function () {
+ var params = Object.create(PARAMS)
+ params.package = null
+ client.access(cmd, URI, params, nop)
+ }, 'package is required')
+ t.throws(function () {
+ var params = Object.create(PARAMS)
+ params.package = 'underscore'
+ client.access(cmd, URI, params, nop)
+ }, 'only scopes packages are allowed')
+ }
+ if (contains(['grant', 'revoke', 'ls-packages'], cmd)) {
+ t.throws(function () {
+ var params = Object.create(PARAMS)
+ params.scope = null
+ client.access(cmd, URI, params, nop)
+ }, 'scope is required')
+ }
+ if (contains(['grant', 'revoke'], cmd)) {
+ t.throws(function () {
+ var params = Object.create(PARAMS)
+ params.team = null
+ client.access(cmd, URI, params, nop)
+ }, 'team is required')
+ }
+ if (cmd === 'grant') {
+ t.throws(function () {
+ var params = Object.create(PARAMS)
+ params.permissions = null
+ client.access(cmd, URI, params, nop)
+ }, 'permissions are required')
+ t.throws(function () {
+ var params = Object.create(PARAMS)
+ params.permissions = 'idkwhat'
+ client.access(cmd, URI, params, nop)
+ }, 'permissions must be either read-only or read-write')
+ }
+ })
+ t.end()
+})
+
+function onJsonReq (req, cb) {
+ var buffer = ''
+ req.setEncoding('utf8')
+ req.on('data', function (data) { buffer += data })
+ req.on('end', function () { cb(buffer ? JSON.parse(buffer) : undefined) })
+}
+
+function contains (arr, item) {
+ return arr.indexOf(item) !== -1
+}
diff --git a/node_modules/npm-registry-client/test/fetch-404.js b/node_modules/npm-registry-client/test/fetch-404.js
index e05e36f26..805c88a67 100644
--- a/node_modules/npm-registry-client/test/fetch-404.js
+++ b/node_modules/npm-registry-client/test/fetch-404.js
@@ -1,9 +1,7 @@
var resolve = require('path').resolve
var createReadStream = require('graceful-fs').createReadStream
-var readFileSync = require('graceful-fs').readFileSync
var tap = require('tap')
-var cat = require('concat-stream')
var server = require('./lib/server.js')
var common = require('./lib/common.js')
@@ -14,10 +12,7 @@ tap.test('fetch with a 404 response', function (t) {
server.expect('/underscore/-/underscore-1.3.3.tgz', function (req, res) {
t.equal(req.method, 'GET', 'got expected method')
- res.writeHead(200, {
- 'content-type': 'application/x-tar',
- 'content-encoding': 'gzip'
- })
+ res.writeHead(404)
createReadStream(tgz).pipe(res)
})
@@ -27,19 +22,13 @@ tap.test('fetch with a 404 response', function (t) {
client.fetch(
'http://localhost:1337/underscore/-/underscore-1.3.3.tgz',
defaulted,
- function (er, res) {
- t.ifError(er, 'loaded successfully')
-
- var sink = cat(function (data) {
- t.deepEqual(data, readFileSync(tgz))
- t.end()
- })
-
- res.on('error', function (error) {
- t.ifError(error, 'no errors on stream')
- })
-
- res.pipe(sink)
+ function (err, res) {
+ t.equal(
+ err.message,
+ 'fetch failed with status code 404',
+ 'got expected error message'
+ )
+ t.end()
}
)
})
diff --git a/node_modules/npm-registry-client/test/request.js b/node_modules/npm-registry-client/test/request.js
index 68af9bcca..113bafd34 100644
--- a/node_modules/npm-registry-client/test/request.js
+++ b/node_modules/npm-registry-client/test/request.js
@@ -81,7 +81,7 @@ test('request call contract', function (t) {
})
test('run request through its paces', function (t) {
- t.plan(29)
+ t.plan(34)
server.expect('/request-defaults', function (req, res) {
t.equal(req.method, 'GET', 'uses GET by default')
@@ -173,6 +173,13 @@ test('run request through its paces', function (t) {
}))
})
+ server.expect('GET', '/not-found-no-body', function (req, res) {
+ req.pipe(concat(function () {
+ res.statusCode = 404
+ res.end()
+ }))
+ })
+
var defaults = {}
client.request(
common.registry + '/request-defaults',
@@ -260,4 +267,12 @@ test('run request through its paces', function (t) {
client.request(common.registry + '/@scoped%2Fpackage-failing', defaults, function (er) {
t.equals(er.message, 'payment required : @scoped/package-failing')
})
+
+ client.request(common.registry + '/not-found-no-body', defaults, function (er) {
+ t.equals(er.message, '404 Not Found')
+ t.equals(er.statusCode, 404, 'got back 404 as .statusCode')
+ t.equals(er.code, 'E404', 'got back expected string code')
+ t.notOk(er.pkgid, "no package name returned when there's no body on response")
+ t.ok(typeof er !== 'string', "Error shouldn't be returned as string.")
+ })
})
diff --git a/node_modules/npm-registry-client/test/team.js b/node_modules/npm-registry-client/test/team.js
new file mode 100644
index 000000000..638690c57
--- /dev/null
+++ b/node_modules/npm-registry-client/test/team.js
@@ -0,0 +1,210 @@
+var test = require('tap').test
+
+var server = require('./lib/server.js')
+var common = require('./lib/common.js')
+var client = common.freshClient()
+
+function nop () {}
+
+var URI = 'http://localhost:1337'
+var PARAMS = {
+ auth: {
+ token: 'foo'
+ },
+ scope: 'myorg',
+ team: 'myteam'
+}
+
+var commands = ['create', 'destroy', 'add', 'rm', 'ls']
+
+test('team create basic', function (t) {
+ var teamData = {
+ name: PARAMS.team,
+ scope_id: 1234,
+ created: '2015-07-23T18:07:49.959Z',
+ updated: '2015-07-23T18:07:49.959Z',
+ deleted: null
+ }
+ server.expect('PUT', '/-/org/myorg/team', function (req, res) {
+ t.equal(req.method, 'PUT')
+ onJsonReq(req, function (json) {
+ t.same(json, { name: PARAMS.team })
+ res.statusCode = 200
+ res.json(teamData)
+ })
+ })
+ client.team('create', URI, PARAMS, function (err, data) {
+ t.ifError(err, 'no errors')
+ t.same(data, teamData)
+ t.end()
+ })
+})
+
+test('team destroy', function (t) {
+ var teamData = {
+ name: 'myteam',
+ scope_id: 1234,
+ created: '2015-07-23T18:07:49.959Z',
+ updated: '2015-07-23T18:07:49.959Z',
+ deleted: '2015-07-23T18:27:27.178Z'
+ }
+ server.expect('DELETE', '/-/team/myorg/myteam', function (req, res) {
+ t.equal(req.method, 'DELETE')
+ onJsonReq(req, function (json) {
+ t.same(json, undefined)
+ res.statusCode = 200
+ res.json(teamData)
+ })
+ })
+ client.team('destroy', URI, PARAMS, function (err, data) {
+ t.ifError(err, 'no errors')
+ t.same(data, teamData)
+ t.end()
+ })
+})
+
+test('team add basic', function (t) {
+ var params = Object.create(PARAMS)
+ params.user = 'zkat'
+ server.expect('PUT', '/-/team/myorg/myteam/user', function (req, res) {
+ t.equal(req.method, 'PUT')
+ onJsonReq(req, function (json) {
+ t.same(json, { user: params.user })
+ res.statusCode = 200
+ res.json(undefined)
+ })
+ })
+ client.team('add', URI, params, function (err, data) {
+ t.ifError(err, 'no errors')
+ t.same(data, undefined)
+ t.end()
+ })
+})
+
+test('team add user not in org', function (t) {
+ var params = Object.create(PARAMS)
+ params.user = 'zkat'
+ var errMsg = 'user is already in team'
+ server.expect('PUT', '/-/team/myorg/myteam/user', function (req, res) {
+ t.equal(req.method, 'PUT')
+ res.statusCode = 400
+ res.json({
+ error: errMsg
+ })
+ })
+ client.team('add', URI, params, function (err, data) {
+ t.equal(err.message, errMsg + ' : ' + '-/team/myorg/myteam/user')
+ t.same(data, {error: errMsg})
+ t.end()
+ })
+})
+
+test('team rm basic', function (t) {
+ var params = Object.create(PARAMS)
+ params.user = 'bcoe'
+ server.expect('DELETE', '/-/team/myorg/myteam/user', function (req, res) {
+ t.equal(req.method, 'DELETE')
+ onJsonReq(req, function (json) {
+ t.same(json, params)
+ res.statusCode = 200
+ res.json(undefined)
+ })
+ })
+ client.team('rm', URI, params, function (err, data) {
+ t.ifError(err, 'no errors')
+ t.same(data, undefined)
+ t.end()
+ })
+})
+
+test('team ls (on org)', function (t) {
+ var params = Object.create(PARAMS)
+ params.team = null
+ var teams = ['myorg:team1', 'myorg:team2', 'myorg:team3']
+ server.expect('GET', '/-/org/myorg/team?format=cli', function (req, res) {
+ t.equal(req.method, 'GET')
+ onJsonReq(req, function (json) {
+ t.same(json, undefined)
+ res.statusCode = 200
+ res.json(teams)
+ })
+ })
+ client.team('ls', URI, params, function (err, data) {
+ t.ifError(err, 'no errors')
+ t.same(data, teams)
+ t.end()
+ })
+})
+
+test('team ls (on team)', function (t) {
+ var uri = '/-/team/myorg/myteam/user?format=cli'
+ var users = ['zkat', 'bcoe']
+ server.expect('GET', uri, function (req, res) {
+ t.equal(req.method, 'GET')
+ onJsonReq(req, function (json) {
+ t.same(json, undefined)
+ res.statusCode = 200
+ res.json(users)
+ })
+ })
+ client.team('ls', URI, PARAMS, function (err, data) {
+ t.ifError(err, 'no errors')
+ t.same(data, users)
+ t.end()
+ })
+})
+
+// test('team edit', function (t) {
+// server.expect('PUT', '/-/org/myorg/team', function (req, res) {
+// t.equal(req.method, 'PUT')
+// res.statusCode = 201
+// res.json({})
+// })
+// client.team('create', URI, PARAMS, function (err, data) {
+// t.ifError(err, 'no errors')
+// t.end()
+// })
+// })
+
+test('team command base validation', function (t) {
+ t.throws(function () {
+ client.team(undefined, URI, PARAMS, nop)
+ }, 'command is required')
+ commands.forEach(function (cmd) {
+ t.throws(function () {
+ client.team(cmd, undefined, PARAMS, nop)
+ }, 'registry URI is required')
+ t.throws(function () {
+ client.team(cmd, URI, undefined, nop)
+ }, 'params is required')
+ t.throws(function () {
+ client.team(cmd, URI, {scope: 'o', team: 't'}, nop)
+ }, 'auth is required')
+ t.throws(function () {
+ client.team(cmd, URI, {auth: {token: 'f'}, team: 't'}, nop)
+ }, 'scope is required')
+ t.throws(function () {
+ client.team(cmd, URI, PARAMS, {})
+ }, 'callback must be a function')
+ if (cmd !== 'ls') {
+ t.throws(function () {
+ client.team(
+ cmd, URI, {auth: {token: 'f'}, scope: 'o'}, nop)
+ }, 'team name is required')
+ }
+ if (cmd === 'add' || cmd === 'rm') {
+ t.throws(function () {
+ client.team(
+ cmd, URI, PARAMS, nop)
+ }, 'user is required')
+ }
+ })
+ t.end()
+})
+
+function onJsonReq (req, cb) {
+ var buffer = ''
+ req.setEncoding('utf8')
+ req.on('data', function (data) { buffer += data })
+ req.on('end', function () { cb(buffer ? JSON.parse(buffer) : undefined) })
+}