summaryrefslogtreecommitdiff
path: root/node_modules/locutus/php/info/version_compare.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/locutus/php/info/version_compare.js')
-rw-r--r--node_modules/locutus/php/info/version_compare.js118
1 files changed, 118 insertions, 0 deletions
diff --git a/node_modules/locutus/php/info/version_compare.js b/node_modules/locutus/php/info/version_compare.js
new file mode 100644
index 0000000..7f600d8
--- /dev/null
+++ b/node_modules/locutus/php/info/version_compare.js
@@ -0,0 +1,118 @@
+'use strict';
+
+module.exports = function version_compare(v1, v2, operator) {
+ // eslint-disable-line camelcase
+ // discuss at: http://locutus.io/php/version_compare/
+ // original by: Philippe Jausions (http://pear.php.net/user/jausions)
+ // original by: Aidan Lister (http://aidanlister.com/)
+ // reimplemented by: Kankrelune (http://www.webfaktory.info/)
+ // improved by: Brett Zamir (http://brett-zamir.me)
+ // improved by: Scott Baker
+ // improved by: Theriault (https://github.com/Theriault)
+ // example 1: version_compare('8.2.5rc', '8.2.5a')
+ // returns 1: 1
+ // example 2: version_compare('8.2.50', '8.2.52', '<')
+ // returns 2: true
+ // example 3: version_compare('5.3.0-dev', '5.3.0')
+ // returns 3: -1
+ // example 4: version_compare('4.1.0.52','4.01.0.51')
+ // returns 4: 1
+
+ // Important: compare must be initialized at 0.
+ var i;
+ var x;
+ var compare = 0;
+
+ // vm maps textual PHP versions to negatives so they're less than 0.
+ // PHP currently defines these as CASE-SENSITIVE. It is important to
+ // leave these as negatives so that they can come before numerical versions
+ // and as if no letters were there to begin with.
+ // (1alpha is < 1 and < 1.1 but > 1dev1)
+ // If a non-numerical value can't be mapped to this table, it receives
+ // -7 as its value.
+ var vm = {
+ 'dev': -6,
+ 'alpha': -5,
+ 'a': -5,
+ 'beta': -4,
+ 'b': -4,
+ 'RC': -3,
+ 'rc': -3,
+ '#': -2,
+ 'p': 1,
+ 'pl': 1
+ };
+
+ // This function will be called to prepare each version argument.
+ // It replaces every _, -, and + with a dot.
+ // It surrounds any nonsequence of numbers/dots with dots.
+ // It replaces sequences of dots with a single dot.
+ // version_compare('4..0', '4.0') === 0
+ // Important: A string of 0 length needs to be converted into a value
+ // even less than an unexisting value in vm (-7), hence [-8].
+ // It's also important to not strip spaces because of this.
+ // version_compare('', ' ') === 1
+ var _prepVersion = function _prepVersion(v) {
+ v = ('' + v).replace(/[_\-+]/g, '.');
+ v = v.replace(/([^.\d]+)/g, '.$1.').replace(/\.{2,}/g, '.');
+ return !v.length ? [-8] : v.split('.');
+ };
+ // This converts a version component to a number.
+ // Empty component becomes 0.
+ // Non-numerical component becomes a negative number.
+ // Numerical component becomes itself as an integer.
+ var _numVersion = function _numVersion(v) {
+ return !v ? 0 : isNaN(v) ? vm[v] || -7 : parseInt(v, 10);
+ };
+
+ v1 = _prepVersion(v1);
+ v2 = _prepVersion(v2);
+ x = Math.max(v1.length, v2.length);
+ for (i = 0; i < x; i++) {
+ if (v1[i] === v2[i]) {
+ continue;
+ }
+ v1[i] = _numVersion(v1[i]);
+ v2[i] = _numVersion(v2[i]);
+ if (v1[i] < v2[i]) {
+ compare = -1;
+ break;
+ } else if (v1[i] > v2[i]) {
+ compare = 1;
+ break;
+ }
+ }
+ if (!operator) {
+ return compare;
+ }
+
+ // Important: operator is CASE-SENSITIVE.
+ // "No operator" seems to be treated as "<."
+ // Any other values seem to make the function return null.
+ switch (operator) {
+ case '>':
+ case 'gt':
+ return compare > 0;
+ case '>=':
+ case 'ge':
+ return compare >= 0;
+ case '<=':
+ case 'le':
+ return compare <= 0;
+ case '===':
+ case '=':
+ case 'eq':
+ return compare === 0;
+ case '<>':
+ case '!==':
+ case 'ne':
+ return compare !== 0;
+ case '':
+ case '<':
+ case 'lt':
+ return compare < 0;
+ default:
+ return null;
+ }
+};
+//# sourceMappingURL=version_compare.js.map \ No newline at end of file