blazer 2.6.5 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +13 -28
  5. data/app/assets/javascripts/blazer/ace/ace.js +7235 -8906
  6. data/app/assets/javascripts/blazer/ace/ext-language_tools.js +762 -774
  7. data/app/assets/javascripts/blazer/ace/mode-sql.js +177 -72
  8. data/app/assets/javascripts/blazer/ace/snippets/sql.js +5 -29
  9. data/app/assets/javascripts/blazer/ace/snippets/text.js +1 -6
  10. data/app/assets/javascripts/blazer/ace/theme-twilight.js +8 -106
  11. data/app/assets/javascripts/blazer/application.js +9 -6
  12. data/app/assets/javascripts/blazer/chart.umd.js +13 -0
  13. data/app/assets/javascripts/blazer/chartjs-adapter-date-fns.bundle.js +6322 -0
  14. data/app/assets/javascripts/blazer/chartkick.js +1020 -914
  15. data/app/assets/javascripts/blazer/highlight.min.js +466 -3
  16. data/app/assets/javascripts/blazer/mapkick.bundle.js +1029 -0
  17. data/app/assets/javascripts/blazer/moment-timezone-with-data.js +39 -38
  18. data/app/assets/javascripts/blazer/moment.js +105 -88
  19. data/app/assets/javascripts/blazer/queries.js +10 -1
  20. data/app/assets/javascripts/blazer/rails-ujs.js +746 -0
  21. data/app/assets/javascripts/blazer/vue.global.prod.js +1 -0
  22. data/app/assets/stylesheets/blazer/bootstrap.css +1 -1
  23. data/app/assets/stylesheets/blazer/selectize.css +1 -1
  24. data/app/controllers/blazer/base_controller.rb +85 -84
  25. data/app/controllers/blazer/checks_controller.rb +6 -6
  26. data/app/controllers/blazer/dashboards_controller.rb +24 -24
  27. data/app/controllers/blazer/queries_controller.rb +208 -186
  28. data/app/controllers/blazer/uploads_controller.rb +49 -49
  29. data/app/helpers/blazer/base_helper.rb +0 -4
  30. data/app/models/blazer/query.rb +1 -12
  31. data/app/views/blazer/checks/index.html.erb +1 -1
  32. data/app/views/blazer/dashboards/_form.html.erb +11 -5
  33. data/app/views/blazer/queries/_form.html.erb +19 -14
  34. data/app/views/blazer/queries/docs.html.erb +11 -1
  35. data/app/views/blazer/queries/home.html.erb +9 -6
  36. data/app/views/blazer/queries/run.html.erb +17 -32
  37. data/app/views/blazer/queries/show.html.erb +12 -20
  38. data/app/views/layouts/blazer/application.html.erb +1 -5
  39. data/lib/blazer/adapters/sql_adapter.rb +1 -1
  40. data/lib/blazer/adapters.rb +17 -0
  41. data/lib/blazer/anomaly_detectors.rb +22 -0
  42. data/lib/blazer/data_source.rb +29 -40
  43. data/lib/blazer/engine.rb +11 -9
  44. data/lib/blazer/forecasters.rb +7 -0
  45. data/lib/blazer/result.rb +13 -71
  46. data/lib/blazer/result_cache.rb +71 -0
  47. data/lib/blazer/run_statement.rb +1 -1
  48. data/lib/blazer/run_statement_job.rb +2 -2
  49. data/lib/blazer/statement.rb +3 -1
  50. data/lib/blazer/version.rb +1 -1
  51. data/lib/blazer.rb +51 -53
  52. data/licenses/LICENSE-chart.js.txt +1 -1
  53. data/licenses/LICENSE-chartjs-adapter-date-fns.txt +9 -0
  54. data/licenses/LICENSE-chartkick.js.txt +1 -1
  55. data/licenses/LICENSE-date-fns.txt +21 -0
  56. data/licenses/LICENSE-kurkle-color.txt +9 -0
  57. data/licenses/LICENSE-mapkick-bundle.txt +1029 -0
  58. data/licenses/{LICENSE-jquery-ujs.txt → LICENSE-rails-ujs.txt} +1 -1
  59. data/licenses/LICENSE-vue.txt +1 -1
  60. metadata +26 -18
  61. data/app/assets/javascripts/blazer/Chart.js +0 -16172
  62. data/app/assets/javascripts/blazer/jquery-ujs.js +0 -555
  63. data/app/assets/javascripts/blazer/vue.js +0 -12014
  64. data/lib/blazer/adapters/mongodb_adapter.rb +0 -43
  65. data/lib/blazer/detect_anomalies.R +0 -19
@@ -1,5 +1,5 @@
1
1
  //! moment.js
2
- //! version : 2.27.0
2
+ //! version : 2.29.4
3
3
  //! authors : Tim Wood, Iskren Chernev, Moment.js contributors
4
4
  //! license : MIT
5
5
  //! momentjs.com
@@ -76,8 +76,9 @@
76
76
 
77
77
  function map(arr, fn) {
78
78
  var res = [],
79
- i;
80
- for (i = 0; i < arr.length; ++i) {
79
+ i,
80
+ arrLen = arr.length;
81
+ for (i = 0; i < arrLen; ++i) {
81
82
  res.push(fn(arr[i], i));
82
83
  }
83
84
  return res;
@@ -206,7 +207,10 @@
206
207
  updateInProgress = false;
207
208
 
208
209
  function copyConfig(to, from) {
209
- var i, prop, val;
210
+ var i,
211
+ prop,
212
+ val,
213
+ momentPropertiesLen = momentProperties.length;
210
214
 
211
215
  if (!isUndefined(from._isAMomentObject)) {
212
216
  to._isAMomentObject = from._isAMomentObject;
@@ -239,8 +243,8 @@
239
243
  to._locale = from._locale;
240
244
  }
241
245
 
242
- if (momentProperties.length > 0) {
243
- for (i = 0; i < momentProperties.length; i++) {
246
+ if (momentPropertiesLen > 0) {
247
+ for (i = 0; i < momentPropertiesLen; i++) {
244
248
  prop = momentProperties[i];
245
249
  val = from[prop];
246
250
  if (!isUndefined(val)) {
@@ -295,8 +299,9 @@
295
299
  var args = [],
296
300
  arg,
297
301
  i,
298
- key;
299
- for (i = 0; i < arguments.length; i++) {
302
+ key,
303
+ argLen = arguments.length;
304
+ for (i = 0; i < argLen; i++) {
300
305
  arg = '';
301
306
  if (typeof arguments[i] === 'object') {
302
307
  arg += '\n[' + i + '] ';
@@ -446,7 +451,8 @@
446
451
  );
447
452
  }
448
453
 
449
- var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,
454
+ var formattingTokens =
455
+ /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,
450
456
  localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,
451
457
  formatFunctions = {},
452
458
  formatTokenFunctions = {};
@@ -750,8 +756,9 @@
750
756
  if (typeof units === 'object') {
751
757
  units = normalizeObjectUnits(units);
752
758
  var prioritized = getPrioritizedUnits(units),
753
- i;
754
- for (i = 0; i < prioritized.length; i++) {
759
+ i,
760
+ prioritizedLen = prioritized.length;
761
+ for (i = 0; i < prioritizedLen; i++) {
755
762
  this[prioritized[i].unit](units[prioritized[i].unit]);
756
763
  }
757
764
  } else {
@@ -781,7 +788,8 @@
781
788
  matchTimestamp = /[+-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123
782
789
  // any word (or two) characters or numbers including two/three word month in arabic.
783
790
  // includes scottish gaelic two word and hyphenated months
784
- matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,
791
+ matchWord =
792
+ /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,
785
793
  regexes;
786
794
 
787
795
  regexes = {};
@@ -807,15 +815,12 @@
807
815
  return regexEscape(
808
816
  s
809
817
  .replace('\\', '')
810
- .replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (
811
- matched,
812
- p1,
813
- p2,
814
- p3,
815
- p4
816
- ) {
817
- return p1 || p2 || p3 || p4;
818
- })
818
+ .replace(
819
+ /\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,
820
+ function (matched, p1, p2, p3, p4) {
821
+ return p1 || p2 || p3 || p4;
822
+ }
823
+ )
819
824
  );
820
825
  }
821
826
 
@@ -827,7 +832,8 @@
827
832
 
828
833
  function addParseToken(token, callback) {
829
834
  var i,
830
- func = callback;
835
+ func = callback,
836
+ tokenLen;
831
837
  if (typeof token === 'string') {
832
838
  token = [token];
833
839
  }
@@ -836,7 +842,8 @@
836
842
  array[callback] = toInt(input);
837
843
  };
838
844
  }
839
- for (i = 0; i < token.length; i++) {
845
+ tokenLen = token.length;
846
+ for (i = 0; i < tokenLen; i++) {
840
847
  tokens[token[i]] = func;
841
848
  }
842
849
  }
@@ -947,12 +954,12 @@
947
954
 
948
955
  // LOCALES
949
956
 
950
- var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
951
- '_'
952
- ),
953
- defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split(
954
- '_'
955
- ),
957
+ var defaultLocaleMonths =
958
+ 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
959
+ '_'
960
+ ),
961
+ defaultLocaleMonthsShort =
962
+ 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
956
963
  MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,
957
964
  defaultMonthsShortRegex = matchWord,
958
965
  defaultMonthsRegex = matchWord;
@@ -1394,14 +1401,12 @@
1394
1401
  addRegexToken('W', match1to2);
1395
1402
  addRegexToken('WW', match1to2, match2);
1396
1403
 
1397
- addWeekParseToken(['w', 'ww', 'W', 'WW'], function (
1398
- input,
1399
- week,
1400
- config,
1401
- token
1402
- ) {
1403
- week[token.substr(0, 1)] = toInt(input);
1404
- });
1404
+ addWeekParseToken(
1405
+ ['w', 'ww', 'W', 'WW'],
1406
+ function (input, week, config, token) {
1407
+ week[token.substr(0, 1)] = toInt(input);
1408
+ }
1409
+ );
1405
1410
 
1406
1411
  // HELPERS
1407
1412
 
@@ -1526,9 +1531,8 @@
1526
1531
  return ws.slice(n, 7).concat(ws.slice(0, n));
1527
1532
  }
1528
1533
 
1529
- var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
1530
- '_'
1531
- ),
1534
+ var defaultLocaleWeekdays =
1535
+ 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
1532
1536
  defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
1533
1537
  defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
1534
1538
  defaultWeekdaysRegex = matchWord,
@@ -2076,6 +2080,11 @@
2076
2080
  return globalLocale;
2077
2081
  }
2078
2082
 
2083
+ function isLocaleNameSane(name) {
2084
+ // Prevent names that look like filesystem paths, i.e contain '/' or '\'
2085
+ return name.match('^[^/\\\\]*$') != null;
2086
+ }
2087
+
2079
2088
  function loadLocale(name) {
2080
2089
  var oldLocale = null,
2081
2090
  aliasedRequire;
@@ -2084,7 +2093,8 @@
2084
2093
  locales[name] === undefined &&
2085
2094
  typeof module !== 'undefined' &&
2086
2095
  module &&
2087
- module.exports
2096
+ module.exports &&
2097
+ isLocaleNameSane(name)
2088
2098
  ) {
2089
2099
  try {
2090
2100
  oldLocale = globalLocale._abbr;
@@ -2301,8 +2311,10 @@
2301
2311
 
2302
2312
  // iso 8601 regex
2303
2313
  // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
2304
- var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
2305
- basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
2314
+ var extendedIsoRegex =
2315
+ /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
2316
+ basicIsoRegex =
2317
+ /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
2306
2318
  tzRegex = /Z|[+-]\d\d(?::?\d\d)?/,
2307
2319
  isoDates = [
2308
2320
  ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
@@ -2333,7 +2345,8 @@
2333
2345
  ],
2334
2346
  aspNetJsonRegex = /^\/?Date\((-?\d+)/i,
2335
2347
  // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3
2336
- rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,
2348
+ rfc2822 =
2349
+ /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,
2337
2350
  obsOffsets = {
2338
2351
  UT: 0,
2339
2352
  GMT: 0,
@@ -2356,12 +2369,13 @@
2356
2369
  allowTime,
2357
2370
  dateFormat,
2358
2371
  timeFormat,
2359
- tzFormat;
2372
+ tzFormat,
2373
+ isoDatesLen = isoDates.length,
2374
+ isoTimesLen = isoTimes.length;
2360
2375
 
2361
2376
  if (match) {
2362
2377
  getParsingFlags(config).iso = true;
2363
-
2364
- for (i = 0, l = isoDates.length; i < l; i++) {
2378
+ for (i = 0, l = isoDatesLen; i < l; i++) {
2365
2379
  if (isoDates[i][1].exec(match[1])) {
2366
2380
  dateFormat = isoDates[i][0];
2367
2381
  allowTime = isoDates[i][2] !== false;
@@ -2373,7 +2387,7 @@
2373
2387
  return;
2374
2388
  }
2375
2389
  if (match[3]) {
2376
- for (i = 0, l = isoTimes.length; i < l; i++) {
2390
+ for (i = 0, l = isoTimesLen; i < l; i++) {
2377
2391
  if (isoTimes[i][1].exec(match[3])) {
2378
2392
  // match[2] should be 'T' or space
2379
2393
  timeFormat = (match[2] || ' ') + isoTimes[i][0];
@@ -2440,7 +2454,7 @@
2440
2454
  function preprocessRFC2822(s) {
2441
2455
  // Remove comments and folding whitespace and replace multiple-spaces with a single space
2442
2456
  return s
2443
- .replace(/\([^)]*\)|[\n\t]/g, ' ')
2457
+ .replace(/\([^()]*\)|[\n\t]/g, ' ')
2444
2458
  .replace(/(\s\s+)/g, ' ')
2445
2459
  .replace(/^\s\s*/, '')
2446
2460
  .replace(/\s\s*$/, '');
@@ -2540,8 +2554,7 @@
2540
2554
  hooks.createFromInputFallback = deprecate(
2541
2555
  'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +
2542
2556
  'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +
2543
- 'discouraged and will be removed in an upcoming major release. Please refer to ' +
2544
- 'http://momentjs.com/guides/#/warnings/js-date/ for more info.',
2557
+ 'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.',
2545
2558
  function (config) {
2546
2559
  config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
2547
2560
  }
@@ -2754,12 +2767,13 @@
2754
2767
  skipped,
2755
2768
  stringLength = string.length,
2756
2769
  totalParsedInputLength = 0,
2757
- era;
2770
+ era,
2771
+ tokenLen;
2758
2772
 
2759
2773
  tokens =
2760
2774
  expandFormat(config._f, config._locale).match(formattingTokens) || [];
2761
-
2762
- for (i = 0; i < tokens.length; i++) {
2775
+ tokenLen = tokens.length;
2776
+ for (i = 0; i < tokenLen; i++) {
2763
2777
  token = tokens[i];
2764
2778
  parsedInput = (string.match(getParseRegexForToken(token, config)) ||
2765
2779
  [])[0];
@@ -2854,15 +2868,16 @@
2854
2868
  i,
2855
2869
  currentScore,
2856
2870
  validFormatFound,
2857
- bestFormatIsValid = false;
2871
+ bestFormatIsValid = false,
2872
+ configfLen = config._f.length;
2858
2873
 
2859
- if (config._f.length === 0) {
2874
+ if (configfLen === 0) {
2860
2875
  getParsingFlags(config).invalidFormat = true;
2861
2876
  config._d = new Date(NaN);
2862
2877
  return;
2863
2878
  }
2864
2879
 
2865
- for (i = 0; i < config._f.length; i++) {
2880
+ for (i = 0; i < configfLen; i++) {
2866
2881
  currentScore = 0;
2867
2882
  validFormatFound = false;
2868
2883
  tempConfig = copyConfig({}, config);
@@ -3103,7 +3118,8 @@
3103
3118
  function isDurationValid(m) {
3104
3119
  var key,
3105
3120
  unitHasDecimal = false,
3106
- i;
3121
+ i,
3122
+ orderLen = ordering.length;
3107
3123
  for (key in m) {
3108
3124
  if (
3109
3125
  hasOwnProp(m, key) &&
@@ -3116,7 +3132,7 @@
3116
3132
  }
3117
3133
  }
3118
3134
 
3119
- for (i = 0; i < ordering.length; ++i) {
3135
+ for (i = 0; i < orderLen; ++i) {
3120
3136
  if (m[ordering[i]]) {
3121
3137
  if (unitHasDecimal) {
3122
3138
  return false; // only allow non-integers for smallest unit
@@ -3441,7 +3457,8 @@
3441
3457
  // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
3442
3458
  // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
3443
3459
  // and further modified to allow for strings containing both week and day
3444
- isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
3460
+ isoRegex =
3461
+ /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
3445
3462
 
3446
3463
  function createDuration(input, key) {
3447
3464
  var duration = input,
@@ -3662,9 +3679,10 @@
3662
3679
  'ms',
3663
3680
  ],
3664
3681
  i,
3665
- property;
3682
+ property,
3683
+ propertyLen = properties.length;
3666
3684
 
3667
- for (i = 0; i < properties.length; i += 1) {
3685
+ for (i = 0; i < propertyLen; i += 1) {
3668
3686
  property = properties[i];
3669
3687
  propertyTest = propertyTest || hasOwnProp(input, property);
3670
3688
  }
@@ -3726,7 +3744,10 @@
3726
3744
  function calendar$1(time, formats) {
3727
3745
  // Support for single parameter, formats only overload to the calendar function
3728
3746
  if (arguments.length === 1) {
3729
- if (isMomentInput(arguments[0])) {
3747
+ if (!arguments[0]) {
3748
+ time = undefined;
3749
+ formats = undefined;
3750
+ } else if (isMomentInput(arguments[0])) {
3730
3751
  time = arguments[0];
3731
3752
  formats = undefined;
3732
3753
  } else if (isCalendarSpec(arguments[0])) {
@@ -4284,19 +4305,17 @@
4284
4305
  addRegexToken('NNNN', matchEraName);
4285
4306
  addRegexToken('NNNNN', matchEraNarrow);
4286
4307
 
4287
- addParseToken(['N', 'NN', 'NNN', 'NNNN', 'NNNNN'], function (
4288
- input,
4289
- array,
4290
- config,
4291
- token
4292
- ) {
4293
- var era = config._locale.erasParse(input, token, config._strict);
4294
- if (era) {
4295
- getParsingFlags(config).era = era;
4296
- } else {
4297
- getParsingFlags(config).invalidEra = input;
4308
+ addParseToken(
4309
+ ['N', 'NN', 'NNN', 'NNNN', 'NNNNN'],
4310
+ function (input, array, config, token) {
4311
+ var era = config._locale.erasParse(input, token, config._strict);
4312
+ if (era) {
4313
+ getParsingFlags(config).era = era;
4314
+ } else {
4315
+ getParsingFlags(config).invalidEra = input;
4316
+ }
4298
4317
  }
4299
- });
4318
+ );
4300
4319
 
4301
4320
  addRegexToken('y', matchUnsigned);
4302
4321
  addRegexToken('yy', matchUnsigned);
@@ -4404,7 +4423,7 @@
4404
4423
  eras = this.localeData().eras();
4405
4424
  for (i = 0, l = eras.length; i < l; ++i) {
4406
4425
  // truncate time
4407
- val = this.startOf('day').valueOf();
4426
+ val = this.clone().startOf('day').valueOf();
4408
4427
 
4409
4428
  if (eras[i].since <= val && val <= eras[i].until) {
4410
4429
  return eras[i].name;
@@ -4424,7 +4443,7 @@
4424
4443
  eras = this.localeData().eras();
4425
4444
  for (i = 0, l = eras.length; i < l; ++i) {
4426
4445
  // truncate time
4427
- val = this.startOf('day').valueOf();
4446
+ val = this.clone().startOf('day').valueOf();
4428
4447
 
4429
4448
  if (eras[i].since <= val && val <= eras[i].until) {
4430
4449
  return eras[i].narrow;
@@ -4444,7 +4463,7 @@
4444
4463
  eras = this.localeData().eras();
4445
4464
  for (i = 0, l = eras.length; i < l; ++i) {
4446
4465
  // truncate time
4447
- val = this.startOf('day').valueOf();
4466
+ val = this.clone().startOf('day').valueOf();
4448
4467
 
4449
4468
  if (eras[i].since <= val && val <= eras[i].until) {
4450
4469
  return eras[i].abbr;
@@ -4467,7 +4486,7 @@
4467
4486
  dir = eras[i].since <= eras[i].until ? +1 : -1;
4468
4487
 
4469
4488
  // truncate time
4470
- val = this.startOf('day').valueOf();
4489
+ val = this.clone().startOf('day').valueOf();
4471
4490
 
4472
4491
  if (
4473
4492
  (eras[i].since <= val && val <= eras[i].until) ||
@@ -4588,14 +4607,12 @@
4588
4607
  addRegexToken('GGGGG', match1to6, match6);
4589
4608
  addRegexToken('ggggg', match1to6, match6);
4590
4609
 
4591
- addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (
4592
- input,
4593
- week,
4594
- config,
4595
- token
4596
- ) {
4597
- week[token.substr(0, 2)] = toInt(input);
4598
- });
4610
+ addWeekParseToken(
4611
+ ['gggg', 'ggggg', 'GGGG', 'GGGGG'],
4612
+ function (input, week, config, token) {
4613
+ week[token.substr(0, 2)] = toInt(input);
4614
+ }
4615
+ );
4599
4616
 
4600
4617
  addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
4601
4618
  week[token] = hooks.parseTwoDigitYear(input);
@@ -5618,7 +5635,7 @@
5618
5635
 
5619
5636
  //! moment.js
5620
5637
 
5621
- hooks.version = '2.27.0';
5638
+ hooks.version = '2.29.4';
5622
5639
 
5623
5640
  setHookCallback(createLocal);
5624
5641
 
@@ -106,7 +106,16 @@ function cancelServerQuery(query) {
106
106
  var path = Routes.cancel_queries_path()
107
107
  var data = {run_id: query.run_id, data_source: query.data_source}
108
108
  if (navigator.sendBeacon) {
109
- navigator.sendBeacon(path + "?" + $.param(csrfProtect(data)))
109
+ // use FormData over Blob and URLSearchParams for maximum compatibility
110
+ // Blob works with Chrome 81+ and URLSearchParams works with Chrome 88+
111
+ var formdata = new FormData()
112
+ var params = csrfProtect(data)
113
+ for (var key in params) {
114
+ if (Object.prototype.hasOwnProperty.call(params, key)) {
115
+ formdata.append(key, params[key])
116
+ }
117
+ }
118
+ navigator.sendBeacon(path, formdata)
110
119
  } else {
111
120
  // TODO make sync
112
121
  $.post(path, data)