blazer 2.6.5 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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)