Skip to content

Commit 89ec2ab

Browse files
committed
chore: improve performance abd reduce unpacked package size
1 parent 1dc42f3 commit 89ec2ab

File tree

8 files changed

+43
-51
lines changed

8 files changed

+43
-51
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
## 2.1.1 (20225-07-12)
4+
5+
- chore: improve performance
6+
- chore: reduce unpacked package size
7+
38
## 2.1.0 (20225-07-11)
49

510
- feat: add support negated flags with prefix `--no-`, e.g. `--no-color` -> `{ color: false }`

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Supports all standard CLI flag formats and named positional arguments.
1313

1414
## Features
1515

16+
- Supports ESM, CommonJS, TypeScript
1617
- Short `-f` and long `--flag` flags
1718
- Grouped short boolean flags `-xyz`
1819
- Values via `--key=value` or `--key value`

bench/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ const mri = require('mri');
1919
console.timeEnd('mri');
2020

2121
console.time('flaget');
22-
const flaget = require('flaget2');
22+
const flaget = require('flaget');
2323
console.timeEnd('flaget');
2424

2525
console.log('\nBenchmark:');

bench/package-lock.json

Lines changed: 2 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bench/package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
{
2+
"scripts": {
3+
"start": "node index.js"
4+
},
25
"devDependencies": {
36
"benchmark": "2.1.4",
4-
"flaget2": "file:../dist",
5-
"flaget": "2.1.0",
7+
"flaget": "file:../dist",
68
"minimist": "1.2.8",
79
"mri": "1.2.0",
810
"nopt": "8.1.0",

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "flaget",
3-
"version": "2.1.0",
3+
"version": "2.1.1",
44
"description": "A lightweight CLI flag/argument parser for Node.js. Supports all standard flag formats and named positional arguments.",
55
"keywords": [
66
"cli",

package.npm.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "flaget",
3-
"version": "2.1.0",
3+
"version": "2.1.1",
44
"description": "Tiny CLI flag parser",
55
"keywords": [
66
"cli",

src/index.js

Lines changed: 28 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const cast = (val) => {
3030
};
3131

3232
/**
33-
* Assign a flag val to both original and camelCase keys.
33+
* Assign a flag value to both original and camelCase keys.
3434
* @param {{flags: Object<string, any>}} res The result object containing the `flags` property.
3535
* @param {string} key The original flag key.
3636
* @param {any} val The value to assign to the flag.
@@ -66,7 +66,7 @@ const getArray = (raw, i, val) => {
6666
}
6767

6868
// offset is difference between current index "j" and start index "i"
69-
return { values, offset: j - i };
69+
return { values, offset: j - i};
7070
};
7171

7272
/**
@@ -99,41 +99,36 @@ const flaget = (options = {}) => {
9999
* @returns {number} The updated index.
100100
*/
101101
const parseLong = (arg, i) => {
102-
// performance optimized:
103-
// 1) using indexOf + slice is ~10% faster than split('=')
104-
// 2) splitting first, then slicing is ~30% faster than slicing first, then splitting
105-
//let [rawKey, rawVal] = arg.split('='); // 10% slower, but 50 bytes smaller
106-
let j = arg.indexOf('=');
107-
let [rawKey, rawVal] = ~j ? [arg.slice(0, j), arg.slice(++j)] : [arg];
108-
109-
let isNo = rawKey.startsWith('--no-');
110-
let key = rawKey.slice(isNo ? 5 : 2);
111-
key = alias[key] || key;
112-
113-
// negated or boolean flag
114-
if (isNo || boolean.includes(key)) {
115-
setFlag(res, key, !isNo);
116-
return i;
117-
}
102+
// performance optimized:
103+
// 1) using indexOf + slice is ~10% faster than split('=')
104+
// 2) splitting first, then slicing is ~30% faster than slicing first, then splitting
105+
//let [rawKey, rawVal] = arg.split('='); // 10% slower, but 50 bytes smaller
106+
let j = arg.indexOf('=');
107+
let isNo = arg.startsWith('--no-');
108+
let key = arg.slice(isNo ? 5 : 2, ~j ? j : void 0);
109+
let val = ~j ? arg.slice(++j) : null;
110+
111+
key = alias[key] || key;
112+
113+
// negated or boolean flag
114+
if (isNo || boolean.includes(key)) {
115+
setFlag(res, key, !isNo);
116+
return i;
117+
}
118118

119-
// flag with muli-value
120-
if (array.includes(key)) {
121-
let { values, offset } = getArray(raw, i, rawVal);
122-
setFlag(res, key, (res.flags[key] || []).concat(values));
123-
return i + offset;
124-
}
119+
// flag with muli-value
120+
if (array.includes(key)) {
121+
let { values, offset } = getArray(raw, i, val);
122+
setFlag(res, key, (res.flags[key] || []).concat(values));
123+
return i + offset;
124+
}
125125

126-
let val = true;
127-
if (rawVal != null) {
128-
val = cast(rawVal);
129-
} else if (isArg(raw, i)) {
130-
val = cast(raw[++i]);
131-
}
126+
val = val != null ? cast(val) : isArg(raw, i) ? cast(raw[++i]) : true;
132127

133-
setFlag(res, key, val);
128+
setFlag(res, key, val);
134129

135-
return i;
136-
};
130+
return i;
131+
};
137132

138133
/**
139134
* Parse short CLI flags (-a, -abc, -f value).

0 commit comments

Comments
 (0)