Skip to content

Commit 8a20c28

Browse files
committed
perf: faster memoOpts for range
1 parent ca185a0 commit 8a20c28

File tree

1 file changed

+32
-3
lines changed

1 file changed

+32
-3
lines changed

classes/range.js

+32-3
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class Range {
3131
this.set = range
3232
.split('||')
3333
// map the range to a 2d array of comparators
34-
.map(r => this.parseRange(r.trim()))
34+
.map(r => this.parseRange(r))
3535
// throw out any comparator lists that are empty
3636
// this generally means that it was not a valid range, which is allowed
3737
// in loose mode, but will still throw if the WHOLE range is invalid.
@@ -81,8 +81,8 @@ class Range {
8181

8282
// memoize range parsing for performance.
8383
// this is a very hot path, and fully deterministic.
84-
const memoOpts = Object.keys(this.options).join(',')
85-
const memoKey = `parseRange:${memoOpts}:${range}`
84+
const memoOpts = buildMemoKeyFromOptions(this.options)
85+
const memoKey = memoOpts + range
8686
const cached = cache.get(memoKey)
8787
if (cached) {
8888
return cached
@@ -190,6 +190,35 @@ class Range {
190190
return false
191191
}
192192
}
193+
194+
function buildMemoKeyFromOptions(options) {
195+
if (options.includePrerelease === true) {
196+
if (options.loose === true && options.rtl === true) {
197+
return '1';
198+
}
199+
200+
if (options.loose === true) {
201+
return '2';
202+
}
203+
204+
if (options.rtl === true) {
205+
return '3';
206+
}
207+
208+
return '4';
209+
} else if (options.loose === true) {
210+
if (options.rtl === true) {
211+
return '5';
212+
}
213+
214+
return '6';
215+
} else if (options.rtl === true) {
216+
return '7';
217+
} else {
218+
return '8';
219+
}
220+
}
221+
193222
module.exports = Range
194223

195224
const LRU = require('lru-cache')

0 commit comments

Comments
 (0)