• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict'
2
3var validate = require('..')
4var test = require('tap').test
5
6test('validate-npm-package-name', function (t) {
7  // Traditional
8
9  t.deepEqual(validate('some-package'), {validForNewPackages: true, validForOldPackages: true})
10  t.deepEqual(validate('example.com'), {validForNewPackages: true, validForOldPackages: true})
11  t.deepEqual(validate('under_score'), {validForNewPackages: true, validForOldPackages: true})
12  t.deepEqual(validate('period.js'), {validForNewPackages: true, validForOldPackages: true})
13  t.deepEqual(validate('123numeric'), {validForNewPackages: true, validForOldPackages: true})
14  t.deepEqual(validate('crazy!'), {
15    validForNewPackages: false,
16    validForOldPackages: true,
17    warnings: ['name can no longer contain special characters ("~\'!()*")']
18  })
19
20  // Scoped (npm 2+)
21
22  t.deepEqual(validate('@npm/thingy'), {validForNewPackages: true, validForOldPackages: true})
23  t.deepEqual(validate('@npm-zors/money!time.js'), {
24    validForNewPackages: false,
25    validForOldPackages: true,
26    warnings: ['name can no longer contain special characters ("~\'!()*")']
27  })
28
29  // Invalid
30
31  t.deepEqual(validate(''), {
32    validForNewPackages: false,
33    validForOldPackages: false,
34    errors: ['name length must be greater than zero']})
35
36  t.deepEqual(validate(''), {
37    validForNewPackages: false,
38    validForOldPackages: false,
39    errors: ['name length must be greater than zero']})
40
41  t.deepEqual(validate('.start-with-period'), {
42    validForNewPackages: false,
43    validForOldPackages: false,
44    errors: ['name cannot start with a period']})
45
46  t.deepEqual(validate('_start-with-underscore'), {
47    validForNewPackages: false,
48    validForOldPackages: false,
49    errors: ['name cannot start with an underscore']})
50
51  t.deepEqual(validate('contain:colons'), {
52    validForNewPackages: false,
53    validForOldPackages: false,
54    errors: ['name can only contain URL-friendly characters']})
55
56  t.deepEqual(validate(' leading-space'), {
57    validForNewPackages: false,
58    validForOldPackages: false,
59    errors: ['name cannot contain leading or trailing spaces', 'name can only contain URL-friendly characters']})
60
61  t.deepEqual(validate('trailing-space '), {
62    validForNewPackages: false,
63    validForOldPackages: false,
64    errors: ['name cannot contain leading or trailing spaces', 'name can only contain URL-friendly characters']})
65
66  t.deepEqual(validate('s/l/a/s/h/e/s'), {
67    validForNewPackages: false,
68    validForOldPackages: false,
69    errors: ['name can only contain URL-friendly characters']})
70
71  t.deepEqual(validate('node_modules'), {
72    validForNewPackages: false,
73    validForOldPackages: false,
74    errors: ['node_modules is a blacklisted name']})
75
76  t.deepEqual(validate('favicon.ico'), {
77    validForNewPackages: false,
78    validForOldPackages: false,
79    errors: ['favicon.ico is a blacklisted name']})
80
81  // Node/IO Core
82
83  t.deepEqual(validate('http'), {
84    validForNewPackages: false,
85    validForOldPackages: true,
86    warnings: ['http is a core module name']})
87
88  // Long Package Names
89
90  t.deepEqual(validate('ifyouwanttogetthesumoftwonumberswherethosetwonumbersarechosenbyfindingthelargestoftwooutofthreenumbersandsquaringthemwhichismultiplyingthembyitselfthenyoushouldinputthreenumbersintothisfunctionanditwilldothatforyou-'), {
91    validForNewPackages: false,
92    validForOldPackages: true,
93    warnings: ['name can no longer contain more than 214 characters']
94  })
95
96  t.deepEqual(validate('ifyouwanttogetthesumoftwonumberswherethosetwonumbersarechosenbyfindingthelargestoftwooutofthreenumbersandsquaringthemwhichismultiplyingthembyitselfthenyoushouldinputthreenumbersintothisfunctionanditwilldothatforyou'), {
97    validForNewPackages: true,
98    validForOldPackages: true
99  })
100
101  // Legacy Mixed-Case
102
103  t.deepEqual(validate('CAPITAL-LETTERS'), {
104    validForNewPackages: false,
105    validForOldPackages: true,
106    warnings: ['name can no longer contain capital letters']})
107
108  t.end()
109})
110