Skip to content
This repository was archived by the owner on Aug 11, 2021. It is now read-only.

Commit 0d2c807

Browse files
smikesiarna
authored andcommitted
allow publish to existing mixed case names
let registry apply strict case-checking fix standard conformance remove expectation about useful error message just expect an error correct option name
1 parent bd0ab6f commit 0d2c807

File tree

5 files changed

+167
-4
lines changed

5 files changed

+167
-4
lines changed

lib/publish.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ var semver = require('semver')
55
var crypto = require('crypto')
66
var Stream = require('stream').Stream
77
var assert = require('assert')
8-
var fixer = require('normalize-package-data/lib/fixer.js')
8+
var fixer = require('normalize-package-data').fixer
99
var concat = require('concat-stream')
1010

1111
function escaped (name) {
@@ -38,7 +38,7 @@ function publish (uri, params, cb) {
3838
'must pass package metadata to publish'
3939
)
4040
try {
41-
fixer.fixNameField(metadata, true)
41+
fixer.fixNameField(metadata, {strict: true, allowLegacyCase: true})
4242
} catch (er) {
4343
return cb(er)
4444
}

lib/star.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ function star (uri, params, cb) {
77
assert(params && typeof params === 'object', 'must pass params to star')
88
assert(typeof cb === 'function', 'must pass callback to star')
99

10-
var starred = params.starred ? true : false
10+
var starred = !!params.starred
1111

1212
var auth = params.auth
1313
assert(auth && typeof auth === 'object', 'must pass auth to star')

test/publish-mixcase-name.js

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
var tap = require('tap')
2+
var fs = require('fs')
3+
4+
var server = require('./lib/server.js')
5+
var common = require('./lib/common.js')
6+
7+
var auth = {
8+
username: 'username',
9+
password: '%1234@asdf%',
10+
11+
alwaysAuth: true
12+
}
13+
14+
var client = common.freshClient()
15+
16+
tap.test('publish mixcase name', function (t) {
17+
// not really a tarball, but doesn't matter
18+
var bodyPath = require.resolve('../package.json')
19+
var tarball = fs.createReadStream(bodyPath)
20+
var pd = fs.readFileSync(bodyPath, 'base64')
21+
var pkg = require('../package.json')
22+
var lastTime = null
23+
24+
// change to mixed case name
25+
pkg.name = 'npm-Registry-Client'
26+
27+
server.expect('/npm-Registry-Client', function (req, res) {
28+
t.equal(req.method, 'PUT')
29+
var b = ''
30+
req.setEncoding('utf8')
31+
req.on('data', function (d) {
32+
b += d
33+
})
34+
35+
req.on('end', function () {
36+
var o = lastTime = JSON.parse(b)
37+
t.equal(o._id, 'npm-Registry-Client')
38+
t.equal(o['dist-tags'].latest, pkg.version)
39+
t.has(o.versions[pkg.version], pkg)
40+
t.same(o.maintainers, [ { name: 'username', email: '[email protected]' } ])
41+
var att = o._attachments[ pkg.name + '-' + pkg.version + '.tgz' ]
42+
t.same(att.data, pd)
43+
res.statusCode = 409
44+
res.json({reason: 'must supply latest _rev to update existing package'})
45+
})
46+
})
47+
48+
server.expect('/npm-Registry-Client?write=true', function (req, res) {
49+
t.equal(req.method, 'GET')
50+
t.ok(lastTime)
51+
for (var i in lastTime.versions) {
52+
var v = lastTime.versions[i]
53+
delete lastTime.versions[i]
54+
lastTime.versions['0.0.2'] = v
55+
lastTime['dist-tags'] = { latest: '0.0.2' }
56+
}
57+
lastTime._rev = 'asdf'
58+
res.json(lastTime)
59+
})
60+
61+
server.expect('/npm-Registry-Client', function (req, res) {
62+
t.equal(req.method, 'PUT')
63+
t.ok(lastTime)
64+
65+
var b = ''
66+
req.setEncoding('utf8')
67+
req.on('data', function (d) {
68+
b += d
69+
})
70+
71+
req.on('end', function () {
72+
var o = JSON.parse(b)
73+
t.equal(o._rev, 'asdf')
74+
t.deepEqual(o.versions['0.0.2'], o.versions[pkg.version])
75+
res.statusCode = 201
76+
res.json({created: true})
77+
})
78+
})
79+
80+
var params = {
81+
metadata: pkg,
82+
access: 'public',
83+
body: tarball,
84+
auth: auth
85+
}
86+
client.publish('http://localhost:1337/', params, function (er, data) {
87+
if (er) throw er
88+
t.deepEqual(data, { created: true })
89+
t.end()
90+
})
91+
})

test/publish-new-mixcase-name.js

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
var test = require('tap').test
2+
var crypto = require('crypto')
3+
var fs = require('fs')
4+
5+
var server = require('./lib/server.js')
6+
var common = require('./lib/common.js')
7+
var client = common.freshClient()
8+
9+
var URI = 'http://localhost:1337/'
10+
var USERNAME = 'username'
11+
var PASSWORD = '%1234@asdf%'
12+
var EMAIL = '[email protected]'
13+
var METADATA = require('../package.json')
14+
var ACCESS = 'public'
15+
// not really a tarball, but doesn't matter
16+
var BODY_PATH = require.resolve('../package.json')
17+
var BODY = fs.createReadStream(BODY_PATH)
18+
var AUTH = {
19+
username: USERNAME,
20+
password: PASSWORD,
21+
email: EMAIL
22+
}
23+
var PARAMS = {
24+
metadata: METADATA,
25+
access: ACCESS,
26+
body: BODY,
27+
auth: AUTH
28+
}
29+
30+
test('publish-new-mixcase-name', function (t) {
31+
var pd = fs.readFileSync(BODY_PATH, 'base64')
32+
33+
// change to mixed-case name
34+
METADATA.name = 'npm-Registry-Client'
35+
36+
server.expect('/npm-Registry-Client', function (req, res) {
37+
t.equal(req.method, 'PUT')
38+
var b = ''
39+
req.setEncoding('utf8')
40+
req.on('data', function (d) {
41+
b += d
42+
})
43+
44+
req.on('end', function () {
45+
var o = JSON.parse(b)
46+
t.equal(o._id, 'npm-Registry-Client')
47+
t.equal(o['dist-tags'].latest, METADATA.version)
48+
t.equal(o.access, ACCESS)
49+
t.has(o.versions[METADATA.version], METADATA)
50+
t.same(o.maintainers, [{ name: 'username', email: '[email protected]' }])
51+
t.same(o.maintainers, o.versions[METADATA.version].maintainers)
52+
53+
var att = o._attachments[METADATA.name + '-' + METADATA.version + '.tgz']
54+
t.same(att.data, pd)
55+
56+
var hash = crypto.createHash('sha1').update(pd, 'base64').digest('hex')
57+
t.equal(o.versions[METADATA.version].dist.shasum, hash)
58+
59+
res.statusCode = 403
60+
res.json({error: 'Name must be lower-case'})
61+
})
62+
})
63+
64+
client.publish(URI, PARAMS, function (er, data, json, res) {
65+
t.assert(er instanceof Error) // expect error
66+
67+
// TODO: need a test that ensures useful error message
68+
// t.similar(data.error, /must be lower-case/)
69+
70+
t.end()
71+
})
72+
})

test/request.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ test('request call contract', function (t) {
8181
})
8282

8383
test('run request through its paces', function (t) {
84-
t.plan(28)
84+
t.plan(29)
8585

8686
server.expect('/request-defaults', function (req, res) {
8787
t.equal(req.method, 'GET', 'uses GET by default')

0 commit comments

Comments
 (0)