Skip to content

Commit 27eaa90

Browse files
committed
Simplify new binary tool
1 parent a9d9123 commit 27eaa90

File tree

6 files changed

+114
-148
lines changed

6 files changed

+114
-148
lines changed

README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,8 @@ $ npx nanoid --size 10
475475
L3til0JS4z
476476
```
477477

478-
Custom alphabet can be specified with `--alphabet` (or `-a`) option (note that in this case `--size` is required):
478+
Custom alphabet can be specified with `--alphabet` (or `-a`) option
479+
(note that in this case `--size` is required):
479480

480481
```sh
481482
$ npx nanoid --alphabet abc --size 15

README.ru.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,8 @@ $ npx nanoid --size 10
463463
L3til0JS4z
464464
```
465465

466-
Изменить алфавит можно при помощи аргумента `--alphabet` (ли `-a`) (обратите внимание, что в этом случае `--size` обязателен):
466+
Изменить алфавит можно при помощи аргумента `--alphabet` (ли `-a`)
467+
(в этом случае `--size` обязателен):
467468

468469
```sh
469470
$ npx nanoid --alphabet abc --size 15

bin/nanoid.cjs

+40-28
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,58 @@
11
#!/usr/bin/env node
22

33
let { nanoid, customAlphabet } = require('..')
4-
let { parseArgs } = require('./utils')
54

6-
let parsedArgs = parseArgs(process.argv)
5+
function print(msg) {
6+
process.stdout.write(msg + '\n')
7+
}
8+
9+
function error(msg) {
10+
process.stderr.write(msg + '\n')
11+
process.exit(1)
12+
}
713

8-
if (parsedArgs.help) {
9-
process.stdout.write(`
10-
Usage
11-
$ nanoid [options]
14+
if (process.argv.includes('--help') || process.argv.includes('-h')) {
15+
print(`
16+
Usage
17+
$ nanoid [options]
1218
13-
Options
14-
-s, --size Generated ID size
15-
-a, --alphabet Alphabet to use
16-
-h, --help Show this help
19+
Options
20+
-s, --size Generated ID size
21+
-a, --alphabet Alphabet to use
22+
-h, --help Show this help
1723
18-
Examples
19-
$ nano --s=15
20-
S9sBF77U6sDB8Yg
24+
Examples
25+
$ nano --s 15
26+
S9sBF77U6sDB8Yg
2127
22-
$ nano --size=10 --alphabet=abc
23-
bcabababca
24-
`)
28+
$ nano --size 10 --alphabet abc
29+
bcabababca`)
2530
process.exit()
2631
}
2732

28-
let alphabet = parsedArgs.alphabet || parsedArgs.a
29-
let size = parsedArgs.size || parsedArgs.s ? Number(parsedArgs.size || parsedArgs.s) : undefined
30-
31-
if (typeof size !== 'undefined' && (Number.isNaN(size) || size <= 0)) {
32-
process.stderr.write('Size must be positive integer\n')
33-
process.exit(1)
33+
let alphabet, size
34+
for (let i = 2; i < process.argv.length; i++) {
35+
let arg = process.argv[i]
36+
if (arg === '--size' || arg === '-s') {
37+
size = Number(process.argv[i + 1])
38+
i += 1
39+
if (Number.isNaN(size) || size <= 0) {
40+
error('Size must be positive integer')
41+
}
42+
} else if (arg === '--alphabet' || arg === '-a') {
43+
alphabet = process.argv[i + 1]
44+
i += 1
45+
} else {
46+
error('Unknown argument ' + arg)
47+
}
3448
}
3549

3650
if (alphabet) {
3751
if (typeof size === 'undefined') {
38-
process.stderr.write('You must also specify size option, when using custom alphabet\n')
39-
process.exit(1)
52+
error('You must also specify size option, when using custom alphabet')
4053
}
41-
process.stdout.write(customAlphabet(alphabet, size)())
54+
let customNanoid = customAlphabet(alphabet, size)
55+
print(customNanoid())
4256
} else {
43-
process.stdout.write(nanoid(size))
57+
print(nanoid(size))
4458
}
45-
46-
process.stdout.write('\n')

bin/nanoid.test.js

-74
This file was deleted.

bin/utils/index.js

-44
This file was deleted.

test/bin.test.js

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
let { is, match } = require('uvu/assert')
2+
let { promisify } = require('util')
3+
let { test } = require('uvu')
4+
let { join } = require('path')
5+
let child = require('child_process')
6+
7+
let exec = promisify(child.exec)
8+
9+
const BIN = join(__dirname, '..', 'bin', 'nanoid.cjs')
10+
11+
test('prints unique ID', async () => {
12+
let { stdout, stderr } = await exec('node ' + BIN)
13+
is(stderr, '')
14+
match(stdout, /^[\w-]{21}\n$/)
15+
})
16+
17+
test('uses size', async () => {
18+
let { stdout, stderr } = await exec('node ' + BIN + ' --size 10')
19+
is(stderr, '')
20+
match(stdout, /^[\w-]{10}\n$/)
21+
})
22+
23+
test('uses alphabet', async () => {
24+
let { stdout, stderr } = await exec(
25+
'node ' + BIN + ' --alphabet abc --size 15'
26+
)
27+
is(stderr, '')
28+
match(stdout, /^[abc]{15}\n$/)
29+
})
30+
31+
test('shows an error on unknown argument', async () => {
32+
try {
33+
await exec('node ' + BIN + ' -test')
34+
} catch (e) {
35+
match(e, /Unknown argument -test/)
36+
}
37+
})
38+
39+
test('shows an error if size is not a number', async () => {
40+
try {
41+
await exec('node ' + BIN + ' -s abc')
42+
} catch (e) {
43+
match(e, /Size must be positive integer/)
44+
}
45+
})
46+
47+
test('shows an error on no size with custom alphabet', async () => {
48+
try {
49+
await exec('node ' + BIN + ' --alphabet abc')
50+
} catch (e) {
51+
match(e, /You must also specify size option, when using custom alphabet/)
52+
}
53+
})
54+
55+
test('requires error if size is a negative number', async () => {
56+
try {
57+
await exec('node ' + BIN + ' --size "-1"')
58+
} catch (e) {
59+
match(e, /Size must be positive integer/)
60+
}
61+
})
62+
63+
test('displays help', async () => {
64+
let { stdout, stderr } = await exec('node ' + BIN + ' --help')
65+
is(stderr, '')
66+
match(stdout, /Usage/)
67+
match(stdout, /\$ nanoid \[options]/)
68+
})
69+
70+
test.run()

0 commit comments

Comments
 (0)