jquery-tablesorter 1.10.2 → 1.10.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (28) hide show
  1. checksums.yaml +4 -4
  2. data/README.markdown +6 -3
  3. data/Rakefile +30 -16
  4. data/lib/jquery-tablesorter/version.rb +1 -1
  5. data/vendor/assets/javascripts/jquery-tablesorter/extras/jquery.quicksearch.js +191 -0
  6. data/vendor/assets/javascripts/jquery-tablesorter/extras/semver-mod.js +1026 -0
  7. data/vendor/assets/javascripts/jquery-tablesorter/extras/semver.js +1011 -0
  8. data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.js +2 -2
  9. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-iso8601.js +34 -0
  10. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-month.js +33 -0
  11. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-two-digit-year.js +74 -0
  12. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-weekday.js +33 -0
  13. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date.js +36 -0
  14. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-feet-inch-fraction.js +63 -0
  15. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-file-type.js +73 -0
  16. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-ignore-articles.js +47 -0
  17. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-input-select.js +86 -0
  18. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-ipv6.js +76 -0
  19. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-metric.js +77 -0
  20. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-build-table.js +441 -0
  21. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-columnSelector.js +291 -0
  22. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-cssStickyHeaders.js +67 -0
  23. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-editable.js +89 -0
  24. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-grouping.js +183 -0
  25. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-pager.js +834 -0
  26. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-repeatheaders.js +50 -0
  27. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-scroller.js +241 -0
  28. metadata +24 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3396def36d6cc6f842581564ce732beb60b74b0b
4
- data.tar.gz: 358c05de2c83d9c84884ed4d6fc94da9711effc8
3
+ metadata.gz: 3456e75e9e3f482d435a7b087e423988098e8a42
4
+ data.tar.gz: cc5c3cf899555624f971b133145d3bbe46313706
5
5
  SHA512:
6
- metadata.gz: 0d9ad4211f5b1c5b8b354fdb9c032ad84434295188faf3f80003cc7fae6e4bdd4dda41aac038d068c3a8c8c04e816338b5f1d32d032208a03d170619e1f65687
7
- data.tar.gz: 6fa02f3d32fca3186c8122b5dbed1c2e4ff0a6e3e4340d6d19a913acac08f8b1bede9618f788706f13417d8c97613d62c20a12886f03319ca3b14a0f59ae3541
6
+ metadata.gz: 34d92b0bc41faedffd68c7a9e01cb76ff96d325e65286db9d722eb98b7b9a4789c89be0d5df54796d5e0811b3bff97f4bda09ce841cfcd47caa6c895f6d9ef07
7
+ data.tar.gz: 93ae0f842b189cc55cd2240f1512ac508b6a53dddc6c6435ea333e16d6fb881a2a3b6c1f006943234fd2e607231e476564e4a41715a90e2f5385e09231ed7793
@@ -4,7 +4,7 @@
4
4
 
5
5
  Simple integration of jquery-tablesorter into the asset pipeline.
6
6
 
7
- Current tablesorter version: 2.15.4 (2/22/2014), [documentation]
7
+ Current tablesorter version: 2.15.5 (2/23/2014), [documentation]
8
8
 
9
9
  Any issue associate with the js/css files, please report to [Mottie's fork].
10
10
 
@@ -24,7 +24,8 @@ Or install it yourself as:
24
24
 
25
25
  ## Requirements
26
26
 
27
- Rails 3.1 and higher
27
+ Rails 3.1 and higher (tested up to 4.1)
28
+ Tested with ruby 1.9.3 - 2.1.0
28
29
 
29
30
  ## Usage
30
31
 
@@ -36,7 +37,7 @@ In your `application.js`
36
37
  //= require jquery-tablesorter
37
38
  ```
38
39
 
39
- This will require all jquery-tablesorter files (exclude addons).
40
+ This will require all jquery-tablesorter files (exclude addons, widgets, ...).
40
41
 
41
42
  Or you can include single file with:
42
43
 
@@ -45,6 +46,8 @@ Or you can include single file with:
45
46
  //= require jquery-tablesorter/jquery.tablesorter
46
47
  //= require jquery-tablesorter/jquery.tablesorter.widgets
47
48
  //= require jquery-tablesorter/addons/pager/jquery.tablesorter.pager
49
+ //= require jquery-tablesorter/widgets/widget-repeatheaders
50
+ //= require jquery-tablesorter/parsers/parser-metric
48
51
  ```
49
52
 
50
53
  ### Stylesheet files
data/Rakefile CHANGED
@@ -4,58 +4,72 @@ require 'bundler'
4
4
  Bundler::GemHelper.install_tasks
5
5
 
6
6
  namespace :jquery_tablesorter do
7
- desc 'update tablesorter'
7
+
8
+ desc 'Update tablesorter files'
8
9
  task :update do
10
+
9
11
  # javascripts
10
12
  #
11
- javascript_dir = 'vendor/assets/javascripts/jquery-tablesorter'
13
+ javascript_dir = File.join('vendor', 'assets', 'javascripts', 'jquery-tablesorter')
12
14
  FileUtils.mkdir_p(javascript_dir)
13
- Dir.glob('tablesorter/js/*.js').reject{ |file| file =~ /.min.js\Z/}.each do |file|
15
+ Dir.glob(File.join('tablesorter', 'js', '*.js')).reject{|file| file =~ /.min.js\Z/}.each do |file|
14
16
  FileUtils.cp file, javascript_dir, :verbose => true
15
17
  end
16
18
 
17
19
  # stylesheets
18
20
  #
19
- stylesheet_dir = 'vendor/assets/stylesheets/jquery-tablesorter'
21
+ stylesheet_dir = File.join('vendor', 'assets', 'stylesheets', 'jquery-tablesorter')
20
22
  FileUtils.mkdir_p(stylesheet_dir)
21
- Dir.glob('tablesorter/css/*.css').each do |file|
23
+ Dir.glob(File.join('tablesorter', 'css', '*.css')).each do |file|
22
24
  FileUtils.cp file, stylesheet_dir, :verbose => true
23
25
  end
24
26
 
25
27
  # images
26
28
  #
27
- images_dir = 'vendor/assets/images/jquery-tablesorter'
29
+ images_dir = File.join('vendor', 'assets', 'images', 'jquery-tablesorter')
28
30
  FileUtils.mkdir_p(images_dir)
29
- Dir.glob('tablesorter/css/images/*').each do |file|
31
+ Dir.glob(File.join('tablesorter', 'css', 'images', '*')).each do |file|
30
32
  FileUtils.cp file, images_dir, :verbose => true
31
33
  end
32
34
 
33
35
  # addons
34
36
  #
35
37
  ## pager
36
- pager_stylesheet_dir = stylesheet_dir + '/addons/pager'
38
+ pager_stylesheet_dir = File.join(stylesheet_dir, 'addons', 'pager')
37
39
  FileUtils.mkdir_p(pager_stylesheet_dir)
38
- FileUtils.cp 'tablesorter/addons/pager/jquery.tablesorter.pager.css',
40
+ FileUtils.cp File.join('tablesorter', 'addons', 'pager', 'jquery.tablesorter.pager.css'),
39
41
  pager_stylesheet_dir,
40
42
  :verbose => true
41
43
 
42
- pager_javascript_dir = javascript_dir + '/addons/pager'
44
+ pager_javascript_dir = File.join(javascript_dir, 'addons', 'pager')
43
45
  FileUtils.mkdir_p(pager_javascript_dir)
44
- FileUtils.cp 'tablesorter/addons/pager/jquery.tablesorter.pager.js',
46
+ FileUtils.cp File.join('tablesorter', 'addons', 'pager', 'jquery.tablesorter.pager.js'),
45
47
  pager_javascript_dir,
46
48
  :verbose => true
47
49
 
48
- pager_images_dir = images_dir + '/addons/pager'
50
+ pager_images_dir = File.join(images_dir, 'addons', 'pager')
49
51
  FileUtils.mkdir_p(pager_images_dir)
50
- FileUtils.cp_r 'tablesorter/addons/pager/icons', pager_images_dir,
52
+ FileUtils.cp_r File.join('tablesorter', 'addons', 'pager', 'icons'), pager_images_dir,
51
53
  :verbose => true
54
+
55
+
56
+ # parsers and widgets
57
+ #
58
+ %w(parsers widgets extras).each do |folder|
59
+ folder_javascript_dir = File.join(javascript_dir, folder)
60
+ FileUtils.mkdir_p(folder_javascript_dir)
61
+ Dir.glob(File.join('tablesorter', 'js', folder, '*.js')).reject{|file| file =~ /.min.js\Z/}.each do |file|
62
+ FileUtils.cp file, folder_javascript_dir, :verbose => true
63
+ end
64
+ end
65
+
52
66
  end
53
67
 
54
68
  desc 'Sanitize image paths'
55
69
  task :sanitize_image_paths do
56
- Dir.glob('vendor/assets/stylesheets/jquery-tablesorter/*.css').each do |file_path|
57
- content = File.read(file_path).gsub(/url\(images\//, "url(/assets/jquery-tablesorter/")
58
- File.open(file_path, "w") {|file| file.write content}
70
+ Dir.glob(File.join('vendor', 'assets', 'stylesheets', 'jquery-tablesorter', '*.css')).each do |file_path|
71
+ content = File.read(file_path).gsub(/url\(images\//, 'url(/assets/jquery-tablesorter/')
72
+ File.open(file_path, 'w') {|file| file.write content}
59
73
  end
60
74
  end
61
75
  end
@@ -1,3 +1,3 @@
1
1
  module JqueryTablesorter
2
- VERSION = "1.10.2"
2
+ VERSION = "1.10.3"
3
3
  end
@@ -0,0 +1,191 @@
1
+ /* jQuery Quicksearch plugin
2
+ by riklomas https://github.com/riklomas/quicksearch
3
+ Modified to include childRows (for tablesorter)
4
+
5
+ See http://stackoverflow.com/q/20342203/145346 for
6
+ more details
7
+ */
8
+ (function($, window, document, undefined) {
9
+ $.fn.quicksearch = function (target, opt) {
10
+
11
+ var timeout, cache, rowcache, jq_results, val = '', e = this, options = $.extend({
12
+ delay: 100,
13
+ selector: null,
14
+ stripeRows: null,
15
+ loader: null,
16
+ noResults: '',
17
+ childRow: 'tablesorter-childRow', // include child row with search results
18
+ matchedResultsCount: 0,
19
+ bind: 'keyup',
20
+ onBefore: function () {
21
+ return;
22
+ },
23
+ onAfter: function () {
24
+ return;
25
+ },
26
+ show: function () {
27
+ this.style.display = "";
28
+ },
29
+ hide: function () {
30
+ this.style.display = "none";
31
+ },
32
+ prepareQuery: function (val) {
33
+ return val.toLowerCase().split(' ');
34
+ },
35
+ testQuery: function (query, txt, _row) {
36
+ for (var i = 0; i < query.length; i += 1) {
37
+ if (txt.indexOf(query[i]) === -1) {
38
+ return false;
39
+ }
40
+ }
41
+ return true;
42
+ }
43
+ }, opt);
44
+
45
+ this.go = function () {
46
+
47
+ var i = 0,
48
+ numMatchedRows = 0,
49
+ noresults = true,
50
+ query = options.prepareQuery(val),
51
+ val_empty = (val.replace(' ', '').length === 0);
52
+
53
+ for (var i = 0, len = rowcache.length; i < len; i++) {
54
+ if (val_empty || options.testQuery(query, cache[i], rowcache[i]) ||
55
+ ($(rowcache[i]).hasClass(options.childRow) && $(rowcache[i > 1 ? i - 1 : 0]).is(':visible'))) {
56
+ options.show.apply(rowcache[i]);
57
+ noresults = false;
58
+ numMatchedRows++;
59
+ } else {
60
+ options.hide.apply(rowcache[i]);
61
+ }
62
+ }
63
+
64
+ if (noresults) {
65
+ this.results(false);
66
+ } else {
67
+ this.results(true);
68
+ this.stripe();
69
+ }
70
+
71
+ this.matchedResultsCount = numMatchedRows;
72
+ this.loader(false);
73
+ options.onAfter();
74
+
75
+ return this;
76
+ };
77
+
78
+ /*
79
+ * External API so that users can perform search programatically.
80
+ * */
81
+ this.search = function (submittedVal) {
82
+ val = submittedVal;
83
+ e.trigger();
84
+ };
85
+
86
+ /*
87
+ * External API to get the number of matched results as seen in
88
+ * https://github.com/ruiz107/quicksearch/commit/f78dc440b42d95ce9caed1d087174dd4359982d6
89
+ * */
90
+ this.currentMatchedResults = function() {
91
+ return this.matchedResultsCount;
92
+ };
93
+
94
+ this.stripe = function () {
95
+
96
+ if (typeof options.stripeRows === "object" && options.stripeRows !== null)
97
+ {
98
+ var joined = options.stripeRows.join(' ');
99
+ var stripeRows_length = options.stripeRows.length;
100
+
101
+ jq_results.not(':hidden').each(function (i) {
102
+ $(this).removeClass(joined).addClass(options.stripeRows[i % stripeRows_length]);
103
+ });
104
+ }
105
+
106
+ return this;
107
+ };
108
+
109
+ this.strip_html = function (input) {
110
+ var output = input.replace(new RegExp('<[^<]+\>', 'g'), "");
111
+ output = $.trim(output.toLowerCase());
112
+ return output;
113
+ };
114
+
115
+ this.results = function (bool) {
116
+ if (typeof options.noResults === "string" && options.noResults !== "") {
117
+ if (bool) {
118
+ $(options.noResults).hide();
119
+ } else {
120
+ $(options.noResults).show();
121
+ }
122
+ }
123
+ return this;
124
+ };
125
+
126
+ this.loader = function (bool) {
127
+ if (typeof options.loader === "string" && options.loader !== "") {
128
+ (bool) ? $(options.loader).show() : $(options.loader).hide();
129
+ }
130
+ return this;
131
+ };
132
+
133
+ this.cache = function () {
134
+
135
+ jq_results = $(target);
136
+
137
+ if (typeof options.noResults === "string" && options.noResults !== "") {
138
+ jq_results = jq_results.not(options.noResults);
139
+ }
140
+
141
+ var t = (typeof options.selector === "string") ?
142
+ jq_results.find(options.selector) : $(target).not(options.noResults);
143
+ cache = t.map(function () {
144
+ return e.strip_html(this.innerHTML);
145
+ });
146
+
147
+ rowcache = jq_results.map(function () {
148
+ return this;
149
+ });
150
+
151
+ /*
152
+ * Modified fix for sync-ing "val".
153
+ * Original fix https://github.com/michaellwest/quicksearch/commit/4ace4008d079298a01f97f885ba8fa956a9703d1
154
+ * */
155
+ val = val || this.val() || "";
156
+
157
+ return this.go();
158
+ };
159
+
160
+ this.trigger = function () {
161
+ this.loader(true);
162
+ options.onBefore();
163
+
164
+ window.clearTimeout(timeout);
165
+ timeout = window.setTimeout(function () {
166
+ e.go();
167
+ }, options.delay);
168
+
169
+ return this;
170
+ };
171
+
172
+ this.cache();
173
+ this.results(true);
174
+ this.stripe();
175
+ this.loader(false);
176
+
177
+ return this.each(function () {
178
+
179
+ /*
180
+ * Changed from .bind to .on.
181
+ * */
182
+ $(this).on(options.bind, function () {
183
+
184
+ val = $(this).val();
185
+ e.trigger();
186
+ });
187
+ });
188
+
189
+ };
190
+
191
+ }(jQuery, this, document));
@@ -0,0 +1,1026 @@
1
+ /**
2
+ Modified semver.js for node.js by R.Garrison (@Mottie)
3
+ Original by @isaacs: https://github.com/isaacs/node-semver
4
+ ( all modifications have been labeled )
5
+ */
6
+ // ***** MODIFIED LINE BELOW *****
7
+ (function(){
8
+ // ***** MODIFIED LINE BELOW *****
9
+ var module = { exports : {} };
10
+
11
+ // export the class if we are in a Node-like system.
12
+ // ***** MODIFIED LINE BELOW *****
13
+ // if (typeof module === 'object' && module.exports === exports)
14
+ // ***** MODIFIED LINE BELOW *****
15
+ var exports = module.exports = SemVer;
16
+
17
+ // The debug function is excluded entirely from the minified version.
18
+ /* nomin */ var debug;
19
+ /* nomin */ if (typeof process === 'object' &&
20
+ /* nomin */ process.env &&
21
+ /* nomin */ process.env.NODE_DEBUG &&
22
+ /* nomin */ /\bsemver\b/i.test(process.env.NODE_DEBUG))
23
+ /* nomin */ debug = function() {
24
+ /* nomin */ var args = Array.prototype.slice.call(arguments, 0);
25
+ /* nomin */ args.unshift('SEMVER');
26
+ /* nomin */ console.log.apply(console, args);
27
+ /* nomin */ };
28
+ /* nomin */ else
29
+ /* nomin */ debug = function() {};
30
+
31
+ // Note: this is the semver.org version of the spec that it implements
32
+ // Not necessarily the package version of this code.
33
+ exports.SEMVER_SPEC_VERSION = '2.0.0';
34
+
35
+ // The actual regexps go on exports.re
36
+ var re = exports.re = [];
37
+ var src = exports.src = [];
38
+ var R = 0;
39
+
40
+ // The following Regular Expressions can be used for tokenizing,
41
+ // validating, and parsing SemVer version strings.
42
+
43
+ // ## Numeric Identifier
44
+ // A single `0`, or a non-zero digit followed by zero or more digits.
45
+
46
+ var NUMERICIDENTIFIER = R++;
47
+ src[NUMERICIDENTIFIER] = '0|[1-9]\\d*';
48
+ var NUMERICIDENTIFIERLOOSE = R++;
49
+ src[NUMERICIDENTIFIERLOOSE] = '[0-9]+';
50
+
51
+
52
+ // ## Non-numeric Identifier
53
+ // Zero or more digits, followed by a letter or hyphen, and then zero or
54
+ // more letters, digits, or hyphens.
55
+
56
+ var NONNUMERICIDENTIFIER = R++;
57
+ src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*';
58
+
59
+
60
+ // ## Main Version
61
+ // Three dot-separated numeric identifiers.
62
+
63
+ var MAINVERSION = R++;
64
+ src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' +
65
+ '(' + src[NUMERICIDENTIFIER] + ')\\.' +
66
+ '(' + src[NUMERICIDENTIFIER] + ')';
67
+
68
+ var MAINVERSIONLOOSE = R++;
69
+ src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
70
+ '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
71
+ '(' + src[NUMERICIDENTIFIERLOOSE] + ')';
72
+
73
+ // ## Pre-release Version Identifier
74
+ // A numeric identifier, or a non-numeric identifier.
75
+
76
+ var PRERELEASEIDENTIFIER = R++;
77
+ src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] +
78
+ '|' + src[NONNUMERICIDENTIFIER] + ')';
79
+
80
+ var PRERELEASEIDENTIFIERLOOSE = R++;
81
+ src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] +
82
+ '|' + src[NONNUMERICIDENTIFIER] + ')';
83
+
84
+
85
+ // ## Pre-release Version
86
+ // Hyphen, followed by one or more dot-separated pre-release version
87
+ // identifiers.
88
+
89
+ var PRERELEASE = R++;
90
+ src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] +
91
+ '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))';
92
+
93
+ var PRERELEASELOOSE = R++;
94
+ src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] +
95
+ '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))';
96
+
97
+ // ## Build Metadata Identifier
98
+ // Any combination of digits, letters, or hyphens.
99
+
100
+ var BUILDIDENTIFIER = R++;
101
+ src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+';
102
+
103
+ // ## Build Metadata
104
+ // Plus sign, followed by one or more period-separated build metadata
105
+ // identifiers.
106
+
107
+ var BUILD = R++;
108
+ src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] +
109
+ '(?:\\.' + src[BUILDIDENTIFIER] + ')*))';
110
+
111
+
112
+ // ## Full Version String
113
+ // A main version, followed optionally by a pre-release version and
114
+ // build metadata.
115
+
116
+ // Note that the only major, minor, patch, and pre-release sections of
117
+ // the version string are capturing groups. The build metadata is not a
118
+ // capturing group, because it should not ever be used in version
119
+ // comparison.
120
+
121
+ var FULL = R++;
122
+ var FULLPLAIN = 'v?' + src[MAINVERSION] +
123
+ src[PRERELEASE] + '?' +
124
+ src[BUILD] + '?';
125
+
126
+ src[FULL] = '^' + FULLPLAIN + '$';
127
+
128
+ // like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
129
+ // also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
130
+ // common in the npm registry.
131
+ var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] +
132
+ src[PRERELEASELOOSE] + '?' +
133
+ src[BUILD] + '?';
134
+
135
+ var LOOSE = R++;
136
+ src[LOOSE] = '^' + LOOSEPLAIN + '$';
137
+
138
+ var GTLT = R++;
139
+ src[GTLT] = '((?:<|>)?=?)';
140
+
141
+ // Something like "2.*" or "1.2.x".
142
+ // Note that "x.x" is a valid xRange identifer, meaning "any version"
143
+ // Only the first item is strictly required.
144
+ var XRANGEIDENTIFIERLOOSE = R++;
145
+ src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*';
146
+ var XRANGEIDENTIFIER = R++;
147
+ src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*';
148
+
149
+ var XRANGEPLAIN = R++;
150
+ src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' +
151
+ '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
152
+ '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
153
+ '(?:(' + src[PRERELEASE] + ')' +
154
+ ')?)?)?';
155
+
156
+ var XRANGEPLAINLOOSE = R++;
157
+ src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
158
+ '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
159
+ '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
160
+ '(?:(' + src[PRERELEASELOOSE] + ')' +
161
+ ')?)?)?';
162
+
163
+ // >=2.x, for example, means >=2.0.0-0
164
+ // <1.x would be the same as "<1.0.0-0", though.
165
+ var XRANGE = R++;
166
+ src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$';
167
+ var XRANGELOOSE = R++;
168
+ src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$';
169
+
170
+ // Tilde ranges.
171
+ // Meaning is "reasonably at or greater than"
172
+ var LONETILDE = R++;
173
+ src[LONETILDE] = '(?:~>?)';
174
+
175
+ var TILDETRIM = R++;
176
+ src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+';
177
+ re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g');
178
+ var tildeTrimReplace = '$1~';
179
+
180
+ var TILDE = R++;
181
+ src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$';
182
+ var TILDELOOSE = R++;
183
+ src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$';
184
+
185
+ // Caret ranges.
186
+ // Meaning is "at least and backwards compatible with"
187
+ var LONECARET = R++;
188
+ src[LONECARET] = '(?:\\^)';
189
+
190
+ var CARETTRIM = R++;
191
+ src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+';
192
+ re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g');
193
+ var caretTrimReplace = '$1^';
194
+
195
+ var CARET = R++;
196
+ src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$';
197
+ var CARETLOOSE = R++;
198
+ src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$';
199
+
200
+ // A simple gt/lt/eq thing, or just "" to indicate "any version"
201
+ var COMPARATORLOOSE = R++;
202
+ src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$';
203
+ var COMPARATOR = R++;
204
+ src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$';
205
+
206
+
207
+ // An expression to strip any whitespace between the gtlt and the thing
208
+ // it modifies, so that `> 1.2.3` ==> `>1.2.3`
209
+ var COMPARATORTRIM = R++;
210
+ src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] +
211
+ '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')';
212
+
213
+ // this one has to use the /g flag
214
+ re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g');
215
+ var comparatorTrimReplace = '$1$2$3';
216
+
217
+
218
+ // Something like `1.2.3 - 1.2.4`
219
+ // Note that these all use the loose form, because they'll be
220
+ // checked against either the strict or loose comparator form
221
+ // later.
222
+ var HYPHENRANGE = R++;
223
+ src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' +
224
+ '\\s+-\\s+' +
225
+ '(' + src[XRANGEPLAIN] + ')' +
226
+ '\\s*$';
227
+
228
+ var HYPHENRANGELOOSE = R++;
229
+ src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' +
230
+ '\\s+-\\s+' +
231
+ '(' + src[XRANGEPLAINLOOSE] + ')' +
232
+ '\\s*$';
233
+
234
+ // Star ranges basically just allow anything at all.
235
+ var STAR = R++;
236
+ src[STAR] = '(<|>)?=?\\s*\\*';
237
+
238
+ // Compile to actual regexp objects.
239
+ // All are flag-free, unless they were created above with a flag.
240
+ for (var i = 0; i < R; i++) {
241
+ debug(i, src[i]);
242
+ if (!re[i])
243
+ re[i] = new RegExp(src[i]);
244
+ }
245
+
246
+ exports.parse = parse;
247
+ function parse(version, loose) {
248
+ var r = loose ? re[LOOSE] : re[FULL];
249
+ return (r.test(version)) ? new SemVer(version, loose) : null;
250
+ }
251
+
252
+ exports.valid = valid;
253
+ function valid(version, loose) {
254
+ var v = parse(version, loose);
255
+ return v ? v.version : null;
256
+ }
257
+
258
+
259
+ exports.clean = clean;
260
+ function clean(version, loose) {
261
+ var s = parse(version, loose);
262
+ return s ? s.version : null;
263
+ }
264
+
265
+ // ***** MODIFIED LINE BELOW *****
266
+ window.semver = exports.SemVer = SemVer;
267
+
268
+ function SemVer(version, loose) {
269
+ if (version instanceof SemVer) {
270
+ if (version.loose === loose)
271
+ return version;
272
+ else
273
+ version = version.version;
274
+ }
275
+
276
+ if (!(this instanceof SemVer))
277
+ return new SemVer(version, loose);
278
+
279
+ debug('SemVer', version, loose);
280
+ this.loose = loose;
281
+ var m = version.trim().match(loose ? re[LOOSE] : re[FULL]);
282
+
283
+ if (!m)
284
+ throw new TypeError('Invalid Version: ' + version);
285
+
286
+ this.raw = version;
287
+
288
+ // these are actually numbers
289
+ this.major = +m[1];
290
+ this.minor = +m[2];
291
+ this.patch = +m[3];
292
+
293
+ // numberify any prerelease numeric ids
294
+ if (!m[4])
295
+ this.prerelease = [];
296
+ else
297
+ this.prerelease = m[4].split('.').map(function(id) {
298
+ return (/^[0-9]+$/.test(id)) ? +id : id;
299
+ });
300
+
301
+ this.build = m[5] ? m[5].split('.') : [];
302
+ this.format();
303
+ }
304
+
305
+ SemVer.prototype.format = function() {
306
+ this.version = this.major + '.' + this.minor + '.' + this.patch;
307
+ if (this.prerelease.length)
308
+ this.version += '-' + this.prerelease.join('.');
309
+ return this.version;
310
+ };
311
+
312
+ SemVer.prototype.inspect = function() {
313
+ return '<SemVer "' + this + '">';
314
+ };
315
+
316
+ SemVer.prototype.toString = function() {
317
+ return this.version;
318
+ };
319
+
320
+ SemVer.prototype.compare = function(other) {
321
+ debug('SemVer.compare', this.version, this.loose, other);
322
+ if (!(other instanceof SemVer))
323
+ other = new SemVer(other, this.loose);
324
+
325
+ return this.compareMain(other) || this.comparePre(other);
326
+ };
327
+
328
+ SemVer.prototype.compareMain = function(other) {
329
+ if (!(other instanceof SemVer))
330
+ other = new SemVer(other, this.loose);
331
+
332
+ return compareIdentifiers(this.major, other.major) ||
333
+ compareIdentifiers(this.minor, other.minor) ||
334
+ compareIdentifiers(this.patch, other.patch);
335
+ };
336
+
337
+ SemVer.prototype.comparePre = function(other) {
338
+ if (!(other instanceof SemVer))
339
+ other = new SemVer(other, this.loose);
340
+
341
+ // NOT having a prerelease is > having one
342
+ if (this.prerelease.length && !other.prerelease.length)
343
+ return -1;
344
+ else if (!this.prerelease.length && other.prerelease.length)
345
+ return 1;
346
+ else if (!this.prerelease.lenth && !other.prerelease.length)
347
+ return 0;
348
+
349
+ var i = 0;
350
+ do {
351
+ var a = this.prerelease[i];
352
+ var b = other.prerelease[i];
353
+ debug('prerelease compare', i, a, b);
354
+ if (a === undefined && b === undefined)
355
+ return 0;
356
+ else if (b === undefined)
357
+ return 1;
358
+ else if (a === undefined)
359
+ return -1;
360
+ else if (a === b)
361
+ continue;
362
+ else
363
+ return compareIdentifiers(a, b);
364
+ } while (++i);
365
+ };
366
+
367
+ SemVer.prototype.inc = function(release) {
368
+ switch (release) {
369
+ case 'major':
370
+ this.major++;
371
+ this.minor = -1;
372
+ case 'minor':
373
+ this.minor++;
374
+ this.patch = -1;
375
+ case 'patch':
376
+ this.patch++;
377
+ this.prerelease = [];
378
+ break;
379
+ case 'prerelease':
380
+ if (this.prerelease.length === 0)
381
+ this.prerelease = [0];
382
+ else {
383
+ var i = this.prerelease.length;
384
+ while (--i >= 0) {
385
+ if (typeof this.prerelease[i] === 'number') {
386
+ this.prerelease[i]++;
387
+ i = -2;
388
+ }
389
+ }
390
+ if (i === -1) // didn't increment anything
391
+ this.prerelease.push(0);
392
+ }
393
+ break;
394
+
395
+ default:
396
+ throw new Error('invalid increment argument: ' + release);
397
+ }
398
+ this.format();
399
+ return this;
400
+ };
401
+
402
+ exports.inc = inc;
403
+ function inc(version, release, loose) {
404
+ try {
405
+ return new SemVer(version, loose).inc(release).version;
406
+ } catch (er) {
407
+ return null;
408
+ }
409
+ }
410
+
411
+ exports.compareIdentifiers = compareIdentifiers;
412
+
413
+ var numeric = /^[0-9]+$/;
414
+ function compareIdentifiers(a, b) {
415
+ var anum = numeric.test(a);
416
+ var bnum = numeric.test(b);
417
+
418
+ if (anum && bnum) {
419
+ a = +a;
420
+ b = +b;
421
+ }
422
+
423
+ return (anum && !bnum) ? -1 :
424
+ (bnum && !anum) ? 1 :
425
+ a < b ? -1 :
426
+ a > b ? 1 :
427
+ 0;
428
+ }
429
+
430
+ exports.rcompareIdentifiers = rcompareIdentifiers;
431
+ function rcompareIdentifiers(a, b) {
432
+ return compareIdentifiers(b, a);
433
+ }
434
+
435
+ exports.compare = compare;
436
+ function compare(a, b, loose) {
437
+ return new SemVer(a, loose).compare(b);
438
+ }
439
+
440
+ exports.compareLoose = compareLoose;
441
+ function compareLoose(a, b) {
442
+ return compare(a, b, true);
443
+ }
444
+
445
+ exports.rcompare = rcompare;
446
+ function rcompare(a, b, loose) {
447
+ return compare(b, a, loose);
448
+ }
449
+
450
+ exports.sort = sort;
451
+ function sort(list, loose) {
452
+ return list.sort(function(a, b) {
453
+ return exports.compare(a, b, loose);
454
+ });
455
+ }
456
+
457
+ exports.rsort = rsort;
458
+ function rsort(list, loose) {
459
+ return list.sort(function(a, b) {
460
+ return exports.rcompare(a, b, loose);
461
+ });
462
+ }
463
+
464
+ exports.gt = gt;
465
+ function gt(a, b, loose) {
466
+ return compare(a, b, loose) > 0;
467
+ }
468
+
469
+ exports.lt = lt;
470
+ function lt(a, b, loose) {
471
+ return compare(a, b, loose) < 0;
472
+ }
473
+
474
+ exports.eq = eq;
475
+ function eq(a, b, loose) {
476
+ return compare(a, b, loose) === 0;
477
+ }
478
+
479
+ exports.neq = neq;
480
+ function neq(a, b, loose) {
481
+ return compare(a, b, loose) !== 0;
482
+ }
483
+
484
+ exports.gte = gte;
485
+ function gte(a, b, loose) {
486
+ return compare(a, b, loose) >= 0;
487
+ }
488
+
489
+ exports.lte = lte;
490
+ function lte(a, b, loose) {
491
+ return compare(a, b, loose) <= 0;
492
+ }
493
+
494
+ exports.cmp = cmp;
495
+ function cmp(a, op, b, loose) {
496
+ var ret;
497
+ switch (op) {
498
+ case '===': ret = a === b; break;
499
+ case '!==': ret = a !== b; break;
500
+ case '': case '=': case '==': ret = eq(a, b, loose); break;
501
+ case '!=': ret = neq(a, b, loose); break;
502
+ case '>': ret = gt(a, b, loose); break;
503
+ case '>=': ret = gte(a, b, loose); break;
504
+ case '<': ret = lt(a, b, loose); break;
505
+ case '<=': ret = lte(a, b, loose); break;
506
+ default: throw new TypeError('Invalid operator: ' + op);
507
+ }
508
+ return ret;
509
+ }
510
+
511
+ exports.Comparator = Comparator;
512
+ function Comparator(comp, loose) {
513
+ if (comp instanceof Comparator) {
514
+ if (comp.loose === loose)
515
+ return comp;
516
+ else
517
+ comp = comp.value;
518
+ }
519
+
520
+ if (!(this instanceof Comparator))
521
+ return new Comparator(comp, loose);
522
+
523
+ debug('comparator', comp, loose);
524
+ this.loose = loose;
525
+ this.parse(comp);
526
+
527
+ if (this.semver === ANY)
528
+ this.value = '';
529
+ else
530
+ this.value = this.operator + this.semver.version;
531
+ }
532
+
533
+ var ANY = {};
534
+ Comparator.prototype.parse = function(comp) {
535
+ var r = this.loose ? re[COMPARATORLOOSE] : re[COMPARATOR];
536
+ var m = comp.match(r);
537
+
538
+ if (!m)
539
+ throw new TypeError('Invalid comparator: ' + comp);
540
+
541
+ this.operator = m[1];
542
+ // if it literally is just '>' or '' then allow anything.
543
+ if (!m[2])
544
+ this.semver = ANY;
545
+ else {
546
+ this.semver = new SemVer(m[2], this.loose);
547
+
548
+ // <1.2.3-rc DOES allow 1.2.3-beta (has prerelease)
549
+ // >=1.2.3 DOES NOT allow 1.2.3-beta
550
+ // <=1.2.3 DOES allow 1.2.3-beta
551
+ // However, <1.2.3 does NOT allow 1.2.3-beta,
552
+ // even though `1.2.3-beta < 1.2.3`
553
+ // The assumption is that the 1.2.3 version has something you
554
+ // *don't* want, so we push the prerelease down to the minimum.
555
+ if (this.operator === '<' && !this.semver.prerelease.length) {
556
+ this.semver.prerelease = ['0'];
557
+ this.semver.format();
558
+ }
559
+ }
560
+ };
561
+
562
+ Comparator.prototype.inspect = function() {
563
+ return '<SemVer Comparator "' + this + '">';
564
+ };
565
+
566
+ Comparator.prototype.toString = function() {
567
+ return this.value;
568
+ };
569
+
570
+ Comparator.prototype.test = function(version) {
571
+ debug('Comparator.test', version, this.loose);
572
+ return (this.semver === ANY) ? true :
573
+ cmp(version, this.operator, this.semver, this.loose);
574
+ };
575
+
576
+
577
+ exports.Range = Range;
578
+ function Range(range, loose) {
579
+ if ((range instanceof Range) && range.loose === loose)
580
+ return range;
581
+
582
+ if (!(this instanceof Range))
583
+ return new Range(range, loose);
584
+
585
+ this.loose = loose;
586
+
587
+ // First, split based on boolean or ||
588
+ this.raw = range;
589
+ this.set = range.split(/\s*\|\|\s*/).map(function(range) {
590
+ return this.parseRange(range.trim());
591
+ }, this).filter(function(c) {
592
+ // throw out any that are not relevant for whatever reason
593
+ return c.length;
594
+ });
595
+
596
+ if (!this.set.length) {
597
+ throw new TypeError('Invalid SemVer Range: ' + range);
598
+ }
599
+
600
+ this.format();
601
+ }
602
+
603
+ Range.prototype.inspect = function() {
604
+ return '<SemVer Range "' + this.range + '">';
605
+ };
606
+
607
+ Range.prototype.format = function() {
608
+ this.range = this.set.map(function(comps) {
609
+ return comps.join(' ').trim();
610
+ }).join('||').trim();
611
+ return this.range;
612
+ };
613
+
614
+ Range.prototype.toString = function() {
615
+ return this.range;
616
+ };
617
+
618
+ Range.prototype.parseRange = function(range) {
619
+ var loose = this.loose;
620
+ range = range.trim();
621
+ debug('range', range, loose);
622
+ // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
623
+ var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE];
624
+ range = range.replace(hr, hyphenReplace);
625
+ debug('hyphen replace', range);
626
+ // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
627
+ range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace);
628
+ debug('comparator trim', range, re[COMPARATORTRIM]);
629
+
630
+ // `~ 1.2.3` => `~1.2.3`
631
+ range = range.replace(re[TILDETRIM], tildeTrimReplace);
632
+
633
+ // `^ 1.2.3` => `^1.2.3`
634
+ range = range.replace(re[CARETTRIM], caretTrimReplace);
635
+
636
+ // normalize spaces
637
+ range = range.split(/\s+/).join(' ');
638
+
639
+ // At this point, the range is completely trimmed and
640
+ // ready to be split into comparators.
641
+
642
+ var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR];
643
+ var set = range.split(' ').map(function(comp) {
644
+ return parseComparator(comp, loose);
645
+ }).join(' ').split(/\s+/);
646
+ if (this.loose) {
647
+ // in loose mode, throw out any that are not valid comparators
648
+ set = set.filter(function(comp) {
649
+ return !!comp.match(compRe);
650
+ });
651
+ }
652
+ set = set.map(function(comp) {
653
+ return new Comparator(comp, loose);
654
+ });
655
+
656
+ return set;
657
+ };
658
+
659
+ // Mostly just for testing and legacy API reasons
660
+ exports.toComparators = toComparators;
661
+ function toComparators(range, loose) {
662
+ return new Range(range, loose).set.map(function(comp) {
663
+ return comp.map(function(c) {
664
+ return c.value;
665
+ }).join(' ').trim().split(' ');
666
+ });
667
+ }
668
+
669
+ // comprised of xranges, tildes, stars, and gtlt's at this point.
670
+ // already replaced the hyphen ranges
671
+ // turn into a set of JUST comparators.
672
+ function parseComparator(comp, loose) {
673
+ debug('comp', comp);
674
+ comp = replaceCarets(comp, loose);
675
+ debug('caret', comp);
676
+ comp = replaceTildes(comp, loose);
677
+ debug('tildes', comp);
678
+ comp = replaceXRanges(comp, loose);
679
+ debug('xrange', comp);
680
+ comp = replaceStars(comp, loose);
681
+ debug('stars', comp);
682
+ return comp;
683
+ }
684
+
685
+ function isX(id) {
686
+ return !id || id.toLowerCase() === 'x' || id === '*';
687
+ }
688
+
689
+ // ~, ~> --> * (any, kinda silly)
690
+ // ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0
691
+ // ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0
692
+ // ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0
693
+ // ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0
694
+ // ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0
695
+ function replaceTildes(comp, loose) {
696
+ return comp.trim().split(/\s+/).map(function(comp) {
697
+ return replaceTilde(comp, loose);
698
+ }).join(' ');
699
+ }
700
+
701
+ function replaceTilde(comp, loose) {
702
+ var r = loose ? re[TILDELOOSE] : re[TILDE];
703
+ return comp.replace(r, function(_, M, m, p, pr) {
704
+ debug('tilde', comp, _, M, m, p, pr);
705
+ var ret;
706
+
707
+ if (isX(M))
708
+ ret = '';
709
+ else if (isX(m))
710
+ ret = '>=' + M + '.0.0-0 <' + (+M + 1) + '.0.0-0';
711
+ else if (isX(p))
712
+ // ~1.2 == >=1.2.0- <1.3.0-
713
+ ret = '>=' + M + '.' + m + '.0-0 <' + M + '.' + (+m + 1) + '.0-0';
714
+ else if (pr) {
715
+ debug('replaceTilde pr', pr);
716
+ if (pr.charAt(0) !== '-')
717
+ pr = '-' + pr;
718
+ ret = '>=' + M + '.' + m + '.' + p + pr +
719
+ ' <' + M + '.' + (+m + 1) + '.0-0';
720
+ } else
721
+ // ~1.2.3 == >=1.2.3-0 <1.3.0-0
722
+ ret = '>=' + M + '.' + m + '.' + p + '-0' +
723
+ ' <' + M + '.' + (+m + 1) + '.0-0';
724
+
725
+ debug('tilde return', ret);
726
+ return ret;
727
+ });
728
+ }
729
+
730
+ // ^ --> * (any, kinda silly)
731
+ // ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0
732
+ // ^2.0, ^2.0.x --> >=2.0.0 <3.0.0
733
+ // ^1.2, ^1.2.x --> >=1.2.0 <2.0.0
734
+ // ^1.2.3 --> >=1.2.3 <2.0.0
735
+ // ^1.2.0 --> >=1.2.0 <2.0.0
736
+ function replaceCarets(comp, loose) {
737
+ return comp.trim().split(/\s+/).map(function(comp) {
738
+ return replaceCaret(comp, loose);
739
+ }).join(' ');
740
+ }
741
+
742
+ function replaceCaret(comp, loose) {
743
+ var r = loose ? re[CARETLOOSE] : re[CARET];
744
+ return comp.replace(r, function(_, M, m, p, pr) {
745
+ debug('caret', comp, _, M, m, p, pr);
746
+ var ret;
747
+
748
+ if (isX(M))
749
+ ret = '';
750
+ else if (isX(m))
751
+ ret = '>=' + M + '.0.0-0 <' + (+M + 1) + '.0.0-0';
752
+ else if (isX(p)) {
753
+ if (M === '0')
754
+ ret = '>=' + M + '.' + m + '.0-0 <' + M + '.' + (+m + 1) + '.0-0';
755
+ else
756
+ ret = '>=' + M + '.' + m + '.0-0 <' + (+M + 1) + '.0.0-0';
757
+ } else if (pr) {
758
+ debug('replaceCaret pr', pr);
759
+ if (pr.charAt(0) !== '-')
760
+ pr = '-' + pr;
761
+ if (M === '0') {
762
+ if (m === '0')
763
+ ret = '=' + M + '.' + m + '.' + p + pr;
764
+ else
765
+ ret = '>=' + M + '.' + m + '.' + p + pr +
766
+ ' <' + M + '.' + (+m + 1) + '.0-0';
767
+ } else
768
+ ret = '>=' + M + '.' + m + '.' + p + pr +
769
+ ' <' + (+M + 1) + '.0.0-0';
770
+ } else {
771
+ if (M === '0') {
772
+ if (m === '0')
773
+ ret = '=' + M + '.' + m + '.' + p;
774
+ else
775
+ ret = '>=' + M + '.' + m + '.' + p + '-0' +
776
+ ' <' + M + '.' + (+m + 1) + '.0-0';
777
+ } else
778
+ ret = '>=' + M + '.' + m + '.' + p + '-0' +
779
+ ' <' + (+M + 1) + '.0.0-0';
780
+ }
781
+
782
+ debug('caret return', ret);
783
+ return ret;
784
+ });
785
+ }
786
+
787
+ function replaceXRanges(comp, loose) {
788
+ debug('replaceXRanges', comp, loose);
789
+ return comp.split(/\s+/).map(function(comp) {
790
+ return replaceXRange(comp, loose);
791
+ }).join(' ');
792
+ }
793
+
794
+ function replaceXRange(comp, loose) {
795
+ comp = comp.trim();
796
+ var r = loose ? re[XRANGELOOSE] : re[XRANGE];
797
+ return comp.replace(r, function(ret, gtlt, M, m, p, pr) {
798
+ debug('xRange', comp, ret, gtlt, M, m, p, pr);
799
+ var xM = isX(M);
800
+ var xm = xM || isX(m);
801
+ var xp = xm || isX(p);
802
+ var anyX = xp;
803
+
804
+ if (gtlt === '=' && anyX)
805
+ gtlt = '';
806
+
807
+ if (gtlt && anyX) {
808
+ // replace X with 0, and then append the -0 min-prerelease
809
+ if (xM)
810
+ M = 0;
811
+ if (xm)
812
+ m = 0;
813
+ if (xp)
814
+ p = 0;
815
+
816
+ if (gtlt === '>') {
817
+ // >1 => >=2.0.0-0
818
+ // >1.2 => >=1.3.0-0
819
+ // >1.2.3 => >= 1.2.4-0
820
+ gtlt = '>=';
821
+ if (xM) {
822
+ // no change
823
+ } else if (xm) {
824
+ M = +M + 1;
825
+ m = 0;
826
+ p = 0;
827
+ } else if (xp) {
828
+ m = +m + 1;
829
+ p = 0;
830
+ }
831
+ }
832
+
833
+
834
+ ret = gtlt + M + '.' + m + '.' + p + '-0';
835
+ } else if (xM) {
836
+ // allow any
837
+ ret = '*';
838
+ } else if (xm) {
839
+ // append '-0' onto the version, otherwise
840
+ // '1.x.x' matches '2.0.0-beta', since the tag
841
+ // *lowers* the version value
842
+ ret = '>=' + M + '.0.0-0 <' + (+M + 1) + '.0.0-0';
843
+ } else if (xp) {
844
+ ret = '>=' + M + '.' + m + '.0-0 <' + M + '.' + (+m + 1) + '.0-0';
845
+ }
846
+
847
+ debug('xRange return', ret);
848
+
849
+ return ret;
850
+ });
851
+ }
852
+
853
+ // Because * is AND-ed with everything else in the comparator,
854
+ // and '' means "any version", just remove the *s entirely.
855
+ function replaceStars(comp, loose) {
856
+ debug('replaceStars', comp, loose);
857
+ // Looseness is ignored here. star is always as loose as it gets!
858
+ return comp.trim().replace(re[STAR], '');
859
+ }
860
+
861
+ // This function is passed to string.replace(re[HYPHENRANGE])
862
+ // M, m, patch, prerelease, build
863
+ // 1.2 - 3.4.5 => >=1.2.0-0 <=3.4.5
864
+ // 1.2.3 - 3.4 => >=1.2.0-0 <3.5.0-0 Any 3.4.x will do
865
+ // 1.2 - 3.4 => >=1.2.0-0 <3.5.0-0
866
+ function hyphenReplace($0,
867
+ from, fM, fm, fp, fpr, fb,
868
+ to, tM, tm, tp, tpr, tb) {
869
+
870
+ if (isX(fM))
871
+ from = '';
872
+ else if (isX(fm))
873
+ from = '>=' + fM + '.0.0-0';
874
+ else if (isX(fp))
875
+ from = '>=' + fM + '.' + fm + '.0-0';
876
+ else
877
+ from = '>=' + from;
878
+
879
+ if (isX(tM))
880
+ to = '';
881
+ else if (isX(tm))
882
+ to = '<' + (+tM + 1) + '.0.0-0';
883
+ else if (isX(tp))
884
+ to = '<' + tM + '.' + (+tm + 1) + '.0-0';
885
+ else if (tpr)
886
+ to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr;
887
+ else
888
+ to = '<=' + to;
889
+
890
+ return (from + ' ' + to).trim();
891
+ }
892
+
893
+
894
+ // if ANY of the sets match ALL of its comparators, then pass
895
+ Range.prototype.test = function(version) {
896
+ if (!version)
897
+ return false;
898
+ for (var i = 0; i < this.set.length; i++) {
899
+ if (testSet(this.set[i], version))
900
+ return true;
901
+ }
902
+ return false;
903
+ };
904
+
905
+ function testSet(set, version) {
906
+ for (var i = 0; i < set.length; i++) {
907
+ if (!set[i].test(version))
908
+ return false;
909
+ }
910
+ return true;
911
+ }
912
+
913
+ exports.satisfies = satisfies;
914
+ function satisfies(version, range, loose) {
915
+ try {
916
+ range = new Range(range, loose);
917
+ } catch (er) {
918
+ return false;
919
+ }
920
+ return range.test(version);
921
+ }
922
+
923
+ exports.maxSatisfying = maxSatisfying;
924
+ function maxSatisfying(versions, range, loose) {
925
+ return versions.filter(function(version) {
926
+ return satisfies(version, range, loose);
927
+ }).sort(function(a, b) {
928
+ return rcompare(a, b, loose);
929
+ })[0] || null;
930
+ }
931
+
932
+ exports.validRange = validRange;
933
+ function validRange(range, loose) {
934
+ try {
935
+ // Return '*' instead of '' so that truthiness works.
936
+ // This will throw if it's invalid anyway
937
+ return new Range(range, loose).range || '*';
938
+ } catch (er) {
939
+ return null;
940
+ }
941
+ }
942
+
943
+ // Determine if version is less than all the versions possible in the range
944
+ exports.ltr = ltr;
945
+ function ltr(version, range, loose) {
946
+ return outside(version, range, '<', loose);
947
+ }
948
+
949
+ // Determine if version is greater than all the versions possible in the range.
950
+ exports.gtr = gtr;
951
+ function gtr(version, range, loose) {
952
+ return outside(version, range, '>', loose);
953
+ }
954
+
955
+ exports.outside = outside;
956
+ function outside(version, range, hilo, loose) {
957
+ version = new SemVer(version, loose);
958
+ range = new Range(range, loose);
959
+
960
+ var gtfn, ltefn, ltfn, comp, ecomp;
961
+ switch (hilo) {
962
+ case '>':
963
+ gtfn = gt;
964
+ ltefn = lte;
965
+ ltfn = lt;
966
+ comp = '>';
967
+ ecomp = '>=';
968
+ break;
969
+ case '<':
970
+ gtfn = lt;
971
+ ltefn = gte;
972
+ ltfn = gt;
973
+ comp = '<';
974
+ ecomp = '<=';
975
+ break;
976
+ default:
977
+ throw new TypeError('Must provide a hilo val of "<" or ">"');
978
+ }
979
+
980
+ // If it satisifes the range it is not outside
981
+ if (satisfies(version, range, loose)) {
982
+ return false;
983
+ }
984
+
985
+ // From now on, variable terms are as if we're in "gtr" mode.
986
+ // but note that everything is flipped for the "ltr" function.
987
+
988
+ for (var i = 0; i < range.set.length; ++i) {
989
+ var comparators = range.set[i];
990
+
991
+ var high = null;
992
+ var low = null;
993
+
994
+ comparators.forEach(function(comparator) {
995
+ high = high || comparator;
996
+ low = low || comparator;
997
+ if (gtfn(comparator.semver, high.semver, loose)) {
998
+ high = comparator;
999
+ } else if (ltfn(comparator.semver, low.semver, loose)) {
1000
+ low = comparator;
1001
+ }
1002
+ });
1003
+
1004
+ // If the edge version comparator has a operator then our version
1005
+ // isn't outside it
1006
+ if (high.operator === comp || high.operator === ecomp) {
1007
+ return false;
1008
+ }
1009
+
1010
+ // If the lowest version comparator has an operator and our version
1011
+ // is less than it then it isn't higher than the range
1012
+ if ((!low.operator || low.operator === comp) &&
1013
+ ltefn(version, low.semver)) {
1014
+ return false;
1015
+ } else if (low.operator === ecomp && ltfn(version, low.semver)) {
1016
+ return false;
1017
+ }
1018
+ }
1019
+ return true;
1020
+ }
1021
+
1022
+ // Use the define() function if we're in AMD land
1023
+ if (typeof define === 'function' && define.amd)
1024
+ define(exports);
1025
+ // ***** MODIFIED LINE BELOW *****
1026
+ })();