summaryrefslogtreecommitdiffstats
path: root/addon-sdk/source/lib/mozilla-toolkit-versioning/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'addon-sdk/source/lib/mozilla-toolkit-versioning/index.js')
-rw-r--r--addon-sdk/source/lib/mozilla-toolkit-versioning/index.js112
1 files changed, 112 insertions, 0 deletions
diff --git a/addon-sdk/source/lib/mozilla-toolkit-versioning/index.js b/addon-sdk/source/lib/mozilla-toolkit-versioning/index.js
new file mode 100644
index 000000000..2f607c880
--- /dev/null
+++ b/addon-sdk/source/lib/mozilla-toolkit-versioning/index.js
@@ -0,0 +1,112 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var versionParse = require('./lib/utils').versionParse;
+
+var COMPARATORS = ['>=', '<=', '>', '<', '=', '~', '^'];
+
+exports.parse = function (input) {
+ input = input || '';
+ input = input.trim();
+ if (!input)
+ throw new Error('`parse` argument must be a populated string.');
+
+ // Handle the "*" case
+ if (input === "*") {
+ return { min: undefined, max: undefined };
+ }
+
+ var inputs = input.split(' ');
+ var min;
+ var max;
+
+ // 1.2.3 - 2.3.4
+ if (inputs.length === 3 && inputs[1] === '-') {
+ return { min: inputs[0], max: inputs[2] };
+ }
+
+ inputs.forEach(function (input) {
+ var parsed = parseExpression(input);
+ var version = parsed.version;
+ var comparator = parsed.comparator;
+
+ // 1.2.3
+ if (inputs.length === 1 && !comparator)
+ min = max = version;
+
+ // Parse min
+ if (~comparator.indexOf('>')) {
+ if (~comparator.indexOf('='))
+ min = version; // >=1.2.3
+ else
+ min = increment(version); // >1.2.3
+ }
+ else if (~comparator.indexOf('<')) {
+ if (~comparator.indexOf('='))
+ max = version; // <=1.2.3
+ else
+ max = decrement(version); // <1.2.3
+ }
+ });
+
+ return {
+ min: min,
+ max : max
+ };
+};
+
+function parseExpression (input) {
+ for (var i = 0; i < COMPARATORS.length; i++)
+ if (~input.indexOf(COMPARATORS[i]))
+ return {
+ comparator: COMPARATORS[i],
+ version: input.substr(COMPARATORS[i].length)
+ };
+ return { version: input, comparator: '' };
+}
+
+/**
+ * Takes a version string ('1.2.3') and returns a version string
+ * that'll parse as one less than the input string ('1.2.3.-1').
+ *
+ * @param {String} vString
+ * @return {String}
+ */
+function decrement (vString) {
+ return vString + (vString.charAt(vString.length - 1) === '.' ? '' : '.') + '-1';
+}
+exports.decrement = decrement;
+
+/**
+ * Takes a version string ('1.2.3') and returns a version string
+ * that'll parse as greater than the input string by the smallest margin
+ * possible ('1.2.3.1').
+ * listed as number-A, string-B, number-C, string-D in
+ * Mozilla's Toolkit Format.
+ * https://developer.mozilla.org/en-US/docs/Toolkit_version_format
+ *
+ * @param {String} vString
+ * @return {String}
+ */
+function increment (vString) {
+ var match = versionParse(vString);
+ var a = match[1];
+ var b = match[2];
+ var c = match[3];
+ var d = match[4];
+ var lastPos = vString.length - 1;
+ var lastChar = vString.charAt(lastPos);
+
+ if (!b) {
+ return vString + (lastChar === '.' ? '' : '.') + '1';
+ }
+ if (!c) {
+ return vString + '1';
+ }
+ if (!d) {
+ return vString.substr(0, lastPos) + (++lastChar);
+ }
+ return vString.substr(0, lastPos) + String.fromCharCode(lastChar.charCodeAt(0) + 1);
+}
+exports.increment = increment;