diff --git a/packages/@pollyjs/adapter/src/utils/dehumanize-time.js b/packages/@pollyjs/adapter/src/utils/dehumanize-time.js new file mode 100644 index 00000000..0dee82f5 --- /dev/null +++ b/packages/@pollyjs/adapter/src/utils/dehumanize-time.js @@ -0,0 +1,47 @@ +const ALPHA_NUMERIC_DOT = /([0-9.]+)([a-zA-Z]+)/g; +const TIMES = { + ms: 1, + millisecond: 1, + milliseconds: 1, + s: 1000, + sec: 1000, + secs: 1000, + second: 1000, + seconds: 1000, + m: 60000, + min: 60000, + mins: 60000, + minute: 60000, + minutes: 60000, + h: 3600000, + hr: 3600000, + hrs: 3600000, + hour: 3600000, + hours: 3600000, + d: 86400000, + day: 86400000, + days: 86400000, + w: 604800000, + wk: 604800000, + wks: 604800000, + week: 604800000, + weeks: 604800000, + y: 31536000000, + yr: 31536000000, + yrs: 31536000000, + year: 31536000000, + years: 31536000000 +}; + +export default function dehumanizeTime(input) { + if (typeof input !== 'string') { + return NaN; + } + + const parts = input.replace(/ /g, '').match(ALPHA_NUMERIC_DOT); + const sets = parts.map(part => part.split(ALPHA_NUMERIC_DOT).filter(o => o)); + + return sets.reduce((accum, [number, unit]) => { + return accum + parseFloat(number) * TIMES[unit]; + }, 0); +} diff --git a/packages/@pollyjs/adapter/src/utils/human-time-to-ms.js b/packages/@pollyjs/adapter/src/utils/human-time-to-ms.js deleted file mode 100644 index 70e595a3..00000000 --- a/packages/@pollyjs/adapter/src/utils/human-time-to-ms.js +++ /dev/null @@ -1,41 +0,0 @@ -const labelsToOffset = [ - ['ms', 'millisecond', 'milliseconds', 1], - ['s', 'sec', 'secs', 'second', 'seconds', 1000], - ['m', 'min', 'mins', 'minute', 'minutes', 1000 * 60], - ['h', 'hr', 'hrs', 'hour', 'hours', 1000 * 60 * 60], - ['d', 'day', 'days', 1000 * 60 * 60 * 24], - ['w', 'wk', 'wks', 'week', 'weeks', 1000 * 60 * 60 * 24 * 7], - ['y', 'yr', 'yrs', 'year', 'years', 1000 * 60 * 60 * 24 * 365] -]; - -const times = labelsToOffset.reduce((accum, labels) => { - const labelOffset = labels.pop(); - - labels.forEach(label => (accum[label] = labelOffset)); - - return accum; -}, {}); - -export default function humanTimeToMilliseconds(humanTimeString) { - const fragments = (humanTimeString || '') - .replace(/[\W_]+/g, '') // remove non-alphanumeric characters - .split(/(\d+)/g); - - fragments.shift(); - - const parsedFragments = fragments.reduce((accum, cur, i) => { - if (i % 2 === 0) { - accum.push([parseFloat(cur, 10)]); - } else { - accum[accum.length - 1].push(cur); - } - - return accum; - }, []); - - return parsedFragments.reduce((accum, [num, label]) => { - accum += num * times[label]; - - return accum; - }, 0); -} diff --git a/packages/@pollyjs/adapter/src/utils/is-expired.js b/packages/@pollyjs/adapter/src/utils/is-expired.js index bf0853ce..6fe66929 100644 --- a/packages/@pollyjs/adapter/src/utils/is-expired.js +++ b/packages/@pollyjs/adapter/src/utils/is-expired.js @@ -1,10 +1,10 @@ -import calculateTime from './human-time-to-ms'; +import dehumanizeTime from './dehumanize-time'; export default function isExpired(recordedOn, expiresIn) { if (recordedOn && expiresIn) { return ( new Date() > - new Date(new Date(recordedOn).getTime() + calculateTime(expiresIn)) + new Date(new Date(recordedOn).getTime() + dehumanizeTime(expiresIn)) ); } diff --git a/packages/@pollyjs/adapter/tests/unit/utils/human-time-to-ms-test.js b/packages/@pollyjs/adapter/tests/unit/utils/dehumanize-time.js similarity index 55% rename from packages/@pollyjs/adapter/tests/unit/utils/human-time-to-ms-test.js rename to packages/@pollyjs/adapter/tests/unit/utils/dehumanize-time.js index 76ded47b..518d16cc 100644 --- a/packages/@pollyjs/adapter/tests/unit/utils/human-time-to-ms-test.js +++ b/packages/@pollyjs/adapter/tests/unit/utils/dehumanize-time.js @@ -1,15 +1,22 @@ -import humanTimeToMilliseconds from '../../../src/utils/human-time-to-ms'; +import dehumanizeTime from '../../../src/utils/dehumanize-time'; -describe('Unit | Utils | humanTimeToMilliseconds', function() { +describe('Unit | Utils | dehumanizeTime', function() { it('should exist', function() { - expect(humanTimeToMilliseconds).to.be.a('function'); + expect(dehumanizeTime).to.be.a('function'); }); it('should work', function() { + expect(dehumanizeTime(null)).to.be.NaN; + expect(dehumanizeTime(undefined)).to.be.NaN; + expect(dehumanizeTime(true)).to.be.NaN; + expect(dehumanizeTime(false)).to.be.NaN; + [ - [[undefined, null, ''], 0], [['1ms', '1millisecond', '1 milliseconds'], 1], + [['10ms', '10millisecond', '10 milliseconds'], 10], + [['100ms', '100millisecond', '100 milliseconds'], 100], [['1s', '1sec', '1secs', '1 second', '1 seconds'], 1000], + [['1.5s', '1.5sec', '1.5secs', '1.5 second', '1.5 seconds'], 1500], [['1m', '1min', '1mins', '1 minute', '1 minutes'], 1000 * 60], [['1h', '1hr', '1hrs', '1 hour', '1 hours'], 1000 * 60 * 60], [['1d', '1day', '1 days'], 1000 * 60 * 60 * 24], @@ -23,9 +30,7 @@ describe('Unit | Utils | humanTimeToMilliseconds', function() { 33005045006 ] ].forEach(([inputs, value]) => { - inputs.forEach(str => - expect(humanTimeToMilliseconds(str)).to.equal(value) - ); + inputs.forEach(str => expect(dehumanizeTime(str)).to.equal(value)); }); }); });