Skip to content

Commit 9e88421

Browse files
authored
Merge pull request #61 from jkroso/fix-regex
Safeguard RE
2 parents 2c0c072 + 2a340b5 commit 9e88421

File tree

4 files changed

+19
-19
lines changed

4 files changed

+19
-19
lines changed

index.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ declare module './locale/*.js' {
2222
declare const durationRE: RegExp;
2323

2424
declare namespace parse {
25-
const unit: Units;
25+
let unit: Units;
2626
}
2727

2828
/**

index.js

+10-11
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,36 @@
11
import en from './locale/en.js'
22

3-
const durationRE = /(-?(?:\d+\.?\d*|\d*\.?\d+)(?:e[-+]?\d+)?)\s*([\p{L}]*)/uig
3+
const durationRE = /((?:\d{1,16}(?:\.\d{1,16})?|\.\d{1,16})(?:[eE][-+]?\d{1,4})?)\s?([\p{L}]{0,14})/gu
44

55
parse.unit = en
66

77
/**
88
* convert `str` to ms
99
*
10-
* @param {String} str
11-
* @param {String} format
12-
* @return {Number}
10+
* @param {string} str
11+
* @param {string} format
12+
* @return {number}
1313
*/
1414
export default function parse(str = '', format = 'ms') {
1515
let result = null, prevUnits
1616

17-
(str + '')
18-
.replace(/(\d)[_ ](\d)/g, '$1$2') // ignore placeholders
19-
.replaceAll(parse.unit.group, '') // remove group separator
20-
.replaceAll(parse.unit.decimal, '.') // normalize decimal separator
17+
String(str)
18+
.replace(new RegExp(`(\\d)[${parse.unit.placeholder}${parse.unit.group}](\\d)`, 'g'), '$1$2') // clean up group separators / placeholders
19+
.replace(parse.unit.decimal, '.') // normalize decimal separator
2120
.replace(durationRE, (_, n, units) => {
2221
// if no units, find next smallest units or fall back to format value
2322
// eg. 1h30 -> 1h30m
2423
if (!units) {
2524
if (prevUnits) {
26-
for (var u in parse.unit) if (parse.unit[u] < prevUnits) { units = u; break }
25+
for (const u in parse.unit) if (parse.unit[u] < prevUnits) { units = u; break }
2726
}
2827
else units = format
2928
}
3029
else units = units.toLowerCase()
3130

32-
units = parse.unit[units] || parse.unit[units.replace(/s$/, '')]
31+
prevUnits = units = parse.unit[units] || parse.unit[units.replace(/s$/, '')]
3332

34-
if (units) result = (result || 0) + Math.abs(parseFloat(n, 10)) * units, prevUnits = units
33+
if (units) result = (result || 0) + n * units
3534
})
3635

3736
return result && ((result / (parse.unit[format] || 1)) * (str[0] === '-' ? -1 : 1))

locale/en.js

+1
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@ unit.nanosecond = unit.nanosec = unit.ns = 1e-6
1414

1515
unit.group = ','
1616
unit.decimal = '.'
17+
unit.placeholder = ' _'
1718

1819
export default unit

test.js

+7-7
Original file line numberDiff line numberDiff line change
@@ -167,15 +167,15 @@ t('locales', t => {
167167
t('locale separators', t => {
168168
parse.unit = en
169169
t.equal(parse('3.14 seconds'), 3140)
170-
t.equal(parse('"1,23,456.789 seconds'), 123456789)
171-
t.equal(parse('"1,23,456.789s'), 123456789)
172-
t.equal(parse('"30,000.65 seconds'), 30000650)
170+
t.equal(parse('1,23,456.789 seconds'), 123456789)
171+
t.equal(parse('1,23,456.789s'), 123456789)
172+
t.equal(parse('30,000.65 seconds'), 30000650)
173173

174174
parse.unit = de
175175
t.equal(parse('3,14 seconds'), 3140)
176-
t.equal(parse('"123.456,789 seconds'), 123456789)
177-
t.equal(parse('"30.000,65 seconds'), 30000650)
178-
t.equal(parse('"30 000,65 seconds'), 30000650)
179-
t.equal(parse('"30_000,65 seconds'), 30000650)
176+
t.equal(parse('123.456,789 seconds'), 123456789)
177+
t.equal(parse('30.000,65 seconds'), 30000650)
178+
t.equal(parse('30 000,65 seconds'), 30000650)
179+
t.equal(parse('30_000,65 seconds'), 30000650)
180180
t.end()
181181
})

0 commit comments

Comments
 (0)