UNPKG

1.53 kBJavaScriptView Raw
1var scopedPackagePattern = new RegExp("^(?:@([^/]+?)[/])?([^/]+?)$")
2
3var validate = module.exports = function(name) {
4
5 var errors = []
6
7 if (name === null) {
8 errors.push("name cannot be null")
9 return done(errors)
10 }
11
12 if (name === undefined) {
13 errors.push("name cannot be undefined")
14 return done(errors)
15 }
16
17 if (typeof name !== "string") {
18 errors.push("name must be a string")
19 return done(errors)
20 }
21
22 if (!name.length) {
23 errors.push("name length must be greater than zero")
24 }
25
26 if (name.match(/^\./)) {
27 errors.push("name cannot start with a period")
28 }
29
30 if (name.match(/^_/)) {
31 errors.push("name cannot start with an underscore")
32 }
33
34 if (name.length > 50) {
35 errors.push("name cannot be longer than 50 characters")
36 }
37
38 if (name.trim() !== name) {
39 errors.push("name cannot contain leading or trailing spaces")
40 }
41
42 if (encodeURIComponent(name) !== name) {
43
44 // Maybe it's a scoped package name, like @user/package
45 var nameMatch = name.match(scopedPackagePattern)
46 if (nameMatch) {
47 var user = nameMatch[1]
48 var pkg = nameMatch[2]
49 if (encodeURIComponent(user) === user && encodeURIComponent(pkg) === pkg) {
50 return done(errors)
51 }
52 }
53
54 errors.push("name can only contain URL-friendly characters")
55 }
56
57 return done(errors)
58
59}
60
61validate.scopedPackagePattern = scopedPackagePattern
62
63var done = function (errors) {
64 if (errors.length) {
65 return {valid: false, errors: errors}
66 } else {
67 return {valid: true}
68 }
69}