UNPKG

2.58 kBJavaScriptView Raw
1var scopedPackagePattern = new RegExp("^(?:@([^/]+?)[/])?([^/]+?)$");
2var builtins = require("builtins")
3var blacklist = [
4 "node_modules",
5 "favicon.ico"
6];
7
8var validate = module.exports = function(name) {
9
10 var warnings = []
11 var errors = []
12
13 if (name === null) {
14 errors.push("name cannot be null")
15 return done(warnings, errors)
16 }
17
18 if (name === undefined) {
19 errors.push("name cannot be undefined")
20 return done(warnings, errors)
21 }
22
23 if (typeof name !== "string") {
24 errors.push("name must be a string")
25 return done(warnings, errors)
26 }
27
28 if (!name.length) {
29 errors.push("name length must be greater than zero")
30 }
31
32 if (name.match(/^\./)) {
33 errors.push("name cannot start with a period")
34 }
35
36 if (name.match(/^_/)) {
37 errors.push("name cannot start with an underscore")
38 }
39
40 if (name.trim() !== name) {
41 errors.push("name cannot contain leading or trailing spaces")
42 }
43
44 // No funny business
45 blacklist.forEach(function(blacklistedName){
46 if (name.toLowerCase() === blacklistedName) {
47 errors.push(blacklistedName + " is a blacklisted name")
48 }
49 })
50
51 // Generate warnings for stuff that used to be allowed
52
53 // core module names like http, events, util, etc
54 builtins.forEach(function(builtin){
55 if (name.toLowerCase() === builtin) {
56 warnings.push(builtin + " is a core module name")
57 }
58 })
59
60 // really-long-package-names-------------------------------such--length-----many---wow
61 if (name.length > 50) {
62 warnings.push("name can no longer contain more than 50 characters")
63 }
64
65 // mIxeD CaSe nAMEs
66 if (name.toLowerCase() !== name) {
67 warnings.push("name can no longer contain capital letters")
68 }
69
70 if (encodeURIComponent(name) !== name) {
71
72 // Maybe it's a scoped package name, like @user/package
73 var nameMatch = name.match(scopedPackagePattern)
74 if (nameMatch) {
75 var user = nameMatch[1]
76 var pkg = nameMatch[2]
77 if (encodeURIComponent(user) === user && encodeURIComponent(pkg) === pkg) {
78 return done(warnings, errors)
79 }
80 }
81
82 errors.push("name can only contain URL-friendly characters")
83 }
84
85 return done(warnings, errors)
86
87}
88
89validate.scopedPackagePattern = scopedPackagePattern
90
91var done = function (warnings, errors) {
92 var result = {
93 validForNewPackages: errors.length === 0 && warnings.length === 0,
94 validForOldPackages: errors.length === 0,
95 warnings: warnings,
96 errors: errors
97 }
98 if (!result.warnings.length) delete result.warnings
99 if (!result.errors.length) delete result.errors
100 return result
101}