app/assets/javascripts/pghero/Chart.bundle.js in pghero-3.1.0 vs app/assets/javascripts/pghero/Chart.bundle.js in pghero-3.2.0

- old
+ new

@@ -1,267 +1,258 @@ /*! - * Chart.js v3.0.2 + * Chart.js v4.2.0 * https://www.chartjs.org - * (c) 2021 Chart.js Contributors + * (c) 2023 Chart.js Contributors * Released under the MIT License * - * chartjs-adapter-date-fns v2.0.0 + * @kurkle/color v0.3.2 + * https://github.com/kurkle/color#readme + * (c) 2023 Jukka Kurkela + * Released under the MIT License + * + * chartjs-adapter-date-fns v3.0.0 * https://www.chartjs.org - * (c) 2021 chartjs-adapter-date-fns Contributors + * (c) 2022 chartjs-adapter-date-fns Contributors * Released under the MIT license * - * date-fns v2.0.19 + * date-fns v2.29.3 * https://date-fns.org - * (c) 2020 Sasha Koss and Lesha Koss + * (c) 2021 Sasha Koss and Lesha Koss * Released under the MIT License */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Chart = factory()); -}(this, (function () { 'use strict'; +})(this, (function () { 'use strict'; - function _typeof(obj) { - "@babel/helpers - typeof"; - - if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { - _typeof = function (obj) { - return typeof obj; - }; - } else { - _typeof = function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }; + function _iterableToArrayLimit(arr, i) { + var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; + if (null != _i) { + var _s, + _e, + _x, + _r, + _arr = [], + _n = !0, + _d = !1; + try { + if (_x = (_i = _i.call(arr)).next, 0 === i) { + if (Object(_i) !== _i) return; + _n = !1; + } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); + } catch (err) { + _d = !0, _e = err; + } finally { + try { + if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; + } finally { + if (_d) throw _e; + } + } + return _arr; } - - return _typeof(obj); } + function ownKeys(object, enumerableOnly) { + var keys = Object.keys(object); + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(object); + enumerableOnly && (symbols = symbols.filter(function (sym) { + return Object.getOwnPropertyDescriptor(object, sym).enumerable; + })), keys.push.apply(keys, symbols); + } + return keys; + } + function _objectSpread2(target) { + for (var i = 1; i < arguments.length; i++) { + var source = null != arguments[i] ? arguments[i] : {}; + i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { + _defineProperty$w(target, key, source[key]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { + Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); + }); + } + return target; + } + function _typeof$z(obj) { + "@babel/helpers - typeof"; - function _classCallCheck(instance, Constructor) { + return _typeof$z = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { + return typeof obj; + } : function (obj) { + return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }, _typeof$z(obj); + } + function _classCallCheck$x(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - function _defineProperties(target, props) { + function _defineProperties$x(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); + Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } - - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); + function _createClass$x(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$x(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$x(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); return Constructor; } - - function _defineProperty(obj, key, value) { + function _defineProperty$w(obj, key, value) { + key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } - return obj; } - - function ownKeys(object, enumerableOnly) { - var keys = Object.keys(object); - - if (Object.getOwnPropertySymbols) { - var symbols = Object.getOwnPropertySymbols(object); - if (enumerableOnly) symbols = symbols.filter(function (sym) { - return Object.getOwnPropertyDescriptor(object, sym).enumerable; - }); - keys.push.apply(keys, symbols); - } - - return keys; - } - - function _objectSpread2(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i] != null ? arguments[i] : {}; - - if (i % 2) { - ownKeys(Object(source), true).forEach(function (key) { - _defineProperty(target, key, source[key]); - }); - } else if (Object.getOwnPropertyDescriptors) { - Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); - } else { - ownKeys(Object(source)).forEach(function (key) { - Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); - }); - } - } - - return target; - } - - function _inherits(subClass, superClass) { + function _inherits$w(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } - subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); - if (superClass) _setPrototypeOf(subClass, superClass); + Object.defineProperty(subClass, "prototype", { + writable: false + }); + if (superClass) _setPrototypeOf$w(subClass, superClass); } - - function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + function _getPrototypeOf$w(o) { + _getPrototypeOf$w = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; - return _getPrototypeOf(o); + return _getPrototypeOf$w(o); } - - function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + function _setPrototypeOf$w(o, p) { + _setPrototypeOf$w = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; - - return _setPrototypeOf(o, p); + return _setPrototypeOf$w(o, p); } - - function _isNativeReflectConstruct() { + function _isNativeReflectConstruct$w() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; - try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } - - function _assertThisInitialized(self) { + function _assertThisInitialized$w(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } - return self; } - - function _possibleConstructorReturn(self, call) { + function _possibleConstructorReturn$w(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; + } else if (call !== void 0) { + throw new TypeError("Derived constructors may only return object or undefined"); } - - return _assertThisInitialized(self); + return _assertThisInitialized$w(self); } - - function _createSuper(Derived) { - var hasNativeReflectConstruct = _isNativeReflectConstruct(); - + function _createSuper$w(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$w(); return function _createSuperInternal() { - var Super = _getPrototypeOf(Derived), - result; - + var Super = _getPrototypeOf$w(Derived), + result; if (hasNativeReflectConstruct) { - var NewTarget = _getPrototypeOf(this).constructor; - + var NewTarget = _getPrototypeOf$w(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } - - return _possibleConstructorReturn(this, result); + return _possibleConstructorReturn$w(this, result); }; } - function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { - object = _getPrototypeOf(object); + object = _getPrototypeOf$w(object); if (object === null) break; } - return object; } - - function _get(target, property, receiver) { + function _get() { if (typeof Reflect !== "undefined" && Reflect.get) { - _get = Reflect.get; + _get = Reflect.get.bind(); } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); - if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); - if (desc.get) { - return desc.get.call(receiver); + return desc.get.call(arguments.length < 3 ? target : receiver); } - return desc.value; }; } - - return _get(target, property, receiver || target); + return _get.apply(this, arguments); } - + function _slicedToArray(arr, i) { + return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray$1(arr, i) || _nonIterableRest(); + } function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray$1(arr) || _nonIterableSpread(); } - function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); + if (Array.isArray(arr)) return _arrayLikeToArray$1(arr); } - + function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; + } function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); + if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } - - function _unsupportedIterableToArray(o, minLen) { + function _unsupportedIterableToArray$1(o, minLen) { if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); + if (typeof o === "string") return _arrayLikeToArray$1(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen); } - - function _arrayLikeToArray(arr, len) { + function _arrayLikeToArray$1(arr, len) { if (len == null || len > arr.length) len = arr.length; - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - return arr2; } - function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - - function _createForOfIteratorHelper(o, allowArrayLike) { - var it; - - if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { - if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + function _createForOfIteratorHelper$1(o, allowArrayLike) { + var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; + if (!it) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray$1(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; - var F = function () {}; - return { s: F, n: function () { if (i >= o.length) return { done: true @@ -275,20 +266,18 @@ throw e; }, f: F }; } - throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - var normalCompletion = true, - didErr = false, - err; + didErr = false, + err; return { s: function () { - it = o[Symbol.iterator](); + it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; @@ -304,582 +293,50 @@ if (didErr) throw err; } } }; } - - var requestAnimFrame = function () { - if (typeof window === 'undefined') { - return function (callback) { - return callback(); - }; + function _toPrimitive(input, hint) { + if (typeof input !== "object" || input === null) return input; + var prim = input[Symbol.toPrimitive]; + if (prim !== undefined) { + var res = prim.call(input, hint || "default"); + if (typeof res !== "object") return res; + throw new TypeError("@@toPrimitive must return a primitive value."); } - - return window.requestAnimationFrame; - }(); - - function throttled(fn, thisArg, updateFn) { - var updateArgs = updateFn || function (args) { - return Array.prototype.slice.call(args); - }; - - var ticking = false; - var args = []; - return function () { - for (var _len = arguments.length, rest = new Array(_len), _key = 0; _key < _len; _key++) { - rest[_key] = arguments[_key]; - } - - args = updateArgs(rest); - - if (!ticking) { - ticking = true; - requestAnimFrame.call(window, function () { - ticking = false; - fn.apply(thisArg, args); - }); - } - }; + return (hint === "string" ? String : Number)(input); } - - function debounce(fn, delay) { - var timeout; - return function () { - if (delay) { - clearTimeout(timeout); - timeout = setTimeout(fn, delay); - } else { - fn(); - } - - return delay; - }; + function _toPropertyKey(arg) { + var key = _toPrimitive(arg, "string"); + return typeof key === "symbol" ? key : String(key); } - var _toLeftRightCenter = function _toLeftRightCenter(align) { - return align === 'start' ? 'left' : align === 'end' ? 'right' : 'center'; - }; - - var _alignStartEnd = function _alignStartEnd(align, start, end) { - return align === 'start' ? start : align === 'end' ? end : (start + end) / 2; - }; - - var _textX = function _textX(align, left, right) { - return align === 'right' ? right : align === 'center' ? (left + right) / 2 : left; - }; - - function noop() {} - - var uid = function () { - var id = 0; - return function () { - return id++; - }; - }(); - - function isNullOrUndef(value) { - return value === null || typeof value === 'undefined'; + /*! + * @kurkle/color v0.3.2 + * https://github.com/kurkle/color#readme + * (c) 2023 Jukka Kurkela + * Released under the MIT License + */ + function round(v) { + return v + 0.5 | 0; } - - function isArray(value) { - if (Array.isArray && Array.isArray(value)) { - return true; - } - - var type = Object.prototype.toString.call(value); - - if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') { - return true; - } - - return false; - } - - function isObject(value) { - return value !== null && Object.prototype.toString.call(value) === '[object Object]'; - } - - var isNumberFinite = function isNumberFinite(value) { - return (typeof value === 'number' || value instanceof Number) && isFinite(+value); + var lim = function lim(v, l, h) { + return Math.max(Math.min(v, h), l); }; - - function finiteOrDefault(value, defaultValue) { - return isNumberFinite(value) ? value : defaultValue; + function p2b(v) { + return lim(round(v * 2.55), 0, 255); } - - function valueOrDefault(value, defaultValue) { - return typeof value === 'undefined' ? defaultValue : value; + function n2b(v) { + return lim(round(v * 255), 0, 255); } - - var toPercentage = function toPercentage(value, dimension) { - return typeof value === 'string' && value.endsWith('%') ? parseFloat(value) / 100 : value / dimension; - }; - - var toDimension = function toDimension(value, dimension) { - return typeof value === 'string' && value.endsWith('%') ? parseFloat(value) / 100 * dimension : +value; - }; - - function callback(fn, args, thisArg) { - if (fn && typeof fn.call === 'function') { - return fn.apply(thisArg, args); - } + function b2n(v) { + return lim(round(v / 2.55) / 100, 0, 1); } - - function each(loopable, fn, thisArg, reverse) { - var i, len, keys; - - if (isArray(loopable)) { - len = loopable.length; - - if (reverse) { - for (i = len - 1; i >= 0; i--) { - fn.call(thisArg, loopable[i], i); - } - } else { - for (i = 0; i < len; i++) { - fn.call(thisArg, loopable[i], i); - } - } - } else if (isObject(loopable)) { - keys = Object.keys(loopable); - len = keys.length; - - for (i = 0; i < len; i++) { - fn.call(thisArg, loopable[keys[i]], keys[i]); - } - } + function n2p(v) { + return lim(round(v * 100), 0, 100); } - - function _elementsEqual(a0, a1) { - var i, ilen, v0, v1; - - if (!a0 || !a1 || a0.length !== a1.length) { - return false; - } - - for (i = 0, ilen = a0.length; i < ilen; ++i) { - v0 = a0[i]; - v1 = a1[i]; - - if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) { - return false; - } - } - - return true; - } - - function clone$1(source) { - if (isArray(source)) { - return source.map(clone$1); - } - - if (isObject(source)) { - var target = Object.create(null); - var keys = Object.keys(source); - var klen = keys.length; - var k = 0; - - for (; k < klen; ++k) { - target[keys[k]] = clone$1(source[keys[k]]); - } - - return target; - } - - return source; - } - - function isValidKey(key) { - return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1; - } - - function _merger(key, target, source, options) { - if (!isValidKey(key)) { - return; - } - - var tval = target[key]; - var sval = source[key]; - - if (isObject(tval) && isObject(sval)) { - merge(tval, sval, options); - } else { - target[key] = clone$1(sval); - } - } - - function merge(target, source, options) { - var sources = isArray(source) ? source : [source]; - var ilen = sources.length; - - if (!isObject(target)) { - return target; - } - - options = options || {}; - var merger = options.merger || _merger; - - for (var i = 0; i < ilen; ++i) { - source = sources[i]; - - if (!isObject(source)) { - continue; - } - - var keys = Object.keys(source); - - for (var k = 0, klen = keys.length; k < klen; ++k) { - merger(keys[k], target, source, options); - } - } - - return target; - } - - function mergeIf(target, source) { - return merge(target, source, { - merger: _mergerIf - }); - } - - function _mergerIf(key, target, source) { - if (!isValidKey(key)) { - return; - } - - var tval = target[key]; - var sval = source[key]; - - if (isObject(tval) && isObject(sval)) { - mergeIf(tval, sval); - } else if (!Object.prototype.hasOwnProperty.call(target, key)) { - target[key] = clone$1(sval); - } - } - - var emptyString = ''; - var dot = '.'; - - function indexOfDotOrLength(key, start) { - var idx = key.indexOf(dot, start); - return idx === -1 ? key.length : idx; - } - - function resolveObjectKey(obj, key) { - if (key === emptyString) { - return obj; - } - - var pos = 0; - var idx = indexOfDotOrLength(key, pos); - - while (obj && idx > pos) { - obj = obj[key.substr(pos, idx - pos)]; - pos = idx + 1; - idx = indexOfDotOrLength(key, pos); - } - - return obj; - } - - function _capitalize(str) { - return str.charAt(0).toUpperCase() + str.slice(1); - } - - var defined = function defined(value) { - return typeof value !== 'undefined'; - }; - - var isFunction = function isFunction(value) { - return typeof value === 'function'; - }; - - var PI = Math.PI; - var TAU = 2 * PI; - var PITAU = TAU + PI; - var INFINITY = Number.POSITIVE_INFINITY; - var RAD_PER_DEG = PI / 180; - var HALF_PI = PI / 2; - var QUARTER_PI = PI / 4; - var TWO_THIRDS_PI = PI * 2 / 3; - var log10 = Math.log10; - var sign = Math.sign; - - function niceNum(range) { - var niceRange = Math.pow(10, Math.floor(log10(range))); - var fraction = range / niceRange; - var niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10; - return niceFraction * niceRange; - } - - function _factorize(value) { - var result = []; - var sqrt = Math.sqrt(value); - var i; - - for (i = 1; i < sqrt; i++) { - if (value % i === 0) { - result.push(i); - result.push(value / i); - } - } - - if (sqrt === (sqrt | 0)) { - result.push(sqrt); - } - - result.sort(function (a, b) { - return a - b; - }).pop(); - return result; - } - - function isNumber(n) { - return !isNaN(parseFloat(n)) && isFinite(n); - } - - function almostEquals(x, y, epsilon) { - return Math.abs(x - y) < epsilon; - } - - function almostWhole(x, epsilon) { - var rounded = Math.round(x); - return rounded - epsilon <= x && rounded + epsilon >= x; - } - - function _setMinAndMaxByKey(array, target, property) { - var i, ilen, value; - - for (i = 0, ilen = array.length; i < ilen; i++) { - value = array[i][property]; - - if (!isNaN(value)) { - target.min = Math.min(target.min, value); - target.max = Math.max(target.max, value); - } - } - } - - function toRadians(degrees) { - return degrees * (PI / 180); - } - - function toDegrees(radians) { - return radians * (180 / PI); - } - - function _decimalPlaces(x) { - if (!isNumberFinite(x)) { - return; - } - - var e = 1; - var p = 0; - - while (Math.round(x * e) / e !== x) { - e *= 10; - p++; - } - - return p; - } - - function getAngleFromPoint(centrePoint, anglePoint) { - var distanceFromXCenter = anglePoint.x - centrePoint.x; - var distanceFromYCenter = anglePoint.y - centrePoint.y; - var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); - var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter); - - if (angle < -0.5 * PI) { - angle += TAU; - } - - return { - angle: angle, - distance: radialDistanceFromCenter - }; - } - - function distanceBetweenPoints(pt1, pt2) { - return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2)); - } - - function _angleDiff(a, b) { - return (a - b + PITAU) % TAU - PI; - } - - function _normalizeAngle(a) { - return (a % TAU + TAU) % TAU; - } - - function _angleBetween(angle, start, end) { - var a = _normalizeAngle(angle); - - var s = _normalizeAngle(start); - - var e = _normalizeAngle(end); - - var angleToStart = _normalizeAngle(s - a); - - var angleToEnd = _normalizeAngle(e - a); - - var startToAngle = _normalizeAngle(a - s); - - var endToAngle = _normalizeAngle(a - e); - - return a === s || a === e || angleToStart > angleToEnd && startToAngle < endToAngle; - } - - function _limitValue(value, min, max) { - return Math.max(min, Math.min(max, value)); - } - - function _int16Range(value) { - return _limitValue(value, -32768, 32767); - } - - var atEdge = function atEdge(t) { - return t === 0 || t === 1; - }; - - var elasticIn = function elasticIn(t, s, p) { - return -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p)); - }; - - var elasticOut = function elasticOut(t, s, p) { - return Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1; - }; - - var effects = { - linear: function linear(t) { - return t; - }, - easeInQuad: function easeInQuad(t) { - return t * t; - }, - easeOutQuad: function easeOutQuad(t) { - return -t * (t - 2); - }, - easeInOutQuad: function easeInOutQuad(t) { - return (t /= 0.5) < 1 ? 0.5 * t * t : -0.5 * (--t * (t - 2) - 1); - }, - easeInCubic: function easeInCubic(t) { - return t * t * t; - }, - easeOutCubic: function easeOutCubic(t) { - return (t -= 1) * t * t + 1; - }, - easeInOutCubic: function easeInOutCubic(t) { - return (t /= 0.5) < 1 ? 0.5 * t * t * t : 0.5 * ((t -= 2) * t * t + 2); - }, - easeInQuart: function easeInQuart(t) { - return t * t * t * t; - }, - easeOutQuart: function easeOutQuart(t) { - return -((t -= 1) * t * t * t - 1); - }, - easeInOutQuart: function easeInOutQuart(t) { - return (t /= 0.5) < 1 ? 0.5 * t * t * t * t : -0.5 * ((t -= 2) * t * t * t - 2); - }, - easeInQuint: function easeInQuint(t) { - return t * t * t * t * t; - }, - easeOutQuint: function easeOutQuint(t) { - return (t -= 1) * t * t * t * t + 1; - }, - easeInOutQuint: function easeInOutQuint(t) { - return (t /= 0.5) < 1 ? 0.5 * t * t * t * t * t : 0.5 * ((t -= 2) * t * t * t * t + 2); - }, - easeInSine: function easeInSine(t) { - return -Math.cos(t * HALF_PI) + 1; - }, - easeOutSine: function easeOutSine(t) { - return Math.sin(t * HALF_PI); - }, - easeInOutSine: function easeInOutSine(t) { - return -0.5 * (Math.cos(PI * t) - 1); - }, - easeInExpo: function easeInExpo(t) { - return t === 0 ? 0 : Math.pow(2, 10 * (t - 1)); - }, - easeOutExpo: function easeOutExpo(t) { - return t === 1 ? 1 : -Math.pow(2, -10 * t) + 1; - }, - easeInOutExpo: function easeInOutExpo(t) { - return atEdge(t) ? t : t < 0.5 ? 0.5 * Math.pow(2, 10 * (t * 2 - 1)) : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2); - }, - easeInCirc: function easeInCirc(t) { - return t >= 1 ? t : -(Math.sqrt(1 - t * t) - 1); - }, - easeOutCirc: function easeOutCirc(t) { - return Math.sqrt(1 - (t -= 1) * t); - }, - easeInOutCirc: function easeInOutCirc(t) { - return (t /= 0.5) < 1 ? -0.5 * (Math.sqrt(1 - t * t) - 1) : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1); - }, - easeInElastic: function easeInElastic(t) { - return atEdge(t) ? t : elasticIn(t, 0.075, 0.3); - }, - easeOutElastic: function easeOutElastic(t) { - return atEdge(t) ? t : elasticOut(t, 0.075, 0.3); - }, - easeInOutElastic: function easeInOutElastic(t) { - var s = 0.1125; - var p = 0.45; - return atEdge(t) ? t : t < 0.5 ? 0.5 * elasticIn(t * 2, s, p) : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p); - }, - easeInBack: function easeInBack(t) { - var s = 1.70158; - return t * t * ((s + 1) * t - s); - }, - easeOutBack: function easeOutBack(t) { - var s = 1.70158; - return (t -= 1) * t * ((s + 1) * t + s) + 1; - }, - easeInOutBack: function easeInOutBack(t) { - var s = 1.70158; - - if ((t /= 0.5) < 1) { - return 0.5 * (t * t * (((s *= 1.525) + 1) * t - s)); - } - - return 0.5 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2); - }, - easeInBounce: function easeInBounce(t) { - return 1 - effects.easeOutBounce(1 - t); - }, - easeOutBounce: function easeOutBounce(t) { - var m = 7.5625; - var d = 2.75; - - if (t < 1 / d) { - return m * t * t; - } - - if (t < 2 / d) { - return m * (t -= 1.5 / d) * t + 0.75; - } - - if (t < 2.5 / d) { - return m * (t -= 2.25 / d) * t + 0.9375; - } - - return m * (t -= 2.625 / d) * t + 0.984375; - }, - easeInOutBounce: function easeInOutBounce(t) { - return t < 0.5 ? effects.easeInBounce(t * 2) * 0.5 : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5; - } - }; - /*! - * @kurkle/color v0.1.9 - * https://github.com/kurkle/color#readme - * (c) 2020 Jukka Kurkela - * Released under the MIT License - */ - - var map = { + var map$1 = { 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, @@ -899,251 +356,169 @@ c: 12, d: 13, e: 14, f: 15 }; - var hex = '0123456789ABCDEF'; - + var hex = _toConsumableArray('0123456789ABCDEF'); var h1 = function h1(b) { return hex[b & 0xF]; }; - var h2 = function h2(b) { return hex[(b & 0xF0) >> 4] + hex[b & 0xF]; }; - var eq = function eq(b) { return (b & 0xF0) >> 4 === (b & 0xF); }; - - function isShort(v) { + var isShort = function isShort(v) { return eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a); - } - + }; function hexParse(str) { var len = str.length; var ret; - if (str[0] === '#') { if (len === 4 || len === 5) { ret = { - r: 255 & map[str[1]] * 17, - g: 255 & map[str[2]] * 17, - b: 255 & map[str[3]] * 17, - a: len === 5 ? map[str[4]] * 17 : 255 + r: 255 & map$1[str[1]] * 17, + g: 255 & map$1[str[2]] * 17, + b: 255 & map$1[str[3]] * 17, + a: len === 5 ? map$1[str[4]] * 17 : 255 }; } else if (len === 7 || len === 9) { ret = { - r: map[str[1]] << 4 | map[str[2]], - g: map[str[3]] << 4 | map[str[4]], - b: map[str[5]] << 4 | map[str[6]], - a: len === 9 ? map[str[7]] << 4 | map[str[8]] : 255 + r: map$1[str[1]] << 4 | map$1[str[2]], + g: map$1[str[3]] << 4 | map$1[str[4]], + b: map$1[str[5]] << 4 | map$1[str[6]], + a: len === 9 ? map$1[str[7]] << 4 | map$1[str[8]] : 255 }; } } - return ret; } - + var alpha = function alpha(a, f) { + return a < 255 ? f(a) : ''; + }; function _hexString(v) { var f = isShort(v) ? h1 : h2; - return v ? '#' + f(v.r) + f(v.g) + f(v.b) + (v.a < 255 ? f(v.a) : '') : v; + return v ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f) : undefined; } - - function round(v) { - return v + 0.5 | 0; - } - - var lim = function lim(v, l, h) { - return Math.max(Math.min(v, h), l); - }; - - function p2b(v) { - return lim(round(v * 2.55), 0, 255); - } - - function n2b(v) { - return lim(round(v * 255), 0, 255); - } - - function b2n(v) { - return lim(round(v / 2.55) / 100, 0, 1); - } - - function n2p(v) { - return lim(round(v * 100), 0, 100); - } - - var RGB_RE = /^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/; - - function rgbParse(str) { - var m = RGB_RE.exec(str); - var a = 255; - var r, g, b; - - if (!m) { - return; - } - - if (m[7] !== r) { - var v = +m[7]; - a = 255 & (m[8] ? p2b(v) : v * 255); - } - - r = +m[1]; - g = +m[3]; - b = +m[5]; - r = 255 & (m[2] ? p2b(r) : r); - g = 255 & (m[4] ? p2b(g) : g); - b = 255 & (m[6] ? p2b(b) : b); - return { - r: r, - g: g, - b: b, - a: a - }; - } - - function _rgbString(v) { - return v && (v.a < 255 ? "rgba(".concat(v.r, ", ").concat(v.g, ", ").concat(v.b, ", ").concat(b2n(v.a), ")") : "rgb(".concat(v.r, ", ").concat(v.g, ", ").concat(v.b, ")")); - } - var HUE_RE = /^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/; - function hsl2rgbn(h, s, l) { var a = s * Math.min(l, 1 - l); - var f = function f(n) { var k = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (n + h / 30) % 12; return l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1); }; - return [f(0), f(8), f(4)]; } - function hsv2rgbn(h, s, v) { var f = function f(n) { var k = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (n + h / 60) % 6; return v - v * s * Math.max(Math.min(k, 4 - k, 1), 0); }; - return [f(5), f(3), f(1)]; } - function hwb2rgbn(h, w, b) { var rgb = hsl2rgbn(h, 1, 0.5); var i; - if (w + b > 1) { i = 1 / (w + b); w *= i; b *= i; } - for (i = 0; i < 3; i++) { rgb[i] *= 1 - w - b; rgb[i] += w; } - return rgb; } - + function hueValue(r, g, b, d, max) { + if (r === max) { + return (g - b) / d + (g < b ? 6 : 0); + } + if (g === max) { + return (b - r) / d + 2; + } + return (r - g) / d + 4; + } function rgb2hsl(v) { var range = 255; var r = v.r / range; var g = v.g / range; var b = v.b / range; var max = Math.max(r, g, b); var min = Math.min(r, g, b); var l = (max + min) / 2; var h, s, d; - if (max !== min) { d = max - min; s = l > 0.5 ? d / (2 - max - min) : d / (max + min); - h = max === r ? (g - b) / d + (g < b ? 6 : 0) : max === g ? (b - r) / d + 2 : (r - g) / d + 4; + h = hueValue(r, g, b, d, max); h = h * 60 + 0.5; } - return [h | 0, s || 0, l]; } - function calln(f, a, b, c) { return (Array.isArray(a) ? f(a[0], a[1], a[2]) : f(a, b, c)).map(n2b); } - function hsl2rgb(h, s, l) { return calln(hsl2rgbn, h, s, l); } - function hwb2rgb(h, w, b) { return calln(hwb2rgbn, h, w, b); } - function hsv2rgb(h, s, v) { return calln(hsv2rgbn, h, s, v); } - function hue(h) { return (h % 360 + 360) % 360; } - function hueParse(str) { var m = HUE_RE.exec(str); var a = 255; var v; - if (!m) { return; } - if (m[5] !== v) { a = m[6] ? p2b(+m[5]) : n2b(+m[5]); } - var h = hue(+m[2]); var p1 = +m[3] / 100; var p2 = +m[4] / 100; - if (m[1] === 'hwb') { v = hwb2rgb(h, p1, p2); } else if (m[1] === 'hsv') { v = hsv2rgb(h, p1, p2); } else { v = hsl2rgb(h, p1, p2); } - return { r: v[0], g: v[1], b: v[2], a: a }; } - function _rotate(v, deg) { var h = rgb2hsl(v); h[0] = hue(h[0] + deg); h = hsl2rgb(h); v.r = h[0]; v.g = h[1]; v.b = h[2]; } - function _hslString(v) { if (!v) { return; } - var a = rgb2hsl(v); var h = a[0]; var s = n2p(a[1]); var l = n2p(a[2]); return v.a < 255 ? "hsla(".concat(h, ", ").concat(s, "%, ").concat(l, "%, ").concat(b2n(v.a), ")") : "hsl(".concat(h, ", ").concat(s, "%, ").concat(l, "%)"); } - - var map$1 = { + var map$2 = { x: 'dark', Z: 'light', Y: 're', X: 'blu', W: 'gr', @@ -1168,11 +543,11 @@ G: 'arks', H: 'ea', I: 'ightg', J: 'wh' }; - var names = { + var names$1 = { OiceXe: 'f0f8ff', antiquewEte: 'faebd7', aqua: 'ffff', aquamarRe: '7fffd4', azuY: 'f0ffff', @@ -1318,169 +693,187 @@ wEte: 'ffffff', wEtesmoke: 'f5f5f5', Lw: 'ffff00', LwgYF: '9acd32' }; - function unpack() { var unpacked = {}; - var keys = Object.keys(names); - var tkeys = Object.keys(map$1); + var keys = Object.keys(names$1); + var tkeys = Object.keys(map$2); var i, j, k, ok, nk; - for (i = 0; i < keys.length; i++) { ok = nk = keys[i]; - for (j = 0; j < tkeys.length; j++) { k = tkeys[j]; - nk = nk.replace(k, map$1[k]); + nk = nk.replace(k, map$2[k]); } - - k = parseInt(names[ok], 16); + k = parseInt(names$1[ok], 16); unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF]; } - return unpacked; } - - var names$1; - + var names; function nameParse(str) { - if (!names$1) { - names$1 = unpack(); - names$1.transparent = [0, 0, 0, 0]; + if (!names) { + names = unpack(); + names.transparent = [0, 0, 0, 0]; } - - var a = names$1[str.toLowerCase()]; + var a = names[str.toLowerCase()]; return a && { r: a[0], g: a[1], b: a[2], a: a.length === 4 ? a[3] : 255 }; } - + var RGB_RE = /^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/; + function rgbParse(str) { + var m = RGB_RE.exec(str); + var a = 255; + var r, g, b; + if (!m) { + return; + } + if (m[7] !== r) { + var v = +m[7]; + a = m[8] ? p2b(v) : lim(v * 255, 0, 255); + } + r = +m[1]; + g = +m[3]; + b = +m[5]; + r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255)); + g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255)); + b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255)); + return { + r: r, + g: g, + b: b, + a: a + }; + } + function _rgbString(v) { + return v && (v.a < 255 ? "rgba(".concat(v.r, ", ").concat(v.g, ", ").concat(v.b, ", ").concat(b2n(v.a), ")") : "rgb(".concat(v.r, ", ").concat(v.g, ", ").concat(v.b, ")")); + } + var to = function to(v) { + return v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055; + }; + var from = function from(v) { + return v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4); + }; + function _interpolate(rgb1, rgb2, t) { + var r = from(b2n(rgb1.r)); + var g = from(b2n(rgb1.g)); + var b = from(b2n(rgb1.b)); + return { + r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))), + g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))), + b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))), + a: rgb1.a + t * (rgb2.a - rgb1.a) + }; + } function modHSL(v, i, ratio) { if (v) { var tmp = rgb2hsl(v); tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1)); tmp = hsl2rgb(tmp); v.r = tmp[0]; v.g = tmp[1]; v.b = tmp[2]; } } - - function clone(v, proto) { + function clone$1(v, proto) { return v ? Object.assign(proto || {}, v) : v; } - function fromObject(input) { var v = { r: 0, g: 0, b: 0, a: 255 }; - if (Array.isArray(input)) { if (input.length >= 3) { v = { r: input[0], g: input[1], b: input[2], a: 255 }; - if (input.length > 3) { v.a = n2b(input[3]); } } } else { - v = clone(input, { + v = clone$1(input, { r: 0, g: 0, b: 0, a: 1 }); v.a = n2b(v.a); } - return v; } - function functionParse(str) { if (str.charAt(0) === 'r') { return rgbParse(str); } - return hueParse(str); } - var Color = /*#__PURE__*/function () { function Color(input) { - _classCallCheck(this, Color); - + _classCallCheck$x(this, Color); if (input instanceof Color) { return input; } - - var type = _typeof(input); - + var type = _typeof$z(input); var v; - if (type === 'object') { v = fromObject(input); } else if (type === 'string') { v = hexParse(input) || nameParse(input) || functionParse(input); } - this._rgb = v; this._valid = !!v; } - - _createClass(Color, [{ + _createClass$x(Color, [{ key: "valid", get: function get() { return this._valid; } }, { key: "rgb", get: function get() { - var v = clone(this._rgb); - + var v = clone$1(this._rgb); if (v) { v.a = b2n(v.a); } - return v; }, set: function set(obj) { this._rgb = fromObject(obj); } }, { key: "rgbString", value: function rgbString() { - return this._valid ? _rgbString(this._rgb) : this._rgb; + return this._valid ? _rgbString(this._rgb) : undefined; } }, { key: "hexString", value: function hexString() { - return this._valid ? _hexString(this._rgb) : this._rgb; + return this._valid ? _hexString(this._rgb) : undefined; } }, { key: "hslString", value: function hslString() { - return this._valid ? _hslString(this._rgb) : this._rgb; + return this._valid ? _hslString(this._rgb) : undefined; } }, { key: "mix", value: function mix(color, weight) { - var me = this; - if (color) { - var c1 = me.rgb; + var c1 = this.rgb; var c2 = color.rgb; var w2; var p = weight === w2 ? 0.5 : weight; var w = 2 * p - 1; var a = c1.a - c2.a; @@ -1488,16 +881,23 @@ w2 = 1 - w1; c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5; c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5; c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5; c1.a = p * c1.a + (1 - p) * c2.a; - me.rgb = c1; + this.rgb = c1; } - - return me; + return this; } }, { + key: "interpolate", + value: function interpolate(color, t) { + if (color) { + this._rgb = _interpolate(this._rgb, color._rgb, t); + } + return this; + } + }, { key: "clone", value: function clone() { return new Color(this.rgb); } }, { @@ -1563,115 +963,1220 @@ } }, { key: "rotate", value: function rotate(deg) { _rotate(this._rgb, deg); - return this; } }]); - return Color; }(); - function index_esm(input) { - return new Color(input); + /** + * @namespace Chart.helpers + */ /** + * An empty function that can be used, for example, for optional callback. + */ + function noop() { + /* noop */} + /** + * Returns a unique id, sequentially generated from a global variable. + */ + var uid = function () { + var id = 0; + return function () { + return id++; + }; + }(); + /** + * Returns true if `value` is neither null nor undefined, else returns false. + * @param value - The value to test. + * @since 2.7.0 + */ + function isNullOrUndef(value) { + return value === null || typeof value === 'undefined'; } - - var isPatternOrGradient = function isPatternOrGradient(value) { - return value instanceof CanvasGradient || value instanceof CanvasPattern; + /** + * Returns true if `value` is an array (including typed arrays), else returns false. + * @param value - The value to test. + * @function + */ + function isArray(value) { + if (Array.isArray && Array.isArray(value)) { + return true; + } + var type = Object.prototype.toString.call(value); + if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') { + return true; + } + return false; + } + /** + * Returns true if `value` is an object (excluding null), else returns false. + * @param value - The value to test. + * @since 2.7.0 + */ + function isObject(value) { + return value !== null && Object.prototype.toString.call(value) === '[object Object]'; + } + /** + * Returns true if `value` is a finite number, else returns false + * @param value - The value to test. + */ + function isNumberFinite(value) { + return (typeof value === 'number' || value instanceof Number) && isFinite(+value); + } + /** + * Returns `value` if finite, else returns `defaultValue`. + * @param value - The value to return if defined. + * @param defaultValue - The value to return if `value` is not finite. + */ + function finiteOrDefault(value, defaultValue) { + return isNumberFinite(value) ? value : defaultValue; + } + /** + * Returns `value` if defined, else returns `defaultValue`. + * @param value - The value to return if defined. + * @param defaultValue - The value to return if `value` is undefined. + */ + function valueOrDefault(value, defaultValue) { + return typeof value === 'undefined' ? defaultValue : value; + } + var toPercentage = function toPercentage(value, dimension) { + return typeof value === 'string' && value.endsWith('%') ? parseFloat(value) / 100 : +value / dimension; }; + var toDimension = function toDimension(value, dimension) { + return typeof value === 'string' && value.endsWith('%') ? parseFloat(value) / 100 * dimension : +value; + }; + /** + * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the + * value returned by `fn`. If `fn` is not a function, this method returns undefined. + * @param fn - The function to call. + * @param args - The arguments with which `fn` should be called. + * @param [thisArg] - The value of `this` provided for the call to `fn`. + */ + function callback(fn, args, thisArg) { + if (fn && typeof fn.call === 'function') { + return fn.apply(thisArg, args); + } + } + function each(loopable, fn, thisArg, reverse) { + var i, len, keys; + if (isArray(loopable)) { + len = loopable.length; + if (reverse) { + for (i = len - 1; i >= 0; i--) { + fn.call(thisArg, loopable[i], i); + } + } else { + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[i], i); + } + } + } else if (isObject(loopable)) { + keys = Object.keys(loopable); + len = keys.length; + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[keys[i]], keys[i]); + } + } + } + /** + * Returns true if the `a0` and `a1` arrays have the same content, else returns false. + * @param a0 - The array to compare + * @param a1 - The array to compare + * @private + */ + function _elementsEqual(a0, a1) { + var i, ilen, v0, v1; + if (!a0 || !a1 || a0.length !== a1.length) { + return false; + } + for (i = 0, ilen = a0.length; i < ilen; ++i) { + v0 = a0[i]; + v1 = a1[i]; + if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) { + return false; + } + } + return true; + } + /** + * Returns a deep copy of `source` without keeping references on objects and arrays. + * @param source - The value to clone. + */ + function clone(source) { + if (isArray(source)) { + return source.map(clone); + } + if (isObject(source)) { + var target = Object.create(null); + var keys = Object.keys(source); + var klen = keys.length; + var k = 0; + for (; k < klen; ++k) { + target[keys[k]] = clone(source[keys[k]]); + } + return target; + } + return source; + } + function isValidKey(key) { + return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1; + } + /** + * The default merger when Chart.helpers.merge is called without merger option. + * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback. + * @private + */ + function _merger(key, target, source, options) { + if (!isValidKey(key)) { + return; + } + var tval = target[key]; + var sval = source[key]; + if (isObject(tval) && isObject(sval)) { + // eslint-disable-next-line @typescript-eslint/no-use-before-define + merge(tval, sval, options); + } else { + target[key] = clone(sval); + } + } + function merge(target, source, options) { + var sources = isArray(source) ? source : [source]; + var ilen = sources.length; + if (!isObject(target)) { + return target; + } + options = options || {}; + var merger = options.merger || _merger; + var current; + for (var i = 0; i < ilen; ++i) { + current = sources[i]; + if (!isObject(current)) { + continue; + } + var keys = Object.keys(current); + for (var k = 0, klen = keys.length; k < klen; ++k) { + merger(keys[k], target, current, options); + } + } + return target; + } + function mergeIf(target, source) { + // eslint-disable-next-line @typescript-eslint/no-use-before-define + return merge(target, source, { + merger: _mergerIf + }); + } + /** + * Merges source[key] in target[key] only if target[key] is undefined. + * @private + */ + function _mergerIf(key, target, source) { + if (!isValidKey(key)) { + return; + } + var tval = target[key]; + var sval = source[key]; + if (isObject(tval) && isObject(sval)) { + mergeIf(tval, sval); + } else if (!Object.prototype.hasOwnProperty.call(target, key)) { + target[key] = clone(sval); + } + } + /** + * @private + */ + function _deprecated(scope, value, previous, current) { + if (value !== undefined) { + console.warn(scope + ': "' + previous + '" is deprecated. Please use "' + current + '" instead'); + } + } + // resolveObjectKey resolver cache + var keyResolvers = { + // Chart.helpers.core resolveObjectKey should resolve empty key to root object + '': function _(v) { + return v; + }, + // default resolvers + x: function x(o) { + return o.x; + }, + y: function y(o) { + return o.y; + } + }; + /** + * @private + */ + function _splitKey(key) { + var parts = key.split('.'); + var keys = []; + var tmp = ''; + var _iterator = _createForOfIteratorHelper$1(parts), + _step; + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var part = _step.value; + tmp += part; + if (tmp.endsWith('\\')) { + tmp = tmp.slice(0, -1) + '.'; + } else { + keys.push(tmp); + tmp = ''; + } + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + return keys; + } + function _getKeyResolver(key) { + var keys = _splitKey(key); + return function (obj) { + var _iterator2 = _createForOfIteratorHelper$1(keys), + _step2; + try { + for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { + var k = _step2.value; + if (k === '') { + break; + } + obj = obj && obj[k]; + } + } catch (err) { + _iterator2.e(err); + } finally { + _iterator2.f(); + } + return obj; + }; + } + function resolveObjectKey(obj, key) { + var resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key)); + return resolver(obj); + } + /** + * @private + */ + function _capitalize(str) { + return str.charAt(0).toUpperCase() + str.slice(1); + } + var defined = function defined(value) { + return typeof value !== 'undefined'; + }; + var isFunction = function isFunction(value) { + return typeof value === 'function'; + }; + // Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384 + var setsEqual = function setsEqual(a, b) { + if (a.size !== b.size) { + return false; + } + var _iterator3 = _createForOfIteratorHelper$1(a), + _step3; + try { + for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { + var item = _step3.value; + if (!b.has(item)) { + return false; + } + } + } catch (err) { + _iterator3.e(err); + } finally { + _iterator3.f(); + } + return true; + }; + /** + * @param e - The event + * @private + */ + function _isClickEvent(e) { + return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu'; + } - function color(value) { - return isPatternOrGradient(value) ? value : index_esm(value); + /** + * @alias Chart.helpers.math + * @namespace + */ + var PI = Math.PI; + var TAU = 2 * PI; + var PITAU = TAU + PI; + var INFINITY = Number.POSITIVE_INFINITY; + var RAD_PER_DEG = PI / 180; + var HALF_PI = PI / 2; + var QUARTER_PI = PI / 4; + var TWO_THIRDS_PI = PI * 2 / 3; + var log10 = Math.log10; + var sign = Math.sign; + function almostEquals(x, y, epsilon) { + return Math.abs(x - y) < epsilon; } + /** + * Implementation of the nice number algorithm used in determining where axis labels will go + */ + function niceNum(range) { + var roundedRange = Math.round(range); + range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range; + var niceRange = Math.pow(10, Math.floor(log10(range))); + var fraction = range / niceRange; + var niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10; + return niceFraction * niceRange; + } + /** + * Returns an array of factors sorted from 1 to sqrt(value) + * @private + */ + function _factorize(value) { + var result = []; + var sqrt = Math.sqrt(value); + var i; + for (i = 1; i < sqrt; i++) { + if (value % i === 0) { + result.push(i); + result.push(value / i); + } + } + if (sqrt === (sqrt | 0)) { + result.push(sqrt); + } + result.sort(function (a, b) { + return a - b; + }).pop(); + return result; + } + function isNumber(n) { + return !isNaN(parseFloat(n)) && isFinite(n); + } + function almostWhole(x, epsilon) { + var rounded = Math.round(x); + return rounded - epsilon <= x && rounded + epsilon >= x; + } + /** + * @private + */ + function _setMinAndMaxByKey(array, target, property) { + var i, ilen, value; + for (i = 0, ilen = array.length; i < ilen; i++) { + value = array[i][property]; + if (!isNaN(value)) { + target.min = Math.min(target.min, value); + target.max = Math.max(target.max, value); + } + } + } + function toRadians(degrees) { + return degrees * (PI / 180); + } + function toDegrees(radians) { + return radians * (180 / PI); + } + /** + * Returns the number of decimal places + * i.e. the number of digits after the decimal point, of the value of this Number. + * @param x - A number. + * @returns The number of decimal places. + * @private + */ + function _decimalPlaces(x) { + if (!isNumberFinite(x)) { + return; + } + var e = 1; + var p = 0; + while (Math.round(x * e) / e !== x) { + e *= 10; + p++; + } + return p; + } + // Gets the angle from vertical upright to the point about a centre. + function getAngleFromPoint(centrePoint, anglePoint) { + var distanceFromXCenter = anglePoint.x - centrePoint.x; + var distanceFromYCenter = anglePoint.y - centrePoint.y; + var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); + var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter); + if (angle < -0.5 * PI) { + angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2] + } + return { + angle: angle, + distance: radialDistanceFromCenter + }; + } + function distanceBetweenPoints(pt1, pt2) { + return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2)); + } + /** + * Shortest distance between angles, in either direction. + * @private + */ + function _angleDiff(a, b) { + return (a - b + PITAU) % TAU - PI; + } + /** + * Normalize angle to be between 0 and 2*PI + * @private + */ + function _normalizeAngle(a) { + return (a % TAU + TAU) % TAU; + } + /** + * @private + */ + function _angleBetween(angle, start, end, sameAngleIsFullCircle) { + var a = _normalizeAngle(angle); + var s = _normalizeAngle(start); + var e = _normalizeAngle(end); + var angleToStart = _normalizeAngle(s - a); + var angleToEnd = _normalizeAngle(e - a); + var startToAngle = _normalizeAngle(a - s); + var endToAngle = _normalizeAngle(a - e); + return a === s || a === e || sameAngleIsFullCircle && s === e || angleToStart > angleToEnd && startToAngle < endToAngle; + } + /** + * Limit `value` between `min` and `max` + * @param value + * @param min + * @param max + * @private + */ + function _limitValue(value, min, max) { + return Math.max(min, Math.min(max, value)); + } + /** + * @param {number} value + * @private + */ + function _int16Range(value) { + return _limitValue(value, -32768, 32767); + } + /** + * @param value + * @param start + * @param end + * @param [epsilon] + * @private + */ + function _isBetween(value, start, end) { + var epsilon = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1e-6; + return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon; + } + function _lookup(table, value, cmp) { + cmp = cmp || function (index) { + return table[index] < value; + }; + var hi = table.length - 1; + var lo = 0; + var mid; + while (hi - lo > 1) { + mid = lo + hi >> 1; + if (cmp(mid)) { + lo = mid; + } else { + hi = mid; + } + } + return { + lo: lo, + hi: hi + }; + } + /** + * Binary search + * @param table - the table search. must be sorted! + * @param key - property name for the value in each entry + * @param value - value to find + * @param last - lookup last index + * @private + */ + var _lookupByKey = function _lookupByKey(table, key, value, last) { + return _lookup(table, value, last ? function (index) { + var ti = table[index][key]; + return ti < value || ti === value && table[index + 1][key] === value; + } : function (index) { + return table[index][key] < value; + }); + }; + /** + * Reverse binary search + * @param table - the table search. must be sorted! + * @param key - property name for the value in each entry + * @param value - value to find + * @private + */ + var _rlookupByKey = function _rlookupByKey(table, key, value) { + return _lookup(table, value, function (index) { + return table[index][key] >= value; + }); + }; + /** + * Return subset of `values` between `min` and `max` inclusive. + * Values are assumed to be in sorted order. + * @param values - sorted array of values + * @param min - min value + * @param max - max value + */ + function _filterBetween(values, min, max) { + var start = 0; + var end = values.length; + while (start < end && values[start] < min) { + start++; + } + while (end > start && values[end - 1] > max) { + end--; + } + return start > 0 || end < values.length ? values.slice(start, end) : values; + } + var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift']; + function listenArrayEvents(array, listener) { + if (array._chartjs) { + array._chartjs.listeners.push(listener); + return; + } + Object.defineProperty(array, '_chartjs', { + configurable: true, + enumerable: false, + value: { + listeners: [listener] + } + }); + arrayEvents.forEach(function (key) { + var method = '_onData' + _capitalize(key); + var base = array[key]; + Object.defineProperty(array, key, { + configurable: true, + enumerable: false, + value: function value() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + var res = base.apply(this, args); + array._chartjs.listeners.forEach(function (object) { + if (typeof object[method] === 'function') { + object[method].apply(object, args); + } + }); + return res; + } + }); + }); + } + function unlistenArrayEvents(array, listener) { + var stub = array._chartjs; + if (!stub) { + return; + } + var listeners = stub.listeners; + var index = listeners.indexOf(listener); + if (index !== -1) { + listeners.splice(index, 1); + } + if (listeners.length > 0) { + return; + } + arrayEvents.forEach(function (key) { + delete array[key]; + }); + delete array._chartjs; + } + /** + * @param items + */ + function _arrayUnique(items) { + var set = new Set(); + var i, ilen; + for (i = 0, ilen = items.length; i < ilen; ++i) { + set.add(items[i]); + } + if (set.size === ilen) { + return items; + } + return Array.from(set); + } + function fontString(pixelSize, fontStyle, fontFamily) { + return fontStyle + ' ' + pixelSize + 'px ' + fontFamily; + } + /** + * Request animation polyfill + */ + var requestAnimFrame = function () { + if (typeof window === 'undefined') { + return function (callback) { + return callback(); + }; + } + return window.requestAnimationFrame; + }(); + /** + * Throttles calling `fn` once per animation frame + * Latest arguments are used on the actual call + */ + function throttled(fn, thisArg) { + var argsToUse = []; + var ticking = false; + return function () { + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + // Save the args for use later + argsToUse = args; + if (!ticking) { + ticking = true; + requestAnimFrame.call(window, function () { + ticking = false; + fn.apply(thisArg, argsToUse); + }); + } + }; + } + /** + * Debounces calling `fn` for `delay` ms + */ + function debounce(fn, delay) { + var timeout; + return function () { + for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + args[_key3] = arguments[_key3]; + } + if (delay) { + clearTimeout(timeout); + timeout = setTimeout(fn, delay, args); + } else { + fn.apply(this, args); + } + return delay; + }; + } + /** + * Converts 'start' to 'left', 'end' to 'right' and others to 'center' + * @private + */ + var _toLeftRightCenter = function _toLeftRightCenter(align) { + return align === 'start' ? 'left' : align === 'end' ? 'right' : 'center'; + }; + /** + * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center` + * @private + */ + var _alignStartEnd = function _alignStartEnd(align, start, end) { + return align === 'start' ? start : align === 'end' ? end : (start + end) / 2; + }; + /** + * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left` + * @private + */ + var _textX = function _textX(align, left, right, rtl) { + var check = rtl ? 'left' : 'right'; + return align === check ? right : align === 'center' ? (left + right) / 2 : left; + }; + /** + * Return start and count of visible points. + * @private + */ + function _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled) { + var pointCount = points.length; + var start = 0; + var count = pointCount; + if (meta._sorted) { + var iScale = meta.iScale, + _parsed = meta._parsed; + var axis = iScale.axis; + var _iScale$getUserBounds = iScale.getUserBounds(), + min = _iScale$getUserBounds.min, + max = _iScale$getUserBounds.max, + minDefined = _iScale$getUserBounds.minDefined, + maxDefined = _iScale$getUserBounds.maxDefined; + if (minDefined) { + start = _limitValue(Math.min( + // @ts-expect-error Need to type _parsed + _lookupByKey(_parsed, iScale.axis, min).lo, + // @ts-expect-error Need to fix types on _lookupByKey + animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo), 0, pointCount - 1); + } + if (maxDefined) { + count = _limitValue(Math.max( + // @ts-expect-error Need to type _parsed + _lookupByKey(_parsed, iScale.axis, max, true).hi + 1, + // @ts-expect-error Need to fix types on _lookupByKey + animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1), start, pointCount) - start; + } else { + count = pointCount - start; + } + } + return { + start: start, + count: count + }; + } + /** + * Checks if the scale ranges have changed. + * @param {object} meta - dataset meta. + * @returns {boolean} + * @private + */ + function _scaleRangesChanged(meta) { + var xScale = meta.xScale, + yScale = meta.yScale, + _scaleRanges = meta._scaleRanges; + var newRanges = { + xmin: xScale.min, + xmax: xScale.max, + ymin: yScale.min, + ymax: yScale.max + }; + if (!_scaleRanges) { + meta._scaleRanges = newRanges; + return true; + } + var changed = _scaleRanges.xmin !== xScale.min || _scaleRanges.xmax !== xScale.max || _scaleRanges.ymin !== yScale.min || _scaleRanges.ymax !== yScale.max; + Object.assign(_scaleRanges, newRanges); + return changed; + } + var atEdge = function atEdge(t) { + return t === 0 || t === 1; + }; + var elasticIn = function elasticIn(t, s, p) { + return -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p)); + }; + var elasticOut = function elasticOut(t, s, p) { + return Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1; + }; + /** + * Easing functions adapted from Robert Penner's easing equations. + * @namespace Chart.helpers.easing.effects + * @see http://www.robertpenner.com/easing/ + */ + var effects = { + linear: function linear(t) { + return t; + }, + easeInQuad: function easeInQuad(t) { + return t * t; + }, + easeOutQuad: function easeOutQuad(t) { + return -t * (t - 2); + }, + easeInOutQuad: function easeInOutQuad(t) { + return (t /= 0.5) < 1 ? 0.5 * t * t : -0.5 * (--t * (t - 2) - 1); + }, + easeInCubic: function easeInCubic(t) { + return t * t * t; + }, + easeOutCubic: function easeOutCubic(t) { + return (t -= 1) * t * t + 1; + }, + easeInOutCubic: function easeInOutCubic(t) { + return (t /= 0.5) < 1 ? 0.5 * t * t * t : 0.5 * ((t -= 2) * t * t + 2); + }, + easeInQuart: function easeInQuart(t) { + return t * t * t * t; + }, + easeOutQuart: function easeOutQuart(t) { + return -((t -= 1) * t * t * t - 1); + }, + easeInOutQuart: function easeInOutQuart(t) { + return (t /= 0.5) < 1 ? 0.5 * t * t * t * t : -0.5 * ((t -= 2) * t * t * t - 2); + }, + easeInQuint: function easeInQuint(t) { + return t * t * t * t * t; + }, + easeOutQuint: function easeOutQuint(t) { + return (t -= 1) * t * t * t * t + 1; + }, + easeInOutQuint: function easeInOutQuint(t) { + return (t /= 0.5) < 1 ? 0.5 * t * t * t * t * t : 0.5 * ((t -= 2) * t * t * t * t + 2); + }, + easeInSine: function easeInSine(t) { + return -Math.cos(t * HALF_PI) + 1; + }, + easeOutSine: function easeOutSine(t) { + return Math.sin(t * HALF_PI); + }, + easeInOutSine: function easeInOutSine(t) { + return -0.5 * (Math.cos(PI * t) - 1); + }, + easeInExpo: function easeInExpo(t) { + return t === 0 ? 0 : Math.pow(2, 10 * (t - 1)); + }, + easeOutExpo: function easeOutExpo(t) { + return t === 1 ? 1 : -Math.pow(2, -10 * t) + 1; + }, + easeInOutExpo: function easeInOutExpo(t) { + return atEdge(t) ? t : t < 0.5 ? 0.5 * Math.pow(2, 10 * (t * 2 - 1)) : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2); + }, + easeInCirc: function easeInCirc(t) { + return t >= 1 ? t : -(Math.sqrt(1 - t * t) - 1); + }, + easeOutCirc: function easeOutCirc(t) { + return Math.sqrt(1 - (t -= 1) * t); + }, + easeInOutCirc: function easeInOutCirc(t) { + return (t /= 0.5) < 1 ? -0.5 * (Math.sqrt(1 - t * t) - 1) : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1); + }, + easeInElastic: function easeInElastic(t) { + return atEdge(t) ? t : elasticIn(t, 0.075, 0.3); + }, + easeOutElastic: function easeOutElastic(t) { + return atEdge(t) ? t : elasticOut(t, 0.075, 0.3); + }, + easeInOutElastic: function easeInOutElastic(t) { + var s = 0.1125; + var p = 0.45; + return atEdge(t) ? t : t < 0.5 ? 0.5 * elasticIn(t * 2, s, p) : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p); + }, + easeInBack: function easeInBack(t) { + var s = 1.70158; + return t * t * ((s + 1) * t - s); + }, + easeOutBack: function easeOutBack(t) { + var s = 1.70158; + return (t -= 1) * t * ((s + 1) * t + s) + 1; + }, + easeInOutBack: function easeInOutBack(t) { + var s = 1.70158; + if ((t /= 0.5) < 1) { + return 0.5 * (t * t * (((s *= 1.525) + 1) * t - s)); + } + return 0.5 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2); + }, + easeInBounce: function easeInBounce(t) { + return 1 - effects.easeOutBounce(1 - t); + }, + easeOutBounce: function easeOutBounce(t) { + var m = 7.5625; + var d = 2.75; + if (t < 1 / d) { + return m * t * t; + } + if (t < 2 / d) { + return m * (t -= 1.5 / d) * t + 0.75; + } + if (t < 2.5 / d) { + return m * (t -= 2.25 / d) * t + 0.9375; + } + return m * (t -= 2.625 / d) * t + 0.984375; + }, + easeInOutBounce: function easeInOutBounce(t) { + return t < 0.5 ? effects.easeInBounce(t * 2) * 0.5 : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5; + } + }; + function isPatternOrGradient(value) { + if (value && _typeof$z(value) === 'object') { + var type = value.toString(); + return type === '[object CanvasPattern]' || type === '[object CanvasGradient]'; + } + return false; + } + function color(value) { + return isPatternOrGradient(value) ? value : new Color(value); + } function getHoverColor(value) { - return isPatternOrGradient(value) ? value : index_esm(value).saturate(0.5).darken(0.1).hexString(); + return isPatternOrGradient(value) ? value : new Color(value).saturate(0.5).darken(0.1).hexString(); } - + var numbers = ['x', 'y', 'borderWidth', 'radius', 'tension']; + var colors = ['color', 'borderColor', 'backgroundColor']; + function applyAnimationsDefaults(defaults) { + defaults.set('animation', { + delay: undefined, + duration: 1000, + easing: 'easeOutQuart', + fn: undefined, + from: undefined, + loop: undefined, + to: undefined, + type: undefined + }); + defaults.describe('animation', { + _fallback: false, + _indexable: false, + _scriptable: function _scriptable(name) { + return name !== 'onProgress' && name !== 'onComplete' && name !== 'fn'; + } + }); + defaults.set('animations', { + colors: { + type: 'color', + properties: colors + }, + numbers: { + type: 'number', + properties: numbers + } + }); + defaults.describe('animations', { + _fallback: 'animation' + }); + defaults.set('transitions', { + active: { + animation: { + duration: 400 + } + }, + resize: { + animation: { + duration: 0 + } + }, + show: { + animations: { + colors: { + from: 'transparent' + }, + visible: { + type: 'boolean', + duration: 0 + } + } + }, + hide: { + animations: { + colors: { + to: 'transparent' + }, + visible: { + type: 'boolean', + easing: 'linear', + fn: function fn(v) { + return v | 0; + } + } + } + } + }); + } + function applyLayoutsDefaults(defaults) { + defaults.set('layout', { + autoPadding: true, + padding: { + top: 0, + right: 0, + bottom: 0, + left: 0 + } + }); + } + var intlCache = new Map(); + function getNumberFormat(locale, options) { + options = options || {}; + var cacheKey = locale + JSON.stringify(options); + var formatter = intlCache.get(cacheKey); + if (!formatter) { + formatter = new Intl.NumberFormat(locale, options); + intlCache.set(cacheKey, formatter); + } + return formatter; + } + function formatNumber(num, locale, options) { + return getNumberFormat(locale, options).format(num); + } + var formatters$4 = { + values: function values(value) { + return isArray(value) ? value : '' + value; + }, + numeric: function numeric(tickValue, index, ticks) { + if (tickValue === 0) { + return '0'; + } + var locale = this.chart.options.locale; + var notation; + var delta = tickValue; + if (ticks.length > 1) { + var maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value)); + if (maxTick < 1e-4 || maxTick > 1e+15) { + notation = 'scientific'; + } + delta = calculateDelta(tickValue, ticks); + } + var logDelta = log10(Math.abs(delta)); + var numDecimal = Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0); + var options = { + notation: notation, + minimumFractionDigits: numDecimal, + maximumFractionDigits: numDecimal + }; + Object.assign(options, this.options.ticks.format); + return formatNumber(tickValue, locale, options); + }, + logarithmic: function logarithmic(tickValue, index, ticks) { + if (tickValue === 0) { + return '0'; + } + var remain = ticks[index].significand || tickValue / Math.pow(10, Math.floor(log10(tickValue))); + if ([1, 2, 3, 5, 10, 15].includes(remain) || index > 0.8 * ticks.length) { + return formatters$4.numeric.call(this, tickValue, index, ticks); + } + return ''; + } + }; + function calculateDelta(tickValue, ticks) { + var delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value; + if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) { + delta = tickValue - Math.floor(tickValue); + } + return delta; + } + var Ticks = { + formatters: formatters$4 + }; + function applyScaleDefaults(defaults) { + defaults.set('scale', { + display: true, + offset: false, + reverse: false, + beginAtZero: false, + bounds: 'ticks', + grace: 0, + grid: { + display: true, + lineWidth: 1, + drawOnChartArea: true, + drawTicks: true, + tickLength: 8, + tickWidth: function tickWidth(_ctx, options) { + return options.lineWidth; + }, + tickColor: function tickColor(_ctx, options) { + return options.color; + }, + offset: false + }, + border: { + display: true, + dash: [], + dashOffset: 0.0, + width: 1 + }, + title: { + display: false, + text: '', + padding: { + top: 4, + bottom: 4 + } + }, + ticks: { + minRotation: 0, + maxRotation: 50, + mirror: false, + textStrokeWidth: 0, + textStrokeColor: '', + padding: 3, + display: true, + autoSkip: true, + autoSkipPadding: 3, + labelOffset: 0, + callback: Ticks.formatters.values, + minor: {}, + major: {}, + align: 'center', + crossAlign: 'near', + showLabelBackdrop: false, + backdropColor: 'rgba(255, 255, 255, 0.75)', + backdropPadding: 2 + } + }); + defaults.route('scale.ticks', 'color', '', 'color'); + defaults.route('scale.grid', 'color', '', 'borderColor'); + defaults.route('scale.border', 'color', '', 'borderColor'); + defaults.route('scale.title', 'color', '', 'color'); + defaults.describe('scale', { + _fallback: false, + _scriptable: function _scriptable(name) { + return !name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser'; + }, + _indexable: function _indexable(name) { + return name !== 'borderDash' && name !== 'tickBorderDash' && name !== 'dash'; + } + }); + defaults.describe('scales', { + _fallback: 'scale' + }); + defaults.describe('scale.ticks', { + _scriptable: function _scriptable(name) { + return name !== 'backdropPadding' && name !== 'callback'; + }, + _indexable: function _indexable(name) { + return name !== 'backdropPadding'; + } + }); + } var overrides = Object.create(null); var descriptors = Object.create(null); - function getScope$1(node, key) { if (!key) { return node; } - var keys = key.split('.'); - for (var i = 0, n = keys.length; i < n; ++i) { var k = keys[i]; node = node[k] || (node[k] = Object.create(null)); } - return node; } - function _set(root, scope, values) { if (typeof scope === 'string') { return merge(getScope$1(root, scope), values); } - return merge(getScope$1(root, ''), scope); } - var Defaults = /*#__PURE__*/function () { - function Defaults(_descriptors) { - _classCallCheck(this, Defaults); - + function Defaults(_descriptors, _appliers) { + _classCallCheck$x(this, Defaults); this.animation = undefined; this.backgroundColor = 'rgba(0,0,0,0.1)'; this.borderColor = 'rgba(0,0,0,0.1)'; this.color = '#666'; this.datasets = {}; - this.devicePixelRatio = function (context) { return context.chart.platform.getDevicePixelRatio(); }; - this.elements = {}; this.events = ['mousemove', 'mouseout', 'click', 'touchstart', 'touchmove']; this.font = { family: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", size: 12, style: 'normal', lineHeight: 1.2, weight: null }; this.hover = {}; - this.hoverBackgroundColor = function (ctx, options) { return getHoverColor(options.backgroundColor); }; - this.hoverBorderColor = function (ctx, options) { return getHoverColor(options.borderColor); }; - this.hoverColor = function (ctx, options) { return getHoverColor(options.color); }; - this.indexAxis = 'x'; this.interaction = { mode: 'nearest', - intersect: true + intersect: true, + includeInvisible: false }; this.maintainAspectRatio = true; this.onHover = null; this.onClick = null; this.parsing = true; this.plugins = {}; this.responsive = true; this.scale = undefined; this.scales = {}; this.showLine = true; + this.drawActiveElementsOnTop = true; this.describe(_descriptors); + this.apply(_appliers); } - - _createClass(Defaults, [{ + _createClass$x(Defaults, [{ key: "set", value: function set(scope, values) { return _set(this, scope, values); } }, { @@ -1691,40 +2196,43 @@ } }, { key: "route", value: function route(scope, name, targetScope, targetName) { var _Object$definePropert; - var scopeObject = getScope$1(this, scope); var targetScopeObject = getScope$1(this, targetScope); var privateName = '_' + name; - Object.defineProperties(scopeObject, (_Object$definePropert = {}, _defineProperty(_Object$definePropert, privateName, { + Object.defineProperties(scopeObject, (_Object$definePropert = {}, _defineProperty$w(_Object$definePropert, privateName, { value: scopeObject[name], writable: true - }), _defineProperty(_Object$definePropert, name, { + }), _defineProperty$w(_Object$definePropert, name, { enumerable: true, get: function get() { var local = this[privateName]; var target = targetScopeObject[targetName]; - if (isObject(local)) { return Object.assign({}, target, local); } - return valueOrDefault(local, target); }, set: function set(value) { this[privateName] = value; } }), _Object$definePropert)); } + }, { + key: "apply", + value: function apply(appliers) { + var _this = this; + appliers.forEach(function (apply) { + return apply(_this); + }); + } }]); - return Defaults; }(); - - var defaults = new Defaults({ + var defaults = /* #__PURE__ */new Defaults({ _scriptable: function _scriptable(name) { return !name.startsWith('on'); }, _indexable: function _indexable(name) { return name !== 'events'; @@ -1734,611 +2242,511 @@ }, interaction: { _scriptable: false, _indexable: false } - }); - + }, [applyAnimationsDefaults, applyLayoutsDefaults, applyScaleDefaults]); function toFontString(font) { if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) { return null; } - return (font.style ? font.style + ' ' : '') + (font.weight ? font.weight + ' ' : '') + font.size + 'px ' + font.family; } - function _measureText(ctx, data, gc, longest, string) { var textWidth = data[string]; - if (!textWidth) { textWidth = data[string] = ctx.measureText(string).width; gc.push(string); } - if (textWidth > longest) { longest = textWidth; } - return longest; } - function _longestText(ctx, font, arrayOfThings, cache) { cache = cache || {}; var data = cache.data = cache.data || {}; var gc = cache.garbageCollect = cache.garbageCollect || []; - if (cache.font !== font) { data = cache.data = {}; gc = cache.garbageCollect = []; cache.font = font; } - ctx.save(); ctx.font = font; var longest = 0; var ilen = arrayOfThings.length; var i, j, jlen, thing, nestedThing; - for (i = 0; i < ilen; i++) { thing = arrayOfThings[i]; - if (thing !== undefined && thing !== null && isArray(thing) !== true) { longest = _measureText(ctx, data, gc, longest, thing); } else if (isArray(thing)) { for (j = 0, jlen = thing.length; j < jlen; j++) { nestedThing = thing[j]; - if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) { longest = _measureText(ctx, data, gc, longest, nestedThing); } } } } - ctx.restore(); var gcLen = gc.length / 2; - if (gcLen > arrayOfThings.length) { for (i = 0; i < gcLen; i++) { delete data[gc[i]]; } - gc.splice(0, gcLen); } - return longest; } - function _alignPixel(chart, pixel, width) { var devicePixelRatio = chart.currentDevicePixelRatio; var halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0; return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth; } - function clearCanvas(canvas, ctx) { ctx = ctx || canvas.getContext('2d'); ctx.save(); ctx.resetTransform(); ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.restore(); } - function drawPoint(ctx, options, x, y) { - var type, xOffset, yOffset, size, cornerRadius; + drawPointLegend(ctx, options, x, y, null); + } + function drawPointLegend(ctx, options, x, y, w) { + var type, xOffset, yOffset, size, cornerRadius, width, xOffsetW, yOffsetW; var style = options.pointStyle; var rotation = options.rotation; var radius = options.radius; var rad = (rotation || 0) * RAD_PER_DEG; - - if (style && _typeof(style) === 'object') { + if (style && _typeof$z(style) === 'object') { type = style.toString(); - if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') { ctx.save(); ctx.translate(x, y); ctx.rotate(rad); ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height); ctx.restore(); return; } } - if (isNaN(radius) || radius <= 0) { return; } - ctx.beginPath(); - switch (style) { default: - ctx.arc(x, y, radius, 0, TAU); + if (w) { + ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU); + } else { + ctx.arc(x, y, radius, 0, TAU); + } ctx.closePath(); break; - case 'triangle': - ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + width = w ? w / 2 : radius; + ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius); rad += TWO_THIRDS_PI; - ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius); rad += TWO_THIRDS_PI; - ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius); ctx.closePath(); break; - case 'rectRounded': cornerRadius = radius * 0.516; size = radius - cornerRadius; xOffset = Math.cos(rad + QUARTER_PI) * size; + xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size); yOffset = Math.sin(rad + QUARTER_PI) * size; - ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI); - ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad); - ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI); - ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI); + yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size); + ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI); + ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad); + ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI); + ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI); ctx.closePath(); break; - case 'rect': if (!rotation) { size = Math.SQRT1_2 * radius; - ctx.rect(x - size, y - size, 2 * size, 2 * size); + width = w ? w / 2 : size; + ctx.rect(x - width, y - size, 2 * width, 2 * size); break; } - rad += QUARTER_PI; - case 'rectRot': + xOffsetW = Math.cos(rad) * (w ? w / 2 : radius); xOffset = Math.cos(rad) * radius; yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + yOffset, y - xOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.lineTo(x - yOffset, y + xOffset); + yOffsetW = Math.sin(rad) * (w ? w / 2 : radius); + ctx.moveTo(x - xOffsetW, y - yOffset); + ctx.lineTo(x + yOffsetW, y - xOffset); + ctx.lineTo(x + xOffsetW, y + yOffset); + ctx.lineTo(x - yOffsetW, y + xOffset); ctx.closePath(); break; - case 'crossRot': rad += QUARTER_PI; - case 'cross': + xOffsetW = Math.cos(rad) * (w ? w / 2 : radius); xOffset = Math.cos(rad) * radius; yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.moveTo(x + yOffset, y - xOffset); - ctx.lineTo(x - yOffset, y + xOffset); + yOffsetW = Math.sin(rad) * (w ? w / 2 : radius); + ctx.moveTo(x - xOffsetW, y - yOffset); + ctx.lineTo(x + xOffsetW, y + yOffset); + ctx.moveTo(x + yOffsetW, y - xOffset); + ctx.lineTo(x - yOffsetW, y + xOffset); break; - case 'star': + xOffsetW = Math.cos(rad) * (w ? w / 2 : radius); xOffset = Math.cos(rad) * radius; yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.moveTo(x + yOffset, y - xOffset); - ctx.lineTo(x - yOffset, y + xOffset); + yOffsetW = Math.sin(rad) * (w ? w / 2 : radius); + ctx.moveTo(x - xOffsetW, y - yOffset); + ctx.lineTo(x + xOffsetW, y + yOffset); + ctx.moveTo(x + yOffsetW, y - xOffset); + ctx.lineTo(x - yOffsetW, y + xOffset); rad += QUARTER_PI; + xOffsetW = Math.cos(rad) * (w ? w / 2 : radius); xOffset = Math.cos(rad) * radius; yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.moveTo(x + yOffset, y - xOffset); - ctx.lineTo(x - yOffset, y + xOffset); + yOffsetW = Math.sin(rad) * (w ? w / 2 : radius); + ctx.moveTo(x - xOffsetW, y - yOffset); + ctx.lineTo(x + xOffsetW, y + yOffset); + ctx.moveTo(x + yOffsetW, y - xOffset); + ctx.lineTo(x - yOffsetW, y + xOffset); break; - case 'line': - xOffset = Math.cos(rad) * radius; + xOffset = w ? w / 2 : Math.cos(rad) * radius; yOffset = Math.sin(rad) * radius; ctx.moveTo(x - xOffset, y - yOffset); ctx.lineTo(x + xOffset, y + yOffset); break; - case 'dash': ctx.moveTo(x, y); - ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius); + ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius); break; + case false: + ctx.closePath(); + break; } - ctx.fill(); - if (options.borderWidth > 0) { ctx.stroke(); } } - function _isPointInArea(point, area, margin) { margin = margin || 0.5; - return point && point.x > area.left - margin && point.x < area.right + margin && point.y > area.top - margin && point.y < area.bottom + margin; + return !area || point && point.x > area.left - margin && point.x < area.right + margin && point.y > area.top - margin && point.y < area.bottom + margin; } - function clipArea(ctx, area) { ctx.save(); ctx.beginPath(); ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top); ctx.clip(); } - function unclipArea(ctx) { ctx.restore(); } - function _steppedLineTo(ctx, previous, target, flip, mode) { if (!previous) { return ctx.lineTo(target.x, target.y); } - if (mode === 'middle') { var midpoint = (previous.x + target.x) / 2.0; ctx.lineTo(midpoint, previous.y); ctx.lineTo(midpoint, target.y); } else if (mode === 'after' !== !!flip) { ctx.lineTo(previous.x, target.y); } else { ctx.lineTo(target.x, previous.y); } - ctx.lineTo(target.x, target.y); } - function _bezierCurveTo(ctx, previous, target, flip) { if (!previous) { return ctx.lineTo(target.x, target.y); } - ctx.bezierCurveTo(flip ? previous.cp1x : previous.cp2x, flip ? previous.cp1y : previous.cp2y, flip ? target.cp2x : target.cp1x, flip ? target.cp2y : target.cp1y, target.x, target.y); } - function renderText(ctx, text, x, y, font) { var opts = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; var lines = isArray(text) ? text : [text]; var stroke = opts.strokeWidth > 0 && opts.strokeColor !== ''; var i, line; ctx.save(); - - if (opts.translation) { - ctx.translate(opts.translation[0], opts.translation[1]); - } - - if (!isNullOrUndef(opts.rotation)) { - ctx.rotate(opts.rotation); - } - ctx.font = font.string; - - if (opts.color) { - ctx.fillStyle = opts.color; - } - - if (opts.textAlign) { - ctx.textAlign = opts.textAlign; - } - - if (opts.textBaseline) { - ctx.textBaseline = opts.textBaseline; - } - + setRenderOpts(ctx, opts); for (i = 0; i < lines.length; ++i) { line = lines[i]; - + if (opts.backdrop) { + drawBackdrop(ctx, opts.backdrop); + } if (stroke) { if (opts.strokeColor) { ctx.strokeStyle = opts.strokeColor; } - if (!isNullOrUndef(opts.strokeWidth)) { ctx.lineWidth = opts.strokeWidth; } - ctx.strokeText(line, x, y, opts.maxWidth); } - ctx.fillText(line, x, y, opts.maxWidth); - - if (opts.strikethrough || opts.underline) { - var metrics = ctx.measureText(line); - var left = x - metrics.actualBoundingBoxLeft; - var right = x + metrics.actualBoundingBoxRight; - var top = y - metrics.actualBoundingBoxAscent; - var bottom = y + metrics.actualBoundingBoxDescent; - var yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom; - ctx.strokeStyle = ctx.fillStyle; - ctx.beginPath(); - ctx.lineWidth = opts.decorationWidth || 2; - ctx.moveTo(left, yDecoration); - ctx.lineTo(right, yDecoration); - ctx.stroke(); - } - + decorateText(ctx, x, y, line, opts); y += font.lineHeight; } - ctx.restore(); } - - var LINE_HEIGHT = new RegExp(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/); - + function setRenderOpts(ctx, opts) { + if (opts.translation) { + ctx.translate(opts.translation[0], opts.translation[1]); + } + if (!isNullOrUndef(opts.rotation)) { + ctx.rotate(opts.rotation); + } + if (opts.color) { + ctx.fillStyle = opts.color; + } + if (opts.textAlign) { + ctx.textAlign = opts.textAlign; + } + if (opts.textBaseline) { + ctx.textBaseline = opts.textBaseline; + } + } + function decorateText(ctx, x, y, line, opts) { + if (opts.strikethrough || opts.underline) { + var metrics = ctx.measureText(line); + var left = x - metrics.actualBoundingBoxLeft; + var right = x + metrics.actualBoundingBoxRight; + var top = y - metrics.actualBoundingBoxAscent; + var bottom = y + metrics.actualBoundingBoxDescent; + var yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom; + ctx.strokeStyle = ctx.fillStyle; + ctx.beginPath(); + ctx.lineWidth = opts.decorationWidth || 2; + ctx.moveTo(left, yDecoration); + ctx.lineTo(right, yDecoration); + ctx.stroke(); + } + } + function drawBackdrop(ctx, opts) { + var oldColor = ctx.fillStyle; + ctx.fillStyle = opts.color; + ctx.fillRect(opts.left, opts.top, opts.width, opts.height); + ctx.fillStyle = oldColor; + } + function addRoundedRectPath(ctx, rect) { + var x = rect.x, + y = rect.y, + w = rect.w, + h = rect.h, + radius = rect.radius; + ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, -HALF_PI, PI, true); + ctx.lineTo(x, y + h - radius.bottomLeft); + ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true); + ctx.lineTo(x + w - radius.bottomRight, y + h); + ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true); + ctx.lineTo(x + w, y + radius.topRight); + ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true); + ctx.lineTo(x + radius.topLeft, y); + } + var LINE_HEIGHT = /^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/; + var FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/; + /** + * @alias Chart.helpers.options + * @namespace + */ /** + * Converts the given line height `value` in pixels for a specific font `size`. + * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em'). + * @param size - The font size (in pixels) used to resolve relative `value`. + * @returns The effective line height in pixels (size * 1.2 if value is invalid). + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height + * @since 2.7.0 + */ function toLineHeight(value, size) { var matches = ('' + value).match(LINE_HEIGHT); - if (!matches || matches[1] === 'normal') { return size * 1.2; } - value = +matches[2]; - switch (matches[3]) { case 'px': return value; - case '%': value /= 100; break; } - return size * value; } - - var numberOrZero$1 = function numberOrZero(v) { + var numberOrZero = function numberOrZero(v) { return +v || 0; }; - - function readValueToProps(value, props) { + function _readValueToProps(value, props) { var ret = {}; var objProps = isObject(props); var keys = objProps ? Object.keys(props) : props; var read = isObject(value) ? objProps ? function (prop) { return valueOrDefault(value[prop], value[props[prop]]); } : function (prop) { return value[prop]; } : function () { return value; }; - - var _iterator = _createForOfIteratorHelper(keys), - _step; - + var _iterator4 = _createForOfIteratorHelper$1(keys), + _step4; try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var prop = _step.value; - ret[prop] = numberOrZero$1(read(prop)); + for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { + var prop = _step4.value; + ret[prop] = numberOrZero(read(prop)); } } catch (err) { - _iterator.e(err); + _iterator4.e(err); } finally { - _iterator.f(); + _iterator4.f(); } - return ret; } - + /** + * Converts the given value into a TRBL object. + * @param value - If a number, set the value to all TRBL component, + * else, if an object, use defined properties and sets undefined ones to 0. + * x / y are shorthands for same value for left/right and top/bottom. + * @returns The padding values (top, right, bottom, left) + * @since 3.0.0 + */ function toTRBL(value) { - return readValueToProps(value, { + return _readValueToProps(value, { top: 'y', right: 'x', bottom: 'y', left: 'x' }); } - + /** + * Converts the given value into a TRBL corners object (similar with css border-radius). + * @param value - If a number, set the value to all TRBL corner components, + * else, if an object, use defined properties and sets undefined ones to 0. + * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight) + * @since 3.0.0 + */ function toTRBLCorners(value) { - return readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']); + return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']); } - + /** + * Converts the given value into a padding object with pre-computed width/height. + * @param value - If a number, set the value to all TRBL component, + * else, if an object, use defined properties and sets undefined ones to 0. + * x / y are shorthands for same value for left/right and top/bottom. + * @returns The padding values (top, right, bottom, left, width, height) + * @since 2.7.0 + */ function toPadding(value) { var obj = toTRBL(value); obj.width = obj.left + obj.right; obj.height = obj.top + obj.bottom; return obj; } - + /** + * Parses font options and returns the font object. + * @param options - A object that contains font options to be parsed. + * @param fallback - A object that contains fallback font options. + * @return The font object. + * @private + */ function toFont(options, fallback) { options = options || {}; fallback = fallback || defaults.font; var size = valueOrDefault(options.size, fallback.size); - if (typeof size === 'string') { size = parseInt(size, 10); } - + var style = valueOrDefault(options.style, fallback.style); + if (style && !('' + style).match(FONT_STYLE)) { + console.warn('Invalid font style specified: "' + style + '"'); + style = undefined; + } var font = { family: valueOrDefault(options.family, fallback.family), lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size), size: size, - style: valueOrDefault(options.style, fallback.style), + style: style, weight: valueOrDefault(options.weight, fallback.weight), string: '' }; font.string = toFontString(font); return font; } - + /** + * Evaluates the given `inputs` sequentially and returns the first defined value. + * @param inputs - An array of values, falling back to the last value. + * @param context - If defined and the current value is a function, the value + * is called with `context` as first argument and the result becomes the new input. + * @param index - If defined and the current value is an array, the value + * at `index` become the new input. + * @param info - object to return information about resolution in + * @param info.cacheable - Will be set to `false` if option is not cacheable. + * @since 2.7.0 + */ function resolve(inputs, context, index, info) { var cacheable = true; var i, ilen, value; - for (i = 0, ilen = inputs.length; i < ilen; ++i) { value = inputs[i]; - if (value === undefined) { continue; } - if (context !== undefined && typeof value === 'function') { value = value(context); cacheable = false; } - if (index !== undefined && isArray(value)) { value = value[index % value.length]; cacheable = false; } - if (value !== undefined) { if (info && !cacheable) { info.cacheable = false; } - return value; } } } - - function _addGrace(minmax, grace) { + /** + * @param minmax + * @param grace + * @param beginAtZero + * @private + */ + function _addGrace(minmax, grace, beginAtZero) { var min = minmax.min, - max = minmax.max; - return { - min: min - Math.abs(toDimension(grace, min)), - max: max + toDimension(grace, max) + max = minmax.max; + var change = toDimension(grace, (max - min) / 2); + var keepZero = function keepZero(value, add) { + return beginAtZero && value === 0 ? 0 : value + add; }; - } - - function _lookup(table, value, cmp) { - cmp = cmp || function (index) { - return table[index] < value; - }; - - var hi = table.length - 1; - var lo = 0; - var mid; - - while (hi - lo > 1) { - mid = lo + hi >> 1; - - if (cmp(mid)) { - lo = mid; - } else { - hi = mid; - } - } - return { - lo: lo, - hi: hi + min: keepZero(min, -Math.abs(change)), + max: keepZero(max, change) }; } - - var _lookupByKey = function _lookupByKey(table, key, value) { - return _lookup(table, value, function (index) { - return table[index][key] < value; - }); - }; - - var _rlookupByKey = function _rlookupByKey(table, key, value) { - return _lookup(table, value, function (index) { - return table[index][key] >= value; - }); - }; - - function _filterBetween(values, min, max) { - var start = 0; - var end = values.length; - - while (start < end && values[start] < min) { - start++; - } - - while (end > start && values[end - 1] > max) { - end--; - } - - return start > 0 || end < values.length ? values.slice(start, end) : values; + function createContext(parentContext, context) { + return Object.assign(Object.create(parentContext), context); } - - var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift']; - - function listenArrayEvents(array, listener) { - if (array._chartjs) { - array._chartjs.listeners.push(listener); - - return; - } - - Object.defineProperty(array, '_chartjs', { - configurable: true, - enumerable: false, - value: { - listeners: [listener] - } - }); - arrayEvents.forEach(function (key) { - var method = '_onData' + _capitalize(key); - - var base = array[key]; - Object.defineProperty(array, key, { - configurable: true, - enumerable: false, - value: function value() { - for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } - - var res = base.apply(this, args); - - array._chartjs.listeners.forEach(function (object) { - if (typeof object[method] === 'function') { - object[method].apply(object, args); - } - }); - - return res; - } - }); - }); - } - - function unlistenArrayEvents(array, listener) { - var stub = array._chartjs; - - if (!stub) { - return; - } - - var listeners = stub.listeners; - var index = listeners.indexOf(listener); - - if (index !== -1) { - listeners.splice(index, 1); - } - - if (listeners.length > 0) { - return; - } - - arrayEvents.forEach(function (key) { - delete array[key]; - }); - delete array._chartjs; - } - - function _arrayUnique(items) { - var set = new Set(); - var i, ilen; - - for (i = 0, ilen = items.length; i < ilen; ++i) { - set.add(items[i]); - } - - if (set.size === ilen) { - return items; - } - - var result = []; - set.forEach(function (item) { - result.push(item); - }); - return result; - } - function _createResolver(scopes) { var _cache; - var prefixes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ['']; var rootScopes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : scopes; var fallback = arguments.length > 3 ? arguments[3] : undefined; - + var getTarget = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : function () { + return scopes[0]; + }; if (!defined(fallback)) { fallback = _resolve('_fallback', scopes); } - - var cache = (_cache = {}, _defineProperty(_cache, Symbol.toStringTag, 'Object'), _defineProperty(_cache, "_cacheable", true), _defineProperty(_cache, "_scopes", scopes), _defineProperty(_cache, "_rootScopes", rootScopes), _defineProperty(_cache, "_fallback", fallback), _defineProperty(_cache, "override", function override(scope) { + var cache = (_cache = {}, _defineProperty$w(_cache, Symbol.toStringTag, 'Object'), _defineProperty$w(_cache, "_cacheable", true), _defineProperty$w(_cache, "_scopes", scopes), _defineProperty$w(_cache, "_rootScopes", rootScopes), _defineProperty$w(_cache, "_fallback", fallback), _defineProperty$w(_cache, "_getTarget", getTarget), _defineProperty$w(_cache, "override", function override(scope) { return _createResolver([scope].concat(_toConsumableArray(scopes)), prefixes, rootScopes, fallback); }), _cache); return new Proxy(cache, { deleteProperty: function deleteProperty(target, prop) { delete target[prop]; @@ -2362,18 +2770,17 @@ }, ownKeys: function ownKeys(target) { return getKeysFromAllScopes(target); }, set: function set(target, prop, value) { - scopes[0][prop] = value; - delete target[prop]; + var storage = target._storage || (target._storage = getTarget()); + target[prop] = storage[prop] = value; delete target._keys; return true; } }); } - function _attachContext(proxy, context, subProxy, descriptorDefaults) { var cache = { _cacheable: false, _proxy: proxy, _context: context, @@ -2418,24 +2825,21 @@ delete target[prop]; return true; } }); } - function _descriptors(proxy) { var defaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { scriptable: true, indexable: true }; - var _proxy$_scriptable = proxy._scriptable, - _scriptable = _proxy$_scriptable === void 0 ? defaults.scriptable : _proxy$_scriptable, - _proxy$_indexable = proxy._indexable, - _indexable = _proxy$_indexable === void 0 ? defaults.indexable : _proxy$_indexable, - _proxy$_allKeys = proxy._allKeys, - _allKeys = _proxy$_allKeys === void 0 ? defaults.allKeys : _proxy$_allKeys; - + _scriptable = _proxy$_scriptable === void 0 ? defaults.scriptable : _proxy$_scriptable, + _proxy$_indexable = proxy._indexable, + _indexable = _proxy$_indexable === void 0 ? defaults.indexable : _proxy$_indexable, + _proxy$_allKeys = proxy._allKeys, + _allKeys = _proxy$_allKeys === void 0 ? defaults.allKeys : _proxy$_allKeys; return { allKeys: _allKeys, scriptable: _scriptable, indexable: _indexable, isScriptable: isFunction(_scriptable) ? _scriptable : function () { @@ -2444,299 +2848,264 @@ isIndexable: isFunction(_indexable) ? _indexable : function () { return _indexable; } }; } - var readKey = function readKey(prefix, name) { return prefix ? prefix + _capitalize(name) : name; }; - var needsSubResolver = function needsSubResolver(prop, value) { - return isObject(value) && prop !== 'adapters'; + return isObject(value) && prop !== 'adapters' && (Object.getPrototypeOf(value) === null || value.constructor === Object); }; - function _cached(target, prop, resolve) { - var value = target[prop]; - - if (defined(value)) { - return value; + if (Object.prototype.hasOwnProperty.call(target, prop)) { + return target[prop]; } - - value = resolve(); - - if (defined(value)) { - target[prop] = value; - } - + var value = resolve(); + target[prop] = value; return value; } - function _resolveWithContext(target, prop, receiver) { var _proxy = target._proxy, - _context = target._context, - _subProxy = target._subProxy, - descriptors = target._descriptors; + _context = target._context, + _subProxy = target._subProxy, + descriptors = target._descriptors; var value = _proxy[prop]; - if (isFunction(value) && descriptors.isScriptable(prop)) { value = _resolveScriptable(prop, value, target, receiver); } - if (isArray(value) && value.length) { value = _resolveArray(prop, value, target, descriptors.isIndexable); } - if (needsSubResolver(prop, value)) { value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors); } - return value; } - function _resolveScriptable(prop, value, target, receiver) { var _proxy = target._proxy, - _context = target._context, - _subProxy = target._subProxy, - _stack = target._stack; - + _context = target._context, + _subProxy = target._subProxy, + _stack = target._stack; if (_stack.has(prop)) { - throw new Error('Recursion detected: ' + _toConsumableArray(_stack).join('->') + '->' + prop); + throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop); } - _stack.add(prop); - value = value(_context, _subProxy || receiver); - - _stack.delete(prop); - - if (isObject(value)) { + _stack["delete"](prop); + if (needsSubResolver(prop, value)) { value = createSubResolver(_proxy._scopes, _proxy, prop, value); } - return value; } - function _resolveArray(prop, value, target, isIndexable) { var _proxy = target._proxy, - _context = target._context, - _subProxy = target._subProxy, - descriptors = target._descriptors; - + _context = target._context, + _subProxy = target._subProxy, + descriptors = target._descriptors; if (defined(_context.index) && isIndexable(prop)) { value = value[_context.index % value.length]; } else if (isObject(value[0])) { var arr = value; - var scopes = _proxy._scopes.filter(function (s) { return s !== arr; }); - value = []; - - var _iterator2 = _createForOfIteratorHelper(arr), - _step2; - + var _iterator5 = _createForOfIteratorHelper$1(arr), + _step5; try { - for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { - var item = _step2.value; + for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) { + var item = _step5.value; var resolver = createSubResolver(scopes, _proxy, prop, item); value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors)); } } catch (err) { - _iterator2.e(err); + _iterator5.e(err); } finally { - _iterator2.f(); + _iterator5.f(); } } - return value; } - function resolveFallback(fallback, prop, value) { return isFunction(fallback) ? fallback(prop, value) : fallback; } - var getScope = function getScope(key, parent) { return key === true ? parent : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined; }; - - function addScopes(set, parentScopes, key, parentFallback) { - var _iterator3 = _createForOfIteratorHelper(parentScopes), - _step3; - + function addScopes(set, parentScopes, key, parentFallback, value) { + var _iterator6 = _createForOfIteratorHelper$1(parentScopes), + _step6; try { - for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { - var parent = _step3.value; + for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) { + var parent = _step6.value; var scope = getScope(key, parent); - if (scope) { set.add(scope); - var fallback = resolveFallback(scope._fallback, key, scope); - + var fallback = resolveFallback(scope._fallback, key, value); if (defined(fallback) && fallback !== key && fallback !== parentFallback) { return fallback; } } else if (scope === false && defined(parentFallback) && key !== parentFallback) { return null; } } } catch (err) { - _iterator3.e(err); + _iterator6.e(err); } finally { - _iterator3.f(); + _iterator6.f(); } - return false; } - function createSubResolver(parentScopes, resolver, prop, value) { var rootScopes = resolver._rootScopes; var fallback = resolveFallback(resolver._fallback, prop, value); var allScopes = [].concat(_toConsumableArray(parentScopes), _toConsumableArray(rootScopes)); var set = new Set(); - var firstParent = parentScopes[0]; - - if (isObject(firstParent) && !(prop in firstParent)) { - set.add(firstParent[prop] = {}); - } - set.add(value); - var key = addScopesFromKey(set, allScopes, prop, fallback || prop); - + var key = addScopesFromKey(set, allScopes, prop, fallback || prop, value); if (key === null) { return false; } - if (defined(fallback) && fallback !== prop) { - key = addScopesFromKey(set, allScopes, fallback, key); - + key = addScopesFromKey(set, allScopes, fallback, key, value); if (key === null) { return false; } } - - return _createResolver(_toConsumableArray(set), [''], rootScopes, fallback); + return _createResolver(Array.from(set), [''], rootScopes, fallback, function () { + return subGetTarget(resolver, prop, value); + }); } - - function addScopesFromKey(set, allScopes, key, fallback) { + function addScopesFromKey(set, allScopes, key, fallback, item) { while (key) { - key = addScopes(set, allScopes, key, fallback); + key = addScopes(set, allScopes, key, fallback, item); } - return key; } - + function subGetTarget(resolver, prop, value) { + var parent = resolver._getTarget(); + if (!(prop in parent)) { + parent[prop] = {}; + } + var target = parent[prop]; + if (isArray(target) && isObject(value)) { + return value; + } + return target || {}; + } function _resolveWithPrefixes(prop, prefixes, scopes, proxy) { var value; - - var _iterator4 = _createForOfIteratorHelper(prefixes), - _step4; - + var _iterator7 = _createForOfIteratorHelper$1(prefixes), + _step7; try { - for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { - var prefix = _step4.value; + for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) { + var prefix = _step7.value; value = _resolve(readKey(prefix, prop), scopes); - if (defined(value)) { return needsSubResolver(prop, value) ? createSubResolver(scopes, proxy, prop, value) : value; } } } catch (err) { - _iterator4.e(err); + _iterator7.e(err); } finally { - _iterator4.f(); + _iterator7.f(); } } - function _resolve(key, scopes) { - var _iterator5 = _createForOfIteratorHelper(scopes), - _step5; - + var _iterator8 = _createForOfIteratorHelper$1(scopes), + _step8; try { - for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) { - var scope = _step5.value; - + for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) { + var scope = _step8.value; if (!scope) { continue; } - var value = scope[key]; - if (defined(value)) { return value; } } } catch (err) { - _iterator5.e(err); + _iterator8.e(err); } finally { - _iterator5.f(); + _iterator8.f(); } } - function getKeysFromAllScopes(target) { var keys = target._keys; - if (!keys) { keys = target._keys = resolveKeysFromAllScopes(target._scopes); } - return keys; } - function resolveKeysFromAllScopes(scopes) { var set = new Set(); - - var _iterator6 = _createForOfIteratorHelper(scopes), - _step6; - + var _iterator9 = _createForOfIteratorHelper$1(scopes), + _step9; try { - for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) { - var scope = _step6.value; - - var _iterator7 = _createForOfIteratorHelper(Object.keys(scope).filter(function (k) { - return !k.startsWith('_'); - })), - _step7; - + for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) { + var scope = _step9.value; + var _iterator10 = _createForOfIteratorHelper$1(Object.keys(scope).filter(function (k) { + return !k.startsWith('_'); + })), + _step10; try { - for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) { - var key = _step7.value; + for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) { + var key = _step10.value; set.add(key); } } catch (err) { - _iterator7.e(err); + _iterator10.e(err); } finally { - _iterator7.f(); + _iterator10.f(); } } } catch (err) { - _iterator6.e(err); + _iterator9.e(err); } finally { - _iterator6.f(); + _iterator9.f(); } - - return _toConsumableArray(set); + return Array.from(set); } - + function _parseObjectDataRadialScale(meta, data, start, count) { + var iScale = meta.iScale; + var _this$_parsing$key = this._parsing.key, + key = _this$_parsing$key === void 0 ? 'r' : _this$_parsing$key; + var parsed = new Array(count); + var i, ilen, index, item; + for (i = 0, ilen = count; i < ilen; ++i) { + index = i + start; + item = data[index]; + parsed[i] = { + r: iScale.parse(resolveObjectKey(item, key), index) + }; + } + return parsed; + } var EPSILON = Number.EPSILON || 1e-14; - var getPoint = function getPoint(points, i) { return i < points.length && !points[i].skip && points[i]; }; - + var getValueAxis = function getValueAxis(indexAxis) { + return indexAxis === 'x' ? 'y' : 'x'; + }; function splineCurve(firstPoint, middlePoint, afterPoint, t) { + // Props to Rob Spencer at scaled innovation for his post on splining between points + // http://scaledinnovation.com/analytics/splines/aboutSplines.html + // This function must also respect "skipped" points var previous = firstPoint.skip ? middlePoint : firstPoint; var current = middlePoint; var next = afterPoint.skip ? middlePoint : afterPoint; var d01 = distanceBetweenPoints(current, previous); var d12 = distanceBetweenPoints(next, current); var s01 = d01 / (d01 + d12); var s12 = d12 / (d01 + d12); + // If all points are the same, s01 & s02 will be inf s01 = isNaN(s01) ? 0 : s01; s12 = isNaN(s12) ? 0 : s12; - var fa = t * s01; + var fa = t * s01; // scaling factor for triangle Ta var fb = t * s12; return { previous: { x: current.x - fa * (next.x - previous.x), y: current.y - fa * (next.y - previous.y) @@ -2745,433 +3114,435 @@ x: current.x + fb * (next.x - previous.x), y: current.y + fb * (next.y - previous.y) } }; } - + /** + * Adjust tangents to ensure monotonic properties + */ function monotoneAdjust(points, deltaK, mK) { var pointsLen = points.length; var alphaK, betaK, tauK, squaredMagnitude, pointCurrent; var pointAfter = getPoint(points, 0); - for (var i = 0; i < pointsLen - 1; ++i) { pointCurrent = pointAfter; pointAfter = getPoint(points, i + 1); - if (!pointCurrent || !pointAfter) { continue; } - if (almostEquals(deltaK[i], 0, EPSILON)) { mK[i] = mK[i + 1] = 0; continue; } - alphaK = mK[i] / deltaK[i]; betaK = mK[i + 1] / deltaK[i]; squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2); - if (squaredMagnitude <= 9) { continue; } - tauK = 3 / Math.sqrt(squaredMagnitude); mK[i] = alphaK * tauK * deltaK[i]; mK[i + 1] = betaK * tauK * deltaK[i]; } } - function monotoneCompute(points, mK) { + var indexAxis = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'x'; + var valueAxis = getValueAxis(indexAxis); var pointsLen = points.length; - var deltaX, pointBefore, pointCurrent; + var delta, pointBefore, pointCurrent; var pointAfter = getPoint(points, 0); - for (var i = 0; i < pointsLen; ++i) { pointBefore = pointCurrent; pointCurrent = pointAfter; pointAfter = getPoint(points, i + 1); - if (!pointCurrent) { continue; } - - var _pointCurrent = pointCurrent, - x = _pointCurrent.x, - y = _pointCurrent.y; - + var iPixel = pointCurrent[indexAxis]; + var vPixel = pointCurrent[valueAxis]; if (pointBefore) { - deltaX = (x - pointBefore.x) / 3; - pointCurrent.cp1x = x - deltaX; - pointCurrent.cp1y = y - deltaX * mK[i]; + delta = (iPixel - pointBefore[indexAxis]) / 3; + pointCurrent["cp1".concat(indexAxis)] = iPixel - delta; + pointCurrent["cp1".concat(valueAxis)] = vPixel - delta * mK[i]; } - if (pointAfter) { - deltaX = (pointAfter.x - x) / 3; - pointCurrent.cp2x = x + deltaX; - pointCurrent.cp2y = y + deltaX * mK[i]; + delta = (pointAfter[indexAxis] - iPixel) / 3; + pointCurrent["cp2".concat(indexAxis)] = iPixel + delta; + pointCurrent["cp2".concat(valueAxis)] = vPixel + delta * mK[i]; } } } - + /** + * This function calculates Bézier control points in a similar way than |splineCurve|, + * but preserves monotonicity of the provided data and ensures no local extremums are added + * between the dataset discrete points due to the interpolation. + * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation + */ function splineCurveMonotone(points) { + var indexAxis = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'x'; + var valueAxis = getValueAxis(indexAxis); var pointsLen = points.length; var deltaK = Array(pointsLen).fill(0); var mK = Array(pointsLen); + // Calculate slopes (deltaK) and initialize tangents (mK) var i, pointBefore, pointCurrent; var pointAfter = getPoint(points, 0); - for (i = 0; i < pointsLen; ++i) { pointBefore = pointCurrent; pointCurrent = pointAfter; pointAfter = getPoint(points, i + 1); - if (!pointCurrent) { continue; } - if (pointAfter) { - var slopeDeltaX = pointAfter.x - pointCurrent.x; - deltaK[i] = slopeDeltaX !== 0 ? (pointAfter.y - pointCurrent.y) / slopeDeltaX : 0; + var slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis]; + // In the case of two points that appear at the same x pixel, slopeDeltaX is 0 + deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0; } - mK[i] = !pointBefore ? deltaK[i] : !pointAfter ? deltaK[i - 1] : sign(deltaK[i - 1]) !== sign(deltaK[i]) ? 0 : (deltaK[i - 1] + deltaK[i]) / 2; } - monotoneAdjust(points, deltaK, mK); - monotoneCompute(points, mK); + monotoneCompute(points, mK, indexAxis); } - function capControlPoint(pt, min, max) { return Math.max(Math.min(pt, max), min); } - function capBezierPoints(points, area) { var i, ilen, point, inArea, inAreaPrev; - var inAreaNext = _isPointInArea(points[0], area); - for (i = 0, ilen = points.length; i < ilen; ++i) { inAreaPrev = inArea; inArea = inAreaNext; inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area); - if (!inArea) { continue; } - point = points[i]; - if (inAreaPrev) { point.cp1x = capControlPoint(point.cp1x, area.left, area.right); point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom); } - if (inAreaNext) { point.cp2x = capControlPoint(point.cp2x, area.left, area.right); point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom); } } } - - function _updateBezierControlPoints(points, options, area, loop) { + /** + * @private + */ + function _updateBezierControlPoints(points, options, area, loop, indexAxis) { var i, ilen, point, controlPoints; - + // Only consider points that are drawn in case the spanGaps option is used if (options.spanGaps) { points = points.filter(function (pt) { return !pt.skip; }); } - if (options.cubicInterpolationMode === 'monotone') { - splineCurveMonotone(points); + splineCurveMonotone(points, indexAxis); } else { var prev = loop ? points[points.length - 1] : points[0]; - for (i = 0, ilen = points.length; i < ilen; ++i) { point = points[i]; controlPoints = splineCurve(prev, point, points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen], options.tension); point.cp1x = controlPoints.previous.x; point.cp1y = controlPoints.previous.y; point.cp2x = controlPoints.next.x; point.cp2y = controlPoints.next.y; prev = point; } } - if (options.capBezierPoints) { capBezierPoints(points, area); } } + /** + * Note: typedefs are auto-exported, so use a made-up `dom` namespace where + * necessary to avoid duplicates with `export * from './helpers`; see + * https://github.com/microsoft/TypeScript/issues/46011 + * @typedef { import('../core/core.controller.js').default } dom.Chart + * @typedef { import('../../types').ChartEvent } ChartEvent + */ /** + * @private + */ + function _isDomSupported() { + return typeof window !== 'undefined' && typeof document !== 'undefined'; + } + /** + * @private + */ function _getParentNode(domNode) { var parent = domNode.parentNode; - if (parent && parent.toString() === '[object ShadowRoot]') { parent = parent.host; } - return parent; } - + /** + * convert max-width/max-height values that may be percentages into a number + * @private + */ function parseMaxStyle(styleValue, node, parentProperty) { var valueInPixels; - if (typeof styleValue === 'string') { valueInPixels = parseInt(styleValue, 10); - if (styleValue.indexOf('%') !== -1) { + // percentage * size in dimension valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty]; } } else { valueInPixels = styleValue; } - return valueInPixels; } - var getComputedStyle = function getComputedStyle(element) { - return window.getComputedStyle(element, null); + return element.ownerDocument.defaultView.getComputedStyle(element, null); }; - function getStyle(el, property) { return getComputedStyle(el).getPropertyValue(property); } - var positions = ['top', 'right', 'bottom', 'left']; - function getPositionedStyle(styles, style, suffix) { var result = {}; suffix = suffix ? '-' + suffix : ''; - for (var i = 0; i < 4; i++) { var pos = positions[i]; result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0; } - result.width = result.left + result.right; result.height = result.top + result.bottom; return result; } - var useOffsetPos = function useOffsetPos(x, y, target) { return (x > 0 || y > 0) && (!target || !target.shadowRoot); }; - - function getCanvasPosition(evt, canvas) { - var e = evt.native || evt; + /** + * @param e + * @param canvas + * @returns Canvas position + */ + function getCanvasPosition(e, canvas) { var touches = e.touches; var source = touches && touches.length ? touches[0] : e; var offsetX = source.offsetX, - offsetY = source.offsetY; + offsetY = source.offsetY; var box = false; var x, y; - if (useOffsetPos(offsetX, offsetY, e.target)) { x = offsetX; y = offsetY; } else { var rect = canvas.getBoundingClientRect(); x = source.clientX - rect.left; y = source.clientY - rect.top; box = true; } - return { x: x, y: y, box: box }; } - - function getRelativePosition$1(evt, chart) { + /** + * Gets an event's x, y coordinates, relative to the chart area + * @param event + * @param chart + * @returns x and y coordinates of the event + */ + function getRelativePosition(event, chart) { + if ('native' in event) { + return event; + } var canvas = chart.canvas, - currentDevicePixelRatio = chart.currentDevicePixelRatio; + currentDevicePixelRatio = chart.currentDevicePixelRatio; var style = getComputedStyle(canvas); var borderBox = style.boxSizing === 'border-box'; var paddings = getPositionedStyle(style, 'padding'); var borders = getPositionedStyle(style, 'border', 'width'); - - var _getCanvasPosition = getCanvasPosition(evt, canvas), - x = _getCanvasPosition.x, - y = _getCanvasPosition.y, - box = _getCanvasPosition.box; - + var _getCanvasPosition = getCanvasPosition(event, canvas), + x = _getCanvasPosition.x, + y = _getCanvasPosition.y, + box = _getCanvasPosition.box; var xOffset = paddings.left + (box && borders.left); var yOffset = paddings.top + (box && borders.top); var width = chart.width, - height = chart.height; - + height = chart.height; if (borderBox) { width -= paddings.width + borders.width; height -= paddings.height + borders.height; } - return { x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio), y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio) }; } - function getContainerSize(canvas, width, height) { var maxWidth, maxHeight; - if (width === undefined || height === undefined) { var container = _getParentNode(canvas); - if (!container) { width = canvas.clientWidth; height = canvas.clientHeight; } else { - var rect = container.getBoundingClientRect(); + var rect = container.getBoundingClientRect(); // this is the border box of the container var containerStyle = getComputedStyle(container); var containerBorder = getPositionedStyle(containerStyle, 'border', 'width'); var containerPadding = getPositionedStyle(containerStyle, 'padding'); width = rect.width - containerPadding.width - containerBorder.width; height = rect.height - containerPadding.height - containerBorder.height; maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth'); maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight'); } } - return { width: width, height: height, maxWidth: maxWidth || INFINITY, maxHeight: maxHeight || INFINITY }; } - var round1 = function round1(v) { return Math.round(v * 10) / 10; }; - + // eslint-disable-next-line complexity function getMaximumSize(canvas, bbWidth, bbHeight, aspectRatio) { var style = getComputedStyle(canvas); var margins = getPositionedStyle(style, 'margin'); var maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY; var maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY; var containerSize = getContainerSize(canvas, bbWidth, bbHeight); var width = containerSize.width, - height = containerSize.height; - + height = containerSize.height; if (style.boxSizing === 'content-box') { var borders = getPositionedStyle(style, 'border', 'width'); var paddings = getPositionedStyle(style, 'padding'); width -= paddings.width + borders.width; height -= paddings.height + borders.height; } - width = Math.max(0, width - margins.width); - height = Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height - margins.height); + height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height); width = round1(Math.min(width, maxWidth, containerSize.maxWidth)); height = round1(Math.min(height, maxHeight, containerSize.maxHeight)); - if (width && !height) { + // https://github.com/chartjs/Chart.js/issues/4659 + // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default) height = round1(width / 2); } - + var maintainHeight = bbWidth !== undefined || bbHeight !== undefined; + if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) { + height = containerSize.height; + width = round1(Math.floor(height * aspectRatio)); + } return { width: width, height: height }; } - + /** + * @param chart + * @param forceRatio + * @param forceStyle + * @returns True if the canvas context size or transformation has changed. + */ function retinaScale(chart, forceRatio, forceStyle) { - var pixelRatio = chart.currentDevicePixelRatio = forceRatio || 1; - var canvas = chart.canvas, - width = chart.width, - height = chart.height; - canvas.height = height * pixelRatio; - canvas.width = width * pixelRatio; - chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0); - + var pixelRatio = forceRatio || 1; + var deviceHeight = Math.floor(chart.height * pixelRatio); + var deviceWidth = Math.floor(chart.width * pixelRatio); + chart.height = Math.floor(chart.height); + chart.width = Math.floor(chart.width); + var canvas = chart.canvas; + // If no style has been set on the canvas, the render size is used as display size, + // making the chart visually bigger, so let's enforce it to the "correct" values. + // See https://github.com/chartjs/Chart.js/issues/3575 if (canvas.style && (forceStyle || !canvas.style.height && !canvas.style.width)) { - canvas.style.height = height + 'px'; - canvas.style.width = width + 'px'; + canvas.style.height = "".concat(chart.height, "px"); + canvas.style.width = "".concat(chart.width, "px"); } + if (chart.currentDevicePixelRatio !== pixelRatio || canvas.height !== deviceHeight || canvas.width !== deviceWidth) { + chart.currentDevicePixelRatio = pixelRatio; + canvas.height = deviceHeight; + canvas.width = deviceWidth; + chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0); + return true; + } + return false; } - + /** + * Detects support for options object argument in addEventListener. + * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support + * @private + */ var supportsEventListenerOptions = function () { var passiveSupported = false; - try { var options = { get passive() { passiveSupported = true; return false; } - }; window.addEventListener('test', null, options); window.removeEventListener('test', null, options); - } catch (e) {} - + } catch (e) { + // continue regardless of error + } return passiveSupported; }(); - + /** + * The "used" size is the final value of a dimension property after all calculations have + * been performed. This method uses the computed style of `element` but returns undefined + * if the computed style is not expressed in pixels. That can happen in some cases where + * `element` has a size relative to its parent and this last one is not yet displayed, + * for example because of `display: none` on a parent node. + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value + * @returns Size in pixels or undefined if unknown. + */ function readUsedSize(element, property) { var value = getStyle(element, property); var matches = value && value.match(/^(\d+)(\.\d+)?px$/); return matches ? +matches[1] : undefined; } + /** + * @private + */ function _pointInLine(p1, p2, t, mode) { return { x: p1.x + t * (p2.x - p1.x), y: p1.y + t * (p2.y - p1.y) }; } - + /** + * @private + */ function _steppedInterpolation(p1, p2, t, mode) { return { x: p1.x + t * (p2.x - p1.x), y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y : mode === 'after' ? t < 1 ? p1.y : p2.y : t > 0 ? p2.y : p1.y }; } - + /** + * @private + */ function _bezierInterpolation(p1, p2, t, mode) { var cp1 = { x: p1.cp2x, y: p1.cp2y }; var cp2 = { x: p2.cp1x, y: p2.cp1y }; - var a = _pointInLine(p1, cp1, t); - var b = _pointInLine(cp1, cp2, t); - var c = _pointInLine(cp2, p2, t); - var d = _pointInLine(a, b, t); - var e = _pointInLine(b, c, t); - return _pointInLine(d, e, t); } - - var intlCache = new Map(); - - function getNumberFormat(locale, options) { - options = options || {}; - var cacheKey = locale + JSON.stringify(options); - var formatter = intlCache.get(cacheKey); - - if (!formatter) { - formatter = new Intl.NumberFormat(locale, options); - intlCache.set(cacheKey, formatter); - } - - return formatter; - } - - function formatNumber(num, locale, options) { - return getNumberFormat(locale, options).format(num); - } - var getRightToLeftAdapter = function getRightToLeftAdapter(rectX, width) { return { x: function x(_x) { return rectX + rectX + width - _x; }, @@ -3180,22 +3551,20 @@ }, textAlign: function textAlign(align) { if (align === 'center') { return align; } - return align === 'right' ? 'left' : 'right'; }, xPlus: function xPlus(x, value) { return x - value; }, leftForLtr: function leftForLtr(x, itemWidth) { return x - itemWidth; } }; }; - var getLeftToRightAdapter = function getLeftToRightAdapter() { return { x: function x(_x2) { return _x2; }, @@ -3209,233 +3578,207 @@ leftForLtr: function leftForLtr(x, _itemWidth) { return x; } }; }; - function getRtlAdapter(rtl, rectX, width) { return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter(); } - function overrideTextDirection(ctx, direction) { var style, original; - if (direction === 'ltr' || direction === 'rtl') { style = ctx.canvas.style; original = [style.getPropertyValue('direction'), style.getPropertyPriority('direction')]; style.setProperty('direction', direction, 'important'); ctx.prevTextDirection = original; } } - function restoreTextDirection(ctx, original) { if (original !== undefined) { delete ctx.prevTextDirection; ctx.canvas.style.setProperty('direction', original[0], original[1]); } } - function propertyFn(property) { if (property === 'angle') { return { between: _angleBetween, compare: _angleDiff, normalize: _normalizeAngle }; } - return { - between: function between(n, s, e) { - return n >= s && n <= e; - }, + between: _isBetween, compare: function compare(a, b) { return a - b; }, normalize: function normalize(x) { return x; } }; } - - function makeSubSegment(start, end, loop, count) { + function normalizeSegment(_ref) { + var start = _ref.start, + end = _ref.end, + count = _ref.count, + loop = _ref.loop, + style = _ref.style; return { start: start % count, end: end % count, - loop: loop && (end - start + 1) % count === 0 + loop: loop && (end - start + 1) % count === 0, + style: style }; } - function getSegment(segment, points, bounds) { var property = bounds.property, - startBound = bounds.start, - endBound = bounds.end; - + startBound = bounds.start, + endBound = bounds.end; var _propertyFn = propertyFn(property), - between = _propertyFn.between, - normalize = _propertyFn.normalize; - + between = _propertyFn.between, + normalize = _propertyFn.normalize; var count = points.length; var start = segment.start, - end = segment.end, - loop = segment.loop; + end = segment.end, + loop = segment.loop; var i, ilen; - if (loop) { start += count; end += count; - for (i = 0, ilen = count; i < ilen; ++i) { if (!between(normalize(points[start % count][property]), startBound, endBound)) { break; } - start--; end--; } - start %= count; end %= count; } - if (end < start) { end += count; } - return { start: start, end: end, - loop: loop + loop: loop, + style: segment.style }; } - function _boundSegment(segment, points, bounds) { if (!bounds) { return [segment]; } - var property = bounds.property, - startBound = bounds.start, - endBound = bounds.end; + startBound = bounds.start, + endBound = bounds.end; var count = points.length; - var _propertyFn2 = propertyFn(property), - compare = _propertyFn2.compare, - between = _propertyFn2.between, - normalize = _propertyFn2.normalize; - + compare = _propertyFn2.compare, + between = _propertyFn2.between, + normalize = _propertyFn2.normalize; var _getSegment = getSegment(segment, points, bounds), - start = _getSegment.start, - end = _getSegment.end, - loop = _getSegment.loop; - + start = _getSegment.start, + end = _getSegment.end, + loop = _getSegment.loop, + style = _getSegment.style; var result = []; var inside = false; var subStart = null; var value, point, prevValue; - var startIsBefore = function startIsBefore() { return between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0; }; - var endIsBefore = function endIsBefore() { return compare(endBound, value) === 0 || between(endBound, prevValue, value); }; - var shouldStart = function shouldStart() { return inside || startIsBefore(); }; - var shouldStop = function shouldStop() { return !inside || endIsBefore(); }; - for (var i = start, prev = start; i <= end; ++i) { point = points[i % count]; - if (point.skip) { continue; } - value = normalize(point[property]); + if (value === prevValue) { + continue; + } inside = between(value, startBound, endBound); - if (subStart === null && shouldStart()) { subStart = compare(value, startBound) === 0 ? i : prev; } - if (subStart !== null && shouldStop()) { - result.push(makeSubSegment(subStart, i, loop, count)); + result.push(normalizeSegment({ + start: subStart, + end: i, + loop: loop, + count: count, + style: style + })); subStart = null; } - prev = i; prevValue = value; } - if (subStart !== null) { - result.push(makeSubSegment(subStart, end, loop, count)); + result.push(normalizeSegment({ + start: subStart, + end: end, + loop: loop, + count: count, + style: style + })); } - return result; } - function _boundSegments(line, bounds) { var result = []; var segments = line.segments; - for (var i = 0; i < segments.length; i++) { var sub = _boundSegment(segments[i], line.points, bounds); - if (sub.length) { result.push.apply(result, _toConsumableArray(sub)); } } - return result; } - function findStartAndEnd(points, count, loop, spanGaps) { var start = 0; var end = count - 1; - if (loop && !spanGaps) { while (start < count && !points[start].skip) { start++; } } - while (start < count && points[start].skip) { start++; } - start %= count; - if (loop) { end += start; } - while (end > start && points[end % count].skip) { end--; } - end %= count; return { start: start, end: end }; } - function solidSegments(points, start, max, loop) { var count = points.length; var result = []; var last = start; var prev = points[start]; var end; - for (end = start + 1; end <= max; ++end) { var cur = points[end % count]; - if (cur.skip || cur.stop) { if (!prev.skip) { loop = false; result.push({ start: start % count, @@ -3444,173 +3787,234 @@ }); start = last = cur.stop ? end : null; } } else { last = end; - if (prev.skip) { start = end; } } - prev = cur; } - if (last !== null) { result.push({ start: start % count, end: last % count, loop: loop }); } - return result; } - - function _computeSegments(line) { + function _computeSegments(line, segmentOptions) { var points = line.points; var spanGaps = line.options.spanGaps; var count = points.length; - if (!count) { return []; } - var loop = !!line._loop; - var _findStartAndEnd = findStartAndEnd(points, count, loop, spanGaps), - start = _findStartAndEnd.start, - end = _findStartAndEnd.end; - + start = _findStartAndEnd.start, + end = _findStartAndEnd.end; if (spanGaps === true) { - return [{ + return splitByStyles(line, [{ start: start, end: end, loop: loop - }]; + }], points, segmentOptions); } - var max = end < start ? end + count : end; var completeLoop = !!line._fullLoop && start === 0 && end === count - 1; - return solidSegments(points, start, max, completeLoop); + return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions); } + function splitByStyles(line, segments, points, segmentOptions) { + if (!segmentOptions || !segmentOptions.setContext || !points) { + return segments; + } + return doSplitByStyles(line, segments, points, segmentOptions); + } + function doSplitByStyles(line, segments, points, segmentOptions) { + var chartContext = line._chart.getContext(); + var baseStyle = readStyle(line.options); + var datasetIndex = line._datasetIndex, + spanGaps = line.options.spanGaps; + var count = points.length; + var result = []; + var prevStyle = baseStyle; + var start = segments[0].start; + var i = start; + function addStyle(s, e, l, st) { + var dir = spanGaps ? -1 : 1; + if (s === e) { + return; + } + s += count; + while (points[s % count].skip) { + s -= dir; + } + while (points[e % count].skip) { + e += dir; + } + if (s % count !== e % count) { + result.push({ + start: s % count, + end: e % count, + loop: l, + style: st + }); + prevStyle = st; + start = e % count; + } + } + var _iterator11 = _createForOfIteratorHelper$1(segments), + _step11; + try { + for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) { + var segment = _step11.value; + start = spanGaps ? start : segment.start; + var prev = points[start % count]; + var style = void 0; + for (i = start + 1; i <= segment.end; i++) { + var pt = points[i % count]; + style = readStyle(segmentOptions.setContext(createContext(chartContext, { + type: 'segment', + p0: prev, + p1: pt, + p0DataIndex: (i - 1) % count, + p1DataIndex: i % count, + datasetIndex: datasetIndex + }))); + if (styleChanged(style, prevStyle)) { + addStyle(start, i - 1, segment.loop, prevStyle); + } + prev = pt; + prevStyle = style; + } + if (start < i - 1) { + addStyle(start, i - 1, segment.loop, prevStyle); + } + } + } catch (err) { + _iterator11.e(err); + } finally { + _iterator11.f(); + } + return result; + } + function readStyle(options) { + return { + backgroundColor: options.backgroundColor, + borderCapStyle: options.borderCapStyle, + borderDash: options.borderDash, + borderDashOffset: options.borderDashOffset, + borderJoinStyle: options.borderJoinStyle, + borderWidth: options.borderWidth, + borderColor: options.borderColor + }; + } + function styleChanged(style, prevStyle) { + return prevStyle && JSON.stringify(style) !== JSON.stringify(prevStyle); + } var Animator = /*#__PURE__*/function () { function Animator() { - _classCallCheck(this, Animator); - + _classCallCheck$x(this, Animator); this._request = null; this._charts = new Map(); this._running = false; this._lastDate = undefined; } - - _createClass(Animator, [{ + _createClass$x(Animator, [{ key: "_notify", value: function _notify(chart, anims, date, type) { var callbacks = anims.listeners[type]; var numSteps = anims.duration; callbacks.forEach(function (fn) { return fn({ chart: chart, + initial: anims.initial, numSteps: numSteps, currentStep: Math.min(date - anims.start, numSteps) }); }); } }, { key: "_refresh", value: function _refresh() { - var me = this; - - if (me._request) { + var _this = this; + if (this._request) { return; } - - me._running = true; - me._request = requestAnimFrame.call(window, function () { - me._update(); - - me._request = null; - - if (me._running) { - me._refresh(); + this._running = true; + this._request = requestAnimFrame.call(window, function () { + _this._update(); + _this._request = null; + if (_this._running) { + _this._refresh(); } }); } }, { key: "_update", value: function _update() { + var _this2 = this; var date = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Date.now(); - var me = this; var remaining = 0; - - me._charts.forEach(function (anims, chart) { + this._charts.forEach(function (anims, chart) { if (!anims.running || !anims.items.length) { return; } - var items = anims.items; var i = items.length - 1; var draw = false; var item; - for (; i >= 0; --i) { item = items[i]; - if (item._active) { if (item._total > anims.duration) { anims.duration = item._total; } - item.tick(date); draw = true; } else { items[i] = items[items.length - 1]; items.pop(); } } - if (draw) { chart.draw(); - - me._notify(chart, anims, date, 'progress'); + _this2._notify(chart, anims, date, 'progress'); } - if (!items.length) { anims.running = false; - - me._notify(chart, anims, date, 'complete'); + _this2._notify(chart, anims, date, 'complete'); + anims.initial = false; } - remaining += items.length; }); - - me._lastDate = date; - + this._lastDate = date; if (remaining === 0) { - me._running = false; + this._running = false; } } }, { key: "_getAnims", value: function _getAnims(chart) { var charts = this._charts; var anims = charts.get(chart); - if (!anims) { anims = { running: false, + initial: true, items: [], listeners: { complete: [], progress: [] } }; charts.set(chart, anims); } - return anims; } }, { key: "listen", value: function listen(chart, event, cb) { @@ -3618,15 +4022,13 @@ } }, { key: "add", value: function add(chart, items) { var _this$_getAnims$items; - if (!items || !items.length) { return; } - (_this$_getAnims$items = this._getAnims(chart).items).push.apply(_this$_getAnims$items, _toConsumableArray(items)); } }, { key: "has", value: function has(chart) { @@ -3634,172 +4036,142 @@ } }, { key: "start", value: function start(chart) { var anims = this._charts.get(chart); - if (!anims) { return; } - anims.running = true; anims.start = Date.now(); anims.duration = anims.items.reduce(function (acc, cur) { return Math.max(acc, cur._duration); }, 0); - this._refresh(); } }, { key: "running", value: function running(chart) { if (!this._running) { return false; } - var anims = this._charts.get(chart); - if (!anims || !anims.running || !anims.items.length) { return false; } - return true; } }, { key: "stop", value: function stop(chart) { var anims = this._charts.get(chart); - if (!anims || !anims.items.length) { return; } - var items = anims.items; var i = items.length - 1; - for (; i >= 0; --i) { items[i].cancel(); } - anims.items = []; - this._notify(chart, anims, Date.now(), 'complete'); } }, { key: "remove", value: function remove(chart) { - return this._charts.delete(chart); + return this._charts["delete"](chart); } }]); - return Animator; }(); - - var animator = new Animator(); + var animator = /* #__PURE__ */new Animator(); var transparent = 'transparent'; var interpolators = { - boolean: function boolean(from, to, factor) { + "boolean": function boolean(from, to, factor) { return factor > 0.5 ? to : from; }, color: function color$1(from, to, factor) { var c0 = color(from || transparent); - var c1 = c0.valid && color(to || transparent); - return c1 && c1.valid ? c1.mix(c0, factor).hexString() : to; }, number: function number(from, to, factor) { return from + (to - from) * factor; } }; - var Animation = /*#__PURE__*/function () { function Animation(cfg, target, prop, to) { - _classCallCheck(this, Animation); - + _classCallCheck$x(this, Animation); var currentValue = target[prop]; to = resolve([cfg.to, to, currentValue, cfg.from]); var from = resolve([cfg.from, currentValue, to]); this._active = true; - this._fn = cfg.fn || interpolators[cfg.type || _typeof(from)]; + this._fn = cfg.fn || interpolators[cfg.type || _typeof$z(from)]; this._easing = effects[cfg.easing] || effects.linear; this._start = Math.floor(Date.now() + (cfg.delay || 0)); this._duration = this._total = Math.floor(cfg.duration); this._loop = !!cfg.loop; this._target = target; this._prop = prop; this._from = from; this._to = to; this._promises = undefined; } - - _createClass(Animation, [{ + _createClass$x(Animation, [{ key: "active", value: function active() { return this._active; } }, { key: "update", value: function update(cfg, to, date) { - var me = this; - - if (me._active) { - me._notify(false); - - var currentValue = me._target[me._prop]; - var elapsed = date - me._start; - var remain = me._duration - elapsed; - me._start = date; - me._duration = Math.floor(Math.max(remain, cfg.duration)); - me._total += elapsed; - me._loop = !!cfg.loop; - me._to = resolve([cfg.to, to, currentValue, cfg.from]); - me._from = resolve([cfg.from, currentValue, to]); + if (this._active) { + this._notify(false); + var currentValue = this._target[this._prop]; + var elapsed = date - this._start; + var remain = this._duration - elapsed; + this._start = date; + this._duration = Math.floor(Math.max(remain, cfg.duration)); + this._total += elapsed; + this._loop = !!cfg.loop; + this._to = resolve([cfg.to, to, currentValue, cfg.from]); + this._from = resolve([cfg.from, currentValue, to]); } } }, { key: "cancel", value: function cancel() { - var me = this; - - if (me._active) { - me.tick(Date.now()); - me._active = false; - - me._notify(false); + if (this._active) { + this.tick(Date.now()); + this._active = false; + this._notify(false); } } }, { key: "tick", value: function tick(date) { - var me = this; - var elapsed = date - me._start; - var duration = me._duration; - var prop = me._prop; - var from = me._from; - var loop = me._loop; - var to = me._to; + var elapsed = date - this._start; + var duration = this._duration; + var prop = this._prop; + var from = this._from; + var loop = this._loop; + var to = this._to; var factor; - me._active = from !== to && (loop || elapsed < duration); - - if (!me._active) { - me._target[prop] = to; - - me._notify(true); - + this._active = from !== to && (loop || elapsed < duration); + if (!this._active) { + this._target[prop] = to; + this._notify(true); return; } - if (elapsed < 0) { - me._target[prop] = from; + this._target[prop] = from; return; } - factor = elapsed / duration % 2; factor = loop && factor > 1 ? 2 - factor : factor; - factor = me._easing(Math.min(1, Math.max(0, factor))); - me._target[prop] = me._fn(from, to, factor); + factor = this._easing(Math.min(1, Math.max(0, factor))); + this._target[prop] = this._fn(from, to, factor); } }, { key: "wait", value: function wait() { var promises = this._promises || (this._promises = []); @@ -3813,131 +4185,42 @@ }, { key: "_notify", value: function _notify(resolved) { var method = resolved ? 'res' : 'rej'; var promises = this._promises || []; - for (var i = 0; i < promises.length; i++) { promises[i][method](); } } }]); - return Animation; }(); - - var numbers = ['x', 'y', 'borderWidth', 'radius', 'tension']; - var colors = ['color', 'borderColor', 'backgroundColor']; - defaults.set('animation', { - delay: undefined, - duration: 1000, - easing: 'easeOutQuart', - fn: undefined, - from: undefined, - loop: undefined, - to: undefined, - type: undefined - }); - var animationOptions = Object.keys(defaults.animation); - defaults.describe('animation', { - _fallback: false, - _indexable: false, - _scriptable: function _scriptable(name) { - return name !== 'onProgress' && name !== 'onComplete' && name !== 'fn'; - } - }); - defaults.set('animations', { - colors: { - type: 'color', - properties: colors - }, - numbers: { - type: 'number', - properties: numbers - } - }); - defaults.describe('animations', { - _fallback: 'animation' - }); - defaults.set('transitions', { - active: { - animation: { - duration: 400 - } - }, - resize: { - animation: { - duration: 0 - } - }, - show: { - animations: { - colors: { - from: 'transparent' - }, - visible: { - type: 'boolean', - duration: 0 - } - } - }, - hide: { - animations: { - colors: { - to: 'transparent' - }, - visible: { - type: 'boolean', - easing: 'linear', - fn: function fn(v) { - return v | 0; - } - } - } - } - }); - var Animations = /*#__PURE__*/function () { function Animations(chart, config) { - _classCallCheck(this, Animations); - + _classCallCheck$x(this, Animations); this._chart = chart; this._properties = new Map(); this.configure(config); } - - _createClass(Animations, [{ + _createClass$x(Animations, [{ key: "configure", value: function configure(config) { if (!isObject(config)) { return; } - + var animationOptions = Object.keys(defaults.animation); var animatedProps = this._properties; Object.getOwnPropertyNames(config).forEach(function (key) { var cfg = config[key]; - if (!isObject(cfg)) { return; } - var resolved = {}; - - var _iterator = _createForOfIteratorHelper(animationOptions), - _step; - - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var option = _step.value; - resolved[option] = cfg[option]; - } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); + for (var _i = 0, _animationOptions = animationOptions; _i < _animationOptions.length; _i++) { + var option = _animationOptions[_i]; + resolved[option] = cfg[option]; } - (isArray(cfg.properties) && cfg.properties || [key]).forEach(function (prop) { if (prop === key || !animatedProps.has(prop)) { animatedProps.set(prop, resolved); } }); @@ -3946,23 +4229,19 @@ }, { key: "_animateOptions", value: function _animateOptions(target, values) { var newOptions = values.options; var options = resolveTargetOptions(target, newOptions); - if (!options) { return []; } - var animations = this._createAnimations(options, newOptions); - if (newOptions.$shared) { awaitAll(target.options.$animations, newOptions).then(function () { target.options = newOptions; }, function () {}); } - return animations; } }, { key: "_createAnimations", value: function _createAnimations(target, values) { @@ -3970,327 +4249,304 @@ var animations = []; var running = target.$animations || (target.$animations = {}); var props = Object.keys(values); var date = Date.now(); var i; - for (i = props.length - 1; i >= 0; --i) { var prop = props[i]; - if (prop.charAt(0) === '$') { continue; } - if (prop === 'options') { animations.push.apply(animations, _toConsumableArray(this._animateOptions(target, values))); continue; } - var value = values[prop]; var animation = running[prop]; var cfg = animatedProps.get(prop); - if (animation) { if (cfg && animation.active()) { animation.update(cfg, value, date); continue; } else { animation.cancel(); } } - if (!cfg || !cfg.duration) { target[prop] = value; continue; } - running[prop] = animation = new Animation(cfg, target, prop, value); animations.push(animation); } - return animations; } }, { key: "update", value: function update(target, values) { if (this._properties.size === 0) { Object.assign(target, values); return; } - var animations = this._createAnimations(target, values); - if (animations.length) { animator.add(this._chart, animations); return true; } } }]); - return Animations; }(); - function awaitAll(animations, properties) { var running = []; var keys = Object.keys(properties); - for (var i = 0; i < keys.length; i++) { var anim = animations[keys[i]]; - if (anim && anim.active()) { running.push(anim.wait()); } } - return Promise.all(running); } - function resolveTargetOptions(target, newOptions) { if (!newOptions) { return; } - var options = target.options; - if (!options) { target.options = newOptions; return; } - if (options.$shared) { target.options = options = Object.assign({}, options, { $shared: false, $animations: {} }); } - return options; } - function scaleClip(scale, allowedOverflow) { var opts = scale && scale.options || {}; var reverse = opts.reverse; var min = opts.min === undefined ? allowedOverflow : 0; var max = opts.max === undefined ? allowedOverflow : 0; return { start: reverse ? max : min, end: reverse ? min : max }; } - function defaultClip(xScale, yScale, allowedOverflow) { if (allowedOverflow === false) { return false; } - var x = scaleClip(xScale, allowedOverflow); var y = scaleClip(yScale, allowedOverflow); return { top: y.end, right: x.end, bottom: y.start, left: x.start }; } - function toClip(value) { var t, r, b, l; - if (isObject(value)) { t = value.top; r = value.right; b = value.bottom; l = value.left; } else { t = r = b = l = value; } - return { top: t, right: r, bottom: b, - left: l + left: l, + disabled: value === false }; } - function getSortedDatasetIndices(chart, filterVisible) { var keys = []; - var metasets = chart._getSortedDatasetMetas(filterVisible); - var i, ilen; - for (i = 0, ilen = metasets.length; i < ilen; ++i) { keys.push(metasets[i].index); } - return keys; } - - function _applyStack(stack, value, dsIndex, options) { + function _applyStack(stack, value, dsIndex) { + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; var keys = stack.keys; var singleMode = options.mode === 'single'; var i, ilen, datasetIndex, otherValue; - if (value === null) { return; } - for (i = 0, ilen = keys.length; i < ilen; ++i) { datasetIndex = +keys[i]; - if (datasetIndex === dsIndex) { if (options.all) { continue; } - break; } - otherValue = stack.values[datasetIndex]; - if (isNumberFinite(otherValue) && (singleMode || value === 0 || sign(value) === sign(otherValue))) { value += otherValue; } } - return value; } - function convertObjectDataToArray(data) { var keys = Object.keys(data); var adata = new Array(keys.length); var i, ilen, key; - for (i = 0, ilen = keys.length; i < ilen; ++i) { key = keys[i]; adata[i] = { x: key, y: data[key] }; } - return adata; } - function isStacked(scale, meta) { var stacked = scale && scale.options.stacked; return stacked || stacked === undefined && meta.stack !== undefined; } - function getStackKey(indexScale, valueScale, meta) { - return indexScale.id + '.' + valueScale.id + '.' + meta.stack + '.' + meta.type; + return "".concat(indexScale.id, ".").concat(valueScale.id, ".").concat(meta.stack || meta.type); } - function getUserBounds(scale) { var _scale$getUserBounds = scale.getUserBounds(), - min = _scale$getUserBounds.min, - max = _scale$getUserBounds.max, - minDefined = _scale$getUserBounds.minDefined, - maxDefined = _scale$getUserBounds.maxDefined; - + min = _scale$getUserBounds.min, + max = _scale$getUserBounds.max, + minDefined = _scale$getUserBounds.minDefined, + maxDefined = _scale$getUserBounds.maxDefined; return { min: minDefined ? min : Number.NEGATIVE_INFINITY, max: maxDefined ? max : Number.POSITIVE_INFINITY }; } - function getOrCreateStack(stacks, stackKey, indexValue) { var subStack = stacks[stackKey] || (stacks[stackKey] = {}); return subStack[indexValue] || (subStack[indexValue] = {}); } - + function getLastIndexInStack(stack, vScale, positive, type) { + var _iterator = _createForOfIteratorHelper$1(vScale.getMatchingVisibleMetas(type).reverse()), + _step; + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var meta = _step.value; + var value = stack[meta.index]; + if (positive && value > 0 || !positive && value < 0) { + return meta.index; + } + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + return null; + } function updateStacks(controller, parsed) { var chart = controller.chart, - meta = controller._cachedMeta; + meta = controller._cachedMeta; var stacks = chart._stacks || (chart._stacks = {}); var iScale = meta.iScale, - vScale = meta.vScale, - datasetIndex = meta.index; + vScale = meta.vScale, + datasetIndex = meta.index; var iAxis = iScale.axis; var vAxis = vScale.axis; var key = getStackKey(iScale, vScale, meta); var ilen = parsed.length; var stack; - for (var i = 0; i < ilen; ++i) { var item = parsed[i]; - var index = item[iAxis], - value = item[vAxis]; + var _index = item[iAxis], + value = item[vAxis]; var itemStacks = item._stacks || (item._stacks = {}); - stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index); + stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, _index); stack[datasetIndex] = value; + stack._top = getLastIndexInStack(stack, vScale, true, meta.type); + stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type); + var visualValues = stack._visualValues || (stack._visualValues = {}); + visualValues[datasetIndex] = value; } } - function getFirstScaleId(chart, axis) { var scales = chart.scales; return Object.keys(scales).filter(function (key) { return scales[key].axis === axis; }).shift(); } - function createDatasetContext(parent, index) { - return Object.assign(Object.create(parent), { + return createContext(parent, { active: false, dataset: undefined, datasetIndex: index, index: index, mode: 'default', type: 'dataset' }); } - function createDataContext(parent, index, element) { - return Object.assign(Object.create(parent), { + return createContext(parent, { active: false, dataIndex: index, parsed: undefined, raw: undefined, element: element, index: index, mode: 'default', type: 'data' }); } - function clearStacks(meta, items) { + var datasetIndex = meta.controller.index; + var axis = meta.vScale && meta.vScale.axis; + if (!axis) { + return; + } items = items || meta._parsed; - - var _iterator2 = _createForOfIteratorHelper(items), - _step2; - + var _iterator2 = _createForOfIteratorHelper$1(items), + _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var parsed = _step2.value; var stacks = parsed._stacks; - - if (!stacks || stacks[meta.vScale.id] === undefined || stacks[meta.vScale.id][meta.index] === undefined) { + if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) { return; } - - delete stacks[meta.vScale.id][meta.index]; + delete stacks[axis][datasetIndex]; + if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) { + delete stacks[axis]._visualValues[datasetIndex]; + } } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } } - var isDirectUpdateMode = function isDirectUpdateMode(mode) { return mode === 'reset' || mode === 'none'; }; - var cloneIfNotShared = function cloneIfNotShared(cached, shared) { return shared ? cached : Object.assign({}, cached); }; - + var createStack = function createStack(canStack, meta, chart) { + return canStack && !meta.hidden && meta._stacked && { + keys: getSortedDatasetIndices(chart, true), + values: null + }; + }; var DatasetController = /*#__PURE__*/function () { function DatasetController(chart, datasetIndex) { - _classCallCheck(this, DatasetController); - + _classCallCheck$x(this, DatasetController); this.chart = chart; this._ctx = chart.ctx; this.index = datasetIndex; this._cachedDataOpts = {}; this._cachedMeta = this.getMeta(); @@ -4301,52 +4557,57 @@ this._objectData = undefined; this._sharedOptions = undefined; this._drawStart = undefined; this._drawCount = undefined; this.enableOptionSharing = false; + this.supportsDecimation = false; this.$context = undefined; + this._syncList = []; + this.datasetElementType = (this instanceof DatasetController ? this.constructor : void 0).datasetElementType; + this.dataElementType = (this instanceof DatasetController ? this.constructor : void 0).dataElementType; this.initialize(); } - - _createClass(DatasetController, [{ + _createClass$x(DatasetController, [{ key: "initialize", value: function initialize() { - var me = this; - var meta = me._cachedMeta; - me.configure(); - me.linkScales(); + var meta = this._cachedMeta; + this.configure(); + this.linkScales(); meta._stacked = isStacked(meta.vScale, meta); - me.addElements(); + this.addElements(); + if (this.options.fill && !this.chart.isPluginEnabled('filler')) { + console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options"); + } } }, { key: "updateIndex", value: function updateIndex(datasetIndex) { + if (this.index !== datasetIndex) { + clearStacks(this._cachedMeta); + } this.index = datasetIndex; } }, { key: "linkScales", value: function linkScales() { - var me = this; - var chart = me.chart; - var meta = me._cachedMeta; - var dataset = me.getDataset(); - + var chart = this.chart; + var meta = this._cachedMeta; + var dataset = this.getDataset(); var chooseId = function chooseId(axis, x, y, r) { return axis === 'x' ? x : axis === 'r' ? r : y; }; - var xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x')); var yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y')); var rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r')); var indexAxis = meta.indexAxis; var iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid); var vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid); - meta.xScale = me.getScaleForId(xid); - meta.yScale = me.getScaleForId(yid); - meta.rScale = me.getScaleForId(rid); - meta.iScale = me.getScaleForId(iid); - meta.vScale = me.getScaleForId(vid); + meta.xScale = this.getScaleForId(xid); + meta.yScale = this.getScaleForId(yid); + meta.rScale = this.getScaleForId(rid); + meta.iScale = this.getScaleForId(iid); + meta.vScale = this.getScaleForId(vid); } }, { key: "getDataset", value: function getDataset() { return this.chart.data.datasets[this.index]; @@ -4374,197 +4635,173 @@ } }, { key: "_destroy", value: function _destroy() { var meta = this._cachedMeta; - if (this._data) { unlistenArrayEvents(this._data, this); } - if (meta._stacked) { clearStacks(meta); } } }, { key: "_dataCheck", value: function _dataCheck() { - var me = this; - var dataset = me.getDataset(); + var dataset = this.getDataset(); var data = dataset.data || (dataset.data = []); - + var _data = this._data; if (isObject(data)) { - me._data = convertObjectDataToArray(data); - } else if (me._data !== data) { - if (me._data) { - unlistenArrayEvents(me._data, me); - clearStacks(me._cachedMeta); + this._data = convertObjectDataToArray(data); + } else if (_data !== data) { + if (_data) { + unlistenArrayEvents(_data, this); + var meta = this._cachedMeta; + clearStacks(meta); + meta._parsed = []; } - if (data && Object.isExtensible(data)) { - listenArrayEvents(data, me); + listenArrayEvents(data, this); } - - me._data = data; + this._syncList = []; + this._data = data; } } }, { key: "addElements", value: function addElements() { - var me = this; - var meta = me._cachedMeta; - - me._dataCheck(); - - if (me.datasetElementType) { - meta.dataset = new me.datasetElementType(); + var meta = this._cachedMeta; + this._dataCheck(); + if (this.datasetElementType) { + meta.dataset = new this.datasetElementType(); } } }, { key: "buildOrUpdateElements", value: function buildOrUpdateElements(resetNewElements) { - var me = this; - var meta = me._cachedMeta; - var dataset = me.getDataset(); + var meta = this._cachedMeta; + var dataset = this.getDataset(); var stackChanged = false; - - me._dataCheck(); - + this._dataCheck(); + var oldStacked = meta._stacked; meta._stacked = isStacked(meta.vScale, meta); - if (meta.stack !== dataset.stack) { stackChanged = true; clearStacks(meta); meta.stack = dataset.stack; } - - me._resyncElements(resetNewElements); - - if (stackChanged) { - updateStacks(me, meta._parsed); + this._resyncElements(resetNewElements); + if (stackChanged || oldStacked !== meta._stacked) { + updateStacks(this, meta._parsed); } } }, { key: "configure", value: function configure() { - var me = this; - var config = me.chart.config; - var scopeKeys = config.datasetScopeKeys(me._type); - var scopes = config.getOptionScopes(me.getDataset(), scopeKeys, true); - me.options = config.createResolver(scopes, me.getContext()); - me._parsing = me.options.parsing; + var config = this.chart.config; + var scopeKeys = config.datasetScopeKeys(this._type); + var scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true); + this.options = config.createResolver(scopes, this.getContext()); + this._parsing = this.options.parsing; + this._cachedDataOpts = {}; } }, { key: "parse", value: function parse(start, count) { - var me = this; - var meta = me._cachedMeta, - data = me._data; + var meta = this._cachedMeta, + data = this._data; var iScale = meta.iScale, - _stacked = meta._stacked; + _stacked = meta._stacked; var iAxis = iScale.axis; var sorted = start === 0 && count === data.length ? true : meta._sorted; var prev = start > 0 && meta._parsed[start - 1]; var i, cur, parsed; - - if (me._parsing === false) { + if (this._parsing === false) { meta._parsed = data; meta._sorted = true; + parsed = data; } else { if (isArray(data[start])) { - parsed = me.parseArrayData(meta, data, start, count); + parsed = this.parseArrayData(meta, data, start, count); } else if (isObject(data[start])) { - parsed = me.parseObjectData(meta, data, start, count); + parsed = this.parseObjectData(meta, data, start, count); } else { - parsed = me.parsePrimitiveData(meta, data, start, count); + parsed = this.parsePrimitiveData(meta, data, start, count); } - var isNotInOrderComparedToPrev = function isNotInOrderComparedToPrev() { return cur[iAxis] === null || prev && cur[iAxis] < prev[iAxis]; }; - for (i = 0; i < count; ++i) { meta._parsed[i + start] = cur = parsed[i]; - if (sorted) { if (isNotInOrderComparedToPrev()) { sorted = false; } - prev = cur; } } - meta._sorted = sorted; } - if (_stacked) { - updateStacks(me, parsed); + updateStacks(this, parsed); } } }, { key: "parsePrimitiveData", value: function parsePrimitiveData(meta, data, start, count) { var iScale = meta.iScale, - vScale = meta.vScale; + vScale = meta.vScale; var iAxis = iScale.axis; var vAxis = vScale.axis; var labels = iScale.getLabels(); var singleScale = iScale === vScale; var parsed = new Array(count); var i, ilen, index; - for (i = 0, ilen = count; i < ilen; ++i) { var _parsed$i; - index = i + start; - parsed[i] = (_parsed$i = {}, _defineProperty(_parsed$i, iAxis, singleScale || iScale.parse(labels[index], index)), _defineProperty(_parsed$i, vAxis, vScale.parse(data[index], index)), _parsed$i); + parsed[i] = (_parsed$i = {}, _defineProperty$w(_parsed$i, iAxis, singleScale || iScale.parse(labels[index], index)), _defineProperty$w(_parsed$i, vAxis, vScale.parse(data[index], index)), _parsed$i); } - return parsed; } }, { key: "parseArrayData", value: function parseArrayData(meta, data, start, count) { var xScale = meta.xScale, - yScale = meta.yScale; + yScale = meta.yScale; var parsed = new Array(count); var i, ilen, index, item; - for (i = 0, ilen = count; i < ilen; ++i) { index = i + start; item = data[index]; parsed[i] = { x: xScale.parse(item[0], index), y: yScale.parse(item[1], index) }; } - return parsed; } }, { key: "parseObjectData", value: function parseObjectData(meta, data, start, count) { var xScale = meta.xScale, - yScale = meta.yScale; + yScale = meta.yScale; var _this$_parsing = this._parsing, - _this$_parsing$xAxisK = _this$_parsing.xAxisKey, - xAxisKey = _this$_parsing$xAxisK === void 0 ? 'x' : _this$_parsing$xAxisK, - _this$_parsing$yAxisK = _this$_parsing.yAxisKey, - yAxisKey = _this$_parsing$yAxisK === void 0 ? 'y' : _this$_parsing$yAxisK; + _this$_parsing$xAxisK = _this$_parsing.xAxisKey, + xAxisKey = _this$_parsing$xAxisK === void 0 ? 'x' : _this$_parsing$xAxisK, + _this$_parsing$yAxisK = _this$_parsing.yAxisKey, + yAxisKey = _this$_parsing$yAxisK === void 0 ? 'y' : _this$_parsing$yAxisK; var parsed = new Array(count); var i, ilen, index, item; - for (i = 0, ilen = count; i < ilen; ++i) { index = i + start; item = data[index]; parsed[i] = { x: xScale.parse(resolveObjectKey(item, xAxisKey), index), y: yScale.parse(resolveObjectKey(item, yAxisKey), index) }; } - return parsed; } }, { key: "getParsed", value: function getParsed(index) { @@ -4581,11 +4818,11 @@ var chart = this.chart; var meta = this._cachedMeta; var value = parsed[scale.axis]; var stack = { keys: getSortedDatasetIndices(chart, true), - values: parsed._stacks[scale.axis] + values: parsed._stacks[scale.axis]._visualValues }; return _applyStack(stack, value, meta.index, { mode: mode }); } @@ -4593,157 +4830,127 @@ key: "updateRangeFromParsed", value: function updateRangeFromParsed(range, scale, parsed, stack) { var parsedValue = parsed[scale.axis]; var value = parsedValue === null ? NaN : parsedValue; var values = stack && parsed._stacks[scale.axis]; - if (stack && values) { stack.values = values; - range.min = Math.min(range.min, value); - range.max = Math.max(range.max, value); - value = _applyStack(stack, parsedValue, this._cachedMeta.index, { - all: true - }); + value = _applyStack(stack, parsedValue, this._cachedMeta.index); } - range.min = Math.min(range.min, value); range.max = Math.max(range.max, value); } }, { key: "getMinMax", value: function getMinMax(scale, canStack) { - var me = this; - var meta = me._cachedMeta; + var meta = this._cachedMeta; var _parsed = meta._parsed; var sorted = meta._sorted && scale === meta.iScale; var ilen = _parsed.length; - - var otherScale = me._getOtherScale(scale); - - var stack = canStack && meta._stacked && { - keys: getSortedDatasetIndices(me.chart, true), - values: null - }; + var otherScale = this._getOtherScale(scale); + var stack = createStack(canStack, meta, this.chart); var range = { min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY }; - var _getUserBounds = getUserBounds(otherScale), - otherMin = _getUserBounds.min, - otherMax = _getUserBounds.max; - - var i, value, parsed, otherValue; - + otherMin = _getUserBounds.min, + otherMax = _getUserBounds.max; + var i, parsed; function _skip() { parsed = _parsed[i]; - value = parsed[scale.axis]; - otherValue = parsed[otherScale.axis]; - return !isNumberFinite(value) || otherMin > otherValue || otherMax < otherValue; + var otherValue = parsed[otherScale.axis]; + return !isNumberFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue; } - for (i = 0; i < ilen; ++i) { if (_skip()) { continue; } - - me.updateRangeFromParsed(range, scale, parsed, stack); - + this.updateRangeFromParsed(range, scale, parsed, stack); if (sorted) { break; } } - if (sorted) { for (i = ilen - 1; i >= 0; --i) { if (_skip()) { continue; } - - me.updateRangeFromParsed(range, scale, parsed, stack); + this.updateRangeFromParsed(range, scale, parsed, stack); break; } } - return range; } }, { key: "getAllParsedValues", value: function getAllParsedValues(scale) { var parsed = this._cachedMeta._parsed; var values = []; var i, ilen, value; - for (i = 0, ilen = parsed.length; i < ilen; ++i) { value = parsed[i][scale.axis]; - if (isNumberFinite(value)) { values.push(value); } } - return values; } }, { key: "getMaxOverflow", value: function getMaxOverflow() { return false; } }, { key: "getLabelAndValue", value: function getLabelAndValue(index) { - var me = this; - var meta = me._cachedMeta; + var meta = this._cachedMeta; var iScale = meta.iScale; var vScale = meta.vScale; - var parsed = me.getParsed(index); + var parsed = this.getParsed(index); return { label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '', value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : '' }; } }, { key: "_update", value: function _update(mode) { - var me = this; - var meta = me._cachedMeta; - me.configure(); - me._cachedDataOpts = {}; - me.update(mode || 'default'); - meta._clip = toClip(valueOrDefault(me.options.clip, defaultClip(meta.xScale, meta.yScale, me.getMaxOverflow()))); + var meta = this._cachedMeta; + this.update(mode || 'default'); + meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow()))); } }, { key: "update", value: function update(mode) {} }, { key: "draw", value: function draw() { - var me = this; - var ctx = me._ctx; - var chart = me.chart; - var meta = me._cachedMeta; + var ctx = this._ctx; + var chart = this.chart; + var meta = this._cachedMeta; var elements = meta.data || []; var area = chart.chartArea; var active = []; - var start = me._drawStart || 0; - var count = me._drawCount || elements.length - start; + var start = this._drawStart || 0; + var count = this._drawCount || elements.length - start; + var drawActiveElementsOnTop = this.options.drawActiveElementsOnTop; var i; - if (meta.dataset) { meta.dataset.draw(ctx, area, start, count); } - for (i = start; i < start + count; ++i) { var element = elements[i]; - - if (element.active) { + if (element.hidden) { + continue; + } + if (element.active && drawActiveElementsOnTop) { active.push(element); } else { element.draw(ctx, area); } } - for (i = 0; i < active.length; ++i) { active[i].draw(ctx, area); } } }, { @@ -4753,24 +4960,23 @@ return index === undefined && this._cachedMeta.dataset ? this.resolveDatasetElementOptions(mode) : this.resolveDataElementOptions(index || 0, mode); } }, { key: "getContext", value: function getContext(index, active, mode) { - var me = this; - var dataset = me.getDataset(); + var dataset = this.getDataset(); var context; - - if (index >= 0 && index < me._cachedMeta.data.length) { - var element = me._cachedMeta.data[index]; - context = element.$context || (element.$context = createDataContext(me.getContext(), index, element)); - context.parsed = me.getParsed(index); + if (index >= 0 && index < this._cachedMeta.data.length) { + var element = this._cachedMeta.data[index]; + context = element.$context || (element.$context = createDataContext(this.getContext(), index, element)); + context.parsed = this.getParsed(index); context.raw = dataset.data[index]; + context.index = context.dataIndex = index; } else { - context = me.$context || (me.$context = createDatasetContext(me.chart.getContext(), me.index)); + context = this.$context || (this.$context = createDatasetContext(this.chart.getContext(), this.index)); context.dataset = dataset; + context.index = context.datasetIndex = this.index; } - context.active = !!active; context.mode = mode; return context; } }, { @@ -4784,87 +4990,86 @@ return this._resolveElementOptions(this.dataElementType.id, mode, index); } }, { key: "_resolveElementOptions", value: function _resolveElementOptions(elementType) { + var _this3 = this; var mode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'default'; var index = arguments.length > 2 ? arguments[2] : undefined; - var me = this; var active = mode === 'active'; - var cache = me._cachedDataOpts; + var cache = this._cachedDataOpts; var cacheKey = elementType + '-' + mode; var cached = cache[cacheKey]; - var sharing = me.enableOptionSharing && defined(index); - + var sharing = this.enableOptionSharing && defined(index); if (cached) { return cloneIfNotShared(cached, sharing); } - - var config = me.chart.config; - var scopeKeys = config.datasetElementScopeKeys(me._type, elementType); + var config = this.chart.config; + var scopeKeys = config.datasetElementScopeKeys(this._type, elementType); var prefixes = active ? ["".concat(elementType, "Hover"), 'hover', elementType, ''] : [elementType, '']; - var scopes = config.getOptionScopes(me.getDataset(), scopeKeys); + var scopes = config.getOptionScopes(this.getDataset(), scopeKeys); var names = Object.keys(defaults.elements[elementType]); - var context = function context() { - return me.getContext(index, active); + return _this3.getContext(index, active, mode); }; - var values = config.resolveNamedOptions(scopes, names, context, prefixes); - if (values.$shared) { values.$shared = sharing; cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing)); } - return values; } }, { key: "_resolveAnimations", value: function _resolveAnimations(index, transition, active) { - var me = this; - var chart = me.chart; - var cache = me._cachedDataOpts; + var chart = this.chart; + var cache = this._cachedDataOpts; var cacheKey = "animation-".concat(transition); var cached = cache[cacheKey]; - if (cached) { return cached; } - var options; - if (chart.options.animation !== false) { - var config = me.chart.config; - var scopeKeys = config.datasetAnimationScopeKeys(me._type, transition); - var scopes = config.getOptionScopes(me.getDataset(), scopeKeys); - options = config.createResolver(scopes, me.getContext(index, active, transition)); + var config = this.chart.config; + var scopeKeys = config.datasetAnimationScopeKeys(this._type, transition); + var scopes = config.getOptionScopes(this.getDataset(), scopeKeys); + options = config.createResolver(scopes, this.getContext(index, active, transition)); } - var animations = new Animations(chart, options && options.animations); - if (options && options._cacheable) { cache[cacheKey] = Object.freeze(animations); } - return animations; } }, { key: "getSharedOptions", value: function getSharedOptions(options) { if (!options.$shared) { return; } - return this._sharedOptions || (this._sharedOptions = Object.assign({}, options)); } }, { key: "includeOptions", value: function includeOptions(mode, sharedOptions) { return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled; } }, { + key: "_getSharedOptions", + value: function _getSharedOptions(start, mode) { + var firstOpts = this.resolveDataElementOptions(start, mode); + var previouslySharedOptions = this._sharedOptions; + var sharedOptions = this.getSharedOptions(firstOpts); + var includeOptions = this.includeOptions(mode, sharedOptions) || sharedOptions !== previouslySharedOptions; + this.updateSharedOptions(sharedOptions, mode, firstOpts); + return { + sharedOptions: sharedOptions, + includeOptions: includeOptions + }; + } + }, { key: "updateElement", value: function updateElement(element, index, properties, mode) { if (isDirectUpdateMode(mode)) { Object.assign(element, properties); } else { @@ -4881,11 +5086,10 @@ }, { key: "_setStyle", value: function _setStyle(element, index, mode, active) { element.active = active; var options = this.getStyle(index, active); - this._resolveAnimations(index, mode, active).update(element, { options: !active && this.getSharedOptions(options) || options }); } }, { @@ -4900,285 +5104,364 @@ } }, { key: "_removeDatasetHoverStyle", value: function _removeDatasetHoverStyle() { var element = this._cachedMeta.dataset; - if (element) { this._setStyle(element, undefined, 'active', false); } } }, { key: "_setDatasetHoverStyle", value: function _setDatasetHoverStyle() { var element = this._cachedMeta.dataset; - if (element) { this._setStyle(element, undefined, 'active', true); } } }, { key: "_resyncElements", value: function _resyncElements(resetNewElements) { - var me = this; - var numMeta = me._cachedMeta.data.length; - var numData = me._data.length; - - if (numData > numMeta) { - me._insertElements(numMeta, numData - numMeta, resetNewElements); - } else if (numData < numMeta) { - me._removeElements(numData, numMeta - numData); + var data = this._data; + var elements = this._cachedMeta.data; + var _iterator3 = _createForOfIteratorHelper$1(this._syncList), + _step3; + try { + for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { + var _step3$value = _slicedToArray(_step3.value, 3), + method = _step3$value[0], + arg1 = _step3$value[1], + arg2 = _step3$value[2]; + this[method](arg1, arg2); + } + } catch (err) { + _iterator3.e(err); + } finally { + _iterator3.f(); } - + this._syncList = []; + var numMeta = elements.length; + var numData = data.length; var count = Math.min(numData, numMeta); - if (count) { - me.parse(0, count); + this.parse(0, count); } + if (numData > numMeta) { + this._insertElements(numMeta, numData - numMeta, resetNewElements); + } else if (numData < numMeta) { + this._removeElements(numData, numMeta - numData); + } } }, { key: "_insertElements", value: function _insertElements(start, count) { var resetNewElements = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; - var me = this; - var meta = me._cachedMeta; + var meta = this._cachedMeta; var data = meta.data; var end = start + count; var i; - var move = function move(arr) { arr.length += count; - for (i = arr.length - 1; i >= end; i--) { arr[i] = arr[i - count]; } }; - move(data); - for (i = start; i < end; ++i) { - data[i] = new me.dataElementType(); + data[i] = new this.dataElementType(); } - - if (me._parsing) { + if (this._parsing) { move(meta._parsed); } - - me.parse(start, count); - + this.parse(start, count); if (resetNewElements) { - me.updateElements(data, start, count, 'reset'); + this.updateElements(data, start, count, 'reset'); } } }, { key: "updateElements", value: function updateElements(element, start, count, mode) {} }, { key: "_removeElements", value: function _removeElements(start, count) { - var me = this; - var meta = me._cachedMeta; - - if (me._parsing) { + var meta = this._cachedMeta; + if (this._parsing) { var removed = meta._parsed.splice(start, count); - if (meta._stacked) { clearStacks(meta, removed); } } - meta.data.splice(start, count); } }, { + key: "_sync", + value: function _sync(args) { + if (this._parsing) { + this._syncList.push(args); + } else { + var _args2 = _slicedToArray(args, 3), + method = _args2[0], + arg1 = _args2[1], + arg2 = _args2[2]; + this[method](arg1, arg2); + } + this.chart._dataChanges.push([this.index].concat(_toConsumableArray(args))); + } + }, { key: "_onDataPush", value: function _onDataPush() { var count = arguments.length; - - this._insertElements(this.getDataset().data.length - count, count); + this._sync(['_insertElements', this.getDataset().data.length - count, count]); } }, { key: "_onDataPop", value: function _onDataPop() { - this._removeElements(this._cachedMeta.data.length - 1, 1); + this._sync(['_removeElements', this._cachedMeta.data.length - 1, 1]); } }, { key: "_onDataShift", value: function _onDataShift() { - this._removeElements(0, 1); + this._sync(['_removeElements', 0, 1]); } }, { key: "_onDataSplice", value: function _onDataSplice(start, count) { - this._removeElements(start, count); - - this._insertElements(start, arguments.length - 2); + if (count) { + this._sync(['_removeElements', start, count]); + } + var newCount = arguments.length - 2; + if (newCount) { + this._sync(['_insertElements', start, newCount]); + } } }, { key: "_onDataUnshift", value: function _onDataUnshift() { - this._insertElements(0, arguments.length); + this._sync(['_insertElements', 0, arguments.length]); } }]); - return DatasetController; }(); - - DatasetController.defaults = {}; - DatasetController.prototype.datasetElementType = null; - DatasetController.prototype.dataElementType = null; - - function getAllScaleValues(scale) { + _defineProperty$w(DatasetController, "defaults", {}); + _defineProperty$w(DatasetController, "datasetElementType", null); + _defineProperty$w(DatasetController, "dataElementType", null); + function getAllScaleValues(scale, type) { if (!scale._cache.$bar) { - var metas = scale.getMatchingVisibleMetas('bar'); + var visibleMetas = scale.getMatchingVisibleMetas(type); var values = []; - - for (var i = 0, ilen = metas.length; i < ilen; i++) { - values = values.concat(metas[i].controller.getAllParsedValues(scale)); + for (var i = 0, ilen = visibleMetas.length; i < ilen; i++) { + values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale)); } - scale._cache.$bar = _arrayUnique(values.sort(function (a, b) { return a - b; })); } - return scale._cache.$bar; } - - function computeMinSampleSize(scale) { - var values = getAllScaleValues(scale); + function computeMinSampleSize(meta) { + var scale = meta.iScale; + var values = getAllScaleValues(scale, meta.type); var min = scale._length; var i, ilen, curr, prev; - var updateMinAndPrev = function updateMinAndPrev() { - min = Math.min(min, i && Math.abs(curr - prev) || min); + if (curr === 32767 || curr === -32768) { + return; + } + if (defined(prev)) { + min = Math.min(min, Math.abs(curr - prev) || min); + } prev = curr; }; - for (i = 0, ilen = values.length; i < ilen; ++i) { curr = scale.getPixelForValue(values[i]); updateMinAndPrev(); } - + prev = undefined; for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) { curr = scale.getPixelForTick(i); updateMinAndPrev(); } - return min; } - function computeFitCategoryTraits(index, ruler, options, stackCount) { var thickness = options.barThickness; var size, ratio; - if (isNullOrUndef(thickness)) { size = ruler.min * options.categoryPercentage; ratio = options.barPercentage; } else { size = thickness * stackCount; ratio = 1; } - return { chunk: size / stackCount, ratio: ratio, start: ruler.pixels[index] - size / 2 }; } - function computeFlexCategoryTraits(index, ruler, options, stackCount) { var pixels = ruler.pixels; var curr = pixels[index]; var prev = index > 0 ? pixels[index - 1] : null; var next = index < pixels.length - 1 ? pixels[index + 1] : null; var percent = options.categoryPercentage; - if (prev === null) { prev = curr - (next === null ? ruler.end - ruler.start : next - curr); } - if (next === null) { next = curr + curr - prev; } - var start = curr - (curr - Math.min(prev, next)) / 2 * percent; var size = Math.abs(next - prev) / 2 * percent; return { chunk: size / stackCount, ratio: options.barPercentage, start: start }; } - function parseFloatBar(entry, item, vScale, i) { var startValue = vScale.parse(entry[0], i); var endValue = vScale.parse(entry[1], i); var min = Math.min(startValue, endValue); var max = Math.max(startValue, endValue); var barStart = min; var barEnd = max; - if (Math.abs(min) > Math.abs(max)) { barStart = max; barEnd = min; } - item[vScale.axis] = barEnd; item._custom = { barStart: barStart, barEnd: barEnd, start: startValue, end: endValue, min: min, max: max }; } - function parseValue(entry, item, vScale, i) { if (isArray(entry)) { parseFloatBar(entry, item, vScale, i); } else { item[vScale.axis] = vScale.parse(entry, i); } - return item; } - function parseArrayOrPrimitive(meta, data, start, count) { var iScale = meta.iScale; var vScale = meta.vScale; var labels = iScale.getLabels(); var singleScale = iScale === vScale; var parsed = []; var i, ilen, item, entry; - for (i = start, ilen = start + count; i < ilen; ++i) { entry = data[i]; item = {}; item[iScale.axis] = singleScale || iScale.parse(labels[i], i); parsed.push(parseValue(entry, item, vScale, i)); } - return parsed; } - function isFloatBar(custom) { return custom && custom.barStart !== undefined && custom.barEnd !== undefined; } - + function barSign(size, vScale, actualBase) { + if (size !== 0) { + return sign(size); + } + return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1); + } + function borderProps(properties) { + var reverse, start, end, top, bottom; + if (properties.horizontal) { + reverse = properties.base > properties.x; + start = 'left'; + end = 'right'; + } else { + reverse = properties.base < properties.y; + start = 'bottom'; + end = 'top'; + } + if (reverse) { + top = 'end'; + bottom = 'start'; + } else { + top = 'start'; + bottom = 'end'; + } + return { + start: start, + end: end, + reverse: reverse, + top: top, + bottom: bottom + }; + } + function setBorderSkipped(properties, options, stack, index) { + var edge = options.borderSkipped; + var res = {}; + if (!edge) { + properties.borderSkipped = res; + return; + } + if (edge === true) { + properties.borderSkipped = { + top: true, + right: true, + bottom: true, + left: true + }; + return; + } + var _borderProps = borderProps(properties), + start = _borderProps.start, + end = _borderProps.end, + reverse = _borderProps.reverse, + top = _borderProps.top, + bottom = _borderProps.bottom; + if (edge === 'middle' && stack) { + properties.enableBorderRadius = true; + if ((stack._top || 0) === index) { + edge = top; + } else if ((stack._bottom || 0) === index) { + edge = bottom; + } else { + res[parseEdge(bottom, start, end, reverse)] = true; + edge = top; + } + } + res[parseEdge(edge, start, end, reverse)] = true; + properties.borderSkipped = res; + } + function parseEdge(edge, a, b, reverse) { + if (reverse) { + edge = swap(edge, a, b); + edge = startEnd(edge, b, a); + } else { + edge = startEnd(edge, a, b); + } + return edge; + } + function swap(orig, v1, v2) { + return orig === v1 ? v2 : orig === v2 ? v1 : orig; + } + function startEnd(v, start, end) { + return v === 'start' ? start : v === 'end' ? end : v; + } + function setInflateAmount(properties, _ref, ratio) { + var inflateAmount = _ref.inflateAmount; + properties.inflateAmount = inflateAmount === 'auto' ? ratio === 1 ? 0.33 : 0 : inflateAmount; + } var BarController = /*#__PURE__*/function (_DatasetController) { - _inherits(BarController, _DatasetController); - - var _super = _createSuper(BarController); - + _inherits$w(BarController, _DatasetController); + var _super = _createSuper$w(BarController); function BarController() { - _classCallCheck(this, BarController); - + _classCallCheck$x(this, BarController); return _super.apply(this, arguments); } - - _createClass(BarController, [{ + _createClass$x(BarController, [{ key: "parsePrimitiveData", value: function parsePrimitiveData(meta, data, start, count) { return parseArrayOrPrimitive(meta, data, start, count); } }, { @@ -5188,325 +5471,295 @@ } }, { key: "parseObjectData", value: function parseObjectData(meta, data, start, count) { var iScale = meta.iScale, - vScale = meta.vScale; + vScale = meta.vScale; var _this$_parsing2 = this._parsing, - _this$_parsing2$xAxis = _this$_parsing2.xAxisKey, - xAxisKey = _this$_parsing2$xAxis === void 0 ? 'x' : _this$_parsing2$xAxis, - _this$_parsing2$yAxis = _this$_parsing2.yAxisKey, - yAxisKey = _this$_parsing2$yAxis === void 0 ? 'y' : _this$_parsing2$yAxis; + _this$_parsing2$xAxis = _this$_parsing2.xAxisKey, + xAxisKey = _this$_parsing2$xAxis === void 0 ? 'x' : _this$_parsing2$xAxis, + _this$_parsing2$yAxis = _this$_parsing2.yAxisKey, + yAxisKey = _this$_parsing2$yAxis === void 0 ? 'y' : _this$_parsing2$yAxis; var iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey; var vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey; var parsed = []; var i, ilen, item, obj; - for (i = start, ilen = start + count; i < ilen; ++i) { obj = data[i]; item = {}; item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i); parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i)); } - return parsed; } }, { key: "updateRangeFromParsed", value: function updateRangeFromParsed(range, scale, parsed, stack) { - _get(_getPrototypeOf(BarController.prototype), "updateRangeFromParsed", this).call(this, range, scale, parsed, stack); - + _get(_getPrototypeOf$w(BarController.prototype), "updateRangeFromParsed", this).call(this, range, scale, parsed, stack); var custom = parsed._custom; - if (custom && scale === this._cachedMeta.vScale) { range.min = Math.min(range.min, custom.min); range.max = Math.max(range.max, custom.max); } } }, { + key: "getMaxOverflow", + value: function getMaxOverflow() { + return 0; + } + }, { key: "getLabelAndValue", value: function getLabelAndValue(index) { - var me = this; - var meta = me._cachedMeta; + var meta = this._cachedMeta; var iScale = meta.iScale, - vScale = meta.vScale; - var parsed = me.getParsed(index); + vScale = meta.vScale; + var parsed = this.getParsed(index); var custom = parsed._custom; var value = isFloatBar(custom) ? '[' + custom.start + ', ' + custom.end + ']' : '' + vScale.getLabelForValue(parsed[vScale.axis]); return { label: '' + iScale.getLabelForValue(parsed[iScale.axis]), value: value }; } }, { key: "initialize", value: function initialize() { - var me = this; - me.enableOptionSharing = true; - - _get(_getPrototypeOf(BarController.prototype), "initialize", this).call(this); - - var meta = me._cachedMeta; - meta.stack = me.getDataset().stack; + this.enableOptionSharing = true; + _get(_getPrototypeOf$w(BarController.prototype), "initialize", this).call(this); + var meta = this._cachedMeta; + meta.stack = this.getDataset().stack; } }, { key: "update", value: function update(mode) { - var me = this; - var meta = me._cachedMeta; - me.updateElements(meta.data, 0, meta.data.length, mode); + var meta = this._cachedMeta; + this.updateElements(meta.data, 0, meta.data.length, mode); } }, { key: "updateElements", value: function updateElements(bars, start, count, mode) { - var me = this; var reset = mode === 'reset'; - var vScale = me._cachedMeta.vScale; + var index = this.index, + vScale = this._cachedMeta.vScale; var base = vScale.getBasePixel(); var horizontal = vScale.isHorizontal(); - - var ruler = me._getRuler(); - - var firstOpts = me.resolveDataElementOptions(start, mode); - var sharedOptions = me.getSharedOptions(firstOpts); - var includeOptions = me.includeOptions(mode, sharedOptions); - me.updateSharedOptions(sharedOptions, mode, firstOpts); - + var ruler = this._getRuler(); + var _this$_getSharedOptio = this._getSharedOptions(start, mode), + sharedOptions = _this$_getSharedOptio.sharedOptions, + includeOptions = _this$_getSharedOptio.includeOptions; for (var i = start; i < start + count; i++) { - var vpixels = reset ? { + var parsed = this.getParsed(i); + var vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? { base: base, head: base - } : me._calculateBarValuePixels(i); - - var ipixels = me._calculateBarIndexPixels(i, ruler); - + } : this._calculateBarValuePixels(i); + var ipixels = this._calculateBarIndexPixels(i, ruler); + var stack = (parsed._stacks || {})[vScale.axis]; var properties = { horizontal: horizontal, base: vpixels.base, + enableBorderRadius: !stack || isFloatBar(parsed._custom) || index === stack._top || index === stack._bottom, x: horizontal ? vpixels.head : ipixels.center, y: horizontal ? ipixels.center : vpixels.head, - height: horizontal ? ipixels.size : undefined, - width: horizontal ? undefined : ipixels.size + height: horizontal ? ipixels.size : Math.abs(vpixels.size), + width: horizontal ? Math.abs(vpixels.size) : ipixels.size }; - if (includeOptions) { - properties.options = sharedOptions || me.resolveDataElementOptions(i, mode); + properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode); } - - me.updateElement(bars[i], i, properties, mode); + var options = properties.options || bars[i].options; + setBorderSkipped(properties, options, stack, index); + setInflateAmount(properties, options, ruler.ratio); + this.updateElement(bars[i], i, properties, mode); } } }, { key: "_getStacks", value: function _getStacks(last, dataIndex) { - var me = this; - var meta = me._cachedMeta; - var iScale = meta.iScale; - var metasets = iScale.getMatchingVisibleMetas(me._type); + var iScale = this._cachedMeta.iScale; + var metasets = iScale.getMatchingVisibleMetas(this._type).filter(function (meta) { + return meta.controller.options.grouped; + }); var stacked = iScale.options.stacked; - var ilen = metasets.length; var stacks = []; - var i, item; - - for (i = 0; i < ilen; ++i) { - item = metasets[i]; - - if (typeof dataIndex !== 'undefined') { - var val = item.controller.getParsed(dataIndex)[item.controller._cachedMeta.vScale.axis]; - - if (isNullOrUndef(val) || isNaN(val)) { + var skipNull = function skipNull(meta) { + var parsed = meta.controller.getParsed(dataIndex); + var val = parsed && parsed[meta.vScale.axis]; + if (isNullOrUndef(val) || isNaN(val)) { + return true; + } + }; + var _iterator4 = _createForOfIteratorHelper$1(metasets), + _step4; + try { + for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { + var meta = _step4.value; + if (dataIndex !== undefined && skipNull(meta)) { continue; } + if (stacked === false || stacks.indexOf(meta.stack) === -1 || stacked === undefined && meta.stack === undefined) { + stacks.push(meta.stack); + } + if (meta.index === last) { + break; + } } - - if (stacked === false || stacks.indexOf(item.stack) === -1 || stacked === undefined && item.stack === undefined) { - stacks.push(item.stack); - } - - if (item.index === last) { - break; - } + } catch (err) { + _iterator4.e(err); + } finally { + _iterator4.f(); } - if (!stacks.length) { stacks.push(undefined); } - return stacks; } }, { key: "_getStackCount", value: function _getStackCount(index) { return this._getStacks(undefined, index).length; } }, { key: "_getStackIndex", - value: function _getStackIndex(datasetIndex, name) { - var stacks = this._getStacks(datasetIndex); - + value: function _getStackIndex(datasetIndex, name, dataIndex) { + var stacks = this._getStacks(datasetIndex, dataIndex); var index = name !== undefined ? stacks.indexOf(name) : -1; return index === -1 ? stacks.length - 1 : index; } }, { key: "_getRuler", value: function _getRuler() { - var me = this; - var opts = me.options; - var meta = me._cachedMeta; + var opts = this.options; + var meta = this._cachedMeta; var iScale = meta.iScale; var pixels = []; var i, ilen; - for (i = 0, ilen = meta.data.length; i < ilen; ++i) { - pixels.push(iScale.getPixelForValue(me.getParsed(i)[iScale.axis], i)); + pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i)); } - var barThickness = opts.barThickness; - var min = barThickness || computeMinSampleSize(iScale); + var min = barThickness || computeMinSampleSize(meta); return { min: min, pixels: pixels, start: iScale._startPixel, end: iScale._endPixel, - stackCount: me._getStackCount(), + stackCount: this._getStackCount(), scale: iScale, grouped: opts.grouped, ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage }; } }, { key: "_calculateBarValuePixels", value: function _calculateBarValuePixels(index) { - var me = this; - var _me$_cachedMeta = me._cachedMeta, - vScale = _me$_cachedMeta.vScale, - _stacked = _me$_cachedMeta._stacked; - var _me$options = me.options, - baseValue = _me$options.base, - minBarLength = _me$options.minBarLength; - var parsed = me.getParsed(index); + var _this$_cachedMeta = this._cachedMeta, + vScale = _this$_cachedMeta.vScale, + _stacked = _this$_cachedMeta._stacked, + datasetIndex = _this$_cachedMeta.index, + _this$options = this.options, + baseValue = _this$options.base, + minBarLength = _this$options.minBarLength; + var actualBase = baseValue || 0; + var parsed = this.getParsed(index); var custom = parsed._custom; var floating = isFloatBar(custom); var value = parsed[vScale.axis]; var start = 0; - var length = _stacked ? me.applyStack(vScale, parsed, _stacked) : value; + var length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value; var head, size; - if (length !== value) { start = length - value; length = value; } - if (floating) { value = custom.barStart; length = custom.barEnd - custom.barStart; - if (value !== 0 && sign(value) !== sign(custom.barEnd)) { start = 0; } - start += value; } - var startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start; var base = vScale.getPixelForValue(startValue); - if (this.chart.getDataVisibility(index)) { head = vScale.getPixelForValue(start + length); } else { head = base; } - size = head - base; - - if (minBarLength !== undefined && Math.abs(size) < minBarLength) { - size = size < 0 ? -minBarLength : minBarLength; - - if (value === 0) { + if (Math.abs(size) < minBarLength) { + size = barSign(size, vScale, actualBase) * minBarLength; + if (value === actualBase) { base -= size / 2; } - + var startPixel = vScale.getPixelForDecimal(0); + var endPixel = vScale.getPixelForDecimal(1); + var min = Math.min(startPixel, endPixel); + var max = Math.max(startPixel, endPixel); + base = Math.max(Math.min(base, max), min); head = base + size; + if (_stacked && !floating) { + parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base); + } } - - var actualBase = baseValue || 0; - if (base === vScale.getPixelForValue(actualBase)) { - var halfGrid = vScale.getLineWidthForValue(actualBase) / 2; - - if (size > 0) { - base += halfGrid; - size -= halfGrid; - } else if (size < 0) { - base -= halfGrid; - size += halfGrid; - } + var halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2; + base += halfGrid; + size -= halfGrid; } - return { size: size, base: base, head: head, center: head + size / 2 }; } }, { key: "_calculateBarIndexPixels", value: function _calculateBarIndexPixels(index, ruler) { - var me = this; var scale = ruler.scale; - var options = me.options; + var options = this.options; + var skipNull = options.skipNull; var maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity); var center, size; - if (ruler.grouped) { - var stackCount = options.skipNull ? me._getStackCount(index) : ruler.stackCount; + var stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount; var range = options.barThickness === 'flex' ? computeFlexCategoryTraits(index, ruler, options, stackCount) : computeFitCategoryTraits(index, ruler, options, stackCount); - - var stackIndex = me._getStackIndex(me.index, me._cachedMeta.stack); - + var stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined); center = range.start + range.chunk * stackIndex + range.chunk / 2; size = Math.min(maxBarThickness, range.chunk * range.ratio); } else { - center = scale.getPixelForValue(me.getParsed(index)[scale.axis], index); + center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index); size = Math.min(maxBarThickness, ruler.min * ruler.ratio); } - return { base: center - size / 2, head: center + size / 2, center: center, size: size }; } }, { key: "draw", value: function draw() { - var me = this; - var chart = me.chart; - var meta = me._cachedMeta; + var meta = this._cachedMeta; var vScale = meta.vScale; var rects = meta.data; var ilen = rects.length; var i = 0; - clipArea(chart.ctx, chart.chartArea); - for (; i < ilen; ++i) { - if (me.getParsed(i)[vScale.axis] !== null) { - rects[i].draw(me._ctx); + if (this.getParsed(i)[vScale.axis] !== null) { + rects[i].draw(this._ctx); } } - - unclipArea(chart.ctx); } }]); - return BarController; }(DatasetController); - - BarController.id = 'bar'; - BarController.defaults = { + _defineProperty$w(BarController, "id", 'bar'); + _defineProperty$w(BarController, "defaults", { datasetElementType: false, dataElementType: 'bar', categoryPercentage: 0.8, barPercentage: 0.9, grouped: true, @@ -5514,15 +5767,12 @@ numbers: { type: 'number', properties: ['x', 'y', 'base', 'width', 'height'] } } - }; - BarController.overrides = { - interaction: { - mode: 'index' - }, + }); + _defineProperty$w(BarController, "overrides", { scales: { _index_: { type: 'category', offset: true, grid: { @@ -5532,256 +5782,227 @@ _value_: { type: 'linear', beginAtZero: true } } - }; - + }); var BubbleController = /*#__PURE__*/function (_DatasetController2) { - _inherits(BubbleController, _DatasetController2); - - var _super2 = _createSuper(BubbleController); - + _inherits$w(BubbleController, _DatasetController2); + var _super2 = _createSuper$w(BubbleController); function BubbleController() { - _classCallCheck(this, BubbleController); - + _classCallCheck$x(this, BubbleController); return _super2.apply(this, arguments); } - - _createClass(BubbleController, [{ + _createClass$x(BubbleController, [{ key: "initialize", value: function initialize() { this.enableOptionSharing = true; - - _get(_getPrototypeOf(BubbleController.prototype), "initialize", this).call(this); + _get(_getPrototypeOf$w(BubbleController.prototype), "initialize", this).call(this); } }, { + key: "parsePrimitiveData", + value: function parsePrimitiveData(meta, data, start, count) { + var parsed = _get(_getPrototypeOf$w(BubbleController.prototype), "parsePrimitiveData", this).call(this, meta, data, start, count); + for (var i = 0; i < parsed.length; i++) { + parsed[i]._custom = this.resolveDataElementOptions(i + start).radius; + } + return parsed; + } + }, { + key: "parseArrayData", + value: function parseArrayData(meta, data, start, count) { + var parsed = _get(_getPrototypeOf$w(BubbleController.prototype), "parseArrayData", this).call(this, meta, data, start, count); + for (var i = 0; i < parsed.length; i++) { + var item = data[start + i]; + parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius); + } + return parsed; + } + }, { key: "parseObjectData", value: function parseObjectData(meta, data, start, count) { - var xScale = meta.xScale, - yScale = meta.yScale; - var _this$_parsing3 = this._parsing, - _this$_parsing3$xAxis = _this$_parsing3.xAxisKey, - xAxisKey = _this$_parsing3$xAxis === void 0 ? 'x' : _this$_parsing3$xAxis, - _this$_parsing3$yAxis = _this$_parsing3.yAxisKey, - yAxisKey = _this$_parsing3$yAxis === void 0 ? 'y' : _this$_parsing3$yAxis; - var parsed = []; - var i, ilen, item; - - for (i = start, ilen = start + count; i < ilen; ++i) { - item = data[i]; - parsed.push({ - x: xScale.parse(resolveObjectKey(item, xAxisKey), i), - y: yScale.parse(resolveObjectKey(item, yAxisKey), i), - _custom: item && item.r && +item.r - }); + var parsed = _get(_getPrototypeOf$w(BubbleController.prototype), "parseObjectData", this).call(this, meta, data, start, count); + for (var i = 0; i < parsed.length; i++) { + var item = data[start + i]; + parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius); } - return parsed; } }, { key: "getMaxOverflow", value: function getMaxOverflow() { - var _this$_cachedMeta = this._cachedMeta, - data = _this$_cachedMeta.data, - _parsed = _this$_cachedMeta._parsed; + var data = this._cachedMeta.data; var max = 0; - for (var i = data.length - 1; i >= 0; --i) { - max = Math.max(max, data[i].size() / 2, _parsed[i]._custom); + max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2); } - return max > 0 && max; } }, { key: "getLabelAndValue", value: function getLabelAndValue(index) { - var me = this; - var meta = me._cachedMeta; + var meta = this._cachedMeta; + var labels = this.chart.data.labels || []; var xScale = meta.xScale, - yScale = meta.yScale; - var parsed = me.getParsed(index); + yScale = meta.yScale; + var parsed = this.getParsed(index); var x = xScale.getLabelForValue(parsed.x); var y = yScale.getLabelForValue(parsed.y); var r = parsed._custom; return { - label: meta.label, + label: labels[index] || '', value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')' }; } }, { key: "update", value: function update(mode) { - var me = this; - var points = me._cachedMeta.data; - me.updateElements(points, 0, points.length, mode); + var points = this._cachedMeta.data; + this.updateElements(points, 0, points.length, mode); } }, { key: "updateElements", value: function updateElements(points, start, count, mode) { - var me = this; var reset = mode === 'reset'; - var _me$_cachedMeta2 = me._cachedMeta, - xScale = _me$_cachedMeta2.xScale, - yScale = _me$_cachedMeta2.yScale; - var firstOpts = me.resolveDataElementOptions(start, mode); - var sharedOptions = me.getSharedOptions(firstOpts); - var includeOptions = me.includeOptions(mode, sharedOptions); - + var _this$_cachedMeta2 = this._cachedMeta, + iScale = _this$_cachedMeta2.iScale, + vScale = _this$_cachedMeta2.vScale; + var _this$_getSharedOptio2 = this._getSharedOptions(start, mode), + sharedOptions = _this$_getSharedOptio2.sharedOptions, + includeOptions = _this$_getSharedOptio2.includeOptions; + var iAxis = iScale.axis; + var vAxis = vScale.axis; for (var i = start; i < start + count; i++) { var point = points[i]; - var parsed = !reset && me.getParsed(i); - var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(parsed.x); - var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(parsed.y); - var properties = { - x: x, - y: y, - skip: isNaN(x) || isNaN(y) - }; - + var parsed = !reset && this.getParsed(i); + var properties = {}; + var iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]); + var vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]); + properties.skip = isNaN(iPixel) || isNaN(vPixel); if (includeOptions) { - properties.options = me.resolveDataElementOptions(i, mode); - + properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode); if (reset) { properties.options.radius = 0; } } - - me.updateElement(point, i, properties, mode); + this.updateElement(point, i, properties, mode); } - - me.updateSharedOptions(sharedOptions, mode, firstOpts); } }, { key: "resolveDataElementOptions", value: function resolveDataElementOptions(index, mode) { var parsed = this.getParsed(index); - - var values = _get(_getPrototypeOf(BubbleController.prototype), "resolveDataElementOptions", this).call(this, index, mode); - + var values = _get(_getPrototypeOf$w(BubbleController.prototype), "resolveDataElementOptions", this).call(this, index, mode); if (values.$shared) { values = Object.assign({}, values, { $shared: false }); } - var radius = values.radius; - if (mode !== 'active') { values.radius = 0; } - values.radius += valueOrDefault(parsed && parsed._custom, radius); return values; } }]); - return BubbleController; }(DatasetController); - - BubbleController.id = 'bubble'; - BubbleController.defaults = { + _defineProperty$w(BubbleController, "id", 'bubble'); + _defineProperty$w(BubbleController, "defaults", { datasetElementType: false, dataElementType: 'point', animations: { numbers: { type: 'number', properties: ['x', 'y', 'borderWidth', 'radius'] } } - }; - BubbleController.overrides = { + }); + _defineProperty$w(BubbleController, "overrides", { scales: { x: { type: 'linear' }, y: { type: 'linear' } - }, - plugins: { - tooltip: { - callbacks: { - title: function title() { - return ''; - } - } - } } - }; - + }); function getRatioAndOffset(rotation, circumference, cutout) { var ratioX = 1; var ratioY = 1; var offsetX = 0; var offsetY = 0; - if (circumference < TAU) { var startAngle = rotation; var endAngle = startAngle + circumference; var startX = Math.cos(startAngle); var startY = Math.sin(startAngle); var endX = Math.cos(endAngle); var endY = Math.sin(endAngle); - var calcMax = function calcMax(angle, a, b) { - return _angleBetween(angle, startAngle, endAngle) ? 1 : Math.max(a, a * cutout, b, b * cutout); + return _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout); }; - var calcMin = function calcMin(angle, a, b) { - return _angleBetween(angle, startAngle, endAngle) ? -1 : Math.min(a, a * cutout, b, b * cutout); + return _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout); }; - var maxX = calcMax(0, startX, endX); var maxY = calcMax(HALF_PI, startY, endY); var minX = calcMin(PI, startX, endX); var minY = calcMin(PI + HALF_PI, startY, endY); ratioX = (maxX - minX) / 2; ratioY = (maxY - minY) / 2; offsetX = -(maxX + minX) / 2; offsetY = -(maxY + minY) / 2; } - return { ratioX: ratioX, ratioY: ratioY, offsetX: offsetX, offsetY: offsetY }; } - var DoughnutController = /*#__PURE__*/function (_DatasetController3) { - _inherits(DoughnutController, _DatasetController3); - - var _super3 = _createSuper(DoughnutController); - + _inherits$w(DoughnutController, _DatasetController3); + var _super3 = _createSuper$w(DoughnutController); function DoughnutController(chart, datasetIndex) { - var _this; - - _classCallCheck(this, DoughnutController); - - _this = _super3.call(this, chart, datasetIndex); - _this.enableOptionSharing = true; - _this.innerRadius = undefined; - _this.outerRadius = undefined; - _this.offsetX = undefined; - _this.offsetY = undefined; - return _this; + var _this4; + _classCallCheck$x(this, DoughnutController); + _this4 = _super3.call(this, chart, datasetIndex); + _this4.enableOptionSharing = true; + _this4.innerRadius = undefined; + _this4.outerRadius = undefined; + _this4.offsetX = undefined; + _this4.offsetY = undefined; + return _this4; } - - _createClass(DoughnutController, [{ + _createClass$x(DoughnutController, [{ key: "linkScales", value: function linkScales() {} }, { key: "parse", value: function parse(start, count) { var data = this.getDataset().data; var meta = this._cachedMeta; - var i, ilen; - - for (i = start, ilen = start + count; i < ilen; ++i) { - meta._parsed[i] = +data[i]; + if (this._parsing === false) { + meta._parsed = data; + } else { + var getter = function getter(i) { + return +data[i]; + }; + if (isObject(data[start])) { + var _this$_parsing$key = this._parsing.key, + key = _this$_parsing$key === void 0 ? 'value' : _this$_parsing$key; + getter = function getter(i) { + return +resolveObjectKey(data[i], key); + }; + } + var i, ilen; + for (i = start, ilen = start + count; i < ilen; ++i) { + meta._parsed[i] = getter(i); + } } } }, { key: "_getRotation", value: function _getRotation() { @@ -5795,237 +6016,189 @@ }, { key: "_getRotationExtents", value: function _getRotationExtents() { var min = TAU; var max = -TAU; - var me = this; - - for (var i = 0; i < me.chart.data.datasets.length; ++i) { - if (me.chart.isDatasetVisible(i)) { - var controller = me.chart.getDatasetMeta(i).controller; - + for (var i = 0; i < this.chart.data.datasets.length; ++i) { + if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) { + var controller = this.chart.getDatasetMeta(i).controller; var rotation = controller._getRotation(); - var circumference = controller._getCircumference(); - min = Math.min(min, rotation); max = Math.max(max, rotation + circumference); } } - return { rotation: min, circumference: max - min }; } }, { key: "update", value: function update(mode) { - var me = this; - var chart = me.chart; + var chart = this.chart; var chartArea = chart.chartArea; - var meta = me._cachedMeta; + var meta = this._cachedMeta; var arcs = meta.data; - var spacing = me.getMaxBorderWidth() + me.getMaxOffset(arcs); + var spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing; var maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0); - var cutout = Math.min(toPercentage(me.options.cutout, maxSize), 1); - - var chartWeight = me._getRingWeight(me.index); - - var _me$_getRotationExten = me._getRotationExtents(), - circumference = _me$_getRotationExten.circumference, - rotation = _me$_getRotationExten.rotation; - + var cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1); + var chartWeight = this._getRingWeight(this.index); + var _this$_getRotationExt = this._getRotationExtents(), + circumference = _this$_getRotationExt.circumference, + rotation = _this$_getRotationExt.rotation; var _getRatioAndOffset = getRatioAndOffset(rotation, circumference, cutout), - ratioX = _getRatioAndOffset.ratioX, - ratioY = _getRatioAndOffset.ratioY, - offsetX = _getRatioAndOffset.offsetX, - offsetY = _getRatioAndOffset.offsetY; - + ratioX = _getRatioAndOffset.ratioX, + ratioY = _getRatioAndOffset.ratioY, + offsetX = _getRatioAndOffset.offsetX, + offsetY = _getRatioAndOffset.offsetY; var maxWidth = (chartArea.width - spacing) / ratioX; var maxHeight = (chartArea.height - spacing) / ratioY; var maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0); - var outerRadius = toDimension(me.options.radius, maxRadius); + var outerRadius = toDimension(this.options.radius, maxRadius); var innerRadius = Math.max(outerRadius * cutout, 0); - - var radiusLength = (outerRadius - innerRadius) / me._getVisibleDatasetWeightTotal(); - - me.offsetX = offsetX * outerRadius; - me.offsetY = offsetY * outerRadius; - meta.total = me.calculateTotal(); - me.outerRadius = outerRadius - radiusLength * me._getRingWeightOffset(me.index); - me.innerRadius = Math.max(me.outerRadius - radiusLength * chartWeight, 0); - me.updateElements(arcs, 0, arcs.length, mode); + var radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal(); + this.offsetX = offsetX * outerRadius; + this.offsetY = offsetY * outerRadius; + meta.total = this.calculateTotal(); + this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index); + this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0); + this.updateElements(arcs, 0, arcs.length, mode); } }, { key: "_circumference", value: function _circumference(i, reset) { - var me = this; - var opts = me.options; - var meta = me._cachedMeta; - - var circumference = me._getCircumference(); - - if (reset && opts.animation.animateRotate || !this.chart.getDataVisibility(i) || meta._parsed[i] === null) { + var opts = this.options; + var meta = this._cachedMeta; + var circumference = this._getCircumference(); + if (reset && opts.animation.animateRotate || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) { return 0; } - - return me.calculateCircumference(meta._parsed[i] * circumference / TAU); + return this.calculateCircumference(meta._parsed[i] * circumference / TAU); } }, { key: "updateElements", value: function updateElements(arcs, start, count, mode) { - var me = this; var reset = mode === 'reset'; - var chart = me.chart; + var chart = this.chart; var chartArea = chart.chartArea; var opts = chart.options; var animationOpts = opts.animation; var centerX = (chartArea.left + chartArea.right) / 2; var centerY = (chartArea.top + chartArea.bottom) / 2; var animateScale = reset && animationOpts.animateScale; - var innerRadius = animateScale ? 0 : me.innerRadius; - var outerRadius = animateScale ? 0 : me.outerRadius; - var firstOpts = me.resolveDataElementOptions(start, mode); - var sharedOptions = me.getSharedOptions(firstOpts); - var includeOptions = me.includeOptions(mode, sharedOptions); - - var startAngle = me._getRotation(); - + var innerRadius = animateScale ? 0 : this.innerRadius; + var outerRadius = animateScale ? 0 : this.outerRadius; + var _this$_getSharedOptio3 = this._getSharedOptions(start, mode), + sharedOptions = _this$_getSharedOptio3.sharedOptions, + includeOptions = _this$_getSharedOptio3.includeOptions; + var startAngle = this._getRotation(); var i; - for (i = 0; i < start; ++i) { - startAngle += me._circumference(i, reset); + startAngle += this._circumference(i, reset); } - for (i = start; i < start + count; ++i) { - var circumference = me._circumference(i, reset); - + var circumference = this._circumference(i, reset); var arc = arcs[i]; var properties = { - x: centerX + me.offsetX, - y: centerY + me.offsetY, + x: centerX + this.offsetX, + y: centerY + this.offsetY, startAngle: startAngle, endAngle: startAngle + circumference, circumference: circumference, outerRadius: outerRadius, innerRadius: innerRadius }; - if (includeOptions) { - properties.options = sharedOptions || me.resolveDataElementOptions(i, mode); + properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode); } - startAngle += circumference; - me.updateElement(arc, i, properties, mode); + this.updateElement(arc, i, properties, mode); } - - me.updateSharedOptions(sharedOptions, mode, firstOpts); } }, { key: "calculateTotal", value: function calculateTotal() { var meta = this._cachedMeta; var metaData = meta.data; var total = 0; var i; - for (i = 0; i < metaData.length; i++) { var value = meta._parsed[i]; - - if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i)) { + if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) { total += Math.abs(value); } } - return total; } }, { key: "calculateCircumference", value: function calculateCircumference(value) { var total = this._cachedMeta.total; - if (total > 0 && !isNaN(value)) { return TAU * (Math.abs(value) / total); } - return 0; } }, { key: "getLabelAndValue", value: function getLabelAndValue(index) { - var me = this; - var meta = me._cachedMeta; - var chart = me.chart; + var meta = this._cachedMeta; + var chart = this.chart; var labels = chart.data.labels || []; var value = formatNumber(meta._parsed[index], chart.options.locale); return { label: labels[index] || '', value: value }; } }, { key: "getMaxBorderWidth", value: function getMaxBorderWidth(arcs) { - var me = this; var max = 0; - var chart = me.chart; + var chart = this.chart; var i, ilen, meta, controller, options; - if (!arcs) { for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { if (chart.isDatasetVisible(i)) { meta = chart.getDatasetMeta(i); arcs = meta.data; controller = meta.controller; - - if (controller !== me) { - controller.configure(); - } - break; } } } - if (!arcs) { return 0; } - for (i = 0, ilen = arcs.length; i < ilen; ++i) { options = controller.resolveDataElementOptions(i); - if (options.borderAlign !== 'inner') { max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0); } } - return max; } }, { key: "getMaxOffset", value: function getMaxOffset(arcs) { var max = 0; - for (var i = 0, ilen = arcs.length; i < ilen; ++i) { var options = this.resolveDataElementOptions(i); max = Math.max(max, options.offset || 0, options.hoverOffset || 0); } - return max; } }, { key: "_getRingWeightOffset", value: function _getRingWeightOffset(datasetIndex) { var ringWeightOffset = 0; - for (var i = 0; i < datasetIndex; ++i) { if (this.chart.isDatasetVisible(i)) { ringWeightOffset += this._getRingWeight(i); } } - return ringWeightOffset; } }, { key: "_getRingWeight", value: function _getRingWeight(datasetIndex) { @@ -6035,388 +6208,334 @@ key: "_getVisibleDatasetWeightTotal", value: function _getVisibleDatasetWeightTotal() { return this._getRingWeightOffset(this.chart.data.datasets.length) || 1; } }]); - return DoughnutController; }(DatasetController); - - DoughnutController.id = 'doughnut'; - DoughnutController.defaults = { + _defineProperty$w(DoughnutController, "id", 'doughnut'); + _defineProperty$w(DoughnutController, "defaults", { datasetElementType: false, dataElementType: 'arc', animation: { animateRotate: true, animateScale: false }, animations: { numbers: { type: 'number', - properties: ['circumference', 'endAngle', 'innerRadius', 'outerRadius', 'startAngle', 'x', 'y', 'offset', 'borderWidth'] + properties: ['circumference', 'endAngle', 'innerRadius', 'outerRadius', 'startAngle', 'x', 'y', 'offset', 'borderWidth', 'spacing'] } }, cutout: '50%', rotation: 0, circumference: 360, radius: '100%', + spacing: 0, indexAxis: 'r' - }; - DoughnutController.overrides = { + }); + _defineProperty$w(DoughnutController, "descriptors", { + _scriptable: function _scriptable(name) { + return name !== 'spacing'; + }, + _indexable: function _indexable(name) { + return name !== 'spacing'; + } + }); + _defineProperty$w(DoughnutController, "overrides", { aspectRatio: 1, plugins: { legend: { labels: { generateLabels: function generateLabels(chart) { var data = chart.data; - if (data.labels.length && data.datasets.length) { + var _chart$legend$options2 = chart.legend.options.labels, + pointStyle = _chart$legend$options2.pointStyle, + color = _chart$legend$options2.color; return data.labels.map(function (label, i) { var meta = chart.getDatasetMeta(0); var style = meta.controller.getStyle(i); return { text: label, fillStyle: style.backgroundColor, strokeStyle: style.borderColor, + fontColor: color, lineWidth: style.borderWidth, + pointStyle: pointStyle, hidden: !chart.getDataVisibility(i), index: i }; }); } - return []; } }, onClick: function onClick(e, legendItem, legend) { legend.chart.toggleDataVisibility(legendItem.index); legend.chart.update(); } - }, - tooltip: { - callbacks: { - title: function title() { - return ''; - }, - label: function label(tooltipItem) { - var dataLabel = tooltipItem.label; - var value = ': ' + tooltipItem.formattedValue; - - if (isArray(dataLabel)) { - dataLabel = dataLabel.slice(); - dataLabel[0] += value; - } else { - dataLabel += value; - } - - return dataLabel; - } - } } } - }; - + }); var LineController = /*#__PURE__*/function (_DatasetController4) { - _inherits(LineController, _DatasetController4); - - var _super4 = _createSuper(LineController); - + _inherits$w(LineController, _DatasetController4); + var _super4 = _createSuper$w(LineController); function LineController() { - _classCallCheck(this, LineController); - + _classCallCheck$x(this, LineController); return _super4.apply(this, arguments); } - - _createClass(LineController, [{ + _createClass$x(LineController, [{ key: "initialize", value: function initialize() { this.enableOptionSharing = true; - - _get(_getPrototypeOf(LineController.prototype), "initialize", this).call(this); + this.supportsDecimation = true; + _get(_getPrototypeOf$w(LineController.prototype), "initialize", this).call(this); } }, { key: "update", value: function update(mode) { - var me = this; - var meta = me._cachedMeta; + var meta = this._cachedMeta; var line = meta.dataset, - _meta$data = meta.data, - points = _meta$data === void 0 ? [] : _meta$data, - _dataset = meta._dataset; - var animationsDisabled = me.chart._animationsDisabled; - - var _getStartAndCountOfVi = getStartAndCountOfVisiblePoints(meta, points, animationsDisabled), - start = _getStartAndCountOfVi.start, - count = _getStartAndCountOfVi.count; - - me._drawStart = start; - me._drawCount = count; - - if (scaleRangesChanged(meta)) { + _meta$data = meta.data, + points = _meta$data === void 0 ? [] : _meta$data, + _dataset = meta._dataset; + var animationsDisabled = this.chart._animationsDisabled; + var _getStartAndCountOfVi = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled), + start = _getStartAndCountOfVi.start, + count = _getStartAndCountOfVi.count; + this._drawStart = start; + this._drawCount = count; + if (_scaleRangesChanged(meta)) { start = 0; count = points.length; } - + line._chart = this.chart; + line._datasetIndex = this.index; line._decimated = !!_dataset._decimated; line.points = points; - - if (mode !== 'resize') { - var options = me.resolveDatasetElementOptions(mode); - - if (!me.options.showLine) { - options.borderWidth = 0; - } - - me.updateElement(line, undefined, { - animated: !animationsDisabled, - options: options - }, mode); + var options = this.resolveDatasetElementOptions(mode); + if (!this.options.showLine) { + options.borderWidth = 0; } - - me.updateElements(points, start, count, mode); + options.segment = this.options.segment; + this.updateElement(line, undefined, { + animated: !animationsDisabled, + options: options + }, mode); + this.updateElements(points, start, count, mode); } }, { key: "updateElements", value: function updateElements(points, start, count, mode) { - var me = this; var reset = mode === 'reset'; - var _me$_cachedMeta3 = me._cachedMeta, - xScale = _me$_cachedMeta3.xScale, - yScale = _me$_cachedMeta3.yScale, - _stacked = _me$_cachedMeta3._stacked; - var firstOpts = me.resolveDataElementOptions(start, mode); - var sharedOptions = me.getSharedOptions(firstOpts); - var includeOptions = me.includeOptions(mode, sharedOptions); - var spanGaps = me.options.spanGaps; + var _this$_cachedMeta3 = this._cachedMeta, + iScale = _this$_cachedMeta3.iScale, + vScale = _this$_cachedMeta3.vScale, + _stacked = _this$_cachedMeta3._stacked, + _dataset = _this$_cachedMeta3._dataset; + var _this$_getSharedOptio4 = this._getSharedOptions(start, mode), + sharedOptions = _this$_getSharedOptio4.sharedOptions, + includeOptions = _this$_getSharedOptio4.includeOptions; + var iAxis = iScale.axis; + var vAxis = vScale.axis; + var _this$options2 = this.options, + spanGaps = _this$options2.spanGaps, + segment = _this$options2.segment; var maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY; - var directUpdate = me.chart._animationsDisabled || reset || mode === 'none'; - var prevParsed = start > 0 && me.getParsed(start - 1); - - for (var i = start; i < start + count; ++i) { + var directUpdate = this.chart._animationsDisabled || reset || mode === 'none'; + var end = start + count; + var pointsCount = points.length; + var prevParsed = start > 0 && this.getParsed(start - 1); + for (var i = 0; i < pointsCount; ++i) { var point = points[i]; - var parsed = me.getParsed(i); var properties = directUpdate ? point : {}; - var x = properties.x = xScale.getPixelForValue(parsed.x, i); - var y = properties.y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(_stacked ? me.applyStack(yScale, parsed, _stacked) : parsed.y, i); - properties.skip = isNaN(x) || isNaN(y); - properties.stop = i > 0 && parsed.x - prevParsed.x > maxGapLength; - + if (i < start || i >= end) { + properties.skip = true; + continue; + } + var parsed = this.getParsed(i); + var nullData = isNullOrUndef(parsed[vAxis]); + var iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i); + var vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i); + properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData; + properties.stop = i > 0 && Math.abs(parsed[iAxis] - prevParsed[iAxis]) > maxGapLength; + if (segment) { + properties.parsed = parsed; + properties.raw = _dataset.data[i]; + } if (includeOptions) { - properties.options = sharedOptions || me.resolveDataElementOptions(i, mode); + properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode); } - if (!directUpdate) { - me.updateElement(point, i, properties, mode); + this.updateElement(point, i, properties, mode); } - prevParsed = parsed; } - - me.updateSharedOptions(sharedOptions, mode, firstOpts); } }, { key: "getMaxOverflow", value: function getMaxOverflow() { - var me = this; - var meta = me._cachedMeta; + var meta = this._cachedMeta; var dataset = meta.dataset; var border = dataset.options && dataset.options.borderWidth || 0; var data = meta.data || []; - if (!data.length) { return border; } - - var firstPoint = data[0].size(me.resolveDataElementOptions(0)); - var lastPoint = data[data.length - 1].size(me.resolveDataElementOptions(data.length - 1)); + var firstPoint = data[0].size(this.resolveDataElementOptions(0)); + var lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1)); return Math.max(border, firstPoint, lastPoint) / 2; } }, { key: "draw", value: function draw() { - this._cachedMeta.dataset.updateControlPoints(this.chart.chartArea); - - _get(_getPrototypeOf(LineController.prototype), "draw", this).call(this); + var meta = this._cachedMeta; + meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis); + _get(_getPrototypeOf$w(LineController.prototype), "draw", this).call(this); } }]); - return LineController; }(DatasetController); - - LineController.id = 'line'; - LineController.defaults = { + _defineProperty$w(LineController, "id", 'line'); + _defineProperty$w(LineController, "defaults", { datasetElementType: 'line', dataElementType: 'point', showLine: true, spanGaps: false - }; - LineController.overrides = { + }); + _defineProperty$w(LineController, "overrides", { scales: { _index_: { type: 'category' }, _value_: { type: 'linear' } } - }; - - function getStartAndCountOfVisiblePoints(meta, points, animationsDisabled) { - var pointCount = points.length; - var start = 0; - var count = pointCount; - - if (meta._sorted) { - var iScale = meta.iScale, - _parsed = meta._parsed; - var axis = iScale.axis; - - var _iScale$getUserBounds = iScale.getUserBounds(), - min = _iScale$getUserBounds.min, - max = _iScale$getUserBounds.max, - minDefined = _iScale$getUserBounds.minDefined, - maxDefined = _iScale$getUserBounds.maxDefined; - - if (minDefined) { - start = _limitValue(Math.min(_lookupByKey(_parsed, iScale.axis, min).lo, animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo), 0, pointCount - 1); - } - - if (maxDefined) { - count = _limitValue(Math.max(_lookupByKey(_parsed, iScale.axis, max).hi + 1, animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max)).hi + 1), start, pointCount) - start; - } else { - count = pointCount - start; - } - } - - return { - start: start, - count: count - }; - } - - function scaleRangesChanged(meta) { - var xScale = meta.xScale, - yScale = meta.yScale, - _scaleRanges = meta._scaleRanges; - var newRanges = { - xmin: xScale.min, - xmax: xScale.max, - ymin: yScale.min, - ymax: yScale.max - }; - - if (!_scaleRanges) { - meta._scaleRanges = newRanges; - return true; - } - - var changed = _scaleRanges.xmin !== xScale.min || _scaleRanges.xmax !== xScale.max || _scaleRanges.ymin !== yScale.min || _scaleRanges.ymax !== yScale.max; - Object.assign(_scaleRanges, newRanges); - return changed; - } - + }); var PolarAreaController = /*#__PURE__*/function (_DatasetController5) { - _inherits(PolarAreaController, _DatasetController5); - - var _super5 = _createSuper(PolarAreaController); - + _inherits$w(PolarAreaController, _DatasetController5); + var _super5 = _createSuper$w(PolarAreaController); function PolarAreaController(chart, datasetIndex) { - var _this2; - - _classCallCheck(this, PolarAreaController); - - _this2 = _super5.call(this, chart, datasetIndex); - _this2.innerRadius = undefined; - _this2.outerRadius = undefined; - return _this2; + var _this5; + _classCallCheck$x(this, PolarAreaController); + _this5 = _super5.call(this, chart, datasetIndex); + _this5.innerRadius = undefined; + _this5.outerRadius = undefined; + return _this5; } - - _createClass(PolarAreaController, [{ + _createClass$x(PolarAreaController, [{ + key: "getLabelAndValue", + value: function getLabelAndValue(index) { + var meta = this._cachedMeta; + var chart = this.chart; + var labels = chart.data.labels || []; + var value = formatNumber(meta._parsed[index].r, chart.options.locale); + return { + label: labels[index] || '', + value: value + }; + } + }, { + key: "parseObjectData", + value: function parseObjectData(meta, data, start, count) { + return _parseObjectDataRadialScale.bind(this)(meta, data, start, count); + } + }, { key: "update", value: function update(mode) { var arcs = this._cachedMeta.data; - this._updateRadius(); - this.updateElements(arcs, 0, arcs.length, mode); } }, { + key: "getMinMax", + value: function getMinMax() { + var _this6 = this; + var meta = this._cachedMeta; + var range = { + min: Number.POSITIVE_INFINITY, + max: Number.NEGATIVE_INFINITY + }; + meta.data.forEach(function (element, index) { + var parsed = _this6.getParsed(index).r; + if (!isNaN(parsed) && _this6.chart.getDataVisibility(index)) { + if (parsed < range.min) { + range.min = parsed; + } + if (parsed > range.max) { + range.max = parsed; + } + } + }); + return range; + } + }, { key: "_updateRadius", value: function _updateRadius() { - var me = this; - var chart = me.chart; + var chart = this.chart; var chartArea = chart.chartArea; var opts = chart.options; var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top); var outerRadius = Math.max(minSize / 2, 0); var innerRadius = Math.max(opts.cutoutPercentage ? outerRadius / 100 * opts.cutoutPercentage : 1, 0); var radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount(); - me.outerRadius = outerRadius - radiusLength * me.index; - me.innerRadius = me.outerRadius - radiusLength; + this.outerRadius = outerRadius - radiusLength * this.index; + this.innerRadius = this.outerRadius - radiusLength; } }, { key: "updateElements", value: function updateElements(arcs, start, count, mode) { - var me = this; var reset = mode === 'reset'; - var chart = me.chart; - var dataset = me.getDataset(); + var chart = this.chart; var opts = chart.options; var animationOpts = opts.animation; - var scale = me._cachedMeta.rScale; + var scale = this._cachedMeta.rScale; var centerX = scale.xCenter; var centerY = scale.yCenter; var datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI; var angle = datasetStartAngle; var i; - var defaultAngle = 360 / me.countVisibleElements(); - + var defaultAngle = 360 / this.countVisibleElements(); for (i = 0; i < start; ++i) { - angle += me._computeAngle(i, mode, defaultAngle); + angle += this._computeAngle(i, mode, defaultAngle); } - for (i = start; i < start + count; i++) { var arc = arcs[i]; var startAngle = angle; - - var endAngle = angle + me._computeAngle(i, mode, defaultAngle); - - var outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(dataset.data[i]) : 0; + var endAngle = angle + this._computeAngle(i, mode, defaultAngle); + var outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0; angle = endAngle; - if (reset) { if (animationOpts.animateScale) { outerRadius = 0; } - if (animationOpts.animateRotate) { startAngle = endAngle = datasetStartAngle; } } - var properties = { x: centerX, y: centerY, innerRadius: 0, outerRadius: outerRadius, startAngle: startAngle, endAngle: endAngle, - options: me.resolveDataElementOptions(i, mode) + options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode) }; - me.updateElement(arc, i, properties, mode); + this.updateElement(arc, i, properties, mode); } } }, { key: "countVisibleElements", value: function countVisibleElements() { - var _this3 = this; - - var dataset = this.getDataset(); + var _this7 = this; var meta = this._cachedMeta; var count = 0; meta.data.forEach(function (element, index) { - if (!isNaN(dataset.data[index]) && _this3.chart.getDataVisibility(index)) { + if (!isNaN(_this7.getParsed(index).r) && _this7.chart.getDataVisibility(index)) { count++; } }); return count; } @@ -6424,16 +6543,14 @@ key: "_computeAngle", value: function _computeAngle(index, mode, defaultAngle) { return this.chart.getDataVisibility(index) ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle) : 0; } }]); - return PolarAreaController; }(DatasetController); - - PolarAreaController.id = 'polarArea'; - PolarAreaController.defaults = { + _defineProperty$w(PolarAreaController, "id", 'polarArea'); + _defineProperty$w(PolarAreaController, "defaults", { dataElementType: 'arc', animation: { animateRotate: true, animateScale: true }, @@ -6443,51 +6560,44 @@ properties: ['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius'] } }, indexAxis: 'r', startAngle: 0 - }; - PolarAreaController.overrides = { + }); + _defineProperty$w(PolarAreaController, "overrides", { aspectRatio: 1, plugins: { legend: { labels: { generateLabels: function generateLabels(chart) { var data = chart.data; - if (data.labels.length && data.datasets.length) { + var _chart$legend$options3 = chart.legend.options.labels, + pointStyle = _chart$legend$options3.pointStyle, + color = _chart$legend$options3.color; return data.labels.map(function (label, i) { var meta = chart.getDatasetMeta(0); var style = meta.controller.getStyle(i); return { text: label, fillStyle: style.backgroundColor, strokeStyle: style.borderColor, + fontColor: color, lineWidth: style.borderWidth, + pointStyle: pointStyle, hidden: !chart.getDataVisibility(i), index: i }; }); } - return []; } }, onClick: function onClick(e, legendItem, legend) { legend.chart.toggleDataVisibility(legendItem.index); legend.chart.update(); } - }, - tooltip: { - callbacks: { - title: function title() { - return ''; - }, - label: function label(context) { - return context.chart.data.labels[context.dataIndex] + ': ' + context.formattedValue; - } - } } }, scales: { r: { type: 'radialLinear', @@ -6502,177 +6612,265 @@ display: false }, startAngle: 0 } } - }; - + }); var PieController = /*#__PURE__*/function (_DoughnutController) { - _inherits(PieController, _DoughnutController); - - var _super6 = _createSuper(PieController); - + _inherits$w(PieController, _DoughnutController); + var _super6 = _createSuper$w(PieController); function PieController() { - _classCallCheck(this, PieController); - + _classCallCheck$x(this, PieController); return _super6.apply(this, arguments); } - - return PieController; + return _createClass$x(PieController); }(DoughnutController); - - PieController.id = 'pie'; - PieController.defaults = { + _defineProperty$w(PieController, "id", 'pie'); + _defineProperty$w(PieController, "defaults", { cutout: 0, rotation: 0, circumference: 360, radius: '100%' - }; - + }); var RadarController = /*#__PURE__*/function (_DatasetController6) { - _inherits(RadarController, _DatasetController6); - - var _super7 = _createSuper(RadarController); - + _inherits$w(RadarController, _DatasetController6); + var _super7 = _createSuper$w(RadarController); function RadarController() { - _classCallCheck(this, RadarController); - + _classCallCheck$x(this, RadarController); return _super7.apply(this, arguments); } - - _createClass(RadarController, [{ + _createClass$x(RadarController, [{ key: "getLabelAndValue", value: function getLabelAndValue(index) { - var me = this; - var vScale = me._cachedMeta.vScale; - var parsed = me.getParsed(index); + var vScale = this._cachedMeta.vScale; + var parsed = this.getParsed(index); return { label: vScale.getLabels()[index], value: '' + vScale.getLabelForValue(parsed[vScale.axis]) }; } }, { + key: "parseObjectData", + value: function parseObjectData(meta, data, start, count) { + return _parseObjectDataRadialScale.bind(this)(meta, data, start, count); + } + }, { key: "update", value: function update(mode) { - var me = this; - var meta = me._cachedMeta; + var meta = this._cachedMeta; var line = meta.dataset; var points = meta.data || []; var labels = meta.iScale.getLabels(); line.points = points; - if (mode !== 'resize') { - var options = me.resolveDatasetElementOptions(mode); - - if (!me.options.showLine) { + var options = this.resolveDatasetElementOptions(mode); + if (!this.options.showLine) { options.borderWidth = 0; } - var properties = { _loop: true, _fullLoop: labels.length === points.length, options: options }; - me.updateElement(line, undefined, properties, mode); + this.updateElement(line, undefined, properties, mode); } - - me.updateElements(points, 0, points.length, mode); + this.updateElements(points, 0, points.length, mode); } }, { key: "updateElements", value: function updateElements(points, start, count, mode) { - var me = this; - var dataset = me.getDataset(); - var scale = me._cachedMeta.rScale; + var scale = this._cachedMeta.rScale; var reset = mode === 'reset'; - for (var i = start; i < start + count; i++) { var point = points[i]; - var options = me.resolveDataElementOptions(i, mode); - var pointPosition = scale.getPointPositionForValue(i, dataset.data[i]); + var options = this.resolveDataElementOptions(i, point.active ? 'active' : mode); + var pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r); var x = reset ? scale.xCenter : pointPosition.x; var y = reset ? scale.yCenter : pointPosition.y; var properties = { x: x, y: y, angle: pointPosition.angle, skip: isNaN(x) || isNaN(y), options: options }; - me.updateElement(point, i, properties, mode); + this.updateElement(point, i, properties, mode); } } }]); - return RadarController; }(DatasetController); - - RadarController.id = 'radar'; - RadarController.defaults = { + _defineProperty$w(RadarController, "id", 'radar'); + _defineProperty$w(RadarController, "defaults", { datasetElementType: 'line', dataElementType: 'point', indexAxis: 'r', showLine: true, elements: { line: { fill: 'start' } } - }; - RadarController.overrides = { + }); + _defineProperty$w(RadarController, "overrides", { aspectRatio: 1, scales: { r: { type: 'radialLinear' } } - }; - - var ScatterController = /*#__PURE__*/function (_LineController) { - _inherits(ScatterController, _LineController); - - var _super8 = _createSuper(ScatterController); - + }); + var ScatterController = /*#__PURE__*/function (_DatasetController7) { + _inherits$w(ScatterController, _DatasetController7); + var _super8 = _createSuper$w(ScatterController); function ScatterController() { - _classCallCheck(this, ScatterController); - + _classCallCheck$x(this, ScatterController); return _super8.apply(this, arguments); } - + _createClass$x(ScatterController, [{ + key: "getLabelAndValue", + value: function getLabelAndValue(index) { + var meta = this._cachedMeta; + var labels = this.chart.data.labels || []; + var xScale = meta.xScale, + yScale = meta.yScale; + var parsed = this.getParsed(index); + var x = xScale.getLabelForValue(parsed.x); + var y = yScale.getLabelForValue(parsed.y); + return { + label: labels[index] || '', + value: '(' + x + ', ' + y + ')' + }; + } + }, { + key: "update", + value: function update(mode) { + var meta = this._cachedMeta; + var _meta$data2 = meta.data, + points = _meta$data2 === void 0 ? [] : _meta$data2; + var animationsDisabled = this.chart._animationsDisabled; + var _getStartAndCountOfVi2 = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled), + start = _getStartAndCountOfVi2.start, + count = _getStartAndCountOfVi2.count; + this._drawStart = start; + this._drawCount = count; + if (_scaleRangesChanged(meta)) { + start = 0; + count = points.length; + } + if (this.options.showLine) { + var line = meta.dataset, + _dataset = meta._dataset; + line._chart = this.chart; + line._datasetIndex = this.index; + line._decimated = !!_dataset._decimated; + line.points = points; + var options = this.resolveDatasetElementOptions(mode); + options.segment = this.options.segment; + this.updateElement(line, undefined, { + animated: !animationsDisabled, + options: options + }, mode); + } + this.updateElements(points, start, count, mode); + } + }, { + key: "addElements", + value: function addElements() { + var showLine = this.options.showLine; + if (!this.datasetElementType && showLine) { + this.datasetElementType = this.chart.registry.getElement('line'); + } + _get(_getPrototypeOf$w(ScatterController.prototype), "addElements", this).call(this); + } + }, { + key: "updateElements", + value: function updateElements(points, start, count, mode) { + var reset = mode === 'reset'; + var _this$_cachedMeta4 = this._cachedMeta, + iScale = _this$_cachedMeta4.iScale, + vScale = _this$_cachedMeta4.vScale, + _stacked = _this$_cachedMeta4._stacked, + _dataset = _this$_cachedMeta4._dataset; + var firstOpts = this.resolveDataElementOptions(start, mode); + var sharedOptions = this.getSharedOptions(firstOpts); + var includeOptions = this.includeOptions(mode, sharedOptions); + var iAxis = iScale.axis; + var vAxis = vScale.axis; + var _this$options3 = this.options, + spanGaps = _this$options3.spanGaps, + segment = _this$options3.segment; + var maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY; + var directUpdate = this.chart._animationsDisabled || reset || mode === 'none'; + var prevParsed = start > 0 && this.getParsed(start - 1); + for (var i = start; i < start + count; ++i) { + var point = points[i]; + var parsed = this.getParsed(i); + var properties = directUpdate ? point : {}; + var nullData = isNullOrUndef(parsed[vAxis]); + var iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i); + var vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i); + properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData; + properties.stop = i > 0 && Math.abs(parsed[iAxis] - prevParsed[iAxis]) > maxGapLength; + if (segment) { + properties.parsed = parsed; + properties.raw = _dataset.data[i]; + } + if (includeOptions) { + properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode); + } + if (!directUpdate) { + this.updateElement(point, i, properties, mode); + } + prevParsed = parsed; + } + this.updateSharedOptions(sharedOptions, mode, firstOpts); + } + }, { + key: "getMaxOverflow", + value: function getMaxOverflow() { + var meta = this._cachedMeta; + var data = meta.data || []; + if (!this.options.showLine) { + var max = 0; + for (var i = data.length - 1; i >= 0; --i) { + max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2); + } + return max > 0 && max; + } + var dataset = meta.dataset; + var border = dataset.options && dataset.options.borderWidth || 0; + if (!data.length) { + return border; + } + var firstPoint = data[0].size(this.resolveDataElementOptions(0)); + var lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1)); + return Math.max(border, firstPoint, lastPoint) / 2; + } + }]); return ScatterController; - }(LineController); - - ScatterController.id = 'scatter'; - ScatterController.defaults = { + }(DatasetController); + _defineProperty$w(ScatterController, "id", 'scatter'); + _defineProperty$w(ScatterController, "defaults", { + datasetElementType: false, + dataElementType: 'point', showLine: false, fill: false - }; - ScatterController.overrides = { + }); + _defineProperty$w(ScatterController, "overrides", { interaction: { mode: 'point' }, - plugins: { - tooltip: { - callbacks: { - title: function title() { - return ''; - }, - label: function label(item) { - return '(' + item.label + ', ' + item.formattedValue + ')'; - } - } - } - }, scales: { x: { type: 'linear' }, y: { type: 'linear' } } - }; + }); var controllers = /*#__PURE__*/Object.freeze({ __proto__: null, BarController: BarController, BubbleController: BubbleController, DoughnutController: DoughnutController, @@ -6681,202 +6879,201 @@ PieController: PieController, RadarController: RadarController, ScatterController: ScatterController }); - function abstract() { - throw new Error('This method is not implemented: either no adapter can be found or an incomplete integration was provided.'); + /** + * @namespace Chart._adapters + * @since 2.8.0 + * @private + */ + function _abstract() { + throw new Error('This method is not implemented: Check that a complete date adapter is provided.'); } - - var DateAdapter = /*#__PURE__*/function () { - function DateAdapter(options) { - _classCallCheck(this, DateAdapter); - + /** + * Date adapter (current used by the time scale) + * @namespace Chart._adapters._date + * @memberof Chart._adapters + * @private + */ + var DateAdapterBase = /*#__PURE__*/function () { + function DateAdapterBase(options) { + _classCallCheck$x(this, DateAdapterBase); this.options = options || {}; } - - _createClass(DateAdapter, [{ + // eslint-disable-next-line @typescript-eslint/no-empty-function + _createClass$x(DateAdapterBase, [{ + key: "init", + value: function init() {} + }, { key: "formats", value: function formats() { - return abstract(); + return _abstract(); } }, { key: "parse", - value: function parse(value, format) { - return abstract(); + value: function parse() { + return _abstract(); } }, { key: "format", - value: function format(timestamp, _format) { - return abstract(); + value: function format() { + return _abstract(); } }, { key: "add", - value: function add(timestamp, amount, unit) { - return abstract(); + value: function add() { + return _abstract(); } }, { key: "diff", - value: function diff(a, b, unit) { - return abstract(); + value: function diff() { + return _abstract(); } }, { key: "startOf", - value: function startOf(timestamp, unit, weekday) { - return abstract(); + value: function startOf() { + return _abstract(); } }, { key: "endOf", - value: function endOf(timestamp, unit) { - return abstract(); + value: function endOf() { + return _abstract(); } + }], [{ + key: "override", + value: + /** + * Override default date adapter methods. + * Accepts type parameter to define options type. + * @example + * Chart._adapters._date.override<{myAdapterOption: string}>({ + * init() { + * console.log(this.options.myAdapterOption); + * } + * }) + */ + function override(members) { + Object.assign(DateAdapterBase.prototype, members); + } }]); - - return DateAdapter; + return DateAdapterBase; }(); - - DateAdapter.override = function (members) { - Object.assign(DateAdapter.prototype, members); - }; - var adapters = { - _date: DateAdapter + _date: DateAdapterBase }; - - function getRelativePosition(e, chart) { - if ('native' in e) { - return { - x: e.x, - y: e.y - }; - } - - return getRelativePosition$1(e, chart); - } - - function evaluateAllVisibleItems(chart, handler) { - var metasets = chart.getSortedVisibleDatasetMetas(); - var index, data, element; - - for (var i = 0, ilen = metasets.length; i < ilen; ++i) { - var _metasets$i = metasets[i]; - index = _metasets$i.index; - data = _metasets$i.data; - - for (var j = 0, jlen = data.length; j < jlen; ++j) { - element = data[j]; - - if (!element.skip) { - handler(element, index, j); - } - } - } - } - function binarySearch(metaset, axis, value, intersect) { var controller = metaset.controller, - data = metaset.data, - _sorted = metaset._sorted; + data = metaset.data, + _sorted = metaset._sorted; var iScale = controller._cachedMeta.iScale; - - if (iScale && axis === iScale.axis && _sorted && data.length) { + if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) { var lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey; - if (!intersect) { return lookupMethod(data, axis, value); } else if (controller._sharedOptions) { var el = data[0]; var range = typeof el.getRange === 'function' && el.getRange(axis); - if (range) { var start = lookupMethod(data, axis, value - range); var end = lookupMethod(data, axis, value + range); return { lo: start.lo, hi: end.hi }; } } } - return { lo: 0, hi: data.length - 1 }; } - - function optimizedEvaluateItems(chart, axis, position, handler, intersect) { + function evaluateInteractionItems(chart, axis, position, handler, intersect) { var metasets = chart.getSortedVisibleDatasetMetas(); var value = position[axis]; - for (var i = 0, ilen = metasets.length; i < ilen; ++i) { - var _metasets$i2 = metasets[i], - index = _metasets$i2.index, - data = _metasets$i2.data; - + var _metasets$i = metasets[i], + _index2 = _metasets$i.index, + data = _metasets$i.data; var _binarySearch = binarySearch(metasets[i], axis, value, intersect), - lo = _binarySearch.lo, - hi = _binarySearch.hi; - + lo = _binarySearch.lo, + hi = _binarySearch.hi; for (var j = lo; j <= hi; ++j) { var element = data[j]; - if (!element.skip) { - handler(element, index, j); + handler(element, _index2, j); } } } } - function getDistanceMetricForAxis(axis) { var useX = axis.indexOf('x') !== -1; var useY = axis.indexOf('y') !== -1; return function (pt1, pt2) { var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0; var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0; return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); }; } - - function getIntersectItems(chart, position, axis, useFinalPosition) { + function getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) { var items = []; - - if (!_isPointInArea(position, chart.chartArea, chart._minPadding)) { + if (!includeInvisible && !chart.isPointInArea(position)) { return items; } - var evaluationFunc = function evaluationFunc(element, datasetIndex, index) { + if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) { + return; + } if (element.inRange(position.x, position.y, useFinalPosition)) { items.push({ element: element, datasetIndex: datasetIndex, index: index }); } }; - - optimizedEvaluateItems(chart, axis, position, evaluationFunc, true); + evaluateInteractionItems(chart, axis, position, evaluationFunc, true); return items; } - - function getNearestItems(chart, position, axis, intersect, useFinalPosition) { - var distanceMetric = getDistanceMetricForAxis(axis); - var minDistance = Number.POSITIVE_INFINITY; + function getNearestRadialItems(chart, position, axis, useFinalPosition) { var items = []; - - if (!_isPointInArea(position, chart.chartArea, chart._minPadding)) { - return items; + function evaluationFunc(element, datasetIndex, index) { + var _element$getProps = element.getProps(['startAngle', 'endAngle'], useFinalPosition), + startAngle = _element$getProps.startAngle, + endAngle = _element$getProps.endAngle; + var _getAngleFromPoint = getAngleFromPoint(element, { + x: position.x, + y: position.y + }), + angle = _getAngleFromPoint.angle; + if (_angleBetween(angle, startAngle, endAngle)) { + items.push({ + element: element, + datasetIndex: datasetIndex, + index: index + }); + } } - - var evaluationFunc = function evaluationFunc(element, datasetIndex, index) { - if (intersect && !element.inRange(position.x, position.y, useFinalPosition)) { + evaluateInteractionItems(chart, axis, position, evaluationFunc); + return items; + } + function getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) { + var items = []; + var distanceMetric = getDistanceMetricForAxis(axis); + var minDistance = Number.POSITIVE_INFINITY; + function evaluationFunc(element, datasetIndex, index) { + var inRange = element.inRange(position.x, position.y, useFinalPosition); + if (intersect && !inRange) { return; } - var center = element.getCenterPoint(useFinalPosition); + var pointInArea = !!includeInvisible || chart.isPointInArea(center); + if (!pointInArea && !inRange) { + return; + } var distance = distanceMetric(position, center); - if (distance < minDistance) { items = [{ element: element, datasetIndex: datasetIndex, index: index @@ -6887,59 +7084,54 @@ element: element, datasetIndex: datasetIndex, index: index }); } - }; - - optimizedEvaluateItems(chart, axis, position, evaluationFunc); + } + evaluateInteractionItems(chart, axis, position, evaluationFunc); return items; } - - function getAxisItems(chart, e, options, useFinalPosition) { - var position = getRelativePosition(e, chart); + function getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) { + if (!includeInvisible && !chart.isPointInArea(position)) { + return []; + } + return axis === 'r' && !intersect ? getNearestRadialItems(chart, position, axis, useFinalPosition) : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible); + } + function getAxisItems(chart, position, axis, intersect, useFinalPosition) { var items = []; - var axis = options.axis; var rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange'; var intersectsItem = false; - evaluateAllVisibleItems(chart, function (element, datasetIndex, index) { + evaluateInteractionItems(chart, axis, position, function (element, datasetIndex, index) { if (element[rangeMethod](position[axis], useFinalPosition)) { items.push({ element: element, datasetIndex: datasetIndex, index: index }); + intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition); } - - if (element.inRange(position.x, position.y, useFinalPosition)) { - intersectsItem = true; - } }); - - if (options.intersect && !intersectsItem) { + if (intersect && !intersectsItem) { return []; } - return items; } - var Interaction = { + evaluateInteractionItems: evaluateInteractionItems, modes: { index: function index(chart, e, options, useFinalPosition) { var position = getRelativePosition(e, chart); var axis = options.axis || 'x'; - var items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition) : getNearestItems(chart, position, axis, false, useFinalPosition); + var includeInvisible = options.includeInvisible || false; + var items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible); var elements = []; - if (!items.length) { return []; } - chart.getSortedVisibleDatasetMetas().forEach(function (meta) { var index = items[0].index; var element = meta.data[index]; - if (element && !element.skip) { elements.push({ element: element, datasetIndex: meta.index, index: index @@ -6949,104 +7141,138 @@ return elements; }, dataset: function dataset(chart, e, options, useFinalPosition) { var position = getRelativePosition(e, chart); var axis = options.axis || 'xy'; - var items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition) : getNearestItems(chart, position, axis, false, useFinalPosition); - + var includeInvisible = options.includeInvisible || false; + var items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible); if (items.length > 0) { var datasetIndex = items[0].datasetIndex; var data = chart.getDatasetMeta(datasetIndex).data; items = []; - for (var i = 0; i < data.length; ++i) { items.push({ element: data[i], datasetIndex: datasetIndex, index: i }); } } - return items; }, point: function point(chart, e, options, useFinalPosition) { var position = getRelativePosition(e, chart); var axis = options.axis || 'xy'; - return getIntersectItems(chart, position, axis, useFinalPosition); + var includeInvisible = options.includeInvisible || false; + return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible); }, nearest: function nearest(chart, e, options, useFinalPosition) { var position = getRelativePosition(e, chart); var axis = options.axis || 'xy'; - return getNearestItems(chart, position, axis, options.intersect, useFinalPosition); + var includeInvisible = options.includeInvisible || false; + return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible); }, x: function x(chart, e, options, useFinalPosition) { - options.axis = 'x'; - return getAxisItems(chart, e, options, useFinalPosition); + var position = getRelativePosition(e, chart); + return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition); }, y: function y(chart, e, options, useFinalPosition) { - options.axis = 'y'; - return getAxisItems(chart, e, options, useFinalPosition); + var position = getRelativePosition(e, chart); + return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition); } } }; var STATIC_POSITIONS = ['left', 'top', 'right', 'bottom']; - function filterByPosition(array, position) { return array.filter(function (v) { return v.pos === position; }); } - function filterDynamicPositionByAxis(array, axis) { return array.filter(function (v) { return STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis; }); } - function sortByWeight(array, reverse) { return array.sort(function (a, b) { var v0 = reverse ? b : a; var v1 = reverse ? a : b; return v0.weight === v1.weight ? v0.index - v1.index : v0.weight - v1.weight; }); } - function wrapBoxes(boxes) { var layoutBoxes = []; - var i, ilen, box; - + var i, ilen, box, pos, stack, stackWeight; for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) { box = boxes[i]; + var _box = box; + pos = _box.position; + var _box$options = _box.options; + stack = _box$options.stack; + var _box$options$stackWei = _box$options.stackWeight; + stackWeight = _box$options$stackWei === void 0 ? 1 : _box$options$stackWei; layoutBoxes.push({ index: i, box: box, - pos: box.position, + pos: pos, horizontal: box.isHorizontal(), - weight: box.weight + weight: box.weight, + stack: stack && pos + stack, + stackWeight: stackWeight }); } - return layoutBoxes; } - + function buildStacks(layouts) { + var stacks = {}; + var _iterator5 = _createForOfIteratorHelper$1(layouts), + _step5; + try { + for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) { + var wrap = _step5.value; + var stack = wrap.stack, + pos = wrap.pos, + stackWeight = wrap.stackWeight; + if (!stack || !STATIC_POSITIONS.includes(pos)) { + continue; + } + var _stack = stacks[stack] || (stacks[stack] = { + count: 0, + placed: 0, + weight: 0, + size: 0 + }); + _stack.count++; + _stack.weight += stackWeight; + } + } catch (err) { + _iterator5.e(err); + } finally { + _iterator5.f(); + } + return stacks; + } function setLayoutDims(layouts, params) { + var stacks = buildStacks(layouts); + var vBoxMaxWidth = params.vBoxMaxWidth, + hBoxMaxHeight = params.hBoxMaxHeight; var i, ilen, layout; - for (i = 0, ilen = layouts.length; i < ilen; ++i) { layout = layouts[i]; - + var fullSize = layout.box.fullSize; + var stack = stacks[layout.stack]; + var factor = stack && layout.stackWeight / stack.weight; if (layout.horizontal) { - layout.width = layout.box.fullSize && params.availableWidth; - layout.height = params.hBoxMaxHeight; + layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth; + layout.height = hBoxMaxHeight; } else { - layout.width = params.vBoxMaxWidth; - layout.height = layout.box.fullSize && params.availableHeight; + layout.width = vBoxMaxWidth; + layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight; } } + return stacks; } - function buildLayoutBoxes(boxes) { var layoutBoxes = wrapBoxes(boxes); var fullSize = sortByWeight(layoutBoxes.filter(function (wrap) { return wrap.box.fullSize; }), true); @@ -7063,44 +7289,38 @@ chartArea: filterByPosition(layoutBoxes, 'chartArea'), vertical: left.concat(right).concat(centerVertical), horizontal: top.concat(bottom).concat(centerHorizontal) }; } - function getCombinedMax(maxPadding, chartArea, a, b) { return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]); } - function updateMaxPadding(maxPadding, boxPadding) { maxPadding.top = Math.max(maxPadding.top, boxPadding.top); maxPadding.left = Math.max(maxPadding.left, boxPadding.left); maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom); maxPadding.right = Math.max(maxPadding.right, boxPadding.right); } - - function updateDims(chartArea, params, layout) { - var box = layout.box; + function updateDims(chartArea, params, layout, stacks) { + var pos = layout.pos, + box = layout.box; var maxPadding = chartArea.maxPadding; - - if (isObject(layout.pos)) { - return { - same: false, - other: false + if (!isObject(pos)) { + if (layout.size) { + chartArea[pos] -= layout.size; + } + var stack = stacks[layout.stack] || { + size: 0, + count: 1 }; + stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width); + layout.size = stack.size / stack.count; + chartArea[pos] += layout.size; } - - if (layout.size) { - chartArea[layout.pos] -= layout.size; - } - - layout.size = layout.horizontal ? box.height : box.width; - chartArea[layout.pos] += layout.size; - if (box.getPadding) { updateMaxPadding(maxPadding, box.getPadding()); } - var newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right')); var newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom')); var widthChanged = newWidth !== chartArea.w; var heightChanged = newHeight !== chartArea.h; chartArea.w = newWidth; @@ -7111,29 +7331,24 @@ } : { same: heightChanged, other: widthChanged }; } - function handleMaxPadding(chartArea) { var maxPadding = chartArea.maxPadding; - function updatePos(pos) { var change = Math.max(maxPadding[pos] - chartArea[pos], 0); chartArea[pos] += change; return change; } - chartArea.y += updatePos('top'); chartArea.x += updatePos('left'); updatePos('right'); updatePos('bottom'); } - function getMargins(horizontal, chartArea) { var maxPadding = chartArea.maxPadding; - function marginForPositions(positions) { var margin = { left: 0, top: 0, right: 0, @@ -7142,101 +7357,112 @@ positions.forEach(function (pos) { margin[pos] = Math.max(chartArea[pos], maxPadding[pos]); }); return margin; } - return horizontal ? marginForPositions(['left', 'right']) : marginForPositions(['top', 'bottom']); } - - function fitBoxes(boxes, chartArea, params) { + function fitBoxes(boxes, chartArea, params, stacks) { var refitBoxes = []; var i, ilen, layout, box, refit, changed; - for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) { layout = boxes[i]; box = layout.box; box.update(layout.width || chartArea.w, layout.height || chartArea.h, getMargins(layout.horizontal, chartArea)); - - var _updateDims = updateDims(chartArea, params, layout), - same = _updateDims.same, - other = _updateDims.other; - + var _updateDims = updateDims(chartArea, params, layout, stacks), + same = _updateDims.same, + other = _updateDims.other; refit |= same && refitBoxes.length; changed = changed || other; - if (!box.fullSize) { refitBoxes.push(layout); } } - - return refit && fitBoxes(refitBoxes, chartArea, params) || changed; + return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed; } - - function placeBoxes(boxes, chartArea, params) { + function setBoxDims(box, left, top, width, height) { + box.top = top; + box.left = left; + box.right = left + width; + box.bottom = top + height; + box.width = width; + box.height = height; + } + function placeBoxes(boxes, chartArea, params, stacks) { var userPadding = params.padding; - var x = chartArea.x; - var y = chartArea.y; - var i, ilen, layout, box; - - for (i = 0, ilen = boxes.length; i < ilen; ++i) { - layout = boxes[i]; - box = layout.box; - - if (layout.horizontal) { - box.left = box.fullSize ? userPadding.left : chartArea.left; - box.right = box.fullSize ? params.outerWidth - userPadding.right : chartArea.left + chartArea.w; - box.top = y; - box.bottom = y + box.height; - box.width = box.right - box.left; - y = box.bottom; - } else { - box.left = x; - box.right = x + box.width; - box.top = box.fullSize ? userPadding.top : chartArea.top; - box.bottom = box.fullSize ? params.outerHeight - userPadding.right : chartArea.top + chartArea.h; - box.height = box.bottom - box.top; - x = box.right; + var x = chartArea.x, + y = chartArea.y; + var _iterator6 = _createForOfIteratorHelper$1(boxes), + _step6; + try { + for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) { + var layout = _step6.value; + var box = layout.box; + var stack = stacks[layout.stack] || { + count: 1, + placed: 0, + weight: 1 + }; + var weight = layout.stackWeight / stack.weight || 1; + if (layout.horizontal) { + var width = chartArea.w * weight; + var height = stack.size || box.height; + if (defined(stack.start)) { + y = stack.start; + } + if (box.fullSize) { + setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height); + } else { + setBoxDims(box, chartArea.left + stack.placed, y, width, height); + } + stack.start = y; + stack.placed += width; + y = box.bottom; + } else { + var height1 = chartArea.h * weight; + var width1 = stack.size || box.width; + if (defined(stack.start)) { + x = stack.start; + } + if (box.fullSize) { + setBoxDims(box, x, userPadding.top, width1, params.outerHeight - userPadding.bottom - userPadding.top); + } else { + setBoxDims(box, x, chartArea.top + stack.placed, width1, height1); + } + stack.start = x; + stack.placed += height1; + x = box.right; + } } + } catch (err) { + _iterator6.e(err); + } finally { + _iterator6.f(); } - chartArea.x = x; chartArea.y = y; } - - defaults.set('layout', { - padding: { - top: 0, - right: 0, - bottom: 0, - left: 0 - } - }); var layouts = { addBox: function addBox(chart, item) { if (!chart.boxes) { chart.boxes = []; } - item.fullSize = item.fullSize || false; item.position = item.position || 'top'; item.weight = item.weight || 0; - item._layers = item._layers || function () { return [{ z: 0, draw: function draw(chartArea) { item.draw(chartArea); } }]; }; - chart.boxes.push(item); }, removeBox: function removeBox(chart, layoutItem) { var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1; - if (index !== -1) { chart.boxes.splice(index, 1); } }, configure: function configure(chart, item, options) { @@ -7246,14 +7472,13 @@ }, update: function update(chart, width, height, minPadding) { if (!chart) { return; } - var padding = toPadding(chart.options.layout.padding); - var availableWidth = width - padding.width; - var availableHeight = height - padding.height; + var availableWidth = Math.max(width - padding.width, 0); + var availableHeight = Math.max(height - padding.height, 0); var boxes = buildLayoutBoxes(chart.boxes); var verticalBoxes = boxes.vertical; var horizontalBoxes = boxes.horizontal; each(chart.boxes, function (box) { if (typeof box.beforeLayout === 'function') { @@ -7279,23 +7504,21 @@ w: availableWidth, h: availableHeight, x: padding.left, y: padding.top }, padding); - setLayoutDims(verticalBoxes.concat(horizontalBoxes), params); - fitBoxes(boxes.fullSize, chartArea, params); - fitBoxes(verticalBoxes, chartArea, params); - - if (fitBoxes(horizontalBoxes, chartArea, params)) { - fitBoxes(verticalBoxes, chartArea, params); + var stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params); + fitBoxes(boxes.fullSize, chartArea, params, stacks); + fitBoxes(verticalBoxes, chartArea, params, stacks); + if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) { + fitBoxes(verticalBoxes, chartArea, params, stacks); } - handleMaxPadding(chartArea); - placeBoxes(boxes.leftAndTop, chartArea, params); + placeBoxes(boxes.leftAndTop, chartArea, params, stacks); chartArea.x += chartArea.w; chartArea.y += chartArea.h; - placeBoxes(boxes.rightAndBottom, chartArea, params); + placeBoxes(boxes.rightAndBottom, chartArea, params, stacks); chart.chartArea = { left: chartArea.left, top: chartArea.top, right: chartArea.left + chartArea.w, bottom: chartArea.top + chartArea.h, @@ -7303,21 +7526,24 @@ width: chartArea.w }; each(boxes.chartArea, function (layout) { var box = layout.box; Object.assign(box, chart.chartArea); - box.update(chartArea.w, chartArea.h); + box.update(chartArea.w, chartArea.h, { + left: 0, + top: 0, + right: 0, + bottom: 0 + }); }); } }; - var BasePlatform = /*#__PURE__*/function () { function BasePlatform() { - _classCallCheck(this, BasePlatform); + _classCallCheck$x(this, BasePlatform); } - - _createClass(BasePlatform, [{ + _createClass$x(BasePlatform, [{ key: "acquireContext", value: function acquireContext(canvas, aspectRatio) {} }, { key: "releaseContext", value: function releaseContext(context) { @@ -7347,36 +7573,36 @@ }, { key: "isAttached", value: function isAttached(canvas) { return true; } + }, { + key: "updateConfig", + value: function updateConfig(config) {} }]); - return BasePlatform; }(); - var BasicPlatform = /*#__PURE__*/function (_BasePlatform) { - _inherits(BasicPlatform, _BasePlatform); - - var _super9 = _createSuper(BasicPlatform); - + _inherits$w(BasicPlatform, _BasePlatform); + var _super9 = _createSuper$w(BasicPlatform); function BasicPlatform() { - _classCallCheck(this, BasicPlatform); - + _classCallCheck$x(this, BasicPlatform); return _super9.apply(this, arguments); } - - _createClass(BasicPlatform, [{ + _createClass$x(BasicPlatform, [{ key: "acquireContext", value: function acquireContext(item) { return item && item.getContext && item.getContext('2d') || null; } + }, { + key: "updateConfig", + value: function updateConfig(config) { + config.options.animation = false; + } }]); - return BasicPlatform; }(BasePlatform); - var EXPANDO_KEY = '$chartjs'; var EVENT_TYPES = { touchstart: 'mousedown', touchmove: 'mousemove', touchend: 'mouseup', @@ -7385,15 +7611,13 @@ pointermove: 'mousemove', pointerup: 'mouseup', pointerleave: 'mouseout', pointerout: 'mouseout' }; - var isNullOrEmpty = function isNullOrEmpty(value) { return value === null || value === ''; }; - function initCanvas(canvas, aspectRatio) { var style = canvas.style; var renderHeight = canvas.getAttribute('height'); var renderWidth = canvas.getAttribute('width'); canvas[EXPANDO_KEY] = { @@ -7407,240 +7631,217 @@ } } }; style.display = style.display || 'block'; style.boxSizing = style.boxSizing || 'border-box'; - if (isNullOrEmpty(renderWidth)) { var displayWidth = readUsedSize(canvas, 'width'); - if (displayWidth !== undefined) { canvas.width = displayWidth; } } - if (isNullOrEmpty(renderHeight)) { if (canvas.style.height === '') { canvas.height = canvas.width / (aspectRatio || 2); } else { var displayHeight = readUsedSize(canvas, 'height'); - if (displayHeight !== undefined) { canvas.height = displayHeight; } } } - return canvas; } - var eventListenerOptions = supportsEventListenerOptions ? { passive: true } : false; - function addListener(node, type, listener) { node.addEventListener(type, listener, eventListenerOptions); } - function removeListener(chart, type, listener) { chart.canvas.removeEventListener(type, listener, eventListenerOptions); } - function fromNativeEvent(event, chart) { var type = EVENT_TYPES[event.type] || event.type; - - var _getRelativePosition$ = getRelativePosition$1(event, chart), - x = _getRelativePosition$.x, - y = _getRelativePosition$.y; - + var _getRelativePosition = getRelativePosition(event, chart), + x = _getRelativePosition.x, + y = _getRelativePosition.y; return { type: type, chart: chart, - native: event, + "native": event, x: x !== undefined ? x : null, y: y !== undefined ? y : null }; } - + function nodeListContains(nodeList, canvas) { + var _iterator7 = _createForOfIteratorHelper$1(nodeList), + _step7; + try { + for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) { + var node = _step7.value; + if (node === canvas || node.contains(canvas)) { + return true; + } + } + } catch (err) { + _iterator7.e(err); + } finally { + _iterator7.f(); + } + } function createAttachObserver(chart, type, listener) { var canvas = chart.canvas; - - var container = canvas && _getParentNode(canvas); - - var element = container || canvas; var observer = new MutationObserver(function (entries) { - var parent = _getParentNode(element); - - entries.forEach(function (entry) { - for (var i = 0; i < entry.addedNodes.length; i++) { - var added = entry.addedNodes[i]; - - if (added === element || added === parent) { - listener(entry.target); - } + var trigger = false; + var _iterator8 = _createForOfIteratorHelper$1(entries), + _step8; + try { + for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) { + var entry = _step8.value; + trigger = trigger || nodeListContains(entry.addedNodes, canvas); + trigger = trigger && !nodeListContains(entry.removedNodes, canvas); } - }); + } catch (err) { + _iterator8.e(err); + } finally { + _iterator8.f(); + } + if (trigger) { + listener(); + } }); observer.observe(document, { childList: true, subtree: true }); return observer; } - function createDetachObserver(chart, type, listener) { var canvas = chart.canvas; - - var container = canvas && _getParentNode(canvas); - - if (!container) { - return; - } - var observer = new MutationObserver(function (entries) { - entries.forEach(function (entry) { - for (var i = 0; i < entry.removedNodes.length; i++) { - if (entry.removedNodes[i] === canvas) { - listener(); - break; - } + var trigger = false; + var _iterator9 = _createForOfIteratorHelper$1(entries), + _step9; + try { + for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) { + var entry = _step9.value; + trigger = trigger || nodeListContains(entry.removedNodes, canvas); + trigger = trigger && !nodeListContains(entry.addedNodes, canvas); } - }); + } catch (err) { + _iterator9.e(err); + } finally { + _iterator9.f(); + } + if (trigger) { + listener(); + } }); - observer.observe(container, { - childList: true + observer.observe(document, { + childList: true, + subtree: true }); return observer; } - var drpListeningCharts = new Map(); var oldDevicePixelRatio = 0; - function onWindowResize() { var dpr = window.devicePixelRatio; - if (dpr === oldDevicePixelRatio) { return; } - oldDevicePixelRatio = dpr; drpListeningCharts.forEach(function (resize, chart) { if (chart.currentDevicePixelRatio !== dpr) { resize(); } }); } - function listenDevicePixelRatioChanges(chart, resize) { if (!drpListeningCharts.size) { window.addEventListener('resize', onWindowResize); } - drpListeningCharts.set(chart, resize); } - function unlistenDevicePixelRatioChanges(chart) { - drpListeningCharts.delete(chart); - + drpListeningCharts["delete"](chart); if (!drpListeningCharts.size) { window.removeEventListener('resize', onWindowResize); } } - function createResizeObserver(chart, type, listener) { var canvas = chart.canvas; - var container = canvas && _getParentNode(canvas); - if (!container) { return; } - var resize = throttled(function (width, height) { var w = container.clientWidth; listener(width, height); - if (w < container.clientWidth) { listener(); } }, window); var observer = new ResizeObserver(function (entries) { var entry = entries[0]; var width = entry.contentRect.width; var height = entry.contentRect.height; - if (width === 0 && height === 0) { return; } - resize(width, height); }); observer.observe(container); listenDevicePixelRatioChanges(chart, resize); return observer; } - function releaseObserver(chart, type, observer) { if (observer) { observer.disconnect(); } - if (type === 'resize') { unlistenDevicePixelRatioChanges(chart); } } - function createProxyAndListen(chart, type, listener) { var canvas = chart.canvas; var proxy = throttled(function (event) { if (chart.ctx !== null) { listener(fromNativeEvent(event, chart)); } - }, chart, function (args) { - var event = args[0]; - return [event, event.offsetX, event.offsetY]; - }); + }, chart); addListener(canvas, type, proxy); return proxy; } - var DomPlatform = /*#__PURE__*/function (_BasePlatform2) { - _inherits(DomPlatform, _BasePlatform2); - - var _super10 = _createSuper(DomPlatform); - + _inherits$w(DomPlatform, _BasePlatform2); + var _super10 = _createSuper$w(DomPlatform); function DomPlatform() { - _classCallCheck(this, DomPlatform); - + _classCallCheck$x(this, DomPlatform); return _super10.apply(this, arguments); } - - _createClass(DomPlatform, [{ + _createClass$x(DomPlatform, [{ key: "acquireContext", value: function acquireContext(canvas, aspectRatio) { var context = canvas && canvas.getContext && canvas.getContext('2d'); - if (context && context.canvas === canvas) { initCanvas(canvas, aspectRatio); return context; } - return null; } }, { key: "releaseContext", value: function releaseContext(context) { var canvas = context.canvas; - if (!canvas[EXPANDO_KEY]) { return false; } - var initial = canvas[EXPANDO_KEY].initial; ['height', 'width'].forEach(function (prop) { var value = initial[prop]; - if (isNullOrUndef(value)) { canvas.removeAttribute(prop); } else { canvas.setAttribute(prop, value); } @@ -7669,15 +7870,13 @@ }, { key: "removeEventListener", value: function removeEventListener(chart, type) { var proxies = chart.$proxies || (chart.$proxies = {}); var proxy = proxies[type]; - if (!proxy) { return; } - var handlers = { attach: releaseObserver, detach: releaseObserver, resize: releaseObserver }; @@ -7697,36 +7896,32 @@ } }, { key: "isAttached", value: function isAttached(canvas) { var container = _getParentNode(canvas); - - return !!(container && _getParentNode(container)); + return !!(container && container.isConnected); } }]); - return DomPlatform; }(BasePlatform); - + function _detectPlatform(canvas) { + if (!_isDomSupported() || typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas) { + return BasicPlatform; + } + return DomPlatform; + } var Element = /*#__PURE__*/function () { function Element() { - _classCallCheck(this, Element); - - this.x = undefined; - this.y = undefined; - this.active = false; - this.options = undefined; - this.$animations = undefined; + _classCallCheck$x(this, Element); + _defineProperty$w(this, "active", false); } - - _createClass(Element, [{ + _createClass$x(Element, [{ key: "tooltipPosition", value: function tooltipPosition(useFinalPosition) { var _this$getProps = this.getProps(['x', 'y'], useFinalPosition), - x = _this$getProps.x, - y = _this$getProps.y; - + x = _this$getProps.x, + y = _this$getProps.y; return { x: x, y: y }; } @@ -7735,515 +7930,342 @@ value: function hasValue() { return isNumber(this.x) && isNumber(this.y); } }, { key: "getProps", - value: function getProps(props, final) { - var me = this; + value: function getProps(props, _final) { + var _this8 = this; var anims = this.$animations; - - if (!final || !anims) { - return me; + if (!_final || !anims) { + // let's not create an object, if not needed + return this; } - var ret = {}; props.forEach(function (prop) { - ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : me[prop]; + ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : _this8[prop]; }); return ret; } }]); - return Element; }(); - - Element.defaults = {}; - Element.defaultRoutes = undefined; - var formatters$2 = { - values: function values(value) { - return isArray(value) ? value : '' + value; - }, - numeric: function numeric(tickValue, index, ticks) { - if (tickValue === 0) { - return '0'; - } - - var locale = this.chart.options.locale; - var notation; - var delta = tickValue; - - if (ticks.length > 1) { - var maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value)); - - if (maxTick < 1e-4 || maxTick > 1e+15) { - notation = 'scientific'; - } - - delta = calculateDelta(tickValue, ticks); - } - - var logDelta = log10(Math.abs(delta)); - var numDecimal = Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0); - var options = { - notation: notation, - minimumFractionDigits: numDecimal, - maximumFractionDigits: numDecimal - }; - Object.assign(options, this.options.ticks.format); - return formatNumber(tickValue, locale, options); - }, - logarithmic: function logarithmic(tickValue, index, ticks) { - if (tickValue === 0) { - return '0'; - } - - var remain = tickValue / Math.pow(10, Math.floor(log10(tickValue))); - - if (remain === 1 || remain === 2 || remain === 5) { - return formatters$2.numeric.call(this, tickValue, index, ticks); - } - - return ''; - } - }; - - function calculateDelta(tickValue, ticks) { - var delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value; - - if (Math.abs(delta) > 1 && tickValue !== Math.floor(tickValue)) { - delta = tickValue - Math.floor(tickValue); - } - - return delta; - } - - var Ticks = { - formatters: formatters$2 - }; - defaults.set('scale', { - display: true, - offset: false, - reverse: false, - beginAtZero: false, - bounds: 'ticks', - grace: 0, - grid: { - display: true, - lineWidth: 1, - drawBorder: true, - drawOnChartArea: true, - drawTicks: true, - tickLength: 8, - tickWidth: function tickWidth(_ctx, options) { - return options.lineWidth; - }, - tickColor: function tickColor(_ctx, options) { - return options.color; - }, - offset: false, - borderDash: [], - borderDashOffset: 0.0, - borderColor: function borderColor(_ctx, options) { - return options.color; - }, - borderWidth: function borderWidth(_ctx, options) { - return options.lineWidth; - } - }, - title: { - display: false, - text: '', - padding: { - top: 4, - bottom: 4 - } - }, - ticks: { - minRotation: 0, - maxRotation: 50, - mirror: false, - textStrokeWidth: 0, - textStrokeColor: '', - padding: 3, - display: true, - autoSkip: true, - autoSkipPadding: 3, - labelOffset: 0, - callback: Ticks.formatters.values, - minor: {}, - major: {}, - align: 'center', - crossAlign: 'near' - } - }); - defaults.route('scale.ticks', 'color', '', 'color'); - defaults.route('scale.grid', 'color', '', 'borderColor'); - defaults.route('scale.title', 'color', '', 'color'); - defaults.describe('scale', { - _fallback: false, - _scriptable: function _scriptable(name) { - return !name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser'; - }, - _indexable: function _indexable(name) { - return name !== 'borderDash' && name !== 'tickBorderDash'; - } - }); - defaults.describe('scales', { - _fallback: 'scale' - }); - + _defineProperty$w(Element, "defaults", {}); + _defineProperty$w(Element, "defaultRoutes", undefined); function autoSkip(scale, ticks) { var tickOpts = scale.options.ticks; - var ticksLimit = tickOpts.maxTicksLimit || determineMaxTicks(scale); + var determinedMaxTicks = determineMaxTicks(scale); + var ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks); var majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : []; var numMajorIndices = majorIndices.length; var first = majorIndices[0]; var last = majorIndices[numMajorIndices - 1]; var newTicks = []; - if (numMajorIndices > ticksLimit) { skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit); return newTicks; } - var spacing = calculateSpacing(majorIndices, ticks, ticksLimit); - if (numMajorIndices > 0) { var i, ilen; var avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null; skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first); - for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) { skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]); } - skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing); return newTicks; } - skip(ticks, newTicks, spacing); return newTicks; } - function determineMaxTicks(scale) { var offset = scale.options.offset; - var tickLength = scale._tickSize(); - var maxScale = scale._length / tickLength + (offset ? 0 : 1); var maxChart = scale._maxLength / tickLength; return Math.floor(Math.min(maxScale, maxChart)); } - function calculateSpacing(majorIndices, ticks, ticksLimit) { var evenMajorSpacing = getEvenSpacing(majorIndices); var spacing = ticks.length / ticksLimit; - if (!evenMajorSpacing) { return Math.max(spacing, 1); } - var factors = _factorize(evenMajorSpacing); - for (var i = 0, ilen = factors.length - 1; i < ilen; i++) { var factor = factors[i]; - if (factor > spacing) { return factor; } } - return Math.max(spacing, 1); } - function getMajorIndices(ticks) { var result = []; var i, ilen; - for (i = 0, ilen = ticks.length; i < ilen; i++) { if (ticks[i].major) { result.push(i); } } - return result; } - function skipMajors(ticks, newTicks, majorIndices, spacing) { var count = 0; var next = majorIndices[0]; var i; spacing = Math.ceil(spacing); - for (i = 0; i < ticks.length; i++) { if (i === next) { newTicks.push(ticks[i]); count++; next = majorIndices[count * spacing]; } } } - function skip(ticks, newTicks, spacing, majorStart, majorEnd) { var start = valueOrDefault(majorStart, 0); var end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length); var count = 0; var length, i, next; spacing = Math.ceil(spacing); - if (majorEnd) { length = majorEnd - majorStart; spacing = length / Math.floor(length / spacing); } - next = start; - while (next < 0) { count++; next = Math.round(start + count * spacing); } - for (i = Math.max(start, 0); i < end; i++) { if (i === next) { newTicks.push(ticks[i]); count++; next = Math.round(start + count * spacing); } } } - function getEvenSpacing(arr) { var len = arr.length; var i, diff; - if (len < 2) { return false; } - for (diff = arr[0], i = 1; i < len; ++i) { if (arr[i] - arr[i - 1] !== diff) { return false; } } - return diff; } - var reverseAlign = function reverseAlign(align) { return align === 'left' ? 'right' : align === 'right' ? 'left' : align; }; - var offsetFromEdge = function offsetFromEdge(scale, edge, offset) { return edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset; }; - function sample(arr, numItems) { var result = []; var increment = arr.length / numItems; var len = arr.length; var i = 0; - for (; i < len; i += increment) { result.push(arr[Math.floor(i)]); } - return result; } - function getPixelForGridLine(scale, index, offsetGridLines) { var length = scale.ticks.length; var validIndex = Math.min(index, length - 1); var start = scale._startPixel; var end = scale._endPixel; var epsilon = 1e-6; var lineValue = scale.getPixelForTick(validIndex); var offset; - if (offsetGridLines) { if (length === 1) { offset = Math.max(lineValue - start, end - lineValue); } else if (index === 0) { offset = (scale.getPixelForTick(1) - lineValue) / 2; } else { offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2; } - lineValue += validIndex < index ? offset : -offset; - if (lineValue < start - epsilon || lineValue > end + epsilon) { return; } } - return lineValue; } - function garbageCollect(caches, length) { each(caches, function (cache) { var gc = cache.gc; var gcLen = gc.length / 2; var i; - if (gcLen > length) { for (i = 0; i < gcLen; ++i) { delete cache.data[gc[i]]; } - gc.splice(0, gcLen); } }); } - function getTickMarkLength(options) { return options.drawTicks ? options.tickLength : 0; } - function getTitleHeight(options, fallback) { if (!options.display) { return 0; } - var font = toFont(options.font, fallback); var padding = toPadding(options.padding); var lines = isArray(options.text) ? options.text.length : 1; return lines * font.lineHeight + padding.height; } - function createScaleContext(parent, scale) { - return Object.assign(Object.create(parent), { + return createContext(parent, { scale: scale, type: 'scale' }); } - function createTickContext(parent, index, tick) { - return Object.assign(Object.create(parent), { + return createContext(parent, { tick: tick, index: index, type: 'tick' }); } - function titleAlign(align, position, reverse) { var ret = _toLeftRightCenter(align); - if (reverse && position !== 'right' || !reverse && position === 'right') { ret = reverseAlign(ret); } - return ret; } - function titleArgs(scale, offset, position, align) { var top = scale.top, - left = scale.left, - bottom = scale.bottom, - right = scale.right; + left = scale.left, + bottom = scale.bottom, + right = scale.right, + chart = scale.chart; + var chartArea = chart.chartArea, + scales = chart.scales; var rotation = 0; var maxWidth, titleX, titleY; - + var height = bottom - top; + var width = right - left; if (scale.isHorizontal()) { titleX = _alignStartEnd(align, left, right); - titleY = offsetFromEdge(scale, position, offset); + if (isObject(position)) { + var positionAxisID = Object.keys(position)[0]; + var value = position[positionAxisID]; + titleY = scales[positionAxisID].getPixelForValue(value) + height - offset; + } else if (position === 'center') { + titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset; + } else { + titleY = offsetFromEdge(scale, position, offset); + } maxWidth = right - left; } else { - titleX = offsetFromEdge(scale, position, offset); + if (isObject(position)) { + var positionAxisID1 = Object.keys(position)[0]; + var value1 = position[positionAxisID1]; + titleX = scales[positionAxisID1].getPixelForValue(value1) - width + offset; + } else if (position === 'center') { + titleX = (chartArea.left + chartArea.right) / 2 - width + offset; + } else { + titleX = offsetFromEdge(scale, position, offset); + } titleY = _alignStartEnd(align, bottom, top); rotation = position === 'left' ? -HALF_PI : HALF_PI; } - return { titleX: titleX, titleY: titleY, maxWidth: maxWidth, rotation: rotation }; } - var Scale = /*#__PURE__*/function (_Element) { - _inherits(Scale, _Element); - - var _super11 = _createSuper(Scale); - + _inherits$w(Scale, _Element); + var _super11 = _createSuper$w(Scale); function Scale(cfg) { - var _this4; - - _classCallCheck(this, Scale); - - _this4 = _super11.call(this); - _this4.id = cfg.id; - _this4.type = cfg.type; - _this4.options = undefined; - _this4.ctx = cfg.ctx; - _this4.chart = cfg.chart; - _this4.top = undefined; - _this4.bottom = undefined; - _this4.left = undefined; - _this4.right = undefined; - _this4.width = undefined; - _this4.height = undefined; - _this4._margins = { + var _this9; + _classCallCheck$x(this, Scale); + _this9 = _super11.call(this); + _this9.id = cfg.id; + _this9.type = cfg.type; + _this9.options = undefined; + _this9.ctx = cfg.ctx; + _this9.chart = cfg.chart; + _this9.top = undefined; + _this9.bottom = undefined; + _this9.left = undefined; + _this9.right = undefined; + _this9.width = undefined; + _this9.height = undefined; + _this9._margins = { left: 0, right: 0, top: 0, bottom: 0 }; - _this4.maxWidth = undefined; - _this4.maxHeight = undefined; - _this4.paddingTop = undefined; - _this4.paddingBottom = undefined; - _this4.paddingLeft = undefined; - _this4.paddingRight = undefined; - _this4.axis = undefined; - _this4.labelRotation = undefined; - _this4.min = undefined; - _this4.max = undefined; - _this4.ticks = []; - _this4._gridLineItems = null; - _this4._labelItems = null; - _this4._labelSizes = null; - _this4._length = 0; - _this4._maxLength = 0; - _this4._longestTextCache = {}; - _this4._startPixel = undefined; - _this4._endPixel = undefined; - _this4._reversePixels = false; - _this4._userMax = undefined; - _this4._userMin = undefined; - _this4._suggestedMax = undefined; - _this4._suggestedMin = undefined; - _this4._ticksLength = 0; - _this4._borderValue = 0; - _this4._cache = {}; - _this4._dataLimitsCached = false; - _this4.$context = undefined; - return _this4; + _this9.maxWidth = undefined; + _this9.maxHeight = undefined; + _this9.paddingTop = undefined; + _this9.paddingBottom = undefined; + _this9.paddingLeft = undefined; + _this9.paddingRight = undefined; + _this9.axis = undefined; + _this9.labelRotation = undefined; + _this9.min = undefined; + _this9.max = undefined; + _this9._range = undefined; + _this9.ticks = []; + _this9._gridLineItems = null; + _this9._labelItems = null; + _this9._labelSizes = null; + _this9._length = 0; + _this9._maxLength = 0; + _this9._longestTextCache = {}; + _this9._startPixel = undefined; + _this9._endPixel = undefined; + _this9._reversePixels = false; + _this9._userMax = undefined; + _this9._userMin = undefined; + _this9._suggestedMax = undefined; + _this9._suggestedMin = undefined; + _this9._ticksLength = 0; + _this9._borderValue = 0; + _this9._cache = {}; + _this9._dataLimitsCached = false; + _this9.$context = undefined; + return _this9; } - - _createClass(Scale, [{ + _createClass$x(Scale, [{ key: "init", value: function init(options) { - var me = this; - me.options = options; - me.axis = options.axis; - me._userMin = me.parse(options.min); - me._userMax = me.parse(options.max); - me._suggestedMin = me.parse(options.suggestedMin); - me._suggestedMax = me.parse(options.suggestedMax); + this.options = options.setContext(this.getContext()); + this.axis = options.axis; + this._userMin = this.parse(options.min); + this._userMax = this.parse(options.max); + this._suggestedMin = this.parse(options.suggestedMin); + this._suggestedMax = this.parse(options.suggestedMax); } }, { key: "parse", value: function parse(raw, index) { return raw; } }, { key: "getUserBounds", value: function getUserBounds() { var _userMin = this._userMin, - _userMax = this._userMax, - _suggestedMin = this._suggestedMin, - _suggestedMax = this._suggestedMax; + _userMax = this._userMax, + _suggestedMin = this._suggestedMin, + _suggestedMax = this._suggestedMax; _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY); _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY); _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY); _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY); return { @@ -8254,55 +8276,47 @@ }; } }, { key: "getMinMax", value: function getMinMax(canStack) { - var me = this; - - var _me$getUserBounds = me.getUserBounds(), - min = _me$getUserBounds.min, - max = _me$getUserBounds.max, - minDefined = _me$getUserBounds.minDefined, - maxDefined = _me$getUserBounds.maxDefined; - + var _this$getUserBounds = this.getUserBounds(), + min = _this$getUserBounds.min, + max = _this$getUserBounds.max, + minDefined = _this$getUserBounds.minDefined, + maxDefined = _this$getUserBounds.maxDefined; var range; - if (minDefined && maxDefined) { return { min: min, max: max }; } - - var metas = me.getMatchingVisibleMetas(); - + var metas = this.getMatchingVisibleMetas(); for (var i = 0, ilen = metas.length; i < ilen; ++i) { - range = metas[i].controller.getMinMax(me, canStack); - + range = metas[i].controller.getMinMax(this, canStack); if (!minDefined) { min = Math.min(min, range.min); } - if (!maxDefined) { max = Math.max(max, range.max); } } - + min = maxDefined && min > max ? max : min; + max = minDefined && min > max ? min : max; return { min: finiteOrDefault(min, finiteOrDefault(max, min)), max: finiteOrDefault(max, finiteOrDefault(min, max)) }; } }, { key: "getPadding", value: function getPadding() { - var me = this; return { - left: me.paddingLeft || 0, - top: me.paddingTop || 0, - right: me.paddingRight || 0, - bottom: me.paddingBottom || 0 + left: this.paddingLeft || 0, + top: this.paddingTop || 0, + right: this.paddingRight || 0, + bottom: this.paddingBottom || 0 }; } }, { key: "getTicks", value: function getTicks() { @@ -8313,10 +8327,17 @@ value: function getLabels() { var data = this.chart.data; return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || []; } }, { + key: "getLabelItems", + value: function getLabelItems() { + var chartArea = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.chart.chartArea; + var items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea)); + return items; + } + }, { key: "beforeLayout", value: function beforeLayout() { this._cache = {}; this._dataLimitsCached = false; } @@ -8326,85 +8347,79 @@ callback(this.options.beforeUpdate, [this]); } }, { key: "update", value: function update(maxWidth, maxHeight, margins) { - var me = this; - var tickOpts = me.options.ticks; + var _this$options4 = this.options, + beginAtZero = _this$options4.beginAtZero, + grace = _this$options4.grace, + tickOpts = _this$options4.ticks; var sampleSize = tickOpts.sampleSize; - me.beforeUpdate(); - me.maxWidth = maxWidth; - me.maxHeight = maxHeight; - me._margins = margins = Object.assign({ + this.beforeUpdate(); + this.maxWidth = maxWidth; + this.maxHeight = maxHeight; + this._margins = margins = Object.assign({ left: 0, right: 0, top: 0, bottom: 0 }, margins); - me.ticks = null; - me._labelSizes = null; - me._gridLineItems = null; - me._labelItems = null; - me.beforeSetDimensions(); - me.setDimensions(); - me.afterSetDimensions(); - me._maxLength = me.isHorizontal() ? me.width + margins.left + margins.right : me.height + margins.top + margins.bottom; - - if (!me._dataLimitsCached) { - me.beforeDataLimits(); - me.determineDataLimits(); - me.afterDataLimits(); - me._dataLimitsCached = true; + this.ticks = null; + this._labelSizes = null; + this._gridLineItems = null; + this._labelItems = null; + this.beforeSetDimensions(); + this.setDimensions(); + this.afterSetDimensions(); + this._maxLength = this.isHorizontal() ? this.width + margins.left + margins.right : this.height + margins.top + margins.bottom; + if (!this._dataLimitsCached) { + this.beforeDataLimits(); + this.determineDataLimits(); + this.afterDataLimits(); + this._range = _addGrace(this, grace, beginAtZero); + this._dataLimitsCached = true; } - - me.beforeBuildTicks(); - me.ticks = me.buildTicks() || []; - me.afterBuildTicks(); - var samplingEnabled = sampleSize < me.ticks.length; - - me._convertTicksToLabels(samplingEnabled ? sample(me.ticks, sampleSize) : me.ticks); - - me.configure(); - me.beforeCalculateLabelRotation(); - me.calculateLabelRotation(); - me.afterCalculateLabelRotation(); - + this.beforeBuildTicks(); + this.ticks = this.buildTicks() || []; + this.afterBuildTicks(); + var samplingEnabled = sampleSize < this.ticks.length; + this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks); + this.configure(); + this.beforeCalculateLabelRotation(); + this.calculateLabelRotation(); + this.afterCalculateLabelRotation(); if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) { - me.ticks = autoSkip(me, me.ticks); - me._labelSizes = null; + this.ticks = autoSkip(this, this.ticks); + this._labelSizes = null; + this.afterAutoSkip(); } - if (samplingEnabled) { - me._convertTicksToLabels(me.ticks); + this._convertTicksToLabels(this.ticks); } - - me.beforeFit(); - me.fit(); - me.afterFit(); - me.afterUpdate(); + this.beforeFit(); + this.fit(); + this.afterFit(); + this.afterUpdate(); } }, { key: "configure", value: function configure() { - var me = this; - var reversePixels = me.options.reverse; + var reversePixels = this.options.reverse; var startPixel, endPixel; - - if (me.isHorizontal()) { - startPixel = me.left; - endPixel = me.right; + if (this.isHorizontal()) { + startPixel = this.left; + endPixel = this.right; } else { - startPixel = me.top; - endPixel = me.bottom; + startPixel = this.top; + endPixel = this.bottom; reversePixels = !reversePixels; } - - me._startPixel = startPixel; - me._endPixel = endPixel; - me._reversePixels = reversePixels; - me._length = endPixel - startPixel; - me._alignToPixels = me.options.alignToPixels; + this._startPixel = startPixel; + this._endPixel = endPixel; + this._reversePixels = reversePixels; + this._length = endPixel - startPixel; + this._alignToPixels = this.options.alignToPixels; } }, { key: "afterUpdate", value: function afterUpdate() { callback(this.options.afterUpdate, [this]); @@ -8415,38 +8430,34 @@ callback(this.options.beforeSetDimensions, [this]); } }, { key: "setDimensions", value: function setDimensions() { - var me = this; - - if (me.isHorizontal()) { - me.width = me.maxWidth; - me.left = 0; - me.right = me.width; + if (this.isHorizontal()) { + this.width = this.maxWidth; + this.left = 0; + this.right = this.width; } else { - me.height = me.maxHeight; - me.top = 0; - me.bottom = me.height; + this.height = this.maxHeight; + this.top = 0; + this.bottom = this.height; } - - me.paddingLeft = 0; - me.paddingTop = 0; - me.paddingRight = 0; - me.paddingBottom = 0; + this.paddingLeft = 0; + this.paddingTop = 0; + this.paddingRight = 0; + this.paddingBottom = 0; } }, { key: "afterSetDimensions", value: function afterSetDimensions() { callback(this.options.afterSetDimensions, [this]); } }, { key: "_callHooks", value: function _callHooks(name) { - var me = this; - me.chart.notifyPlugins(name, me.getContext()); - callback(me.options[name], [me]); + this.chart.notifyPlugins(name, this.getContext()); + callback(this.options[name], [this]); } }, { key: "beforeDataLimits", value: function beforeDataLimits() { this._callHooks('beforeDataLimits'); @@ -8480,17 +8491,15 @@ callback(this.options.beforeTickToLabelConversion, [this]); } }, { key: "generateTickLabels", value: function generateTickLabels(ticks) { - var me = this; - var tickOpts = me.options.ticks; + var tickOpts = this.options.ticks; var i, ilen, tick; - for (i = 0, ilen = ticks.length; i < ilen; i++) { tick = ticks[i]; - tick.label = callback(tickOpts.callback, [tick.value, i, ticks], me); + tick.label = callback(tickOpts.callback, [tick.value, i, ticks], this); } } }, { key: "afterTickToLabelConversion", value: function afterTickToLabelConversion() { @@ -8502,134 +8511,115 @@ callback(this.options.beforeCalculateLabelRotation, [this]); } }, { key: "calculateLabelRotation", value: function calculateLabelRotation() { - var me = this; - var options = me.options; + var options = this.options; var tickOpts = options.ticks; - var numTicks = me.ticks.length; + var numTicks = this.ticks.length; var minRotation = tickOpts.minRotation || 0; var maxRotation = tickOpts.maxRotation; var labelRotation = minRotation; var tickWidth, maxHeight, maxLabelDiagonal; - - if (!me._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !me.isHorizontal()) { - me.labelRotation = minRotation; + if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) { + this.labelRotation = minRotation; return; } - - var labelSizes = me._getLabelSizes(); - + var labelSizes = this._getLabelSizes(); var maxLabelWidth = labelSizes.widest.width; var maxLabelHeight = labelSizes.highest.height; - - var maxWidth = _limitValue(me.chart.width - maxLabelWidth, 0, me.maxWidth); - - tickWidth = options.offset ? me.maxWidth / numTicks : maxWidth / (numTicks - 1); - + var maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth); + tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1); if (maxLabelWidth + 6 > tickWidth) { tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1)); - maxHeight = me.maxHeight - getTickMarkLength(options.grid) - tickOpts.padding - getTitleHeight(options.title, me.chart.options.font); + maxHeight = this.maxHeight - getTickMarkLength(options.grid) - tickOpts.padding - getTitleHeight(options.title, this.chart.options.font); maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight); - labelRotation = toDegrees(Math.min(Math.asin(Math.min((labelSizes.highest.height + 6) / tickWidth, 1)), Math.asin(Math.min(maxHeight / maxLabelDiagonal, 1)) - Math.asin(maxLabelHeight / maxLabelDiagonal))); + labelRotation = toDegrees(Math.min(Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)), Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1)))); labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation)); } - - me.labelRotation = labelRotation; + this.labelRotation = labelRotation; } }, { key: "afterCalculateLabelRotation", value: function afterCalculateLabelRotation() { callback(this.options.afterCalculateLabelRotation, [this]); } }, { + key: "afterAutoSkip", + value: function afterAutoSkip() {} + }, { key: "beforeFit", value: function beforeFit() { callback(this.options.beforeFit, [this]); } }, { key: "fit", value: function fit() { - var me = this; var minSize = { width: 0, height: 0 }; - var chart = me.chart, - _me$options2 = me.options, - tickOpts = _me$options2.ticks, - titleOpts = _me$options2.title, - gridOpts = _me$options2.grid; - - var display = me._isVisible(); - - var isHorizontal = me.isHorizontal(); - + var chart = this.chart, + _this$options5 = this.options, + tickOpts = _this$options5.ticks, + titleOpts = _this$options5.title, + gridOpts = _this$options5.grid; + var display = this._isVisible(); + var isHorizontal = this.isHorizontal(); if (display) { var titleHeight = getTitleHeight(titleOpts, chart.options.font); - if (isHorizontal) { - minSize.width = me.maxWidth; + minSize.width = this.maxWidth; minSize.height = getTickMarkLength(gridOpts) + titleHeight; } else { - minSize.height = me.maxHeight; + minSize.height = this.maxHeight; minSize.width = getTickMarkLength(gridOpts) + titleHeight; } - - if (tickOpts.display && me.ticks.length) { - var _me$_getLabelSizes = me._getLabelSizes(), - first = _me$_getLabelSizes.first, - last = _me$_getLabelSizes.last, - widest = _me$_getLabelSizes.widest, - highest = _me$_getLabelSizes.highest; - + if (tickOpts.display && this.ticks.length) { + var _this$_getLabelSizes = this._getLabelSizes(), + first = _this$_getLabelSizes.first, + last = _this$_getLabelSizes.last, + widest = _this$_getLabelSizes.widest, + highest = _this$_getLabelSizes.highest; var tickPadding = tickOpts.padding * 2; - var angleRadians = toRadians(me.labelRotation); + var angleRadians = toRadians(this.labelRotation); var cos = Math.cos(angleRadians); var sin = Math.sin(angleRadians); - if (isHorizontal) { - var labelHeight = sin * widest.width + cos * highest.height; - minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding); + var labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height; + minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding); } else { var labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height; - minSize.width = Math.min(me.maxWidth, minSize.width + labelWidth + tickPadding); + minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding); } - - me._calculatePadding(first, last, sin, cos); + this._calculatePadding(first, last, sin, cos); } } - - me._handleMargins(); - + this._handleMargins(); if (isHorizontal) { - me.width = me._length = chart.width - me._margins.left - me._margins.right; - me.height = minSize.height; + this.width = this._length = chart.width - this._margins.left - this._margins.right; + this.height = minSize.height; } else { - me.width = minSize.width; - me.height = me._length = chart.height - me._margins.top - me._margins.bottom; + this.width = minSize.width; + this.height = this._length = chart.height - this._margins.top - this._margins.bottom; } } }, { key: "_calculatePadding", value: function _calculatePadding(first, last, sin, cos) { - var me = this; - var _me$options3 = me.options, - _me$options3$ticks = _me$options3.ticks, - align = _me$options3$ticks.align, - padding = _me$options3$ticks.padding, - position = _me$options3.position; - var isRotated = me.labelRotation !== 0; - var labelsBelowTicks = position !== 'top' && me.axis === 'x'; - - if (me.isHorizontal()) { - var offsetLeft = me.getPixelForTick(0) - me.left; - var offsetRight = me.right - me.getPixelForTick(me.ticks.length - 1); + var _this$options6 = this.options, + _this$options6$ticks = _this$options6.ticks, + align = _this$options6$ticks.align, + padding = _this$options6$ticks.padding, + position = _this$options6.position; + var isRotated = this.labelRotation !== 0; + var labelsBelowTicks = position !== 'top' && this.axis === 'x'; + if (this.isHorizontal()) { + var offsetLeft = this.getPixelForTick(0) - this.left; + var offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1); var paddingLeft = 0; var paddingRight = 0; - if (isRotated) { if (labelsBelowTicks) { paddingLeft = cos * first.width; paddingRight = sin * last.height; } else { @@ -8638,148 +8628,140 @@ } } else if (align === 'start') { paddingRight = last.width; } else if (align === 'end') { paddingLeft = first.width; - } else { + } else if (align !== 'inner') { paddingLeft = first.width / 2; paddingRight = last.width / 2; } - - me.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * me.width / (me.width - offsetLeft), 0); - me.paddingRight = Math.max((paddingRight - offsetRight + padding) * me.width / (me.width - offsetRight), 0); + this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0); + this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0); } else { var paddingTop = last.height / 2; var paddingBottom = first.height / 2; - if (align === 'start') { paddingTop = 0; paddingBottom = first.height; } else if (align === 'end') { paddingTop = last.height; paddingBottom = 0; } - - me.paddingTop = paddingTop + padding; - me.paddingBottom = paddingBottom + padding; + this.paddingTop = paddingTop + padding; + this.paddingBottom = paddingBottom + padding; } } }, { key: "_handleMargins", value: function _handleMargins() { - var me = this; - - if (me._margins) { - me._margins.left = Math.max(me.paddingLeft, me._margins.left); - me._margins.top = Math.max(me.paddingTop, me._margins.top); - me._margins.right = Math.max(me.paddingRight, me._margins.right); - me._margins.bottom = Math.max(me.paddingBottom, me._margins.bottom); + if (this._margins) { + this._margins.left = Math.max(this.paddingLeft, this._margins.left); + this._margins.top = Math.max(this.paddingTop, this._margins.top); + this._margins.right = Math.max(this.paddingRight, this._margins.right); + this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom); } } }, { key: "afterFit", value: function afterFit() { callback(this.options.afterFit, [this]); } }, { key: "isHorizontal", value: function isHorizontal() { - var _this$options = this.options, - axis = _this$options.axis, - position = _this$options.position; + var _this$options7 = this.options, + axis = _this$options7.axis, + position = _this$options7.position; return position === 'top' || position === 'bottom' || axis === 'x'; } }, { key: "isFullSize", value: function isFullSize() { return this.options.fullSize; } }, { key: "_convertTicksToLabels", value: function _convertTicksToLabels(ticks) { - var me = this; - me.beforeTickToLabelConversion(); - me.generateTickLabels(ticks); - me.afterTickToLabelConversion(); + this.beforeTickToLabelConversion(); + this.generateTickLabels(ticks); + var i, ilen; + for (i = 0, ilen = ticks.length; i < ilen; i++) { + if (isNullOrUndef(ticks[i].label)) { + ticks.splice(i, 1); + ilen--; + i--; + } + } + this.afterTickToLabelConversion(); } }, { key: "_getLabelSizes", value: function _getLabelSizes() { - var me = this; - var labelSizes = me._labelSizes; - + var labelSizes = this._labelSizes; if (!labelSizes) { - var sampleSize = me.options.ticks.sampleSize; - var ticks = me.ticks; - + var sampleSize = this.options.ticks.sampleSize; + var ticks = this.ticks; if (sampleSize < ticks.length) { ticks = sample(ticks, sampleSize); } - - me._labelSizes = labelSizes = me._computeLabelSizes(ticks, ticks.length); + this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length); } - return labelSizes; } }, { key: "_computeLabelSizes", value: function _computeLabelSizes(ticks, length) { var ctx = this.ctx, - caches = this._longestTextCache; + caches = this._longestTextCache; var widths = []; var heights = []; var widestLabelSize = 0; var highestLabelSize = 0; var i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel; - for (i = 0; i < length; ++i) { label = ticks[i].label; tickFont = this._resolveTickFontOptions(i); ctx.font = fontString = tickFont.string; cache = caches[fontString] = caches[fontString] || { data: {}, gc: [] }; lineHeight = tickFont.lineHeight; width = height = 0; - if (!isNullOrUndef(label) && !isArray(label)) { width = _measureText(ctx, cache.data, cache.gc, width, label); height = lineHeight; } else if (isArray(label)) { for (j = 0, jlen = label.length; j < jlen; ++j) { nestedLabel = label[j]; - if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) { width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel); height += lineHeight; } } } - widths.push(width); heights.push(height); widestLabelSize = Math.max(width, widestLabelSize); highestLabelSize = Math.max(height, highestLabelSize); } - garbageCollect(caches, length); var widest = widths.indexOf(widestLabelSize); var highest = heights.indexOf(highestLabelSize); - var valueAt = function valueAt(idx) { return { width: widths[idx] || 0, height: heights[idx] || 0 }; }; - return { first: valueAt(0), last: valueAt(length - 1), widest: valueAt(widest), - highest: valueAt(highest) + highest: valueAt(highest), + widths: widths, + heights: heights }; } }, { key: "getLabelForValue", value: function getLabelForValue(value) { @@ -8795,28 +8777,23 @@ value: function getValueForPixel(pixel) {} }, { key: "getPixelForTick", value: function getPixelForTick(index) { var ticks = this.ticks; - if (index < 0 || index > ticks.length - 1) { return null; } - return this.getPixelForValue(ticks[index].value); } }, { key: "getPixelForDecimal", value: function getPixelForDecimal(decimal) { - var me = this; - - if (me._reversePixels) { + if (this._reversePixels) { decimal = 1 - decimal; } - - var pixel = me._startPixel + decimal * me._length; - return _int16Range(me._alignToPixels ? _alignPixel(me.chart, pixel, 0) : pixel); + var pixel = this._startPixel + decimal * this._length; + return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel); } }, { key: "getDecimalForPixel", value: function getDecimalForPixel(pixel) { var decimal = (pixel - this._startPixel) / this._length; @@ -8829,155 +8806,141 @@ } }, { key: "getBaseValue", value: function getBaseValue() { var min = this.min, - max = this.max; + max = this.max; return min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0; } }, { key: "getContext", value: function getContext(index) { - var me = this; - var ticks = me.ticks || []; - + var ticks = this.ticks || []; if (index >= 0 && index < ticks.length) { var tick = ticks[index]; - return tick.$context || (tick.$context = createTickContext(me.getContext(), index, tick)); + return tick.$context || (tick.$context = createTickContext(this.getContext(), index, tick)); } - - return me.$context || (me.$context = createScaleContext(me.chart.getContext(), me)); + return this.$context || (this.$context = createScaleContext(this.chart.getContext(), this)); } }, { key: "_tickSize", value: function _tickSize() { - var me = this; - var optionTicks = me.options.ticks; - var rot = toRadians(me.labelRotation); + var optionTicks = this.options.ticks; + var rot = toRadians(this.labelRotation); var cos = Math.abs(Math.cos(rot)); var sin = Math.abs(Math.sin(rot)); - - var labelSizes = me._getLabelSizes(); - + var labelSizes = this._getLabelSizes(); var padding = optionTicks.autoSkipPadding || 0; var w = labelSizes ? labelSizes.widest.width + padding : 0; var h = labelSizes ? labelSizes.highest.height + padding : 0; - return me.isHorizontal() ? h * cos > w * sin ? w / cos : h / sin : h * sin < w * cos ? h / cos : w / sin; + return this.isHorizontal() ? h * cos > w * sin ? w / cos : h / sin : h * sin < w * cos ? h / cos : w / sin; } }, { key: "_isVisible", value: function _isVisible() { var display = this.options.display; - if (display !== 'auto') { return !!display; } - return this.getMatchingVisibleMetas().length > 0; } }, { key: "_computeGridLineItems", value: function _computeGridLineItems(chartArea) { - var me = this; - var axis = me.axis; - var chart = me.chart; - var options = me.options; + var axis = this.axis; + var chart = this.chart; + var options = this.options; var grid = options.grid, - position = options.position; + position = options.position, + border = options.border; var offset = grid.offset; - var isHorizontal = me.isHorizontal(); - var ticks = me.ticks; + var isHorizontal = this.isHorizontal(); + var ticks = this.ticks; var ticksLength = ticks.length + (offset ? 1 : 0); var tl = getTickMarkLength(grid); var items = []; - var borderOpts = grid.setContext(me.getContext(0)); - var axisWidth = borderOpts.drawBorder ? borderOpts.borderWidth : 0; + var borderOpts = border.setContext(this.getContext()); + var axisWidth = borderOpts.display ? borderOpts.width : 0; var axisHalfWidth = axisWidth / 2; - var alignBorderValue = function alignBorderValue(pixel) { return _alignPixel(chart, pixel, axisWidth); }; - var borderValue, i, lineValue, alignedLineValue; var tx1, ty1, tx2, ty2, x1, y1, x2, y2; - if (position === 'top') { - borderValue = alignBorderValue(me.bottom); - ty1 = me.bottom - tl; + borderValue = alignBorderValue(this.bottom); + ty1 = this.bottom - tl; ty2 = borderValue - axisHalfWidth; y1 = alignBorderValue(chartArea.top) + axisHalfWidth; y2 = chartArea.bottom; } else if (position === 'bottom') { - borderValue = alignBorderValue(me.top); + borderValue = alignBorderValue(this.top); y1 = chartArea.top; y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth; ty1 = borderValue + axisHalfWidth; - ty2 = me.top + tl; + ty2 = this.top + tl; } else if (position === 'left') { - borderValue = alignBorderValue(me.right); - tx1 = me.right - tl; + borderValue = alignBorderValue(this.right); + tx1 = this.right - tl; tx2 = borderValue - axisHalfWidth; x1 = alignBorderValue(chartArea.left) + axisHalfWidth; x2 = chartArea.right; } else if (position === 'right') { - borderValue = alignBorderValue(me.left); + borderValue = alignBorderValue(this.left); x1 = chartArea.left; x2 = alignBorderValue(chartArea.right) - axisHalfWidth; tx1 = borderValue + axisHalfWidth; - tx2 = me.left + tl; + tx2 = this.left + tl; } else if (axis === 'x') { if (position === 'center') { borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5); } else if (isObject(position)) { var positionAxisID = Object.keys(position)[0]; var value = position[positionAxisID]; - borderValue = alignBorderValue(me.chart.scales[positionAxisID].getPixelForValue(value)); + borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value)); } - y1 = chartArea.top; y2 = chartArea.bottom; ty1 = borderValue + axisHalfWidth; ty2 = ty1 + tl; } else if (axis === 'y') { if (position === 'center') { borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2); } else if (isObject(position)) { - var _positionAxisID = Object.keys(position)[0]; - var _value = position[_positionAxisID]; - borderValue = alignBorderValue(me.chart.scales[_positionAxisID].getPixelForValue(_value)); + var positionAxisID1 = Object.keys(position)[0]; + var value1 = position[positionAxisID1]; + borderValue = alignBorderValue(this.chart.scales[positionAxisID1].getPixelForValue(value1)); } - tx1 = borderValue - axisHalfWidth; tx2 = tx1 - tl; x1 = chartArea.left; x2 = chartArea.right; } - - for (i = 0; i < ticksLength; ++i) { - var optsAtIndex = grid.setContext(me.getContext(i)); + var limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength); + var step = Math.max(1, Math.ceil(ticksLength / limit)); + for (i = 0; i < ticksLength; i += step) { + var context = this.getContext(i); + var optsAtIndex = grid.setContext(context); + var optsAtIndexBorder = border.setContext(context); var lineWidth = optsAtIndex.lineWidth; var lineColor = optsAtIndex.color; - var borderDash = grid.borderDash || []; - var borderDashOffset = optsAtIndex.borderDashOffset; + var borderDash = optsAtIndexBorder.dash || []; + var borderDashOffset = optsAtIndexBorder.dashOffset; var tickWidth = optsAtIndex.tickWidth; var tickColor = optsAtIndex.tickColor; var tickBorderDash = optsAtIndex.tickBorderDash || []; var tickBorderDashOffset = optsAtIndex.tickBorderDashOffset; - lineValue = getPixelForGridLine(me, i, offset); - + lineValue = getPixelForGridLine(this, i, offset); if (lineValue === undefined) { continue; } - alignedLineValue = _alignPixel(chart, lineValue, lineWidth); - if (isHorizontal) { tx1 = tx2 = x1 = x2 = alignedLineValue; } else { ty1 = ty2 = y1 = y2 = alignedLineValue; } - items.push({ tx1: tx1, ty1: ty1, tx2: tx2, ty2: ty2, @@ -8993,99 +8956,99 @@ tickColor: tickColor, tickBorderDash: tickBorderDash, tickBorderDashOffset: tickBorderDashOffset }); } - - me._ticksLength = ticksLength; - me._borderValue = borderValue; + this._ticksLength = ticksLength; + this._borderValue = borderValue; return items; } }, { key: "_computeLabelItems", value: function _computeLabelItems(chartArea) { - var me = this; - var axis = me.axis; - var options = me.options; + var axis = this.axis; + var options = this.options; var position = options.position, - optionTicks = options.ticks; - var isHorizontal = me.isHorizontal(); - var ticks = me.ticks; + optionTicks = options.ticks; + var isHorizontal = this.isHorizontal(); + var ticks = this.ticks; var align = optionTicks.align, - crossAlign = optionTicks.crossAlign, - padding = optionTicks.padding; + crossAlign = optionTicks.crossAlign, + padding = optionTicks.padding, + mirror = optionTicks.mirror; var tl = getTickMarkLength(options.grid); var tickAndPadding = tl + padding; - var rotation = -toRadians(me.labelRotation); + var hTickAndPadding = mirror ? -padding : tickAndPadding; + var rotation = -toRadians(this.labelRotation); var items = []; var i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset; var textBaseline = 'middle'; - if (position === 'top') { - y = me.bottom - tickAndPadding; - textAlign = me._getXAxisLabelAlignment(); + y = this.bottom - hTickAndPadding; + textAlign = this._getXAxisLabelAlignment(); } else if (position === 'bottom') { - y = me.top + tickAndPadding; - textAlign = me._getXAxisLabelAlignment(); + y = this.top + hTickAndPadding; + textAlign = this._getXAxisLabelAlignment(); } else if (position === 'left') { var ret = this._getYAxisLabelAlignment(tl); - textAlign = ret.textAlign; x = ret.x; } else if (position === 'right') { - var _ret = this._getYAxisLabelAlignment(tl); - - textAlign = _ret.textAlign; - x = _ret.x; + var ret1 = this._getYAxisLabelAlignment(tl); + textAlign = ret1.textAlign; + x = ret1.x; } else if (axis === 'x') { if (position === 'center') { y = (chartArea.top + chartArea.bottom) / 2 + tickAndPadding; } else if (isObject(position)) { var positionAxisID = Object.keys(position)[0]; var value = position[positionAxisID]; - y = me.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding; + y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding; } - - textAlign = me._getXAxisLabelAlignment(); + textAlign = this._getXAxisLabelAlignment(); } else if (axis === 'y') { if (position === 'center') { x = (chartArea.left + chartArea.right) / 2 - tickAndPadding; } else if (isObject(position)) { - var _positionAxisID2 = Object.keys(position)[0]; - var _value2 = position[_positionAxisID2]; - x = me.chart.scales[_positionAxisID2].getPixelForValue(_value2); + var positionAxisID1 = Object.keys(position)[0]; + var value1 = position[positionAxisID1]; + x = this.chart.scales[positionAxisID1].getPixelForValue(value1); } - textAlign = this._getYAxisLabelAlignment(tl).textAlign; } - if (axis === 'y') { if (align === 'start') { textBaseline = 'top'; } else if (align === 'end') { textBaseline = 'bottom'; } } - - var labelSizes = me._getLabelSizes(); - + var labelSizes = this._getLabelSizes(); for (i = 0, ilen = ticks.length; i < ilen; ++i) { tick = ticks[i]; label = tick.label; - var optsAtIndex = optionTicks.setContext(me.getContext(i)); - pixel = me.getPixelForTick(i) + optionTicks.labelOffset; - font = me._resolveTickFontOptions(i); + var optsAtIndex = optionTicks.setContext(this.getContext(i)); + pixel = this.getPixelForTick(i) + optionTicks.labelOffset; + font = this._resolveTickFontOptions(i); lineHeight = font.lineHeight; lineCount = isArray(label) ? label.length : 1; var halfCount = lineCount / 2; var color = optsAtIndex.color; var strokeColor = optsAtIndex.textStrokeColor; var strokeWidth = optsAtIndex.textStrokeWidth; - + var tickTextAlign = textAlign; if (isHorizontal) { x = pixel; - + if (textAlign === 'inner') { + if (i === ilen - 1) { + tickTextAlign = !this.options.reverse ? 'right' : 'left'; + } else if (i === 0) { + tickTextAlign = !this.options.reverse ? 'left' : 'right'; + } else { + tickTextAlign = 'center'; + } + } if (position === 'top') { if (crossAlign === 'near' || rotation !== 0) { textOffset = -lineCount * lineHeight + lineHeight / 2; } else if (crossAlign === 'center') { textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight; @@ -9099,203 +9062,228 @@ textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight; } else { textOffset = labelSizes.highest.height - lineCount * lineHeight; } } + if (mirror) { + textOffset *= -1; + } + if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) { + x += lineHeight / 2 * Math.sin(rotation); + } } else { y = pixel; textOffset = (1 - lineCount) * lineHeight / 2; } - + var backdrop = void 0; + if (optsAtIndex.showLabelBackdrop) { + var labelPadding = toPadding(optsAtIndex.backdropPadding); + var height = labelSizes.heights[i]; + var width = labelSizes.widths[i]; + var top = textOffset - labelPadding.top; + var left = 0 - labelPadding.left; + switch (textBaseline) { + case 'middle': + top -= height / 2; + break; + case 'bottom': + top -= height; + break; + } + switch (textAlign) { + case 'center': + left -= width / 2; + break; + case 'right': + left -= width; + break; + } + backdrop = { + left: left, + top: top, + width: width + labelPadding.width, + height: height + labelPadding.height, + color: optsAtIndex.backdropColor + }; + } items.push({ - rotation: rotation, label: label, font: font, - color: color, - strokeColor: strokeColor, - strokeWidth: strokeWidth, textOffset: textOffset, - textAlign: textAlign, - textBaseline: textBaseline, - translation: [x, y] + options: { + rotation: rotation, + color: color, + strokeColor: strokeColor, + strokeWidth: strokeWidth, + textAlign: tickTextAlign, + textBaseline: textBaseline, + translation: [x, y], + backdrop: backdrop + } }); } - return items; } }, { key: "_getXAxisLabelAlignment", value: function _getXAxisLabelAlignment() { - var me = this; - var _me$options4 = me.options, - position = _me$options4.position, - ticks = _me$options4.ticks; - var rotation = -toRadians(me.labelRotation); - + var _this$options8 = this.options, + position = _this$options8.position, + ticks = _this$options8.ticks; + var rotation = -toRadians(this.labelRotation); if (rotation) { return position === 'top' ? 'left' : 'right'; } - var align = 'center'; - if (ticks.align === 'start') { align = 'left'; } else if (ticks.align === 'end') { align = 'right'; + } else if (ticks.align === 'inner') { + align = 'inner'; } - return align; } }, { key: "_getYAxisLabelAlignment", value: function _getYAxisLabelAlignment(tl) { - var me = this; - var _me$options5 = me.options, - position = _me$options5.position, - _me$options5$ticks = _me$options5.ticks, - crossAlign = _me$options5$ticks.crossAlign, - mirror = _me$options5$ticks.mirror, - padding = _me$options5$ticks.padding; - - var labelSizes = me._getLabelSizes(); - + var _this$options9 = this.options, + position = _this$options9.position, + _this$options9$ticks = _this$options9.ticks, + crossAlign = _this$options9$ticks.crossAlign, + mirror = _this$options9$ticks.mirror, + padding = _this$options9$ticks.padding; + var labelSizes = this._getLabelSizes(); var tickAndPadding = tl + padding; var widest = labelSizes.widest.width; var textAlign; var x; - if (position === 'left') { if (mirror) { - textAlign = 'left'; - x = me.right - padding; + x = this.right + padding; + if (crossAlign === 'near') { + textAlign = 'left'; + } else if (crossAlign === 'center') { + textAlign = 'center'; + x += widest / 2; + } else { + textAlign = 'right'; + x += widest; + } } else { - x = me.right - tickAndPadding; - + x = this.right - tickAndPadding; if (crossAlign === 'near') { textAlign = 'right'; } else if (crossAlign === 'center') { textAlign = 'center'; x -= widest / 2; } else { textAlign = 'left'; - x = me.left; + x = this.left; } } } else if (position === 'right') { if (mirror) { - textAlign = 'right'; - x = me.left + padding; + x = this.left + padding; + if (crossAlign === 'near') { + textAlign = 'right'; + } else if (crossAlign === 'center') { + textAlign = 'center'; + x -= widest / 2; + } else { + textAlign = 'left'; + x -= widest; + } } else { - x = me.left + tickAndPadding; - + x = this.left + tickAndPadding; if (crossAlign === 'near') { textAlign = 'left'; } else if (crossAlign === 'center') { textAlign = 'center'; x += widest / 2; } else { textAlign = 'right'; - x = me.right; + x = this.right; } } } else { textAlign = 'right'; } - return { textAlign: textAlign, x: x }; } }, { key: "_computeLabelArea", value: function _computeLabelArea() { - var me = this; - - if (me.options.ticks.mirror) { + if (this.options.ticks.mirror) { return; } - - var chart = me.chart; - var position = me.options.position; - + var chart = this.chart; + var position = this.options.position; if (position === 'left' || position === 'right') { return { top: 0, - left: me.left, + left: this.left, bottom: chart.height, - right: me.right + right: this.right }; } - if (position === 'top' || position === 'bottom') { return { - top: me.top, + top: this.top, left: 0, - bottom: me.bottom, + bottom: this.bottom, right: chart.width }; } } }, { key: "drawBackground", value: function drawBackground() { var ctx = this.ctx, - backgroundColor = this.options.backgroundColor, - left = this.left, - top = this.top, - width = this.width, - height = this.height; - + backgroundColor = this.options.backgroundColor, + left = this.left, + top = this.top, + width = this.width, + height = this.height; if (backgroundColor) { ctx.save(); ctx.fillStyle = backgroundColor; ctx.fillRect(left, top, width, height); ctx.restore(); } } }, { key: "getLineWidthForValue", value: function getLineWidthForValue(value) { - var me = this; - var grid = me.options.grid; - - if (!me._isVisible() || !grid.display) { + var grid = this.options.grid; + if (!this._isVisible() || !grid.display) { return 0; } - - var ticks = me.ticks; + var ticks = this.ticks; var index = ticks.findIndex(function (t) { return t.value === value; }); - if (index >= 0) { - var opts = grid.setContext(me.getContext(index)); + var opts = grid.setContext(this.getContext(index)); return opts.lineWidth; } - return 0; } }, { key: "drawGrid", value: function drawGrid(chartArea) { - var me = this; - var grid = me.options.grid; - var ctx = me.ctx; - var chart = me.chart; - var borderOpts = grid.setContext(me.getContext(0)); - var axisWidth = grid.drawBorder ? borderOpts.borderWidth : 0; - - var items = me._gridLineItems || (me._gridLineItems = me._computeGridLineItems(chartArea)); - + var grid = this.options.grid; + var ctx = this.ctx; + var items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea)); var i, ilen; - var drawLine = function drawLine(p1, p2, style) { if (!style.width || !style.color) { return; } - ctx.save(); ctx.lineWidth = style.width; ctx.strokeStyle = style.color; ctx.setLineDash(style.borderDash || []); ctx.lineDashOffset = style.borderDashOffset; @@ -9303,25 +9291,22 @@ ctx.moveTo(p1.x, p1.y); ctx.lineTo(p2.x, p2.y); ctx.stroke(); ctx.restore(); }; - if (grid.display) { for (i = 0, ilen = items.length; i < ilen; ++i) { var item = items[i]; - if (grid.drawOnChartArea) { drawLine({ x: item.x1, y: item.y1 }, { x: item.x2, y: item.y2 }, item); } - if (grid.drawTicks) { drawLine({ x: item.tx1, y: item.ty1 }, { @@ -9334,107 +9319,106 @@ borderDashOffset: item.tickBorderDashOffset }); } } } - - if (axisWidth) { - var edgeOpts = grid.setContext(me.getContext(me._ticksLength - 1)); - var lastLineWidth = edgeOpts.lineWidth; - var borderValue = me._borderValue; - var x1, x2, y1, y2; - - if (me.isHorizontal()) { - x1 = _alignPixel(chart, me.left, axisWidth) - axisWidth / 2; - x2 = _alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2; - y1 = y2 = borderValue; - } else { - y1 = _alignPixel(chart, me.top, axisWidth) - axisWidth / 2; - y2 = _alignPixel(chart, me.bottom, lastLineWidth) + lastLineWidth / 2; - x1 = x2 = borderValue; - } - - drawLine({ - x: x1, - y: y1 - }, { - x: x2, - y: y2 - }, { - width: axisWidth, - color: edgeOpts.borderColor - }); + } + }, { + key: "drawBorder", + value: function drawBorder() { + var chart = this.chart, + ctx = this.ctx, + _this$options10 = this.options, + border = _this$options10.border, + grid = _this$options10.grid; + var borderOpts = border.setContext(this.getContext()); + var axisWidth = border.display ? borderOpts.width : 0; + if (!axisWidth) { + return; } + var lastLineWidth = grid.setContext(this.getContext(0)).lineWidth; + var borderValue = this._borderValue; + var x1, x2, y1, y2; + if (this.isHorizontal()) { + x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2; + x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2; + y1 = y2 = borderValue; + } else { + y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2; + y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2; + x1 = x2 = borderValue; + } + ctx.save(); + ctx.lineWidth = borderOpts.width; + ctx.strokeStyle = borderOpts.color; + ctx.beginPath(); + ctx.moveTo(x1, y1); + ctx.lineTo(x2, y2); + ctx.stroke(); + ctx.restore(); } }, { key: "drawLabels", value: function drawLabels(chartArea) { - var me = this; - var optionTicks = me.options.ticks; - + var optionTicks = this.options.ticks; if (!optionTicks.display) { return; } - - var ctx = me.ctx; - - var area = me._computeLabelArea(); - + var ctx = this.ctx; + var area = this._computeLabelArea(); if (area) { clipArea(ctx, area); } - - var items = me._labelItems || (me._labelItems = me._computeLabelItems(chartArea)); - - var i, ilen; - - for (i = 0, ilen = items.length; i < ilen; ++i) { - var item = items[i]; - var tickFont = item.font; - var label = item.label; - var y = item.textOffset; - renderText(ctx, label, 0, y, tickFont, item); + var items = this.getLabelItems(chartArea); + var _iterator10 = _createForOfIteratorHelper$1(items), + _step10; + try { + for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) { + var item = _step10.value; + var renderTextOptions = item.options; + var tickFont = item.font; + var label = item.label; + var y = item.textOffset; + renderText(ctx, label, 0, y, tickFont, renderTextOptions); + } + } catch (err) { + _iterator10.e(err); + } finally { + _iterator10.f(); } - if (area) { unclipArea(ctx); } } }, { key: "drawTitle", value: function drawTitle() { var ctx = this.ctx, - _this$options2 = this.options, - position = _this$options2.position, - title = _this$options2.title, - reverse = _this$options2.reverse; - + _this$options11 = this.options, + position = _this$options11.position, + title = _this$options11.title, + reverse = _this$options11.reverse; if (!title.display) { return; } - var font = toFont(title.font); var padding = toPadding(title.padding); var align = title.align; var offset = font.lineHeight / 2; - - if (position === 'bottom') { + if (position === 'bottom' || position === 'center' || isObject(position)) { offset += padding.bottom; - if (isArray(title.text)) { offset += font.lineHeight * (title.text.length - 1); } } else { offset += padding.top; } - var _titleArgs = titleArgs(this, offset, position, align), - titleX = _titleArgs.titleX, - titleY = _titleArgs.titleY, - maxWidth = _titleArgs.maxWidth, - rotation = _titleArgs.rotation; - + titleX = _titleArgs.titleX, + titleY = _titleArgs.titleY, + maxWidth = _titleArgs.maxWidth, + rotation = _titleArgs.rotation; renderText(ctx, title.text, 0, 0, font, { color: title.color, maxWidth: maxWidth, rotation: rotation, textAlign: titleAlign(align, position, reverse), @@ -9443,127 +9427,119 @@ }); } }, { key: "draw", value: function draw(chartArea) { - var me = this; - - if (!me._isVisible()) { + if (!this._isVisible()) { return; } - - me.drawBackground(); - me.drawGrid(chartArea); - me.drawTitle(); - me.drawLabels(chartArea); + this.drawBackground(); + this.drawGrid(chartArea); + this.drawBorder(); + this.drawTitle(); + this.drawLabels(chartArea); } }, { key: "_layers", value: function _layers() { - var me = this; - var opts = me.options; + var _this10 = this; + var opts = this.options; var tz = opts.ticks && opts.ticks.z || 0; - var gz = opts.grid && opts.grid.z || 0; - - if (!me._isVisible() || tz === gz || me.draw !== Scale.prototype.draw) { + var gz = valueOrDefault(opts.grid && opts.grid.z, -1); + var bz = valueOrDefault(opts.border && opts.border.z, 0); + if (!this._isVisible() || this.draw !== Scale.prototype.draw) { return [{ z: tz, draw: function draw(chartArea) { - me.draw(chartArea); + _this10.draw(chartArea); } }]; } - return [{ z: gz, draw: function draw(chartArea) { - me.drawBackground(); - me.drawGrid(chartArea); - me.drawTitle(); + _this10.drawBackground(); + _this10.drawGrid(chartArea); + _this10.drawTitle(); } }, { + z: bz, + draw: function draw() { + _this10.drawBorder(); + } + }, { z: tz, draw: function draw(chartArea) { - me.drawLabels(chartArea); + _this10.drawLabels(chartArea); } }]; } }, { key: "getMatchingVisibleMetas", value: function getMatchingVisibleMetas(type) { - var me = this; - var metas = me.chart.getSortedVisibleDatasetMetas(); - var axisID = me.axis + 'AxisID'; + var metas = this.chart.getSortedVisibleDatasetMetas(); + var axisID = this.axis + 'AxisID'; var result = []; var i, ilen; - for (i = 0, ilen = metas.length; i < ilen; ++i) { var meta = metas[i]; - - if (meta[axisID] === me.id && (!type || meta.type === type)) { + if (meta[axisID] === this.id && (!type || meta.type === type)) { result.push(meta); } } - return result; } }, { key: "_resolveTickFontOptions", value: function _resolveTickFontOptions(index) { var opts = this.options.ticks.setContext(this.getContext(index)); return toFont(opts.font); } + }, { + key: "_maxDigits", + value: function _maxDigits() { + var fontSize = this._resolveTickFontOptions(0).lineHeight; + return (this.isHorizontal() ? this.width : this.height) / fontSize; + } }]); - return Scale; }(Element); - var TypedRegistry = /*#__PURE__*/function () { function TypedRegistry(type, scope, override) { - _classCallCheck(this, TypedRegistry); - + _classCallCheck$x(this, TypedRegistry); this.type = type; this.scope = scope; this.override = override; this.items = Object.create(null); } - - _createClass(TypedRegistry, [{ + _createClass$x(TypedRegistry, [{ key: "isForType", value: function isForType(type) { return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype); } }, { key: "register", value: function register(item) { - var me = this; var proto = Object.getPrototypeOf(item); var parentScope; - if (isIChartComponent(proto)) { - parentScope = me.register(proto); + parentScope = this.register(proto); } - - var items = me.items; + var items = this.items; var id = item.id; - var scope = me.scope + '.' + id; - + var scope = this.scope + '.' + id; if (!id) { throw new Error('class does not have id: ' + item); } - if (id in items) { return scope; } - items[id] = item; registerDefaults(item, scope, parentScope); - - if (me.override) { + if (this.override) { defaults.override(item.id, item.overrides); } - return scope; } }, { key: "get", value: function get(id) { @@ -9573,41 +9549,33 @@ key: "unregister", value: function unregister(item) { var items = this.items; var id = item.id; var scope = this.scope; - if (id in items) { delete items[id]; } - if (scope && id in defaults[scope]) { delete defaults[scope][id]; - if (this.override) { delete overrides[id]; } } } }]); - return TypedRegistry; }(); - function registerDefaults(item, scope, parentScope) { var itemDefaults = merge(Object.create(null), [parentScope ? defaults.get(parentScope) : {}, defaults.get(scope), item.defaults]); defaults.set(scope, itemDefaults); - if (item.defaultRoutes) { routeDefaults(scope, item.defaultRoutes); } - if (item.descriptors) { defaults.describe(scope, item.descriptors); } } - function routeDefaults(scope, routes) { Object.keys(routes).forEach(function (property) { var propertyParts = property.split('.'); var sourceName = propertyParts.pop(); var sourceScope = [scope].concat(propertyParts).join('.'); @@ -9615,78 +9583,68 @@ var targetName = parts.pop(); var targetScope = parts.join('.'); defaults.route(sourceScope, sourceName, targetScope, targetName); }); } - function isIChartComponent(proto) { return 'id' in proto && 'defaults' in proto; } - var Registry = /*#__PURE__*/function () { function Registry() { - _classCallCheck(this, Registry); - + _classCallCheck$x(this, Registry); this.controllers = new TypedRegistry(DatasetController, 'datasets', true); this.elements = new TypedRegistry(Element, 'elements'); this.plugins = new TypedRegistry(Object, 'plugins'); this.scales = new TypedRegistry(Scale, 'scales'); this._typedRegistries = [this.controllers, this.scales, this.elements]; } - - _createClass(Registry, [{ + _createClass$x(Registry, [{ key: "add", value: function add() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - this._each('register', args); } }, { key: "remove", value: function remove() { for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } - this._each('unregister', args); } }, { key: "addControllers", value: function addControllers() { for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { args[_key3] = arguments[_key3]; } - this._each('register', args, this.controllers); } }, { key: "addElements", value: function addElements() { for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { args[_key4] = arguments[_key4]; } - this._each('register', args, this.elements); } }, { key: "addPlugins", value: function addPlugins() { for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { args[_key5] = arguments[_key5]; } - this._each('register', args, this.plugins); } }, { key: "addScales", value: function addScales() { for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) { args[_key6] = arguments[_key6]; } - this._each('register', args, this.scales); } }, { key: "getController", value: function getController(id) { @@ -9711,154 +9669,125 @@ key: "removeControllers", value: function removeControllers() { for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) { args[_key7] = arguments[_key7]; } - this._each('unregister', args, this.controllers); } }, { key: "removeElements", value: function removeElements() { for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) { args[_key8] = arguments[_key8]; } - this._each('unregister', args, this.elements); } }, { key: "removePlugins", value: function removePlugins() { for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) { args[_key9] = arguments[_key9]; } - this._each('unregister', args, this.plugins); } }, { key: "removeScales", value: function removeScales() { for (var _len10 = arguments.length, args = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) { args[_key10] = arguments[_key10]; } - this._each('unregister', args, this.scales); } }, { key: "_each", value: function _each(method, args, typedRegistry) { - var me = this; - + var _this11 = this; _toConsumableArray(args).forEach(function (arg) { - var reg = typedRegistry || me._getRegistryForType(arg); - - if (typedRegistry || reg.isForType(arg) || reg === me.plugins && arg.id) { - me._exec(method, reg, arg); + var reg = typedRegistry || _this11._getRegistryForType(arg); + if (typedRegistry || reg.isForType(arg) || reg === _this11.plugins && arg.id) { + _this11._exec(method, reg, arg); } else { each(arg, function (item) { - var itemReg = typedRegistry || me._getRegistryForType(item); - - me._exec(method, itemReg, item); + var itemReg = typedRegistry || _this11._getRegistryForType(item); + _this11._exec(method, itemReg, item); }); } }); } }, { key: "_exec", value: function _exec(method, registry, component) { var camelMethod = _capitalize(method); - callback(component['before' + camelMethod], [], component); registry[method](component); callback(component['after' + camelMethod], [], component); } }, { key: "_getRegistryForType", value: function _getRegistryForType(type) { for (var i = 0; i < this._typedRegistries.length; i++) { var reg = this._typedRegistries[i]; - if (reg.isForType(type)) { return reg; } } - return this.plugins; } }, { key: "_get", value: function _get(id, typedRegistry, type) { var item = typedRegistry.get(id); - if (item === undefined) { throw new Error('"' + id + '" is not a registered ' + type + '.'); } - return item; } }]); - return Registry; }(); - - var registry = new Registry(); - + var registry = /* #__PURE__ */new Registry(); var PluginService = /*#__PURE__*/function () { function PluginService() { - _classCallCheck(this, PluginService); - + _classCallCheck$x(this, PluginService); this._init = []; } - - _createClass(PluginService, [{ + _createClass$x(PluginService, [{ key: "notify", - value: function notify(chart, hook, args) { - var me = this; - + value: function notify(chart, hook, args, filter) { if (hook === 'beforeInit') { - me._init = me._createDescriptors(chart, true); - - me._notify(me._init, chart, 'install'); + this._init = this._createDescriptors(chart, true); + this._notify(this._init, chart, 'install'); } - - var descriptors = me._descriptors(chart); - - var result = me._notify(descriptors, chart, hook, args); - - if (hook === 'destroy') { - me._notify(descriptors, chart, 'stop'); - - me._notify(me._init, chart, 'uninstall'); + var descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart); + var result = this._notify(descriptors, chart, hook, args); + if (hook === 'afterDestroy') { + this._notify(descriptors, chart, 'stop'); + this._notify(this._init, chart, 'uninstall'); } - return result; } }, { key: "_notify", value: function _notify(descriptors, chart, hook, args) { args = args || {}; - - var _iterator3 = _createForOfIteratorHelper(descriptors), - _step3; - + var _iterator11 = _createForOfIteratorHelper$1(descriptors), + _step11; try { - for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { - var descriptor = _step3.value; + for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) { + var descriptor = _step11.value; var plugin = descriptor.plugin; var method = plugin[hook]; var params = [chart, args, descriptor.options]; - if (callback(method, params, plugin) === false && args.cancelable) { return false; } } } catch (err) { - _iterator3.e(err); + _iterator11.e(err); } finally { - _iterator3.f(); + _iterator11.f(); } - return true; } }, { key: "invalidate", value: function invalidate() { @@ -9871,15 +9800,12 @@ key: "_descriptors", value: function _descriptors(chart) { if (this._cache) { return this._cache; } - var descriptors = this._cache = this._createDescriptors(chart); - this._notifyStateChanges(chart); - return descriptors; } }, { key: "_createDescriptors", value: function _createDescriptors(chart, all) { @@ -9891,147 +9817,149 @@ }, { key: "_notifyStateChanges", value: function _notifyStateChanges(chart) { var previousDescriptors = this._oldCache || []; var descriptors = this._cache; - var diff = function diff(a, b) { return a.filter(function (x) { return !b.some(function (y) { return x.plugin.id === y.plugin.id; }); }); }; - this._notify(diff(previousDescriptors, descriptors), chart, 'stop'); - this._notify(diff(descriptors, previousDescriptors), chart, 'start'); } }]); - return PluginService; }(); - function allPlugins(config) { + var localIds = {}; var plugins = []; var keys = Object.keys(registry.plugins.items); - for (var i = 0; i < keys.length; i++) { plugins.push(registry.getPlugin(keys[i])); } - var local = config.plugins || []; - - for (var _i = 0; _i < local.length; _i++) { - var plugin = local[_i]; - + for (var i1 = 0; i1 < local.length; i1++) { + var plugin = local[i1]; if (plugins.indexOf(plugin) === -1) { plugins.push(plugin); + localIds[plugin.id] = true; } } - - return plugins; + return { + plugins: plugins, + localIds: localIds + }; } - function getOpts(options, all) { if (!all && options === false) { return null; } - if (options === true) { return {}; } - return options; } - - function createDescriptors(chart, plugins, options, all) { + function createDescriptors(chart, _ref2, options, all) { + var plugins = _ref2.plugins, + localIds = _ref2.localIds; var result = []; var context = chart.getContext(); - - for (var i = 0; i < plugins.length; i++) { - var plugin = plugins[i]; - var id = plugin.id; - var opts = getOpts(options[id], all); - - if (opts === null) { - continue; + var _iterator12 = _createForOfIteratorHelper$1(plugins), + _step12; + try { + for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) { + var plugin = _step12.value; + var id = plugin.id; + var opts = getOpts(options[id], all); + if (opts === null) { + continue; + } + result.push({ + plugin: plugin, + options: pluginOpts(chart.config, { + plugin: plugin, + local: localIds[id] + }, opts, context) + }); } - - result.push({ - plugin: plugin, - options: pluginOpts(chart.config, plugin, opts, context) - }); + } catch (err) { + _iterator12.e(err); + } finally { + _iterator12.f(); } - return result; } - - function pluginOpts(config, plugin, opts, context) { + function pluginOpts(config, _ref3, opts, context) { + var plugin = _ref3.plugin, + local = _ref3.local; var keys = config.pluginScopeKeys(plugin); var scopes = config.getOptionScopes(opts, keys); + if (local && plugin.defaults) { + scopes.push(plugin.defaults); + } return config.createResolver(scopes, context, [''], { scriptable: false, indexable: false, allKeys: true }); } - function getIndexAxis(type, options) { var datasetDefaults = defaults.datasets[type] || {}; var datasetOptions = (options.datasets || {})[type] || {}; return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x'; } - function getAxisFromDefaultScaleID(id, indexAxis) { var axis = id; - if (id === '_index_') { axis = indexAxis; } else if (id === '_value_') { axis = indexAxis === 'x' ? 'y' : 'x'; } - return axis; } - function getDefaultScaleIDFromAxis(axis, indexAxis) { return axis === indexAxis ? '_index_' : '_value_'; } - function axisFromPosition(position) { if (position === 'top' || position === 'bottom') { return 'x'; } - if (position === 'left' || position === 'right') { return 'y'; } } - function determineAxis(id, scaleOptions) { - if (id === 'x' || id === 'y') { + if (id === 'x' || id === 'y' || id === 'r') { return id; } - - return scaleOptions.axis || axisFromPosition(scaleOptions.position) || id.charAt(0).toLowerCase(); + id = scaleOptions.axis || axisFromPosition(scaleOptions.position) || id.length > 1 && determineAxis(id[0].toLowerCase(), scaleOptions); + if (id) { + return id; + } + throw new Error("Cannot determine type of '".concat(name, "' axis. Please provide 'axis' or 'position' option.")); } - function mergeScaleConfig(config, options) { var chartDefaults = overrides[config.type] || { scales: {} }; var configScales = options.scales || {}; var chartIndexAxis = getIndexAxis(config.type, options); - var firstIDs = Object.create(null); var scales = Object.create(null); Object.keys(configScales).forEach(function (id) { var scaleConf = configScales[id]; + if (!isObject(scaleConf)) { + return console.error("Invalid scale configuration for scale: ".concat(id)); + } + if (scaleConf._proxy) { + return console.warn("Ignoring resolver passed as options for scale: ".concat(id)); + } var axis = determineAxis(id, scaleConf); var defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis); var defaultScaleOptions = chartDefaults.scales || {}; - firstIDs[axis] = firstIDs[axis] || id; scales[id] = mergeIf(Object.create(null), [{ axis: axis }, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]); }); config.data.datasets.forEach(function (dataset) { @@ -10039,11 +9967,11 @@ var indexAxis = dataset.indexAxis || getIndexAxis(type, options); var datasetDefaults = overrides[type] || {}; var defaultScaleOptions = datasetDefaults.scales || {}; Object.keys(defaultScaleOptions).forEach(function (defaultID) { var axis = getAxisFromDefaultScaleID(defaultID, indexAxis); - var id = dataset[axis + 'AxisID'] || firstIDs[axis] || axis; + var id = dataset[axis + 'AxisID'] || axis; scales[id] = scales[id] || Object.create(null); mergeIf(scales[id], [{ axis: axis }, configScales[id], defaultScaleOptions[defaultID]]); }); @@ -10052,62 +9980,57 @@ var scale = scales[key]; mergeIf(scale, [defaults.scales[scale.type], defaults.scale]); }); return scales; } - function initOptions(config) { var options = config.options || (config.options = {}); options.plugins = valueOrDefault(options.plugins, {}); options.scales = mergeScaleConfig(config, options); } - - function initConfig(config) { - config = config || {}; - var data = config.data = config.data || { - datasets: [], - labels: [] - }; + function initData(data) { + data = data || {}; data.datasets = data.datasets || []; data.labels = data.labels || []; + return data; + } + function initConfig(config) { + config = config || {}; + config.data = initData(config.data); initOptions(config); return config; } - var keyCache = new Map(); var keysCached = new Set(); - function cachedKeys(cacheKey, generate) { var keys = keyCache.get(cacheKey); - if (!keys) { keys = generate(); keyCache.set(cacheKey, keys); keysCached.add(keys); } - return keys; } - var addIfFound = function addIfFound(set, obj, key) { var opts = resolveObjectKey(obj, key); - if (opts !== undefined) { set.add(opts); } }; - var Config = /*#__PURE__*/function () { function Config(config) { - _classCallCheck(this, Config); - + _classCallCheck$x(this, Config); this._config = initConfig(config); this._scopeCache = new Map(); this._resolverCache = new Map(); } - - _createClass(Config, [{ + _createClass$x(Config, [{ + key: "platform", + get: function get() { + return this._config.platform; + } + }, { key: "type", get: function get() { return this._config.type; }, set: function set(type) { @@ -10117,11 +10040,11 @@ key: "data", get: function get() { return this._config.data; }, set: function set(data) { - this._config.data = data; + this._config.data = initData(data); } }, { key: "options", get: function get() { return this._config.options; @@ -10143,11 +10066,10 @@ } }, { key: "clearCache", value: function clearCache() { this._scopeCache.clear(); - this._resolverCache.clear(); } }, { key: "datasetScopeKeys", value: function datasetScopeKeys(datasetType) { @@ -10180,44 +10102,35 @@ } }, { key: "_cachedScopes", value: function _cachedScopes(mainScope, resetCache) { var _scopeCache = this._scopeCache; - var cache = _scopeCache.get(mainScope); - if (!cache || resetCache) { cache = new Map(); - _scopeCache.set(mainScope, cache); } - return cache; } }, { key: "getOptionScopes", value: function getOptionScopes(mainScope, keyLists, resetCache) { var options = this.options, - type = this.type; - + type = this.type; var cache = this._cachedScopes(mainScope, resetCache); - var cached = cache.get(keyLists); - if (cached) { return cached; } - var scopes = new Set(); keyLists.forEach(function (keys) { if (mainScope) { scopes.add(mainScope); keys.forEach(function (key) { return addIfFound(scopes, mainScope, key); }); } - keys.forEach(function (key) { return addIfFound(scopes, options, key); }); keys.forEach(function (key) { return addIfFound(scopes, overrides[type] || {}, key); @@ -10227,24 +10140,24 @@ }); keys.forEach(function (key) { return addIfFound(scopes, descriptors, key); }); }); - - var array = _toConsumableArray(scopes); - + var array = Array.from(scopes); + if (array.length === 0) { + array.push(Object.create(null)); + } if (keysCached.has(keyLists)) { cache.set(keyLists, array); } - return array; } }, { key: "chartOptionScopes", value: function chartOptionScopes() { var options = this.options, - type = this.type; + type = this.type; return [options, overrides[type] || {}, defaults.datasets[type] || {}, { type: type }, defaults, descriptors]; } }, { @@ -10252,178 +10165,182 @@ value: function resolveNamedOptions(scopes, names, context) { var prefixes = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ['']; var result = { $shared: true }; - var _getResolver = getResolver(this._resolverCache, scopes, prefixes), - resolver = _getResolver.resolver, - subPrefixes = _getResolver.subPrefixes; - + resolver = _getResolver.resolver, + subPrefixes = _getResolver.subPrefixes; var options = resolver; - if (needContext(resolver, names)) { result.$shared = false; context = isFunction(context) ? context() : context; var subResolver = this.createResolver(scopes, context, subPrefixes); options = _attachContext(resolver, context, subResolver); } - - var _iterator4 = _createForOfIteratorHelper(names), - _step4; - + var _iterator13 = _createForOfIteratorHelper$1(names), + _step13; try { - for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { - var prop = _step4.value; + for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) { + var prop = _step13.value; result[prop] = options[prop]; } } catch (err) { - _iterator4.e(err); + _iterator13.e(err); } finally { - _iterator4.f(); + _iterator13.f(); } - return result; } }, { key: "createResolver", value: function createResolver(scopes, context) { var prefixes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ['']; var descriptorDefaults = arguments.length > 3 ? arguments[3] : undefined; - var _getResolver2 = getResolver(this._resolverCache, scopes, prefixes), - resolver = _getResolver2.resolver; - + resolver = _getResolver2.resolver; return isObject(context) ? _attachContext(resolver, context, undefined, descriptorDefaults) : resolver; } }]); - return Config; }(); - function getResolver(resolverCache, scopes, prefixes) { var cache = resolverCache.get(scopes); - if (!cache) { cache = new Map(); resolverCache.set(scopes, cache); } - var cacheKey = prefixes.join(); var cached = cache.get(cacheKey); - if (!cached) { var resolver = _createResolver(scopes, prefixes); - cached = { resolver: resolver, subPrefixes: prefixes.filter(function (p) { return !p.toLowerCase().includes('hover'); }) }; cache.set(cacheKey, cached); } - return cached; } - + var hasFunction = function hasFunction(value) { + return isObject(value) && Object.getOwnPropertyNames(value).reduce(function (acc, key) { + return acc || isFunction(value[key]); + }, false); + }; function needContext(proxy, names) { var _descriptors2 = _descriptors(proxy), - isScriptable = _descriptors2.isScriptable, - isIndexable = _descriptors2.isIndexable; - - var _iterator5 = _createForOfIteratorHelper(names), - _step5; - + isScriptable = _descriptors2.isScriptable, + isIndexable = _descriptors2.isIndexable; + var _iterator14 = _createForOfIteratorHelper$1(names), + _step14; try { - for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) { - var prop = _step5.value; - - if (isScriptable(prop) && isFunction(proxy[prop]) || isIndexable(prop) && isArray(proxy[prop])) { + for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) { + var prop = _step14.value; + var scriptable = isScriptable(prop); + var indexable = isIndexable(prop); + var value = (indexable || scriptable) && proxy[prop]; + if (scriptable && (isFunction(value) || hasFunction(value)) || indexable && isArray(value)) { return true; } } } catch (err) { - _iterator5.e(err); + _iterator14.e(err); } finally { - _iterator5.f(); + _iterator14.f(); } - return false; } - - var version = "3.0.2"; + var version = "4.2.0"; var KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea']; - function positionIsHorizontal(position, axis) { return position === 'top' || position === 'bottom' || KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x'; } - function compare2Level(l1, l2) { return function (a, b) { return a[l1] === b[l1] ? a[l2] - b[l2] : a[l1] - b[l1]; }; } - function onAnimationsComplete(context) { var chart = context.chart; var animationOptions = chart.options.animation; chart.notifyPlugins('afterRender'); callback(animationOptions && animationOptions.onComplete, [context], chart); } - function onAnimationProgress(context) { var chart = context.chart; var animationOptions = chart.options.animation; callback(animationOptions && animationOptions.onProgress, [context], chart); } - - function isDomSupported() { - return typeof window !== 'undefined' && typeof document !== 'undefined'; - } - function getCanvas(item) { - if (isDomSupported() && typeof item === 'string') { + if (_isDomSupported() && typeof item === 'string') { item = document.getElementById(item); } else if (item && item.length) { item = item[0]; } - if (item && item.canvas) { item = item.canvas; } - return item; } - var instances = {}; - var getChart = function getChart(key) { var canvas = getCanvas(key); return Object.values(instances).filter(function (c) { return c.canvas === canvas; }).pop(); }; - - var Chart = /*#__PURE__*/function () { - function Chart(item, config) { - var _this5 = this; - - _classCallCheck(this, Chart); - - var me = this; - this.config = config = new Config(config); + function moveNumericKeys(obj, start, move) { + var keys = Object.keys(obj); + for (var _i2 = 0, _keys = keys; _i2 < _keys.length; _i2++) { + var key = _keys[_i2]; + var intKey = +key; + if (intKey >= start) { + var value = obj[key]; + delete obj[key]; + if (move > 0 || intKey > start) { + obj[intKey + move] = value; + } + } + } + } + function determineLastEvent(e, lastEvent, inChartArea, isClick) { + if (!inChartArea || e.type === 'mouseout') { + return null; + } + if (isClick) { + return lastEvent; + } + return e; + } + function getDatasetArea(meta) { + var xScale = meta.xScale, + yScale = meta.yScale; + if (xScale && yScale) { + return { + left: xScale.left, + right: xScale.right, + top: yScale.top, + bottom: yScale.bottom + }; + } + } + var Chart$1 = /*#__PURE__*/function () { + function Chart(item, userConfig) { + var _this12 = this; + _classCallCheck$x(this, Chart); + var config = this.config = new Config(userConfig); var initialCanvas = getCanvas(item); var existingChart = getChart(initialCanvas); - if (existingChart) { - throw new Error('Canvas is already in use. Chart with ID \'' + existingChart.id + '\'' + ' must be destroyed before the canvas can be reused.'); + throw new Error('Canvas is already in use. Chart with ID \'' + existingChart.id + '\'' + ' must be destroyed before the canvas with ID \'' + existingChart.canvas.id + '\' can be reused.'); } - - var options = config.createResolver(config.chartOptionScopes(), me.getContext()); - this.platform = me._initializePlatform(initialCanvas, config); - var context = me.platform.acquireContext(initialCanvas, options.aspectRatio); + var options = config.createResolver(config.chartOptionScopes(), this.getContext()); + this.platform = new (config.platform || _detectPlatform(initialCanvas))(); + this.platform.updateConfig(config); + var context = this.platform.acquireContext(initialCanvas, options.aspectRatio); var canvas = context && context.canvas; var height = canvas && canvas.height; var width = canvas && canvas.width; this.id = uid(); this.ctx = context; @@ -10439,57 +10356,50 @@ this.currentDevicePixelRatio = undefined; this.chartArea = undefined; this._active = []; this._lastEvent = undefined; this._listeners = {}; + this._responsiveListeners = undefined; this._sortedMetasets = []; this.scales = {}; - this.scale = undefined; this._plugins = new PluginService(); this.$proxies = {}; this._hiddenIndices = {}; this.attached = false; this._animationsDisabled = undefined; this.$context = undefined; - this._doResize = debounce(function () { - return _this5.update('resize'); + this._doResize = debounce(function (mode) { + return _this12.update(mode); }, options.resizeDelay || 0); - instances[me.id] = me; - + this._dataChanges = []; + instances[this.id] = this; if (!context || !canvas) { console.error("Failed to create chart: can't acquire context from the given item"); return; } - - animator.listen(me, 'complete', onAnimationsComplete); - animator.listen(me, 'progress', onAnimationProgress); - - me._initialize(); - - if (me.attached) { - me.update(); + animator.listen(this, 'complete', onAnimationsComplete); + animator.listen(this, 'progress', onAnimationProgress); + this._initialize(); + if (this.attached) { + this.update(); } } - - _createClass(Chart, [{ + _createClass$x(Chart, [{ key: "aspectRatio", get: function get() { - var _this$options3 = this.options, - aspectRatio = _this$options3.aspectRatio, - maintainAspectRatio = _this$options3.maintainAspectRatio, - width = this.width, - height = this.height, - _aspectRatio = this._aspectRatio; - + var _this$options12 = this.options, + aspectRatio = _this$options12.aspectRatio, + maintainAspectRatio = _this$options12.maintainAspectRatio, + width = this.width, + height = this.height, + _aspectRatio = this._aspectRatio; if (!isNullOrUndef(aspectRatio)) { return aspectRatio; } - if (maintainAspectRatio && _aspectRatio) { return _aspectRatio; } - return height ? width / height : null; } }, { key: "data", get: function get() { @@ -10505,37 +10415,28 @@ }, set: function set(options) { this.config.options = options; } }, { + key: "registry", + get: function get() { + return registry; + } + }, { key: "_initialize", value: function _initialize() { - var me = this; - me.notifyPlugins('beforeInit'); - - if (me.options.responsive) { - me.resize(); + this.notifyPlugins('beforeInit'); + if (this.options.responsive) { + this.resize(); } else { - retinaScale(me, me.options.devicePixelRatio); + retinaScale(this, this.options.devicePixelRatio); } - - me.bindEvents(); - me.notifyPlugins('afterInit'); - return me; + this.bindEvents(); + this.notifyPlugins('afterInit'); + return this; } }, { - key: "_initializePlatform", - value: function _initializePlatform(canvas, config) { - if (config.platform) { - return new config.platform(); - } else if (!isDomSupported() || typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas) { - return new BasicPlatform(); - } - - return new DomPlatform(); - } - }, { key: "clear", value: function clear() { clearCanvas(this.canvas, this.ctx); return this; } @@ -10558,34 +10459,29 @@ } } }, { key: "_resize", value: function _resize(width, height) { - var me = this; - var options = me.options; - var canvas = me.canvas; - var aspectRatio = options.maintainAspectRatio && me.aspectRatio; - var newSize = me.platform.getMaximumSize(canvas, width, height, aspectRatio); - var oldRatio = me.currentDevicePixelRatio; - var newRatio = options.devicePixelRatio || me.platform.getDevicePixelRatio(); - - if (me.width === newSize.width && me.height === newSize.height && oldRatio === newRatio) { + var options = this.options; + var canvas = this.canvas; + var aspectRatio = options.maintainAspectRatio && this.aspectRatio; + var newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio); + var newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio(); + var mode = this.width ? 'resize' : 'attach'; + this.width = newSize.width; + this.height = newSize.height; + this._aspectRatio = this.aspectRatio; + if (!retinaScale(this, newRatio, true)) { return; } - - me.width = newSize.width; - me.height = newSize.height; - me._aspectRatio = me.aspectRatio; - retinaScale(me, newRatio, true); - me.notifyPlugins('resize', { + this.notifyPlugins('resize', { size: newSize }); - callback(options.onResize, [me, newSize], me); - - if (me.attached) { - if (me._doResize()) { - me.render(); + callback(options.onResize, [this, newSize], this); + if (this.attached) { + if (this._doResize(mode)) { + this.render(); } } } }, { key: "ensureScalesHaveIDs", @@ -10597,20 +10493,19 @@ }); } }, { key: "buildOrUpdateScales", value: function buildOrUpdateScales() { - var me = this; - var options = me.options; + var _this13 = this; + var options = this.options; var scaleOpts = options.scales; - var scales = me.scales; + var scales = this.scales; var updated = Object.keys(scales).reduce(function (obj, id) { obj[id] = false; return obj; }, {}); var items = []; - if (scaleOpts) { items = items.concat(Object.keys(scaleOpts).map(function (id) { var scaleOptions = scaleOpts[id]; var axis = determineAxis(id, scaleOptions); var isRadial = axis === 'r'; @@ -10620,460 +10515,457 @@ dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left', dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear' }; })); } - each(items, function (item) { var scaleOptions = item.options; var id = scaleOptions.id; var axis = determineAxis(id, scaleOptions); var scaleType = valueOrDefault(scaleOptions.type, item.dtype); - if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) { scaleOptions.position = item.dposition; } - updated[id] = true; var scale = null; - if (id in scales && scales[id].type === scaleType) { scale = scales[id]; } else { var scaleClass = registry.getScale(scaleType); scale = new scaleClass({ id: id, type: scaleType, - ctx: me.ctx, - chart: me + ctx: _this13.ctx, + chart: _this13 }); scales[scale.id] = scale; } - scale.init(scaleOptions, options); }); each(updated, function (hasUpdated, id) { if (!hasUpdated) { delete scales[id]; } }); each(scales, function (scale) { - layouts.configure(me, scale, scale.options); - layouts.addBox(me, scale); + layouts.configure(_this13, scale, scale.options); + layouts.addBox(_this13, scale); }); } }, { - key: "_updateMetasetIndex", - value: function _updateMetasetIndex(meta, index) { - var metasets = this._metasets; - var oldIndex = meta.index; - - if (oldIndex !== index) { - metasets[oldIndex] = metasets[index]; - metasets[index] = meta; - meta.index = index; - } - } - }, { key: "_updateMetasets", value: function _updateMetasets() { - var me = this; - var metasets = me._metasets; - var numData = me.data.datasets.length; + var metasets = this._metasets; + var numData = this.data.datasets.length; var numMeta = metasets.length; - + metasets.sort(function (a, b) { + return a.index - b.index; + }); if (numMeta > numData) { for (var i = numData; i < numMeta; ++i) { - me._destroyDatasetMeta(i); + this._destroyDatasetMeta(i); } - metasets.splice(numData, numMeta - numData); } - - me._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index')); + this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index')); } }, { key: "_removeUnreferencedMetasets", value: function _removeUnreferencedMetasets() { - var me = this; - var metasets = me._metasets, - datasets = me.data.datasets; - + var _this14 = this; + var metasets = this._metasets, + datasets = this.data.datasets; if (metasets.length > datasets.length) { - delete me._stacks; + delete this._stacks; } - metasets.forEach(function (meta, index) { if (datasets.filter(function (x) { return x === meta._dataset; }).length === 0) { - me._destroyDatasetMeta(index); + _this14._destroyDatasetMeta(index); } }); } }, { key: "buildOrUpdateControllers", value: function buildOrUpdateControllers() { - var me = this; var newControllers = []; - var datasets = me.data.datasets; + var datasets = this.data.datasets; var i, ilen; - - me._removeUnreferencedMetasets(); - + this._removeUnreferencedMetasets(); for (i = 0, ilen = datasets.length; i < ilen; i++) { var dataset = datasets[i]; - var meta = me.getDatasetMeta(i); - var type = dataset.type || me.config.type; - + var meta = this.getDatasetMeta(i); + var type = dataset.type || this.config.type; if (meta.type && meta.type !== type) { - me._destroyDatasetMeta(i); - - meta = me.getDatasetMeta(i); + this._destroyDatasetMeta(i); + meta = this.getDatasetMeta(i); } - meta.type = type; - meta.indexAxis = dataset.indexAxis || getIndexAxis(type, me.options); + meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options); meta.order = dataset.order || 0; - - me._updateMetasetIndex(meta, i); - + meta.index = i; meta.label = '' + dataset.label; - meta.visible = me.isDatasetVisible(i); - + meta.visible = this.isDatasetVisible(i); if (meta.controller) { meta.controller.updateIndex(i); meta.controller.linkScales(); } else { var ControllerClass = registry.getController(type); var _defaults$datasets$ty = defaults.datasets[type], - datasetElementType = _defaults$datasets$ty.datasetElementType, - dataElementType = _defaults$datasets$ty.dataElementType; - Object.assign(ControllerClass.prototype, { + datasetElementType = _defaults$datasets$ty.datasetElementType, + dataElementType = _defaults$datasets$ty.dataElementType; + Object.assign(ControllerClass, { dataElementType: registry.getElement(dataElementType), datasetElementType: datasetElementType && registry.getElement(datasetElementType) }); - meta.controller = new ControllerClass(me, i); + meta.controller = new ControllerClass(this, i); newControllers.push(meta.controller); } } - - me._updateMetasets(); - + this._updateMetasets(); return newControllers; } }, { key: "_resetElements", value: function _resetElements() { - var me = this; - each(me.data.datasets, function (dataset, datasetIndex) { - me.getDatasetMeta(datasetIndex).controller.reset(); - }, me); + var _this15 = this; + each(this.data.datasets, function (dataset, datasetIndex) { + _this15.getDatasetMeta(datasetIndex).controller.reset(); + }, this); } }, { key: "reset", value: function reset() { this._resetElements(); - this.notifyPlugins('reset'); } }, { key: "update", value: function update(mode) { - var me = this; - var config = me.config; + var config = this.config; config.update(); - me._options = config.createResolver(config.chartOptionScopes(), me.getContext()); - each(me.scales, function (scale) { - layouts.removeBox(me, scale); - }); - var animsDisabled = me._animationsDisabled = !me.options.animation; - me.ensureScalesHaveIDs(); - me.buildOrUpdateScales(); - - me._plugins.invalidate(); - - if (me.notifyPlugins('beforeUpdate', { + var options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext()); + var animsDisabled = this._animationsDisabled = !options.animation; + this._updateScales(); + this._checkEventBindings(); + this._updateHiddenIndices(); + this._plugins.invalidate(); + if (this.notifyPlugins('beforeUpdate', { mode: mode, cancelable: true }) === false) { return; } - - var newControllers = me.buildOrUpdateControllers(); - me.notifyPlugins('beforeElementsUpdate'); + var newControllers = this.buildOrUpdateControllers(); + this.notifyPlugins('beforeElementsUpdate'); var minPadding = 0; - - for (var i = 0, ilen = me.data.datasets.length; i < ilen; i++) { - var _me$getDatasetMeta = me.getDatasetMeta(i), - controller = _me$getDatasetMeta.controller; - + for (var i = 0, ilen = this.data.datasets.length; i < ilen; i++) { + var _this$getDatasetMeta = this.getDatasetMeta(i), + controller = _this$getDatasetMeta.controller; var reset = !animsDisabled && newControllers.indexOf(controller) === -1; controller.buildOrUpdateElements(reset); minPadding = Math.max(+controller.getMaxOverflow(), minPadding); } - - me._minPadding = minPadding; - - me._updateLayout(minPadding); - + minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0; + this._updateLayout(minPadding); if (!animsDisabled) { each(newControllers, function (controller) { controller.reset(); }); } - - me._updateDatasets(mode); - - me.notifyPlugins('afterUpdate', { + this._updateDatasets(mode); + this.notifyPlugins('afterUpdate', { mode: mode }); - - me._layers.sort(compare2Level('z', '_idx')); - - if (me._lastEvent) { - me._eventHandler(me._lastEvent, true); + this._layers.sort(compare2Level('z', '_idx')); + var _active = this._active, + _lastEvent = this._lastEvent; + if (_lastEvent) { + this._eventHandler(_lastEvent, true); + } else if (_active.length) { + this._updateHoverStyles(_active, _active, true); } - - me.render(); + this.render(); } }, { + key: "_updateScales", + value: function _updateScales() { + var _this16 = this; + each(this.scales, function (scale) { + layouts.removeBox(_this16, scale); + }); + this.ensureScalesHaveIDs(); + this.buildOrUpdateScales(); + } + }, { + key: "_checkEventBindings", + value: function _checkEventBindings() { + var options = this.options; + var existingEvents = new Set(Object.keys(this._listeners)); + var newEvents = new Set(options.events); + if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) { + this.unbindEvents(); + this.bindEvents(); + } + } + }, { + key: "_updateHiddenIndices", + value: function _updateHiddenIndices() { + var _hiddenIndices = this._hiddenIndices; + var changes = this._getUniformDataChanges() || []; + var _iterator15 = _createForOfIteratorHelper$1(changes), + _step15; + try { + for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) { + var _step15$value = _step15.value, + method = _step15$value.method, + start = _step15$value.start, + count = _step15$value.count; + var move = method === '_removeElements' ? -count : count; + moveNumericKeys(_hiddenIndices, start, move); + } + } catch (err) { + _iterator15.e(err); + } finally { + _iterator15.f(); + } + } + }, { + key: "_getUniformDataChanges", + value: function _getUniformDataChanges() { + var _dataChanges = this._dataChanges; + if (!_dataChanges || !_dataChanges.length) { + return; + } + this._dataChanges = []; + var datasetCount = this.data.datasets.length; + var makeSet = function makeSet(idx) { + return new Set(_dataChanges.filter(function (c) { + return c[0] === idx; + }).map(function (c, i) { + return i + ',' + c.splice(1).join(','); + })); + }; + var changeSet = makeSet(0); + for (var i = 1; i < datasetCount; i++) { + if (!setsEqual(changeSet, makeSet(i))) { + return; + } + } + return Array.from(changeSet).map(function (c) { + return c.split(','); + }).map(function (a) { + return { + method: a[1], + start: +a[2], + count: +a[3] + }; + }); + } + }, { key: "_updateLayout", value: function _updateLayout(minPadding) { - var me = this; - - if (me.notifyPlugins('beforeLayout', { + var _this17 = this; + if (this.notifyPlugins('beforeLayout', { cancelable: true }) === false) { return; } - - layouts.update(me, me.width, me.height, minPadding); - var area = me.chartArea; + layouts.update(this, this.width, this.height, minPadding); + var area = this.chartArea; var noArea = area.width <= 0 || area.height <= 0; - me._layers = []; - each(me.boxes, function (box) { - var _me$_layers; - + this._layers = []; + each(this.boxes, function (box) { + var _this17$_layers; if (noArea && box.position === 'chartArea') { return; } - if (box.configure) { box.configure(); } - - (_me$_layers = me._layers).push.apply(_me$_layers, _toConsumableArray(box._layers())); - }, me); - - me._layers.forEach(function (item, index) { + (_this17$_layers = _this17._layers).push.apply(_this17$_layers, _toConsumableArray(box._layers())); + }, this); + this._layers.forEach(function (item, index) { item._idx = index; }); - - me.notifyPlugins('afterLayout'); + this.notifyPlugins('afterLayout'); } }, { key: "_updateDatasets", value: function _updateDatasets(mode) { - var me = this; - var isFunction = typeof mode === 'function'; - - if (me.notifyPlugins('beforeDatasetsUpdate', { + if (this.notifyPlugins('beforeDatasetsUpdate', { mode: mode, cancelable: true }) === false) { return; } - - for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { - me._updateDataset(i, isFunction ? mode({ - datasetIndex: i + for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { + this.getDatasetMeta(i).controller.configure(); + } + for (var i1 = 0, ilen1 = this.data.datasets.length; i1 < ilen1; ++i1) { + this._updateDataset(i1, isFunction(mode) ? mode({ + datasetIndex: i1 }) : mode); } - - me.notifyPlugins('afterDatasetsUpdate', { + this.notifyPlugins('afterDatasetsUpdate', { mode: mode }); } }, { key: "_updateDataset", value: function _updateDataset(index, mode) { - var me = this; - var meta = me.getDatasetMeta(index); + var meta = this.getDatasetMeta(index); var args = { meta: meta, index: index, mode: mode, cancelable: true }; - - if (me.notifyPlugins('beforeDatasetUpdate', args) === false) { + if (this.notifyPlugins('beforeDatasetUpdate', args) === false) { return; } - meta.controller._update(mode); - args.cancelable = false; - me.notifyPlugins('afterDatasetUpdate', args); + this.notifyPlugins('afterDatasetUpdate', args); } }, { key: "render", value: function render() { - var me = this; - - if (me.notifyPlugins('beforeRender', { + if (this.notifyPlugins('beforeRender', { cancelable: true }) === false) { return; } - - if (animator.has(me)) { - if (me.attached && !animator.running(me)) { - animator.start(me); + if (animator.has(this)) { + if (this.attached && !animator.running(this)) { + animator.start(this); } } else { - me.draw(); + this.draw(); onAnimationsComplete({ - chart: me + chart: this }); } } }, { key: "draw", value: function draw() { - var me = this; var i; - - if (me._resizeBeforeDraw) { - var _me$_resizeBeforeDraw = me._resizeBeforeDraw, - width = _me$_resizeBeforeDraw.width, - height = _me$_resizeBeforeDraw.height; - - me._resize(width, height); - - me._resizeBeforeDraw = null; + if (this._resizeBeforeDraw) { + var _this$_resizeBeforeDr = this._resizeBeforeDraw, + width = _this$_resizeBeforeDr.width, + height = _this$_resizeBeforeDr.height; + this._resize(width, height); + this._resizeBeforeDraw = null; } - - me.clear(); - - if (me.width <= 0 || me.height <= 0) { + this.clear(); + if (this.width <= 0 || this.height <= 0) { return; } - - if (me.notifyPlugins('beforeDraw', { + if (this.notifyPlugins('beforeDraw', { cancelable: true }) === false) { return; } - - var layers = me._layers; - + var layers = this._layers; for (i = 0; i < layers.length && layers[i].z <= 0; ++i) { - layers[i].draw(me.chartArea); + layers[i].draw(this.chartArea); } - - me._drawDatasets(); - + this._drawDatasets(); for (; i < layers.length; ++i) { - layers[i].draw(me.chartArea); + layers[i].draw(this.chartArea); } - - me.notifyPlugins('afterDraw'); + this.notifyPlugins('afterDraw'); } }, { key: "_getSortedDatasetMetas", value: function _getSortedDatasetMetas(filterVisible) { - var me = this; - var metasets = me._sortedMetasets; + var metasets = this._sortedMetasets; var result = []; var i, ilen; - for (i = 0, ilen = metasets.length; i < ilen; ++i) { var meta = metasets[i]; - if (!filterVisible || meta.visible) { result.push(meta); } } - return result; } }, { key: "getSortedVisibleDatasetMetas", value: function getSortedVisibleDatasetMetas() { return this._getSortedDatasetMetas(true); } }, { key: "_drawDatasets", value: function _drawDatasets() { - var me = this; - - if (me.notifyPlugins('beforeDatasetsDraw', { + if (this.notifyPlugins('beforeDatasetsDraw', { cancelable: true }) === false) { return; } - - var metasets = me.getSortedVisibleDatasetMetas(); - + var metasets = this.getSortedVisibleDatasetMetas(); for (var i = metasets.length - 1; i >= 0; --i) { - me._drawDataset(metasets[i]); + this._drawDataset(metasets[i]); } - - me.notifyPlugins('afterDatasetsDraw'); + this.notifyPlugins('afterDatasetsDraw'); } }, { key: "_drawDataset", value: function _drawDataset(meta) { - var me = this; - var ctx = me.ctx; + var ctx = this.ctx; var clip = meta._clip; - var area = me.chartArea; + var useClip = !clip.disabled; + var area = getDatasetArea(meta) || this.chartArea; var args = { meta: meta, index: meta.index, cancelable: true }; - - if (me.notifyPlugins('beforeDatasetDraw', args) === false) { + if (this.notifyPlugins('beforeDatasetDraw', args) === false) { return; } - - clipArea(ctx, { - left: clip.left === false ? 0 : area.left - clip.left, - right: clip.right === false ? me.width : area.right + clip.right, - top: clip.top === false ? 0 : area.top - clip.top, - bottom: clip.bottom === false ? me.height : area.bottom + clip.bottom - }); + if (useClip) { + clipArea(ctx, { + left: clip.left === false ? 0 : area.left - clip.left, + right: clip.right === false ? this.width : area.right + clip.right, + top: clip.top === false ? 0 : area.top - clip.top, + bottom: clip.bottom === false ? this.height : area.bottom + clip.bottom + }); + } meta.controller.draw(); - unclipArea(ctx); + if (useClip) { + unclipArea(ctx); + } args.cancelable = false; - me.notifyPlugins('afterDatasetDraw', args); + this.notifyPlugins('afterDatasetDraw', args); } }, { + key: "isPointInArea", + value: function isPointInArea(point) { + return _isPointInArea(point, this.chartArea, this._minPadding); + } + }, { key: "getElementsAtEventForMode", value: function getElementsAtEventForMode(e, mode, options, useFinalPosition) { var method = Interaction.modes[mode]; - if (typeof method === 'function') { return method(this, e, options, useFinalPosition); } - return []; } }, { key: "getDatasetMeta", value: function getDatasetMeta(datasetIndex) { - var me = this; - var dataset = me.data.datasets[datasetIndex]; - var metasets = me._metasets; + var dataset = this.data.datasets[datasetIndex]; + var metasets = this._metasets; var meta = metasets.filter(function (x) { return x && x._dataset === dataset; }).pop(); - if (!meta) { - meta = metasets[datasetIndex] = { + meta = { type: null, data: [], dataset: null, controller: null, hidden: null, @@ -11083,36 +10975,34 @@ index: datasetIndex, _dataset: dataset, _parsed: [], _sorted: false }; + metasets.push(meta); } - return meta; } }, { key: "getContext", value: function getContext() { - return this.$context || (this.$context = { + return this.$context || (this.$context = createContext(null, { chart: this, type: 'chart' - }); + })); } }, { key: "getVisibleDatasetCount", value: function getVisibleDatasetCount() { return this.getSortedVisibleDatasetMetas().length; } }, { key: "isDatasetVisible", value: function isDatasetVisible(datasetIndex) { var dataset = this.data.datasets[datasetIndex]; - if (!dataset) { return false; } - var meta = this.getDatasetMeta(datasetIndex); return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden; } }, { key: "setDatasetVisibility", @@ -11129,179 +11019,180 @@ key: "getDataVisibility", value: function getDataVisibility(index) { return !this._hiddenIndices[index]; } }, { - key: "_updateDatasetVisibility", - value: function _updateDatasetVisibility(datasetIndex, visible) { - var me = this; + key: "_updateVisibility", + value: function _updateVisibility(datasetIndex, dataIndex, visible) { var mode = visible ? 'show' : 'hide'; - var meta = me.getDatasetMeta(datasetIndex); - + var meta = this.getDatasetMeta(datasetIndex); var anims = meta.controller._resolveAnimations(undefined, mode); - - me.setDatasetVisibility(datasetIndex, visible); - anims.update(meta, { - visible: visible - }); - me.update(function (ctx) { - return ctx.datasetIndex === datasetIndex ? mode : undefined; - }); + if (defined(dataIndex)) { + meta.data[dataIndex].hidden = !visible; + this.update(); + } else { + this.setDatasetVisibility(datasetIndex, visible); + anims.update(meta, { + visible: visible + }); + this.update(function (ctx) { + return ctx.datasetIndex === datasetIndex ? mode : undefined; + }); + } } }, { key: "hide", - value: function hide(datasetIndex) { - this._updateDatasetVisibility(datasetIndex, false); + value: function hide(datasetIndex, dataIndex) { + this._updateVisibility(datasetIndex, dataIndex, false); } }, { key: "show", - value: function show(datasetIndex) { - this._updateDatasetVisibility(datasetIndex, true); + value: function show(datasetIndex, dataIndex) { + this._updateVisibility(datasetIndex, dataIndex, true); } }, { key: "_destroyDatasetMeta", value: function _destroyDatasetMeta(datasetIndex) { - var me = this; - var meta = me._metasets && me._metasets[datasetIndex]; - + var meta = this._metasets[datasetIndex]; if (meta && meta.controller) { meta.controller._destroy(); - - delete me._metasets[datasetIndex]; } + delete this._metasets[datasetIndex]; } }, { - key: "destroy", - value: function destroy() { - var me = this; - var canvas = me.canvas, - ctx = me.ctx; + key: "_stop", + value: function _stop() { var i, ilen; - me.stop(); - animator.remove(me); - - for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { - me._destroyDatasetMeta(i); + this.stop(); + animator.remove(this); + for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { + this._destroyDatasetMeta(i); } - - me.config.clearCache(); - + } + }, { + key: "destroy", + value: function destroy() { + this.notifyPlugins('beforeDestroy'); + var canvas = this.canvas, + ctx = this.ctx; + this._stop(); + this.config.clearCache(); if (canvas) { - me.unbindEvents(); + this.unbindEvents(); clearCanvas(canvas, ctx); - me.platform.releaseContext(ctx); - me.canvas = null; - me.ctx = null; + this.platform.releaseContext(ctx); + this.canvas = null; + this.ctx = null; } - - me.notifyPlugins('destroy'); - delete instances[me.id]; + delete instances[this.id]; + this.notifyPlugins('afterDestroy'); } }, { key: "toBase64Image", value: function toBase64Image() { var _this$canvas; - return (_this$canvas = this.canvas).toDataURL.apply(_this$canvas, arguments); } }, { key: "bindEvents", value: function bindEvents() { - var me = this; - var listeners = me._listeners; - var platform = me.platform; - + this.bindUserEvents(); + if (this.options.responsive) { + this.bindResponsiveEvents(); + } else { + this.attached = true; + } + } + }, { + key: "bindUserEvents", + value: function bindUserEvents() { + var _this18 = this; + var listeners = this._listeners; + var platform = this.platform; var _add = function _add(type, listener) { - platform.addEventListener(me, type, listener); + platform.addEventListener(_this18, type, listener); listeners[type] = listener; }; - - var _remove = function _remove(type, listener) { - if (listeners[type]) { - platform.removeEventListener(me, type, listener); - delete listeners[type]; - } - }; - var listener = function listener(e, x, y) { e.offsetX = x; e.offsetY = y; - - me._eventHandler(e); + _this18._eventHandler(e); }; - - each(me.options.events, function (type) { + each(this.options.events, function (type) { return _add(type, listener); }); - - if (me.options.responsive) { - listener = function listener(width, height) { - if (me.canvas) { - me.resize(width, height); - } - }; - - var detached; - - var attached = function attached() { - _remove('attach', attached); - - me.attached = true; - me.resize(); - - _add('resize', listener); - - _add('detach', detached); - }; - - detached = function detached() { - me.attached = false; - - _remove('resize', listener); - - _add('attach', attached); - }; - - if (platform.isAttached(me.canvas)) { - attached(); - } else { - detached(); + } + }, { + key: "bindResponsiveEvents", + value: function bindResponsiveEvents() { + var _this19 = this; + if (!this._responsiveListeners) { + this._responsiveListeners = {}; + } + var listeners = this._responsiveListeners; + var platform = this.platform; + var _add = function _add(type, listener) { + platform.addEventListener(_this19, type, listener); + listeners[type] = listener; + }; + var _remove = function _remove(type, listener) { + if (listeners[type]) { + platform.removeEventListener(_this19, type, listener); + delete listeners[type]; } + }; + var listener = function listener(width, height) { + if (_this19.canvas) { + _this19.resize(width, height); + } + }; + var detached; + var attached = function attached() { + _remove('attach', attached); + _this19.attached = true; + _this19.resize(); + _add('resize', listener); + _add('detach', detached); + }; + detached = function detached() { + _this19.attached = false; + _remove('resize', listener); + _this19._stop(); + _this19._resize(0, 0); + _add('attach', attached); + }; + if (platform.isAttached(this.canvas)) { + attached(); } else { - me.attached = true; + detached(); } } }, { key: "unbindEvents", value: function unbindEvents() { - var me = this; - var listeners = me._listeners; - - if (!listeners) { - return; - } - - delete me._listeners; - each(listeners, function (listener, type) { - me.platform.removeEventListener(me, type, listener); + var _this20 = this; + each(this._listeners, function (listener, type) { + _this20.platform.removeEventListener(_this20, type, listener); }); + this._listeners = {}; + each(this._responsiveListeners, function (listener, type) { + _this20.platform.removeEventListener(_this20, type, listener); + }); + this._responsiveListeners = undefined; } }, { key: "updateHoverStyle", value: function updateHoverStyle(items, mode, enabled) { var prefix = enabled ? 'set' : 'remove'; var meta, item, i, ilen; - if (mode === 'dataset') { meta = this.getDatasetMeta(items[0].datasetIndex); meta.controller['_' + prefix + 'DatasetHoverStyle'](); } - for (i = 0, ilen = items.length; i < ilen; ++i) { item = items[i]; var controller = item && this.getDatasetMeta(item.datasetIndex).controller; - if (controller) { controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index); } } } @@ -11311,374 +11202,418 @@ return this._active || []; } }, { key: "setActiveElements", value: function setActiveElements(activeElements) { - var me = this; - var lastActive = me._active || []; - var active = activeElements.map(function (_ref) { - var datasetIndex = _ref.datasetIndex, - index = _ref.index; - var meta = me.getDatasetMeta(datasetIndex); - + var _this21 = this; + var lastActive = this._active || []; + var active = activeElements.map(function (_ref4) { + var datasetIndex = _ref4.datasetIndex, + index = _ref4.index; + var meta = _this21.getDatasetMeta(datasetIndex); if (!meta) { throw new Error('No dataset found at index ' + datasetIndex); } - return { datasetIndex: datasetIndex, element: meta.data[index], index: index }; }); var changed = !_elementsEqual(active, lastActive); - if (changed) { - me._active = active; - - me._updateHoverStyles(active, lastActive); + this._active = active; + this._lastEvent = null; + this._updateHoverStyles(active, lastActive); } } }, { key: "notifyPlugins", - value: function notifyPlugins(hook, args) { - return this._plugins.notify(this, hook, args); + value: function notifyPlugins(hook, args, filter) { + return this._plugins.notify(this, hook, args, filter); } }, { + key: "isPluginEnabled", + value: function isPluginEnabled(pluginId) { + return this._plugins._cache.filter(function (p) { + return p.plugin.id === pluginId; + }).length === 1; + } + }, { key: "_updateHoverStyles", value: function _updateHoverStyles(active, lastActive, replay) { - var me = this; - var hoverOptions = me.options.hover; - + var hoverOptions = this.options.hover; var diff = function diff(a, b) { return a.filter(function (x) { return !b.some(function (y) { return x.datasetIndex === y.datasetIndex && x.index === y.index; }); }); }; - var deactivated = diff(lastActive, active); var activated = replay ? active : diff(active, lastActive); - if (deactivated.length) { - me.updateHoverStyle(deactivated, hoverOptions.mode, false); + this.updateHoverStyle(deactivated, hoverOptions.mode, false); } - if (activated.length && hoverOptions.mode) { - me.updateHoverStyle(activated, hoverOptions.mode, true); + this.updateHoverStyle(activated, hoverOptions.mode, true); } } }, { key: "_eventHandler", value: function _eventHandler(e, replay) { - var me = this; + var _this22 = this; var args = { event: e, replay: replay, - cancelable: true + cancelable: true, + inChartArea: this.isPointInArea(e) }; - - if (me.notifyPlugins('beforeEvent', args) === false) { + var eventFilter = function eventFilter(plugin) { + return (plugin.options.events || _this22.options.events).includes(e["native"].type); + }; + if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) { return; } - - var changed = me._handleEvent(e, replay); - + var changed = this._handleEvent(e, replay, args.inChartArea); args.cancelable = false; - me.notifyPlugins('afterEvent', args); - + this.notifyPlugins('afterEvent', args, eventFilter); if (changed || args.changed) { - me.render(); + this.render(); } - - return me; + return this; } }, { key: "_handleEvent", - value: function _handleEvent(e, replay) { - var me = this; - var _me$_active = me._active, - lastActive = _me$_active === void 0 ? [] : _me$_active, - options = me.options; - var hoverOptions = options.hover; + value: function _handleEvent(e, replay, inChartArea) { + var _this$_active = this._active, + lastActive = _this$_active === void 0 ? [] : _this$_active, + options = this.options; var useFinalPosition = replay; - var active = []; - var changed = false; - var lastEvent = null; - - if (e.type !== 'mouseout') { - active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition); - lastEvent = e.type === 'click' ? me._lastEvent : e; - } - - me._lastEvent = null; - callback(options.onHover, [e, active, me], me); - - if (e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu') { - if (_isPointInArea(e, me.chartArea, me._minPadding)) { - callback(options.onClick, [e, active, me], me); + var active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition); + var isClick = _isClickEvent(e); + var lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick); + if (inChartArea) { + this._lastEvent = null; + callback(options.onHover, [e, active, this], this); + if (isClick) { + callback(options.onClick, [e, active, this], this); } } - - changed = !_elementsEqual(active, lastActive); - + var changed = !_elementsEqual(active, lastActive); if (changed || replay) { - me._active = active; - - me._updateHoverStyles(active, lastActive, replay); + this._active = active; + this._updateHoverStyles(active, lastActive, replay); } - - me._lastEvent = lastEvent; + this._lastEvent = lastEvent; return changed; } - }]); - - return Chart; - }(); - - var invalidatePlugins = function invalidatePlugins() { - return each(Chart.instances, function (chart) { - return chart._plugins.invalidate(); - }); - }; - - var enumerable = true; - Object.defineProperties(Chart, { - defaults: { - enumerable: enumerable, - value: defaults - }, - instances: { - enumerable: enumerable, - value: instances - }, - overrides: { - enumerable: enumerable, - value: overrides - }, - registry: { - enumerable: enumerable, - value: registry - }, - version: { - enumerable: enumerable, - value: version - }, - getChart: { - enumerable: enumerable, - value: getChart - }, - register: { - enumerable: enumerable, - value: function value() { + }, { + key: "_getActiveElements", + value: function _getActiveElements(e, lastActive, inChartArea, useFinalPosition) { + if (e.type === 'mouseout') { + return []; + } + if (!inChartArea) { + return lastActive; + } + var hoverOptions = this.options.hover; + return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition); + } + }], [{ + key: "register", + value: function register() { registry.add.apply(registry, arguments); invalidatePlugins(); } - }, - unregister: { - enumerable: enumerable, - value: function value() { + }, { + key: "unregister", + value: function unregister() { registry.remove.apply(registry, arguments); invalidatePlugins(); } - } - }); - - function clipArc(ctx, element) { + }]); + return Chart; + }(); + _defineProperty$w(Chart$1, "defaults", defaults); + _defineProperty$w(Chart$1, "instances", instances); + _defineProperty$w(Chart$1, "overrides", overrides); + _defineProperty$w(Chart$1, "registry", registry); + _defineProperty$w(Chart$1, "version", version); + _defineProperty$w(Chart$1, "getChart", getChart); + function invalidatePlugins() { + return each(Chart$1.instances, function (chart) { + return chart._plugins.invalidate(); + }); + } + function clipArc(ctx, element, endAngle) { var startAngle = element.startAngle, - endAngle = element.endAngle, - pixelMargin = element.pixelMargin, - x = element.x, - y = element.y, - outerRadius = element.outerRadius, - innerRadius = element.innerRadius; + pixelMargin = element.pixelMargin, + x = element.x, + y = element.y, + outerRadius = element.outerRadius, + innerRadius = element.innerRadius; var angleMargin = pixelMargin / outerRadius; + // Draw an inner border by clipping the arc and drawing a double-width border + // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders ctx.beginPath(); ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin); - if (innerRadius > pixelMargin) { angleMargin = pixelMargin / innerRadius; ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true); } else { ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI); } - ctx.closePath(); ctx.clip(); } - - function pathArc(ctx, element) { + function toRadiusCorners(value) { + return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']); + } + /** + * Parse border radius from the provided options + */ + function parseBorderRadius$1(arc, innerRadius, outerRadius, angleDelta) { + var o = toRadiusCorners(arc.options.borderRadius); + var halfThickness = (outerRadius - innerRadius) / 2; + var innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2); + // Outer limits are complicated. We want to compute the available angular distance at + // a radius of outerRadius - borderRadius because for small angular distances, this term limits. + // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners. + // + // If the borderRadius is large, that value can become negative. + // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius + // we know that the thickness term will dominate and compute the limits at that point + var computeOuterLimit = function computeOuterLimit(val) { + var outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2; + return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit)); + }; + return { + outerStart: computeOuterLimit(o.outerStart), + outerEnd: computeOuterLimit(o.outerEnd), + innerStart: _limitValue(o.innerStart, 0, innerLimit), + innerEnd: _limitValue(o.innerEnd, 0, innerLimit) + }; + } + /** + * Convert (r, 𝜃) to (x, y) + */ + function rThetaToXY(r, theta, x, y) { + return { + x: x + r * Math.cos(theta), + y: y + r * Math.sin(theta) + }; + } + /** + * Path the arc, respecting border radius by separating into left and right halves. + * + * Start End + * + * 1--->a--->2 Outer + * / \ + * 8 3 + * | | + * | | + * 7 4 + * \ / + * 6<---b<---5 Inner + */ + function pathArc(ctx, element, offset, spacing, end, circular) { var x = element.x, - y = element.y, - startAngle = element.startAngle, - endAngle = element.endAngle, - pixelMargin = element.pixelMargin; - var outerRadius = Math.max(element.outerRadius - pixelMargin, 0); - var innerRadius = element.innerRadius + pixelMargin; + y = element.y, + start = element.startAngle, + pixelMargin = element.pixelMargin, + innerR = element.innerRadius; + var outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0); + var innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0; + var spacingOffset = 0; + var alpha = end - start; + if (spacing) { + // When spacing is present, it is the same for all items + // So we adjust the start and end angle of the arc such that + // the distance is the same as it would be without the spacing + var noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0; + var noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0; + var avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2; + var adjustedAngle = avNogSpacingRadius !== 0 ? alpha * avNogSpacingRadius / (avNogSpacingRadius + spacing) : alpha; + spacingOffset = (alpha - adjustedAngle) / 2; + } + var beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius; + var angleOffset = (alpha - beta) / 2; + var startAngle = start + angleOffset + spacingOffset; + var endAngle = end - angleOffset - spacingOffset; + var _parseBorderRadius$ = parseBorderRadius$1(element, innerRadius, outerRadius, endAngle - startAngle), + outerStart = _parseBorderRadius$.outerStart, + outerEnd = _parseBorderRadius$.outerEnd, + innerStart = _parseBorderRadius$.innerStart, + innerEnd = _parseBorderRadius$.innerEnd; + var outerStartAdjustedRadius = outerRadius - outerStart; + var outerEndAdjustedRadius = outerRadius - outerEnd; + var outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius; + var outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius; + var innerStartAdjustedRadius = innerRadius + innerStart; + var innerEndAdjustedRadius = innerRadius + innerEnd; + var innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius; + var innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius; ctx.beginPath(); - ctx.arc(x, y, outerRadius, startAngle, endAngle); - ctx.arc(x, y, innerRadius, endAngle, startAngle, true); + if (circular) { + // The first arc segments from point 1 to point a to point 2 + var outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2; + ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle); + ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle); + // The corner segment from point 2 to point 3 + if (outerEnd > 0) { + var pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y); + ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI); + } + // The line from point 3 to point 4 + var p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y); + ctx.lineTo(p4.x, p4.y); + // The corner segment from point 4 to point 5 + if (innerEnd > 0) { + var pCenter1 = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y); + ctx.arc(pCenter1.x, pCenter1.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI); + } + // The inner arc from point 5 to point b to point 6 + var innerMidAdjustedAngle = (endAngle - innerEnd / innerRadius + (startAngle + innerStart / innerRadius)) / 2; + ctx.arc(x, y, innerRadius, endAngle - innerEnd / innerRadius, innerMidAdjustedAngle, true); + ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + innerStart / innerRadius, true); + // The corner segment from point 6 to point 7 + if (innerStart > 0) { + var pCenter2 = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y); + ctx.arc(pCenter2.x, pCenter2.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI); + } + // The line from point 7 to point 8 + var p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y); + ctx.lineTo(p8.x, p8.y); + // The corner segment from point 8 to point 1 + if (outerStart > 0) { + var pCenter3 = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y); + ctx.arc(pCenter3.x, pCenter3.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle); + } + } else { + ctx.moveTo(x, y); + var outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x; + var outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y; + ctx.lineTo(outerStartX, outerStartY); + var outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x; + var outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y; + ctx.lineTo(outerEndX, outerEndY); + } ctx.closePath(); } - - function drawArc(ctx, element) { - if (element.fullCircles) { - element.endAngle = element.startAngle + TAU; - pathArc(ctx, element); - - for (var i = 0; i < element.fullCircles; ++i) { + function drawArc(ctx, element, offset, spacing, circular) { + var fullCircles = element.fullCircles, + startAngle = element.startAngle, + circumference = element.circumference; + var endAngle = element.endAngle; + if (fullCircles) { + pathArc(ctx, element, offset, spacing, endAngle, circular); + for (var i = 0; i < fullCircles; ++i) { ctx.fill(); } + if (!isNaN(circumference)) { + endAngle = startAngle + (circumference % TAU || TAU); + } } - - if (!isNaN(element.circumference)) { - element.endAngle = element.startAngle + element.circumference % TAU; - } - - pathArc(ctx, element); + pathArc(ctx, element, offset, spacing, endAngle, circular); ctx.fill(); + return endAngle; } - - function drawFullCircleBorders(ctx, element, inner) { - var x = element.x, - y = element.y, - startAngle = element.startAngle, - endAngle = element.endAngle, - pixelMargin = element.pixelMargin; - var outerRadius = Math.max(element.outerRadius - pixelMargin, 0); - var innerRadius = element.innerRadius + pixelMargin; - var i; - - if (inner) { - element.endAngle = element.startAngle + TAU; - clipArc(ctx, element); - element.endAngle = endAngle; - - if (element.endAngle === element.startAngle) { - element.endAngle += TAU; - element.fullCircles--; - } - } - - ctx.beginPath(); - ctx.arc(x, y, innerRadius, startAngle + TAU, startAngle, true); - - for (i = 0; i < element.fullCircles; ++i) { - ctx.stroke(); - } - - ctx.beginPath(); - ctx.arc(x, y, outerRadius, startAngle, startAngle + TAU); - - for (i = 0; i < element.fullCircles; ++i) { - ctx.stroke(); - } - } - - function drawBorder(ctx, element) { - var x = element.x, - y = element.y, - startAngle = element.startAngle, - endAngle = element.endAngle, - pixelMargin = element.pixelMargin, - options = element.options; - var outerRadius = element.outerRadius; - var innerRadius = element.innerRadius + pixelMargin; + function drawBorder(ctx, element, offset, spacing, circular) { + var fullCircles = element.fullCircles, + startAngle = element.startAngle, + circumference = element.circumference, + options = element.options; + var borderWidth = options.borderWidth, + borderJoinStyle = options.borderJoinStyle; var inner = options.borderAlign === 'inner'; - - if (!options.borderWidth) { + if (!borderWidth) { return; } - if (inner) { - ctx.lineWidth = options.borderWidth * 2; - ctx.lineJoin = 'round'; + ctx.lineWidth = borderWidth * 2; + ctx.lineJoin = borderJoinStyle || 'round'; } else { - ctx.lineWidth = options.borderWidth; - ctx.lineJoin = 'bevel'; + ctx.lineWidth = borderWidth; + ctx.lineJoin = borderJoinStyle || 'bevel'; } - - if (element.fullCircles) { - drawFullCircleBorders(ctx, element, inner); + var endAngle = element.endAngle; + if (fullCircles) { + pathArc(ctx, element, offset, spacing, endAngle, circular); + for (var i = 0; i < fullCircles; ++i) { + ctx.stroke(); + } + if (!isNaN(circumference)) { + endAngle = startAngle + (circumference % TAU || TAU); + } } - if (inner) { - clipArc(ctx, element); + clipArc(ctx, element, endAngle); } - - ctx.beginPath(); - ctx.arc(x, y, outerRadius, startAngle, endAngle); - ctx.arc(x, y, innerRadius, endAngle, startAngle, true); - ctx.closePath(); - ctx.stroke(); + if (!fullCircles) { + pathArc(ctx, element, offset, spacing, endAngle, circular); + ctx.stroke(); + } } - var ArcElement = /*#__PURE__*/function (_Element2) { - _inherits(ArcElement, _Element2); - - var _super12 = _createSuper(ArcElement); - + _inherits$w(ArcElement, _Element2); + var _super12 = _createSuper$w(ArcElement); function ArcElement(cfg) { - var _this6; - - _classCallCheck(this, ArcElement); - - _this6 = _super12.call(this); - _this6.options = undefined; - _this6.circumference = undefined; - _this6.startAngle = undefined; - _this6.endAngle = undefined; - _this6.innerRadius = undefined; - _this6.outerRadius = undefined; - _this6.pixelMargin = 0; - _this6.fullCircles = 0; - + var _this23; + _classCallCheck$x(this, ArcElement); + _this23 = _super12.call(this); + _this23.options = undefined; + _this23.circumference = undefined; + _this23.startAngle = undefined; + _this23.endAngle = undefined; + _this23.innerRadius = undefined; + _this23.outerRadius = undefined; + _this23.pixelMargin = 0; + _this23.fullCircles = 0; if (cfg) { - Object.assign(_assertThisInitialized(_this6), cfg); + Object.assign(_assertThisInitialized$w(_this23), cfg); } - - return _this6; + return _this23; } - - _createClass(ArcElement, [{ + _createClass$x(ArcElement, [{ key: "inRange", value: function inRange(chartX, chartY, useFinalPosition) { var point = this.getProps(['x', 'y'], useFinalPosition); - - var _getAngleFromPoint = getAngleFromPoint(point, { - x: chartX, - y: chartY - }), - angle = _getAngleFromPoint.angle, - distance = _getAngleFromPoint.distance; - + var _getAngleFromPoint2 = getAngleFromPoint(point, { + x: chartX, + y: chartY + }), + angle = _getAngleFromPoint2.angle, + distance = _getAngleFromPoint2.distance; var _this$getProps2 = this.getProps(['startAngle', 'endAngle', 'innerRadius', 'outerRadius', 'circumference'], useFinalPosition), - startAngle = _this$getProps2.startAngle, - endAngle = _this$getProps2.endAngle, - innerRadius = _this$getProps2.innerRadius, - outerRadius = _this$getProps2.outerRadius, - circumference = _this$getProps2.circumference; - - var betweenAngles = circumference >= TAU || _angleBetween(angle, startAngle, endAngle); - - var withinRadius = distance >= innerRadius && distance <= outerRadius; + startAngle = _this$getProps2.startAngle, + endAngle = _this$getProps2.endAngle, + innerRadius = _this$getProps2.innerRadius, + outerRadius = _this$getProps2.outerRadius, + circumference = _this$getProps2.circumference; + var rAdjust = this.options.spacing / 2; + var _circumference = valueOrDefault(circumference, endAngle - startAngle); + var betweenAngles = _circumference >= TAU || _angleBetween(angle, startAngle, endAngle); + var withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust); return betweenAngles && withinRadius; } }, { key: "getCenterPoint", value: function getCenterPoint(useFinalPosition) { - var _this$getProps3 = this.getProps(['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius'], useFinalPosition), - x = _this$getProps3.x, - y = _this$getProps3.y, - startAngle = _this$getProps3.startAngle, - endAngle = _this$getProps3.endAngle, - innerRadius = _this$getProps3.innerRadius, - outerRadius = _this$getProps3.outerRadius; - + var _this$getProps3 = this.getProps(['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius', 'circumference'], useFinalPosition), + x = _this$getProps3.x, + y = _this$getProps3.y, + startAngle = _this$getProps3.startAngle, + endAngle = _this$getProps3.endAngle, + innerRadius = _this$getProps3.innerRadius, + outerRadius = _this$getProps3.outerRadius; + var _this$options13 = this.options, + offset = _this$options13.offset, + spacing = _this$options13.spacing; var halfAngle = (startAngle + endAngle) / 2; - var halfRadius = (innerRadius + outerRadius) / 2; + var halfRadius = (innerRadius + outerRadius + spacing + offset) / 2; return { x: x + Math.cos(halfAngle) * halfRadius, y: y + Math.sin(halfAngle) * halfRadius }; } @@ -11688,301 +11623,281 @@ return this.getCenterPoint(useFinalPosition); } }, { key: "draw", value: function draw(ctx) { - var me = this; - var options = me.options; - var offset = options.offset || 0; - me.pixelMargin = options.borderAlign === 'inner' ? 0.33 : 0; - me.fullCircles = Math.floor(me.circumference / TAU); - - if (me.circumference === 0 || me.innerRadius < 0 || me.outerRadius < 0) { + var options = this.options, + circumference = this.circumference; + var offset = (options.offset || 0) / 4; + var spacing = (options.spacing || 0) / 2; + var circular = options.circular; + this.pixelMargin = options.borderAlign === 'inner' ? 0.33 : 0; + this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0; + if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) { return; } - ctx.save(); - - if (offset && me.circumference < TAU) { - var halfAngle = (me.startAngle + me.endAngle) / 2; - ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset); - } - + var halfAngle = (this.startAngle + this.endAngle) / 2; + ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset); + var fix = 1 - Math.sin(Math.min(PI, circumference || 0)); + var radiusOffset = offset * fix; ctx.fillStyle = options.backgroundColor; ctx.strokeStyle = options.borderColor; - drawArc(ctx, me); - drawBorder(ctx, me); + drawArc(ctx, this, radiusOffset, spacing, circular); + drawBorder(ctx, this, radiusOffset, spacing, circular); ctx.restore(); } }]); - return ArcElement; }(Element); - - ArcElement.id = 'arc'; - ArcElement.defaults = { + _defineProperty$w(ArcElement, "id", 'arc'); + _defineProperty$w(ArcElement, "defaults", { borderAlign: 'center', borderColor: '#fff', + borderJoinStyle: undefined, + borderRadius: 0, borderWidth: 2, offset: 0, - angle: undefined - }; - ArcElement.defaultRoutes = { + spacing: 0, + angle: undefined, + circular: true + }); + _defineProperty$w(ArcElement, "defaultRoutes", { backgroundColor: 'backgroundColor' - }; - - function setStyle(ctx, vm) { - ctx.lineCap = vm.borderCapStyle; - ctx.setLineDash(vm.borderDash); - ctx.lineDashOffset = vm.borderDashOffset; - ctx.lineJoin = vm.borderJoinStyle; - ctx.lineWidth = vm.borderWidth; - ctx.strokeStyle = vm.borderColor; + }); + function setStyle(ctx, options) { + var style = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : options; + ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle); + ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash)); + ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset); + ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle); + ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth); + ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor); } - function lineTo(ctx, previous, target) { ctx.lineTo(target.x, target.y); } - function getLineMethod(options) { if (options.stepped) { return _steppedLineTo; } - - if (options.tension) { + if (options.tension || options.cubicInterpolationMode === 'monotone') { return _bezierCurveTo; } - return lineTo; } - - function pathVars(points, segment, params) { - params = params || {}; + function pathVars(points, segment) { + var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var count = points.length; - var start = Math.max(params.start || 0, segment.start); - var end = Math.min(params.end || count - 1, segment.end); + var _params$start = params.start, + paramsStart = _params$start === void 0 ? 0 : _params$start, + _params$end = params.end, + paramsEnd = _params$end === void 0 ? count - 1 : _params$end; + var segmentStart = segment.start, + segmentEnd = segment.end; + var start = Math.max(paramsStart, segmentStart); + var end = Math.min(paramsEnd, segmentEnd); + var outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd; return { count: count, start: start, loop: segment.loop, - ilen: end < start ? count + end - start : end - start + ilen: end < start && !outside ? count + end - start : end - start }; } - function pathSegment(ctx, line, segment, params) { var points = line.points, - options = line.options; - + options = line.options; var _pathVars = pathVars(points, segment, params), - count = _pathVars.count, - start = _pathVars.start, - loop = _pathVars.loop, - ilen = _pathVars.ilen; - + count = _pathVars.count, + start = _pathVars.start, + loop = _pathVars.loop, + ilen = _pathVars.ilen; var lineMethod = getLineMethod(options); - - var _ref2 = params || {}, - _ref2$move = _ref2.move, - move = _ref2$move === void 0 ? true : _ref2$move, - reverse = _ref2.reverse; - + var _ref5 = params || {}, + _ref5$move = _ref5.move, + move = _ref5$move === void 0 ? true : _ref5$move, + reverse = _ref5.reverse; var i, point, prev; - for (i = 0; i <= ilen; ++i) { point = points[(start + (reverse ? ilen - i : i)) % count]; - if (point.skip) { continue; } else if (move) { ctx.moveTo(point.x, point.y); move = false; } else { lineMethod(ctx, prev, point, reverse, options.stepped); } - prev = point; } - if (loop) { point = points[(start + (reverse ? ilen : 0)) % count]; lineMethod(ctx, prev, point, reverse, options.stepped); } - return !!loop; } - function fastPathSegment(ctx, line, segment, params) { var points = line.points; - var _pathVars2 = pathVars(points, segment, params), - count = _pathVars2.count, - start = _pathVars2.start, - ilen = _pathVars2.ilen; - - var _ref3 = params || {}, - _ref3$move = _ref3.move, - move = _ref3$move === void 0 ? true : _ref3$move, - reverse = _ref3.reverse; - + count = _pathVars2.count, + start = _pathVars2.start, + ilen = _pathVars2.ilen; + var _ref6 = params || {}, + _ref6$move = _ref6.move, + move = _ref6$move === void 0 ? true : _ref6$move, + reverse = _ref6.reverse; var avgX = 0; var countX = 0; var i, point, prevX, minY, maxY, lastY; - var pointIndex = function pointIndex(index) { return (start + (reverse ? ilen - index : index)) % count; }; - var drawX = function drawX() { if (minY !== maxY) { ctx.lineTo(avgX, maxY); ctx.lineTo(avgX, minY); ctx.lineTo(avgX, lastY); } }; - if (move) { point = points[pointIndex(0)]; ctx.moveTo(point.x, point.y); } - for (i = 0; i <= ilen; ++i) { point = points[pointIndex(i)]; - if (point.skip) { continue; } - var x = point.x; var y = point.y; var truncX = x | 0; - if (truncX === prevX) { if (y < minY) { minY = y; } else if (y > maxY) { maxY = y; } - avgX = (countX * avgX + x) / ++countX; } else { drawX(); ctx.lineTo(x, y); prevX = truncX; countX = 0; minY = maxY = y; } - lastY = y; } - drawX(); } - function _getSegmentMethod(line) { var opts = line.options; var borderDash = opts.borderDash && opts.borderDash.length; - var useFastPath = !line._decimated && !line._loop && !opts.tension && !opts.stepped && !borderDash; + var useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash; return useFastPath ? fastPathSegment : pathSegment; } - function _getInterpolationMethod(options) { if (options.stepped) { return _steppedInterpolation; } - - if (options.tension) { + if (options.tension || options.cubicInterpolationMode === 'monotone') { return _bezierInterpolation; } - return _pointInLine; } - function strokePathWithCache(ctx, line, start, count) { var path = line._path; - if (!path) { path = line._path = new Path2D(); - if (line.path(path, start, count)) { path.closePath(); } } - + setStyle(ctx, line.options); ctx.stroke(path); } - function strokePathDirect(ctx, line, start, count) { - ctx.beginPath(); - - if (line.path(ctx, start, count)) { - ctx.closePath(); + var segments = line.segments, + options = line.options; + var segmentMethod = _getSegmentMethod(line); + var _iterator16 = _createForOfIteratorHelper$1(segments), + _step16; + try { + for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) { + var segment = _step16.value; + setStyle(ctx, options, segment.style); + ctx.beginPath(); + if (segmentMethod(ctx, line, segment, { + start: start, + end: start + count - 1 + })) { + ctx.closePath(); + } + ctx.stroke(); + } + } catch (err) { + _iterator16.e(err); + } finally { + _iterator16.f(); } - - ctx.stroke(); } - var usePath2D = typeof Path2D === 'function'; - var strokePath = usePath2D ? strokePathWithCache : strokePathDirect; - + function _draw(ctx, line, start, count) { + if (usePath2D && !line.options.segment) { + strokePathWithCache(ctx, line, start, count); + } else { + strokePathDirect(ctx, line, start, count); + } + } var LineElement = /*#__PURE__*/function (_Element3) { - _inherits(LineElement, _Element3); - - var _super13 = _createSuper(LineElement); - + _inherits$w(LineElement, _Element3); + var _super13 = _createSuper$w(LineElement); function LineElement(cfg) { - var _this7; - - _classCallCheck(this, LineElement); - - _this7 = _super13.call(this); - _this7.animated = true; - _this7.options = undefined; - _this7._loop = undefined; - _this7._fullLoop = undefined; - _this7._path = undefined; - _this7._points = undefined; - _this7._segments = undefined; - _this7._decimated = false; - _this7._pointsUpdated = false; - + var _this24; + _classCallCheck$x(this, LineElement); + _this24 = _super13.call(this); + _this24.animated = true; + _this24.options = undefined; + _this24._chart = undefined; + _this24._loop = undefined; + _this24._fullLoop = undefined; + _this24._path = undefined; + _this24._points = undefined; + _this24._segments = undefined; + _this24._decimated = false; + _this24._pointsUpdated = false; + _this24._datasetIndex = undefined; if (cfg) { - Object.assign(_assertThisInitialized(_this7), cfg); + Object.assign(_assertThisInitialized$w(_this24), cfg); } - - return _this7; + return _this24; } - - _createClass(LineElement, [{ + _createClass$x(LineElement, [{ key: "updateControlPoints", - value: function updateControlPoints(chartArea) { - var me = this; - var options = me.options; - - if (options.tension && !options.stepped && !me._pointsUpdated) { - var loop = options.spanGaps ? me._loop : me._fullLoop; - - _updateBezierControlPoints(me._points, options, chartArea, loop); - - me._pointsUpdated = true; + value: function updateControlPoints(chartArea, indexAxis) { + var options = this.options; + if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) { + var loop = options.spanGaps ? this._loop : this._fullLoop; + _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis); + this._pointsUpdated = true; } } }, { key: "points", get: function get() { return this._points; }, set: function set(points) { - var me = this; - me._points = points; - delete me._segments; - delete me._path; - me._pointsUpdated = false; + this._points = points; + delete this._segments; + delete this._path; + this._pointsUpdated = false; } }, { key: "segments", get: function get() { - return this._segments || (this._segments = _computeSegments(this)); + return this._segments || (this._segments = _computeSegments(this, this.options.segment)); } }, { key: "first", value: function first() { var segments = this.segments; @@ -11998,110 +11913,92 @@ return count && points[segments[count - 1].end]; } }, { key: "interpolate", value: function interpolate(point, property) { - var me = this; - var options = me.options; + var options = this.options; var value = point[property]; - var points = me.points; - - var segments = _boundSegments(me, { + var points = this.points; + var segments = _boundSegments(this, { property: property, start: value, end: value }); - if (!segments.length) { return; } - var result = []; - var _interpolate = _getInterpolationMethod(options); - var i, ilen; - for (i = 0, ilen = segments.length; i < ilen; ++i) { var _segments$i = segments[i], - start = _segments$i.start, - end = _segments$i.end; + start = _segments$i.start, + end = _segments$i.end; var p1 = points[start]; var p2 = points[end]; - if (p1 === p2) { result.push(p1); continue; } - var t = Math.abs((value - p1[property]) / (p2[property] - p1[property])); - var interpolated = _interpolate(p1, p2, t, options.stepped); - interpolated[property] = point[property]; result.push(interpolated); } - return result.length === 1 ? result[0] : result; } }, { key: "pathSegment", value: function pathSegment(ctx, segment, params) { var segmentMethod = _getSegmentMethod(this); - return segmentMethod(ctx, this, segment, params); } }, { key: "path", value: function path(ctx, start, count) { - var me = this; - var segments = me.segments; - var ilen = segments.length; - - var segmentMethod = _getSegmentMethod(me); - - var loop = me._loop; + var segments = this.segments; + var segmentMethod = _getSegmentMethod(this); + var loop = this._loop; start = start || 0; - count = count || me.points.length - start; - - for (var i = 0; i < ilen; ++i) { - loop &= segmentMethod(ctx, me, segments[i], { - start: start, - end: start + count - 1 - }); + count = count || this.points.length - start; + var _iterator17 = _createForOfIteratorHelper$1(segments), + _step17; + try { + for (_iterator17.s(); !(_step17 = _iterator17.n()).done;) { + var segment = _step17.value; + loop &= segmentMethod(ctx, this, segment, { + start: start, + end: start + count - 1 + }); + } + } catch (err) { + _iterator17.e(err); + } finally { + _iterator17.f(); } - return !!loop; } }, { key: "draw", value: function draw(ctx, chartArea, start, count) { - var me = this; - var options = me.options || {}; - var points = me.points || []; - - if (!points.length || !options.borderWidth) { - return; + var options = this.options || {}; + var points = this.points || []; + if (points.length && options.borderWidth) { + ctx.save(); + _draw(ctx, this, start, count); + ctx.restore(); } - - ctx.save(); - setStyle(ctx, options); - strokePath(ctx, me, start, count); - ctx.restore(); - - if (me.animated) { - me._pointsUpdated = false; - me._path = undefined; + if (this.animated) { + this._pointsUpdated = false; + this._path = undefined; } } }]); - return LineElement; }(Element); - - LineElement.id = 'line'; - LineElement.defaults = { + _defineProperty$w(LineElement, "id", 'line'); + _defineProperty$w(LineElement, "defaults", { borderCapStyle: 'butt', borderDash: [], borderDashOffset: 0, borderJoinStyle: 'miter', borderWidth: 3, @@ -12109,62 +12006,58 @@ cubicInterpolationMode: 'default', fill: false, spanGaps: false, stepped: false, tension: 0 - }; - LineElement.defaultRoutes = { + }); + _defineProperty$w(LineElement, "defaultRoutes", { backgroundColor: 'backgroundColor', borderColor: 'borderColor' - }; - LineElement.descriptors = { + }); + _defineProperty$w(LineElement, "descriptors", { _scriptable: true, _indexable: function _indexable(name) { return name !== 'borderDash' && name !== 'fill'; } - }; - + }); function inRange$1(el, pos, axis, useFinalPosition) { var options = el.options; - var _el$getProps = el.getProps([axis], useFinalPosition), - value = _el$getProps[axis]; - + value = _el$getProps[axis]; return Math.abs(pos - value) < options.radius + options.hitRadius; } - var PointElement = /*#__PURE__*/function (_Element4) { - _inherits(PointElement, _Element4); + _inherits$w(PointElement, _Element4); + var _super14 = _createSuper$w(PointElement); + /** + * @type {any} + */ - var _super14 = _createSuper(PointElement); + /** + * @type {any} + */ function PointElement(cfg) { - var _this8; - - _classCallCheck(this, PointElement); - - _this8 = _super14.call(this); - _this8.options = undefined; - _this8.skip = undefined; - _this8.stop = undefined; - + var _this25; + _classCallCheck$x(this, PointElement); + _this25 = _super14.call(this); + _this25.options = undefined; + _this25.parsed = undefined; + _this25.skip = undefined; + _this25.stop = undefined; if (cfg) { - Object.assign(_assertThisInitialized(_this8), cfg); + Object.assign(_assertThisInitialized$w(_this25), cfg); } - - return _this8; + return _this25; } - - _createClass(PointElement, [{ + _createClass$x(PointElement, [{ key: "inRange", value: function inRange(mouseX, mouseY, useFinalPosition) { var options = this.options; - var _this$getProps4 = this.getProps(['x', 'y'], useFinalPosition), - x = _this$getProps4.x, - y = _this$getProps4.y; - + x = _this$getProps4.x, + y = _this$getProps4.y; return Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2) < Math.pow(options.hitRadius + options.radius, 2); } }, { key: "inXRange", value: function inXRange(mouseX, useFinalPosition) { @@ -12177,13 +12070,12 @@ } }, { key: "getCenterPoint", value: function getCenterPoint(useFinalPosition) { var _this$getProps5 = this.getProps(['x', 'y'], useFinalPosition), - x = _this$getProps5.x, - y = _this$getProps5.y; - + x = _this$getProps5.x, + y = _this$getProps5.y; return { x: x, y: y }; } @@ -12196,59 +12088,52 @@ var borderWidth = radius && options.borderWidth || 0; return (radius + borderWidth) * 2; } }, { key: "draw", - value: function draw(ctx) { - var me = this; - var options = me.options; - - if (me.skip || options.radius < 0.1) { + value: function draw(ctx, area) { + var options = this.options; + if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) { return; } - ctx.strokeStyle = options.borderColor; ctx.lineWidth = options.borderWidth; ctx.fillStyle = options.backgroundColor; - drawPoint(ctx, options, me.x, me.y); + drawPoint(ctx, options, this.x, this.y); } }, { key: "getRange", value: function getRange() { var options = this.options || {}; + // @ts-expect-error Fallbacks should never be hit in practice return options.radius + options.hitRadius; } }]); - return PointElement; }(Element); - - PointElement.id = 'point'; - PointElement.defaults = { + _defineProperty$w(PointElement, "id", 'point'); + _defineProperty$w(PointElement, "defaults", { borderWidth: 1, hitRadius: 1, hoverBorderWidth: 1, hoverRadius: 4, pointStyle: 'circle', radius: 3, rotation: 0 - }; - PointElement.defaultRoutes = { + }); + _defineProperty$w(PointElement, "defaultRoutes", { backgroundColor: 'backgroundColor', borderColor: 'borderColor' - }; - + }); function getBarBounds(bar, useFinalPosition) { var _bar$getProps = bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition), - x = _bar$getProps.x, - y = _bar$getProps.y, - base = _bar$getProps.base, - width = _bar$getProps.width, - height = _bar$getProps.height; - + x = _bar$getProps.x, + y = _bar$getProps.y, + base = _bar$getProps.base, + width = _bar$getProps.width, + height = _bar$getProps.height; var left, right, top, bottom, half; - if (bar.horizontal) { half = height / 2; left = Math.min(x, base); right = Math.max(x, base); top = y - half; @@ -12258,80 +12143,46 @@ left = x - half; right = x + half; top = Math.min(y, base); bottom = Math.max(y, base); } - return { left: left, top: top, right: right, bottom: bottom }; } - - function parseBorderSkipped(bar) { - var edge = bar.options.borderSkipped; - var res = {}; - - if (!edge) { - return res; - } - - edge = bar.horizontal ? parseEdge(edge, 'left', 'right', bar.base > bar.x) : parseEdge(edge, 'bottom', 'top', bar.base < bar.y); - res[edge] = true; - return res; - } - - function parseEdge(edge, a, b, reverse) { - if (reverse) { - edge = swap(edge, a, b); - edge = startEnd(edge, b, a); - } else { - edge = startEnd(edge, a, b); - } - - return edge; - } - - function swap(orig, v1, v2) { - return orig === v1 ? v2 : orig === v2 ? v1 : orig; - } - - function startEnd(v, start, end) { - return v === 'start' ? start : v === 'end' ? end : v; - } - function skipOrLimit(skip, value, min, max) { - return skip ? 0 : Math.max(Math.min(value, max), min); + return skip ? 0 : _limitValue(value, min, max); } - function parseBorderWidth(bar, maxW, maxH) { var value = bar.options.borderWidth; - var skip = parseBorderSkipped(bar); + var skip = bar.borderSkipped; var o = toTRBL(value); return { t: skipOrLimit(skip.top, o.top, 0, maxH), r: skipOrLimit(skip.right, o.right, 0, maxW), b: skipOrLimit(skip.bottom, o.bottom, 0, maxH), l: skipOrLimit(skip.left, o.left, 0, maxW) }; } - function parseBorderRadius(bar, maxW, maxH) { + var _bar$getProps2 = bar.getProps(['enableBorderRadius']), + enableBorderRadius = _bar$getProps2.enableBorderRadius; var value = bar.options.borderRadius; var o = toTRBLCorners(value); var maxR = Math.min(maxW, maxH); - var skip = parseBorderSkipped(bar); + var skip = bar.borderSkipped; + var enableBorder = enableBorderRadius || isObject(value); return { - topLeft: skipOrLimit(skip.top || skip.left, o.topLeft, 0, maxR), - topRight: skipOrLimit(skip.top || skip.right, o.topRight, 0, maxR), - bottomLeft: skipOrLimit(skip.bottom || skip.left, o.bottomLeft, 0, maxR), - bottomRight: skipOrLimit(skip.bottom || skip.right, o.bottomRight, 0, maxR) + topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR), + topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR), + bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR), + bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR) }; } - function boundingRects(bar) { var bounds = getBarBounds(bar); var width = bounds.right - bounds.left; var height = bounds.bottom - bounds.top; var border = parseBorderWidth(bar, width / 2, height / 2); @@ -12356,91 +12207,78 @@ bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)) } } }; } - function _inRange(bar, x, y, useFinalPosition) { var skipX = x === null; var skipY = y === null; var skipBoth = skipX && skipY; var bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition); - return bounds && (skipX || x >= bounds.left && x <= bounds.right) && (skipY || y >= bounds.top && y <= bounds.bottom); + return bounds && (skipX || _isBetween(x, bounds.left, bounds.right)) && (skipY || _isBetween(y, bounds.top, bounds.bottom)); } - function hasRadius(radius) { return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight; } - - function addRoundedRectPath(ctx, rect) { - var x = rect.x, - y = rect.y, - w = rect.w, - h = rect.h, - radius = rect.radius; - ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, -HALF_PI, PI, true); - ctx.lineTo(x, y + h - radius.bottomLeft); - ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true); - ctx.lineTo(x + w - radius.bottomRight, y + h); - ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true); - ctx.lineTo(x + w, y + radius.topRight); - ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true); - ctx.lineTo(x + radius.topLeft, y); - } - function addNormalRectPath(ctx, rect) { ctx.rect(rect.x, rect.y, rect.w, rect.h); } - + function inflateRect(rect, amount) { + var refRect = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var x = rect.x !== refRect.x ? -amount : 0; + var y = rect.y !== refRect.y ? -amount : 0; + var w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x; + var h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y; + return { + x: rect.x + x, + y: rect.y + y, + w: rect.w + w, + h: rect.h + h, + radius: rect.radius + }; + } var BarElement = /*#__PURE__*/function (_Element5) { - _inherits(BarElement, _Element5); - - var _super15 = _createSuper(BarElement); - + _inherits$w(BarElement, _Element5); + var _super15 = _createSuper$w(BarElement); function BarElement(cfg) { - var _this9; - - _classCallCheck(this, BarElement); - - _this9 = _super15.call(this); - _this9.options = undefined; - _this9.horizontal = undefined; - _this9.base = undefined; - _this9.width = undefined; - _this9.height = undefined; - + var _this26; + _classCallCheck$x(this, BarElement); + _this26 = _super15.call(this); + _this26.options = undefined; + _this26.horizontal = undefined; + _this26.base = undefined; + _this26.width = undefined; + _this26.height = undefined; + _this26.inflateAmount = undefined; if (cfg) { - Object.assign(_assertThisInitialized(_this9), cfg); + Object.assign(_assertThisInitialized$w(_this26), cfg); } - - return _this9; + return _this26; } - - _createClass(BarElement, [{ + _createClass$x(BarElement, [{ key: "draw", value: function draw(ctx) { - var options = this.options; - + var inflateAmount = this.inflateAmount, + _this$options14 = this.options, + borderColor = _this$options14.borderColor, + backgroundColor = _this$options14.backgroundColor; var _boundingRects = boundingRects(this), - inner = _boundingRects.inner, - outer = _boundingRects.outer; - + inner = _boundingRects.inner, + outer = _boundingRects.outer; var addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath; ctx.save(); - if (outer.w !== inner.w || outer.h !== inner.h) { ctx.beginPath(); - addRectPath(ctx, outer); + addRectPath(ctx, inflateRect(outer, inflateAmount, inner)); ctx.clip(); - addRectPath(ctx, inner); - ctx.fillStyle = options.borderColor; + addRectPath(ctx, inflateRect(inner, -inflateAmount, outer)); + ctx.fillStyle = borderColor; ctx.fill('evenodd'); } - ctx.beginPath(); - addRectPath(ctx, inner); - ctx.fillStyle = options.backgroundColor; + addRectPath(ctx, inflateRect(inner, inflateAmount)); + ctx.fillStyle = backgroundColor; ctx.fill(); ctx.restore(); } }, { key: "inRange", @@ -12459,15 +12297,14 @@ } }, { key: "getCenterPoint", value: function getCenterPoint(useFinalPosition) { var _this$getProps6 = this.getProps(['x', 'y', 'base', 'horizontal'], useFinalPosition), - x = _this$getProps6.x, - y = _this$getProps6.y, - base = _this$getProps6.base, - horizontal = _this$getProps6.horizontal; - + x = _this$getProps6.x, + y = _this$getProps6.y, + base = _this$getProps6.base, + horizontal = _this$getProps6.horizontal; return { x: horizontal ? (x + base) / 2 : x, y: horizontal ? y : (y + base) / 2 }; } @@ -12475,155 +12312,240 @@ key: "getRange", value: function getRange(axis) { return axis === 'x' ? this.width / 2 : this.height / 2; } }]); - return BarElement; }(Element); - - BarElement.id = 'bar'; - BarElement.defaults = { + _defineProperty$w(BarElement, "id", 'bar'); + _defineProperty$w(BarElement, "defaults", { borderSkipped: 'start', borderWidth: 0, borderRadius: 0, + inflateAmount: 'auto', pointStyle: undefined - }; - BarElement.defaultRoutes = { + }); + _defineProperty$w(BarElement, "defaultRoutes", { backgroundColor: 'backgroundColor', borderColor: 'borderColor' - }; + }); var elements = /*#__PURE__*/Object.freeze({ __proto__: null, ArcElement: ArcElement, LineElement: LineElement, PointElement: PointElement, BarElement: BarElement }); - - function lttbDecimation(data, availableWidth, options) { + var BORDER_COLORS = ['rgb(54, 162, 235)', 'rgb(255, 99, 132)', 'rgb(255, 159, 64)', 'rgb(255, 205, 86)', 'rgb(75, 192, 192)', 'rgb(153, 102, 255)', 'rgb(201, 203, 207)' // grey + ]; + // Border colors with 50% transparency + var BACKGROUND_COLORS = /* #__PURE__ */BORDER_COLORS.map(function (color) { + return color.replace('rgb(', 'rgba(').replace(')', ', 0.5)'); + }); + function getBorderColor(i) { + return BORDER_COLORS[i % BORDER_COLORS.length]; + } + function getBackgroundColor(i) { + return BACKGROUND_COLORS[i % BACKGROUND_COLORS.length]; + } + function colorizeDefaultDataset(dataset, i) { + dataset.borderColor = getBorderColor(i); + dataset.backgroundColor = getBackgroundColor(i); + return ++i; + } + function colorizeDoughnutDataset(dataset, i) { + dataset.backgroundColor = dataset.data.map(function () { + return getBorderColor(i++); + }); + return i; + } + function colorizePolarAreaDataset(dataset, i) { + dataset.backgroundColor = dataset.data.map(function () { + return getBackgroundColor(i++); + }); + return i; + } + function getColorizer(chart) { + var i = 0; + return function (dataset, datasetIndex) { + var controller = chart.getDatasetMeta(datasetIndex).controller; + if (controller instanceof DoughnutController) { + i = colorizeDoughnutDataset(dataset, i); + } else if (controller instanceof PolarAreaController) { + i = colorizePolarAreaDataset(dataset, i); + } else if (controller) { + i = colorizeDefaultDataset(dataset, i); + } + }; + } + function containsColorsDefinitions(descriptors) { + var k; + for (k in descriptors) { + if (descriptors[k].borderColor || descriptors[k].backgroundColor) { + return true; + } + } + return false; + } + function containsColorsDefinition(descriptor) { + return descriptor && (descriptor.borderColor || descriptor.backgroundColor); + } + var plugin_colors = { + id: 'colors', + defaults: { + enabled: true, + forceOverride: false + }, + beforeLayout: function beforeLayout(chart, _args, options) { + if (!options.enabled) { + return; + } + var _chart$config = chart.config, + datasets = _chart$config.data.datasets, + chartOptions = _chart$config.options; + var elements = chartOptions.elements; + if (!options.forceOverride && (containsColorsDefinitions(datasets) || containsColorsDefinition(chartOptions) || elements && containsColorsDefinitions(elements))) { + return; + } + var colorizer = getColorizer(chart); + datasets.forEach(colorizer); + } + }; + function lttbDecimation(data, start, count, availableWidth, options) { var samples = options.samples || availableWidth; + if (samples >= count) { + return data.slice(start, start + count); + } var decimated = []; - var bucketWidth = (data.length - 2) / (samples - 2); + var bucketWidth = (count - 2) / (samples - 2); var sampledIndex = 0; - var a = 0; + var endIndex = start + count - 1; + var a = start; var i, maxAreaPoint, maxArea, area, nextA; decimated[sampledIndex++] = data[a]; - for (i = 0; i < samples - 2; i++) { var avgX = 0; var avgY = 0; var j = void 0; - var avgRangeStart = Math.floor((i + 1) * bucketWidth) + 1; - var avgRangeEnd = Math.min(Math.floor((i + 2) * bucketWidth) + 1, data.length); + var avgRangeStart = Math.floor((i + 1) * bucketWidth) + 1 + start; + var avgRangeEnd = Math.min(Math.floor((i + 2) * bucketWidth) + 1, count) + start; var avgRangeLength = avgRangeEnd - avgRangeStart; - for (j = avgRangeStart; j < avgRangeEnd; j++) { - avgX = data[j].x; - avgY = data[j].y; + avgX += data[j].x; + avgY += data[j].y; } - avgX /= avgRangeLength; avgY /= avgRangeLength; - var rangeOffs = Math.floor(i * bucketWidth) + 1; - var rangeTo = Math.floor((i + 1) * bucketWidth) + 1; + var rangeOffs = Math.floor(i * bucketWidth) + 1 + start; + var rangeTo = Math.min(Math.floor((i + 1) * bucketWidth) + 1, count) + start; var _data$a = data[a], - pointAx = _data$a.x, - pointAy = _data$a.y; + pointAx = _data$a.x, + pointAy = _data$a.y; maxArea = area = -1; - for (j = rangeOffs; j < rangeTo; j++) { area = 0.5 * Math.abs((pointAx - avgX) * (data[j].y - pointAy) - (pointAx - data[j].x) * (avgY - pointAy)); - if (area > maxArea) { maxArea = area; maxAreaPoint = data[j]; nextA = j; } } - decimated[sampledIndex++] = maxAreaPoint; a = nextA; } - - decimated[sampledIndex++] = data[data.length - 1]; + decimated[sampledIndex++] = data[endIndex]; return decimated; } - - function minMaxDecimation(data, availableWidth) { + function minMaxDecimation(data, start, count, availableWidth) { var avgX = 0; var countX = 0; var i, point, x, y, prevX, minIndex, maxIndex, startIndex, minY, maxY; var decimated = []; - var xMin = data[0].x; - var xMax = data[data.length - 1].x; + var endIndex = start + count - 1; + var xMin = data[start].x; + var xMax = data[endIndex].x; var dx = xMax - xMin; - - for (i = 0; i < data.length; ++i) { + for (i = start; i < start + count; ++i) { point = data[i]; x = (point.x - xMin) / dx * availableWidth; y = point.y; var truncX = x | 0; - if (truncX === prevX) { if (y < minY) { minY = y; minIndex = i; } else if (y > maxY) { maxY = y; maxIndex = i; } - avgX = (countX * avgX + point.x) / ++countX; } else { var lastIndex = i - 1; - if (!isNullOrUndef(minIndex) && !isNullOrUndef(maxIndex)) { var intermediateIndex1 = Math.min(minIndex, maxIndex); var intermediateIndex2 = Math.max(minIndex, maxIndex); - if (intermediateIndex1 !== startIndex && intermediateIndex1 !== lastIndex) { decimated.push(_objectSpread2(_objectSpread2({}, data[intermediateIndex1]), {}, { x: avgX })); } - if (intermediateIndex2 !== startIndex && intermediateIndex2 !== lastIndex) { decimated.push(_objectSpread2(_objectSpread2({}, data[intermediateIndex2]), {}, { x: avgX })); } } - if (i > 0 && lastIndex !== startIndex) { decimated.push(data[lastIndex]); } - decimated.push(point); prevX = truncX; countX = 0; minY = maxY = y; minIndex = maxIndex = startIndex = i; } } - return decimated; } - + function cleanDecimatedDataset(dataset) { + if (dataset._decimated) { + var data = dataset._data; + delete dataset._decimated; + delete dataset._data; + Object.defineProperty(dataset, 'data', { + value: data + }); + } + } function cleanDecimatedData(chart) { chart.data.datasets.forEach(function (dataset) { - if (dataset._decimated) { - var data = dataset._data; - delete dataset._decimated; - delete dataset._data; - Object.defineProperty(dataset, 'data', { - value: data - }); - } + cleanDecimatedDataset(dataset); }); } - + function getStartAndCountOfVisiblePointsSimplified(meta, points) { + var pointCount = points.length; + var start = 0; + var count; + var iScale = meta.iScale; + var _iScale$getUserBounds = iScale.getUserBounds(), + min = _iScale$getUserBounds.min, + max = _iScale$getUserBounds.max, + minDefined = _iScale$getUserBounds.minDefined, + maxDefined = _iScale$getUserBounds.maxDefined; + if (minDefined) { + start = _limitValue(_lookupByKey(points, iScale.axis, min).lo, 0, pointCount - 1); + } + if (maxDefined) { + count = _limitValue(_lookupByKey(points, iScale.axis, max).hi + 1, start, pointCount) - start; + } else { + count = pointCount - start; + } + return { + start: start, + count: count + }; + } var plugin_decimation = { id: 'decimation', defaults: { algorithm: 'min-max', enabled: false @@ -12631,40 +12553,37 @@ beforeElementsUpdate: function beforeElementsUpdate(chart, args, options) { if (!options.enabled) { cleanDecimatedData(chart); return; } - var availableWidth = chart.width; chart.data.datasets.forEach(function (dataset, datasetIndex) { var _data = dataset._data, - indexAxis = dataset.indexAxis; + indexAxis = dataset.indexAxis; var meta = chart.getDatasetMeta(datasetIndex); var data = _data || dataset.data; - if (resolve([indexAxis, chart.options.indexAxis]) === 'y') { return; } - - if (meta.type !== 'line') { + if (!meta.controller.supportsDecimation) { return; } - var xAxis = chart.scales[meta.xAxisID]; - if (xAxis.type !== 'linear' && xAxis.type !== 'time') { return; } - if (chart.options.parsing) { return; } - - if (data.length <= 4 * availableWidth) { + var _getStartAndCountOfVi3 = getStartAndCountOfVisiblePointsSimplified(meta, data), + start = _getStartAndCountOfVi3.start, + count = _getStartAndCountOfVi3.count; + var threshold = options.threshold || 4 * availableWidth; + if (count <= threshold) { + cleanDecimatedDataset(dataset); return; } - if (isNullOrUndef(_data)) { dataset._data = data; delete dataset.data; Object.defineProperty(dataset, 'data', { configurable: true, @@ -12675,211 +12594,120 @@ set: function set(d) { this._data = d; } }); } - var decimated; - switch (options.algorithm) { case 'lttb': - decimated = lttbDecimation(data, availableWidth, options); + decimated = lttbDecimation(data, start, count, availableWidth, options); break; - case 'min-max': - decimated = minMaxDecimation(data, availableWidth); + decimated = minMaxDecimation(data, start, count, availableWidth); break; - default: throw new Error("Unsupported decimation algorithm '".concat(options.algorithm, "'")); } - dataset._decimated = decimated; }); }, destroy: function destroy(chart) { cleanDecimatedData(chart); } }; - - function getLineByIndex(chart, index) { - var meta = chart.getDatasetMeta(index); - var visible = meta && chart.isDatasetVisible(index); - return visible ? meta.dataset : null; - } - - function parseFillOption(line) { - var options = line.options; - var fillOption = options.fill; - var fill = valueOrDefault(fillOption && fillOption.target, fillOption); - - if (fill === undefined) { - fill = !!options.backgroundColor; - } - - if (fill === false || fill === null) { - return false; - } - - if (fill === true) { - return 'origin'; - } - - return fill; - } - - function decodeFill(line, index, count) { - var fill = parseFillOption(line); - - if (isObject(fill)) { - return isNaN(fill.value) ? false : fill; - } - - var target = parseFloat(fill); - - if (isNumberFinite(target) && Math.floor(target) === target) { - if (fill[0] === '-' || fill[0] === '+') { - target = index + target; + function _segments(line, target, property) { + var segments = line.segments; + var points = line.points; + var tpoints = target.points; + var parts = []; + var _iterator18 = _createForOfIteratorHelper$1(segments), + _step18; + try { + for (_iterator18.s(); !(_step18 = _iterator18.n()).done;) { + var segment = _step18.value; + var start = segment.start, + end = segment.end; + end = _findSegmentEnd(start, end, points); + var bounds = _getBounds(property, points[start], points[end], segment.loop); + if (!target.segments) { + parts.push({ + source: segment, + target: bounds, + start: points[start], + end: points[end] + }); + continue; + } + var targetSegments = _boundSegments(target, bounds); + var _iterator19 = _createForOfIteratorHelper$1(targetSegments), + _step19; + try { + for (_iterator19.s(); !(_step19 = _iterator19.n()).done;) { + var tgt = _step19.value; + var subBounds = _getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop); + var fillSources = _boundSegment(segment, points, subBounds); + var _iterator20 = _createForOfIteratorHelper$1(fillSources), + _step20; + try { + for (_iterator20.s(); !(_step20 = _iterator20.n()).done;) { + var fillSource = _step20.value; + parts.push({ + source: fillSource, + target: tgt, + start: _defineProperty$w({}, property, _getEdge(bounds, subBounds, 'start', Math.max)), + end: _defineProperty$w({}, property, _getEdge(bounds, subBounds, 'end', Math.min)) + }); + } + } catch (err) { + _iterator20.e(err); + } finally { + _iterator20.f(); + } + } + } catch (err) { + _iterator19.e(err); + } finally { + _iterator19.f(); + } } - - if (target === index || target < 0 || target >= count) { - return false; - } - - return target; + } catch (err) { + _iterator18.e(err); + } finally { + _iterator18.f(); } - - return ['origin', 'start', 'end', 'stack'].indexOf(fill) >= 0 && fill; + return parts; } - - function computeLinearBoundary(source) { - var _source$scale = source.scale, - scale = _source$scale === void 0 ? {} : _source$scale, - fill = source.fill; - var target = null; - var horizontal; - - if (fill === 'start') { - target = scale.bottom; - } else if (fill === 'end') { - target = scale.top; - } else if (isObject(fill)) { - target = scale.getPixelForValue(fill.value); - } else if (scale.getBasePixel) { - target = scale.getBasePixel(); + function _getBounds(property, first, last, loop) { + if (loop) { + return; } - - if (isNumberFinite(target)) { - horizontal = scale.isHorizontal(); - return { - x: horizontal ? target : null, - y: horizontal ? null : target - }; + var start = first[property]; + var end = last[property]; + if (property === 'angle') { + start = _normalizeAngle(start); + end = _normalizeAngle(end); } - - return null; + return { + property: property, + start: start, + end: end + }; } - - var simpleArc = /*#__PURE__*/function () { - function simpleArc(opts) { - _classCallCheck(this, simpleArc); - - this.x = opts.x; - this.y = opts.y; - this.radius = opts.radius; - } - - _createClass(simpleArc, [{ - key: "pathSegment", - value: function pathSegment(ctx, bounds, opts) { - var x = this.x, - y = this.y, - radius = this.radius; - bounds = bounds || { - start: 0, - end: TAU - }; - ctx.arc(x, y, radius, bounds.end, bounds.start, true); - return !opts.bounds; - } - }, { - key: "interpolate", - value: function interpolate(point) { - var x = this.x, - y = this.y, - radius = this.radius; - var angle = point.angle; - return { - x: x + Math.cos(angle) * radius, - y: y + Math.sin(angle) * radius, - angle: angle - }; - } - }]); - - return simpleArc; - }(); - - function computeCircularBoundary(source) { - var scale = source.scale, - fill = source.fill; - var options = scale.options; - var length = scale.getLabels().length; - var target = []; - var start = options.reverse ? scale.max : scale.min; - var end = options.reverse ? scale.min : scale.max; - var i, center, value; - - if (fill === 'start') { - value = start; - } else if (fill === 'end') { - value = end; - } else if (isObject(fill)) { - value = fill.value; - } else { - value = scale.getBaseValue(); - } - - if (options.grid.circular) { - center = scale.getPointPositionForValue(0, start); - return new simpleArc({ - x: center.x, - y: center.y, - radius: scale.getDistanceFromCenterForValue(value) - }); - } - - for (i = 0; i < length; ++i) { - target.push(scale.getPointPositionForValue(i, value)); - } - - return target; - } - - function computeBoundary(source) { - var scale = source.scale || {}; - - if (scale.getPointPositionForValue) { - return computeCircularBoundary(source); - } - - return computeLinearBoundary(source); - } - - function pointsFromSegments(boundary, line) { - var _ref4 = boundary || {}, - _ref4$x = _ref4.x, - x = _ref4$x === void 0 ? null : _ref4$x, - _ref4$y = _ref4.y, - y = _ref4$y === void 0 ? null : _ref4$y; - + function _pointsFromSegments(boundary, line) { + var _ref7 = boundary || {}, + _ref7$x = _ref7.x, + x = _ref7$x === void 0 ? null : _ref7$x, + _ref7$y = _ref7.y, + y = _ref7$y === void 0 ? null : _ref7$y; var linePoints = line.points; var points = []; - line.segments.forEach(function (segment) { - var first = linePoints[segment.start]; - var last = linePoints[segment.end]; - + line.segments.forEach(function (_ref8) { + var start = _ref8.start, + end = _ref8.end; + end = _findSegmentEnd(start, end, linePoints); + var first = linePoints[start]; + var last = linePoints[end]; if (y !== null) { points.push({ x: first.x, y: y }); @@ -12898,645 +12726,702 @@ }); } }); return points; } - - function buildStackLine(source) { - var chart = source.chart, - scale = source.scale, - index = source.index, - line = source.line; + function _findSegmentEnd(start, end, points) { + for (; end > start; end--) { + var point = points[end]; + if (!isNaN(point.x) && !isNaN(point.y)) { + break; + } + } + return end; + } + function _getEdge(a, b, prop, fn) { + if (a && b) { + return fn(a[prop], b[prop]); + } + return a ? a[prop] : b ? b[prop] : 0; + } + function _createBoundaryLine(boundary, line) { var points = []; + var _loop = false; + if (isArray(boundary)) { + _loop = true; + points = boundary; + } else { + points = _pointsFromSegments(boundary, line); + } + return points.length ? new LineElement({ + points: points, + options: { + tension: 0 + }, + _loop: _loop, + _fullLoop: _loop + }) : null; + } + function _shouldApplyFill(source) { + return source && source.fill !== false; + } + function _resolveTarget(sources, index, propagate) { + var source = sources[index]; + var fill = source.fill; + var visited = [index]; + var target; + if (!propagate) { + return fill; + } + while (fill !== false && visited.indexOf(fill) === -1) { + if (!isNumberFinite(fill)) { + return fill; + } + target = sources[fill]; + if (!target) { + return false; + } + if (target.visible) { + return fill; + } + visited.push(fill); + fill = target.fill; + } + return false; + } + function _decodeFill(line, index, count) { + var fill = parseFillOption(line); + if (isObject(fill)) { + return isNaN(fill.value) ? false : fill; + } + var target = parseFloat(fill); + if (isNumberFinite(target) && Math.floor(target) === target) { + return decodeTargetIndex(fill[0], index, target, count); + } + return ['origin', 'start', 'end', 'stack', 'shape'].indexOf(fill) >= 0 && fill; + } + function decodeTargetIndex(firstCh, index, target, count) { + if (firstCh === '-' || firstCh === '+') { + target = index + target; + } + if (target === index || target < 0 || target >= count) { + return false; + } + return target; + } + function _getTargetPixel(fill, scale) { + var pixel = null; + if (fill === 'start') { + pixel = scale.bottom; + } else if (fill === 'end') { + pixel = scale.top; + } else if (isObject(fill)) { + pixel = scale.getPixelForValue(fill.value); + } else if (scale.getBasePixel) { + pixel = scale.getBasePixel(); + } + return pixel; + } + function _getTargetValue(fill, scale, startValue) { + var value; + if (fill === 'start') { + value = startValue; + } else if (fill === 'end') { + value = scale.options.reverse ? scale.min : scale.max; + } else if (isObject(fill)) { + value = fill.value; + } else { + value = scale.getBaseValue(); + } + return value; + } + function parseFillOption(line) { + var options = line.options; + var fillOption = options.fill; + var fill = valueOrDefault(fillOption && fillOption.target, fillOption); + if (fill === undefined) { + fill = !!options.backgroundColor; + } + if (fill === false || fill === null) { + return false; + } + if (fill === true) { + return 'origin'; + } + return fill; + } + function _buildStackLine(source) { + var scale = source.scale, + index = source.index, + line = source.line; + var points = []; var segments = line.segments; var sourcePoints = line.points; - var linesBelow = getLinesBelow(chart, index); - linesBelow.push(createBoundaryLine({ + var linesBelow = getLinesBelow(scale, index); + linesBelow.push(_createBoundaryLine({ x: null, y: scale.bottom }, line)); - for (var i = 0; i < segments.length; i++) { var segment = segments[i]; - for (var j = segment.start; j <= segment.end; j++) { addPointsBelow(points, sourcePoints[j], linesBelow); } } - return new LineElement({ points: points, options: {} }); } - - var isLineAndNotInHideAnimation = function isLineAndNotInHideAnimation(meta) { - return meta.type === 'line' && !meta.hidden; - }; - - function getLinesBelow(chart, index) { + function getLinesBelow(scale, index) { var below = []; - var metas = chart.getSortedVisibleDatasetMetas(); - + var metas = scale.getMatchingVisibleMetas('line'); for (var i = 0; i < metas.length; i++) { var meta = metas[i]; - if (meta.index === index) { break; } - - if (isLineAndNotInHideAnimation(meta)) { + if (!meta.hidden) { below.unshift(meta.dataset); } } - return below; } - function addPointsBelow(points, sourcePoint, linesBelow) { var postponed = []; - for (var j = 0; j < linesBelow.length; j++) { var line = linesBelow[j]; - var _findPoint = findPoint(line, sourcePoint, 'x'), - first = _findPoint.first, - last = _findPoint.last, - point = _findPoint.point; - + first = _findPoint.first, + last = _findPoint.last, + point = _findPoint.point; if (!point || first && last) { continue; } - if (first) { postponed.unshift(point); } else { points.push(point); - if (!last) { break; } } } - points.push.apply(points, postponed); } - function findPoint(line, sourcePoint, property) { var point = line.interpolate(sourcePoint, property); - if (!point) { return {}; } - var pointValue = point[property]; var segments = line.segments; var linePoints = line.points; var first = false; var last = false; - for (var i = 0; i < segments.length; i++) { var segment = segments[i]; var firstValue = linePoints[segment.start][property]; var lastValue = linePoints[segment.end][property]; - - if (pointValue >= firstValue && pointValue <= lastValue) { + if (_isBetween(pointValue, firstValue, lastValue)) { first = pointValue === firstValue; last = pointValue === lastValue; break; } } - return { first: first, last: last, point: point }; } - - function getTarget(source) { + var simpleArc = /*#__PURE__*/function () { + function simpleArc(opts) { + _classCallCheck$x(this, simpleArc); + this.x = opts.x; + this.y = opts.y; + this.radius = opts.radius; + } + _createClass$x(simpleArc, [{ + key: "pathSegment", + value: function pathSegment(ctx, bounds, opts) { + var x = this.x, + y = this.y, + radius = this.radius; + bounds = bounds || { + start: 0, + end: TAU + }; + ctx.arc(x, y, radius, bounds.end, bounds.start, true); + return !opts.bounds; + } + }, { + key: "interpolate", + value: function interpolate(point) { + var x = this.x, + y = this.y, + radius = this.radius; + var angle = point.angle; + return { + x: x + Math.cos(angle) * radius, + y: y + Math.sin(angle) * radius, + angle: angle + }; + } + }]); + return simpleArc; + }(); + function _getTarget(source) { var chart = source.chart, - fill = source.fill, - line = source.line; - + fill = source.fill, + line = source.line; if (isNumberFinite(fill)) { return getLineByIndex(chart, fill); } - if (fill === 'stack') { - return buildStackLine(source); + return _buildStackLine(source); } - + if (fill === 'shape') { + return true; + } var boundary = computeBoundary(source); - if (boundary instanceof simpleArc) { return boundary; } - - return createBoundaryLine(boundary, line); + return _createBoundaryLine(boundary, line); } - - function createBoundaryLine(boundary, line) { - var points = []; - var _loop = false; - - if (isArray(boundary)) { - _loop = true; - points = boundary; - } else { - points = pointsFromSegments(boundary, line); - } - - return points.length ? new LineElement({ - points: points, - options: { - tension: 0 - }, - _loop: _loop, - _fullLoop: _loop - }) : null; + function getLineByIndex(chart, index) { + var meta = chart.getDatasetMeta(index); + var visible = meta && chart.isDatasetVisible(index); + return visible ? meta.dataset : null; } - - function resolveTarget(sources, index, propagate) { - var source = sources[index]; - var fill = source.fill; - var visited = [index]; - var target; - - if (!propagate) { - return fill; + function computeBoundary(source) { + var scale = source.scale || {}; + if (scale.getPointPositionForValue) { + return computeCircularBoundary(source); } - - while (fill !== false && visited.indexOf(fill) === -1) { - if (!isNumberFinite(fill)) { - return fill; - } - - target = sources[fill]; - - if (!target) { - return false; - } - - if (target.visible) { - return fill; - } - - visited.push(fill); - fill = target.fill; - } - - return false; + return computeLinearBoundary(source); } - - function _clip(ctx, target, clipY) { - ctx.beginPath(); - target.path(ctx); - ctx.lineTo(target.last().x, clipY); - ctx.lineTo(target.first().x, clipY); - ctx.closePath(); - ctx.clip(); - } - - function getBounds(property, first, last, loop) { - if (loop) { - return; + function computeLinearBoundary(source) { + var _source$scale = source.scale, + scale = _source$scale === void 0 ? {} : _source$scale, + fill = source.fill; + var pixel = _getTargetPixel(fill, scale); + if (isNumberFinite(pixel)) { + var horizontal = scale.isHorizontal(); + return { + x: horizontal ? pixel : null, + y: horizontal ? null : pixel + }; } - - var start = first[property]; - var end = last[property]; - - if (property === 'angle') { - start = _normalizeAngle(start); - end = _normalizeAngle(end); - } - - return { - property: property, - start: start, - end: end - }; + return null; } - - function _getEdge(a, b, prop, fn) { - if (a && b) { - return fn(a[prop], b[prop]); + function computeCircularBoundary(source) { + var scale = source.scale, + fill = source.fill; + var options = scale.options; + var length = scale.getLabels().length; + var start = options.reverse ? scale.max : scale.min; + var value = _getTargetValue(fill, scale, start); + var target = []; + if (options.grid.circular) { + var center = scale.getPointPositionForValue(0, start); + return new simpleArc({ + x: center.x, + y: center.y, + radius: scale.getDistanceFromCenterForValue(value) + }); } - - return a ? a[prop] : b ? b[prop] : 0; - } - - function _segments(line, target, property) { - var segments = line.segments; - var points = line.points; - var tpoints = target.points; - var parts = []; - - for (var i = 0; i < segments.length; i++) { - var segment = segments[i]; - var bounds = getBounds(property, points[segment.start], points[segment.end], segment.loop); - - if (!target.segments) { - parts.push({ - source: segment, - target: bounds, - start: points[segment.start], - end: points[segment.end] - }); - continue; - } - - var subs = _boundSegments(target, bounds); - - for (var j = 0; j < subs.length; ++j) { - var sub = subs[j]; - var subBounds = getBounds(property, tpoints[sub.start], tpoints[sub.end], sub.loop); - - var fillSources = _boundSegment(segment, points, subBounds); - - for (var k = 0; k < fillSources.length; k++) { - parts.push({ - source: fillSources[k], - target: sub, - start: _defineProperty({}, property, _getEdge(bounds, subBounds, 'start', Math.max)), - end: _defineProperty({}, property, _getEdge(bounds, subBounds, 'end', Math.min)) - }); - } - } + for (var i = 0; i < length; ++i) { + target.push(scale.getPointPositionForValue(i, value)); } - - return parts; + return target; } - - function clipBounds(ctx, scale, bounds) { - var _scale$chart$chartAre = scale.chart.chartArea, - top = _scale$chart$chartAre.top, - bottom = _scale$chart$chartAre.bottom; - - var _ref5 = bounds || {}, - property = _ref5.property, - start = _ref5.start, - end = _ref5.end; - - if (property === 'x') { - ctx.beginPath(); - ctx.rect(start, top, end - start, bottom - top); - ctx.clip(); - } - } - - function interpolatedLineTo(ctx, target, point, property) { - var interpolatedPoint = target.interpolate(point, property); - - if (interpolatedPoint) { - ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y); - } - } - - function _fill(ctx, cfg) { - var line = cfg.line, - target = cfg.target, - property = cfg.property, - color = cfg.color, - scale = cfg.scale; - - var segments = _segments(line, target, property); - - ctx.fillStyle = color; - - for (var i = 0, ilen = segments.length; i < ilen; ++i) { - var _segments$i2 = segments[i], - src = _segments$i2.source, - tgt = _segments$i2.target, - start = _segments$i2.start, - end = _segments$i2.end; - ctx.save(); - clipBounds(ctx, scale, getBounds(property, start, end)); - ctx.beginPath(); - var lineLoop = !!line.pathSegment(ctx, src); - - if (lineLoop) { - ctx.closePath(); - } else { - interpolatedLineTo(ctx, target, end, property); - } - - var targetLoop = !!target.pathSegment(ctx, tgt, { - move: lineLoop, - reverse: true + function _drawfill(ctx, source, area) { + var target = _getTarget(source); + var line = source.line, + scale = source.scale, + axis = source.axis; + var lineOpts = line.options; + var fillOption = lineOpts.fill; + var color = lineOpts.backgroundColor; + var _ref9 = fillOption || {}, + _ref9$above = _ref9.above, + above = _ref9$above === void 0 ? color : _ref9$above, + _ref9$below = _ref9.below, + below = _ref9$below === void 0 ? color : _ref9$below; + if (target && line.points.length) { + clipArea(ctx, area); + doFill(ctx, { + line: line, + target: target, + above: above, + below: below, + area: area, + scale: scale, + axis: axis }); - var loop = lineLoop && targetLoop; - - if (!loop) { - interpolatedLineTo(ctx, target, start, property); - } - - ctx.closePath(); - ctx.fill(loop ? 'evenodd' : 'nonzero'); - ctx.restore(); + unclipArea(ctx); } } - function doFill(ctx, cfg) { var line = cfg.line, - target = cfg.target, - above = cfg.above, - below = cfg.below, - area = cfg.area, - scale = cfg.scale; - var property = line._loop ? 'angle' : 'x'; + target = cfg.target, + above = cfg.above, + below = cfg.below, + area = cfg.area, + scale = cfg.scale; + var property = line._loop ? 'angle' : cfg.axis; ctx.save(); - if (property === 'x' && below !== above) { - _clip(ctx, target, area.top); - - _fill(ctx, { + clipVertical(ctx, target, area.top); + fill(ctx, { line: line, target: target, color: above, scale: scale, property: property }); - ctx.restore(); ctx.save(); - - _clip(ctx, target, area.bottom); + clipVertical(ctx, target, area.bottom); } - - _fill(ctx, { + fill(ctx, { line: line, target: target, color: below, scale: scale, property: property }); - ctx.restore(); } - - var plugin_filler = { + function clipVertical(ctx, target, clipY) { + var segments = target.segments, + points = target.points; + var first = true; + var lineLoop = false; + ctx.beginPath(); + var _iterator21 = _createForOfIteratorHelper$1(segments), + _step21; + try { + for (_iterator21.s(); !(_step21 = _iterator21.n()).done;) { + var segment = _step21.value; + var start = segment.start, + end = segment.end; + var firstPoint = points[start]; + var lastPoint = points[_findSegmentEnd(start, end, points)]; + if (first) { + ctx.moveTo(firstPoint.x, firstPoint.y); + first = false; + } else { + ctx.lineTo(firstPoint.x, clipY); + ctx.lineTo(firstPoint.x, firstPoint.y); + } + lineLoop = !!target.pathSegment(ctx, segment, { + move: lineLoop + }); + if (lineLoop) { + ctx.closePath(); + } else { + ctx.lineTo(lastPoint.x, clipY); + } + } + } catch (err) { + _iterator21.e(err); + } finally { + _iterator21.f(); + } + ctx.lineTo(target.first().x, clipY); + ctx.closePath(); + ctx.clip(); + } + function fill(ctx, cfg) { + var line = cfg.line, + target = cfg.target, + property = cfg.property, + color = cfg.color, + scale = cfg.scale; + var segments = _segments(line, target, property); + var _iterator22 = _createForOfIteratorHelper$1(segments), + _step22; + try { + for (_iterator22.s(); !(_step22 = _iterator22.n()).done;) { + var _step22$value = _step22.value, + src = _step22$value.source, + tgt = _step22$value.target, + start = _step22$value.start, + end = _step22$value.end; + var _src$style = src.style, + _src$style2 = _src$style === void 0 ? {} : _src$style, + _src$style2$backgroun = _src$style2.backgroundColor, + backgroundColor = _src$style2$backgroun === void 0 ? color : _src$style2$backgroun; + var notShape = target !== true; + ctx.save(); + ctx.fillStyle = backgroundColor; + clipBounds(ctx, scale, notShape && _getBounds(property, start, end)); + ctx.beginPath(); + var lineLoop = !!line.pathSegment(ctx, src); + var loop = void 0; + if (notShape) { + if (lineLoop) { + ctx.closePath(); + } else { + interpolatedLineTo(ctx, target, end, property); + } + var targetLoop = !!target.pathSegment(ctx, tgt, { + move: lineLoop, + reverse: true + }); + loop = lineLoop && targetLoop; + if (!loop) { + interpolatedLineTo(ctx, target, start, property); + } + } + ctx.closePath(); + ctx.fill(loop ? 'evenodd' : 'nonzero'); + ctx.restore(); + } + } catch (err) { + _iterator22.e(err); + } finally { + _iterator22.f(); + } + } + function clipBounds(ctx, scale, bounds) { + var _scale$chart$chartAre = scale.chart.chartArea, + top = _scale$chart$chartAre.top, + bottom = _scale$chart$chartAre.bottom; + var _ref10 = bounds || {}, + property = _ref10.property, + start = _ref10.start, + end = _ref10.end; + if (property === 'x') { + ctx.beginPath(); + ctx.rect(start, top, end - start, bottom - top); + ctx.clip(); + } + } + function interpolatedLineTo(ctx, target, point, property) { + var interpolatedPoint = target.interpolate(point, property); + if (interpolatedPoint) { + ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y); + } + } + var index = { id: 'filler', afterDatasetsUpdate: function afterDatasetsUpdate(chart, _args, options) { var count = (chart.data.datasets || []).length; - var propagate = options.propagate; var sources = []; var meta, i, line, source; - for (i = 0; i < count; ++i) { meta = chart.getDatasetMeta(i); line = meta.dataset; source = null; - if (line && line.options && line instanceof LineElement) { source = { visible: chart.isDatasetVisible(i), index: i, - fill: decodeFill(line, i, count), + fill: _decodeFill(line, i, count), chart: chart, + axis: meta.controller.options.indexAxis, scale: meta.vScale, line: line }; } - meta.$filler = source; sources.push(source); } - for (i = 0; i < count; ++i) { source = sources[i]; - if (!source || source.fill === false) { continue; } - - source.fill = resolveTarget(sources, i, propagate); + source.fill = _resolveTarget(sources, i, options.propagate); } }, - beforeDatasetsDraw: function beforeDatasetsDraw(chart) { + beforeDraw: function beforeDraw(chart, _args, options) { + var draw = options.drawTime === 'beforeDraw'; var metasets = chart.getSortedVisibleDatasetMetas(); var area = chart.chartArea; - var i, meta; - - for (i = metasets.length - 1; i >= 0; --i) { - meta = metasets[i].$filler; - - if (meta) { - meta.line.updateControlPoints(area); + for (var i = metasets.length - 1; i >= 0; --i) { + var source = metasets[i].$filler; + if (!source) { + continue; } + source.line.updateControlPoints(area, source.axis); + if (draw && source.fill) { + _drawfill(chart.ctx, source, area); + } } }, - beforeDatasetDraw: function beforeDatasetDraw(chart, args) { - var area = chart.chartArea; - var ctx = chart.ctx; - var source = args.meta.$filler; - - if (!source || source.fill === false) { + beforeDatasetsDraw: function beforeDatasetsDraw(chart, _args, options) { + if (options.drawTime !== 'beforeDatasetsDraw') { return; } - - var target = getTarget(source); - var line = source.line, - scale = source.scale; - var lineOpts = line.options; - var fillOption = lineOpts.fill; - var color = lineOpts.backgroundColor; - - var _ref6 = fillOption || {}, - _ref6$above = _ref6.above, - above = _ref6$above === void 0 ? color : _ref6$above, - _ref6$below = _ref6.below, - below = _ref6$below === void 0 ? color : _ref6$below; - - if (target && line.points.length) { - clipArea(ctx, area); - doFill(ctx, { - line: line, - target: target, - above: above, - below: below, - area: area, - scale: scale - }); - unclipArea(ctx); + var metasets = chart.getSortedVisibleDatasetMetas(); + for (var i = metasets.length - 1; i >= 0; --i) { + var source = metasets[i].$filler; + if (_shouldApplyFill(source)) { + _drawfill(chart.ctx, source, chart.chartArea); + } } }, + beforeDatasetDraw: function beforeDatasetDraw(chart, args, options) { + var source = args.meta.$filler; + if (!_shouldApplyFill(source) || options.drawTime !== 'beforeDatasetDraw') { + return; + } + _drawfill(chart.ctx, source, chart.chartArea); + }, defaults: { - propagate: true + propagate: true, + drawTime: 'beforeDatasetDraw' } }; - var getBoxSize = function getBoxSize(labelOpts, fontSize) { var _labelOpts$boxHeight = labelOpts.boxHeight, - boxHeight = _labelOpts$boxHeight === void 0 ? fontSize : _labelOpts$boxHeight, - _labelOpts$boxWidth = labelOpts.boxWidth, - boxWidth = _labelOpts$boxWidth === void 0 ? fontSize : _labelOpts$boxWidth; - + boxHeight = _labelOpts$boxHeight === void 0 ? fontSize : _labelOpts$boxHeight, + _labelOpts$boxWidth = labelOpts.boxWidth, + boxWidth = _labelOpts$boxWidth === void 0 ? fontSize : _labelOpts$boxWidth; if (labelOpts.usePointStyle) { boxHeight = Math.min(boxHeight, fontSize); - boxWidth = Math.min(boxWidth, fontSize); + boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize); } - return { boxWidth: boxWidth, boxHeight: boxHeight, itemHeight: Math.max(fontSize, boxHeight) }; }; - var itemsEqual = function itemsEqual(a, b) { return a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index; }; - var Legend = /*#__PURE__*/function (_Element6) { - _inherits(Legend, _Element6); - - var _super16 = _createSuper(Legend); - + _inherits$w(Legend, _Element6); + var _super16 = _createSuper$w(Legend); function Legend(config) { - var _this10; - - _classCallCheck(this, Legend); - - _this10 = _super16.call(this); - _this10._added = false; - _this10.legendHitBoxes = []; - _this10._hoveredItem = null; - _this10.doughnutMode = false; - _this10.chart = config.chart; - _this10.options = config.options; - _this10.ctx = config.ctx; - _this10.legendItems = undefined; - _this10.columnSizes = undefined; - _this10.lineWidths = undefined; - _this10.maxHeight = undefined; - _this10.maxWidth = undefined; - _this10.top = undefined; - _this10.bottom = undefined; - _this10.left = undefined; - _this10.right = undefined; - _this10.height = undefined; - _this10.width = undefined; - _this10._margins = undefined; - _this10.position = undefined; - _this10.weight = undefined; - _this10.fullSize = undefined; - return _this10; + var _this27; + _classCallCheck$x(this, Legend); + _this27 = _super16.call(this); + _this27._added = false; + _this27.legendHitBoxes = []; + _this27._hoveredItem = null; + _this27.doughnutMode = false; + _this27.chart = config.chart; + _this27.options = config.options; + _this27.ctx = config.ctx; + _this27.legendItems = undefined; + _this27.columnSizes = undefined; + _this27.lineWidths = undefined; + _this27.maxHeight = undefined; + _this27.maxWidth = undefined; + _this27.top = undefined; + _this27.bottom = undefined; + _this27.left = undefined; + _this27.right = undefined; + _this27.height = undefined; + _this27.width = undefined; + _this27._margins = undefined; + _this27.position = undefined; + _this27.weight = undefined; + _this27.fullSize = undefined; + return _this27; } - - _createClass(Legend, [{ + _createClass$x(Legend, [{ key: "update", value: function update(maxWidth, maxHeight, margins) { - var me = this; - me.maxWidth = maxWidth; - me.maxHeight = maxHeight; - me._margins = margins; - me.setDimensions(); - me.buildLabels(); - me.fit(); + this.maxWidth = maxWidth; + this.maxHeight = maxHeight; + this._margins = margins; + this.setDimensions(); + this.buildLabels(); + this.fit(); } }, { key: "setDimensions", value: function setDimensions() { - var me = this; - - if (me.isHorizontal()) { - me.width = me.maxWidth; - me.left = 0; - me.right = me.width; + if (this.isHorizontal()) { + this.width = this.maxWidth; + this.left = this._margins.left; + this.right = this.width; } else { - me.height = me.maxHeight; - me.top = 0; - me.bottom = me.height; + this.height = this.maxHeight; + this.top = this._margins.top; + this.bottom = this.height; } } }, { key: "buildLabels", value: function buildLabels() { - var me = this; - var labelOpts = me.options.labels || {}; - var legendItems = callback(labelOpts.generateLabels, [me.chart], me) || []; - + var _this28 = this; + var labelOpts = this.options.labels || {}; + var legendItems = callback(labelOpts.generateLabels, [this.chart], this) || []; if (labelOpts.filter) { legendItems = legendItems.filter(function (item) { - return labelOpts.filter(item, me.chart.data); + return labelOpts.filter(item, _this28.chart.data); }); } - if (labelOpts.sort) { legendItems = legendItems.sort(function (a, b) { - return labelOpts.sort(a, b, me.chart.data); + return labelOpts.sort(a, b, _this28.chart.data); }); } - - if (me.options.reverse) { + if (this.options.reverse) { legendItems.reverse(); } - - me.legendItems = legendItems; + this.legendItems = legendItems; } }, { key: "fit", value: function fit() { - var me = this; - var options = me.options, - ctx = me.ctx; - + var options = this.options, + ctx = this.ctx; if (!options.display) { - me.width = me.height = 0; + this.width = this.height = 0; return; } - var labelOpts = options.labels; var labelFont = toFont(labelOpts.font); var fontSize = labelFont.size; - - var titleHeight = me._computeTitleHeight(); - + var titleHeight = this._computeTitleHeight(); var _getBoxSize = getBoxSize(labelOpts, fontSize), - boxWidth = _getBoxSize.boxWidth, - itemHeight = _getBoxSize.itemHeight; - + boxWidth = _getBoxSize.boxWidth, + itemHeight = _getBoxSize.itemHeight; var width, height; ctx.font = labelFont.string; - - if (me.isHorizontal()) { - width = me.maxWidth; - height = me._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10; + if (this.isHorizontal()) { + width = this.maxWidth; + height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10; } else { - height = me.maxHeight; - width = me._fitCols(titleHeight, fontSize, boxWidth, itemHeight) + 10; + height = this.maxHeight; + width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10; } - - me.width = Math.min(width, options.maxWidth || me.maxWidth); - me.height = Math.min(height, options.maxHeight || me.maxHeight); + this.width = Math.min(width, options.maxWidth || this.maxWidth); + this.height = Math.min(height, options.maxHeight || this.maxHeight); } }, { key: "_fitRows", value: function _fitRows(titleHeight, fontSize, boxWidth, itemHeight) { - var me = this; - var ctx = me.ctx, - maxWidth = me.maxWidth, - padding = me.options.labels.padding; - var hitboxes = me.legendHitBoxes = []; - var lineWidths = me.lineWidths = [0]; + var ctx = this.ctx, + maxWidth = this.maxWidth, + padding = this.options.labels.padding; + var hitboxes = this.legendHitBoxes = []; + var lineWidths = this.lineWidths = [0]; var lineHeight = itemHeight + padding; var totalHeight = titleHeight; ctx.textAlign = 'left'; ctx.textBaseline = 'middle'; var row = -1; var top = -lineHeight; - me.legendItems.forEach(function (legendItem, i) { + this.legendItems.forEach(function (legendItem, i) { var itemWidth = boxWidth + fontSize / 2 + ctx.measureText(legendItem.text).width; - if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) { totalHeight += lineHeight; lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0; top += lineHeight; row++; } - hitboxes[i] = { left: 0, top: top, row: row, width: itemWidth, @@ -13546,49 +13431,45 @@ }); return totalHeight; } }, { key: "_fitCols", - value: function _fitCols(titleHeight, fontSize, boxWidth, itemHeight) { - var me = this; - var ctx = me.ctx, - maxHeight = me.maxHeight, - padding = me.options.labels.padding; - var hitboxes = me.legendHitBoxes = []; - var columnSizes = me.columnSizes = []; + value: function _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) { + var ctx = this.ctx, + maxHeight = this.maxHeight, + padding = this.options.labels.padding; + var hitboxes = this.legendHitBoxes = []; + var columnSizes = this.columnSizes = []; var heightLimit = maxHeight - titleHeight; var totalWidth = padding; var currentColWidth = 0; var currentColHeight = 0; var left = 0; - var top = 0; var col = 0; - me.legendItems.forEach(function (legendItem, i) { - var itemWidth = boxWidth + fontSize / 2 + ctx.measureText(legendItem.text).width; - - if (i > 0 && currentColHeight + fontSize + 2 * padding > heightLimit) { + this.legendItems.forEach(function (legendItem, i) { + var _calculateItemSize = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight), + itemWidth = _calculateItemSize.itemWidth, + itemHeight = _calculateItemSize.itemHeight; + if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) { totalWidth += currentColWidth + padding; columnSizes.push({ width: currentColWidth, height: currentColHeight }); left += currentColWidth + padding; col++; - top = 0; currentColWidth = currentColHeight = 0; } - - currentColWidth = Math.max(currentColWidth, itemWidth); - currentColHeight += fontSize + padding; hitboxes[i] = { left: left, - top: top, + top: currentColHeight, col: col, width: itemWidth, height: itemHeight }; - top += itemHeight + padding; + currentColWidth = Math.max(currentColWidth, itemWidth); + currentColHeight += itemHeight + padding; }); totalWidth += currentColWidth; columnSizes.push({ width: currentColWidth, height: currentColHeight @@ -13596,74 +13477,62 @@ return totalWidth; } }, { key: "adjustHitBoxes", value: function adjustHitBoxes() { - var me = this; - - if (!me.options.display) { + if (!this.options.display) { return; } - - var titleHeight = me._computeTitleHeight(); - - var hitboxes = me.legendHitBoxes, - _me$options6 = me.options, - align = _me$options6.align, - padding = _me$options6.labels.padding; - + var titleHeight = this._computeTitleHeight(); + var hitboxes = this.legendHitBoxes, + _this$options15 = this.options, + align = _this$options15.align, + padding = _this$options15.labels.padding, + rtl = _this$options15.rtl; + var rtlHelper = getRtlAdapter(rtl, this.left, this.width); if (this.isHorizontal()) { var row = 0; - - var left = _alignStartEnd(align, me.left + padding, me.right - me.lineWidths[row]); - - var _iterator6 = _createForOfIteratorHelper(hitboxes), - _step6; - + var left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]); + var _iterator23 = _createForOfIteratorHelper$1(hitboxes), + _step23; try { - for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) { - var hitbox = _step6.value; - + for (_iterator23.s(); !(_step23 = _iterator23.n()).done;) { + var hitbox = _step23.value; if (row !== hitbox.row) { row = hitbox.row; - left = _alignStartEnd(align, me.left + padding, me.right - me.lineWidths[row]); + left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]); } - - hitbox.top += me.top + titleHeight + padding; - hitbox.left = left; + hitbox.top += this.top + titleHeight + padding; + hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width); left += hitbox.width + padding; } } catch (err) { - _iterator6.e(err); + _iterator23.e(err); } finally { - _iterator6.f(); + _iterator23.f(); } } else { var col = 0; - - var top = _alignStartEnd(align, me.top + titleHeight + padding, me.bottom - me.columnSizes[col].height); - - var _iterator7 = _createForOfIteratorHelper(hitboxes), - _step7; - + var top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height); + var _iterator24 = _createForOfIteratorHelper$1(hitboxes), + _step24; try { - for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) { - var _hitbox = _step7.value; - - if (_hitbox.col !== col) { - col = _hitbox.col; - top = _alignStartEnd(align, me.top + titleHeight + padding, me.bottom - me.columnSizes[col].height); + for (_iterator24.s(); !(_step24 = _iterator24.n()).done;) { + var hitbox1 = _step24.value; + if (hitbox1.col !== col) { + col = hitbox1.col; + top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height); } - - _hitbox.top = top; - _hitbox.left += me.left + padding; - top += _hitbox.height + padding; + hitbox1.top = top; + hitbox1.left += this.left + padding; + hitbox1.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox1.left), hitbox1.width); + top += hitbox1.height + padding; } } catch (err) { - _iterator7.e(err); + _iterator24.e(err); } finally { - _iterator7.f(); + _iterator24.f(); } } } }, { key: "isHorizontal", @@ -13671,184 +13540,178 @@ return this.options.position === 'top' || this.options.position === 'bottom'; } }, { key: "draw", value: function draw() { - var me = this; - - if (me.options.display) { - var ctx = me.ctx; - clipArea(ctx, me); - - me._draw(); - + if (this.options.display) { + var ctx = this.ctx; + clipArea(ctx, this); + this._draw(); unclipArea(ctx); } } }, { key: "_draw", value: function _draw() { - var me = this; - var opts = me.options, - columnSizes = me.columnSizes, - lineWidths = me.lineWidths, - ctx = me.ctx; + var _this29 = this; + var opts = this.options, + columnSizes = this.columnSizes, + lineWidths = this.lineWidths, + ctx = this.ctx; var align = opts.align, - labelOpts = opts.labels; + labelOpts = opts.labels; var defaultColor = defaults.color; - var rtlHelper = getRtlAdapter(opts.rtl, me.left, me.width); + var rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width); var labelFont = toFont(labelOpts.font); - var fontColor = labelOpts.color, - padding = labelOpts.padding; + var padding = labelOpts.padding; var fontSize = labelFont.size; var halfFontSize = fontSize / 2; var cursor; - me.drawTitle(); + this.drawTitle(); ctx.textAlign = rtlHelper.textAlign('left'); ctx.textBaseline = 'middle'; ctx.lineWidth = 0.5; - ctx.strokeStyle = fontColor; - ctx.fillStyle = fontColor; ctx.font = labelFont.string; - var _getBoxSize2 = getBoxSize(labelOpts, fontSize), - boxWidth = _getBoxSize2.boxWidth, - boxHeight = _getBoxSize2.boxHeight, - itemHeight = _getBoxSize2.itemHeight; - + boxWidth = _getBoxSize2.boxWidth, + boxHeight = _getBoxSize2.boxHeight, + itemHeight = _getBoxSize2.itemHeight; var drawLegendBox = function drawLegendBox(x, y, legendItem) { if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) { return; } - ctx.save(); var lineWidth = valueOrDefault(legendItem.lineWidth, 1); ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor); ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt'); ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0); ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter'); ctx.lineWidth = lineWidth; ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor); ctx.setLineDash(valueOrDefault(legendItem.lineDash, [])); - if (labelOpts.usePointStyle) { var drawOptions = { - radius: boxWidth * Math.SQRT2 / 2, + radius: boxHeight * Math.SQRT2 / 2, pointStyle: legendItem.pointStyle, rotation: legendItem.rotation, borderWidth: lineWidth }; var centerX = rtlHelper.xPlus(x, boxWidth / 2); var centerY = y + halfFontSize; - drawPoint(ctx, drawOptions, centerX, centerY); + drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth); } else { var yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0); - ctx.fillRect(rtlHelper.leftForLtr(x, boxWidth), yBoxTop, boxWidth, boxHeight); - + var xBoxLeft = rtlHelper.leftForLtr(x, boxWidth); + var borderRadius = toTRBLCorners(legendItem.borderRadius); + ctx.beginPath(); + if (Object.values(borderRadius).some(function (v) { + return v !== 0; + })) { + addRoundedRectPath(ctx, { + x: xBoxLeft, + y: yBoxTop, + w: boxWidth, + h: boxHeight, + radius: borderRadius + }); + } else { + ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight); + } + ctx.fill(); if (lineWidth !== 0) { - ctx.strokeRect(rtlHelper.leftForLtr(x, boxWidth), yBoxTop, boxWidth, boxHeight); + ctx.stroke(); } } - ctx.restore(); }; - var fillText = function fillText(x, y, legendItem) { renderText(ctx, legendItem.text, x, y + itemHeight / 2, labelFont, { strikethrough: legendItem.hidden, - textAlign: legendItem.textAlign + textAlign: rtlHelper.textAlign(legendItem.textAlign) }); }; - - var isHorizontal = me.isHorizontal(); - + var isHorizontal = this.isHorizontal(); var titleHeight = this._computeTitleHeight(); - if (isHorizontal) { cursor = { - x: _alignStartEnd(align, me.left + padding, me.right - lineWidths[0]), - y: me.top + padding + titleHeight, + x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]), + y: this.top + padding + titleHeight, line: 0 }; } else { cursor = { - x: me.left + padding, - y: _alignStartEnd(align, me.top + titleHeight + padding, me.bottom - columnSizes[0].height), + x: this.left + padding, + y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height), line: 0 }; } - - overrideTextDirection(me.ctx, opts.textDirection); + overrideTextDirection(this.ctx, opts.textDirection); var lineHeight = itemHeight + padding; - me.legendItems.forEach(function (legendItem, i) { + this.legendItems.forEach(function (legendItem, i) { + ctx.strokeStyle = legendItem.fontColor; + ctx.fillStyle = legendItem.fontColor; var textWidth = ctx.measureText(legendItem.text).width; var textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign)); - var width = boxWidth + fontSize / 2 + textWidth; + var width = boxWidth + halfFontSize + textWidth; var x = cursor.x; var y = cursor.y; - rtlHelper.setWidth(me.width); - + rtlHelper.setWidth(_this29.width); if (isHorizontal) { - if (i > 0 && x + width + padding > me.right) { + if (i > 0 && x + width + padding > _this29.right) { y = cursor.y += lineHeight; cursor.line++; - x = cursor.x = _alignStartEnd(align, me.left + padding, me.right - lineWidths[cursor.line]); + x = cursor.x = _alignStartEnd(align, _this29.left + padding, _this29.right - lineWidths[cursor.line]); } - } else if (i > 0 && y + lineHeight > me.bottom) { + } else if (i > 0 && y + lineHeight > _this29.bottom) { x = cursor.x = x + columnSizes[cursor.line].width + padding; cursor.line++; - y = cursor.y = _alignStartEnd(align, me.top + titleHeight + padding, me.bottom - columnSizes[cursor.line].height); + y = cursor.y = _alignStartEnd(align, _this29.top + titleHeight + padding, _this29.bottom - columnSizes[cursor.line].height); } - var realX = rtlHelper.x(x); drawLegendBox(realX, y, legendItem); - x = _textX(textAlign, x + boxWidth + halfFontSize, me.right); + x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : _this29.right, opts.rtl); fillText(rtlHelper.x(x), y, legendItem); - if (isHorizontal) { cursor.x += width + padding; + } else if (typeof legendItem.text !== 'string') { + var fontLineHeight = labelFont.lineHeight; + cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight); } else { cursor.y += lineHeight; } }); - restoreTextDirection(me.ctx, opts.textDirection); + restoreTextDirection(this.ctx, opts.textDirection); } }, { key: "drawTitle", value: function drawTitle() { - var me = this; - var opts = me.options; + var opts = this.options; var titleOpts = opts.title; var titleFont = toFont(titleOpts.font); var titlePadding = toPadding(titleOpts.padding); - if (!titleOpts.display) { return; } - - var rtlHelper = getRtlAdapter(opts.rtl, me.left, me.width); - var ctx = me.ctx; + var rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width); + var ctx = this.ctx; var position = titleOpts.position; var halfFontSize = titleFont.size / 2; var topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize; var y; - var left = me.left; - var maxWidth = me.width; - + var left = this.left; + var maxWidth = this.width; if (this.isHorizontal()) { - maxWidth = Math.max.apply(Math, _toConsumableArray(me.lineWidths)); - y = me.top + topPaddingPlusHalfFontSize; - left = _alignStartEnd(opts.align, left, me.right - maxWidth); + maxWidth = Math.max.apply(Math, _toConsumableArray(this.lineWidths)); + y = this.top + topPaddingPlusHalfFontSize; + left = _alignStartEnd(opts.align, left, this.right - maxWidth); } else { - var maxHeight = me.columnSizes.reduce(function (acc, size) { + var maxHeight = this.columnSizes.reduce(function (acc, size) { return Math.max(acc, size.height); }, 0); - y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, me.top, me.bottom - maxHeight - opts.labels.padding - me._computeTitleHeight()); + y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight()); } - var x = _alignStartEnd(position, left, left + maxWidth); - ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position)); ctx.textBaseline = 'middle'; ctx.strokeStyle = titleOpts.color; ctx.fillStyle = titleOpts.color; ctx.font = titleFont.string; @@ -13863,73 +13726,84 @@ return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0; } }, { key: "_getLegendItemAt", value: function _getLegendItemAt(x, y) { - var me = this; var i, hitBox, lh; - - if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) { - lh = me.legendHitBoxes; - + if (_isBetween(x, this.left, this.right) && _isBetween(y, this.top, this.bottom)) { + lh = this.legendHitBoxes; for (i = 0; i < lh.length; ++i) { hitBox = lh[i]; - - if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) { - return me.legendItems[i]; + if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width) && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) { + return this.legendItems[i]; } } } - return null; } }, { key: "handleEvent", value: function handleEvent(e) { - var me = this; - var opts = me.options; - + var opts = this.options; if (!isListened(e.type, opts)) { return; } - - var hoveredItem = me._getLegendItemAt(e.x, e.y); - - if (e.type === 'mousemove') { - var previous = me._hoveredItem; + var hoveredItem = this._getLegendItemAt(e.x, e.y); + if (e.type === 'mousemove' || e.type === 'mouseout') { + var previous = this._hoveredItem; var sameItem = itemsEqual(previous, hoveredItem); - if (previous && !sameItem) { - callback(opts.onLeave, [e, previous, me], me); + callback(opts.onLeave, [e, previous, this], this); } - - me._hoveredItem = hoveredItem; - + this._hoveredItem = hoveredItem; if (hoveredItem && !sameItem) { - callback(opts.onHover, [e, hoveredItem, me], me); + callback(opts.onHover, [e, hoveredItem, this], this); } } else if (hoveredItem) { - callback(opts.onClick, [e, hoveredItem, me], me); + callback(opts.onClick, [e, hoveredItem, this], this); } } }]); - return Legend; }(Element); - + function calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) { + var itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx); + var itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight); + return { + itemWidth: itemWidth, + itemHeight: itemHeight + }; + } + function calculateItemWidth(legendItem, boxWidth, labelFont, ctx) { + var legendItemText = legendItem.text; + if (legendItemText && typeof legendItemText !== 'string') { + legendItemText = legendItemText.reduce(function (a, b) { + return a.length > b.length ? a : b; + }); + } + return boxWidth + labelFont.size / 2 + ctx.measureText(legendItemText).width; + } + function calculateItemHeight(_itemHeight, legendItem, fontLineHeight) { + var itemHeight = _itemHeight; + if (typeof legendItem.text !== 'string') { + itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight); + } + return itemHeight; + } + function calculateLegendItemHeight(legendItem, fontLineHeight) { + var labelHeight = legendItem.text ? legendItem.text.length + 0.5 : 0; + return fontLineHeight * labelHeight; + } function isListened(type, opts) { - if (type === 'mousemove' && (opts.onHover || opts.onLeave)) { + if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) { return true; } - if (opts.onClick && (type === 'click' || type === 'mouseup')) { return true; } - return false; } - var plugin_legend = { id: 'legend', _element: Legend, start: function start(chart, _args, options) { var legend = chart.legend = new Legend({ @@ -13967,11 +13841,10 @@ reverse: false, weight: 1000, onClick: function onClick(e, legendItem, legend) { var index = legendItem.datasetIndex; var ci = legend.chart; - if (ci.isDatasetVisible(index)) { ci.hide(index); legendItem.hidden = true; } else { ci.show(index); @@ -13987,29 +13860,34 @@ boxWidth: 40, padding: 10, generateLabels: function generateLabels(chart) { var datasets = chart.data.datasets; var _chart$legend$options = chart.legend.options.labels, - usePointStyle = _chart$legend$options.usePointStyle, - pointStyle = _chart$legend$options.pointStyle, - textAlign = _chart$legend$options.textAlign; + usePointStyle = _chart$legend$options.usePointStyle, + pointStyle = _chart$legend$options.pointStyle, + textAlign = _chart$legend$options.textAlign, + color = _chart$legend$options.color, + useBorderRadius = _chart$legend$options.useBorderRadius, + borderRadius = _chart$legend$options.borderRadius; return chart._getSortedDatasetMetas().map(function (meta) { var style = meta.controller.getStyle(usePointStyle ? 0 : undefined); var borderWidth = toPadding(style.borderWidth); return { text: datasets[meta.index].label, fillStyle: style.backgroundColor, + fontColor: color, hidden: !meta.visible, lineCap: style.borderCapStyle, lineDash: style.borderDash, lineDashOffset: style.borderDashOffset, lineJoin: style.borderJoinStyle, lineWidth: (borderWidth.width + borderWidth.height) / 4, strokeStyle: style.borderColor, pointStyle: pointStyle || style.pointStyle, rotation: style.rotation, textAlign: textAlign || style.textAlign, + borderRadius: useBorderRadius && (borderRadius || style.borderRadius), datasetIndex: meta.index }; }, this); } }, @@ -14031,62 +13909,51 @@ return !['generateLabels', 'filter', 'sort'].includes(name); } } } }; - var Title = /*#__PURE__*/function (_Element7) { - _inherits(Title, _Element7); - - var _super17 = _createSuper(Title); - + _inherits$w(Title, _Element7); + var _super17 = _createSuper$w(Title); function Title(config) { - var _this11; - - _classCallCheck(this, Title); - - _this11 = _super17.call(this); - _this11.chart = config.chart; - _this11.options = config.options; - _this11.ctx = config.ctx; - _this11._padding = undefined; - _this11.top = undefined; - _this11.bottom = undefined; - _this11.left = undefined; - _this11.right = undefined; - _this11.width = undefined; - _this11.height = undefined; - _this11.position = undefined; - _this11.weight = undefined; - _this11.fullSize = undefined; - return _this11; + var _this30; + _classCallCheck$x(this, Title); + _this30 = _super17.call(this); + _this30.chart = config.chart; + _this30.options = config.options; + _this30.ctx = config.ctx; + _this30._padding = undefined; + _this30.top = undefined; + _this30.bottom = undefined; + _this30.left = undefined; + _this30.right = undefined; + _this30.width = undefined; + _this30.height = undefined; + _this30.position = undefined; + _this30.weight = undefined; + _this30.fullSize = undefined; + return _this30; } - - _createClass(Title, [{ + _createClass$x(Title, [{ key: "update", value: function update(maxWidth, maxHeight) { - var me = this; - var opts = me.options; - me.left = 0; - me.top = 0; - + var opts = this.options; + this.left = 0; + this.top = 0; if (!opts.display) { - me.width = me.height = me.right = me.bottom = 0; + this.width = this.height = this.right = this.bottom = 0; return; } - - me.width = me.right = maxWidth; - me.height = me.bottom = maxHeight; + this.width = this.right = maxWidth; + this.height = this.bottom = maxHeight; var lineCount = isArray(opts.text) ? opts.text.length : 1; - me._padding = toPadding(opts.padding); - - var textSize = lineCount * toFont(opts.font).lineHeight + me._padding.height; - - if (me.isHorizontal()) { - me.height = textSize; + this._padding = toPadding(opts.padding); + var textSize = lineCount * toFont(opts.font).lineHeight + this._padding.height; + if (this.isHorizontal()) { + this.height = textSize; } else { - me.width = textSize; + this.width = textSize; } } }, { key: "isHorizontal", value: function isHorizontal() { @@ -14095,18 +13962,17 @@ } }, { key: "_drawArgs", value: function _drawArgs(offset) { var top = this.top, - left = this.left, - bottom = this.bottom, - right = this.right, - options = this.options; + left = this.left, + bottom = this.bottom, + right = this.right, + options = this.options; var align = options.align; var rotation = 0; var maxWidth, titleX, titleY; - if (this.isHorizontal()) { titleX = _alignStartEnd(align, left, right); titleY = top + offset; maxWidth = right - left; } else { @@ -14117,67 +13983,57 @@ } else { titleX = right - offset; titleY = _alignStartEnd(align, top, bottom); rotation = PI * 0.5; } - maxWidth = bottom - top; } - return { titleX: titleX, titleY: titleY, maxWidth: maxWidth, rotation: rotation }; } }, { key: "draw", value: function draw() { - var me = this; - var ctx = me.ctx; - var opts = me.options; - + var ctx = this.ctx; + var opts = this.options; if (!opts.display) { return; } - var fontOpts = toFont(opts.font); var lineHeight = fontOpts.lineHeight; - var offset = lineHeight / 2 + me._padding.top; - - var _me$_drawArgs = me._drawArgs(offset), - titleX = _me$_drawArgs.titleX, - titleY = _me$_drawArgs.titleY, - maxWidth = _me$_drawArgs.maxWidth, - rotation = _me$_drawArgs.rotation; - + var offset = lineHeight / 2 + this._padding.top; + var _this$_drawArgs = this._drawArgs(offset), + titleX = _this$_drawArgs.titleX, + titleY = _this$_drawArgs.titleY, + maxWidth = _this$_drawArgs.maxWidth, + rotation = _this$_drawArgs.rotation; renderText(ctx, opts.text, 0, 0, fontOpts, { color: opts.color, maxWidth: maxWidth, rotation: rotation, textAlign: _toLeftRightCenter(opts.align), textBaseline: 'middle', translation: [titleX, titleY] }); } }]); - return Title; }(Element); - function createTitle(chart, titleOpts) { var title = new Title({ ctx: chart.ctx, options: titleOpts, chart: chart }); layouts.configure(chart, title, titleOpts); layouts.addBox(chart, title); chart.titleBlock = title; } - var plugin_title = { id: 'title', _element: Title, start: function start(chart, _args, options) { createTitle(chart, options); @@ -14194,11 +14050,11 @@ }, defaults: { align: 'center', display: false, font: { - style: 'bold' + weight: 'bold' }, fullSize: true, padding: 10, position: 'top', text: '', @@ -14210,100 +14066,129 @@ descriptors: { _scriptable: true, _indexable: false } }; + var map = new WeakMap(); + var plugin_subtitle = { + id: 'subtitle', + start: function start(chart, _args, options) { + var title = new Title({ + ctx: chart.ctx, + options: options, + chart: chart + }); + layouts.configure(chart, title, options); + layouts.addBox(chart, title); + map.set(chart, title); + }, + stop: function stop(chart) { + layouts.removeBox(chart, map.get(chart)); + map["delete"](chart); + }, + beforeUpdate: function beforeUpdate(chart, _args, options) { + var title = map.get(chart); + layouts.configure(chart, title, options); + title.options = options; + }, + defaults: { + align: 'center', + display: false, + font: { + weight: 'normal' + }, + fullSize: true, + padding: 0, + position: 'top', + text: '', + weight: 1500 + }, + defaultRoutes: { + color: 'color' + }, + descriptors: { + _scriptable: true, + _indexable: false + } + }; var positioners = { average: function average(items) { if (!items.length) { return false; } - var i, len; var x = 0; var y = 0; var count = 0; - for (i = 0, len = items.length; i < len; ++i) { var el = items[i].element; - if (el && el.hasValue()) { var pos = el.tooltipPosition(); x += pos.x; y += pos.y; ++count; } } - return { x: x / count, y: y / count }; }, nearest: function nearest(items, eventPosition) { + if (!items.length) { + return false; + } var x = eventPosition.x; var y = eventPosition.y; var minDistance = Number.POSITIVE_INFINITY; var i, len, nearestElement; - for (i = 0, len = items.length; i < len; ++i) { var el = items[i].element; - if (el && el.hasValue()) { var center = el.getCenterPoint(); var d = distanceBetweenPoints(eventPosition, center); - if (d < minDistance) { minDistance = d; nearestElement = el; } } } - if (nearestElement) { var tp = nearestElement.tooltipPosition(); x = tp.x; y = tp.y; } - return { x: x, y: y }; } }; - function pushOrConcat(base, toPush) { if (toPush) { if (isArray(toPush)) { Array.prototype.push.apply(base, toPush); } else { base.push(toPush); } } - return base; } - function splitNewlines(str) { if ((typeof str === 'string' || str instanceof String) && str.indexOf('\n') > -1) { return str.split('\n'); } - return str; } - function createTooltipItem(chart, item) { var element = item.element, - datasetIndex = item.datasetIndex, - index = item.index; + datasetIndex = item.datasetIndex, + index = item.index; var controller = chart.getDatasetMeta(datasetIndex).controller; - var _controller$getLabelA = controller.getLabelAndValue(index), - label = _controller$getLabelA.label, - value = _controller$getLabelA.value; - + label = _controller$getLabelA.label, + value = _controller$getLabelA.value; return { chart: chart, label: label, parsed: controller.getParsed(index), raw: chart.data.datasets[datasetIndex].data[index], @@ -14312,18 +14197,17 @@ dataIndex: index, datasetIndex: datasetIndex, element: element }; } - function getTooltipSize(tooltip, options) { - var ctx = tooltip._chart.ctx; + var ctx = tooltip.chart.ctx; var body = tooltip.body, - footer = tooltip.footer, - title = tooltip.title; + footer = tooltip.footer, + title = tooltip.title; var boxWidth = options.boxWidth, - boxHeight = options.boxHeight; + boxHeight = options.boxHeight; var bodyFont = toFont(options.bodyFont); var titleFont = toFont(options.titleFont); var footerFont = toFont(options.footerFont); var titleLineCount = title.length; var footerLineCount = footer.length; @@ -14333,36 +14217,30 @@ var width = 0; var combinedBodyLength = body.reduce(function (count, bodyItem) { return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length; }, 0); combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length; - if (titleLineCount) { height += titleLineCount * titleFont.lineHeight + (titleLineCount - 1) * options.titleSpacing + options.titleMarginBottom; } - if (combinedBodyLength) { var bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight; height += bodyLineItemCount * bodyLineHeight + (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight + (combinedBodyLength - 1) * options.bodySpacing; } - if (footerLineCount) { height += options.footerMarginTop + footerLineCount * footerFont.lineHeight + (footerLineCount - 1) * options.footerSpacing; } - var widthPadding = 0; - var maxLineWidth = function maxLineWidth(line) { width = Math.max(width, ctx.measureText(line).width + widthPadding); }; - ctx.save(); ctx.font = titleFont.string; each(tooltip.title, maxLineWidth); ctx.font = bodyFont.string; each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth); - widthPadding = options.displayColors ? boxWidth + 2 : 0; + widthPadding = options.displayColors ? boxWidth + 2 + options.boxPadding : 0; each(body, function (bodyItem) { each(bodyItem.before, maxLineWidth); each(bodyItem.lines, maxLineWidth); each(bodyItem.after, maxLineWidth); }); @@ -14374,373 +14252,400 @@ return { width: width, height: height }; } - function determineYAlign(chart, size) { var y = size.y, - height = size.height; - + height = size.height; if (y < height / 2) { return 'top'; } else if (y > chart.height - height / 2) { return 'bottom'; } - return 'center'; } - function doesNotFitWithAlign(xAlign, chart, options, size) { var x = size.x, - width = size.width; + width = size.width; var caret = options.caretSize + options.caretPadding; - if (xAlign === 'left' && x + width + caret > chart.width) { return true; } - if (xAlign === 'right' && x - width - caret < 0) { return true; } } - function determineXAlign(chart, options, size, yAlign) { var x = size.x, - width = size.width; + width = size.width; var chartWidth = chart.width, - _chart$chartArea = chart.chartArea, - left = _chart$chartArea.left, - right = _chart$chartArea.right; + _chart$chartArea = chart.chartArea, + left = _chart$chartArea.left, + right = _chart$chartArea.right; var xAlign = 'center'; - if (yAlign === 'center') { xAlign = x <= (left + right) / 2 ? 'left' : 'right'; } else if (x <= width / 2) { xAlign = 'left'; } else if (x >= chartWidth - width / 2) { xAlign = 'right'; } - if (doesNotFitWithAlign(xAlign, chart, options, size)) { xAlign = 'center'; } - return xAlign; } - function determineAlignment(chart, options, size) { - var yAlign = options.yAlign || determineYAlign(chart, size); + var yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size); return { - xAlign: options.xAlign || determineXAlign(chart, options, size, yAlign), + xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign), yAlign: yAlign }; } - function alignX(size, xAlign) { var x = size.x, - width = size.width; - + width = size.width; if (xAlign === 'right') { x -= width; } else if (xAlign === 'center') { x -= width / 2; } - return x; } - function alignY(size, yAlign, paddingAndSize) { var y = size.y, - height = size.height; - + height = size.height; if (yAlign === 'top') { y += paddingAndSize; } else if (yAlign === 'bottom') { y -= height + paddingAndSize; } else { y -= height / 2; } - return y; } - function getBackgroundPoint(options, size, alignment, chart) { var caretSize = options.caretSize, - caretPadding = options.caretPadding, - cornerRadius = options.cornerRadius; + caretPadding = options.caretPadding, + cornerRadius = options.cornerRadius; var xAlign = alignment.xAlign, - yAlign = alignment.yAlign; + yAlign = alignment.yAlign; var paddingAndSize = caretSize + caretPadding; - var radiusAndPadding = cornerRadius + caretPadding; + var _toTRBLCorners = toTRBLCorners(cornerRadius), + topLeft = _toTRBLCorners.topLeft, + topRight = _toTRBLCorners.topRight, + bottomLeft = _toTRBLCorners.bottomLeft, + bottomRight = _toTRBLCorners.bottomRight; var x = alignX(size, xAlign); var y = alignY(size, yAlign, paddingAndSize); - if (yAlign === 'center') { if (xAlign === 'left') { x += paddingAndSize; } else if (xAlign === 'right') { x -= paddingAndSize; } } else if (xAlign === 'left') { - x -= radiusAndPadding; + x -= Math.max(topLeft, bottomLeft) + caretSize; } else if (xAlign === 'right') { - x += radiusAndPadding; + x += Math.max(topRight, bottomRight) + caretSize; } - return { x: _limitValue(x, 0, chart.width - size.width), y: _limitValue(y, 0, chart.height - size.height) }; } - function getAlignedX(tooltip, align, options) { var padding = toPadding(options.padding); return align === 'center' ? tooltip.x + tooltip.width / 2 : align === 'right' ? tooltip.x + tooltip.width - padding.right : tooltip.x + padding.left; } - function getBeforeAfterBodyLines(callback) { return pushOrConcat([], splitNewlines(callback)); } - function createTooltipContext(parent, tooltip, tooltipItems) { - return Object.assign(Object.create(parent), { + return createContext(parent, { tooltip: tooltip, tooltipItems: tooltipItems, type: 'tooltip' }); } - function overrideCallbacks(callbacks, context) { var override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks; return override ? callbacks.override(override) : callbacks; } - + var defaultCallbacks = { + beforeTitle: noop, + title: function title(tooltipItems) { + if (tooltipItems.length > 0) { + var item = tooltipItems[0]; + var labels = item.chart.data.labels; + var labelCount = labels ? labels.length : 0; + if (this && this.options && this.options.mode === 'dataset') { + return item.dataset.label || ''; + } else if (item.label) { + return item.label; + } else if (labelCount > 0 && item.dataIndex < labelCount) { + return labels[item.dataIndex]; + } + } + return ''; + }, + afterTitle: noop, + beforeBody: noop, + beforeLabel: noop, + label: function label(tooltipItem) { + if (this && this.options && this.options.mode === 'dataset') { + return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue; + } + var label = tooltipItem.dataset.label || ''; + if (label) { + label += ': '; + } + var value = tooltipItem.formattedValue; + if (!isNullOrUndef(value)) { + label += value; + } + return label; + }, + labelColor: function labelColor(tooltipItem) { + var meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex); + var options = meta.controller.getStyle(tooltipItem.dataIndex); + return { + borderColor: options.borderColor, + backgroundColor: options.backgroundColor, + borderWidth: options.borderWidth, + borderDash: options.borderDash, + borderDashOffset: options.borderDashOffset, + borderRadius: 0 + }; + }, + labelTextColor: function labelTextColor() { + return this.options.bodyColor; + }, + labelPointStyle: function labelPointStyle(tooltipItem) { + var meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex); + var options = meta.controller.getStyle(tooltipItem.dataIndex); + return { + pointStyle: options.pointStyle, + rotation: options.rotation + }; + }, + afterLabel: noop, + afterBody: noop, + beforeFooter: noop, + footer: noop, + afterFooter: noop + }; + function invokeCallbackWithFallback(callbacks, name, ctx, arg) { + var result = callbacks[name].call(ctx, arg); + if (typeof result === 'undefined') { + return defaultCallbacks[name].call(ctx, arg); + } + return result; + } var Tooltip = /*#__PURE__*/function (_Element8) { - _inherits(Tooltip, _Element8); - - var _super18 = _createSuper(Tooltip); - + _inherits$w(Tooltip, _Element8); + var _super18 = _createSuper$w(Tooltip); function Tooltip(config) { - var _this12; - - _classCallCheck(this, Tooltip); - - _this12 = _super18.call(this); - _this12.opacity = 0; - _this12._active = []; - _this12._chart = config._chart; - _this12._eventPosition = undefined; - _this12._size = undefined; - _this12._cachedAnimations = undefined; - _this12._tooltipItems = []; - _this12.$animations = undefined; - _this12.$context = undefined; - _this12.options = config.options; - _this12.dataPoints = undefined; - _this12.title = undefined; - _this12.beforeBody = undefined; - _this12.body = undefined; - _this12.afterBody = undefined; - _this12.footer = undefined; - _this12.xAlign = undefined; - _this12.yAlign = undefined; - _this12.x = undefined; - _this12.y = undefined; - _this12.height = undefined; - _this12.width = undefined; - _this12.caretX = undefined; - _this12.caretY = undefined; - _this12.labelColors = undefined; - _this12.labelPointStyles = undefined; - _this12.labelTextColors = undefined; - return _this12; + var _this31; + _classCallCheck$x(this, Tooltip); + _this31 = _super18.call(this); + _this31.opacity = 0; + _this31._active = []; + _this31._eventPosition = undefined; + _this31._size = undefined; + _this31._cachedAnimations = undefined; + _this31._tooltipItems = []; + _this31.$animations = undefined; + _this31.$context = undefined; + _this31.chart = config.chart; + _this31.options = config.options; + _this31.dataPoints = undefined; + _this31.title = undefined; + _this31.beforeBody = undefined; + _this31.body = undefined; + _this31.afterBody = undefined; + _this31.footer = undefined; + _this31.xAlign = undefined; + _this31.yAlign = undefined; + _this31.x = undefined; + _this31.y = undefined; + _this31.height = undefined; + _this31.width = undefined; + _this31.caretX = undefined; + _this31.caretY = undefined; + _this31.labelColors = undefined; + _this31.labelPointStyles = undefined; + _this31.labelTextColors = undefined; + return _this31; } - - _createClass(Tooltip, [{ + _createClass$x(Tooltip, [{ key: "initialize", value: function initialize(options) { this.options = options; this._cachedAnimations = undefined; this.$context = undefined; } }, { key: "_resolveAnimations", value: function _resolveAnimations() { - var me = this; - var cached = me._cachedAnimations; - + var cached = this._cachedAnimations; if (cached) { return cached; } - - var chart = me._chart; - var options = me.options.setContext(me.getContext()); + var chart = this.chart; + var options = this.options.setContext(this.getContext()); var opts = options.enabled && chart.options.animation && options.animations; - var animations = new Animations(me._chart, opts); - + var animations = new Animations(this.chart, opts); if (opts._cacheable) { - me._cachedAnimations = Object.freeze(animations); + this._cachedAnimations = Object.freeze(animations); } - return animations; } }, { key: "getContext", value: function getContext() { - var me = this; - return me.$context || (me.$context = createTooltipContext(me._chart.getContext(), me, me._tooltipItems)); + return this.$context || (this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems)); } }, { key: "getTitle", value: function getTitle(context, options) { - var me = this; var callbacks = options.callbacks; - var beforeTitle = callbacks.beforeTitle.apply(me, [context]); - var title = callbacks.title.apply(me, [context]); - var afterTitle = callbacks.afterTitle.apply(me, [context]); + var beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context); + var title = invokeCallbackWithFallback(callbacks, 'title', this, context); + var afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context); var lines = []; lines = pushOrConcat(lines, splitNewlines(beforeTitle)); lines = pushOrConcat(lines, splitNewlines(title)); lines = pushOrConcat(lines, splitNewlines(afterTitle)); return lines; } }, { key: "getBeforeBody", value: function getBeforeBody(tooltipItems, options) { - return getBeforeAfterBodyLines(options.callbacks.beforeBody.apply(this, [tooltipItems])); + return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems)); } }, { key: "getBody", value: function getBody(tooltipItems, options) { - var me = this; + var _this32 = this; var callbacks = options.callbacks; var bodyItems = []; each(tooltipItems, function (context) { var bodyItem = { before: [], lines: [], after: [] }; var scoped = overrideCallbacks(callbacks, context); - pushOrConcat(bodyItem.before, splitNewlines(scoped.beforeLabel.call(me, context))); - pushOrConcat(bodyItem.lines, scoped.label.call(me, context)); - pushOrConcat(bodyItem.after, splitNewlines(scoped.afterLabel.call(me, context))); + pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, 'beforeLabel', _this32, context))); + pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', _this32, context)); + pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', _this32, context))); bodyItems.push(bodyItem); }); return bodyItems; } }, { key: "getAfterBody", value: function getAfterBody(tooltipItems, options) { - return getBeforeAfterBodyLines(options.callbacks.afterBody.apply(this, [tooltipItems])); + return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems)); } }, { key: "getFooter", value: function getFooter(tooltipItems, options) { - var me = this; var callbacks = options.callbacks; - var beforeFooter = callbacks.beforeFooter.apply(me, [tooltipItems]); - var footer = callbacks.footer.apply(me, [tooltipItems]); - var afterFooter = callbacks.afterFooter.apply(me, [tooltipItems]); + var beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems); + var footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems); + var afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems); var lines = []; lines = pushOrConcat(lines, splitNewlines(beforeFooter)); lines = pushOrConcat(lines, splitNewlines(footer)); lines = pushOrConcat(lines, splitNewlines(afterFooter)); return lines; } }, { key: "_createItems", value: function _createItems(options) { - var me = this; - var active = me._active; - var data = me._chart.data; + var _this33 = this; + var active = this._active; + var data = this.chart.data; var labelColors = []; var labelPointStyles = []; var labelTextColors = []; var tooltipItems = []; var i, len; - for (i = 0, len = active.length; i < len; ++i) { - tooltipItems.push(createTooltipItem(me._chart, active[i])); + tooltipItems.push(createTooltipItem(this.chart, active[i])); } - if (options.filter) { tooltipItems = tooltipItems.filter(function (element, index, array) { return options.filter(element, index, array, data); }); } - if (options.itemSort) { tooltipItems = tooltipItems.sort(function (a, b) { return options.itemSort(a, b, data); }); } - each(tooltipItems, function (context) { var scoped = overrideCallbacks(options.callbacks, context); - labelColors.push(scoped.labelColor.call(me, context)); - labelPointStyles.push(scoped.labelPointStyle.call(me, context)); - labelTextColors.push(scoped.labelTextColor.call(me, context)); + labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', _this33, context)); + labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', _this33, context)); + labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', _this33, context)); }); - me.labelColors = labelColors; - me.labelPointStyles = labelPointStyles; - me.labelTextColors = labelTextColors; - me.dataPoints = tooltipItems; + this.labelColors = labelColors; + this.labelPointStyles = labelPointStyles; + this.labelTextColors = labelTextColors; + this.dataPoints = tooltipItems; return tooltipItems; } }, { key: "update", value: function update(changed, replay) { - var me = this; - var options = me.options.setContext(me.getContext()); - var active = me._active; + var options = this.options.setContext(this.getContext()); + var active = this._active; var properties; var tooltipItems = []; - if (!active.length) { - if (me.opacity !== 0) { + if (this.opacity !== 0) { properties = { opacity: 0 }; } } else { - var position = positioners[options.position].call(me, active, me._eventPosition); - tooltipItems = me._createItems(options); - me.title = me.getTitle(tooltipItems, options); - me.beforeBody = me.getBeforeBody(tooltipItems, options); - me.body = me.getBody(tooltipItems, options); - me.afterBody = me.getAfterBody(tooltipItems, options); - me.footer = me.getFooter(tooltipItems, options); - var size = me._size = getTooltipSize(me, options); + var position = positioners[options.position].call(this, active, this._eventPosition); + tooltipItems = this._createItems(options); + this.title = this.getTitle(tooltipItems, options); + this.beforeBody = this.getBeforeBody(tooltipItems, options); + this.body = this.getBody(tooltipItems, options); + this.afterBody = this.getAfterBody(tooltipItems, options); + this.footer = this.getFooter(tooltipItems, options); + var size = this._size = getTooltipSize(this, options); var positionAndSize = Object.assign({}, position, size); - var alignment = determineAlignment(me._chart, options, positionAndSize); - var backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, me._chart); - me.xAlign = alignment.xAlign; - me.yAlign = alignment.yAlign; + var alignment = determineAlignment(this.chart, options, positionAndSize); + var backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart); + this.xAlign = alignment.xAlign; + this.yAlign = alignment.yAlign; properties = { opacity: 1, x: backgroundPoint.x, y: backgroundPoint.y, width: size.width, height: size.height, caretX: position.x, caretY: position.y }; } - - me._tooltipItems = tooltipItems; - me.$context = undefined; - + this._tooltipItems = tooltipItems; + this.$context = undefined; if (properties) { - me._resolveAnimations().update(me, properties); + this._resolveAnimations().update(this, properties); } - if (changed && options.external) { - options.external.call(me, { - chart: me._chart, - tooltip: me, + options.external.call(this, { + chart: this.chart, + tooltip: this, replay: replay }); } } }, { @@ -14753,22 +14658,25 @@ } }, { key: "getCaretPosition", value: function getCaretPosition(tooltipPoint, size, options) { var xAlign = this.xAlign, - yAlign = this.yAlign; - var cornerRadius = options.cornerRadius, - caretSize = options.caretSize; + yAlign = this.yAlign; + var caretSize = options.caretSize, + cornerRadius = options.cornerRadius; + var _toTRBLCorners2 = toTRBLCorners(cornerRadius), + topLeft = _toTRBLCorners2.topLeft, + topRight = _toTRBLCorners2.topRight, + bottomLeft = _toTRBLCorners2.bottomLeft, + bottomRight = _toTRBLCorners2.bottomRight; var ptX = tooltipPoint.x, - ptY = tooltipPoint.y; + ptY = tooltipPoint.y; var width = size.width, - height = size.height; + height = size.height; var x1, x2, x3, y1, y2, y3; - if (yAlign === 'center') { y2 = ptY + height / 2; - if (xAlign === 'left') { x1 = ptX; x2 = x1 - caretSize; y1 = y2 + caretSize; y3 = y2 - caretSize; @@ -14776,21 +14684,19 @@ x1 = ptX + width; x2 = x1 + caretSize; y1 = y2 - caretSize; y3 = y2 + caretSize; } - x3 = x1; } else { if (xAlign === 'left') { - x2 = ptX + cornerRadius + caretSize; + x2 = ptX + Math.max(topLeft, bottomLeft) + caretSize; } else if (xAlign === 'right') { - x2 = ptX + width - cornerRadius - caretSize; + x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize; } else { x2 = this.caretX; } - if (yAlign === 'top') { y1 = ptY; y2 = y1 - caretSize; x1 = x2 - caretSize; x3 = x2 + caretSize; @@ -14798,14 +14704,12 @@ y1 = ptY + height; y2 = y1 + caretSize; x1 = x2 + caretSize; x3 = x2 - caretSize; } - y3 = y1; } - return { x1: x1, x2: x2, x3: x3, y1: y1, @@ -14814,49 +14718,44 @@ }; } }, { key: "drawTitle", value: function drawTitle(pt, ctx, options) { - var me = this; - var title = me.title; + var title = this.title; var length = title.length; var titleFont, titleSpacing, i; - if (length) { - var rtlHelper = getRtlAdapter(options.rtl, me.x, me.width); - pt.x = getAlignedX(me, options.titleAlign, options); + var rtlHelper = getRtlAdapter(options.rtl, this.x, this.width); + pt.x = getAlignedX(this, options.titleAlign, options); ctx.textAlign = rtlHelper.textAlign(options.titleAlign); ctx.textBaseline = 'middle'; titleFont = toFont(options.titleFont); titleSpacing = options.titleSpacing; ctx.fillStyle = options.titleColor; ctx.font = titleFont.string; - for (i = 0; i < length; ++i) { ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2); pt.y += titleFont.lineHeight + titleSpacing; - if (i + 1 === length) { pt.y += options.titleMarginBottom - titleSpacing; } } } } }, { key: "_drawColorBox", value: function _drawColorBox(ctx, pt, i, rtlHelper, options) { - var me = this; - var labelColors = me.labelColors[i]; - var labelPointStyle = me.labelPointStyles[i]; + var labelColors = this.labelColors[i]; + var labelPointStyle = this.labelPointStyles[i]; var boxHeight = options.boxHeight, - boxWidth = options.boxWidth; + boxWidth = options.boxWidth, + boxPadding = options.boxPadding; var bodyFont = toFont(options.bodyFont); - var colorX = getAlignedX(me, 'left', options); + var colorX = getAlignedX(this, 'left', options); var rtlColorX = rtlHelper.x(colorX); var yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0; var colorY = pt.y + yOffSet; - if (options.usePointStyle) { var drawOptions = { radius: Math.min(boxWidth, boxHeight) / 2, pointStyle: labelPointStyle.pointStyle, rotation: labelPointStyle.rotation, @@ -14869,218 +14768,226 @@ drawPoint(ctx, drawOptions, centerX, centerY); ctx.strokeStyle = labelColors.borderColor; ctx.fillStyle = labelColors.backgroundColor; drawPoint(ctx, drawOptions, centerX, centerY); } else { - ctx.fillStyle = options.multiKeyBackground; - ctx.fillRect(rtlHelper.leftForLtr(rtlColorX, boxWidth), colorY, boxWidth, boxHeight); - ctx.lineWidth = 1; + ctx.lineWidth = isObject(labelColors.borderWidth) ? Math.max.apply(Math, _toConsumableArray(Object.values(labelColors.borderWidth))) : labelColors.borderWidth || 1; ctx.strokeStyle = labelColors.borderColor; - ctx.strokeRect(rtlHelper.leftForLtr(rtlColorX, boxWidth), colorY, boxWidth, boxHeight); - ctx.fillStyle = labelColors.backgroundColor; - ctx.fillRect(rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2), colorY + 1, boxWidth - 2, boxHeight - 2); + ctx.setLineDash(labelColors.borderDash || []); + ctx.lineDashOffset = labelColors.borderDashOffset || 0; + var outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth - boxPadding); + var innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - boxPadding - 2); + var borderRadius = toTRBLCorners(labelColors.borderRadius); + if (Object.values(borderRadius).some(function (v) { + return v !== 0; + })) { + ctx.beginPath(); + ctx.fillStyle = options.multiKeyBackground; + addRoundedRectPath(ctx, { + x: outerX, + y: colorY, + w: boxWidth, + h: boxHeight, + radius: borderRadius + }); + ctx.fill(); + ctx.stroke(); + ctx.fillStyle = labelColors.backgroundColor; + ctx.beginPath(); + addRoundedRectPath(ctx, { + x: innerX, + y: colorY + 1, + w: boxWidth - 2, + h: boxHeight - 2, + radius: borderRadius + }); + ctx.fill(); + } else { + ctx.fillStyle = options.multiKeyBackground; + ctx.fillRect(outerX, colorY, boxWidth, boxHeight); + ctx.strokeRect(outerX, colorY, boxWidth, boxHeight); + ctx.fillStyle = labelColors.backgroundColor; + ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2); + } } - - ctx.fillStyle = me.labelTextColors[i]; + ctx.fillStyle = this.labelTextColors[i]; } }, { key: "drawBody", value: function drawBody(pt, ctx, options) { - var me = this; - var body = me.body; + var body = this.body; var bodySpacing = options.bodySpacing, - bodyAlign = options.bodyAlign, - displayColors = options.displayColors, - boxHeight = options.boxHeight, - boxWidth = options.boxWidth; + bodyAlign = options.bodyAlign, + displayColors = options.displayColors, + boxHeight = options.boxHeight, + boxWidth = options.boxWidth, + boxPadding = options.boxPadding; var bodyFont = toFont(options.bodyFont); var bodyLineHeight = bodyFont.lineHeight; var xLinePadding = 0; - var rtlHelper = getRtlAdapter(options.rtl, me.x, me.width); - + var rtlHelper = getRtlAdapter(options.rtl, this.x, this.width); var fillLineOfText = function fillLineOfText(line) { ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2); pt.y += bodyLineHeight + bodySpacing; }; - var bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign); var bodyItem, textColor, lines, i, j, ilen, jlen; ctx.textAlign = bodyAlign; ctx.textBaseline = 'middle'; ctx.font = bodyFont.string; - pt.x = getAlignedX(me, bodyAlignForCalculation, options); + pt.x = getAlignedX(this, bodyAlignForCalculation, options); ctx.fillStyle = options.bodyColor; - each(me.beforeBody, fillLineOfText); - xLinePadding = displayColors && bodyAlignForCalculation !== 'right' ? bodyAlign === 'center' ? boxWidth / 2 + 1 : boxWidth + 2 : 0; - + each(this.beforeBody, fillLineOfText); + xLinePadding = displayColors && bodyAlignForCalculation !== 'right' ? bodyAlign === 'center' ? boxWidth / 2 + boxPadding : boxWidth + 2 + boxPadding : 0; for (i = 0, ilen = body.length; i < ilen; ++i) { bodyItem = body[i]; - textColor = me.labelTextColors[i]; + textColor = this.labelTextColors[i]; ctx.fillStyle = textColor; each(bodyItem.before, fillLineOfText); lines = bodyItem.lines; - if (displayColors && lines.length) { - me._drawColorBox(ctx, pt, i, rtlHelper, options); - + this._drawColorBox(ctx, pt, i, rtlHelper, options); bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight); } - for (j = 0, jlen = lines.length; j < jlen; ++j) { fillLineOfText(lines[j]); bodyLineHeight = bodyFont.lineHeight; } - each(bodyItem.after, fillLineOfText); } - xLinePadding = 0; bodyLineHeight = bodyFont.lineHeight; - each(me.afterBody, fillLineOfText); + each(this.afterBody, fillLineOfText); pt.y -= bodySpacing; } }, { key: "drawFooter", value: function drawFooter(pt, ctx, options) { - var me = this; - var footer = me.footer; + var footer = this.footer; var length = footer.length; var footerFont, i; - if (length) { - var rtlHelper = getRtlAdapter(options.rtl, me.x, me.width); - pt.x = getAlignedX(me, options.footerAlign, options); + var rtlHelper = getRtlAdapter(options.rtl, this.x, this.width); + pt.x = getAlignedX(this, options.footerAlign, options); pt.y += options.footerMarginTop; ctx.textAlign = rtlHelper.textAlign(options.footerAlign); ctx.textBaseline = 'middle'; footerFont = toFont(options.footerFont); ctx.fillStyle = options.footerColor; ctx.font = footerFont.string; - for (i = 0; i < length; ++i) { ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2); pt.y += footerFont.lineHeight + options.footerSpacing; } } } }, { key: "drawBackground", value: function drawBackground(pt, ctx, tooltipSize, options) { var xAlign = this.xAlign, - yAlign = this.yAlign; + yAlign = this.yAlign; var x = pt.x, - y = pt.y; + y = pt.y; var width = tooltipSize.width, - height = tooltipSize.height; - var radius = options.cornerRadius; + height = tooltipSize.height; + var _toTRBLCorners3 = toTRBLCorners(options.cornerRadius), + topLeft = _toTRBLCorners3.topLeft, + topRight = _toTRBLCorners3.topRight, + bottomLeft = _toTRBLCorners3.bottomLeft, + bottomRight = _toTRBLCorners3.bottomRight; ctx.fillStyle = options.backgroundColor; ctx.strokeStyle = options.borderColor; ctx.lineWidth = options.borderWidth; ctx.beginPath(); - ctx.moveTo(x + radius, y); - + ctx.moveTo(x + topLeft, y); if (yAlign === 'top') { this.drawCaret(pt, ctx, tooltipSize, options); } - - ctx.lineTo(x + width - radius, y); - ctx.quadraticCurveTo(x + width, y, x + width, y + radius); - + ctx.lineTo(x + width - topRight, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + topRight); if (yAlign === 'center' && xAlign === 'right') { this.drawCaret(pt, ctx, tooltipSize, options); } - - ctx.lineTo(x + width, y + height - radius); - ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); - + ctx.lineTo(x + width, y + height - bottomRight); + ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height); if (yAlign === 'bottom') { this.drawCaret(pt, ctx, tooltipSize, options); } - - ctx.lineTo(x + radius, y + height); - ctx.quadraticCurveTo(x, y + height, x, y + height - radius); - + ctx.lineTo(x + bottomLeft, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft); if (yAlign === 'center' && xAlign === 'left') { this.drawCaret(pt, ctx, tooltipSize, options); } - - ctx.lineTo(x, y + radius); - ctx.quadraticCurveTo(x, y, x + radius, y); + ctx.lineTo(x, y + topLeft); + ctx.quadraticCurveTo(x, y, x + topLeft, y); ctx.closePath(); ctx.fill(); - if (options.borderWidth > 0) { ctx.stroke(); } } }, { key: "_updateAnimationTarget", value: function _updateAnimationTarget(options) { - var me = this; - var chart = me._chart; - var anims = me.$animations; + var chart = this.chart; + var anims = this.$animations; var animX = anims && anims.x; var animY = anims && anims.y; - if (animX || animY) { - var position = positioners[options.position].call(me, me._active, me._eventPosition); - + var position = positioners[options.position].call(this, this._active, this._eventPosition); if (!position) { return; } - - var size = me._size = getTooltipSize(me, options); - var positionAndSize = Object.assign({}, position, me._size); + var size = this._size = getTooltipSize(this, options); + var positionAndSize = Object.assign({}, position, this._size); var alignment = determineAlignment(chart, options, positionAndSize); var point = getBackgroundPoint(options, positionAndSize, alignment, chart); - if (animX._to !== point.x || animY._to !== point.y) { - me.xAlign = alignment.xAlign; - me.yAlign = alignment.yAlign; - me.width = size.width; - me.height = size.height; - me.caretX = position.x; - me.caretY = position.y; - - me._resolveAnimations().update(me, point); + this.xAlign = alignment.xAlign; + this.yAlign = alignment.yAlign; + this.width = size.width; + this.height = size.height; + this.caretX = position.x; + this.caretY = position.y; + this._resolveAnimations().update(this, point); } } } }, { + key: "_willRender", + value: function _willRender() { + return !!this.opacity; + } + }, { key: "draw", value: function draw(ctx) { - var me = this; - var options = me.options.setContext(me.getContext()); - var opacity = me.opacity; - + var options = this.options.setContext(this.getContext()); + var opacity = this.opacity; if (!opacity) { return; } - - me._updateAnimationTarget(options); - + this._updateAnimationTarget(options); var tooltipSize = { - width: me.width, - height: me.height + width: this.width, + height: this.height }; var pt = { - x: me.x, - y: me.y + x: this.x, + y: this.y }; opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity; var padding = toPadding(options.padding); - var hasTooltipContent = me.title.length || me.beforeBody.length || me.body.length || me.afterBody.length || me.footer.length; - + var hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length; if (options.enabled && hasTooltipContent) { ctx.save(); ctx.globalAlpha = opacity; - me.drawBackground(pt, ctx, tooltipSize, options); + this.drawBackground(pt, ctx, tooltipSize, options); overrideTextDirection(ctx, options.textDirection); pt.y += padding.top; - me.drawTitle(pt, ctx, options); - me.drawBody(pt, ctx, options); - me.drawFooter(pt, ctx, options); + this.drawTitle(pt, ctx, options); + this.drawBody(pt, ctx, options); + this.drawFooter(pt, ctx, options); restoreTextDirection(ctx, options.textDirection); ctx.restore(); } } }, { @@ -15089,94 +14996,96 @@ return this._active || []; } }, { key: "setActiveElements", value: function setActiveElements(activeElements, eventPosition) { - var me = this; - var lastActive = me._active; - var active = activeElements.map(function (_ref7) { - var datasetIndex = _ref7.datasetIndex, - index = _ref7.index; - - var meta = me._chart.getDatasetMeta(datasetIndex); - + var _this34 = this; + var lastActive = this._active; + var active = activeElements.map(function (_ref11) { + var datasetIndex = _ref11.datasetIndex, + index = _ref11.index; + var meta = _this34.chart.getDatasetMeta(datasetIndex); if (!meta) { throw new Error('Cannot find a dataset at index ' + datasetIndex); } - return { datasetIndex: datasetIndex, element: meta.data[index], index: index }; }); var changed = !_elementsEqual(lastActive, active); - - var positionChanged = me._positionChanged(active, eventPosition); - + var positionChanged = this._positionChanged(active, eventPosition); if (changed || positionChanged) { - me._active = active; - me._eventPosition = eventPosition; - me.update(true); + this._active = active; + this._eventPosition = eventPosition; + this._ignoreReplayEvents = true; + this.update(true); } } }, { key: "handleEvent", value: function handleEvent(e, replay) { - var me = this; - var options = me.options; - var lastActive = me._active || []; - var changed = false; - var active = []; - - if (e.type !== 'mouseout') { - active = me._chart.getElementsAtEventForMode(e, options.mode, options, replay); - - if (options.reverse) { - active.reverse(); - } + var inChartArea = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + if (replay && this._ignoreReplayEvents) { + return false; } - - var positionChanged = me._positionChanged(active, e); - - changed = replay || !_elementsEqual(active, lastActive) || positionChanged; - + this._ignoreReplayEvents = false; + var options = this.options; + var lastActive = this._active || []; + var active = this._getActiveElements(e, lastActive, replay, inChartArea); + var positionChanged = this._positionChanged(active, e); + var changed = replay || !_elementsEqual(active, lastActive) || positionChanged; if (changed) { - me._active = active; - + this._active = active; if (options.enabled || options.external) { - me._eventPosition = { + this._eventPosition = { x: e.x, y: e.y }; - me.update(true, replay); + this.update(true, replay); } } - return changed; } }, { + key: "_getActiveElements", + value: function _getActiveElements(e, lastActive, replay, inChartArea) { + var options = this.options; + if (e.type === 'mouseout') { + return []; + } + if (!inChartArea) { + return lastActive; + } + var active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay); + if (options.reverse) { + active.reverse(); + } + return active; + } + }, { key: "_positionChanged", value: function _positionChanged(active, e) { - var me = this; - var position = positioners[me.options.position].call(me, active, e); - return me.caretX !== position.x || me.caretY !== position.y; + var caretX = this.caretX, + caretY = this.caretY, + options = this.options; + var position = positioners[options.position].call(this, active, e); + return position !== false && (caretX !== position.x || caretY !== position.y); } }]); - return Tooltip; }(Element); - - Tooltip.positioners = positioners; + _defineProperty$w(Tooltip, "positioners", positioners); var plugin_tooltip = { id: 'tooltip', _element: Tooltip, positioners: positioners, afterInit: function afterInit(chart, _args, options) { if (options) { chart.tooltip = new Tooltip({ - _chart: chart, + chart: chart, options: options }); } }, beforeUpdate: function beforeUpdate(chart, _args, options) { @@ -15189,29 +15098,27 @@ chart.tooltip.initialize(options); } }, afterDraw: function afterDraw(chart) { var tooltip = chart.tooltip; - var args = { - tooltip: tooltip - }; - - if (chart.notifyPlugins('beforeTooltipDraw', args) === false) { - return; - } - - if (tooltip) { + if (tooltip && tooltip._willRender()) { + var args = { + tooltip: tooltip + }; + if (chart.notifyPlugins('beforeTooltipDraw', _objectSpread2(_objectSpread2({}, args), {}, { + cancelable: true + })) === false) { + return; + } tooltip.draw(chart.ctx); + chart.notifyPlugins('afterTooltipDraw', args); } - - chart.notifyPlugins('afterTooltipDraw', args); }, afterEvent: function afterEvent(chart, args) { if (chart.tooltip) { var useFinalPosition = args.replay; - - if (chart.tooltip.handleEvent(args.event, useFinalPosition)) { + if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) { args.changed = true; } } }, defaults: { @@ -15219,11 +15126,11 @@ external: null, position: 'average', backgroundColor: 'rgba(0,0,0,0.8)', titleColor: '#fff', titleFont: { - style: 'bold' + weight: 'bold' }, titleSpacing: 2, titleMarginBottom: 6, titleAlign: 'left', bodyColor: '#fff', @@ -15232,11 +15139,11 @@ bodyAlign: 'left', footerColor: '#fff', footerSpacing: 2, footerMarginTop: 6, footerFont: { - style: 'bold' + weight: 'bold' }, footerAlign: 'left', padding: 6, caretPadding: 2, caretSize: 5, @@ -15247,10 +15154,11 @@ boxWidth: function boxWidth(ctx, opts) { return opts.bodyFont.size; }, multiKeyBackground: '#fff', displayColors: true, + boxPadding: 0, borderColor: 'rgba(0,0,0,0)', borderWidth: 0, animation: { duration: 400, easing: 'easeOutQuart' @@ -15263,76 +15171,11 @@ opacity: { easing: 'linear', duration: 200 } }, - callbacks: { - beforeTitle: noop, - title: function title(tooltipItems) { - if (tooltipItems.length > 0) { - var item = tooltipItems[0]; - var labels = item.chart.data.labels; - var labelCount = labels ? labels.length : 0; - - if (this && this.options && this.options.mode === 'dataset') { - return item.dataset.label || ''; - } else if (item.label) { - return item.label; - } else if (labelCount > 0 && item.dataIndex < labelCount) { - return labels[item.dataIndex]; - } - } - - return ''; - }, - afterTitle: noop, - beforeBody: noop, - beforeLabel: noop, - label: function label(tooltipItem) { - if (this && this.options && this.options.mode === 'dataset') { - return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue; - } - - var label = tooltipItem.dataset.label || ''; - - if (label) { - label += ': '; - } - - var value = tooltipItem.formattedValue; - - if (!isNullOrUndef(value)) { - label += value; - } - - return label; - }, - labelColor: function labelColor(tooltipItem) { - var meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex); - var options = meta.controller.getStyle(tooltipItem.dataIndex); - return { - borderColor: options.borderColor, - backgroundColor: options.backgroundColor - }; - }, - labelTextColor: function labelTextColor() { - return this.options.bodyColor; - }, - labelPointStyle: function labelPointStyle(tooltipItem) { - var meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex); - var options = meta.controller.getStyle(tooltipItem.dataIndex); - return { - pointStyle: options.pointStyle, - rotation: options.rotation - }; - }, - afterLabel: noop, - afterBody: noop, - beforeFooter: noop, - footer: noop, - afterFooter: noop - } + callbacks: defaultCallbacks }, defaultRoutes: { bodyFont: 'font', footerFont: 'font', titleFont: 'font' @@ -15355,485 +15198,464 @@ }, additionalOptionScopes: ['interaction'] }; var plugins = /*#__PURE__*/Object.freeze({ __proto__: null, + Colors: plugin_colors, Decimation: plugin_decimation, - Filler: plugin_filler, + Filler: index, Legend: plugin_legend, + SubTitle: plugin_subtitle, Title: plugin_title, Tooltip: plugin_tooltip }); - - var addIfString = function addIfString(labels, raw, index) { - return typeof raw === 'string' ? labels.push(raw) - 1 : isNaN(raw) ? null : index; + var addIfString = function addIfString(labels, raw, index, addedLabels) { + if (typeof raw === 'string') { + index = labels.push(raw) - 1; + addedLabels.unshift({ + index: index, + label: raw + }); + } else if (isNaN(raw)) { + index = null; + } + return index; }; - - function findOrAddLabel(labels, raw, index) { + function findOrAddLabel(labels, raw, index, addedLabels) { var first = labels.indexOf(raw); - if (first === -1) { - return addIfString(labels, raw, index); + return addIfString(labels, raw, index, addedLabels); } - var last = labels.lastIndexOf(raw); return first !== last ? index : first; } - var validIndex = function validIndex(index, max) { return index === null ? null : _limitValue(Math.round(index), 0, max); }; - + function _getLabelForValue(value) { + var labels = this.getLabels(); + if (value >= 0 && value < labels.length) { + return labels[value]; + } + return value; + } var CategoryScale = /*#__PURE__*/function (_Scale) { - _inherits(CategoryScale, _Scale); - - var _super19 = _createSuper(CategoryScale); - + _inherits$w(CategoryScale, _Scale); + var _super19 = _createSuper$w(CategoryScale); function CategoryScale(cfg) { - var _this13; - - _classCallCheck(this, CategoryScale); - - _this13 = _super19.call(this, cfg); - _this13._startValue = undefined; - _this13._valueRange = 0; - return _this13; + var _this35; + _classCallCheck$x(this, CategoryScale); + _this35 = _super19.call(this, cfg); + _this35._startValue = undefined; + _this35._valueRange = 0; + _this35._addedLabels = []; + return _this35; } - - _createClass(CategoryScale, [{ + _createClass$x(CategoryScale, [{ + key: "init", + value: function init(scaleOptions) { + var added = this._addedLabels; + if (added.length) { + var labels = this.getLabels(); + var _iterator25 = _createForOfIteratorHelper$1(added), + _step25; + try { + for (_iterator25.s(); !(_step25 = _iterator25.n()).done;) { + var _step25$value = _step25.value, + _index3 = _step25$value.index, + label = _step25$value.label; + if (labels[_index3] === label) { + labels.splice(_index3, 1); + } + } + } catch (err) { + _iterator25.e(err); + } finally { + _iterator25.f(); + } + this._addedLabels = []; + } + _get(_getPrototypeOf$w(CategoryScale.prototype), "init", this).call(this, scaleOptions); + } + }, { key: "parse", value: function parse(raw, index) { if (isNullOrUndef(raw)) { return null; } - var labels = this.getLabels(); - index = isFinite(index) && labels[index] === raw ? index : findOrAddLabel(labels, raw, valueOrDefault(index, raw)); + index = isFinite(index) && labels[index] === raw ? index : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels); return validIndex(index, labels.length - 1); } }, { key: "determineDataLimits", value: function determineDataLimits() { - var me = this; - - var _me$getUserBounds2 = me.getUserBounds(), - minDefined = _me$getUserBounds2.minDefined, - maxDefined = _me$getUserBounds2.maxDefined; - - var _me$getMinMax = me.getMinMax(true), - min = _me$getMinMax.min, - max = _me$getMinMax.max; - - if (me.options.bounds === 'ticks') { + var _this$getUserBounds2 = this.getUserBounds(), + minDefined = _this$getUserBounds2.minDefined, + maxDefined = _this$getUserBounds2.maxDefined; + var _this$getMinMax = this.getMinMax(true), + min = _this$getMinMax.min, + max = _this$getMinMax.max; + if (this.options.bounds === 'ticks') { if (!minDefined) { min = 0; } - if (!maxDefined) { - max = me.getLabels().length - 1; + max = this.getLabels().length - 1; } } - - me.min = min; - me.max = max; + this.min = min; + this.max = max; } }, { key: "buildTicks", value: function buildTicks() { - var me = this; - var min = me.min; - var max = me.max; - var offset = me.options.offset; + var min = this.min; + var max = this.max; + var offset = this.options.offset; var ticks = []; - var labels = me.getLabels(); + var labels = this.getLabels(); labels = min === 0 && max === labels.length - 1 ? labels : labels.slice(min, max + 1); - me._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1); - me._startValue = me.min - (offset ? 0.5 : 0); - + this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1); + this._startValue = this.min - (offset ? 0.5 : 0); for (var value = min; value <= max; value++) { ticks.push({ value: value }); } - return ticks; } }, { key: "getLabelForValue", value: function getLabelForValue(value) { - var me = this; - var labels = me.getLabels(); - - if (value >= 0 && value < labels.length) { - return labels[value]; - } - - return value; + return _getLabelForValue.call(this, value); } }, { key: "configure", value: function configure() { - var me = this; - - _get(_getPrototypeOf(CategoryScale.prototype), "configure", this).call(this); - - if (!me.isHorizontal()) { - me._reversePixels = !me._reversePixels; + _get(_getPrototypeOf$w(CategoryScale.prototype), "configure", this).call(this); + if (!this.isHorizontal()) { + this._reversePixels = !this._reversePixels; } } }, { key: "getPixelForValue", value: function getPixelForValue(value) { - var me = this; - if (typeof value !== 'number') { - value = me.parse(value); + value = this.parse(value); } - - return value === null ? NaN : me.getPixelForDecimal((value - me._startValue) / me._valueRange); + return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange); } }, { key: "getPixelForTick", value: function getPixelForTick(index) { - var me = this; - var ticks = me.ticks; - + var ticks = this.ticks; if (index < 0 || index > ticks.length - 1) { return null; } - - return me.getPixelForValue(ticks[index].value); + return this.getPixelForValue(ticks[index].value); } }, { key: "getValueForPixel", value: function getValueForPixel(pixel) { - var me = this; - return Math.round(me._startValue + me.getDecimalForPixel(pixel) * me._valueRange); + return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange); } }, { key: "getBasePixel", value: function getBasePixel() { return this.bottom; } }]); - return CategoryScale; }(Scale); - - CategoryScale.id = 'category'; - CategoryScale.defaults = { + _defineProperty$w(CategoryScale, "id", 'category'); + _defineProperty$w(CategoryScale, "defaults", { ticks: { - callback: CategoryScale.prototype.getLabelForValue + callback: _getLabelForValue } - }; - + }); function generateTicks$1(generationOptions, dataRange) { var ticks = []; var MIN_SPACING = 1e-14; - var step = generationOptions.step, - min = generationOptions.min, - max = generationOptions.max, - precision = generationOptions.precision, - count = generationOptions.count, - maxTicks = generationOptions.maxTicks; + var bounds = generationOptions.bounds, + step = generationOptions.step, + min = generationOptions.min, + max = generationOptions.max, + precision = generationOptions.precision, + count = generationOptions.count, + maxTicks = generationOptions.maxTicks, + maxDigits = generationOptions.maxDigits, + includeBounds = generationOptions.includeBounds; var unit = step || 1; var maxSpaces = maxTicks - 1; var rmin = dataRange.min, - rmax = dataRange.max; + rmax = dataRange.max; var minDefined = !isNullOrUndef(min); var maxDefined = !isNullOrUndef(max); var countDefined = !isNullOrUndef(count); + var minSpacing = (rmax - rmin) / (maxDigits + 1); var spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit; var factor, niceMin, niceMax, numSpaces; - if (spacing < MIN_SPACING && !minDefined && !maxDefined) { return [{ value: rmin }, { value: rmax }]; } - numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing); - if (numSpaces > maxSpaces) { spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit; } - if (!isNullOrUndef(precision)) { factor = Math.pow(10, precision); spacing = Math.ceil(spacing * factor) / factor; } - - niceMin = Math.floor(rmin / spacing) * spacing; - niceMax = Math.ceil(rmax / spacing) * spacing; - + if (bounds === 'ticks') { + niceMin = Math.floor(rmin / spacing) * spacing; + niceMax = Math.ceil(rmax / spacing) * spacing; + } else { + niceMin = rmin; + niceMax = rmax; + } if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) { - numSpaces = Math.min((max - min) / spacing, maxTicks); + numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks)); spacing = (max - min) / numSpaces; niceMin = min; niceMax = max; } else if (countDefined) { niceMin = minDefined ? min : niceMin; niceMax = maxDefined ? max : niceMax; numSpaces = count - 1; spacing = (niceMax - niceMin) / numSpaces; } else { numSpaces = (niceMax - niceMin) / spacing; - if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) { numSpaces = Math.round(numSpaces); } else { numSpaces = Math.ceil(numSpaces); } } - - factor = Math.pow(10, isNullOrUndef(precision) ? _decimalPlaces(spacing) : precision); + var decimalPlaces = Math.max(_decimalPlaces(spacing), _decimalPlaces(niceMin)); + factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision); niceMin = Math.round(niceMin * factor) / factor; niceMax = Math.round(niceMax * factor) / factor; var j = 0; - if (minDefined) { - ticks.push({ - value: min - }); - - if (niceMin <= min) { + if (includeBounds && niceMin !== min) { + ticks.push({ + value: min + }); + if (niceMin < min) { + j++; + } + if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) { + j++; + } + } else if (niceMin < min) { j++; } - - if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, spacing / 10)) { - j++; - } } - for (; j < numSpaces; ++j) { ticks.push({ value: Math.round((niceMin + j * spacing) * factor) / factor }); } - - if (maxDefined) { - if (almostEquals(ticks[ticks.length - 1].value, max, spacing / 10)) { + if (maxDefined && includeBounds && niceMax !== max) { + if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) { ticks[ticks.length - 1].value = max; } else { ticks.push({ value: max }); } - } else { + } else if (!maxDefined || niceMax === max) { ticks.push({ value: niceMax }); } - return ticks; } - + function relativeLabelSize(value, minSpacing, _ref12) { + var horizontal = _ref12.horizontal, + minRotation = _ref12.minRotation; + var rad = toRadians(minRotation); + var ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001; + var length = 0.75 * minSpacing * ('' + value).length; + return Math.min(minSpacing / ratio, length); + } var LinearScaleBase = /*#__PURE__*/function (_Scale2) { - _inherits(LinearScaleBase, _Scale2); - - var _super20 = _createSuper(LinearScaleBase); - + _inherits$w(LinearScaleBase, _Scale2); + var _super20 = _createSuper$w(LinearScaleBase); function LinearScaleBase(cfg) { - var _this14; - - _classCallCheck(this, LinearScaleBase); - - _this14 = _super20.call(this, cfg); - _this14.start = undefined; - _this14.end = undefined; - _this14._startValue = undefined; - _this14._endValue = undefined; - _this14._valueRange = 0; - return _this14; + var _this36; + _classCallCheck$x(this, LinearScaleBase); + _this36 = _super20.call(this, cfg); + _this36.start = undefined; + _this36.end = undefined; + _this36._startValue = undefined; + _this36._endValue = undefined; + _this36._valueRange = 0; + return _this36; } - - _createClass(LinearScaleBase, [{ + _createClass$x(LinearScaleBase, [{ key: "parse", value: function parse(raw, index) { if (isNullOrUndef(raw)) { return null; } - if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) { return null; } - return +raw; } }, { key: "handleTickRangeOptions", value: function handleTickRangeOptions() { - var me = this; - var _me$options7 = me.options, - beginAtZero = _me$options7.beginAtZero, - stacked = _me$options7.stacked; - - var _me$getUserBounds3 = me.getUserBounds(), - minDefined = _me$getUserBounds3.minDefined, - maxDefined = _me$getUserBounds3.maxDefined; - - var min = me.min, - max = me.max; - + var beginAtZero = this.options.beginAtZero; + var _this$getUserBounds3 = this.getUserBounds(), + minDefined = _this$getUserBounds3.minDefined, + maxDefined = _this$getUserBounds3.maxDefined; + var min = this.min, + max = this.max; var setMin = function setMin(v) { return min = minDefined ? min : v; }; - var setMax = function setMax(v) { return max = maxDefined ? max : v; }; - - if (beginAtZero || stacked) { + if (beginAtZero) { var minSign = sign(min); var maxSign = sign(max); - if (minSign < 0 && maxSign < 0) { setMax(0); } else if (minSign > 0 && maxSign > 0) { setMin(0); } } - if (min === max) { - setMax(max + 1); - + var offset = max === 0 ? 1 : Math.abs(max * 0.05); + setMax(max + offset); if (!beginAtZero) { - setMin(min - 1); + setMin(min - offset); } } - - me.min = min; - me.max = max; + this.min = min; + this.max = max; } }, { key: "getTickLimit", value: function getTickLimit() { - var me = this; - var tickOpts = me.options.ticks; + var tickOpts = this.options.ticks; var maxTicksLimit = tickOpts.maxTicksLimit, - stepSize = tickOpts.stepSize; + stepSize = tickOpts.stepSize; var maxTicks; - if (stepSize) { - maxTicks = Math.ceil(me.max / stepSize) - Math.floor(me.min / stepSize) + 1; + maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1; + if (maxTicks > 1000) { + console.warn("scales.".concat(this.id, ".ticks.stepSize: ").concat(stepSize, " would result generating up to ").concat(maxTicks, " ticks. Limiting to 1000.")); + maxTicks = 1000; + } } else { - maxTicks = me.computeTickLimit(); + maxTicks = this.computeTickLimit(); maxTicksLimit = maxTicksLimit || 11; } - if (maxTicksLimit) { maxTicks = Math.min(maxTicksLimit, maxTicks); } - return maxTicks; } }, { key: "computeTickLimit", value: function computeTickLimit() { return Number.POSITIVE_INFINITY; } }, { key: "buildTicks", value: function buildTicks() { - var me = this; - var opts = me.options; + var opts = this.options; var tickOpts = opts.ticks; - var maxTicks = me.getTickLimit(); + var maxTicks = this.getTickLimit(); maxTicks = Math.max(2, maxTicks); var numericGeneratorOptions = { maxTicks: maxTicks, + bounds: opts.bounds, min: opts.min, max: opts.max, precision: tickOpts.precision, step: tickOpts.stepSize, - count: tickOpts.count + count: tickOpts.count, + maxDigits: this._maxDigits(), + horizontal: this.isHorizontal(), + minRotation: tickOpts.minRotation || 0, + includeBounds: tickOpts.includeBounds !== false }; - var ticks = generateTicks$1(numericGeneratorOptions, _addGrace(me, opts.grace)); - + var dataRange = this._range || this; + var ticks = generateTicks$1(numericGeneratorOptions, dataRange); if (opts.bounds === 'ticks') { - _setMinAndMaxByKey(ticks, me, 'value'); + _setMinAndMaxByKey(ticks, this, 'value'); } - if (opts.reverse) { ticks.reverse(); - me.start = me.max; - me.end = me.min; + this.start = this.max; + this.end = this.min; } else { - me.start = me.min; - me.end = me.max; + this.start = this.min; + this.end = this.max; } - return ticks; } }, { key: "configure", value: function configure() { - var me = this; - var ticks = me.ticks; - var start = me.min; - var end = me.max; - - _get(_getPrototypeOf(LinearScaleBase.prototype), "configure", this).call(this); - - if (me.options.offset && ticks.length) { + var ticks = this.ticks; + var start = this.min; + var end = this.max; + _get(_getPrototypeOf$w(LinearScaleBase.prototype), "configure", this).call(this); + if (this.options.offset && ticks.length) { var offset = (end - start) / Math.max(ticks.length - 1, 1) / 2; start -= offset; end += offset; } - - me._startValue = start; - me._endValue = end; - me._valueRange = end - start; + this._startValue = start; + this._endValue = end; + this._valueRange = end - start; } }, { key: "getLabelForValue", value: function getLabelForValue(value) { - return formatNumber(value, this.chart.options.locale); + return formatNumber(value, this.chart.options.locale, this.options.ticks.format); } }]); - return LinearScaleBase; }(Scale); - var LinearScale = /*#__PURE__*/function (_LinearScaleBase) { - _inherits(LinearScale, _LinearScaleBase); - - var _super21 = _createSuper(LinearScale); - + _inherits$w(LinearScale, _LinearScaleBase); + var _super21 = _createSuper$w(LinearScale); function LinearScale() { - _classCallCheck(this, LinearScale); - + _classCallCheck$x(this, LinearScale); return _super21.apply(this, arguments); } - - _createClass(LinearScale, [{ + _createClass$x(LinearScale, [{ key: "determineDataLimits", value: function determineDataLimits() { - var me = this; - - var _me$getMinMax2 = me.getMinMax(true), - min = _me$getMinMax2.min, - max = _me$getMinMax2.max; - - me.min = isNumberFinite(min) ? min : 0; - me.max = isNumberFinite(max) ? max : 1; - me.handleTickRangeOptions(); + var _this$getMinMax2 = this.getMinMax(true), + min = _this$getMinMax2.min, + max = _this$getMinMax2.max; + this.min = isNumberFinite(min) ? min : 0; + this.max = isNumberFinite(max) ? max : 1; + this.handleTickRangeOptions(); } }, { key: "computeTickLimit", value: function computeTickLimit() { - var me = this; - - if (me.isHorizontal()) { - return Math.ceil(me.width / 40); - } - - var tickFont = me._resolveTickFontOptions(0); - - return Math.ceil(me.height / tickFont.lineHeight); + var horizontal = this.isHorizontal(); + var length = horizontal ? this.width : this.height; + var minRotation = toRadians(this.options.ticks.minRotation); + var ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001; + var tickFont = this._resolveTickFontOptions(0); + return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio)); } }, { key: "getPixelForValue", value: function getPixelForValue(value) { return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange); @@ -15842,260 +15664,235 @@ key: "getValueForPixel", value: function getValueForPixel(pixel) { return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange; } }]); - return LinearScale; }(LinearScaleBase); - - LinearScale.id = 'linear'; - LinearScale.defaults = { + _defineProperty$w(LinearScale, "id", 'linear'); + _defineProperty$w(LinearScale, "defaults", { ticks: { callback: Ticks.formatters.numeric } + }); + var log10Floor = function log10Floor(v) { + return Math.floor(log10(v)); }; - + var changeExponent = function changeExponent(v, m) { + return Math.pow(10, log10Floor(v) + m); + }; function isMajor(tickVal) { - var remain = tickVal / Math.pow(10, Math.floor(log10(tickVal))); + var remain = tickVal / Math.pow(10, log10Floor(tickVal)); return remain === 1; } - - function generateTicks(generationOptions, dataRange) { - var endExp = Math.floor(log10(dataRange.max)); - var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp)); + function steps(min, max, rangeExp) { + var rangeStep = Math.pow(10, rangeExp); + var start = Math.floor(min / rangeStep); + var end = Math.ceil(max / rangeStep); + return end - start; + } + function startExp(min, max) { + var range = max - min; + var rangeExp = log10Floor(range); + while (steps(min, max, rangeExp) > 10) { + rangeExp++; + } + while (steps(min, max, rangeExp) < 10) { + rangeExp--; + } + return Math.min(rangeExp, log10Floor(min)); + } + function generateTicks(generationOptions, _ref13) { + var min = _ref13.min, + max = _ref13.max; + min = finiteOrDefault(generationOptions.min, min); var ticks = []; - var tickVal = finiteOrDefault(generationOptions.min, Math.pow(10, Math.floor(log10(dataRange.min)))); - var exp = Math.floor(log10(tickVal)); - var significand = Math.floor(tickVal / Math.pow(10, exp)); + var minExp = log10Floor(min); + var exp = startExp(min, max); var precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1; - - do { + var stepSize = Math.pow(10, exp); + var base = minExp > exp ? Math.pow(10, minExp) : 0; + var start = Math.round((min - base) * precision) / precision; + var offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10; + var significand = Math.floor((start - offset) / Math.pow(10, exp)); + var value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision); + while (value < max) { ticks.push({ - value: tickVal, - major: isMajor(tickVal) + value: value, + major: isMajor(value), + significand: significand }); - ++significand; - - if (significand === 10) { - significand = 1; - ++exp; + if (significand >= 10) { + significand = significand < 15 ? 15 : 20; + } else { + significand++; + } + if (significand >= 20) { + exp++; + significand = 2; precision = exp >= 0 ? 1 : precision; } - - tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision; - } while (exp < endExp || exp === endExp && significand < endSignificand); - - var lastTick = finiteOrDefault(generationOptions.max, tickVal); + value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision; + } + var lastTick = finiteOrDefault(generationOptions.max, value); ticks.push({ value: lastTick, - major: isMajor(tickVal) + major: isMajor(lastTick), + significand: significand }); return ticks; } - var LogarithmicScale = /*#__PURE__*/function (_Scale3) { - _inherits(LogarithmicScale, _Scale3); - - var _super22 = _createSuper(LogarithmicScale); - + _inherits$w(LogarithmicScale, _Scale3); + var _super22 = _createSuper$w(LogarithmicScale); function LogarithmicScale(cfg) { - var _this15; - - _classCallCheck(this, LogarithmicScale); - - _this15 = _super22.call(this, cfg); - _this15.start = undefined; - _this15.end = undefined; - _this15._startValue = undefined; - _this15._valueRange = 0; - return _this15; + var _this37; + _classCallCheck$x(this, LogarithmicScale); + _this37 = _super22.call(this, cfg); + _this37.start = undefined; + _this37.end = undefined; + _this37._startValue = undefined; + _this37._valueRange = 0; + return _this37; } - - _createClass(LogarithmicScale, [{ + _createClass$x(LogarithmicScale, [{ key: "parse", value: function parse(raw, index) { var value = LinearScaleBase.prototype.parse.apply(this, [raw, index]); - if (value === 0) { this._zero = true; return undefined; } - return isNumberFinite(value) && value > 0 ? value : null; } }, { key: "determineDataLimits", value: function determineDataLimits() { - var me = this; - - var _me$getMinMax3 = me.getMinMax(true), - min = _me$getMinMax3.min, - max = _me$getMinMax3.max; - - me.min = isNumberFinite(min) ? Math.max(0, min) : null; - me.max = isNumberFinite(max) ? Math.max(0, max) : null; - - if (me.options.beginAtZero) { - me._zero = true; + var _this$getMinMax3 = this.getMinMax(true), + min = _this$getMinMax3.min, + max = _this$getMinMax3.max; + this.min = isNumberFinite(min) ? Math.max(0, min) : null; + this.max = isNumberFinite(max) ? Math.max(0, max) : null; + if (this.options.beginAtZero) { + this._zero = true; } - - me.handleTickRangeOptions(); + if (this._zero && this.min !== this._suggestedMin && !isNumberFinite(this._userMin)) { + this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0); + } + this.handleTickRangeOptions(); } }, { key: "handleTickRangeOptions", value: function handleTickRangeOptions() { - var me = this; - - var _me$getUserBounds4 = me.getUserBounds(), - minDefined = _me$getUserBounds4.minDefined, - maxDefined = _me$getUserBounds4.maxDefined; - - var min = me.min; - var max = me.max; - + var _this$getUserBounds4 = this.getUserBounds(), + minDefined = _this$getUserBounds4.minDefined, + maxDefined = _this$getUserBounds4.maxDefined; + var min = this.min; + var max = this.max; var setMin = function setMin(v) { return min = minDefined ? min : v; }; - var setMax = function setMax(v) { return max = maxDefined ? max : v; }; - - var exp = function exp(v, m) { - return Math.pow(10, Math.floor(log10(v)) + m); - }; - if (min === max) { if (min <= 0) { setMin(1); setMax(10); } else { - setMin(exp(min, -1)); - setMax(exp(max, +1)); + setMin(changeExponent(min, -1)); + setMax(changeExponent(max, +1)); } } - if (min <= 0) { - setMin(exp(max, -1)); + setMin(changeExponent(max, -1)); } - if (max <= 0) { - setMax(exp(min, +1)); + setMax(changeExponent(min, +1)); } - - if (me._zero && me.min !== me._suggestedMin && min === exp(me.min, 0)) { - setMin(exp(min, -1)); - } - - me.min = min; - me.max = max; + this.min = min; + this.max = max; } }, { key: "buildTicks", value: function buildTicks() { - var me = this; - var opts = me.options; + var opts = this.options; var generationOptions = { - min: me._userMin, - max: me._userMax + min: this._userMin, + max: this._userMax }; - var ticks = generateTicks(generationOptions, me); - + var ticks = generateTicks(generationOptions, this); if (opts.bounds === 'ticks') { - _setMinAndMaxByKey(ticks, me, 'value'); + _setMinAndMaxByKey(ticks, this, 'value'); } - if (opts.reverse) { ticks.reverse(); - me.start = me.max; - me.end = me.min; + this.start = this.max; + this.end = this.min; } else { - me.start = me.min; - me.end = me.max; + this.start = this.min; + this.end = this.max; } - return ticks; } }, { key: "getLabelForValue", value: function getLabelForValue(value) { - return value === undefined ? '0' : formatNumber(value, this.chart.options.locale); + return value === undefined ? '0' : formatNumber(value, this.chart.options.locale, this.options.ticks.format); } }, { key: "configure", value: function configure() { - var me = this; - var start = me.min; - - _get(_getPrototypeOf(LogarithmicScale.prototype), "configure", this).call(this); - - me._startValue = log10(start); - me._valueRange = log10(me.max) - log10(start); + var start = this.min; + _get(_getPrototypeOf$w(LogarithmicScale.prototype), "configure", this).call(this); + this._startValue = log10(start); + this._valueRange = log10(this.max) - log10(start); } }, { key: "getPixelForValue", value: function getPixelForValue(value) { - var me = this; - if (value === undefined || value === 0) { - value = me.min; + value = this.min; } - if (value === null || isNaN(value)) { return NaN; } - - return me.getPixelForDecimal(value === me.min ? 0 : (log10(value) - me._startValue) / me._valueRange); + return this.getPixelForDecimal(value === this.min ? 0 : (log10(value) - this._startValue) / this._valueRange); } }, { key: "getValueForPixel", value: function getValueForPixel(pixel) { - var me = this; - var decimal = me.getDecimalForPixel(pixel); - return Math.pow(10, me._startValue + decimal * me._valueRange); + var decimal = this.getDecimalForPixel(pixel); + return Math.pow(10, this._startValue + decimal * this._valueRange); } }]); - return LogarithmicScale; }(Scale); - - LogarithmicScale.id = 'logarithmic'; - LogarithmicScale.defaults = { + _defineProperty$w(LogarithmicScale, "id", 'logarithmic'); + _defineProperty$w(LogarithmicScale, "defaults", { ticks: { callback: Ticks.formatters.logarithmic, major: { enabled: true } } - }; - + }); function getTickBackdropHeight(opts) { var tickOpts = opts.ticks; - if (tickOpts.display && opts.display) { var padding = toPadding(tickOpts.backdropPadding); return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height; } - return 0; } - - function measureLabelSize(ctx, lineHeight, label) { - if (isArray(label)) { - return { - w: _longestText(ctx, ctx.font, label), - h: label.length * lineHeight - }; - } - + function measureLabelSize(ctx, font, label) { + label = isArray(label) ? label : [label]; return { - w: ctx.measureText(label).width, - h: lineHeight + w: _longestText(ctx, font.string, label), + h: label.length * font.lineHeight }; } - function determineLimits(angle, pos, size, min, max) { if (angle === min || angle === max) { return { start: pos - size / 2, end: pos + size / 2 @@ -16104,334 +15901,312 @@ return { start: pos - size, end: pos }; } - return { start: pos, end: pos + size }; } - function fitWithPointLabels(scale) { - var furthestLimits = { - l: 0, - r: scale.width, - t: 0, - b: scale.height - scale.paddingTop + var orig = { + l: scale.left + scale._padding.left, + r: scale.right - scale._padding.right, + t: scale.top + scale._padding.top, + b: scale.bottom - scale._padding.bottom }; - var furthestAngles = {}; - var i, textSize, pointPosition; + var limits = Object.assign({}, orig); var labelSizes = []; var padding = []; - var valueCount = scale.getLabels().length; - - for (i = 0; i < valueCount; i++) { - var _opts = scale.options.pointLabels.setContext(scale.getContext(i)); - - padding[i] = _opts.padding; - pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i]); - var plFont = toFont(_opts.font); - scale.ctx.font = plFont.string; - textSize = measureLabelSize(scale.ctx, plFont.lineHeight, scale._pointLabels[i]); + var valueCount = scale._pointLabels.length; + var pointLabelOpts = scale.options.pointLabels; + var additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0; + for (var i = 0; i < valueCount; i++) { + var opts = pointLabelOpts.setContext(scale.getPointLabelContext(i)); + padding[i] = opts.padding; + var pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle); + var plFont = toFont(opts.font); + var textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]); labelSizes[i] = textSize; - var angleRadians = scale.getIndexAngle(i); - var angle = toDegrees(angleRadians); + var angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle); + var angle = Math.round(toDegrees(angleRadians)); var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180); var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270); - - if (hLimits.start < furthestLimits.l) { - furthestLimits.l = hLimits.start; - furthestAngles.l = angleRadians; - } - - if (hLimits.end > furthestLimits.r) { - furthestLimits.r = hLimits.end; - furthestAngles.r = angleRadians; - } - - if (vLimits.start < furthestLimits.t) { - furthestLimits.t = vLimits.start; - furthestAngles.t = angleRadians; - } - - if (vLimits.end > furthestLimits.b) { - furthestLimits.b = vLimits.end; - furthestAngles.b = angleRadians; - } + updateLimits(limits, orig, angleRadians, hLimits, vLimits); } - - scale._setReductions(scale.drawingArea, furthestLimits, furthestAngles); - - scale._pointLabelItems = []; + scale.setCenterPoint(orig.l - limits.l, limits.r - orig.r, orig.t - limits.t, limits.b - orig.b); + scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding); + } + function updateLimits(limits, orig, angle, hLimits, vLimits) { + var sin = Math.abs(Math.sin(angle)); + var cos = Math.abs(Math.cos(angle)); + var x = 0; + var y = 0; + if (hLimits.start < orig.l) { + x = (orig.l - hLimits.start) / sin; + limits.l = Math.min(limits.l, orig.l - x); + } else if (hLimits.end > orig.r) { + x = (hLimits.end - orig.r) / sin; + limits.r = Math.max(limits.r, orig.r + x); + } + if (vLimits.start < orig.t) { + y = (orig.t - vLimits.start) / cos; + limits.t = Math.min(limits.t, orig.t - y); + } else if (vLimits.end > orig.b) { + y = (vLimits.end - orig.b) / cos; + limits.b = Math.max(limits.b, orig.b + y); + } + } + function buildPointLabelItems(scale, labelSizes, padding) { + var items = []; + var valueCount = scale._pointLabels.length; var opts = scale.options; - var tickBackdropHeight = getTickBackdropHeight(opts); - var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max); - - for (i = 0; i < valueCount; i++) { - var extra = i === 0 ? tickBackdropHeight / 2 : 0; - var pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + padding[i]); - - var _angle = toDegrees(scale.getIndexAngle(i)); - + var extra = getTickBackdropHeight(opts) / 2; + var outerDistance = scale.drawingArea; + var additionalAngle = opts.pointLabels.centerPointLabels ? PI / valueCount : 0; + for (var i = 0; i < valueCount; i++) { + var pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + padding[i], additionalAngle); + var angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI))); var size = labelSizes[i]; - adjustPointPositionForLabelHeight(_angle, size, pointLabelPosition); - var textAlign = getTextAlignForAngle(_angle); - var left = void 0; - - if (textAlign === 'left') { - left = pointLabelPosition.x; - } else if (textAlign === 'center') { - left = pointLabelPosition.x - size.w / 2; - } else { - left = pointLabelPosition.x - size.w; - } - - var right = left + size.w; - scale._pointLabelItems[i] = { + var y = yForAngle(pointLabelPosition.y, size.h, angle); + var textAlign = getTextAlignForAngle(angle); + var left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign); + items.push({ x: pointLabelPosition.x, - y: pointLabelPosition.y, + y: y, textAlign: textAlign, left: left, - top: pointLabelPosition.y, - right: right, - bottom: pointLabelPosition.y + size.h - }; + top: y, + right: left + size.w, + bottom: y + size.h + }); } + return items; } - function getTextAlignForAngle(angle) { if (angle === 0 || angle === 180) { return 'center'; } else if (angle < 180) { return 'left'; } - return 'right'; } - - function adjustPointPositionForLabelHeight(angle, textSize, position) { + function leftForTextAlign(x, w, align) { + if (align === 'right') { + x -= w; + } else if (align === 'center') { + x -= w / 2; + } + return x; + } + function yForAngle(y, h, angle) { if (angle === 90 || angle === 270) { - position.y -= textSize.h / 2; + y -= h / 2; } else if (angle > 270 || angle < 90) { - position.y -= textSize.h; + y -= h; } + return y; } - function drawPointLabels(scale, labelCount) { var ctx = scale.ctx, - pointLabels = scale.options.pointLabels; - + pointLabels = scale.options.pointLabels; for (var i = labelCount - 1; i >= 0; i--) { - var optsAtIndex = pointLabels.setContext(scale.getContext(i)); + var optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i)); var plFont = toFont(optsAtIndex.font); var _scale$_pointLabelIte = scale._pointLabelItems[i], - x = _scale$_pointLabelIte.x, - y = _scale$_pointLabelIte.y, - textAlign = _scale$_pointLabelIte.textAlign, - left = _scale$_pointLabelIte.left, - top = _scale$_pointLabelIte.top, - right = _scale$_pointLabelIte.right, - bottom = _scale$_pointLabelIte.bottom; + x = _scale$_pointLabelIte.x, + y = _scale$_pointLabelIte.y, + textAlign = _scale$_pointLabelIte.textAlign, + left = _scale$_pointLabelIte.left, + top = _scale$_pointLabelIte.top, + right = _scale$_pointLabelIte.right, + bottom = _scale$_pointLabelIte.bottom; var backdropColor = optsAtIndex.backdropColor; - if (!isNullOrUndef(backdropColor)) { + var borderRadius = toTRBLCorners(optsAtIndex.borderRadius); var padding = toPadding(optsAtIndex.backdropPadding); ctx.fillStyle = backdropColor; - ctx.fillRect(left - padding.left, top - padding.top, right - left + padding.width, bottom - top + padding.height); + var backdropLeft = left - padding.left; + var backdropTop = top - padding.top; + var backdropWidth = right - left + padding.width; + var backdropHeight = bottom - top + padding.height; + if (Object.values(borderRadius).some(function (v) { + return v !== 0; + })) { + ctx.beginPath(); + addRoundedRectPath(ctx, { + x: backdropLeft, + y: backdropTop, + w: backdropWidth, + h: backdropHeight, + radius: borderRadius + }); + ctx.fill(); + } else { + ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight); + } } - renderText(ctx, scale._pointLabels[i], x, y + plFont.lineHeight / 2, plFont, { color: optsAtIndex.color, textAlign: textAlign, textBaseline: 'middle' }); } } - function pathRadiusLine(scale, radius, circular, labelCount) { var ctx = scale.ctx; - if (circular) { ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU); } else { var pointPosition = scale.getPointPosition(0, radius); ctx.moveTo(pointPosition.x, pointPosition.y); - for (var i = 1; i < labelCount; i++) { pointPosition = scale.getPointPosition(i, radius); ctx.lineTo(pointPosition.x, pointPosition.y); } } } - - function drawRadiusLine(scale, gridLineOpts, radius, labelCount) { + function drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) { var ctx = scale.ctx; var circular = gridLineOpts.circular; var color = gridLineOpts.color, - lineWidth = gridLineOpts.lineWidth; - + lineWidth = gridLineOpts.lineWidth; if (!circular && !labelCount || !color || !lineWidth || radius < 0) { return; } - ctx.save(); ctx.strokeStyle = color; ctx.lineWidth = lineWidth; - ctx.setLineDash(gridLineOpts.borderDash); - ctx.lineDashOffset = gridLineOpts.borderDashOffset; + ctx.setLineDash(borderOpts.dash); + ctx.lineDashOffset = borderOpts.dashOffset; ctx.beginPath(); pathRadiusLine(scale, radius, circular, labelCount); ctx.closePath(); ctx.stroke(); ctx.restore(); } - - function numberOrZero(param) { - return isNumber(param) ? param : 0; + function createPointLabelContext(parent, index, label) { + return createContext(parent, { + label: label, + index: index, + type: 'pointLabel' + }); } - var RadialLinearScale = /*#__PURE__*/function (_LinearScaleBase2) { - _inherits(RadialLinearScale, _LinearScaleBase2); - - var _super23 = _createSuper(RadialLinearScale); - + _inherits$w(RadialLinearScale, _LinearScaleBase2); + var _super23 = _createSuper$w(RadialLinearScale); function RadialLinearScale(cfg) { - var _this16; - - _classCallCheck(this, RadialLinearScale); - - _this16 = _super23.call(this, cfg); - _this16.xCenter = undefined; - _this16.yCenter = undefined; - _this16.drawingArea = undefined; - _this16._pointLabels = []; - _this16._pointLabelItems = []; - return _this16; + var _this38; + _classCallCheck$x(this, RadialLinearScale); + _this38 = _super23.call(this, cfg); + _this38.xCenter = undefined; + _this38.yCenter = undefined; + _this38.drawingArea = undefined; + _this38._pointLabels = []; + _this38._pointLabelItems = []; + return _this38; } - - _createClass(RadialLinearScale, [{ + _createClass$x(RadialLinearScale, [{ key: "setDimensions", value: function setDimensions() { - var me = this; - me.width = me.maxWidth; - me.height = me.maxHeight; - me.paddingTop = getTickBackdropHeight(me.options) / 2; - me.xCenter = Math.floor(me.width / 2); - me.yCenter = Math.floor((me.height - me.paddingTop) / 2); - me.drawingArea = Math.min(me.height - me.paddingTop, me.width) / 2; + var padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2); + var w = this.width = this.maxWidth - padding.width; + var h = this.height = this.maxHeight - padding.height; + this.xCenter = Math.floor(this.left + w / 2 + padding.left); + this.yCenter = Math.floor(this.top + h / 2 + padding.top); + this.drawingArea = Math.floor(Math.min(w, h) / 2); } }, { key: "determineDataLimits", value: function determineDataLimits() { - var me = this; - - var _me$getMinMax4 = me.getMinMax(false), - min = _me$getMinMax4.min, - max = _me$getMinMax4.max; - - me.min = isNumberFinite(min) && !isNaN(min) ? min : 0; - me.max = isNumberFinite(max) && !isNaN(max) ? max : 0; - me.handleTickRangeOptions(); + var _this$getMinMax4 = this.getMinMax(false), + min = _this$getMinMax4.min, + max = _this$getMinMax4.max; + this.min = isNumberFinite(min) && !isNaN(min) ? min : 0; + this.max = isNumberFinite(max) && !isNaN(max) ? max : 0; + this.handleTickRangeOptions(); } }, { key: "computeTickLimit", value: function computeTickLimit() { return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options)); } }, { key: "generateTickLabels", value: function generateTickLabels(ticks) { - var me = this; - LinearScaleBase.prototype.generateTickLabels.call(me, ticks); - me._pointLabels = me.getLabels().map(function (value, index) { - var label = callback(me.options.pointLabels.callback, [value, index], me); + var _this39 = this; + LinearScaleBase.prototype.generateTickLabels.call(this, ticks); + this._pointLabels = this.getLabels().map(function (value, index) { + var label = callback(_this39.options.pointLabels.callback, [value, index], _this39); return label || label === 0 ? label : ''; + }).filter(function (v, i) { + return _this39.chart.getDataVisibility(i); }); } }, { key: "fit", value: function fit() { - var me = this; - var opts = me.options; - + var opts = this.options; if (opts.display && opts.pointLabels.display) { - fitWithPointLabels(me); + fitWithPointLabels(this); } else { - me.setCenterPoint(0, 0, 0, 0); + this.setCenterPoint(0, 0, 0, 0); } } }, { - key: "_setReductions", - value: function _setReductions(largestPossibleRadius, furthestLimits, furthestAngles) { - var me = this; - var radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l); - var radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r); - var radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t); - var radiusReductionBottom = -Math.max(furthestLimits.b - (me.height - me.paddingTop), 0) / Math.cos(furthestAngles.b); - radiusReductionLeft = numberOrZero(radiusReductionLeft); - radiusReductionRight = numberOrZero(radiusReductionRight); - radiusReductionTop = numberOrZero(radiusReductionTop); - radiusReductionBottom = numberOrZero(radiusReductionBottom); - me.drawingArea = Math.max(largestPossibleRadius / 2, Math.min(Math.floor(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2), Math.floor(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2))); - me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom); - } - }, { key: "setCenterPoint", value: function setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) { - var me = this; - var maxRight = me.width - rightMovement - me.drawingArea; - var maxLeft = leftMovement + me.drawingArea; - var maxTop = topMovement + me.drawingArea; - var maxBottom = me.height - me.paddingTop - bottomMovement - me.drawingArea; - me.xCenter = Math.floor((maxLeft + maxRight) / 2 + me.left); - me.yCenter = Math.floor((maxTop + maxBottom) / 2 + me.top + me.paddingTop); + this.xCenter += Math.floor((leftMovement - rightMovement) / 2); + this.yCenter += Math.floor((topMovement - bottomMovement) / 2); + this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement)); } }, { key: "getIndexAngle", value: function getIndexAngle(index) { - var angleMultiplier = TAU / this.getLabels().length; + var angleMultiplier = TAU / (this._pointLabels.length || 1); var startAngle = this.options.startAngle || 0; return _normalizeAngle(index * angleMultiplier + toRadians(startAngle)); } }, { key: "getDistanceFromCenterForValue", value: function getDistanceFromCenterForValue(value) { - var me = this; - if (isNullOrUndef(value)) { return NaN; } - - var scalingFactor = me.drawingArea / (me.max - me.min); - - if (me.options.reverse) { - return (me.max - value) * scalingFactor; + var scalingFactor = this.drawingArea / (this.max - this.min); + if (this.options.reverse) { + return (this.max - value) * scalingFactor; } - - return (value - me.min) * scalingFactor; + return (value - this.min) * scalingFactor; } }, { key: "getValueForDistanceFromCenter", value: function getValueForDistanceFromCenter(distance) { if (isNullOrUndef(distance)) { return NaN; } - - var me = this; - var scaledDistance = distance / (me.drawingArea / (me.max - me.min)); - return me.options.reverse ? me.max - scaledDistance : me.min + scaledDistance; + var scaledDistance = distance / (this.drawingArea / (this.max - this.min)); + return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance; } }, { + key: "getPointLabelContext", + value: function getPointLabelContext(index) { + var pointLabels = this._pointLabels || []; + if (index >= 0 && index < pointLabels.length) { + var pointLabel = pointLabels[index]; + return createPointLabelContext(this.getContext(), index, pointLabel); + } + } + }, { key: "getPointPosition", value: function getPointPosition(index, distanceFromCenter) { - var me = this; - var angle = me.getIndexAngle(index) - HALF_PI; + var additionalAngle = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + var angle = this.getIndexAngle(index) - HALF_PI + additionalAngle; return { - x: Math.cos(angle) * distanceFromCenter + me.xCenter, - y: Math.sin(angle) * distanceFromCenter + me.yCenter, + x: Math.cos(angle) * distanceFromCenter + this.xCenter, + y: Math.sin(angle) * distanceFromCenter + this.yCenter, angle: angle }; } }, { key: "getPointPositionForValue", @@ -16445,143 +16220,134 @@ } }, { key: "getPointLabelPosition", value: function getPointLabelPosition(index) { var _this$_pointLabelItem = this._pointLabelItems[index], - left = _this$_pointLabelItem.left, - top = _this$_pointLabelItem.top, - right = _this$_pointLabelItem.right, - bottom = _this$_pointLabelItem.bottom; + left = _this$_pointLabelItem.left, + top = _this$_pointLabelItem.top, + right = _this$_pointLabelItem.right, + bottom = _this$_pointLabelItem.bottom; return { left: left, top: top, right: right, bottom: bottom }; } }, { key: "drawBackground", value: function drawBackground() { - var me = this; - var _me$options8 = me.options, - backgroundColor = _me$options8.backgroundColor, - circular = _me$options8.grid.circular; - + var _this$options16 = this.options, + backgroundColor = _this$options16.backgroundColor, + circular = _this$options16.grid.circular; if (backgroundColor) { - var ctx = me.ctx; + var ctx = this.ctx; ctx.save(); ctx.beginPath(); - pathRadiusLine(me, me.getDistanceFromCenterForValue(me._endValue), circular, me.getLabels().length); + pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length); ctx.closePath(); ctx.fillStyle = backgroundColor; ctx.fill(); ctx.restore(); } } }, { key: "drawGrid", value: function drawGrid() { - var me = this; - var ctx = me.ctx; - var opts = me.options; + var _this40 = this; + var ctx = this.ctx; + var opts = this.options; var angleLines = opts.angleLines, - grid = opts.grid; - var labelCount = me.getLabels().length; + grid = opts.grid, + border = opts.border; + var labelCount = this._pointLabels.length; var i, offset, position; - if (opts.pointLabels.display) { - drawPointLabels(me, labelCount); + drawPointLabels(this, labelCount); } - if (grid.display) { - me.ticks.forEach(function (tick, index) { + this.ticks.forEach(function (tick, index) { if (index !== 0) { - offset = me.getDistanceFromCenterForValue(tick.value); - var optsAtIndex = grid.setContext(me.getContext(index - 1)); - drawRadiusLine(me, optsAtIndex, offset, labelCount); + offset = _this40.getDistanceFromCenterForValue(tick.value); + var context = _this40.getContext(index); + var optsAtIndex = grid.setContext(context); + var optsAtIndexBorder = border.setContext(context); + drawRadiusLine(_this40, optsAtIndex, offset, labelCount, optsAtIndexBorder); } }); } - if (angleLines.display) { ctx.save(); - - for (i = me.getLabels().length - 1; i >= 0; i--) { - var optsAtIndex = angleLines.setContext(me.getContext(i)); + for (i = labelCount - 1; i >= 0; i--) { + var optsAtIndex = angleLines.setContext(this.getPointLabelContext(i)); var color = optsAtIndex.color, - lineWidth = optsAtIndex.lineWidth; - + lineWidth = optsAtIndex.lineWidth; if (!lineWidth || !color) { continue; } - ctx.lineWidth = lineWidth; ctx.strokeStyle = color; ctx.setLineDash(optsAtIndex.borderDash); ctx.lineDashOffset = optsAtIndex.borderDashOffset; - offset = me.getDistanceFromCenterForValue(opts.ticks.reverse ? me.min : me.max); - position = me.getPointPosition(i, offset); + offset = this.getDistanceFromCenterForValue(opts.ticks.reverse ? this.min : this.max); + position = this.getPointPosition(i, offset); ctx.beginPath(); - ctx.moveTo(me.xCenter, me.yCenter); + ctx.moveTo(this.xCenter, this.yCenter); ctx.lineTo(position.x, position.y); ctx.stroke(); } - ctx.restore(); } } }, { + key: "drawBorder", + value: function drawBorder() {} + }, { key: "drawLabels", value: function drawLabels() { - var me = this; - var ctx = me.ctx; - var opts = me.options; + var _this41 = this; + var ctx = this.ctx; + var opts = this.options; var tickOpts = opts.ticks; - if (!tickOpts.display) { return; } - - var startAngle = me.getIndexAngle(0); + var startAngle = this.getIndexAngle(0); var offset, width; ctx.save(); - ctx.translate(me.xCenter, me.yCenter); + ctx.translate(this.xCenter, this.yCenter); ctx.rotate(startAngle); ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; - me.ticks.forEach(function (tick, index) { + this.ticks.forEach(function (tick, index) { if (index === 0 && !opts.reverse) { return; } - - var optsAtIndex = tickOpts.setContext(me.getContext(index)); + var optsAtIndex = tickOpts.setContext(_this41.getContext(index)); var tickFont = toFont(optsAtIndex.font); - offset = me.getDistanceFromCenterForValue(me.ticks[index].value); - + offset = _this41.getDistanceFromCenterForValue(_this41.ticks[index].value); if (optsAtIndex.showLabelBackdrop) { + ctx.font = tickFont.string; width = ctx.measureText(tick.label).width; ctx.fillStyle = optsAtIndex.backdropColor; var padding = toPadding(optsAtIndex.backdropPadding); ctx.fillRect(-width / 2 - padding.left, -offset - tickFont.size / 2 - padding.top, width + padding.width, tickFont.size + padding.height); } - renderText(ctx, tick.label, 0, -offset, tickFont, { color: optsAtIndex.color }); }); ctx.restore(); } }, { key: "drawTitle", value: function drawTitle() {} }]); - return RadialLinearScale; }(LinearScaleBase); - - RadialLinearScale.id = 'radialLinear'; - RadialLinearScale.defaults = { + _defineProperty$w(RadialLinearScale, "id", 'radialLinear'); + _defineProperty$w(RadialLinearScale, "defaults", { display: true, animate: true, position: 'chartArea', angleLines: { display: true, @@ -16593,12 +16359,10 @@ circular: false }, startAngle: 0, ticks: { showLabelBackdrop: true, - backdropColor: 'rgba(255,255,255,0.75)', - backdropPadding: 2, callback: Ticks.formatters.numeric }, pointLabels: { backdropColor: undefined, backdropPadding: 2, @@ -16607,23 +16371,24 @@ size: 10 }, callback: function callback(label) { return label; }, - padding: 5 + padding: 5, + centerPointLabels: false } - }; - RadialLinearScale.defaultRoutes = { + }); + _defineProperty$w(RadialLinearScale, "defaultRoutes", { 'angleLines.color': 'borderColor', 'pointLabels.color': 'color', 'ticks.color': 'color' - }; - RadialLinearScale.descriptors = { + }); + _defineProperty$w(RadialLinearScale, "descriptors", { angleLines: { _fallback: 'grid' } - }; + }); var INTERVALS = { millisecond: { common: true, size: 1, steps: 1000 @@ -16666,494 +16431,428 @@ year: { common: true, size: 3.154e10 } }; - var UNITS = Object.keys(INTERVALS); - + var UNITS = /* #__PURE__ */Object.keys(INTERVALS); function sorter(a, b) { return a - b; } - function _parse(scale, input) { if (isNullOrUndef(input)) { return null; } - var adapter = scale._adapter; - var options = scale.options.time; - var parser = options.parser, - round = options.round, - isoWeekday = options.isoWeekday; + var _scale$_parseOpts = scale._parseOpts, + parser = _scale$_parseOpts.parser, + round = _scale$_parseOpts.round, + isoWeekday = _scale$_parseOpts.isoWeekday; var value = input; - if (typeof parser === 'function') { value = parser(value); } - if (!isNumberFinite(value)) { value = typeof parser === 'string' ? adapter.parse(value, parser) : adapter.parse(value); } - if (value === null) { return null; } - if (round) { value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true) ? adapter.startOf(value, 'isoWeek', isoWeekday) : adapter.startOf(value, round); } - return +value; } - function determineUnitForAutoTicks(minUnit, min, max, capacity) { var ilen = UNITS.length; - for (var i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) { var interval = INTERVALS[UNITS[i]]; var factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER; - if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) { return UNITS[i]; } } - return UNITS[ilen - 1]; } - function determineUnitForFormatting(scale, numTicks, minUnit, min, max) { for (var i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) { var unit = UNITS[i]; - if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) { return unit; } } - return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0]; } - function determineMajorUnit(unit) { for (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) { if (INTERVALS[UNITS[i]].common) { return UNITS[i]; } } } - function addTick(ticks, time, timestamps) { if (!timestamps) { ticks[time] = true; } else if (timestamps.length) { var _lookup2 = _lookup(timestamps, time), - lo = _lookup2.lo, - hi = _lookup2.hi; - + lo = _lookup2.lo, + hi = _lookup2.hi; var timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi]; ticks[timestamp] = true; } } - function setMajorTicks(scale, ticks, map, majorUnit) { var adapter = scale._adapter; var first = +adapter.startOf(ticks[0].value, majorUnit); var last = ticks[ticks.length - 1].value; var major, index; - for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) { index = map[major]; - if (index >= 0) { ticks[index].major = true; } } - return ticks; } - function ticksFromTimestamps(scale, values, majorUnit) { var ticks = []; var map = {}; var ilen = values.length; var i, value; - for (i = 0; i < ilen; ++i) { value = values[i]; map[value] = i; ticks.push({ value: value, major: false }); } - return ilen === 0 || !majorUnit ? ticks : setMajorTicks(scale, ticks, map, majorUnit); } - var TimeScale = /*#__PURE__*/function (_Scale4) { - _inherits(TimeScale, _Scale4); - - var _super24 = _createSuper(TimeScale); - + _inherits$w(TimeScale, _Scale4); + var _super24 = _createSuper$w(TimeScale); function TimeScale(props) { - var _this17; - - _classCallCheck(this, TimeScale); - - _this17 = _super24.call(this, props); - _this17._cache = { + var _this42; + _classCallCheck$x(this, TimeScale); + _this42 = _super24.call(this, props); + _this42._cache = { data: [], labels: [], all: [] }; - _this17._unit = 'day'; - _this17._majorUnit = undefined; - _this17._offsets = {}; - _this17._normalized = false; - return _this17; + _this42._unit = 'day'; + _this42._majorUnit = undefined; + _this42._offsets = {}; + _this42._normalized = false; + _this42._parseOpts = undefined; + return _this42; } - - _createClass(TimeScale, [{ + _createClass$x(TimeScale, [{ key: "init", - value: function init(scaleOpts, opts) { + value: function init(scaleOpts) { + var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var time = scaleOpts.time || (scaleOpts.time = {}); var adapter = this._adapter = new adapters._date(scaleOpts.adapters.date); + adapter.init(opts); mergeIf(time.displayFormats, adapter.formats()); - - _get(_getPrototypeOf(TimeScale.prototype), "init", this).call(this, scaleOpts); - + this._parseOpts = { + parser: time.parser, + round: time.round, + isoWeekday: time.isoWeekday + }; + _get(_getPrototypeOf$w(TimeScale.prototype), "init", this).call(this, scaleOpts); this._normalized = opts.normalized; } }, { key: "parse", value: function parse(raw, index) { if (raw === undefined) { return null; } - return _parse(this, raw); } }, { key: "beforeLayout", value: function beforeLayout() { - _get(_getPrototypeOf(TimeScale.prototype), "beforeLayout", this).call(this); - + _get(_getPrototypeOf$w(TimeScale.prototype), "beforeLayout", this).call(this); this._cache = { data: [], labels: [], all: [] }; } }, { key: "determineDataLimits", value: function determineDataLimits() { - var me = this; - var options = me.options; - var adapter = me._adapter; + var options = this.options; + var adapter = this._adapter; var unit = options.time.unit || 'day'; - - var _me$getUserBounds5 = me.getUserBounds(), - min = _me$getUserBounds5.min, - max = _me$getUserBounds5.max, - minDefined = _me$getUserBounds5.minDefined, - maxDefined = _me$getUserBounds5.maxDefined; - + var _this$getUserBounds5 = this.getUserBounds(), + min = _this$getUserBounds5.min, + max = _this$getUserBounds5.max, + minDefined = _this$getUserBounds5.minDefined, + maxDefined = _this$getUserBounds5.maxDefined; function _applyBounds(bounds) { if (!minDefined && !isNaN(bounds.min)) { min = Math.min(min, bounds.min); } - if (!maxDefined && !isNaN(bounds.max)) { max = Math.max(max, bounds.max); } } - if (!minDefined || !maxDefined) { - _applyBounds(me._getLabelBounds()); - + _applyBounds(this._getLabelBounds()); if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') { - _applyBounds(me.getMinMax(false)); + _applyBounds(this.getMinMax(false)); } } - min = isNumberFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit); max = isNumberFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1; - me.min = Math.min(min, max - 1); - me.max = Math.max(min + 1, max); + this.min = Math.min(min, max - 1); + this.max = Math.max(min + 1, max); } }, { key: "_getLabelBounds", value: function _getLabelBounds() { var arr = this.getLabelTimestamps(); var min = Number.POSITIVE_INFINITY; var max = Number.NEGATIVE_INFINITY; - if (arr.length) { min = arr[0]; max = arr[arr.length - 1]; } - return { min: min, max: max }; } }, { key: "buildTicks", value: function buildTicks() { - var me = this; - var options = me.options; + var options = this.options; var timeOpts = options.time; var tickOpts = options.ticks; - var timestamps = tickOpts.source === 'labels' ? me.getLabelTimestamps() : me._generate(); - + var timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate(); if (options.bounds === 'ticks' && timestamps.length) { - me.min = me._userMin || timestamps[0]; - me.max = me._userMax || timestamps[timestamps.length - 1]; + this.min = this._userMin || timestamps[0]; + this.max = this._userMax || timestamps[timestamps.length - 1]; } - - var min = me.min; - var max = me.max; - + var min = this.min; + var max = this.max; var ticks = _filterBetween(timestamps, min, max); - - me._unit = timeOpts.unit || (tickOpts.autoSkip ? determineUnitForAutoTicks(timeOpts.minUnit, me.min, me.max, me._getLabelCapacity(min)) : determineUnitForFormatting(me, ticks.length, timeOpts.minUnit, me.min, me.max)); - me._majorUnit = !tickOpts.major.enabled || me._unit === 'year' ? undefined : determineMajorUnit(me._unit); - me.initOffsets(timestamps); - + this._unit = timeOpts.unit || (tickOpts.autoSkip ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min)) : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max)); + this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined : determineMajorUnit(this._unit); + this.initOffsets(timestamps); if (options.reverse) { ticks.reverse(); } - - return ticksFromTimestamps(me, ticks, me._majorUnit); + return ticksFromTimestamps(this, ticks, this._majorUnit); } }, { + key: "afterAutoSkip", + value: function afterAutoSkip() { + if (this.options.offsetAfterAutoskip) { + this.initOffsets(this.ticks.map(function (tick) { + return +tick.value; + })); + } + } + }, { key: "initOffsets", - value: function initOffsets(timestamps) { - var me = this; + value: function initOffsets() { + var timestamps = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var start = 0; var end = 0; var first, last; - - if (me.options.offset && timestamps.length) { - first = me.getDecimalForValue(timestamps[0]); - + if (this.options.offset && timestamps.length) { + first = this.getDecimalForValue(timestamps[0]); if (timestamps.length === 1) { start = 1 - first; } else { - start = (me.getDecimalForValue(timestamps[1]) - first) / 2; + start = (this.getDecimalForValue(timestamps[1]) - first) / 2; } - - last = me.getDecimalForValue(timestamps[timestamps.length - 1]); - + last = this.getDecimalForValue(timestamps[timestamps.length - 1]); if (timestamps.length === 1) { end = last; } else { - end = (last - me.getDecimalForValue(timestamps[timestamps.length - 2])) / 2; + end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2; } } - var limit = timestamps.length < 3 ? 0.5 : 0.25; start = _limitValue(start, 0, limit); end = _limitValue(end, 0, limit); - me._offsets = { + this._offsets = { start: start, end: end, factor: 1 / (start + 1 + end) }; } }, { key: "_generate", value: function _generate() { - var me = this; - var adapter = me._adapter; - var min = me.min; - var max = me.max; - var options = me.options; + var adapter = this._adapter; + var min = this.min; + var max = this.max; + var options = this.options; var timeOpts = options.time; - var minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, me._getLabelCapacity(min)); - var stepSize = valueOrDefault(timeOpts.stepSize, 1); + var minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min)); + var stepSize = valueOrDefault(options.ticks.stepSize, 1); var weekday = minor === 'week' ? timeOpts.isoWeekday : false; var hasWeekday = isNumber(weekday) || weekday === true; var ticks = {}; var first = min; var time, count; - if (hasWeekday) { first = +adapter.startOf(first, 'isoWeek', weekday); } - first = +adapter.startOf(first, hasWeekday ? 'day' : minor); - if (adapter.diff(max, min, minor) > 100000 * stepSize) { throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor); } - - var timestamps = options.ticks.source === 'data' && me.getDataTimestamps(); - + var timestamps = options.ticks.source === 'data' && this.getDataTimestamps(); for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) { addTick(ticks, time, timestamps); } - if (time === max || options.bounds === 'ticks' || count === 1) { addTick(ticks, time, timestamps); } - return Object.keys(ticks).sort(function (a, b) { return a - b; }).map(function (x) { return +x; }); } }, { key: "getLabelForValue", value: function getLabelForValue(value) { - var me = this; - var adapter = me._adapter; - var timeOpts = me.options.time; - + var adapter = this._adapter; + var timeOpts = this.options.time; if (timeOpts.tooltipFormat) { return adapter.format(value, timeOpts.tooltipFormat); } - return adapter.format(value, timeOpts.displayFormats.datetime); } }, { + key: "format", + value: function format(value, _format) { + var options = this.options; + var formats = options.time.displayFormats; + var unit = this._unit; + var fmt = _format || formats[unit]; + return this._adapter.format(value, fmt); + } + }, { key: "_tickFormatFunction", value: function _tickFormatFunction(time, index, ticks, format) { - var me = this; - var options = me.options; + var options = this.options; + var formatter = options.ticks.callback; + if (formatter) { + return callback(formatter, [time, index, ticks], this); + } var formats = options.time.displayFormats; - var unit = me._unit; - var majorUnit = me._majorUnit; + var unit = this._unit; + var majorUnit = this._majorUnit; var minorFormat = unit && formats[unit]; var majorFormat = majorUnit && formats[majorUnit]; var tick = ticks[index]; var major = majorUnit && majorFormat && tick && tick.major; - - var label = me._adapter.format(time, format || (major ? majorFormat : minorFormat)); - - var formatter = options.ticks.callback; - return formatter ? formatter(label, index, ticks) : label; + return this._adapter.format(time, format || (major ? majorFormat : minorFormat)); } }, { key: "generateTickLabels", value: function generateTickLabels(ticks) { var i, ilen, tick; - for (i = 0, ilen = ticks.length; i < ilen; ++i) { tick = ticks[i]; tick.label = this._tickFormatFunction(tick.value, i, ticks); } } }, { key: "getDecimalForValue", value: function getDecimalForValue(value) { - var me = this; - return value === null ? NaN : (value - me.min) / (me.max - me.min); + return value === null ? NaN : (value - this.min) / (this.max - this.min); } }, { key: "getPixelForValue", value: function getPixelForValue(value) { - var me = this; - var offsets = me._offsets; - var pos = me.getDecimalForValue(value); - return me.getPixelForDecimal((offsets.start + pos) * offsets.factor); + var offsets = this._offsets; + var pos = this.getDecimalForValue(value); + return this.getPixelForDecimal((offsets.start + pos) * offsets.factor); } }, { key: "getValueForPixel", value: function getValueForPixel(pixel) { - var me = this; - var offsets = me._offsets; - var pos = me.getDecimalForPixel(pixel) / offsets.factor - offsets.end; - return me.min + pos * (me.max - me.min); + var offsets = this._offsets; + var pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end; + return this.min + pos * (this.max - this.min); } }, { key: "_getLabelSize", value: function _getLabelSize(label) { - var me = this; - var ticksOpts = me.options.ticks; - var tickLabelWidth = me.ctx.measureText(label).width; - var angle = toRadians(me.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation); + var ticksOpts = this.options.ticks; + var tickLabelWidth = this.ctx.measureText(label).width; + var angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation); var cosRotation = Math.cos(angle); var sinRotation = Math.sin(angle); - - var tickFontSize = me._resolveTickFontOptions(0).size; - + var tickFontSize = this._resolveTickFontOptions(0).size; return { w: tickLabelWidth * cosRotation + tickFontSize * sinRotation, h: tickLabelWidth * sinRotation + tickFontSize * cosRotation }; } }, { key: "_getLabelCapacity", value: function _getLabelCapacity(exampleTime) { - var me = this; - var timeOpts = me.options.time; + var timeOpts = this.options.time; var displayFormats = timeOpts.displayFormats; var format = displayFormats[timeOpts.unit] || displayFormats.millisecond; - - var exampleLabel = me._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(me, [exampleTime], me._majorUnit), format); - - var size = me._getLabelSize(exampleLabel); - - var capacity = Math.floor(me.isHorizontal() ? me.width / size.w : me.height / size.h) - 1; + var exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [exampleTime], this._majorUnit), format); + var size = this._getLabelSize(exampleLabel); + var capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1; return capacity > 0 ? capacity : 1; } }, { key: "getDataTimestamps", value: function getDataTimestamps() { - var me = this; - var timestamps = me._cache.data || []; + var timestamps = this._cache.data || []; var i, ilen; - if (timestamps.length) { return timestamps; } - - var metas = me.getMatchingVisibleMetas(); - - if (me._normalized && metas.length) { - return me._cache.data = metas[0].controller.getAllParsedValues(me); + var metas = this.getMatchingVisibleMetas(); + if (this._normalized && metas.length) { + return this._cache.data = metas[0].controller.getAllParsedValues(this); } - for (i = 0, ilen = metas.length; i < ilen; ++i) { - timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(me)); + timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this)); } - - return me._cache.data = me.normalize(timestamps); + return this._cache.data = this.normalize(timestamps); } }, { key: "getLabelTimestamps", value: function getLabelTimestamps() { - var me = this; - var timestamps = me._cache.labels || []; + var timestamps = this._cache.labels || []; var i, ilen; - if (timestamps.length) { return timestamps; } - - var labels = me.getLabels(); - + var labels = this.getLabels(); for (i = 0, ilen = labels.length; i < ilen; ++i) { - timestamps.push(_parse(me, labels[i])); + timestamps.push(_parse(this, labels[i])); } - - return me._cache.labels = me._normalized ? timestamps : me.normalize(timestamps); + return this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps); } }, { key: "normalize", value: function normalize(values) { return _arrayUnique(values.sort(sorter)); } }]); - return TimeScale; }(Scale); - - TimeScale.id = 'time'; - TimeScale.defaults = { + _defineProperty$w(TimeScale, "id", 'time'); + _defineProperty$w(TimeScale, "defaults", { bounds: 'data', adapters: {}, time: { parser: false, unit: false, @@ -17162,146 +16861,139 @@ minUnit: 'millisecond', displayFormats: {} }, ticks: { source: 'auto', + callback: false, major: { enabled: false } } - }; - + }); function interpolate(table, val, reverse) { + var lo = 0; + var hi = table.length - 1; var prevSource, nextSource, prevTarget, nextTarget; - if (reverse) { - prevSource = Math.floor(val); - nextSource = Math.ceil(val); - prevTarget = table[prevSource]; - nextTarget = table[nextSource]; + if (val >= table[lo].pos && val <= table[hi].pos) { + var _lookupByKey2 = _lookupByKey(table, 'pos', val); + lo = _lookupByKey2.lo; + hi = _lookupByKey2.hi; + } + var _table$lo = table[lo]; + prevSource = _table$lo.pos; + prevTarget = _table$lo.time; + var _table$hi = table[hi]; + nextSource = _table$hi.pos; + nextTarget = _table$hi.time; } else { - var result = _lookup(table, val); - - prevTarget = result.lo; - nextTarget = result.hi; - prevSource = table[prevTarget]; - nextSource = table[nextTarget]; + if (val >= table[lo].time && val <= table[hi].time) { + var _lookupByKey3 = _lookupByKey(table, 'time', val); + lo = _lookupByKey3.lo; + hi = _lookupByKey3.hi; + } + var _table$lo2 = table[lo]; + prevSource = _table$lo2.time; + prevTarget = _table$lo2.pos; + var _table$hi2 = table[hi]; + nextSource = _table$hi2.time; + nextTarget = _table$hi2.pos; } - var span = nextSource - prevSource; return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget; } - var TimeSeriesScale = /*#__PURE__*/function (_TimeScale) { - _inherits(TimeSeriesScale, _TimeScale); - - var _super25 = _createSuper(TimeSeriesScale); - + _inherits$w(TimeSeriesScale, _TimeScale); + var _super25 = _createSuper$w(TimeSeriesScale); function TimeSeriesScale(props) { - var _this18; - - _classCallCheck(this, TimeSeriesScale); - - _this18 = _super25.call(this, props); - _this18._table = []; - _this18._maxIndex = undefined; - return _this18; + var _this43; + _classCallCheck$x(this, TimeSeriesScale); + _this43 = _super25.call(this, props); + _this43._table = []; + _this43._minPos = undefined; + _this43._tableRange = undefined; + return _this43; } - - _createClass(TimeSeriesScale, [{ + _createClass$x(TimeSeriesScale, [{ key: "initOffsets", value: function initOffsets() { - var me = this; - - var timestamps = me._getTimestampsForTable(); - - me._table = me.buildLookupTable(timestamps); - me._maxIndex = me._table.length - 1; - - _get(_getPrototypeOf(TimeSeriesScale.prototype), "initOffsets", this).call(this, timestamps); + var timestamps = this._getTimestampsForTable(); + var table = this._table = this.buildLookupTable(timestamps); + this._minPos = interpolate(table, this.min); + this._tableRange = interpolate(table, this.max) - this._minPos; + _get(_getPrototypeOf$w(TimeSeriesScale.prototype), "initOffsets", this).call(this, timestamps); } }, { key: "buildLookupTable", value: function buildLookupTable(timestamps) { - var me = this; - var min = me.min, - max = me.max; - - if (!timestamps.length) { + var min = this.min, + max = this.max; + var items = []; + var table = []; + var i, ilen, prev, curr, next; + for (i = 0, ilen = timestamps.length; i < ilen; ++i) { + curr = timestamps[i]; + if (curr >= min && curr <= max) { + items.push(curr); + } + } + if (items.length < 2) { return [{ time: min, pos: 0 }, { time: max, pos: 1 }]; } - - var items = [min]; - var i, ilen, curr; - - for (i = 0, ilen = timestamps.length; i < ilen; ++i) { - curr = timestamps[i]; - - if (curr > min && curr < max) { - items.push(curr); + for (i = 0, ilen = items.length; i < ilen; ++i) { + next = items[i + 1]; + prev = items[i - 1]; + curr = items[i]; + if (Math.round((next + prev) / 2) !== curr) { + table.push({ + time: curr, + pos: i / (ilen - 1) + }); } } - - items.push(max); - return items; + return table; } }, { key: "_getTimestampsForTable", value: function _getTimestampsForTable() { - var me = this; - var timestamps = me._cache.all || []; - + var timestamps = this._cache.all || []; if (timestamps.length) { return timestamps; } - - var data = me.getDataTimestamps(); - var label = me.getLabelTimestamps(); - + var data = this.getDataTimestamps(); + var label = this.getLabelTimestamps(); if (data.length && label.length) { - timestamps = me.normalize(data.concat(label)); + timestamps = this.normalize(data.concat(label)); } else { timestamps = data.length ? data : label; } - - timestamps = me._cache.all = timestamps; + timestamps = this._cache.all = timestamps; return timestamps; } }, { - key: "getPixelForValue", - value: function getPixelForValue(value, index) { - var me = this; - var offsets = me._offsets; - var pos = me._normalized && me._maxIndex > 0 && !isNullOrUndef(index) ? index / me._maxIndex : me.getDecimalForValue(value); - return me.getPixelForDecimal((offsets.start + pos) * offsets.factor); - } - }, { key: "getDecimalForValue", value: function getDecimalForValue(value) { - return interpolate(this._table, value) / this._maxIndex; + return (interpolate(this._table, value) - this._minPos) / this._tableRange; } }, { key: "getValueForPixel", value: function getValueForPixel(pixel) { - var me = this; - var offsets = me._offsets; - var decimal = me.getDecimalForPixel(pixel) / offsets.factor - offsets.end; - return interpolate(me._table, decimal * this._maxIndex, true); + var offsets = this._offsets; + var decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end; + return interpolate(this._table, decimal * this._tableRange + this._minPos, true); } }]); - return TimeSeriesScale; }(TimeScale); - - TimeSeriesScale.id = 'timeseries'; - TimeSeriesScale.defaults = TimeScale.defaults; + _defineProperty$w(TimeSeriesScale, "id", 'timeseries'); + _defineProperty$w(TimeSeriesScale, "defaults", TimeScale.defaults); var scales = /*#__PURE__*/Object.freeze({ __proto__: null, CategoryScale: CategoryScale, LinearScale: LinearScale, LogarithmicScale: LogarithmicScale, @@ -17309,32 +17001,169 @@ TimeScale: TimeScale, TimeSeriesScale: TimeSeriesScale }); var registerables = [controllers, elements, plugins, scales]; - Chart.register.apply(Chart, _toConsumableArray(registerables)); + Chart$1.register.apply(Chart$1, _toConsumableArray(registerables)); + var Chart = Chart$1; + var helpers = /*#__PURE__*/Object.freeze({ + __proto__: null, + HALF_PI: HALF_PI, + INFINITY: INFINITY, + PI: PI, + PITAU: PITAU, + QUARTER_PI: QUARTER_PI, + RAD_PER_DEG: RAD_PER_DEG, + TAU: TAU, + TWO_THIRDS_PI: TWO_THIRDS_PI, + _addGrace: _addGrace, + _alignPixel: _alignPixel, + _alignStartEnd: _alignStartEnd, + _angleBetween: _angleBetween, + _angleDiff: _angleDiff, + _arrayUnique: _arrayUnique, + _attachContext: _attachContext, + _bezierCurveTo: _bezierCurveTo, + _bezierInterpolation: _bezierInterpolation, + _boundSegment: _boundSegment, + _boundSegments: _boundSegments, + _capitalize: _capitalize, + _computeSegments: _computeSegments, + _createResolver: _createResolver, + _decimalPlaces: _decimalPlaces, + _deprecated: _deprecated, + _descriptors: _descriptors, + _elementsEqual: _elementsEqual, + _factorize: _factorize, + _filterBetween: _filterBetween, + _getParentNode: _getParentNode, + _getStartAndCountOfVisiblePoints: _getStartAndCountOfVisiblePoints, + _int16Range: _int16Range, + _isBetween: _isBetween, + _isClickEvent: _isClickEvent, + _isDomSupported: _isDomSupported, + _isPointInArea: _isPointInArea, + _limitValue: _limitValue, + _longestText: _longestText, + _lookup: _lookup, + _lookupByKey: _lookupByKey, + _measureText: _measureText, + _merger: _merger, + _mergerIf: _mergerIf, + _normalizeAngle: _normalizeAngle, + _parseObjectDataRadialScale: _parseObjectDataRadialScale, + _pointInLine: _pointInLine, + _readValueToProps: _readValueToProps, + _rlookupByKey: _rlookupByKey, + _scaleRangesChanged: _scaleRangesChanged, + _setMinAndMaxByKey: _setMinAndMaxByKey, + _splitKey: _splitKey, + _steppedInterpolation: _steppedInterpolation, + _steppedLineTo: _steppedLineTo, + _textX: _textX, + _toLeftRightCenter: _toLeftRightCenter, + _updateBezierControlPoints: _updateBezierControlPoints, + addRoundedRectPath: addRoundedRectPath, + almostEquals: almostEquals, + almostWhole: almostWhole, + callback: callback, + clearCanvas: clearCanvas, + clipArea: clipArea, + clone: clone, + color: color, + createContext: createContext, + debounce: debounce, + defined: defined, + distanceBetweenPoints: distanceBetweenPoints, + drawPoint: drawPoint, + drawPointLegend: drawPointLegend, + each: each, + easingEffects: effects, + finiteOrDefault: finiteOrDefault, + fontString: fontString, + formatNumber: formatNumber, + getAngleFromPoint: getAngleFromPoint, + getHoverColor: getHoverColor, + getMaximumSize: getMaximumSize, + getRelativePosition: getRelativePosition, + getRtlAdapter: getRtlAdapter, + getStyle: getStyle, + isArray: isArray, + isFinite: isNumberFinite, + isFunction: isFunction, + isNullOrUndef: isNullOrUndef, + isNumber: isNumber, + isObject: isObject, + isPatternOrGradient: isPatternOrGradient, + listenArrayEvents: listenArrayEvents, + log10: log10, + merge: merge, + mergeIf: mergeIf, + niceNum: niceNum, + noop: noop, + overrideTextDirection: overrideTextDirection, + readUsedSize: readUsedSize, + renderText: renderText, + requestAnimFrame: requestAnimFrame, + resolve: resolve, + resolveObjectKey: resolveObjectKey, + restoreTextDirection: restoreTextDirection, + retinaScale: retinaScale, + setsEqual: setsEqual, + sign: sign, + splineCurve: splineCurve, + splineCurveMonotone: splineCurveMonotone, + supportsEventListenerOptions: supportsEventListenerOptions, + throttled: throttled, + toDegrees: toDegrees, + toDimension: toDimension, + toFont: toFont, + toFontString: toFontString, + toLineHeight: toLineHeight, + toPadding: toPadding, + toPercentage: toPercentage, + toRadians: toRadians, + toTRBL: toTRBL, + toTRBLCorners: toTRBLCorners, + uid: uid, + unclipArea: unclipArea, + unlistenArrayEvents: unlistenArrayEvents, + valueOrDefault: valueOrDefault + }); + function toInteger(dirtyNumber) { if (dirtyNumber === null || dirtyNumber === true || dirtyNumber === false) { return NaN; } - var number = Number(dirtyNumber); - if (isNaN(number)) { return number; } - return number < 0 ? Math.ceil(number) : Math.floor(number); } function requiredArgs(required, args) { if (args.length < required) { throw new TypeError(required + ' argument' + (required > 1 ? 's' : '') + ' required, but only ' + args.length + ' present'); } } + function _typeof$y(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$y = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$y = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$y(obj); + } /** * @name toDate * @category Common Helpers * @summary Convert the given argument to an instance of Date. * @@ -17366,23 +17195,22 @@ function toDate(argument) { requiredArgs(1, arguments); var argStr = Object.prototype.toString.call(argument); // Clone the date - if (argument instanceof Date || _typeof(argument) === 'object' && argStr === '[object Date]') { + if (argument instanceof Date || _typeof$y(argument) === 'object' && argStr === '[object Date]') { // Prevent the date to lose the milliseconds when passed to new Date() in IE10 return new Date(argument.getTime()); } else if (typeof argument === 'number' || argStr === '[object Number]') { return new Date(argument); } else { if ((typeof argument === 'string' || argStr === '[object String]') && typeof console !== 'undefined') { // eslint-disable-next-line no-console - console.warn("Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO` to parse strings. See: https://git.io/fjule"); // eslint-disable-next-line no-console + console.warn("Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO` to parse strings. See: https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#string-arguments"); // eslint-disable-next-line no-console console.warn(new Error().stack); } - return new Date(NaN); } } /** @@ -17391,18 +17219,14 @@ * @summary Add the specified number of days to the given date. * * @description * Add the specified number of days to the given date. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the date to be changed * @param {Number} amount - the amount of days to be added. Positive decimals will be rounded using `Math.floor`, decimals less than zero will be rounded using `Math.ceil`. - * @returns {Date} the new date with the days added - * @throws {TypeError} 2 arguments required + * @returns {Date} - the new date with the days added + * @throws {TypeError} - 2 arguments required * * @example * // Add 10 days to 1 September 2014: * const result = addDays(new Date(2014, 8, 1), 10) * //=> Thu Sep 11 2014 00:00:00 @@ -17410,20 +17234,17 @@ function addDays(dirtyDate, dirtyAmount) { requiredArgs(2, arguments); var date = toDate(dirtyDate); var amount = toInteger(dirtyAmount); - if (isNaN(amount)) { return new Date(NaN); } - if (!amount) { // If 0 days, no-op to avoid changing times in the hour before end of DST return date; } - date.setDate(date.getDate() + amount); return date; } /** @@ -17432,14 +17253,10 @@ * @summary Add the specified number of months to the given date. * * @description * Add the specified number of months to the given date. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the date to be changed * @param {Number} amount - the amount of months to be added. Positive decimals will be rounded using `Math.floor`, decimals less than zero will be rounded using `Math.ceil`. * @returns {Date} the new date with the months added * @throws {TypeError} 2 arguments required * @@ -17451,33 +17268,29 @@ function addMonths(dirtyDate, dirtyAmount) { requiredArgs(2, arguments); var date = toDate(dirtyDate); var amount = toInteger(dirtyAmount); - if (isNaN(amount)) { return new Date(NaN); } - if (!amount) { // If 0 months, no-op to avoid changing times in the hour before end of DST return date; } - var dayOfMonth = date.getDate(); // The JS Date object supports date math by accepting out-of-bounds values for - // month, day, etc. For example, new Date(2020, 1, 0) returns 31 Dec 2019 and + // month, day, etc. For example, new Date(2020, 0, 0) returns 31 Dec 2019 and // new Date(2020, 13, 1) returns 1 Feb 2021. This is *almost* the behavior we // want except that dates will wrap around the end of a month, meaning that // new Date(2020, 13, 31) will return 3 Mar 2021 not 28 Feb 2021 as desired. So // we'll default to the end of the desired month by adding 1 to the desired // month and using a date of 0 to back up one day to the end of the desired // month. var endOfDesiredMonth = new Date(date.getTime()); endOfDesiredMonth.setMonth(date.getMonth() + amount + 1, 0); var daysInMonth = endOfDesiredMonth.getDate(); - if (dayOfMonth >= daysInMonth) { // If we're already at the end of the month, then this is the correct date // and we're done. return endOfDesiredMonth; } else { @@ -17499,14 +17312,10 @@ * @summary Add the specified number of milliseconds to the given date. * * @description * Add the specified number of milliseconds to the given date. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the date to be changed * @param {Number} amount - the amount of milliseconds to be added. Positive decimals will be rounded using `Math.floor`, decimals less than zero will be rounded using `Math.ceil`. * @returns {Date} the new date with the milliseconds added * @throws {TypeError} 2 arguments required * @@ -17521,23 +17330,19 @@ var timestamp = toDate(dirtyDate).getTime(); var amount = toInteger(dirtyAmount); return new Date(timestamp + amount); } - var MILLISECONDS_IN_HOUR$3 = 3600000; + var MILLISECONDS_IN_HOUR = 3600000; /** * @name addHours * @category Hour Helpers * @summary Add the specified number of hours to the given date. * * @description * Add the specified number of hours to the given date. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the date to be changed * @param {Number} amount - the amount of hours to be added. Positive decimals will be rounded using `Math.floor`, decimals less than zero will be rounded using `Math.ceil`. * @returns {Date} the new date with the hours added * @throws {TypeError} 2 arguments required * @@ -17548,57 +17353,55 @@ */ function addHours(dirtyDate, dirtyAmount) { requiredArgs(2, arguments); var amount = toInteger(dirtyAmount); - return addMilliseconds(dirtyDate, amount * MILLISECONDS_IN_HOUR$3); + return addMilliseconds(dirtyDate, amount * MILLISECONDS_IN_HOUR); } + var defaultOptions = {}; + function getDefaultOptions() { + return defaultOptions; + } + /** * @name startOfWeek * @category Week Helpers * @summary Return the start of a week for the given date. * * @description * Return the start of a week for the given date. * The result will be in the local timezone. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the original date * @param {Object} [options] - an object with options. * @param {Locale} [options.locale=defaultLocale] - the locale object. See [Locale]{@link https://date-fns.org/docs/Locale} * @param {0|1|2|3|4|5|6} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) * @returns {Date} the start of a week * @throws {TypeError} 1 argument required * @throws {RangeError} `options.weekStartsOn` must be between 0 and 6 * * @example * // The start of a week for 2 September 2014 11:55:00: - * var result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0)) + * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0)) * //=> Sun Aug 31 2014 00:00:00 * * @example * // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00: - * var result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 }) + * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 }) * //=> Mon Sep 01 2014 00:00:00 */ - function startOfWeek(dirtyDate, dirtyOptions) { + function startOfWeek(dirtyDate, options) { + var _ref, _ref2, _ref3, _options$weekStartsOn, _options$locale, _options$locale$optio, _defaultOptions$local, _defaultOptions$local2; requiredArgs(1, arguments); - var options = dirtyOptions || {}; - var locale = options.locale; - var localeWeekStartsOn = locale && locale.options && locale.options.weekStartsOn; - var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn); - var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn); // Test if weekStartsOn is between 0 and 6 _and_ is not NaN + var defaultOptions = getDefaultOptions(); + var weekStartsOn = toInteger((_ref = (_ref2 = (_ref3 = (_options$weekStartsOn = options === null || options === void 0 ? void 0 : options.weekStartsOn) !== null && _options$weekStartsOn !== void 0 ? _options$weekStartsOn : options === null || options === void 0 ? void 0 : (_options$locale = options.locale) === null || _options$locale === void 0 ? void 0 : (_options$locale$optio = _options$locale.options) === null || _options$locale$optio === void 0 ? void 0 : _options$locale$optio.weekStartsOn) !== null && _ref3 !== void 0 ? _ref3 : defaultOptions.weekStartsOn) !== null && _ref2 !== void 0 ? _ref2 : (_defaultOptions$local = defaultOptions.locale) === null || _defaultOptions$local === void 0 ? void 0 : (_defaultOptions$local2 = _defaultOptions$local.options) === null || _defaultOptions$local2 === void 0 ? void 0 : _defaultOptions$local2.weekStartsOn) !== null && _ref !== void 0 ? _ref : 0); // Test if weekStartsOn is between 0 and 6 _and_ is not NaN if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) { throw new RangeError('weekStartsOn must be between 0 and 6 inclusively'); } - var date = toDate(dirtyDate); var day = date.getDay(); var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn; date.setDate(date.getDate() - diff); date.setHours(0, 0, 0, 0); @@ -17629,14 +17432,10 @@ * * @description * Return the start of a day for the given date. * The result will be in the local timezone. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the original date * @returns {Date} the start of a day * @throws {TypeError} 1 argument required * * @example @@ -17660,30 +17459,26 @@ * * @description * Get the number of calendar days between the given dates. This means that the times are removed * from the dates and then the difference in days is calculated. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} dateLeft - the later date * @param {Date|Number} dateRight - the earlier date * @returns {Number} the number of calendar days * @throws {TypeError} 2 arguments required * * @example * // How many calendar days are between * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00? - * var result = differenceInCalendarDays( + * const result = differenceInCalendarDays( * new Date(2012, 6, 2, 0, 0), * new Date(2011, 6, 2, 23, 0) * ) * //=> 366 * // How many calendar days are between * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00? - * var result = differenceInCalendarDays( + * const result = differenceInCalendarDays( * new Date(2011, 6, 3, 0, 1), * new Date(2011, 6, 2, 23, 59) * ) * //=> 1 */ @@ -17698,23 +17493,19 @@ // (e.g. it's different in the day of the daylight saving time clock shift) return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_DAY$1); } - var MILLISECONDS_IN_MINUTE$3 = 60000; + var MILLISECONDS_IN_MINUTE = 60000; /** * @name addMinutes * @category Minute Helpers * @summary Add the specified number of minutes to the given date. * * @description * Add the specified number of minutes to the given date. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the date to be changed * @param {Number} amount - the amount of minutes to be added. Positive decimals will be rounded using `Math.floor`, decimals less than zero will be rounded using `Math.ceil`. * @returns {Date} the new date with the minutes added * @throws {TypeError} 2 arguments required * @@ -17725,25 +17516,21 @@ */ function addMinutes(dirtyDate, dirtyAmount) { requiredArgs(2, arguments); var amount = toInteger(dirtyAmount); - return addMilliseconds(dirtyDate, amount * MILLISECONDS_IN_MINUTE$3); + return addMilliseconds(dirtyDate, amount * MILLISECONDS_IN_MINUTE); } /** * @name addQuarters * @category Quarter Helpers * @summary Add the specified number of year quarters to the given date. * * @description * Add the specified number of year quarters to the given date. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the date to be changed * @param {Number} amount - the amount of quarters to be added. Positive decimals will be rounded using `Math.floor`, decimals less than zero will be rounded using `Math.ceil`. * @returns {Date} the new date with the quarters added * @throws {TypeError} 2 arguments required * @@ -17766,14 +17553,10 @@ * @summary Add the specified number of seconds to the given date. * * @description * Add the specified number of seconds to the given date. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the date to be changed * @param {Number} amount - the amount of seconds to be added. Positive decimals will be rounded using `Math.floor`, decimals less than zero will be rounded using `Math.ceil`. * @returns {Date} the new date with the seconds added * @throws {TypeError} 2 arguments required * @@ -17795,14 +17578,10 @@ * @summary Add the specified number of weeks to the given date. * * @description * Add the specified number of week to the given date. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the date to be changed * @param {Number} amount - the amount of weeks to be added. Positive decimals will be rounded using `Math.floor`, decimals less than zero will be rounded using `Math.ceil`. * @returns {Date} the new date with the weeks added * @throws {TypeError} 2 arguments required * @@ -17825,14 +17604,10 @@ * @summary Add the specified number of years to the given date. * * @description * Add the specified number of years to the given date. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the date to be changed * @param {Number} amount - the amount of years to be added. Positive decimals will be rounded using `Math.floor`, decimals less than zero will be rounded using `Math.ceil`. * @returns {Date} the new date with the years added * @throws {TypeError} 2 arguments required * @@ -17855,14 +17630,10 @@ * * @description * Compare the two dates and return 1 if the first date is after the second, * -1 if the first date is before the second or 0 if dates are equal. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} dateLeft - the first date to compare * @param {Date|Number} dateRight - the second date to compare * @returns {Number} the result of the comparison * @throws {TypeError} 2 arguments required * @@ -17888,21 +17659,111 @@ function compareAsc(dirtyDateLeft, dirtyDateRight) { requiredArgs(2, arguments); var dateLeft = toDate(dirtyDateLeft); var dateRight = toDate(dirtyDateRight); var diff = dateLeft.getTime() - dateRight.getTime(); - if (diff < 0) { return -1; } else if (diff > 0) { return 1; // Return 0 if diff is 0; return NaN if diff is NaN } else { return diff; } } /** + * Days in 1 week. + * + * @name daysInWeek + * @constant + * @type {number} + * @default + */ + /** + * Milliseconds in 1 minute + * + * @name millisecondsInMinute + * @constant + * @type {number} + * @default + */ + + var millisecondsInMinute = 60000; + /** + * Milliseconds in 1 hour + * + * @name millisecondsInHour + * @constant + * @type {number} + * @default + */ + + var millisecondsInHour = 3600000; + /** + * Milliseconds in 1 second + * + * @name millisecondsInSecond + * @constant + * @type {number} + * @default + */ + + var millisecondsInSecond = 1000; + + function _typeof$x(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$x = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$x = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$x(obj); + } + /** + * @name isDate + * @category Common Helpers + * @summary Is the given value a date? + * + * @description + * Returns true if the given value is an instance of Date. The function works for dates transferred across iframes. + * + * @param {*} value - the value to check + * @returns {boolean} true if the given value is a date + * @throws {TypeError} 1 arguments required + * + * @example + * // For a valid date: + * const result = isDate(new Date()) + * //=> true + * + * @example + * // For an invalid date: + * const result = isDate(new Date(NaN)) + * //=> true + * + * @example + * // For some value: + * const result = isDate('2014-02-31') + * //=> false + * + * @example + * // For an object: + * const result = isDate({}) + * //=> false + */ + + function isDate(value) { + requiredArgs(1, arguments); + return value instanceof Date || _typeof$x(value) === 'object' && Object.prototype.toString.call(value) === '[object Date]'; + } + + /** * @name isValid * @category Common Helpers * @summary Is the given date valid? * * @description @@ -17910,82 +17771,55 @@ * Argument is converted to Date using `toDate`. See [toDate]{@link https://date-fns.org/docs/toDate} * Invalid Date is a Date, whose time value is NaN. * * Time value of Date: http://es5.github.io/#x15.9.1.1 * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * - * - Now `isValid` doesn't throw an exception - * if the first argument is not an instance of Date. - * Instead, argument is converted beforehand using `toDate`. - * - * Examples: - * - * | `isValid` argument | Before v2.0.0 | v2.0.0 onward | - * |---------------------------|---------------|---------------| - * | `new Date()` | `true` | `true` | - * | `new Date('2016-01-01')` | `true` | `true` | - * | `new Date('')` | `false` | `false` | - * | `new Date(1488370835081)` | `true` | `true` | - * | `new Date(NaN)` | `false` | `false` | - * | `'2016-01-01'` | `TypeError` | `false` | - * | `''` | `TypeError` | `false` | - * | `1488370835081` | `TypeError` | `true` | - * | `NaN` | `TypeError` | `false` | - * - * We introduce this change to make *date-fns* consistent with ECMAScript behavior - * that try to coerce arguments to the expected type - * (which is also the case with other *date-fns* functions). - * * @param {*} date - the date to check * @returns {Boolean} the date is valid * @throws {TypeError} 1 argument required * * @example * // For the valid date: - * var result = isValid(new Date(2014, 1, 31)) + * const result = isValid(new Date(2014, 1, 31)) * //=> true * * @example * // For the value, convertable into a date: - * var result = isValid(1393804800000) + * const result = isValid(1393804800000) * //=> true * * @example * // For the invalid date: - * var result = isValid(new Date('')) + * const result = isValid(new Date('')) * //=> false */ function isValid(dirtyDate) { requiredArgs(1, arguments); + if (!isDate(dirtyDate) && typeof dirtyDate !== 'number') { + return false; + } var date = toDate(dirtyDate); - return !isNaN(date); + return !isNaN(Number(date)); } /** * @name differenceInCalendarMonths * @category Month Helpers * @summary Get the number of calendar months between the given dates. * * @description * Get the number of calendar months between the given dates. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} dateLeft - the later date * @param {Date|Number} dateRight - the earlier date * @returns {Number} the number of calendar months * @throws {TypeError} 2 arguments required * * @example * // How many calendar months are between 31 January 2014 and 1 September 2014? - * var result = differenceInCalendarMonths( + * const result = differenceInCalendarMonths( * new Date(2014, 8, 1), * new Date(2014, 0, 31) * ) * //=> 8 */ @@ -18005,22 +17839,18 @@ * @summary Get the number of calendar years between the given dates. * * @description * Get the number of calendar years between the given dates. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} dateLeft - the later date * @param {Date|Number} dateRight - the earlier date * @returns {Number} the number of calendar years * @throws {TypeError} 2 arguments required * * @example * // How many calendar years are between 31 December 2013 and 11 February 2015? - * var result = differenceInCalendarYears( + * const result = differenceInCalendarYears( * new Date(2015, 1, 11), * new Date(2013, 11, 31) * ) * //=> 2 */ @@ -18036,11 +17866,10 @@ // having the same representation in local time, e.g. one hour before // DST ends vs. the instant that DST ends. function compareLocalAsc(dateLeft, dateRight) { var diff = dateLeft.getFullYear() - dateRight.getFullYear() || dateLeft.getMonth() - dateRight.getMonth() || dateLeft.getDate() - dateRight.getDate() || dateLeft.getHours() - dateRight.getHours() || dateLeft.getMinutes() - dateRight.getMinutes() || dateLeft.getSeconds() - dateRight.getSeconds() || dateLeft.getMilliseconds() - dateRight.getMilliseconds(); - if (diff < 0) { return -1; } else if (diff > 0) { return 1; // Return 0 if diff is 0; return NaN if diff is NaN } else { @@ -18062,58 +17891,53 @@ * * To ignore DST and only measure exact 24-hour periods, use this instead: * `Math.floor(differenceInHours(dateLeft, dateRight)/24)|0`. * * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} dateLeft - the later date * @param {Date|Number} dateRight - the earlier date * @returns {Number} the number of full days according to the local timezone * @throws {TypeError} 2 arguments required * * @example * // How many full days are between * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00? - * var result = differenceInDays( + * const result = differenceInDays( * new Date(2012, 6, 2, 0, 0), * new Date(2011, 6, 2, 23, 0) * ) * //=> 365 * // How many full days are between * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00? - * var result = differenceInDays( + * const result = differenceInDays( * new Date(2011, 6, 3, 0, 1), * new Date(2011, 6, 2, 23, 59) * ) * //=> 0 * // How many full days are between * // 1 March 2020 0:00 and 1 June 2020 0:00 ? * // Note: because local time is used, the * // result will always be 92 days, even in * // time zones where DST starts and the * // period has only 92*24-1 hours. - * var result = differenceInDays( + * const result = differenceInDays( * new Date(2020, 5, 1), * new Date(2020, 2, 1) * ) //=> 92 */ - function differenceInDays(dirtyDateLeft, dirtyDateRight) { requiredArgs(2, arguments); var dateLeft = toDate(dirtyDateLeft); var dateRight = toDate(dirtyDateRight); var sign = compareLocalAsc(dateLeft, dateRight); var difference = Math.abs(differenceInCalendarDays(dateLeft, dateRight)); dateLeft.setDate(dateLeft.getDate() - sign * difference); // Math.abs(diff in full days - diff in calendar days) === 1 if last calendar day is not full // If so, result must be decreased by 1 in absolute value - var isLastDayNotFull = compareLocalAsc(dateLeft, dateRight) === -sign; + var isLastDayNotFull = Number(compareLocalAsc(dateLeft, dateRight) === -sign); var result = sign * (difference - isLastDayNotFull); // Prevent negative zero return result === 0 ? 0 : result; } @@ -18123,108 +17947,110 @@ * @summary Get the number of milliseconds between the given dates. * * @description * Get the number of milliseconds between the given dates. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} dateLeft - the later date * @param {Date|Number} dateRight - the earlier date * @returns {Number} the number of milliseconds * @throws {TypeError} 2 arguments required * * @example * // How many milliseconds are between * // 2 July 2014 12:30:20.600 and 2 July 2014 12:30:21.700? - * var result = differenceInMilliseconds( + * const result = differenceInMilliseconds( * new Date(2014, 6, 2, 12, 30, 21, 700), * new Date(2014, 6, 2, 12, 30, 20, 600) * ) * //=> 1100 */ - function differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) { + function differenceInMilliseconds(dateLeft, dateRight) { requiredArgs(2, arguments); - var dateLeft = toDate(dirtyDateLeft); - var dateRight = toDate(dirtyDateRight); - return dateLeft.getTime() - dateRight.getTime(); + return toDate(dateLeft).getTime() - toDate(dateRight).getTime(); } - var MILLISECONDS_IN_HOUR$2 = 3600000; + var roundingMap = { + ceil: Math.ceil, + round: Math.round, + floor: Math.floor, + trunc: function trunc(value) { + return value < 0 ? Math.ceil(value) : Math.floor(value); + } // Math.trunc is not supported by IE + }; + + var defaultRoundingMethod = 'trunc'; + function getRoundingMethod(method) { + return method ? roundingMap[method] : roundingMap[defaultRoundingMethod]; + } + /** * @name differenceInHours * @category Hour Helpers * @summary Get the number of hours between the given dates. * * @description * Get the number of hours between the given dates. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} dateLeft - the later date * @param {Date|Number} dateRight - the earlier date + * @param {Object} [options] - an object with options. + * @param {String} [options.roundingMethod='trunc'] - a rounding method (`ceil`, `floor`, `round` or `trunc`) * @returns {Number} the number of hours * @throws {TypeError} 2 arguments required * * @example * // How many hours are between 2 July 2014 06:50:00 and 2 July 2014 19:00:00? - * var result = differenceInHours( + * const result = differenceInHours( * new Date(2014, 6, 2, 19, 0), * new Date(2014, 6, 2, 6, 50) * ) * //=> 12 */ - function differenceInHours(dirtyDateLeft, dirtyDateRight) { + function differenceInHours(dateLeft, dateRight, options) { requiredArgs(2, arguments); - var diff = differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) / MILLISECONDS_IN_HOUR$2; - return diff > 0 ? Math.floor(diff) : Math.ceil(diff); + var diff = differenceInMilliseconds(dateLeft, dateRight) / millisecondsInHour; + return getRoundingMethod(options === null || options === void 0 ? void 0 : options.roundingMethod)(diff); } - var MILLISECONDS_IN_MINUTE$2 = 60000; /** * @name differenceInMinutes * @category Minute Helpers * @summary Get the number of minutes between the given dates. * * @description * Get the signed number of full (rounded towards 0) minutes between the given dates. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} dateLeft - the later date * @param {Date|Number} dateRight - the earlier date + * @param {Object} [options] - an object with options. + * @param {String} [options.roundingMethod='trunc'] - a rounding method (`ceil`, `floor`, `round` or `trunc`) * @returns {Number} the number of minutes * @throws {TypeError} 2 arguments required * * @example * // How many minutes are between 2 July 2014 12:07:59 and 2 July 2014 12:20:00? - * var result = differenceInMinutes( + * const result = differenceInMinutes( * new Date(2014, 6, 2, 12, 20, 0), * new Date(2014, 6, 2, 12, 7, 59) * ) * //=> 12 * * @example - * // How many minutes are from 10:01:59 to 10:00:00 - * var result = differenceInMinutes( + * // How many minutes are between 10:01:59 and 10:00:00 + * const result = differenceInMinutes( * new Date(2000, 0, 1, 10, 0, 0), * new Date(2000, 0, 1, 10, 1, 59) * ) * //=> -1 */ - function differenceInMinutes(dirtyDateLeft, dirtyDateRight) { + function differenceInMinutes(dateLeft, dateRight, options) { requiredArgs(2, arguments); - var diff = differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) / MILLISECONDS_IN_MINUTE$2; - return diff > 0 ? Math.floor(diff) : Math.ceil(diff); + var diff = differenceInMilliseconds(dateLeft, dateRight) / millisecondsInMinute; + return getRoundingMethod(options === null || options === void 0 ? void 0 : options.roundingMethod)(diff); } /** * @name endOfDay * @category Day Helpers @@ -18232,14 +18058,10 @@ * * @description * Return the end of a day for the given date. * The result will be in the local timezone. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the original date * @returns {Date} the end of a day * @throws {TypeError} 1 argument required * * @example @@ -18262,14 +18084,10 @@ * * @description * Return the end of a month for the given date. * The result will be in the local timezone. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the original date * @returns {Date} the end of a month * @throws {TypeError} 1 argument required * * @example @@ -18293,21 +18111,17 @@ * @summary Is the given date the last day of a month? * * @description * Is the given date the last day of a month? * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the date to check * @returns {Boolean} the date is the last day of a month * @throws {TypeError} 1 argument required * * @example * // Is 28 February 2014 the last day of a month? - * var result = isLastDayOfMonth(new Date(2014, 1, 28)) + * const result = isLastDayOfMonth(new Date(2014, 1, 28)) * //=> true */ function isLastDayOfMonth(dirtyDate) { requiredArgs(1, arguments); @@ -18319,24 +18133,20 @@ * @name differenceInMonths * @category Month Helpers * @summary Get the number of full months between the given dates. * * @description - * Get the number of full months between the given dates. + * Get the number of full months between the given dates using trunc as a default rounding method. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} dateLeft - the later date * @param {Date|Number} dateRight - the earlier date * @returns {Number} the number of full months * @throws {TypeError} 2 arguments required * * @example * // How many full months are between 31 January 2014 and 1 September 2014? - * var result = differenceInMonths(new Date(2014, 8, 1), new Date(2014, 0, 31)) + * const result = differenceInMonths(new Date(2014, 8, 1), new Date(2014, 0, 31)) * //=> 7 */ function differenceInMonths(dirtyDateLeft, dirtyDateRight) { requiredArgs(2, arguments); @@ -18352,159 +18162,146 @@ if (dateLeft.getMonth() === 1 && dateLeft.getDate() > 27) { // This will check if the date is end of Feb and assign a higher end of month date // to compare it with Jan dateLeft.setDate(30); } - dateLeft.setMonth(dateLeft.getMonth() - sign * difference); // Math.abs(diff in full months - diff in calendar months) === 1 if last calendar month is not full // If so, result must be decreased by 1 in absolute value var isLastMonthNotFull = compareAsc(dateLeft, dateRight) === -sign; // Check for cases of one full calendar month if (isLastDayOfMonth(toDate(dirtyDateLeft)) && difference === 1 && compareAsc(dirtyDateLeft, dateRight) === 1) { isLastMonthNotFull = false; } - - result = sign * (difference - isLastMonthNotFull); + result = sign * (difference - Number(isLastMonthNotFull)); } // Prevent negative zero - return result === 0 ? 0 : result; } /** * @name differenceInQuarters * @category Quarter Helpers - * @summary Get the number of full quarters between the given dates. + * @summary Get the number of quarters between the given dates. * * @description - * Get the number of full quarters between the given dates. + * Get the number of quarters between the given dates. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} dateLeft - the later date * @param {Date|Number} dateRight - the earlier date + * @param {Object} [options] - an object with options. + * @param {String} [options.roundingMethod='trunc'] - a rounding method (`ceil`, `floor`, `round` or `trunc`) * @returns {Number} the number of full quarters * @throws {TypeError} 2 arguments required * * @example * // How many full quarters are between 31 December 2013 and 2 July 2014? - * var result = differenceInQuarters(new Date(2014, 6, 2), new Date(2013, 11, 31)) + * const result = differenceInQuarters(new Date(2014, 6, 2), new Date(2013, 11, 31)) * //=> 2 */ - function differenceInQuarters(dirtyDateLeft, dirtyDateRight) { + function differenceInQuarters(dateLeft, dateRight, options) { requiredArgs(2, arguments); - var diff = differenceInMonths(dirtyDateLeft, dirtyDateRight) / 3; - return diff > 0 ? Math.floor(diff) : Math.ceil(diff); + var diff = differenceInMonths(dateLeft, dateRight) / 3; + return getRoundingMethod(options === null || options === void 0 ? void 0 : options.roundingMethod)(diff); } /** * @name differenceInSeconds * @category Second Helpers * @summary Get the number of seconds between the given dates. * * @description * Get the number of seconds between the given dates. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} dateLeft - the later date * @param {Date|Number} dateRight - the earlier date + * @param {Object} [options] - an object with options. + * @param {String} [options.roundingMethod='trunc'] - a rounding method (`ceil`, `floor`, `round` or `trunc`) * @returns {Number} the number of seconds * @throws {TypeError} 2 arguments required * * @example * // How many seconds are between * // 2 July 2014 12:30:07.999 and 2 July 2014 12:30:20.000? - * var result = differenceInSeconds( + * const result = differenceInSeconds( * new Date(2014, 6, 2, 12, 30, 20, 0), * new Date(2014, 6, 2, 12, 30, 7, 999) * ) * //=> 12 */ - function differenceInSeconds(dirtyDateLeft, dirtyDateRight) { + function differenceInSeconds(dateLeft, dateRight, options) { requiredArgs(2, arguments); - var diff = differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) / 1000; - return diff > 0 ? Math.floor(diff) : Math.ceil(diff); + var diff = differenceInMilliseconds(dateLeft, dateRight) / 1000; + return getRoundingMethod(options === null || options === void 0 ? void 0 : options.roundingMethod)(diff); } /** * @name differenceInWeeks * @category Week Helpers * @summary Get the number of full weeks between the given dates. * * @description * Get the number of full weeks between two dates. Fractional weeks are - * truncated towards zero. + * truncated towards zero by default. * * One "full week" is the distance between a local time in one day to the same * local time 7 days earlier or later. A full week can sometimes be less than * or more than 7*24 hours if a daylight savings change happens between two dates. * * To ignore DST and only measure exact 7*24-hour periods, use this instead: * `Math.floor(differenceInHours(dateLeft, dateRight)/(7*24))|0`. * * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} dateLeft - the later date * @param {Date|Number} dateRight - the earlier date + * @param {Object} [options] - an object with options. + * @param {String} [options.roundingMethod='trunc'] - a rounding method (`ceil`, `floor`, `round` or `trunc`) * @returns {Number} the number of full weeks * @throws {TypeError} 2 arguments required * * @example * // How many full weeks are between 5 July 2014 and 20 July 2014? - * var result = differenceInWeeks(new Date(2014, 6, 20), new Date(2014, 6, 5)) + * const result = differenceInWeeks(new Date(2014, 6, 20), new Date(2014, 6, 5)) * //=> 2 * * // How many full weeks are between * // 1 March 2020 0:00 and 6 June 2020 0:00 ? * // Note: because local time is used, the * // result will always be 8 weeks (54 days), * // even if DST starts and the period has * // only 54*24-1 hours. - * var result = differenceInWeeks( + * const result = differenceInWeeks( * new Date(2020, 5, 1), * new Date(2020, 2, 6) * ) * //=> 8 */ - function differenceInWeeks(dirtyDateLeft, dirtyDateRight) { + function differenceInWeeks(dateLeft, dateRight, options) { requiredArgs(2, arguments); - var diff = differenceInDays(dirtyDateLeft, dirtyDateRight) / 7; - return diff > 0 ? Math.floor(diff) : Math.ceil(diff); + var diff = differenceInDays(dateLeft, dateRight) / 7; + return getRoundingMethod(options === null || options === void 0 ? void 0 : options.roundingMethod)(diff); } /** * @name differenceInYears * @category Year Helpers * @summary Get the number of full years between the given dates. * * @description * Get the number of full years between the given dates. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} dateLeft - the later date * @param {Date|Number} dateRight - the earlier date * @returns {Number} the number of full years * @throws {TypeError} 2 arguments required * * @example * // How many full years are between 31 December 2013 and 11 February 2015? - * var result = differenceInYears(new Date(2015, 1, 11), new Date(2013, 11, 31)) + * const result = differenceInYears(new Date(2015, 1, 11), new Date(2013, 11, 31)) * //=> 1 */ function differenceInYears(dirtyDateLeft, dirtyDateRight) { requiredArgs(2, arguments); @@ -18512,33 +18309,55 @@ var dateRight = toDate(dirtyDateRight); var sign = compareAsc(dateLeft, dateRight); var difference = Math.abs(differenceInCalendarYears(dateLeft, dateRight)); // Set both dates to a valid leap year for accurate comparison when dealing // with leap days - dateLeft.setFullYear('1584'); - dateRight.setFullYear('1584'); // Math.abs(diff in full years - diff in calendar years) === 1 if last calendar year is not full + dateLeft.setFullYear(1584); + dateRight.setFullYear(1584); // Math.abs(diff in full years - diff in calendar years) === 1 if last calendar year is not full // If so, result must be decreased by 1 in absolute value var isLastYearNotFull = compareAsc(dateLeft, dateRight) === -sign; - var result = sign * (difference - isLastYearNotFull); // Prevent negative zero + var result = sign * (difference - Number(isLastYearNotFull)); // Prevent negative zero return result === 0 ? 0 : result; } /** + * @name startOfMinute + * @category Minute Helpers + * @summary Return the start of a minute for the given date. + * + * @description + * Return the start of a minute for the given date. + * The result will be in the local timezone. + * + * @param {Date|Number} date - the original date + * @returns {Date} the start of a minute + * @throws {TypeError} 1 argument required + * + * @example + * // The start of a minute for 1 December 2014 22:15:45.400: + * const result = startOfMinute(new Date(2014, 11, 1, 22, 15, 45, 400)) + * //=> Mon Dec 01 2014 22:15:00 + */ + + function startOfMinute(dirtyDate) { + requiredArgs(1, arguments); + var date = toDate(dirtyDate); + date.setSeconds(0, 0); + return date; + } + + /** * @name startOfQuarter * @category Quarter Helpers * @summary Return the start of a year quarter for the given date. * * @description * Return the start of a year quarter for the given date. * The result will be in the local timezone. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the original date * @returns {Date} the start of a quarter * @throws {TypeError} 1 argument required * * @example @@ -18564,14 +18383,10 @@ * * @description * Return the start of a month for the given date. * The result will be in the local timezone. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the original date * @returns {Date} the start of a month * @throws {TypeError} 1 argument required * * @example @@ -18587,70 +18402,62 @@ date.setHours(0, 0, 0, 0); return date; } /** - * @name startOfYear + * @name endOfYear * @category Year Helpers - * @summary Return the start of a year for the given date. + * @summary Return the end of a year for the given date. * * @description - * Return the start of a year for the given date. + * Return the end of a year for the given date. * The result will be in the local timezone. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the original date - * @returns {Date} the start of a year + * @returns {Date} the end of a year * @throws {TypeError} 1 argument required * * @example - * // The start of a year for 2 September 2014 11:55:00: - * const result = startOfYear(new Date(2014, 8, 2, 11, 55, 00)) - * //=> Wed Jan 01 2014 00:00:00 + * // The end of a year for 2 September 2014 11:55:00: + * const result = endOfYear(new Date(2014, 8, 2, 11, 55, 00)) + * //=> Wed Dec 31 2014 23:59:59.999 */ - function startOfYear(dirtyDate) { + function endOfYear(dirtyDate) { requiredArgs(1, arguments); - var cleanDate = toDate(dirtyDate); - var date = new Date(0); - date.setFullYear(cleanDate.getFullYear(), 0, 1); - date.setHours(0, 0, 0, 0); + var date = toDate(dirtyDate); + var year = date.getFullYear(); + date.setFullYear(year + 1, 0, 0); + date.setHours(23, 59, 59, 999); return date; } /** - * @name endOfYear + * @name startOfYear * @category Year Helpers - * @summary Return the end of a year for the given date. + * @summary Return the start of a year for the given date. * * @description - * Return the end of a year for the given date. + * Return the start of a year for the given date. * The result will be in the local timezone. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the original date - * @returns {Date} the end of a year + * @returns {Date} the start of a year * @throws {TypeError} 1 argument required * * @example - * // The end of a year for 2 September 2014 11:55:00: - * var result = endOfYear(new Date(2014, 8, 2, 11, 55, 00)) - * //=> Wed Dec 31 2014 23:59:59.999 + * // The start of a year for 2 September 2014 11:55:00: + * const result = startOfYear(new Date(2014, 8, 2, 11, 55, 00)) + * //=> Wed Jan 01 2014 00:00:00 */ - function endOfYear(dirtyDate) { + function startOfYear(dirtyDate) { requiredArgs(1, arguments); - var date = toDate(dirtyDate); - var year = date.getFullYear(); - date.setFullYear(year + 1, 0, 0); - date.setHours(23, 59, 59, 999); + var cleanDate = toDate(dirtyDate); + var date = new Date(0); + date.setFullYear(cleanDate.getFullYear(), 0, 1); + date.setHours(0, 0, 0, 0); return date; } /** * @name endOfHour @@ -18659,14 +18466,10 @@ * * @description * Return the end of an hour for the given date. * The result will be in the local timezone. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the original date * @returns {Date} the end of an hour * @throws {TypeError} 1 argument required * * @example @@ -18689,14 +18492,10 @@ * * @description * Return the end of a week for the given date. * The result will be in the local timezone. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the original date * @param {Object} [options] - an object with options. * @param {Locale} [options.locale=defaultLocale] - the locale object. See [Locale]{@link https://date-fns.org/docs/Locale} * @param {0|1|2|3|4|5|6} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) * @returns {Date} the end of a week @@ -18711,23 +18510,19 @@ * @example * // If the week starts on Monday, the end of the week for 2 September 2014 11:55:00: * const result = endOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 }) * //=> Sun Sep 07 2014 23:59:59.999 */ - - function endOfWeek(dirtyDate, dirtyOptions) { + function endOfWeek(dirtyDate, options) { + var _ref, _ref2, _ref3, _options$weekStartsOn, _options$locale, _options$locale$optio, _defaultOptions$local, _defaultOptions$local2; requiredArgs(1, arguments); - var options = dirtyOptions || {}; - var locale = options.locale; - var localeWeekStartsOn = locale && locale.options && locale.options.weekStartsOn; - var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn); - var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn); // Test if weekStartsOn is between 0 and 6 _and_ is not NaN + var defaultOptions = getDefaultOptions(); + var weekStartsOn = toInteger((_ref = (_ref2 = (_ref3 = (_options$weekStartsOn = options === null || options === void 0 ? void 0 : options.weekStartsOn) !== null && _options$weekStartsOn !== void 0 ? _options$weekStartsOn : options === null || options === void 0 ? void 0 : (_options$locale = options.locale) === null || _options$locale === void 0 ? void 0 : (_options$locale$optio = _options$locale.options) === null || _options$locale$optio === void 0 ? void 0 : _options$locale$optio.weekStartsOn) !== null && _ref3 !== void 0 ? _ref3 : defaultOptions.weekStartsOn) !== null && _ref2 !== void 0 ? _ref2 : (_defaultOptions$local = defaultOptions.locale) === null || _defaultOptions$local === void 0 ? void 0 : (_defaultOptions$local2 = _defaultOptions$local.options) === null || _defaultOptions$local2 === void 0 ? void 0 : _defaultOptions$local2.weekStartsOn) !== null && _ref !== void 0 ? _ref : 0); // Test if weekStartsOn is between 0 and 6 _and_ is not NaN if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) { throw new RangeError('weekStartsOn must be between 0 and 6 inclusively'); } - var date = toDate(dirtyDate); var day = date.getDay(); var diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn); date.setDate(date.getDate() + diff); date.setHours(23, 59, 59, 999); @@ -18741,14 +18536,10 @@ * * @description * Return the end of a minute for the given date. * The result will be in the local timezone. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the original date * @returns {Date} the end of a minute * @throws {TypeError} 1 argument required * * @example @@ -18771,14 +18562,10 @@ * * @description * Return the end of a year quarter for the given date. * The result will be in the local timezone. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the original date * @returns {Date} the end of a quarter * @throws {TypeError} 1 argument required * * @example @@ -18804,14 +18591,10 @@ * * @description * Return the end of a second for the given date. * The result will be in the local timezone. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the original date * @returns {Date} the end of a second * @throws {TypeError} 1 argument required * * @example @@ -18825,531 +18608,18 @@ var date = toDate(dirtyDate); date.setMilliseconds(999); return date; } - var formatDistanceLocale = { - lessThanXSeconds: { - one: 'less than a second', - other: 'less than {{count}} seconds' - }, - xSeconds: { - one: '1 second', - other: '{{count}} seconds' - }, - halfAMinute: 'half a minute', - lessThanXMinutes: { - one: 'less than a minute', - other: 'less than {{count}} minutes' - }, - xMinutes: { - one: '1 minute', - other: '{{count}} minutes' - }, - aboutXHours: { - one: 'about 1 hour', - other: 'about {{count}} hours' - }, - xHours: { - one: '1 hour', - other: '{{count}} hours' - }, - xDays: { - one: '1 day', - other: '{{count}} days' - }, - aboutXWeeks: { - one: 'about 1 week', - other: 'about {{count}} weeks' - }, - xWeeks: { - one: '1 week', - other: '{{count}} weeks' - }, - aboutXMonths: { - one: 'about 1 month', - other: 'about {{count}} months' - }, - xMonths: { - one: '1 month', - other: '{{count}} months' - }, - aboutXYears: { - one: 'about 1 year', - other: 'about {{count}} years' - }, - xYears: { - one: '1 year', - other: '{{count}} years' - }, - overXYears: { - one: 'over 1 year', - other: 'over {{count}} years' - }, - almostXYears: { - one: 'almost 1 year', - other: 'almost {{count}} years' - } - }; - function formatDistance(token, count, options) { - options = options || {}; - var result; - - if (typeof formatDistanceLocale[token] === 'string') { - result = formatDistanceLocale[token]; - } else if (count === 1) { - result = formatDistanceLocale[token].one; - } else { - result = formatDistanceLocale[token].other.replace('{{count}}', count); - } - - if (options.addSuffix) { - if (options.comparison > 0) { - return 'in ' + result; - } else { - return result + ' ago'; - } - } - - return result; - } - - function buildFormatLongFn(args) { - return function (dirtyOptions) { - var options = dirtyOptions || {}; - var width = options.width ? String(options.width) : args.defaultWidth; - var format = args.formats[width] || args.formats[args.defaultWidth]; - return format; - }; - } - - var dateFormats = { - full: 'EEEE, MMMM do, y', - long: 'MMMM do, y', - medium: 'MMM d, y', - short: 'MM/dd/yyyy' - }; - var timeFormats = { - full: 'h:mm:ss a zzzz', - long: 'h:mm:ss a z', - medium: 'h:mm:ss a', - short: 'h:mm a' - }; - var dateTimeFormats = { - full: "{{date}} 'at' {{time}}", - long: "{{date}} 'at' {{time}}", - medium: '{{date}}, {{time}}', - short: '{{date}}, {{time}}' - }; - var formatLong = { - date: buildFormatLongFn({ - formats: dateFormats, - defaultWidth: 'full' - }), - time: buildFormatLongFn({ - formats: timeFormats, - defaultWidth: 'full' - }), - dateTime: buildFormatLongFn({ - formats: dateTimeFormats, - defaultWidth: 'full' - }) - }; - - var formatRelativeLocale = { - lastWeek: "'last' eeee 'at' p", - yesterday: "'yesterday at' p", - today: "'today at' p", - tomorrow: "'tomorrow at' p", - nextWeek: "eeee 'at' p", - other: 'P' - }; - function formatRelative(token, _date, _baseDate, _options) { - return formatRelativeLocale[token]; - } - - function buildLocalizeFn(args) { - return function (dirtyIndex, dirtyOptions) { - var options = dirtyOptions || {}; - var context = options.context ? String(options.context) : 'standalone'; - var valuesArray; - - if (context === 'formatting' && args.formattingValues) { - var defaultWidth = args.defaultFormattingWidth || args.defaultWidth; - var width = options.width ? String(options.width) : defaultWidth; - valuesArray = args.formattingValues[width] || args.formattingValues[defaultWidth]; - } else { - var _defaultWidth = args.defaultWidth; - - var _width = options.width ? String(options.width) : args.defaultWidth; - - valuesArray = args.values[_width] || args.values[_defaultWidth]; - } - - var index = args.argumentCallback ? args.argumentCallback(dirtyIndex) : dirtyIndex; - return valuesArray[index]; - }; - } - - var eraValues = { - narrow: ['B', 'A'], - abbreviated: ['BC', 'AD'], - wide: ['Before Christ', 'Anno Domini'] - }; - var quarterValues = { - narrow: ['1', '2', '3', '4'], - abbreviated: ['Q1', 'Q2', 'Q3', 'Q4'], - wide: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'] // Note: in English, the names of days of the week and months are capitalized. - // If you are making a new locale based on this one, check if the same is true for the language you're working on. - // Generally, formatted dates should look like they are in the middle of a sentence, - // e.g. in Spanish language the weekdays and months should be in the lowercase. - - }; - var monthValues = { - narrow: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'], - abbreviated: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], - wide: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] - }; - var dayValues = { - narrow: ['S', 'M', 'T', 'W', 'T', 'F', 'S'], - short: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'], - abbreviated: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], - wide: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] - }; - var dayPeriodValues = { - narrow: { - am: 'a', - pm: 'p', - midnight: 'mi', - noon: 'n', - morning: 'morning', - afternoon: 'afternoon', - evening: 'evening', - night: 'night' - }, - abbreviated: { - am: 'AM', - pm: 'PM', - midnight: 'midnight', - noon: 'noon', - morning: 'morning', - afternoon: 'afternoon', - evening: 'evening', - night: 'night' - }, - wide: { - am: 'a.m.', - pm: 'p.m.', - midnight: 'midnight', - noon: 'noon', - morning: 'morning', - afternoon: 'afternoon', - evening: 'evening', - night: 'night' - } - }; - var formattingDayPeriodValues = { - narrow: { - am: 'a', - pm: 'p', - midnight: 'mi', - noon: 'n', - morning: 'in the morning', - afternoon: 'in the afternoon', - evening: 'in the evening', - night: 'at night' - }, - abbreviated: { - am: 'AM', - pm: 'PM', - midnight: 'midnight', - noon: 'noon', - morning: 'in the morning', - afternoon: 'in the afternoon', - evening: 'in the evening', - night: 'at night' - }, - wide: { - am: 'a.m.', - pm: 'p.m.', - midnight: 'midnight', - noon: 'noon', - morning: 'in the morning', - afternoon: 'in the afternoon', - evening: 'in the evening', - night: 'at night' - } - }; - - function ordinalNumber(dirtyNumber, _dirtyOptions) { - var number = Number(dirtyNumber); // If ordinal numbers depend on context, for example, - // if they are different for different grammatical genders, - // use `options.unit`: - // - // var options = dirtyOptions || {} - // var unit = String(options.unit) - // - // where `unit` can be 'year', 'quarter', 'month', 'week', 'date', 'dayOfYear', - // 'day', 'hour', 'minute', 'second' - - var rem100 = number % 100; - - if (rem100 > 20 || rem100 < 10) { - switch (rem100 % 10) { - case 1: - return number + 'st'; - - case 2: - return number + 'nd'; - - case 3: - return number + 'rd'; - } - } - - return number + 'th'; - } - - var localize = { - ordinalNumber: ordinalNumber, - era: buildLocalizeFn({ - values: eraValues, - defaultWidth: 'wide' - }), - quarter: buildLocalizeFn({ - values: quarterValues, - defaultWidth: 'wide', - argumentCallback: function argumentCallback(quarter) { - return Number(quarter) - 1; - } - }), - month: buildLocalizeFn({ - values: monthValues, - defaultWidth: 'wide' - }), - day: buildLocalizeFn({ - values: dayValues, - defaultWidth: 'wide' - }), - dayPeriod: buildLocalizeFn({ - values: dayPeriodValues, - defaultWidth: 'wide', - formattingValues: formattingDayPeriodValues, - defaultFormattingWidth: 'wide' - }) - }; - - function buildMatchPatternFn(args) { - return function (dirtyString, dirtyOptions) { - var string = String(dirtyString); - var options = dirtyOptions || {}; - var matchResult = string.match(args.matchPattern); - - if (!matchResult) { - return null; - } - - var matchedString = matchResult[0]; - var parseResult = string.match(args.parsePattern); - - if (!parseResult) { - return null; - } - - var value = args.valueCallback ? args.valueCallback(parseResult[0]) : parseResult[0]; - value = options.valueCallback ? options.valueCallback(value) : value; - return { - value: value, - rest: string.slice(matchedString.length) - }; - }; - } - - function buildMatchFn(args) { - return function (dirtyString, dirtyOptions) { - var string = String(dirtyString); - var options = dirtyOptions || {}; - var width = options.width; - var matchPattern = width && args.matchPatterns[width] || args.matchPatterns[args.defaultMatchWidth]; - var matchResult = string.match(matchPattern); - - if (!matchResult) { - return null; - } - - var matchedString = matchResult[0]; - var parsePatterns = width && args.parsePatterns[width] || args.parsePatterns[args.defaultParseWidth]; - var value; - - if (Object.prototype.toString.call(parsePatterns) === '[object Array]') { - value = findIndex(parsePatterns, function (pattern) { - return pattern.test(matchedString); - }); - } else { - value = findKey(parsePatterns, function (pattern) { - return pattern.test(matchedString); - }); - } - - value = args.valueCallback ? args.valueCallback(value) : value; - value = options.valueCallback ? options.valueCallback(value) : value; - return { - value: value, - rest: string.slice(matchedString.length) - }; - }; - } - - function findKey(object, predicate) { - for (var key in object) { - if (object.hasOwnProperty(key) && predicate(object[key])) { - return key; - } - } - } - - function findIndex(array, predicate) { - for (var key = 0; key < array.length; key++) { - if (predicate(array[key])) { - return key; - } - } - } - - var matchOrdinalNumberPattern = /^(\d+)(th|st|nd|rd)?/i; - var parseOrdinalNumberPattern = /\d+/i; - var matchEraPatterns = { - narrow: /^(b|a)/i, - abbreviated: /^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i, - wide: /^(before christ|before common era|anno domini|common era)/i - }; - var parseEraPatterns = { - any: [/^b/i, /^(a|c)/i] - }; - var matchQuarterPatterns = { - narrow: /^[1234]/i, - abbreviated: /^q[1234]/i, - wide: /^[1234](th|st|nd|rd)? quarter/i - }; - var parseQuarterPatterns = { - any: [/1/i, /2/i, /3/i, /4/i] - }; - var matchMonthPatterns = { - narrow: /^[jfmasond]/i, - abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i, - wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i - }; - var parseMonthPatterns = { - narrow: [/^j/i, /^f/i, /^m/i, /^a/i, /^m/i, /^j/i, /^j/i, /^a/i, /^s/i, /^o/i, /^n/i, /^d/i], - any: [/^ja/i, /^f/i, /^mar/i, /^ap/i, /^may/i, /^jun/i, /^jul/i, /^au/i, /^s/i, /^o/i, /^n/i, /^d/i] - }; - var matchDayPatterns = { - narrow: /^[smtwf]/i, - short: /^(su|mo|tu|we|th|fr|sa)/i, - abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i, - wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i - }; - var parseDayPatterns = { - narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i], - any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i] - }; - var matchDayPeriodPatterns = { - narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i, - any: /^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i - }; - var parseDayPeriodPatterns = { - any: { - am: /^a/i, - pm: /^p/i, - midnight: /^mi/i, - noon: /^no/i, - morning: /morning/i, - afternoon: /afternoon/i, - evening: /evening/i, - night: /night/i - } - }; - var match = { - ordinalNumber: buildMatchPatternFn({ - matchPattern: matchOrdinalNumberPattern, - parsePattern: parseOrdinalNumberPattern, - valueCallback: function valueCallback(value) { - return parseInt(value, 10); - } - }), - era: buildMatchFn({ - matchPatterns: matchEraPatterns, - defaultMatchWidth: 'wide', - parsePatterns: parseEraPatterns, - defaultParseWidth: 'any' - }), - quarter: buildMatchFn({ - matchPatterns: matchQuarterPatterns, - defaultMatchWidth: 'wide', - parsePatterns: parseQuarterPatterns, - defaultParseWidth: 'any', - valueCallback: function valueCallback(index) { - return index + 1; - } - }), - month: buildMatchFn({ - matchPatterns: matchMonthPatterns, - defaultMatchWidth: 'wide', - parsePatterns: parseMonthPatterns, - defaultParseWidth: 'any' - }), - day: buildMatchFn({ - matchPatterns: matchDayPatterns, - defaultMatchWidth: 'wide', - parsePatterns: parseDayPatterns, - defaultParseWidth: 'any' - }), - dayPeriod: buildMatchFn({ - matchPatterns: matchDayPeriodPatterns, - defaultMatchWidth: 'any', - parsePatterns: parseDayPeriodPatterns, - defaultParseWidth: 'any' - }) - }; - /** - * @type {Locale} - * @category Locales - * @summary English locale (United States). - * @language English - * @iso-639-2 eng - * @author Sasha Koss [@kossnocorp]{@link https://github.com/kossnocorp} - * @author Lesha Koss [@leshakoss]{@link https://github.com/leshakoss} - */ - - var locale = { - code: 'en-US', - formatDistance: formatDistance, - formatLong: formatLong, - formatRelative: formatRelative, - localize: localize, - match: match, - options: { - weekStartsOn: 0 - /* Sunday */ - , - firstWeekContainsDate: 1 - } - }; - - /** * @name subMilliseconds * @category Millisecond Helpers * @summary Subtract the specified number of milliseconds from the given date. * * @description * Subtract the specified number of milliseconds from the given date. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the date to be changed * @param {Number} amount - the amount of milliseconds to be subtracted. Positive decimals will be rounded using `Math.floor`, decimals less than zero will be rounded using `Math.ceil`. * @returns {Date} the new date with the milliseconds subtracted * @throws {TypeError} 2 arguments required * @@ -19363,107 +18633,11 @@ requiredArgs(2, arguments); var amount = toInteger(dirtyAmount); return addMilliseconds(dirtyDate, -amount); } - function addLeadingZeros(number, targetLength) { - var sign = number < 0 ? '-' : ''; - var output = Math.abs(number).toString(); - - while (output.length < targetLength) { - output = '0' + output; - } - - return sign + output; - } - - /* - * | | Unit | | Unit | - * |-----|--------------------------------|-----|--------------------------------| - * | a | AM, PM | A* | | - * | d | Day of month | D | | - * | h | Hour [1-12] | H | Hour [0-23] | - * | m | Minute | M | Month | - * | s | Second | S | Fraction of second | - * | y | Year (abs) | Y | | - * - * Letters marked by * are not implemented but reserved by Unicode standard. - */ - - var formatters$1 = { - // Year - y: function y(date, token) { - // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_tokens - // | Year | y | yy | yyy | yyyy | yyyyy | - // |----------|-------|----|-------|-------|-------| - // | AD 1 | 1 | 01 | 001 | 0001 | 00001 | - // | AD 12 | 12 | 12 | 012 | 0012 | 00012 | - // | AD 123 | 123 | 23 | 123 | 0123 | 00123 | - // | AD 1234 | 1234 | 34 | 1234 | 1234 | 01234 | - // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 | - var signedYear = date.getUTCFullYear(); // Returns 1 for 1 BC (which is year 0 in JavaScript) - - var year = signedYear > 0 ? signedYear : 1 - signedYear; - return addLeadingZeros(token === 'yy' ? year % 100 : year, token.length); - }, - // Month - M: function M(date, token) { - var month = date.getUTCMonth(); - return token === 'M' ? String(month + 1) : addLeadingZeros(month + 1, 2); - }, - // Day of the month - d: function d(date, token) { - return addLeadingZeros(date.getUTCDate(), token.length); - }, - // AM or PM - a: function a(date, token) { - var dayPeriodEnumValue = date.getUTCHours() / 12 >= 1 ? 'pm' : 'am'; - - switch (token) { - case 'a': - case 'aa': - return dayPeriodEnumValue.toUpperCase(); - - case 'aaa': - return dayPeriodEnumValue; - - case 'aaaaa': - return dayPeriodEnumValue[0]; - - case 'aaaa': - default: - return dayPeriodEnumValue === 'am' ? 'a.m.' : 'p.m.'; - } - }, - // Hour [1-12] - h: function h(date, token) { - return addLeadingZeros(date.getUTCHours() % 12 || 12, token.length); - }, - // Hour [0-23] - H: function H(date, token) { - return addLeadingZeros(date.getUTCHours(), token.length); - }, - // Minute - m: function m(date, token) { - return addLeadingZeros(date.getUTCMinutes(), token.length); - }, - // Second - s: function s(date, token) { - return addLeadingZeros(date.getUTCSeconds(), token.length); - }, - // Fraction of second - S: function S(date, token) { - var numberOfDigits = token.length; - var milliseconds = date.getUTCMilliseconds(); - var fractionalSeconds = Math.floor(milliseconds * Math.pow(10, numberOfDigits - 3)); - return addLeadingZeros(fractionalSeconds, token.length); - } - }; - - var MILLISECONDS_IN_DAY = 86400000; // This function will be a part of public API when UTC function will be implemented. - // See issue: https://github.com/date-fns/date-fns/issues/376 - + var MILLISECONDS_IN_DAY = 86400000; function getUTCDayOfYear(dirtyDate) { requiredArgs(1, arguments); var date = toDate(dirtyDate); var timestamp = date.getTime(); date.setUTCMonth(0, 1); @@ -19471,12 +18645,10 @@ var startOfYearTimestamp = date.getTime(); var difference = timestamp - startOfYearTimestamp; return Math.floor(difference / MILLISECONDS_IN_DAY) + 1; } - // See issue: https://github.com/date-fns/date-fns/issues/376 - function startOfUTCISOWeek(dirtyDate) { requiredArgs(1, arguments); var weekStartsOn = 1; var date = toDate(dirtyDate); var day = date.getUTCDay(); @@ -19484,12 +18656,10 @@ date.setUTCDate(date.getUTCDate() - diff); date.setUTCHours(0, 0, 0, 0); return date; } - // See issue: https://github.com/date-fns/date-fns/issues/376 - function getUTCISOWeekYear(dirtyDate) { requiredArgs(1, arguments); var date = toDate(dirtyDate); var year = date.getUTCFullYear(); var fourthOfJanuaryOfNextYear = new Date(0); @@ -19498,192 +18668,258 @@ var startOfNextYear = startOfUTCISOWeek(fourthOfJanuaryOfNextYear); var fourthOfJanuaryOfThisYear = new Date(0); fourthOfJanuaryOfThisYear.setUTCFullYear(year, 0, 4); fourthOfJanuaryOfThisYear.setUTCHours(0, 0, 0, 0); var startOfThisYear = startOfUTCISOWeek(fourthOfJanuaryOfThisYear); - if (date.getTime() >= startOfNextYear.getTime()) { return year + 1; } else if (date.getTime() >= startOfThisYear.getTime()) { return year; } else { return year - 1; } } - // See issue: https://github.com/date-fns/date-fns/issues/376 - function startOfUTCISOWeekYear(dirtyDate) { requiredArgs(1, arguments); var year = getUTCISOWeekYear(dirtyDate); var fourthOfJanuary = new Date(0); fourthOfJanuary.setUTCFullYear(year, 0, 4); fourthOfJanuary.setUTCHours(0, 0, 0, 0); var date = startOfUTCISOWeek(fourthOfJanuary); return date; } - var MILLISECONDS_IN_WEEK$1 = 604800000; // This function will be a part of public API when UTC function will be implemented. - // See issue: https://github.com/date-fns/date-fns/issues/376 - + var MILLISECONDS_IN_WEEK$1 = 604800000; function getUTCISOWeek(dirtyDate) { requiredArgs(1, arguments); var date = toDate(dirtyDate); var diff = startOfUTCISOWeek(date).getTime() - startOfUTCISOWeekYear(date).getTime(); // Round the number of days to the nearest integer // because the number of milliseconds in a week is not constant // (e.g. it's different in the week of the daylight saving time clock shift) return Math.round(diff / MILLISECONDS_IN_WEEK$1) + 1; } - // See issue: https://github.com/date-fns/date-fns/issues/376 - - function startOfUTCWeek(dirtyDate, dirtyOptions) { + function startOfUTCWeek(dirtyDate, options) { + var _ref, _ref2, _ref3, _options$weekStartsOn, _options$locale, _options$locale$optio, _defaultOptions$local, _defaultOptions$local2; requiredArgs(1, arguments); - var options = dirtyOptions || {}; - var locale = options.locale; - var localeWeekStartsOn = locale && locale.options && locale.options.weekStartsOn; - var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn); - var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn); // Test if weekStartsOn is between 0 and 6 _and_ is not NaN + var defaultOptions = getDefaultOptions(); + var weekStartsOn = toInteger((_ref = (_ref2 = (_ref3 = (_options$weekStartsOn = options === null || options === void 0 ? void 0 : options.weekStartsOn) !== null && _options$weekStartsOn !== void 0 ? _options$weekStartsOn : options === null || options === void 0 ? void 0 : (_options$locale = options.locale) === null || _options$locale === void 0 ? void 0 : (_options$locale$optio = _options$locale.options) === null || _options$locale$optio === void 0 ? void 0 : _options$locale$optio.weekStartsOn) !== null && _ref3 !== void 0 ? _ref3 : defaultOptions.weekStartsOn) !== null && _ref2 !== void 0 ? _ref2 : (_defaultOptions$local = defaultOptions.locale) === null || _defaultOptions$local === void 0 ? void 0 : (_defaultOptions$local2 = _defaultOptions$local.options) === null || _defaultOptions$local2 === void 0 ? void 0 : _defaultOptions$local2.weekStartsOn) !== null && _ref !== void 0 ? _ref : 0); // Test if weekStartsOn is between 0 and 6 _and_ is not NaN if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) { throw new RangeError('weekStartsOn must be between 0 and 6 inclusively'); } - var date = toDate(dirtyDate); var day = date.getUTCDay(); var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn; date.setUTCDate(date.getUTCDate() - diff); date.setUTCHours(0, 0, 0, 0); return date; } - // See issue: https://github.com/date-fns/date-fns/issues/376 - - function getUTCWeekYear(dirtyDate, dirtyOptions) { + function getUTCWeekYear(dirtyDate, options) { + var _ref, _ref2, _ref3, _options$firstWeekCon, _options$locale, _options$locale$optio, _defaultOptions$local, _defaultOptions$local2; requiredArgs(1, arguments); - var date = toDate(dirtyDate, dirtyOptions); + var date = toDate(dirtyDate); var year = date.getUTCFullYear(); - var options = dirtyOptions || {}; - var locale = options.locale; - var localeFirstWeekContainsDate = locale && locale.options && locale.options.firstWeekContainsDate; - var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate); - var firstWeekContainsDate = options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate); // Test if weekStartsOn is between 1 and 7 _and_ is not NaN + var defaultOptions = getDefaultOptions(); + var firstWeekContainsDate = toInteger((_ref = (_ref2 = (_ref3 = (_options$firstWeekCon = options === null || options === void 0 ? void 0 : options.firstWeekContainsDate) !== null && _options$firstWeekCon !== void 0 ? _options$firstWeekCon : options === null || options === void 0 ? void 0 : (_options$locale = options.locale) === null || _options$locale === void 0 ? void 0 : (_options$locale$optio = _options$locale.options) === null || _options$locale$optio === void 0 ? void 0 : _options$locale$optio.firstWeekContainsDate) !== null && _ref3 !== void 0 ? _ref3 : defaultOptions.firstWeekContainsDate) !== null && _ref2 !== void 0 ? _ref2 : (_defaultOptions$local = defaultOptions.locale) === null || _defaultOptions$local === void 0 ? void 0 : (_defaultOptions$local2 = _defaultOptions$local.options) === null || _defaultOptions$local2 === void 0 ? void 0 : _defaultOptions$local2.firstWeekContainsDate) !== null && _ref !== void 0 ? _ref : 1); // Test if weekStartsOn is between 1 and 7 _and_ is not NaN if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) { throw new RangeError('firstWeekContainsDate must be between 1 and 7 inclusively'); } - var firstWeekOfNextYear = new Date(0); firstWeekOfNextYear.setUTCFullYear(year + 1, 0, firstWeekContainsDate); firstWeekOfNextYear.setUTCHours(0, 0, 0, 0); - var startOfNextYear = startOfUTCWeek(firstWeekOfNextYear, dirtyOptions); + var startOfNextYear = startOfUTCWeek(firstWeekOfNextYear, options); var firstWeekOfThisYear = new Date(0); firstWeekOfThisYear.setUTCFullYear(year, 0, firstWeekContainsDate); firstWeekOfThisYear.setUTCHours(0, 0, 0, 0); - var startOfThisYear = startOfUTCWeek(firstWeekOfThisYear, dirtyOptions); - + var startOfThisYear = startOfUTCWeek(firstWeekOfThisYear, options); if (date.getTime() >= startOfNextYear.getTime()) { return year + 1; } else if (date.getTime() >= startOfThisYear.getTime()) { return year; } else { return year - 1; } } - // See issue: https://github.com/date-fns/date-fns/issues/376 - - function startOfUTCWeekYear(dirtyDate, dirtyOptions) { + function startOfUTCWeekYear(dirtyDate, options) { + var _ref, _ref2, _ref3, _options$firstWeekCon, _options$locale, _options$locale$optio, _defaultOptions$local, _defaultOptions$local2; requiredArgs(1, arguments); - var options = dirtyOptions || {}; - var locale = options.locale; - var localeFirstWeekContainsDate = locale && locale.options && locale.options.firstWeekContainsDate; - var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate); - var firstWeekContainsDate = options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate); - var year = getUTCWeekYear(dirtyDate, dirtyOptions); + var defaultOptions = getDefaultOptions(); + var firstWeekContainsDate = toInteger((_ref = (_ref2 = (_ref3 = (_options$firstWeekCon = options === null || options === void 0 ? void 0 : options.firstWeekContainsDate) !== null && _options$firstWeekCon !== void 0 ? _options$firstWeekCon : options === null || options === void 0 ? void 0 : (_options$locale = options.locale) === null || _options$locale === void 0 ? void 0 : (_options$locale$optio = _options$locale.options) === null || _options$locale$optio === void 0 ? void 0 : _options$locale$optio.firstWeekContainsDate) !== null && _ref3 !== void 0 ? _ref3 : defaultOptions.firstWeekContainsDate) !== null && _ref2 !== void 0 ? _ref2 : (_defaultOptions$local = defaultOptions.locale) === null || _defaultOptions$local === void 0 ? void 0 : (_defaultOptions$local2 = _defaultOptions$local.options) === null || _defaultOptions$local2 === void 0 ? void 0 : _defaultOptions$local2.firstWeekContainsDate) !== null && _ref !== void 0 ? _ref : 1); + var year = getUTCWeekYear(dirtyDate, options); var firstWeek = new Date(0); firstWeek.setUTCFullYear(year, 0, firstWeekContainsDate); firstWeek.setUTCHours(0, 0, 0, 0); - var date = startOfUTCWeek(firstWeek, dirtyOptions); + var date = startOfUTCWeek(firstWeek, options); return date; } - var MILLISECONDS_IN_WEEK = 604800000; // This function will be a part of public API when UTC function will be implemented. - // See issue: https://github.com/date-fns/date-fns/issues/376 - + var MILLISECONDS_IN_WEEK = 604800000; function getUTCWeek(dirtyDate, options) { requiredArgs(1, arguments); var date = toDate(dirtyDate); var diff = startOfUTCWeek(date, options).getTime() - startOfUTCWeekYear(date, options).getTime(); // Round the number of days to the nearest integer // because the number of milliseconds in a week is not constant // (e.g. it's different in the week of the daylight saving time clock shift) return Math.round(diff / MILLISECONDS_IN_WEEK) + 1; } + function addLeadingZeros(number, targetLength) { + var sign = number < 0 ? '-' : ''; + var output = Math.abs(number).toString(); + while (output.length < targetLength) { + output = '0' + output; + } + return sign + output; + } + + /* + * | | Unit | | Unit | + * |-----|--------------------------------|-----|--------------------------------| + * | a | AM, PM | A* | | + * | d | Day of month | D | | + * | h | Hour [1-12] | H | Hour [0-23] | + * | m | Minute | M | Month | + * | s | Second | S | Fraction of second | + * | y | Year (abs) | Y | | + * + * Letters marked by * are not implemented but reserved by Unicode standard. + */ + + var formatters$2 = { + // Year + y: function y(date, token) { + // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_tokens + // | Year | y | yy | yyy | yyyy | yyyyy | + // |----------|-------|----|-------|-------|-------| + // | AD 1 | 1 | 01 | 001 | 0001 | 00001 | + // | AD 12 | 12 | 12 | 012 | 0012 | 00012 | + // | AD 123 | 123 | 23 | 123 | 0123 | 00123 | + // | AD 1234 | 1234 | 34 | 1234 | 1234 | 01234 | + // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 | + var signedYear = date.getUTCFullYear(); // Returns 1 for 1 BC (which is year 0 in JavaScript) + + var year = signedYear > 0 ? signedYear : 1 - signedYear; + return addLeadingZeros(token === 'yy' ? year % 100 : year, token.length); + }, + // Month + M: function M(date, token) { + var month = date.getUTCMonth(); + return token === 'M' ? String(month + 1) : addLeadingZeros(month + 1, 2); + }, + // Day of the month + d: function d(date, token) { + return addLeadingZeros(date.getUTCDate(), token.length); + }, + // AM or PM + a: function a(date, token) { + var dayPeriodEnumValue = date.getUTCHours() / 12 >= 1 ? 'pm' : 'am'; + switch (token) { + case 'a': + case 'aa': + return dayPeriodEnumValue.toUpperCase(); + case 'aaa': + return dayPeriodEnumValue; + case 'aaaaa': + return dayPeriodEnumValue[0]; + case 'aaaa': + default: + return dayPeriodEnumValue === 'am' ? 'a.m.' : 'p.m.'; + } + }, + // Hour [1-12] + h: function h(date, token) { + return addLeadingZeros(date.getUTCHours() % 12 || 12, token.length); + }, + // Hour [0-23] + H: function H(date, token) { + return addLeadingZeros(date.getUTCHours(), token.length); + }, + // Minute + m: function m(date, token) { + return addLeadingZeros(date.getUTCMinutes(), token.length); + }, + // Second + s: function s(date, token) { + return addLeadingZeros(date.getUTCSeconds(), token.length); + }, + // Fraction of second + S: function S(date, token) { + var numberOfDigits = token.length; + var milliseconds = date.getUTCMilliseconds(); + var fractionalSeconds = Math.floor(milliseconds * Math.pow(10, numberOfDigits - 3)); + return addLeadingZeros(fractionalSeconds, token.length); + } + }; + var formatters$3 = formatters$2; + var dayPeriodEnum = { am: 'am', pm: 'pm', midnight: 'midnight', noon: 'noon', morning: 'morning', afternoon: 'afternoon', evening: 'evening', night: 'night' - /* - * | | Unit | | Unit | - * |-----|--------------------------------|-----|--------------------------------| - * | a | AM, PM | A* | Milliseconds in day | - * | b | AM, PM, noon, midnight | B | Flexible day period | - * | c | Stand-alone local day of week | C* | Localized hour w/ day period | - * | d | Day of month | D | Day of year | - * | e | Local day of week | E | Day of week | - * | f | | F* | Day of week in month | - * | g* | Modified Julian day | G | Era | - * | h | Hour [1-12] | H | Hour [0-23] | - * | i! | ISO day of week | I! | ISO week of year | - * | j* | Localized hour w/ day period | J* | Localized hour w/o day period | - * | k | Hour [1-24] | K | Hour [0-11] | - * | l* | (deprecated) | L | Stand-alone month | - * | m | Minute | M | Month | - * | n | | N | | - * | o! | Ordinal number modifier | O | Timezone (GMT) | - * | p! | Long localized time | P! | Long localized date | - * | q | Stand-alone quarter | Q | Quarter | - * | r* | Related Gregorian year | R! | ISO week-numbering year | - * | s | Second | S | Fraction of second | - * | t! | Seconds timestamp | T! | Milliseconds timestamp | - * | u | Extended year | U* | Cyclic year | - * | v* | Timezone (generic non-locat.) | V* | Timezone (location) | - * | w | Local week of year | W* | Week of month | - * | x | Timezone (ISO-8601 w/o Z) | X | Timezone (ISO-8601) | - * | y | Year (abs) | Y | Local week-numbering year | - * | z | Timezone (specific non-locat.) | Z* | Timezone (aliases) | - * - * Letters marked by * are not implemented but reserved by Unicode standard. - * - * Letters marked by ! are non-standard, but implemented by date-fns: - * - `o` modifies the previous token to turn it into an ordinal (see `format` docs) - * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days, - * i.e. 7 for Sunday, 1 for Monday, etc. - * - `I` is ISO week of year, as opposed to `w` which is local week of year. - * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year. - * `R` is supposed to be used in conjunction with `I` and `i` - * for universal ISO week-numbering date, whereas - * `Y` is supposed to be used in conjunction with `w` and `e` - * for week-numbering date specific to the locale. - * - `P` is long localized date format - * - `p` is long localized time format - */ - }; + + /* + * | | Unit | | Unit | + * |-----|--------------------------------|-----|--------------------------------| + * | a | AM, PM | A* | Milliseconds in day | + * | b | AM, PM, noon, midnight | B | Flexible day period | + * | c | Stand-alone local day of week | C* | Localized hour w/ day period | + * | d | Day of month | D | Day of year | + * | e | Local day of week | E | Day of week | + * | f | | F* | Day of week in month | + * | g* | Modified Julian day | G | Era | + * | h | Hour [1-12] | H | Hour [0-23] | + * | i! | ISO day of week | I! | ISO week of year | + * | j* | Localized hour w/ day period | J* | Localized hour w/o day period | + * | k | Hour [1-24] | K | Hour [0-11] | + * | l* | (deprecated) | L | Stand-alone month | + * | m | Minute | M | Month | + * | n | | N | | + * | o! | Ordinal number modifier | O | Timezone (GMT) | + * | p! | Long localized time | P! | Long localized date | + * | q | Stand-alone quarter | Q | Quarter | + * | r* | Related Gregorian year | R! | ISO week-numbering year | + * | s | Second | S | Fraction of second | + * | t! | Seconds timestamp | T! | Milliseconds timestamp | + * | u | Extended year | U* | Cyclic year | + * | v* | Timezone (generic non-locat.) | V* | Timezone (location) | + * | w | Local week of year | W* | Week of month | + * | x | Timezone (ISO-8601 w/o Z) | X | Timezone (ISO-8601) | + * | y | Year (abs) | Y | Local week-numbering year | + * | z | Timezone (specific non-locat.) | Z* | Timezone (aliases) | + * + * Letters marked by * are not implemented but reserved by Unicode standard. + * + * Letters marked by ! are non-standard, but implemented by date-fns: + * - `o` modifies the previous token to turn it into an ordinal (see `format` docs) + * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days, + * i.e. 7 for Sunday, 1 for Monday, etc. + * - `I` is ISO week of year, as opposed to `w` which is local week of year. + * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year. + * `R` is supposed to be used in conjunction with `I` and `i` + * for universal ISO week-numbering date, whereas + * `Y` is supposed to be used in conjunction with `w` and `e` + * for week-numbering date specific to the locale. + * - `P` is long localized date format + * - `p` is long localized time format + */ var formatters = { // Era G: function G(date, token, localize) { var era = date.getUTCFullYear() > 0 ? 1 : 0; - switch (token) { // AD, BC case 'G': case 'GG': case 'GGG': @@ -19714,12 +18950,11 @@ var year = signedYear > 0 ? signedYear : 1 - signedYear; return localize.ordinalNumber(year, { unit: 'year' }); } - - return formatters$1.y(date, token); + return formatters$3.y(date, token); }, // Local week-numbering year Y: function Y(date, token, localize, options) { var signedWeekYear = getUTCWeekYear(date, options); // Returns 1 for 1 BC (which is year 0 in JavaScript) @@ -19728,18 +18963,16 @@ if (token === 'YY') { var twoDigitYear = weekYear % 100; return addLeadingZeros(twoDigitYear, 2); } // Ordinal number - if (token === 'Yo') { return localize.ordinalNumber(weekYear, { unit: 'year' }); } // Padding - return addLeadingZeros(weekYear, token.length); }, // ISO week-numbering year R: function R(date, token) { var isoWeekYear = getUTCISOWeekYear(date); // Padding @@ -19760,11 +18993,10 @@ return addLeadingZeros(year, token.length); }, // Quarter Q: function Q(date, token, localize) { var quarter = Math.ceil((date.getUTCMonth() + 1) / 3); - switch (token) { // 1, 2, 3, 4 case 'Q': return String(quarter); // 01, 02, 03, 04 @@ -19802,11 +19034,10 @@ } }, // Stand-alone quarter q: function q(date, token, localize) { var quarter = Math.ceil((date.getUTCMonth() + 1) / 3); - switch (token) { // 1, 2, 3, 4 case 'q': return String(quarter); // 01, 02, 03, 04 @@ -19844,15 +19075,14 @@ } }, // Month M: function M(date, token, localize) { var month = date.getUTCMonth(); - switch (token) { case 'M': case 'MM': - return formatters$1.M(date, token); + return formatters$3.M(date, token); // 1st, 2nd, ..., 12th case 'Mo': return localize.ordinalNumber(month + 1, { unit: 'month' @@ -19882,11 +19112,10 @@ } }, // Stand-alone month L: function L(date, token, localize) { var month = date.getUTCMonth(); - switch (token) { // 1, 2, ..., 12 case 'L': return String(month + 1); // 01, 02, ..., 12 @@ -19924,57 +19153,49 @@ } }, // Local week of year w: function w(date, token, localize, options) { var week = getUTCWeek(date, options); - if (token === 'wo') { return localize.ordinalNumber(week, { unit: 'week' }); } - return addLeadingZeros(week, token.length); }, // ISO week of year I: function I(date, token, localize) { var isoWeek = getUTCISOWeek(date); - if (token === 'Io') { return localize.ordinalNumber(isoWeek, { unit: 'week' }); } - return addLeadingZeros(isoWeek, token.length); }, // Day of the month d: function d(date, token, localize) { if (token === 'do') { return localize.ordinalNumber(date.getUTCDate(), { unit: 'date' }); } - - return formatters$1.d(date, token); + return formatters$3.d(date, token); }, // Day of year D: function D(date, token, localize) { var dayOfYear = getUTCDayOfYear(date); - if (token === 'Do') { return localize.ordinalNumber(dayOfYear, { unit: 'dayOfYear' }); } - return addLeadingZeros(dayOfYear, token.length); }, // Day of week E: function E(date, token, localize) { var dayOfWeek = date.getUTCDay(); - switch (token) { // Tue case 'E': case 'EE': case 'EEE': @@ -20008,11 +19229,10 @@ }, // Local day of week e: function e(date, token, localize, options) { var dayOfWeek = date.getUTCDay(); var localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7; - switch (token) { // Numerical value (Nth day of week with current locale or weekStartsOn) case 'e': return String(localDayOfWeek); // Padded numerical value @@ -20023,11 +19243,10 @@ case 'eo': return localize.ordinalNumber(localDayOfWeek, { unit: 'day' }); - case 'eee': return localize.day(dayOfWeek, { width: 'abbreviated', context: 'formatting' }); @@ -20057,11 +19276,10 @@ }, // Stand-alone local day of week c: function c(date, token, localize, options) { var dayOfWeek = date.getUTCDay(); var localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7; - switch (token) { // Numerical value (same as in `e`) case 'c': return String(localDayOfWeek); // Padded numerical value @@ -20072,11 +19290,10 @@ case 'co': return localize.ordinalNumber(localDayOfWeek, { unit: 'day' }); - case 'ccc': return localize.day(dayOfWeek, { width: 'abbreviated', context: 'standalone' }); @@ -20106,11 +19323,10 @@ }, // ISO day of week i: function i(date, token, localize) { var dayOfWeek = date.getUTCDay(); var isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek; - switch (token) { // 2 case 'i': return String(isoDayOfWeek); // 02 @@ -20156,31 +19372,27 @@ }, // AM or PM a: function a(date, token, localize) { var hours = date.getUTCHours(); var dayPeriodEnumValue = hours / 12 >= 1 ? 'pm' : 'am'; - switch (token) { case 'a': case 'aa': return localize.dayPeriod(dayPeriodEnumValue, { width: 'abbreviated', context: 'formatting' }); - case 'aaa': return localize.dayPeriod(dayPeriodEnumValue, { width: 'abbreviated', context: 'formatting' }).toLowerCase(); - case 'aaaaa': return localize.dayPeriod(dayPeriodEnumValue, { width: 'narrow', context: 'formatting' }); - case 'aaaa': default: return localize.dayPeriod(dayPeriodEnumValue, { width: 'wide', context: 'formatting' @@ -20189,39 +19401,34 @@ }, // AM, PM, midnight, noon b: function b(date, token, localize) { var hours = date.getUTCHours(); var dayPeriodEnumValue; - if (hours === 12) { dayPeriodEnumValue = dayPeriodEnum.noon; } else if (hours === 0) { dayPeriodEnumValue = dayPeriodEnum.midnight; } else { dayPeriodEnumValue = hours / 12 >= 1 ? 'pm' : 'am'; } - switch (token) { case 'b': case 'bb': return localize.dayPeriod(dayPeriodEnumValue, { width: 'abbreviated', context: 'formatting' }); - case 'bbb': return localize.dayPeriod(dayPeriodEnumValue, { width: 'abbreviated', context: 'formatting' }).toLowerCase(); - case 'bbbbb': return localize.dayPeriod(dayPeriodEnumValue, { width: 'narrow', context: 'formatting' }); - case 'bbbb': default: return localize.dayPeriod(dayPeriodEnumValue, { width: 'wide', context: 'formatting' @@ -20230,36 +19437,32 @@ }, // in the morning, in the afternoon, in the evening, at night B: function B(date, token, localize) { var hours = date.getUTCHours(); var dayPeriodEnumValue; - if (hours >= 17) { dayPeriodEnumValue = dayPeriodEnum.evening; } else if (hours >= 12) { dayPeriodEnumValue = dayPeriodEnum.afternoon; } else if (hours >= 4) { dayPeriodEnumValue = dayPeriodEnum.morning; } else { dayPeriodEnumValue = dayPeriodEnum.night; } - switch (token) { case 'B': case 'BB': case 'BBB': return localize.dayPeriod(dayPeriodEnumValue, { width: 'abbreviated', context: 'formatting' }); - case 'BBBBB': return localize.dayPeriod(dayPeriodEnumValue, { width: 'narrow', context: 'formatting' }); - case 'BBBB': default: return localize.dayPeriod(dayPeriodEnumValue, { width: 'wide', context: 'formatting' @@ -20273,81 +19476,71 @@ if (hours === 0) hours = 12; return localize.ordinalNumber(hours, { unit: 'hour' }); } - - return formatters$1.h(date, token); + return formatters$3.h(date, token); }, // Hour [0-23] H: function H(date, token, localize) { if (token === 'Ho') { return localize.ordinalNumber(date.getUTCHours(), { unit: 'hour' }); } - - return formatters$1.H(date, token); + return formatters$3.H(date, token); }, // Hour [0-11] K: function K(date, token, localize) { var hours = date.getUTCHours() % 12; - if (token === 'Ko') { return localize.ordinalNumber(hours, { unit: 'hour' }); } - return addLeadingZeros(hours, token.length); }, // Hour [1-24] k: function k(date, token, localize) { var hours = date.getUTCHours(); if (hours === 0) hours = 24; - if (token === 'ko') { return localize.ordinalNumber(hours, { unit: 'hour' }); } - return addLeadingZeros(hours, token.length); }, // Minute m: function m(date, token, localize) { if (token === 'mo') { return localize.ordinalNumber(date.getUTCMinutes(), { unit: 'minute' }); } - - return formatters$1.m(date, token); + return formatters$3.m(date, token); }, // Second s: function s(date, token, localize) { if (token === 'so') { return localize.ordinalNumber(date.getUTCSeconds(), { unit: 'second' }); } - - return formatters$1.s(date, token); + return formatters$3.s(date, token); }, // Fraction of second S: function S(date, token) { - return formatters$1.S(date, token); + return formatters$3.S(date, token); }, // Timezone (ISO-8601. If offset is 0, output is always `'Z'`) X: function X(date, token, _localize, options) { var originalDate = options._originalDate || date; var timezoneOffset = originalDate.getTimezoneOffset(); - if (timezoneOffset === 0) { return 'Z'; } - switch (token) { // Hours and optional minutes case 'X': return formatTimezoneWithOptionalMinutes(timezoneOffset); // Hours, minutes and optional seconds without `:` delimiter @@ -20371,11 +19564,10 @@ }, // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent) x: function x(date, token, _localize, options) { var originalDate = options._originalDate || date; var timezoneOffset = originalDate.getTimezoneOffset(); - switch (token) { // Hours and optional minutes case 'x': return formatTimezoneWithOptionalMinutes(timezoneOffset); // Hours, minutes and optional seconds without `:` delimiter @@ -20399,11 +19591,10 @@ }, // Timezone (GMT) O: function O(date, token, _localize, options) { var originalDate = options._originalDate || date; var timezoneOffset = originalDate.getTimezoneOffset(); - switch (token) { // Short case 'O': case 'OO': case 'OOO': @@ -20417,11 +19608,10 @@ }, // Timezone (specific non-location) z: function z(date, token, _localize, options) { var originalDate = options._originalDate || date; var timezoneOffset = originalDate.getTimezoneOffset(); - switch (token) { // Short case 'z': case 'zz': case 'zzz': @@ -20444,138 +19634,118 @@ var originalDate = options._originalDate || date; var timestamp = originalDate.getTime(); return addLeadingZeros(timestamp, token.length); } }; - function formatTimezoneShort(offset, dirtyDelimiter) { var sign = offset > 0 ? '-' : '+'; var absOffset = Math.abs(offset); var hours = Math.floor(absOffset / 60); var minutes = absOffset % 60; - if (minutes === 0) { return sign + String(hours); } - var delimiter = dirtyDelimiter || ''; return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2); } - function formatTimezoneWithOptionalMinutes(offset, dirtyDelimiter) { if (offset % 60 === 0) { var sign = offset > 0 ? '-' : '+'; return sign + addLeadingZeros(Math.abs(offset) / 60, 2); } - return formatTimezone(offset, dirtyDelimiter); } - function formatTimezone(offset, dirtyDelimiter) { var delimiter = dirtyDelimiter || ''; var sign = offset > 0 ? '-' : '+'; var absOffset = Math.abs(offset); var hours = addLeadingZeros(Math.floor(absOffset / 60), 2); var minutes = addLeadingZeros(absOffset % 60, 2); return sign + hours + delimiter + minutes; } + var formatters$1 = formatters; - function dateLongFormatter(pattern, formatLong) { + var dateLongFormatter = function dateLongFormatter(pattern, formatLong) { switch (pattern) { case 'P': return formatLong.date({ width: 'short' }); - case 'PP': return formatLong.date({ width: 'medium' }); - case 'PPP': return formatLong.date({ width: 'long' }); - case 'PPPP': default: return formatLong.date({ width: 'full' }); } - } - - function timeLongFormatter(pattern, formatLong) { + }; + var timeLongFormatter = function timeLongFormatter(pattern, formatLong) { switch (pattern) { case 'p': return formatLong.time({ width: 'short' }); - case 'pp': return formatLong.time({ width: 'medium' }); - case 'ppp': return formatLong.time({ width: 'long' }); - case 'pppp': default: return formatLong.time({ width: 'full' }); } - } - - function dateTimeLongFormatter(pattern, formatLong) { - var matchResult = pattern.match(/(P+)(p+)?/); + }; + var dateTimeLongFormatter = function dateTimeLongFormatter(pattern, formatLong) { + var matchResult = pattern.match(/(P+)(p+)?/) || []; var datePattern = matchResult[1]; var timePattern = matchResult[2]; - if (!timePattern) { return dateLongFormatter(pattern, formatLong); } - var dateTimeFormat; - switch (datePattern) { case 'P': dateTimeFormat = formatLong.dateTime({ width: 'short' }); break; - case 'PP': dateTimeFormat = formatLong.dateTime({ width: 'medium' }); break; - case 'PPP': dateTimeFormat = formatLong.dateTime({ width: 'long' }); break; - case 'PPPP': default: dateTimeFormat = formatLong.dateTime({ width: 'full' }); break; } - return dateTimeFormat.replace('{{date}}', dateLongFormatter(datePattern, formatLong)).replace('{{time}}', timeLongFormatter(timePattern, formatLong)); - } - + }; var longFormatters = { p: timeLongFormatter, P: dateTimeLongFormatter }; + var longFormatters$1 = longFormatters; var protectedDayOfYearTokens = ['D', 'DD']; var protectedWeekYearTokens = ['YY', 'YYYY']; function isProtectedDayOfYearToken(token) { return protectedDayOfYearTokens.indexOf(token) !== -1; @@ -20583,20 +19753,503 @@ function isProtectedWeekYearToken(token) { return protectedWeekYearTokens.indexOf(token) !== -1; } function throwProtectedError(token, format, input) { if (token === 'YYYY') { - throw new RangeError("Use `yyyy` instead of `YYYY` (in `".concat(format, "`) for formatting years to the input `").concat(input, "`; see: https://git.io/fxCyr")); + throw new RangeError("Use `yyyy` instead of `YYYY` (in `".concat(format, "`) for formatting years to the input `").concat(input, "`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md")); } else if (token === 'YY') { - throw new RangeError("Use `yy` instead of `YY` (in `".concat(format, "`) for formatting years to the input `").concat(input, "`; see: https://git.io/fxCyr")); + throw new RangeError("Use `yy` instead of `YY` (in `".concat(format, "`) for formatting years to the input `").concat(input, "`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md")); } else if (token === 'D') { - throw new RangeError("Use `d` instead of `D` (in `".concat(format, "`) for formatting days of the month to the input `").concat(input, "`; see: https://git.io/fxCyr")); + throw new RangeError("Use `d` instead of `D` (in `".concat(format, "`) for formatting days of the month to the input `").concat(input, "`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md")); } else if (token === 'DD') { - throw new RangeError("Use `dd` instead of `DD` (in `".concat(format, "`) for formatting days of the month to the input `").concat(input, "`; see: https://git.io/fxCyr")); + throw new RangeError("Use `dd` instead of `DD` (in `".concat(format, "`) for formatting days of the month to the input `").concat(input, "`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md")); } } + var formatDistanceLocale = { + lessThanXSeconds: { + one: 'less than a second', + other: 'less than {{count}} seconds' + }, + xSeconds: { + one: '1 second', + other: '{{count}} seconds' + }, + halfAMinute: 'half a minute', + lessThanXMinutes: { + one: 'less than a minute', + other: 'less than {{count}} minutes' + }, + xMinutes: { + one: '1 minute', + other: '{{count}} minutes' + }, + aboutXHours: { + one: 'about 1 hour', + other: 'about {{count}} hours' + }, + xHours: { + one: '1 hour', + other: '{{count}} hours' + }, + xDays: { + one: '1 day', + other: '{{count}} days' + }, + aboutXWeeks: { + one: 'about 1 week', + other: 'about {{count}} weeks' + }, + xWeeks: { + one: '1 week', + other: '{{count}} weeks' + }, + aboutXMonths: { + one: 'about 1 month', + other: 'about {{count}} months' + }, + xMonths: { + one: '1 month', + other: '{{count}} months' + }, + aboutXYears: { + one: 'about 1 year', + other: 'about {{count}} years' + }, + xYears: { + one: '1 year', + other: '{{count}} years' + }, + overXYears: { + one: 'over 1 year', + other: 'over {{count}} years' + }, + almostXYears: { + one: 'almost 1 year', + other: 'almost {{count}} years' + } + }; + var formatDistance = function formatDistance(token, count, options) { + var result; + var tokenValue = formatDistanceLocale[token]; + if (typeof tokenValue === 'string') { + result = tokenValue; + } else if (count === 1) { + result = tokenValue.one; + } else { + result = tokenValue.other.replace('{{count}}', count.toString()); + } + if (options !== null && options !== void 0 && options.addSuffix) { + if (options.comparison && options.comparison > 0) { + return 'in ' + result; + } else { + return result + ' ago'; + } + } + return result; + }; + var formatDistance$1 = formatDistance; + + function buildFormatLongFn(args) { + return function () { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + // TODO: Remove String() + var width = options.width ? String(options.width) : args.defaultWidth; + var format = args.formats[width] || args.formats[args.defaultWidth]; + return format; + }; + } + + var dateFormats = { + full: 'EEEE, MMMM do, y', + "long": 'MMMM do, y', + medium: 'MMM d, y', + "short": 'MM/dd/yyyy' + }; + var timeFormats = { + full: 'h:mm:ss a zzzz', + "long": 'h:mm:ss a z', + medium: 'h:mm:ss a', + "short": 'h:mm a' + }; + var dateTimeFormats = { + full: "{{date}} 'at' {{time}}", + "long": "{{date}} 'at' {{time}}", + medium: '{{date}}, {{time}}', + "short": '{{date}}, {{time}}' + }; + var formatLong = { + date: buildFormatLongFn({ + formats: dateFormats, + defaultWidth: 'full' + }), + time: buildFormatLongFn({ + formats: timeFormats, + defaultWidth: 'full' + }), + dateTime: buildFormatLongFn({ + formats: dateTimeFormats, + defaultWidth: 'full' + }) + }; + var formatLong$1 = formatLong; + + var formatRelativeLocale = { + lastWeek: "'last' eeee 'at' p", + yesterday: "'yesterday at' p", + today: "'today at' p", + tomorrow: "'tomorrow at' p", + nextWeek: "eeee 'at' p", + other: 'P' + }; + var formatRelative = function formatRelative(token, _date, _baseDate, _options) { + return formatRelativeLocale[token]; + }; + var formatRelative$1 = formatRelative; + + function buildLocalizeFn(args) { + return function (dirtyIndex, options) { + var context = options !== null && options !== void 0 && options.context ? String(options.context) : 'standalone'; + var valuesArray; + if (context === 'formatting' && args.formattingValues) { + var defaultWidth = args.defaultFormattingWidth || args.defaultWidth; + var width = options !== null && options !== void 0 && options.width ? String(options.width) : defaultWidth; + valuesArray = args.formattingValues[width] || args.formattingValues[defaultWidth]; + } else { + var _defaultWidth = args.defaultWidth; + var _width = options !== null && options !== void 0 && options.width ? String(options.width) : args.defaultWidth; + valuesArray = args.values[_width] || args.values[_defaultWidth]; + } + var index = args.argumentCallback ? args.argumentCallback(dirtyIndex) : dirtyIndex; // @ts-ignore: For some reason TypeScript just don't want to match it, no matter how hard we try. I challenge you to try to remove it! + + return valuesArray[index]; + }; + } + + var eraValues = { + narrow: ['B', 'A'], + abbreviated: ['BC', 'AD'], + wide: ['Before Christ', 'Anno Domini'] + }; + var quarterValues = { + narrow: ['1', '2', '3', '4'], + abbreviated: ['Q1', 'Q2', 'Q3', 'Q4'], + wide: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'] + }; // Note: in English, the names of days of the week and months are capitalized. + // If you are making a new locale based on this one, check if the same is true for the language you're working on. + // Generally, formatted dates should look like they are in the middle of a sentence, + // e.g. in Spanish language the weekdays and months should be in the lowercase. + + var monthValues = { + narrow: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'], + abbreviated: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + wide: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] + }; + var dayValues = { + narrow: ['S', 'M', 'T', 'W', 'T', 'F', 'S'], + "short": ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'], + abbreviated: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + wide: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] + }; + var dayPeriodValues = { + narrow: { + am: 'a', + pm: 'p', + midnight: 'mi', + noon: 'n', + morning: 'morning', + afternoon: 'afternoon', + evening: 'evening', + night: 'night' + }, + abbreviated: { + am: 'AM', + pm: 'PM', + midnight: 'midnight', + noon: 'noon', + morning: 'morning', + afternoon: 'afternoon', + evening: 'evening', + night: 'night' + }, + wide: { + am: 'a.m.', + pm: 'p.m.', + midnight: 'midnight', + noon: 'noon', + morning: 'morning', + afternoon: 'afternoon', + evening: 'evening', + night: 'night' + } + }; + var formattingDayPeriodValues = { + narrow: { + am: 'a', + pm: 'p', + midnight: 'mi', + noon: 'n', + morning: 'in the morning', + afternoon: 'in the afternoon', + evening: 'in the evening', + night: 'at night' + }, + abbreviated: { + am: 'AM', + pm: 'PM', + midnight: 'midnight', + noon: 'noon', + morning: 'in the morning', + afternoon: 'in the afternoon', + evening: 'in the evening', + night: 'at night' + }, + wide: { + am: 'a.m.', + pm: 'p.m.', + midnight: 'midnight', + noon: 'noon', + morning: 'in the morning', + afternoon: 'in the afternoon', + evening: 'in the evening', + night: 'at night' + } + }; + var ordinalNumber = function ordinalNumber(dirtyNumber, _options) { + var number = Number(dirtyNumber); // If ordinal numbers depend on context, for example, + // if they are different for different grammatical genders, + // use `options.unit`. + // + // `unit` can be 'year', 'quarter', 'month', 'week', 'date', 'dayOfYear', + // 'day', 'hour', 'minute', 'second'. + + var rem100 = number % 100; + if (rem100 > 20 || rem100 < 10) { + switch (rem100 % 10) { + case 1: + return number + 'st'; + case 2: + return number + 'nd'; + case 3: + return number + 'rd'; + } + } + return number + 'th'; + }; + var localize = { + ordinalNumber: ordinalNumber, + era: buildLocalizeFn({ + values: eraValues, + defaultWidth: 'wide' + }), + quarter: buildLocalizeFn({ + values: quarterValues, + defaultWidth: 'wide', + argumentCallback: function argumentCallback(quarter) { + return quarter - 1; + } + }), + month: buildLocalizeFn({ + values: monthValues, + defaultWidth: 'wide' + }), + day: buildLocalizeFn({ + values: dayValues, + defaultWidth: 'wide' + }), + dayPeriod: buildLocalizeFn({ + values: dayPeriodValues, + defaultWidth: 'wide', + formattingValues: formattingDayPeriodValues, + defaultFormattingWidth: 'wide' + }) + }; + var localize$1 = localize; + + function buildMatchFn(args) { + return function (string) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var width = options.width; + var matchPattern = width && args.matchPatterns[width] || args.matchPatterns[args.defaultMatchWidth]; + var matchResult = string.match(matchPattern); + if (!matchResult) { + return null; + } + var matchedString = matchResult[0]; + var parsePatterns = width && args.parsePatterns[width] || args.parsePatterns[args.defaultParseWidth]; + var key = Array.isArray(parsePatterns) ? findIndex(parsePatterns, function (pattern) { + return pattern.test(matchedString); + }) : findKey(parsePatterns, function (pattern) { + return pattern.test(matchedString); + }); + var value; + value = args.valueCallback ? args.valueCallback(key) : key; + value = options.valueCallback ? options.valueCallback(value) : value; + var rest = string.slice(matchedString.length); + return { + value: value, + rest: rest + }; + }; + } + function findKey(object, predicate) { + for (var key in object) { + if (object.hasOwnProperty(key) && predicate(object[key])) { + return key; + } + } + return undefined; + } + function findIndex(array, predicate) { + for (var key = 0; key < array.length; key++) { + if (predicate(array[key])) { + return key; + } + } + return undefined; + } + + function buildMatchPatternFn(args) { + return function (string) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var matchResult = string.match(args.matchPattern); + if (!matchResult) return null; + var matchedString = matchResult[0]; + var parseResult = string.match(args.parsePattern); + if (!parseResult) return null; + var value = args.valueCallback ? args.valueCallback(parseResult[0]) : parseResult[0]; + value = options.valueCallback ? options.valueCallback(value) : value; + var rest = string.slice(matchedString.length); + return { + value: value, + rest: rest + }; + }; + } + + var matchOrdinalNumberPattern = /^(\d+)(th|st|nd|rd)?/i; + var parseOrdinalNumberPattern = /\d+/i; + var matchEraPatterns = { + narrow: /^(b|a)/i, + abbreviated: /^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i, + wide: /^(before christ|before common era|anno domini|common era)/i + }; + var parseEraPatterns = { + any: [/^b/i, /^(a|c)/i] + }; + var matchQuarterPatterns = { + narrow: /^[1234]/i, + abbreviated: /^q[1234]/i, + wide: /^[1234](th|st|nd|rd)? quarter/i + }; + var parseQuarterPatterns = { + any: [/1/i, /2/i, /3/i, /4/i] + }; + var matchMonthPatterns = { + narrow: /^[jfmasond]/i, + abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i, + wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i + }; + var parseMonthPatterns = { + narrow: [/^j/i, /^f/i, /^m/i, /^a/i, /^m/i, /^j/i, /^j/i, /^a/i, /^s/i, /^o/i, /^n/i, /^d/i], + any: [/^ja/i, /^f/i, /^mar/i, /^ap/i, /^may/i, /^jun/i, /^jul/i, /^au/i, /^s/i, /^o/i, /^n/i, /^d/i] + }; + var matchDayPatterns = { + narrow: /^[smtwf]/i, + "short": /^(su|mo|tu|we|th|fr|sa)/i, + abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i, + wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i + }; + var parseDayPatterns = { + narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i], + any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i] + }; + var matchDayPeriodPatterns = { + narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i, + any: /^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i + }; + var parseDayPeriodPatterns = { + any: { + am: /^a/i, + pm: /^p/i, + midnight: /^mi/i, + noon: /^no/i, + morning: /morning/i, + afternoon: /afternoon/i, + evening: /evening/i, + night: /night/i + } + }; + var match = { + ordinalNumber: buildMatchPatternFn({ + matchPattern: matchOrdinalNumberPattern, + parsePattern: parseOrdinalNumberPattern, + valueCallback: function valueCallback(value) { + return parseInt(value, 10); + } + }), + era: buildMatchFn({ + matchPatterns: matchEraPatterns, + defaultMatchWidth: 'wide', + parsePatterns: parseEraPatterns, + defaultParseWidth: 'any' + }), + quarter: buildMatchFn({ + matchPatterns: matchQuarterPatterns, + defaultMatchWidth: 'wide', + parsePatterns: parseQuarterPatterns, + defaultParseWidth: 'any', + valueCallback: function valueCallback(index) { + return index + 1; + } + }), + month: buildMatchFn({ + matchPatterns: matchMonthPatterns, + defaultMatchWidth: 'wide', + parsePatterns: parseMonthPatterns, + defaultParseWidth: 'any' + }), + day: buildMatchFn({ + matchPatterns: matchDayPatterns, + defaultMatchWidth: 'wide', + parsePatterns: parseDayPatterns, + defaultParseWidth: 'any' + }), + dayPeriod: buildMatchFn({ + matchPatterns: matchDayPeriodPatterns, + defaultMatchWidth: 'any', + parsePatterns: parseDayPeriodPatterns, + defaultParseWidth: 'any' + }) + }; + var match$1 = match; + + /** + * @type {Locale} + * @category Locales + * @summary English locale (United States). + * @language English + * @iso-639-2 eng + * @author Sasha Koss [@kossnocorp]{@link https://github.com/kossnocorp} + * @author Lesha Koss [@leshakoss]{@link https://github.com/leshakoss} + */ + var locale = { + code: 'en-US', + formatDistance: formatDistance$1, + formatLong: formatLong$1, + formatRelative: formatRelative$1, + localize: localize$1, + match: match$1, + options: { + weekStartsOn: 0 + /* Sunday */, + + firstWeekContainsDate: 1 + } + }; + var defaultLocale = locale; + // - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token // (one of the certain letters followed by `o`) // - (\w)\1* matches any sequences of the same letter // - '' matches two quote characters in a row // - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('), @@ -20620,11 +20273,11 @@ * * @description * Return the formatted date string in the given format. The result may vary by locale. * * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries. - * > See: https://git.io/fxCyr + * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md * * The characters wrapped between two single quotes characters (') are escaped. * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote. * (see the last example) * @@ -20699,32 +20352,32 @@ * | | DDD | 001, 002, ..., 365, 366 | | * | | DDDD | ... | 3 | * | Day of week (formatting) | E..EEE | Mon, Tue, Wed, ..., Sun | | * | | EEEE | Monday, Tuesday, ..., Sunday | 2 | * | | EEEEE | M, T, W, T, F, S, S | | - * | | EEEEEE | Mo, Tu, We, Th, Fr, Su, Sa | | + * | | EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | | * | ISO day of week (formatting) | i | 1, 2, 3, ..., 7 | 7 | * | | io | 1st, 2nd, ..., 7th | 7 | * | | ii | 01, 02, ..., 07 | 7 | * | | iii | Mon, Tue, Wed, ..., Sun | 7 | * | | iiii | Monday, Tuesday, ..., Sunday | 2,7 | * | | iiiii | M, T, W, T, F, S, S | 7 | - * | | iiiiii | Mo, Tu, We, Th, Fr, Su, Sa | 7 | + * | | iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | 7 | * | Local day of week (formatting) | e | 2, 3, 4, ..., 1 | | * | | eo | 2nd, 3rd, ..., 1st | 7 | * | | ee | 02, 03, ..., 01 | | * | | eee | Mon, Tue, Wed, ..., Sun | | * | | eeee | Monday, Tuesday, ..., Sunday | 2 | * | | eeeee | M, T, W, T, F, S, S | | - * | | eeeeee | Mo, Tu, We, Th, Fr, Su, Sa | | + * | | eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | | * | Local day of week (stand-alone) | c | 2, 3, 4, ..., 1 | | * | | co | 2nd, 3rd, ..., 1st | 7 | * | | cc | 02, 03, ..., 01 | | * | | ccc | Mon, Tue, Wed, ..., Sun | | * | | cccc | Monday, Tuesday, ..., Sunday | 2 | * | | ccccc | M, T, W, T, F, S, S | | - * | | cccccc | Mo, Tu, We, Th, Fr, Su, Sa | | + * | | cccccc | Mo, Tu, We, Th, Fr, Sa, Su | | * | AM, PM | a..aa | AM, PM | | * | | aaa | am, pm | | * | | aaaa | a.m., p.m. | 2 | * | | aaaaa | a, p | | * | AM, PM, noon, midnight | b..bb | AM, PM, noon, midnight | | @@ -20752,11 +20405,11 @@ * | Second | s | 0, 1, ..., 59 | | * | | so | 0th, 1st, ..., 59th | 7 | * | | ss | 00, 01, ..., 59 | | * | Fraction of second | S | 0, 1, ..., 9 | | * | | SS | 00, 01, ..., 99 | | - * | | SSS | 000, 0001, ..., 999 | | + * | | SSS | 000, 001, ..., 999 | | * | | SSSS | ... | 3 | * | Timezone (ISO-8601 w/ Z) | X | -08, +0530, Z | | * | | XX | -0800, +0530, Z | | * | | XXX | -08:00, +05:30, Z | | * | | XXXX | -0800, +0530, Z, +123456 | 2 | @@ -20856,256 +20509,539 @@ * - `o`: ordinal number modifier * - `P`: long localized date * - `p`: long localized time * * 8. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years. - * You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://git.io/fxCyr + * You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md * - * 9. `D` and `DD` tokens represent days of the year but they are ofthen confused with days of the month. - * You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://git.io/fxCyr + * 9. `D` and `DD` tokens represent days of the year but they are often confused with days of the month. + * You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * - * - The second argument is now required for the sake of explicitness. - * - * ```javascript - * // Before v2.0.0 - * format(new Date(2016, 0, 1)) - * - * // v2.0.0 onward - * format(new Date(2016, 0, 1), "yyyy-MM-dd'T'HH:mm:ss.SSSxxx") - * ``` - * - * - New format string API for `format` function - * which is based on [Unicode Technical Standard #35](https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table). - * See [this post](https://blog.date-fns.org/post/unicode-tokens-in-date-fns-v2-sreatyki91jg) for more details. - * - * - Characters are now escaped using single quote symbols (`'`) instead of square brackets. - * * @param {Date|Number} date - the original date * @param {String} format - the string of tokens * @param {Object} [options] - an object with options. * @param {Locale} [options.locale=defaultLocale] - the locale object. See [Locale]{@link https://date-fns.org/docs/Locale} * @param {0|1|2|3|4|5|6} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) * @param {Number} [options.firstWeekContainsDate=1] - the day of January, which is * @param {Boolean} [options.useAdditionalWeekYearTokens=false] - if true, allows usage of the week-numbering year tokens `YY` and `YYYY`; - * see: https://git.io/fxCyr + * see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md * @param {Boolean} [options.useAdditionalDayOfYearTokens=false] - if true, allows usage of the day of year tokens `D` and `DD`; - * see: https://git.io/fxCyr + * see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md * @returns {String} the formatted date string * @throws {TypeError} 2 arguments required * @throws {RangeError} `date` must not be Invalid Date * @throws {RangeError} `options.locale` must contain `localize` property * @throws {RangeError} `options.locale` must contain `formatLong` property * @throws {RangeError} `options.weekStartsOn` must be between 0 and 6 * @throws {RangeError} `options.firstWeekContainsDate` must be between 1 and 7 - * @throws {RangeError} use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://git.io/fxCyr - * @throws {RangeError} use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://git.io/fxCyr - * @throws {RangeError} use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://git.io/fxCyr - * @throws {RangeError} use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://git.io/fxCyr + * @throws {RangeError} use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md + * @throws {RangeError} use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md + * @throws {RangeError} use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md + * @throws {RangeError} use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md * @throws {RangeError} format string contains an unescaped latin alphabet character * * @example * // Represent 11 February 2014 in middle-endian format: - * var result = format(new Date(2014, 1, 11), 'MM/dd/yyyy') + * const result = format(new Date(2014, 1, 11), 'MM/dd/yyyy') * //=> '02/11/2014' * * @example * // Represent 2 July 2014 in Esperanto: * import { eoLocale } from 'date-fns/locale/eo' - * var result = format(new Date(2014, 6, 2), "do 'de' MMMM yyyy", { + * const result = format(new Date(2014, 6, 2), "do 'de' MMMM yyyy", { * locale: eoLocale * }) * //=> '2-a de julio 2014' * * @example * // Escape string by single quote characters: - * var result = format(new Date(2014, 6, 2, 15), "h 'o''clock'") + * const result = format(new Date(2014, 6, 2, 15), "h 'o''clock'") * //=> "3 o'clock" */ - function format(dirtyDate, dirtyFormatStr, dirtyOptions) { + function format(dirtyDate, dirtyFormatStr, options) { + var _ref, _options$locale, _ref2, _ref3, _ref4, _options$firstWeekCon, _options$locale2, _options$locale2$opti, _defaultOptions$local, _defaultOptions$local2, _ref5, _ref6, _ref7, _options$weekStartsOn, _options$locale3, _options$locale3$opti, _defaultOptions$local3, _defaultOptions$local4; requiredArgs(2, arguments); var formatStr = String(dirtyFormatStr); - var options = dirtyOptions || {}; - var locale$1 = options.locale || locale; - var localeFirstWeekContainsDate = locale$1.options && locale$1.options.firstWeekContainsDate; - var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate); - var firstWeekContainsDate = options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate); // Test if weekStartsOn is between 1 and 7 _and_ is not NaN + var defaultOptions = getDefaultOptions(); + var locale = (_ref = (_options$locale = options === null || options === void 0 ? void 0 : options.locale) !== null && _options$locale !== void 0 ? _options$locale : defaultOptions.locale) !== null && _ref !== void 0 ? _ref : defaultLocale; + var firstWeekContainsDate = toInteger((_ref2 = (_ref3 = (_ref4 = (_options$firstWeekCon = options === null || options === void 0 ? void 0 : options.firstWeekContainsDate) !== null && _options$firstWeekCon !== void 0 ? _options$firstWeekCon : options === null || options === void 0 ? void 0 : (_options$locale2 = options.locale) === null || _options$locale2 === void 0 ? void 0 : (_options$locale2$opti = _options$locale2.options) === null || _options$locale2$opti === void 0 ? void 0 : _options$locale2$opti.firstWeekContainsDate) !== null && _ref4 !== void 0 ? _ref4 : defaultOptions.firstWeekContainsDate) !== null && _ref3 !== void 0 ? _ref3 : (_defaultOptions$local = defaultOptions.locale) === null || _defaultOptions$local === void 0 ? void 0 : (_defaultOptions$local2 = _defaultOptions$local.options) === null || _defaultOptions$local2 === void 0 ? void 0 : _defaultOptions$local2.firstWeekContainsDate) !== null && _ref2 !== void 0 ? _ref2 : 1); // Test if weekStartsOn is between 1 and 7 _and_ is not NaN if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) { throw new RangeError('firstWeekContainsDate must be between 1 and 7 inclusively'); } + var weekStartsOn = toInteger((_ref5 = (_ref6 = (_ref7 = (_options$weekStartsOn = options === null || options === void 0 ? void 0 : options.weekStartsOn) !== null && _options$weekStartsOn !== void 0 ? _options$weekStartsOn : options === null || options === void 0 ? void 0 : (_options$locale3 = options.locale) === null || _options$locale3 === void 0 ? void 0 : (_options$locale3$opti = _options$locale3.options) === null || _options$locale3$opti === void 0 ? void 0 : _options$locale3$opti.weekStartsOn) !== null && _ref7 !== void 0 ? _ref7 : defaultOptions.weekStartsOn) !== null && _ref6 !== void 0 ? _ref6 : (_defaultOptions$local3 = defaultOptions.locale) === null || _defaultOptions$local3 === void 0 ? void 0 : (_defaultOptions$local4 = _defaultOptions$local3.options) === null || _defaultOptions$local4 === void 0 ? void 0 : _defaultOptions$local4.weekStartsOn) !== null && _ref5 !== void 0 ? _ref5 : 0); // Test if weekStartsOn is between 0 and 6 _and_ is not NaN - var localeWeekStartsOn = locale$1.options && locale$1.options.weekStartsOn; - var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn); - var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn); // Test if weekStartsOn is between 0 and 6 _and_ is not NaN - if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) { throw new RangeError('weekStartsOn must be between 0 and 6 inclusively'); } - - if (!locale$1.localize) { + if (!locale.localize) { throw new RangeError('locale must contain localize property'); } - - if (!locale$1.formatLong) { + if (!locale.formatLong) { throw new RangeError('locale must contain formatLong property'); } - var originalDate = toDate(dirtyDate); - if (!isValid(originalDate)) { throw new RangeError('Invalid time value'); } // Convert the date in system timezone to the same date in UTC+00:00 timezone. // This ensures that when UTC functions will be implemented, locales will be compatible with them. // See an issue about UTC functions: https://github.com/date-fns/date-fns/issues/376 - var timezoneOffset = getTimezoneOffsetInMilliseconds(originalDate); var utcDate = subMilliseconds(originalDate, timezoneOffset); var formatterOptions = { firstWeekContainsDate: firstWeekContainsDate, weekStartsOn: weekStartsOn, - locale: locale$1, + locale: locale, _originalDate: originalDate }; var result = formatStr.match(longFormattingTokensRegExp$1).map(function (substring) { var firstCharacter = substring[0]; - if (firstCharacter === 'p' || firstCharacter === 'P') { - var longFormatter = longFormatters[firstCharacter]; - return longFormatter(substring, locale$1.formatLong, formatterOptions); + var longFormatter = longFormatters$1[firstCharacter]; + return longFormatter(substring, locale.formatLong); } - return substring; }).join('').match(formattingTokensRegExp$1).map(function (substring) { // Replace two single quote characters with one single quote character if (substring === "''") { return "'"; } - var firstCharacter = substring[0]; - if (firstCharacter === "'") { return cleanEscapedString$1(substring); } - - var formatter = formatters[firstCharacter]; - + var formatter = formatters$1[firstCharacter]; if (formatter) { - if (!options.useAdditionalWeekYearTokens && isProtectedWeekYearToken(substring)) { - throwProtectedError(substring, dirtyFormatStr, dirtyDate); + if (!(options !== null && options !== void 0 && options.useAdditionalWeekYearTokens) && isProtectedWeekYearToken(substring)) { + throwProtectedError(substring, dirtyFormatStr, String(dirtyDate)); } - - if (!options.useAdditionalDayOfYearTokens && isProtectedDayOfYearToken(substring)) { - throwProtectedError(substring, dirtyFormatStr, dirtyDate); + if (!(options !== null && options !== void 0 && options.useAdditionalDayOfYearTokens) && isProtectedDayOfYearToken(substring)) { + throwProtectedError(substring, dirtyFormatStr, String(dirtyDate)); } - - return formatter(utcDate, substring, locale$1.localize, formatterOptions); + return formatter(utcDate, substring, locale.localize, formatterOptions); } - if (firstCharacter.match(unescapedLatinCharacterRegExp$1)) { throw new RangeError('Format string contains an unescaped latin alphabet character `' + firstCharacter + '`'); } - return substring; }).join(''); return result; } - function cleanEscapedString$1(input) { - return input.match(escapedStringRegExp$1)[1].replace(doubleQuoteRegExp$1, "'"); + var matched = input.match(escapedStringRegExp$1); + if (!matched) { + return input; + } + return matched[1].replace(doubleQuoteRegExp$1, "'"); } - function assign(target, dirtyObject) { + function assign(target, object) { if (target == null) { throw new TypeError('assign requires that input parameter not be null or undefined'); } - - dirtyObject = dirtyObject || {}; - - for (var property in dirtyObject) { - if (dirtyObject.hasOwnProperty(property)) { - target[property] = dirtyObject[property]; + for (var property in object) { + if (Object.prototype.hasOwnProperty.call(object, property)) { + target[property] = object[property]; } } - return target; } - // See issue: https://github.com/date-fns/date-fns/issues/376 + function _typeof$w(obj) { + "@babel/helpers - typeof"; - function setUTCDay(dirtyDate, dirtyDay, dirtyOptions) { - requiredArgs(2, arguments); - var options = dirtyOptions || {}; - var locale = options.locale; - var localeWeekStartsOn = locale && locale.options && locale.options.weekStartsOn; - var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn); - var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn); // Test if weekStartsOn is between 0 and 6 _and_ is not NaN - - if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) { - throw new RangeError('weekStartsOn must be between 0 and 6 inclusively'); + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$w = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$w = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; } - - var date = toDate(dirtyDate); - var day = toInteger(dirtyDay); - var currentDay = date.getUTCDay(); - var remainder = day % 7; - var dayIndex = (remainder + 7) % 7; - var diff = (dayIndex < weekStartsOn ? 7 : 0) + day - currentDay; - date.setUTCDate(date.getUTCDate() + diff); - return date; + return _typeof$w(obj); } - - // See issue: https://github.com/date-fns/date-fns/issues/376 - - function setUTCISODay(dirtyDate, dirtyDay) { - requiredArgs(2, arguments); - var day = toInteger(dirtyDay); - - if (day % 7 === 0) { - day = day - 7; + function _inherits$v(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$v(subClass, superClass); + } + function _setPrototypeOf$v(o, p) { + _setPrototypeOf$v = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$v(o, p); + } + function _createSuper$v(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$v(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$v(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$v(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$v(this, result); + }; + } + function _possibleConstructorReturn$v(self, call) { + if (call && (_typeof$w(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$v(self); + } + function _assertThisInitialized$v(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$v() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$v(o) { + _getPrototypeOf$v = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$v(o); + } + function _classCallCheck$w(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$w(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$w(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$w(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$w(Constructor, staticProps); + return Constructor; + } + function _defineProperty$v(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + var TIMEZONE_UNIT_PRIORITY = 10; + var Setter = /*#__PURE__*/function () { + function Setter() { + _classCallCheck$w(this, Setter); + _defineProperty$v(this, "subPriority", 0); + } + _createClass$w(Setter, [{ + key: "validate", + value: function validate(_utcDate, _options) { + return true; + } + }]); + return Setter; + }(); + var ValueSetter = /*#__PURE__*/function (_Setter) { + _inherits$v(ValueSetter, _Setter); + var _super = _createSuper$v(ValueSetter); + function ValueSetter(value, validateValue, setValue, priority, subPriority) { + var _this; + _classCallCheck$w(this, ValueSetter); + _this = _super.call(this); + _this.value = value; + _this.validateValue = validateValue; + _this.setValue = setValue; + _this.priority = priority; + if (subPriority) { + _this.subPriority = subPriority; + } + return _this; + } + _createClass$w(ValueSetter, [{ + key: "validate", + value: function validate(utcDate, options) { + return this.validateValue(utcDate, this.value, options); + } + }, { + key: "set", + value: function set(utcDate, flags, options) { + return this.setValue(utcDate, flags, this.value, options); + } + }]); + return ValueSetter; + }(Setter); + var DateToSystemTimezoneSetter = /*#__PURE__*/function (_Setter2) { + _inherits$v(DateToSystemTimezoneSetter, _Setter2); + var _super2 = _createSuper$v(DateToSystemTimezoneSetter); + function DateToSystemTimezoneSetter() { + var _this2; + _classCallCheck$w(this, DateToSystemTimezoneSetter); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this2 = _super2.call.apply(_super2, [this].concat(args)); + _defineProperty$v(_assertThisInitialized$v(_this2), "priority", TIMEZONE_UNIT_PRIORITY); + _defineProperty$v(_assertThisInitialized$v(_this2), "subPriority", -1); + return _this2; + } + _createClass$w(DateToSystemTimezoneSetter, [{ + key: "set", + value: function set(date, flags) { + if (flags.timestampIsSet) { + return date; + } + var convertedDate = new Date(0); + convertedDate.setFullYear(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()); + convertedDate.setHours(date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.getUTCMilliseconds()); + return convertedDate; + } + }]); + return DateToSystemTimezoneSetter; + }(Setter); - var weekStartsOn = 1; - var date = toDate(dirtyDate); - var currentDay = date.getUTCDay(); - var remainder = day % 7; - var dayIndex = (remainder + 7) % 7; - var diff = (dayIndex < weekStartsOn ? 7 : 0) + day - currentDay; - date.setUTCDate(date.getUTCDate() + diff); - return date; + function _classCallCheck$v(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } } + function _defineProperties$v(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$v(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$v(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$v(Constructor, staticProps); + return Constructor; + } + var Parser = /*#__PURE__*/function () { + function Parser() { + _classCallCheck$v(this, Parser); + } + _createClass$v(Parser, [{ + key: "run", + value: function run(dateString, token, match, options) { + var result = this.parse(dateString, token, match, options); + if (!result) { + return null; + } + return { + setter: new ValueSetter(result.value, this.validate, this.set, this.priority, this.subPriority), + rest: result.rest + }; + } + }, { + key: "validate", + value: function validate(_utcDate, _value, _options) { + return true; + } + }]); + return Parser; + }(); - // See issue: https://github.com/date-fns/date-fns/issues/376 + function _typeof$v(obj) { + "@babel/helpers - typeof"; - function setUTCISOWeek(dirtyDate, dirtyISOWeek) { - requiredArgs(2, arguments); - var date = toDate(dirtyDate); - var isoWeek = toInteger(dirtyISOWeek); - var diff = getUTCISOWeek(date) - isoWeek; - date.setUTCDate(date.getUTCDate() - diff * 7); - return date; + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$v = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$v = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$v(obj); } + function _classCallCheck$u(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$u(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$u(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$u(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$u(Constructor, staticProps); + return Constructor; + } + function _inherits$u(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$u(subClass, superClass); + } + function _setPrototypeOf$u(o, p) { + _setPrototypeOf$u = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$u(o, p); + } + function _createSuper$u(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$u(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$u(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$u(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$u(this, result); + }; + } + function _possibleConstructorReturn$u(self, call) { + if (call && (_typeof$v(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$u(self); + } + function _assertThisInitialized$u(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$u() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$u(o) { + _getPrototypeOf$u = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$u(o); + } + function _defineProperty$u(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + var EraParser = /*#__PURE__*/function (_Parser) { + _inherits$u(EraParser, _Parser); + var _super = _createSuper$u(EraParser); + function EraParser() { + var _this; + _classCallCheck$u(this, EraParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$u(_assertThisInitialized$u(_this), "priority", 140); + _defineProperty$u(_assertThisInitialized$u(_this), "incompatibleTokens", ['R', 'u', 't', 'T']); + return _this; + } + _createClass$u(EraParser, [{ + key: "parse", + value: function parse(dateString, token, match) { + switch (token) { + // AD, BC + case 'G': + case 'GG': + case 'GGG': + return match.era(dateString, { + width: 'abbreviated' + }) || match.era(dateString, { + width: 'narrow' + }); + // A, B - // See issue: https://github.com/date-fns/date-fns/issues/376 + case 'GGGGG': + return match.era(dateString, { + width: 'narrow' + }); + // Anno Domini, Before Christ - function setUTCWeek(dirtyDate, dirtyWeek, options) { - requiredArgs(2, arguments); - var date = toDate(dirtyDate); - var week = toInteger(dirtyWeek); - var diff = getUTCWeek(date, options) - week; - date.setUTCDate(date.getUTCDate() - diff * 7); - return date; - } + case 'GGGG': + default: + return match.era(dateString, { + width: 'wide' + }) || match.era(dateString, { + width: 'abbreviated' + }) || match.era(dateString, { + width: 'narrow' + }); + } + } + }, { + key: "set", + value: function set(date, flags, value) { + flags.era = value; + date.setUTCFullYear(value, 0, 1); + date.setUTCHours(0, 0, 0, 0); + return date; + } + }]); + return EraParser; + }(Parser); - var MILLISECONDS_IN_HOUR$1 = 3600000; - var MILLISECONDS_IN_MINUTE$1 = 60000; - var MILLISECONDS_IN_SECOND = 1000; var numericPatterns = { month: /^(1[0-2]|0?\d)/, // 0 to 12 date: /^(3[0-1]|[0-2]?\d)/, // 0 to 31 @@ -21139,1467 +21075,5326 @@ twoDigitsSigned: /^-?\d{1,2}/, // 0 to 99, -0 to -99 threeDigitsSigned: /^-?\d{1,3}/, // 0 to 999, -0 to -999 fourDigitsSigned: /^-?\d{1,4}/ // 0 to 9999, -0 to -9999 - }; + var timezonePatterns = { basicOptionalMinutes: /^([+-])(\d{2})(\d{2})?|Z/, basic: /^([+-])(\d{2})(\d{2})|Z/, basicOptionalSeconds: /^([+-])(\d{2})(\d{2})((\d{2}))?|Z/, extended: /^([+-])(\d{2}):(\d{2})|Z/, extendedOptionalSeconds: /^([+-])(\d{2}):(\d{2})(:(\d{2}))?|Z/ }; - function parseNumericPattern(pattern, string, valueCallback) { - var matchResult = string.match(pattern); - + function mapValue(parseFnResult, mapFn) { + if (!parseFnResult) { + return parseFnResult; + } + return { + value: mapFn(parseFnResult.value), + rest: parseFnResult.rest + }; + } + function parseNumericPattern(pattern, dateString) { + var matchResult = dateString.match(pattern); if (!matchResult) { return null; } - - var value = parseInt(matchResult[0], 10); return { - value: valueCallback ? valueCallback(value) : value, - rest: string.slice(matchResult[0].length) + value: parseInt(matchResult[0], 10), + rest: dateString.slice(matchResult[0].length) }; } - - function parseTimezonePattern(pattern, string) { - var matchResult = string.match(pattern); - + function parseTimezonePattern(pattern, dateString) { + var matchResult = dateString.match(pattern); if (!matchResult) { return null; } // Input is 'Z' - if (matchResult[0] === 'Z') { return { value: 0, - rest: string.slice(1) + rest: dateString.slice(1) }; } - var sign = matchResult[1] === '+' ? 1 : -1; var hours = matchResult[2] ? parseInt(matchResult[2], 10) : 0; var minutes = matchResult[3] ? parseInt(matchResult[3], 10) : 0; var seconds = matchResult[5] ? parseInt(matchResult[5], 10) : 0; return { - value: sign * (hours * MILLISECONDS_IN_HOUR$1 + minutes * MILLISECONDS_IN_MINUTE$1 + seconds * MILLISECONDS_IN_SECOND), - rest: string.slice(matchResult[0].length) + value: sign * (hours * millisecondsInHour + minutes * millisecondsInMinute + seconds * millisecondsInSecond), + rest: dateString.slice(matchResult[0].length) }; } - - function parseAnyDigitsSigned(string, valueCallback) { - return parseNumericPattern(numericPatterns.anyDigitsSigned, string, valueCallback); + function parseAnyDigitsSigned(dateString) { + return parseNumericPattern(numericPatterns.anyDigitsSigned, dateString); } - - function parseNDigits(n, string, valueCallback) { + function parseNDigits(n, dateString) { switch (n) { case 1: - return parseNumericPattern(numericPatterns.singleDigit, string, valueCallback); - + return parseNumericPattern(numericPatterns.singleDigit, dateString); case 2: - return parseNumericPattern(numericPatterns.twoDigits, string, valueCallback); - + return parseNumericPattern(numericPatterns.twoDigits, dateString); case 3: - return parseNumericPattern(numericPatterns.threeDigits, string, valueCallback); - + return parseNumericPattern(numericPatterns.threeDigits, dateString); case 4: - return parseNumericPattern(numericPatterns.fourDigits, string, valueCallback); - + return parseNumericPattern(numericPatterns.fourDigits, dateString); default: - return parseNumericPattern(new RegExp('^\\d{1,' + n + '}'), string, valueCallback); + return parseNumericPattern(new RegExp('^\\d{1,' + n + '}'), dateString); } } - - function parseNDigitsSigned(n, string, valueCallback) { + function parseNDigitsSigned(n, dateString) { switch (n) { case 1: - return parseNumericPattern(numericPatterns.singleDigitSigned, string, valueCallback); - + return parseNumericPattern(numericPatterns.singleDigitSigned, dateString); case 2: - return parseNumericPattern(numericPatterns.twoDigitsSigned, string, valueCallback); - + return parseNumericPattern(numericPatterns.twoDigitsSigned, dateString); case 3: - return parseNumericPattern(numericPatterns.threeDigitsSigned, string, valueCallback); - + return parseNumericPattern(numericPatterns.threeDigitsSigned, dateString); case 4: - return parseNumericPattern(numericPatterns.fourDigitsSigned, string, valueCallback); - + return parseNumericPattern(numericPatterns.fourDigitsSigned, dateString); default: - return parseNumericPattern(new RegExp('^-?\\d{1,' + n + '}'), string, valueCallback); + return parseNumericPattern(new RegExp('^-?\\d{1,' + n + '}'), dateString); } } - - function dayPeriodEnumToHours(enumValue) { - switch (enumValue) { + function dayPeriodEnumToHours(dayPeriod) { + switch (dayPeriod) { case 'morning': return 4; - case 'evening': return 17; - case 'pm': case 'noon': case 'afternoon': return 12; - case 'am': case 'midnight': case 'night': default: return 0; } } - function normalizeTwoDigitYear(twoDigitYear, currentYear) { var isCommonEra = currentYear > 0; // Absolute number of the current year: // 1 -> 1 AC // 0 -> 1 BC // -1 -> 2 BC var absCurrentYear = isCommonEra ? currentYear : 1 - currentYear; var result; - if (absCurrentYear <= 50) { result = twoDigitYear || 100; } else { var rangeEnd = absCurrentYear + 50; var rangeEndCentury = Math.floor(rangeEnd / 100) * 100; var isPreviousCentury = twoDigitYear >= rangeEnd % 100; result = twoDigitYear + rangeEndCentury - (isPreviousCentury ? 100 : 0); } - return isCommonEra ? result : 1 - result; } - - var DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; - var DAYS_IN_MONTH_LEAP_YEAR = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; // User for validation - function isLeapYearIndex$1(year) { return year % 400 === 0 || year % 4 === 0 && year % 100 !== 0; } - /* - * | | Unit | | Unit | - * |-----|--------------------------------|-----|--------------------------------| - * | a | AM, PM | A* | Milliseconds in day | - * | b | AM, PM, noon, midnight | B | Flexible day period | - * | c | Stand-alone local day of week | C* | Localized hour w/ day period | - * | d | Day of month | D | Day of year | - * | e | Local day of week | E | Day of week | - * | f | | F* | Day of week in month | - * | g* | Modified Julian day | G | Era | - * | h | Hour [1-12] | H | Hour [0-23] | - * | i! | ISO day of week | I! | ISO week of year | - * | j* | Localized hour w/ day period | J* | Localized hour w/o day period | - * | k | Hour [1-24] | K | Hour [0-11] | - * | l* | (deprecated) | L | Stand-alone month | - * | m | Minute | M | Month | - * | n | | N | | - * | o! | Ordinal number modifier | O* | Timezone (GMT) | - * | p | | P | | - * | q | Stand-alone quarter | Q | Quarter | - * | r* | Related Gregorian year | R! | ISO week-numbering year | - * | s | Second | S | Fraction of second | - * | t! | Seconds timestamp | T! | Milliseconds timestamp | - * | u | Extended year | U* | Cyclic year | - * | v* | Timezone (generic non-locat.) | V* | Timezone (location) | - * | w | Local week of year | W* | Week of month | - * | x | Timezone (ISO-8601 w/o Z) | X | Timezone (ISO-8601) | - * | y | Year (abs) | Y | Local week-numbering year | - * | z* | Timezone (specific non-locat.) | Z* | Timezone (aliases) | - * - * Letters marked by * are not implemented but reserved by Unicode standard. - * - * Letters marked by ! are non-standard, but implemented by date-fns: - * - `o` modifies the previous token to turn it into an ordinal (see `parse` docs) - * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days, - * i.e. 7 for Sunday, 1 for Monday, etc. - * - `I` is ISO week of year, as opposed to `w` which is local week of year. - * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year. - * `R` is supposed to be used in conjunction with `I` and `i` - * for universal ISO week-numbering date, whereas - * `Y` is supposed to be used in conjunction with `w` and `e` - * for week-numbering date specific to the locale. - */ + function _typeof$u(obj) { + "@babel/helpers - typeof"; - var parsers = { - // Era - G: { - priority: 140, - parse: function parse(string, token, match, _options) { - switch (token) { - // AD, BC - case 'G': - case 'GG': - case 'GGG': - return match.era(string, { - width: 'abbreviated' - }) || match.era(string, { - width: 'narrow' - }); - // A, B - - case 'GGGGG': - return match.era(string, { - width: 'narrow' - }); - // Anno Domini, Before Christ - - case 'GGGG': - default: - return match.era(string, { - width: 'wide' - }) || match.era(string, { - width: 'abbreviated' - }) || match.era(string, { - width: 'narrow' - }); - } - }, - set: function set(date, flags, value, _options) { - flags.era = value; - date.setUTCFullYear(value, 0, 1); - date.setUTCHours(0, 0, 0, 0); - return date; - }, - incompatibleTokens: ['R', 'u', 't', 'T'] - }, - // Year - y: { - // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns - // | Year | y | yy | yyy | yyyy | yyyyy | - // |----------|-------|----|-------|-------|-------| - // | AD 1 | 1 | 01 | 001 | 0001 | 00001 | - // | AD 12 | 12 | 12 | 012 | 0012 | 00012 | - // | AD 123 | 123 | 23 | 123 | 0123 | 00123 | - // | AD 1234 | 1234 | 34 | 1234 | 1234 | 01234 | - // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 | - priority: 130, - parse: function parse(string, token, match, _options) { + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$u = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$u = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$u(obj); + } + function _classCallCheck$t(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$t(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$t(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$t(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$t(Constructor, staticProps); + return Constructor; + } + function _inherits$t(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$t(subClass, superClass); + } + function _setPrototypeOf$t(o, p) { + _setPrototypeOf$t = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$t(o, p); + } + function _createSuper$t(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$t(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$t(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$t(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$t(this, result); + }; + } + function _possibleConstructorReturn$t(self, call) { + if (call && (_typeof$u(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$t(self); + } + function _assertThisInitialized$t(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$t() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$t(o) { + _getPrototypeOf$t = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$t(o); + } + function _defineProperty$t(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns + // | Year | y | yy | yyy | yyyy | yyyyy | + // |----------|-------|----|-------|-------|-------| + // | AD 1 | 1 | 01 | 001 | 0001 | 00001 | + // | AD 12 | 12 | 12 | 012 | 0012 | 00012 | + // | AD 123 | 123 | 23 | 123 | 0123 | 00123 | + // | AD 1234 | 1234 | 34 | 1234 | 1234 | 01234 | + // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 | + var YearParser = /*#__PURE__*/function (_Parser) { + _inherits$t(YearParser, _Parser); + var _super = _createSuper$t(YearParser); + function YearParser() { + var _this; + _classCallCheck$t(this, YearParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$t(_assertThisInitialized$t(_this), "priority", 130); + _defineProperty$t(_assertThisInitialized$t(_this), "incompatibleTokens", ['Y', 'R', 'u', 'w', 'I', 'i', 'e', 'c', 't', 'T']); + return _this; + } + _createClass$t(YearParser, [{ + key: "parse", + value: function parse(dateString, token, match) { var valueCallback = function valueCallback(year) { return { year: year, isTwoDigitYear: token === 'yy' }; }; - switch (token) { case 'y': - return parseNDigits(4, string, valueCallback); - + return mapValue(parseNDigits(4, dateString), valueCallback); case 'yo': - return match.ordinalNumber(string, { - unit: 'year', - valueCallback: valueCallback - }); - + return mapValue(match.ordinalNumber(dateString, { + unit: 'year' + }), valueCallback); default: - return parseNDigits(token.length, string, valueCallback); + return mapValue(parseNDigits(token.length, dateString), valueCallback); } - }, - validate: function validate(_date, value, _options) { + } + }, { + key: "validate", + value: function validate(_date, value) { return value.isTwoDigitYear || value.year > 0; - }, - set: function set(date, flags, value, _options) { + } + }, { + key: "set", + value: function set(date, flags, value) { var currentYear = date.getUTCFullYear(); - if (value.isTwoDigitYear) { var normalizedTwoDigitYear = normalizeTwoDigitYear(value.year, currentYear); date.setUTCFullYear(normalizedTwoDigitYear, 0, 1); date.setUTCHours(0, 0, 0, 0); return date; } - var year = !('era' in flags) || flags.era === 1 ? value.year : 1 - value.year; date.setUTCFullYear(year, 0, 1); date.setUTCHours(0, 0, 0, 0); return date; - }, - incompatibleTokens: ['Y', 'R', 'u', 'w', 'I', 'i', 'e', 'c', 't', 'T'] - }, - // Local week-numbering year - Y: { - priority: 130, - parse: function parse(string, token, match, _options) { + } + }]); + return YearParser; + }(Parser); + + function _typeof$t(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$t = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$t = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$t(obj); + } + function _classCallCheck$s(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$s(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$s(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$s(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$s(Constructor, staticProps); + return Constructor; + } + function _inherits$s(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$s(subClass, superClass); + } + function _setPrototypeOf$s(o, p) { + _setPrototypeOf$s = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$s(o, p); + } + function _createSuper$s(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$s(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$s(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$s(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$s(this, result); + }; + } + function _possibleConstructorReturn$s(self, call) { + if (call && (_typeof$t(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$s(self); + } + function _assertThisInitialized$s(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$s() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$s(o) { + _getPrototypeOf$s = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$s(o); + } + function _defineProperty$s(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + // Local week-numbering year + var LocalWeekYearParser = /*#__PURE__*/function (_Parser) { + _inherits$s(LocalWeekYearParser, _Parser); + var _super = _createSuper$s(LocalWeekYearParser); + function LocalWeekYearParser() { + var _this; + _classCallCheck$s(this, LocalWeekYearParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$s(_assertThisInitialized$s(_this), "priority", 130); + _defineProperty$s(_assertThisInitialized$s(_this), "incompatibleTokens", ['y', 'R', 'u', 'Q', 'q', 'M', 'L', 'I', 'd', 'D', 'i', 't', 'T']); + return _this; + } + _createClass$s(LocalWeekYearParser, [{ + key: "parse", + value: function parse(dateString, token, match) { var valueCallback = function valueCallback(year) { return { year: year, isTwoDigitYear: token === 'YY' }; }; - switch (token) { case 'Y': - return parseNDigits(4, string, valueCallback); - + return mapValue(parseNDigits(4, dateString), valueCallback); case 'Yo': - return match.ordinalNumber(string, { - unit: 'year', - valueCallback: valueCallback - }); - + return mapValue(match.ordinalNumber(dateString, { + unit: 'year' + }), valueCallback); default: - return parseNDigits(token.length, string, valueCallback); + return mapValue(parseNDigits(token.length, dateString), valueCallback); } - }, - validate: function validate(_date, value, _options) { + } + }, { + key: "validate", + value: function validate(_date, value) { return value.isTwoDigitYear || value.year > 0; - }, - set: function set(date, flags, value, options) { + } + }, { + key: "set", + value: function set(date, flags, value, options) { var currentYear = getUTCWeekYear(date, options); - if (value.isTwoDigitYear) { var normalizedTwoDigitYear = normalizeTwoDigitYear(value.year, currentYear); date.setUTCFullYear(normalizedTwoDigitYear, 0, options.firstWeekContainsDate); date.setUTCHours(0, 0, 0, 0); return startOfUTCWeek(date, options); } - var year = !('era' in flags) || flags.era === 1 ? value.year : 1 - value.year; date.setUTCFullYear(year, 0, options.firstWeekContainsDate); date.setUTCHours(0, 0, 0, 0); return startOfUTCWeek(date, options); - }, - incompatibleTokens: ['y', 'R', 'u', 'Q', 'q', 'M', 'L', 'I', 'd', 'D', 'i', 't', 'T'] - }, - // ISO week-numbering year - R: { - priority: 130, - parse: function parse(string, token, _match, _options) { + } + }]); + return LocalWeekYearParser; + }(Parser); + + function _typeof$s(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$s = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$s = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$s(obj); + } + function _classCallCheck$r(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$r(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$r(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$r(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$r(Constructor, staticProps); + return Constructor; + } + function _inherits$r(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$r(subClass, superClass); + } + function _setPrototypeOf$r(o, p) { + _setPrototypeOf$r = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$r(o, p); + } + function _createSuper$r(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$r(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$r(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$r(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$r(this, result); + }; + } + function _possibleConstructorReturn$r(self, call) { + if (call && (_typeof$s(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$r(self); + } + function _assertThisInitialized$r(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$r() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$r(o) { + _getPrototypeOf$r = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$r(o); + } + function _defineProperty$r(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + + var ISOWeekYearParser = /*#__PURE__*/function (_Parser) { + _inherits$r(ISOWeekYearParser, _Parser); + var _super = _createSuper$r(ISOWeekYearParser); + function ISOWeekYearParser() { + var _this; + _classCallCheck$r(this, ISOWeekYearParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$r(_assertThisInitialized$r(_this), "priority", 130); + _defineProperty$r(_assertThisInitialized$r(_this), "incompatibleTokens", ['G', 'y', 'Y', 'u', 'Q', 'q', 'M', 'L', 'w', 'd', 'D', 'e', 'c', 't', 'T']); + return _this; + } + _createClass$r(ISOWeekYearParser, [{ + key: "parse", + value: function parse(dateString, token) { if (token === 'R') { - return parseNDigitsSigned(4, string); + return parseNDigitsSigned(4, dateString); } - - return parseNDigitsSigned(token.length, string); - }, - set: function set(_date, _flags, value, _options) { + return parseNDigitsSigned(token.length, dateString); + } + }, { + key: "set", + value: function set(_date, _flags, value) { var firstWeekOfYear = new Date(0); firstWeekOfYear.setUTCFullYear(value, 0, 4); firstWeekOfYear.setUTCHours(0, 0, 0, 0); return startOfUTCISOWeek(firstWeekOfYear); - }, - incompatibleTokens: ['G', 'y', 'Y', 'u', 'Q', 'q', 'M', 'L', 'w', 'd', 'D', 'e', 'c', 't', 'T'] - }, - // Extended year - u: { - priority: 130, - parse: function parse(string, token, _match, _options) { + } + }]); + return ISOWeekYearParser; + }(Parser); + + function _typeof$r(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$r = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$r = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$r(obj); + } + function _classCallCheck$q(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$q(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$q(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$q(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$q(Constructor, staticProps); + return Constructor; + } + function _inherits$q(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$q(subClass, superClass); + } + function _setPrototypeOf$q(o, p) { + _setPrototypeOf$q = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$q(o, p); + } + function _createSuper$q(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$q(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$q(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$q(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$q(this, result); + }; + } + function _possibleConstructorReturn$q(self, call) { + if (call && (_typeof$r(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$q(self); + } + function _assertThisInitialized$q(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$q() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$q(o) { + _getPrototypeOf$q = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$q(o); + } + function _defineProperty$q(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + var ExtendedYearParser = /*#__PURE__*/function (_Parser) { + _inherits$q(ExtendedYearParser, _Parser); + var _super = _createSuper$q(ExtendedYearParser); + function ExtendedYearParser() { + var _this; + _classCallCheck$q(this, ExtendedYearParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$q(_assertThisInitialized$q(_this), "priority", 130); + _defineProperty$q(_assertThisInitialized$q(_this), "incompatibleTokens", ['G', 'y', 'Y', 'R', 'w', 'I', 'i', 'e', 'c', 't', 'T']); + return _this; + } + _createClass$q(ExtendedYearParser, [{ + key: "parse", + value: function parse(dateString, token) { if (token === 'u') { - return parseNDigitsSigned(4, string); + return parseNDigitsSigned(4, dateString); } - - return parseNDigitsSigned(token.length, string); - }, - set: function set(date, _flags, value, _options) { + return parseNDigitsSigned(token.length, dateString); + } + }, { + key: "set", + value: function set(date, _flags, value) { date.setUTCFullYear(value, 0, 1); date.setUTCHours(0, 0, 0, 0); return date; - }, - incompatibleTokens: ['G', 'y', 'Y', 'R', 'w', 'I', 'i', 'e', 'c', 't', 'T'] - }, - // Quarter - Q: { - priority: 120, - parse: function parse(string, token, match, _options) { + } + }]); + return ExtendedYearParser; + }(Parser); + + function _typeof$q(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$q = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$q = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$q(obj); + } + function _classCallCheck$p(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$p(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$p(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$p(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$p(Constructor, staticProps); + return Constructor; + } + function _inherits$p(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$p(subClass, superClass); + } + function _setPrototypeOf$p(o, p) { + _setPrototypeOf$p = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$p(o, p); + } + function _createSuper$p(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$p(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$p(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$p(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$p(this, result); + }; + } + function _possibleConstructorReturn$p(self, call) { + if (call && (_typeof$q(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$p(self); + } + function _assertThisInitialized$p(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$p() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$p(o) { + _getPrototypeOf$p = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$p(o); + } + function _defineProperty$p(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + var QuarterParser = /*#__PURE__*/function (_Parser) { + _inherits$p(QuarterParser, _Parser); + var _super = _createSuper$p(QuarterParser); + function QuarterParser() { + var _this; + _classCallCheck$p(this, QuarterParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$p(_assertThisInitialized$p(_this), "priority", 120); + _defineProperty$p(_assertThisInitialized$p(_this), "incompatibleTokens", ['Y', 'R', 'q', 'M', 'L', 'w', 'I', 'd', 'D', 'i', 'e', 'c', 't', 'T']); + return _this; + } + _createClass$p(QuarterParser, [{ + key: "parse", + value: function parse(dateString, token, match) { switch (token) { // 1, 2, 3, 4 case 'Q': case 'QQ': // 01, 02, 03, 04 - return parseNDigits(token.length, string); + return parseNDigits(token.length, dateString); // 1st, 2nd, 3rd, 4th case 'Qo': - return match.ordinalNumber(string, { + return match.ordinalNumber(dateString, { unit: 'quarter' }); // Q1, Q2, Q3, Q4 case 'QQQ': - return match.quarter(string, { + return match.quarter(dateString, { width: 'abbreviated', context: 'formatting' - }) || match.quarter(string, { + }) || match.quarter(dateString, { width: 'narrow', context: 'formatting' }); // 1, 2, 3, 4 (narrow quarter; could be not numerical) case 'QQQQQ': - return match.quarter(string, { + return match.quarter(dateString, { width: 'narrow', context: 'formatting' }); // 1st quarter, 2nd quarter, ... case 'QQQQ': default: - return match.quarter(string, { + return match.quarter(dateString, { width: 'wide', context: 'formatting' - }) || match.quarter(string, { + }) || match.quarter(dateString, { width: 'abbreviated', context: 'formatting' - }) || match.quarter(string, { + }) || match.quarter(dateString, { width: 'narrow', context: 'formatting' }); } - }, - validate: function validate(_date, value, _options) { + } + }, { + key: "validate", + value: function validate(_date, value) { return value >= 1 && value <= 4; - }, - set: function set(date, _flags, value, _options) { + } + }, { + key: "set", + value: function set(date, _flags, value) { date.setUTCMonth((value - 1) * 3, 1); date.setUTCHours(0, 0, 0, 0); return date; - }, - incompatibleTokens: ['Y', 'R', 'q', 'M', 'L', 'w', 'I', 'd', 'D', 'i', 'e', 'c', 't', 'T'] - }, - // Stand-alone quarter - q: { - priority: 120, - parse: function parse(string, token, match, _options) { + } + }]); + return QuarterParser; + }(Parser); + + function _typeof$p(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$p = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$p = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$p(obj); + } + function _classCallCheck$o(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$o(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$o(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$o(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$o(Constructor, staticProps); + return Constructor; + } + function _inherits$o(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$o(subClass, superClass); + } + function _setPrototypeOf$o(o, p) { + _setPrototypeOf$o = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$o(o, p); + } + function _createSuper$o(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$o(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$o(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$o(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$o(this, result); + }; + } + function _possibleConstructorReturn$o(self, call) { + if (call && (_typeof$p(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$o(self); + } + function _assertThisInitialized$o(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$o() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$o(o) { + _getPrototypeOf$o = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$o(o); + } + function _defineProperty$o(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + var StandAloneQuarterParser = /*#__PURE__*/function (_Parser) { + _inherits$o(StandAloneQuarterParser, _Parser); + var _super = _createSuper$o(StandAloneQuarterParser); + function StandAloneQuarterParser() { + var _this; + _classCallCheck$o(this, StandAloneQuarterParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$o(_assertThisInitialized$o(_this), "priority", 120); + _defineProperty$o(_assertThisInitialized$o(_this), "incompatibleTokens", ['Y', 'R', 'Q', 'M', 'L', 'w', 'I', 'd', 'D', 'i', 'e', 'c', 't', 'T']); + return _this; + } + _createClass$o(StandAloneQuarterParser, [{ + key: "parse", + value: function parse(dateString, token, match) { switch (token) { // 1, 2, 3, 4 case 'q': case 'qq': // 01, 02, 03, 04 - return parseNDigits(token.length, string); + return parseNDigits(token.length, dateString); // 1st, 2nd, 3rd, 4th case 'qo': - return match.ordinalNumber(string, { + return match.ordinalNumber(dateString, { unit: 'quarter' }); // Q1, Q2, Q3, Q4 case 'qqq': - return match.quarter(string, { + return match.quarter(dateString, { width: 'abbreviated', context: 'standalone' - }) || match.quarter(string, { + }) || match.quarter(dateString, { width: 'narrow', context: 'standalone' }); // 1, 2, 3, 4 (narrow quarter; could be not numerical) case 'qqqqq': - return match.quarter(string, { + return match.quarter(dateString, { width: 'narrow', context: 'standalone' }); // 1st quarter, 2nd quarter, ... case 'qqqq': default: - return match.quarter(string, { + return match.quarter(dateString, { width: 'wide', context: 'standalone' - }) || match.quarter(string, { + }) || match.quarter(dateString, { width: 'abbreviated', context: 'standalone' - }) || match.quarter(string, { + }) || match.quarter(dateString, { width: 'narrow', context: 'standalone' }); } - }, - validate: function validate(_date, value, _options) { + } + }, { + key: "validate", + value: function validate(_date, value) { return value >= 1 && value <= 4; - }, - set: function set(date, _flags, value, _options) { + } + }, { + key: "set", + value: function set(date, _flags, value) { date.setUTCMonth((value - 1) * 3, 1); date.setUTCHours(0, 0, 0, 0); return date; - }, - incompatibleTokens: ['Y', 'R', 'Q', 'M', 'L', 'w', 'I', 'd', 'D', 'i', 'e', 'c', 't', 'T'] - }, - // Month - M: { - priority: 110, - parse: function parse(string, token, match, _options) { + } + }]); + return StandAloneQuarterParser; + }(Parser); + + function _typeof$o(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$o = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$o = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$o(obj); + } + function _classCallCheck$n(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$n(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$n(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$n(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$n(Constructor, staticProps); + return Constructor; + } + function _inherits$n(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$n(subClass, superClass); + } + function _setPrototypeOf$n(o, p) { + _setPrototypeOf$n = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$n(o, p); + } + function _createSuper$n(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$n(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$n(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$n(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$n(this, result); + }; + } + function _possibleConstructorReturn$n(self, call) { + if (call && (_typeof$o(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$n(self); + } + function _assertThisInitialized$n(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$n() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$n(o) { + _getPrototypeOf$n = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$n(o); + } + function _defineProperty$n(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + var MonthParser = /*#__PURE__*/function (_Parser) { + _inherits$n(MonthParser, _Parser); + var _super = _createSuper$n(MonthParser); + function MonthParser() { + var _this; + _classCallCheck$n(this, MonthParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$n(_assertThisInitialized$n(_this), "incompatibleTokens", ['Y', 'R', 'q', 'Q', 'L', 'w', 'I', 'D', 'i', 'e', 'c', 't', 'T']); + _defineProperty$n(_assertThisInitialized$n(_this), "priority", 110); + return _this; + } + _createClass$n(MonthParser, [{ + key: "parse", + value: function parse(dateString, token, match) { var valueCallback = function valueCallback(value) { return value - 1; }; - switch (token) { // 1, 2, ..., 12 case 'M': - return parseNumericPattern(numericPatterns.month, string, valueCallback); + return mapValue(parseNumericPattern(numericPatterns.month, dateString), valueCallback); // 01, 02, ..., 12 case 'MM': - return parseNDigits(2, string, valueCallback); + return mapValue(parseNDigits(2, dateString), valueCallback); // 1st, 2nd, ..., 12th case 'Mo': - return match.ordinalNumber(string, { - unit: 'month', - valueCallback: valueCallback - }); + return mapValue(match.ordinalNumber(dateString, { + unit: 'month' + }), valueCallback); // Jan, Feb, ..., Dec case 'MMM': - return match.month(string, { + return match.month(dateString, { width: 'abbreviated', context: 'formatting' - }) || match.month(string, { + }) || match.month(dateString, { width: 'narrow', context: 'formatting' }); // J, F, ..., D case 'MMMMM': - return match.month(string, { + return match.month(dateString, { width: 'narrow', context: 'formatting' }); // January, February, ..., December case 'MMMM': default: - return match.month(string, { + return match.month(dateString, { width: 'wide', context: 'formatting' - }) || match.month(string, { + }) || match.month(dateString, { width: 'abbreviated', context: 'formatting' - }) || match.month(string, { + }) || match.month(dateString, { width: 'narrow', context: 'formatting' }); } - }, - validate: function validate(_date, value, _options) { + } + }, { + key: "validate", + value: function validate(_date, value) { return value >= 0 && value <= 11; - }, - set: function set(date, _flags, value, _options) { + } + }, { + key: "set", + value: function set(date, _flags, value) { date.setUTCMonth(value, 1); date.setUTCHours(0, 0, 0, 0); return date; - }, - incompatibleTokens: ['Y', 'R', 'q', 'Q', 'L', 'w', 'I', 'D', 'i', 'e', 'c', 't', 'T'] - }, - // Stand-alone month - L: { - priority: 110, - parse: function parse(string, token, match, _options) { + } + }]); + return MonthParser; + }(Parser); + + function _typeof$n(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$n = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$n = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$n(obj); + } + function _classCallCheck$m(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$m(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$m(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$m(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$m(Constructor, staticProps); + return Constructor; + } + function _inherits$m(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$m(subClass, superClass); + } + function _setPrototypeOf$m(o, p) { + _setPrototypeOf$m = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$m(o, p); + } + function _createSuper$m(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$m(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$m(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$m(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$m(this, result); + }; + } + function _possibleConstructorReturn$m(self, call) { + if (call && (_typeof$n(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$m(self); + } + function _assertThisInitialized$m(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$m() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$m(o) { + _getPrototypeOf$m = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$m(o); + } + function _defineProperty$m(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + var StandAloneMonthParser = /*#__PURE__*/function (_Parser) { + _inherits$m(StandAloneMonthParser, _Parser); + var _super = _createSuper$m(StandAloneMonthParser); + function StandAloneMonthParser() { + var _this; + _classCallCheck$m(this, StandAloneMonthParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$m(_assertThisInitialized$m(_this), "priority", 110); + _defineProperty$m(_assertThisInitialized$m(_this), "incompatibleTokens", ['Y', 'R', 'q', 'Q', 'M', 'w', 'I', 'D', 'i', 'e', 'c', 't', 'T']); + return _this; + } + _createClass$m(StandAloneMonthParser, [{ + key: "parse", + value: function parse(dateString, token, match) { var valueCallback = function valueCallback(value) { return value - 1; }; - switch (token) { // 1, 2, ..., 12 case 'L': - return parseNumericPattern(numericPatterns.month, string, valueCallback); + return mapValue(parseNumericPattern(numericPatterns.month, dateString), valueCallback); // 01, 02, ..., 12 case 'LL': - return parseNDigits(2, string, valueCallback); + return mapValue(parseNDigits(2, dateString), valueCallback); // 1st, 2nd, ..., 12th case 'Lo': - return match.ordinalNumber(string, { - unit: 'month', - valueCallback: valueCallback - }); + return mapValue(match.ordinalNumber(dateString, { + unit: 'month' + }), valueCallback); // Jan, Feb, ..., Dec case 'LLL': - return match.month(string, { + return match.month(dateString, { width: 'abbreviated', context: 'standalone' - }) || match.month(string, { + }) || match.month(dateString, { width: 'narrow', context: 'standalone' }); // J, F, ..., D case 'LLLLL': - return match.month(string, { + return match.month(dateString, { width: 'narrow', context: 'standalone' }); // January, February, ..., December case 'LLLL': default: - return match.month(string, { + return match.month(dateString, { width: 'wide', context: 'standalone' - }) || match.month(string, { + }) || match.month(dateString, { width: 'abbreviated', context: 'standalone' - }) || match.month(string, { + }) || match.month(dateString, { width: 'narrow', context: 'standalone' }); } - }, - validate: function validate(_date, value, _options) { + } + }, { + key: "validate", + value: function validate(_date, value) { return value >= 0 && value <= 11; - }, - set: function set(date, _flags, value, _options) { + } + }, { + key: "set", + value: function set(date, _flags, value) { date.setUTCMonth(value, 1); date.setUTCHours(0, 0, 0, 0); return date; - }, - incompatibleTokens: ['Y', 'R', 'q', 'Q', 'M', 'w', 'I', 'D', 'i', 'e', 'c', 't', 'T'] - }, - // Local week of year - w: { - priority: 100, - parse: function parse(string, token, match, _options) { + } + }]); + return StandAloneMonthParser; + }(Parser); + + function setUTCWeek(dirtyDate, dirtyWeek, options) { + requiredArgs(2, arguments); + var date = toDate(dirtyDate); + var week = toInteger(dirtyWeek); + var diff = getUTCWeek(date, options) - week; + date.setUTCDate(date.getUTCDate() - diff * 7); + return date; + } + + function _typeof$m(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$m = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$m = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$m(obj); + } + function _classCallCheck$l(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$l(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$l(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$l(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$l(Constructor, staticProps); + return Constructor; + } + function _inherits$l(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$l(subClass, superClass); + } + function _setPrototypeOf$l(o, p) { + _setPrototypeOf$l = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$l(o, p); + } + function _createSuper$l(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$l(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$l(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$l(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$l(this, result); + }; + } + function _possibleConstructorReturn$l(self, call) { + if (call && (_typeof$m(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$l(self); + } + function _assertThisInitialized$l(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$l() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$l(o) { + _getPrototypeOf$l = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$l(o); + } + function _defineProperty$l(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + + var LocalWeekParser = /*#__PURE__*/function (_Parser) { + _inherits$l(LocalWeekParser, _Parser); + var _super = _createSuper$l(LocalWeekParser); + function LocalWeekParser() { + var _this; + _classCallCheck$l(this, LocalWeekParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$l(_assertThisInitialized$l(_this), "priority", 100); + _defineProperty$l(_assertThisInitialized$l(_this), "incompatibleTokens", ['y', 'R', 'u', 'q', 'Q', 'M', 'L', 'I', 'd', 'D', 'i', 't', 'T']); + return _this; + } + _createClass$l(LocalWeekParser, [{ + key: "parse", + value: function parse(dateString, token, match) { switch (token) { case 'w': - return parseNumericPattern(numericPatterns.week, string); - + return parseNumericPattern(numericPatterns.week, dateString); case 'wo': - return match.ordinalNumber(string, { + return match.ordinalNumber(dateString, { unit: 'week' }); - default: - return parseNDigits(token.length, string); + return parseNDigits(token.length, dateString); } - }, - validate: function validate(_date, value, _options) { + } + }, { + key: "validate", + value: function validate(_date, value) { return value >= 1 && value <= 53; - }, - set: function set(date, _flags, value, options) { + } + }, { + key: "set", + value: function set(date, _flags, value, options) { return startOfUTCWeek(setUTCWeek(date, value, options), options); - }, - incompatibleTokens: ['y', 'R', 'u', 'q', 'Q', 'M', 'L', 'I', 'd', 'D', 'i', 't', 'T'] - }, - // ISO week of year - I: { - priority: 100, - parse: function parse(string, token, match, _options) { + } + }]); + return LocalWeekParser; + }(Parser); + + function setUTCISOWeek(dirtyDate, dirtyISOWeek) { + requiredArgs(2, arguments); + var date = toDate(dirtyDate); + var isoWeek = toInteger(dirtyISOWeek); + var diff = getUTCISOWeek(date) - isoWeek; + date.setUTCDate(date.getUTCDate() - diff * 7); + return date; + } + + function _typeof$l(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$l = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$l = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$l(obj); + } + function _classCallCheck$k(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$k(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$k(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$k(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$k(Constructor, staticProps); + return Constructor; + } + function _inherits$k(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$k(subClass, superClass); + } + function _setPrototypeOf$k(o, p) { + _setPrototypeOf$k = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$k(o, p); + } + function _createSuper$k(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$k(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$k(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$k(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$k(this, result); + }; + } + function _possibleConstructorReturn$k(self, call) { + if (call && (_typeof$l(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$k(self); + } + function _assertThisInitialized$k(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$k() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$k(o) { + _getPrototypeOf$k = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$k(o); + } + function _defineProperty$k(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + + var ISOWeekParser = /*#__PURE__*/function (_Parser) { + _inherits$k(ISOWeekParser, _Parser); + var _super = _createSuper$k(ISOWeekParser); + function ISOWeekParser() { + var _this; + _classCallCheck$k(this, ISOWeekParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$k(_assertThisInitialized$k(_this), "priority", 100); + _defineProperty$k(_assertThisInitialized$k(_this), "incompatibleTokens", ['y', 'Y', 'u', 'q', 'Q', 'M', 'L', 'w', 'd', 'D', 'e', 'c', 't', 'T']); + return _this; + } + _createClass$k(ISOWeekParser, [{ + key: "parse", + value: function parse(dateString, token, match) { switch (token) { case 'I': - return parseNumericPattern(numericPatterns.week, string); - + return parseNumericPattern(numericPatterns.week, dateString); case 'Io': - return match.ordinalNumber(string, { + return match.ordinalNumber(dateString, { unit: 'week' }); - default: - return parseNDigits(token.length, string); + return parseNDigits(token.length, dateString); } - }, - validate: function validate(_date, value, _options) { + } + }, { + key: "validate", + value: function validate(_date, value) { return value >= 1 && value <= 53; - }, - set: function set(date, _flags, value, options) { - return startOfUTCISOWeek(setUTCISOWeek(date, value, options), options); - }, - incompatibleTokens: ['y', 'Y', 'u', 'q', 'Q', 'M', 'L', 'w', 'd', 'D', 'e', 'c', 't', 'T'] - }, - // Day of the month - d: { - priority: 90, - subPriority: 1, - parse: function parse(string, token, match, _options) { + } + }, { + key: "set", + value: function set(date, _flags, value) { + return startOfUTCISOWeek(setUTCISOWeek(date, value)); + } + }]); + return ISOWeekParser; + }(Parser); + + function _typeof$k(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$k = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$k = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$k(obj); + } + function _classCallCheck$j(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$j(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$j(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$j(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$j(Constructor, staticProps); + return Constructor; + } + function _inherits$j(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$j(subClass, superClass); + } + function _setPrototypeOf$j(o, p) { + _setPrototypeOf$j = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$j(o, p); + } + function _createSuper$j(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$j(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$j(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$j(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$j(this, result); + }; + } + function _possibleConstructorReturn$j(self, call) { + if (call && (_typeof$k(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$j(self); + } + function _assertThisInitialized$j(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$j() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$j(o) { + _getPrototypeOf$j = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$j(o); + } + function _defineProperty$j(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + var DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + var DAYS_IN_MONTH_LEAP_YEAR = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; // Day of the month + + var DateParser = /*#__PURE__*/function (_Parser) { + _inherits$j(DateParser, _Parser); + var _super = _createSuper$j(DateParser); + function DateParser() { + var _this; + _classCallCheck$j(this, DateParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$j(_assertThisInitialized$j(_this), "priority", 90); + _defineProperty$j(_assertThisInitialized$j(_this), "subPriority", 1); + _defineProperty$j(_assertThisInitialized$j(_this), "incompatibleTokens", ['Y', 'R', 'q', 'Q', 'w', 'I', 'D', 'i', 'e', 'c', 't', 'T']); + return _this; + } + _createClass$j(DateParser, [{ + key: "parse", + value: function parse(dateString, token, match) { switch (token) { case 'd': - return parseNumericPattern(numericPatterns.date, string); - + return parseNumericPattern(numericPatterns.date, dateString); case 'do': - return match.ordinalNumber(string, { + return match.ordinalNumber(dateString, { unit: 'date' }); - default: - return parseNDigits(token.length, string); + return parseNDigits(token.length, dateString); } - }, - validate: function validate(date, value, _options) { + } + }, { + key: "validate", + value: function validate(date, value) { var year = date.getUTCFullYear(); var isLeapYear = isLeapYearIndex$1(year); var month = date.getUTCMonth(); - if (isLeapYear) { return value >= 1 && value <= DAYS_IN_MONTH_LEAP_YEAR[month]; } else { return value >= 1 && value <= DAYS_IN_MONTH[month]; } - }, - set: function set(date, _flags, value, _options) { + } + }, { + key: "set", + value: function set(date, _flags, value) { date.setUTCDate(value); date.setUTCHours(0, 0, 0, 0); return date; - }, - incompatibleTokens: ['Y', 'R', 'q', 'Q', 'w', 'I', 'D', 'i', 'e', 'c', 't', 'T'] - }, - // Day of year - D: { - priority: 90, - subPriority: 1, - parse: function parse(string, token, match, _options) { + } + }]); + return DateParser; + }(Parser); + + function _typeof$j(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$j = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$j = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$j(obj); + } + function _classCallCheck$i(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$i(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$i(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$i(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$i(Constructor, staticProps); + return Constructor; + } + function _inherits$i(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$i(subClass, superClass); + } + function _setPrototypeOf$i(o, p) { + _setPrototypeOf$i = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$i(o, p); + } + function _createSuper$i(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$i(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$i(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$i(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$i(this, result); + }; + } + function _possibleConstructorReturn$i(self, call) { + if (call && (_typeof$j(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$i(self); + } + function _assertThisInitialized$i(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$i() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$i(o) { + _getPrototypeOf$i = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$i(o); + } + function _defineProperty$i(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + var DayOfYearParser = /*#__PURE__*/function (_Parser) { + _inherits$i(DayOfYearParser, _Parser); + var _super = _createSuper$i(DayOfYearParser); + function DayOfYearParser() { + var _this; + _classCallCheck$i(this, DayOfYearParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$i(_assertThisInitialized$i(_this), "priority", 90); + _defineProperty$i(_assertThisInitialized$i(_this), "subpriority", 1); + _defineProperty$i(_assertThisInitialized$i(_this), "incompatibleTokens", ['Y', 'R', 'q', 'Q', 'M', 'L', 'w', 'I', 'd', 'E', 'i', 'e', 'c', 't', 'T']); + return _this; + } + _createClass$i(DayOfYearParser, [{ + key: "parse", + value: function parse(dateString, token, match) { switch (token) { case 'D': case 'DD': - return parseNumericPattern(numericPatterns.dayOfYear, string); - + return parseNumericPattern(numericPatterns.dayOfYear, dateString); case 'Do': - return match.ordinalNumber(string, { + return match.ordinalNumber(dateString, { unit: 'date' }); - default: - return parseNDigits(token.length, string); + return parseNDigits(token.length, dateString); } - }, - validate: function validate(date, value, _options) { + } + }, { + key: "validate", + value: function validate(date, value) { var year = date.getUTCFullYear(); var isLeapYear = isLeapYearIndex$1(year); - if (isLeapYear) { return value >= 1 && value <= 366; } else { return value >= 1 && value <= 365; } - }, - set: function set(date, _flags, value, _options) { + } + }, { + key: "set", + value: function set(date, _flags, value) { date.setUTCMonth(0, value); date.setUTCHours(0, 0, 0, 0); return date; - }, - incompatibleTokens: ['Y', 'R', 'q', 'Q', 'M', 'L', 'w', 'I', 'd', 'E', 'i', 'e', 'c', 't', 'T'] - }, - // Day of week - E: { - priority: 90, - parse: function parse(string, token, match, _options) { + } + }]); + return DayOfYearParser; + }(Parser); + + function setUTCDay(dirtyDate, dirtyDay, options) { + var _ref, _ref2, _ref3, _options$weekStartsOn, _options$locale, _options$locale$optio, _defaultOptions$local, _defaultOptions$local2; + requiredArgs(2, arguments); + var defaultOptions = getDefaultOptions(); + var weekStartsOn = toInteger((_ref = (_ref2 = (_ref3 = (_options$weekStartsOn = options === null || options === void 0 ? void 0 : options.weekStartsOn) !== null && _options$weekStartsOn !== void 0 ? _options$weekStartsOn : options === null || options === void 0 ? void 0 : (_options$locale = options.locale) === null || _options$locale === void 0 ? void 0 : (_options$locale$optio = _options$locale.options) === null || _options$locale$optio === void 0 ? void 0 : _options$locale$optio.weekStartsOn) !== null && _ref3 !== void 0 ? _ref3 : defaultOptions.weekStartsOn) !== null && _ref2 !== void 0 ? _ref2 : (_defaultOptions$local = defaultOptions.locale) === null || _defaultOptions$local === void 0 ? void 0 : (_defaultOptions$local2 = _defaultOptions$local.options) === null || _defaultOptions$local2 === void 0 ? void 0 : _defaultOptions$local2.weekStartsOn) !== null && _ref !== void 0 ? _ref : 0); // Test if weekStartsOn is between 0 and 6 _and_ is not NaN + + if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) { + throw new RangeError('weekStartsOn must be between 0 and 6 inclusively'); + } + var date = toDate(dirtyDate); + var day = toInteger(dirtyDay); + var currentDay = date.getUTCDay(); + var remainder = day % 7; + var dayIndex = (remainder + 7) % 7; + var diff = (dayIndex < weekStartsOn ? 7 : 0) + day - currentDay; + date.setUTCDate(date.getUTCDate() + diff); + return date; + } + + function _typeof$i(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$i = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$i = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$i(obj); + } + function _classCallCheck$h(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$h(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$h(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$h(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$h(Constructor, staticProps); + return Constructor; + } + function _inherits$h(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$h(subClass, superClass); + } + function _setPrototypeOf$h(o, p) { + _setPrototypeOf$h = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$h(o, p); + } + function _createSuper$h(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$h(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$h(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$h(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$h(this, result); + }; + } + function _possibleConstructorReturn$h(self, call) { + if (call && (_typeof$i(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$h(self); + } + function _assertThisInitialized$h(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$h() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$h(o) { + _getPrototypeOf$h = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$h(o); + } + function _defineProperty$h(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + + var DayParser = /*#__PURE__*/function (_Parser) { + _inherits$h(DayParser, _Parser); + var _super = _createSuper$h(DayParser); + function DayParser() { + var _this; + _classCallCheck$h(this, DayParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$h(_assertThisInitialized$h(_this), "priority", 90); + _defineProperty$h(_assertThisInitialized$h(_this), "incompatibleTokens", ['D', 'i', 'e', 'c', 't', 'T']); + return _this; + } + _createClass$h(DayParser, [{ + key: "parse", + value: function parse(dateString, token, match) { switch (token) { // Tue case 'E': case 'EE': case 'EEE': - return match.day(string, { + return match.day(dateString, { width: 'abbreviated', context: 'formatting' - }) || match.day(string, { + }) || match.day(dateString, { width: 'short', context: 'formatting' - }) || match.day(string, { + }) || match.day(dateString, { width: 'narrow', context: 'formatting' }); // T case 'EEEEE': - return match.day(string, { + return match.day(dateString, { width: 'narrow', context: 'formatting' }); // Tu case 'EEEEEE': - return match.day(string, { + return match.day(dateString, { width: 'short', context: 'formatting' - }) || match.day(string, { + }) || match.day(dateString, { width: 'narrow', context: 'formatting' }); // Tuesday case 'EEEE': default: - return match.day(string, { + return match.day(dateString, { width: 'wide', context: 'formatting' - }) || match.day(string, { + }) || match.day(dateString, { width: 'abbreviated', context: 'formatting' - }) || match.day(string, { + }) || match.day(dateString, { width: 'short', context: 'formatting' - }) || match.day(string, { + }) || match.day(dateString, { width: 'narrow', context: 'formatting' }); } - }, - validate: function validate(_date, value, _options) { + } + }, { + key: "validate", + value: function validate(_date, value) { return value >= 0 && value <= 6; - }, - set: function set(date, _flags, value, options) { + } + }, { + key: "set", + value: function set(date, _flags, value, options) { date = setUTCDay(date, value, options); date.setUTCHours(0, 0, 0, 0); return date; - }, - incompatibleTokens: ['D', 'i', 'e', 'c', 't', 'T'] - }, - // Local day of week - e: { - priority: 90, - parse: function parse(string, token, match, options) { + } + }]); + return DayParser; + }(Parser); + + function _typeof$h(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$h = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$h = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$h(obj); + } + function _classCallCheck$g(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$g(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$g(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$g(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$g(Constructor, staticProps); + return Constructor; + } + function _inherits$g(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$g(subClass, superClass); + } + function _setPrototypeOf$g(o, p) { + _setPrototypeOf$g = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$g(o, p); + } + function _createSuper$g(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$g(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$g(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$g(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$g(this, result); + }; + } + function _possibleConstructorReturn$g(self, call) { + if (call && (_typeof$h(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$g(self); + } + function _assertThisInitialized$g(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$g() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$g(o) { + _getPrototypeOf$g = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$g(o); + } + function _defineProperty$g(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + + var LocalDayParser = /*#__PURE__*/function (_Parser) { + _inherits$g(LocalDayParser, _Parser); + var _super = _createSuper$g(LocalDayParser); + function LocalDayParser() { + var _this; + _classCallCheck$g(this, LocalDayParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$g(_assertThisInitialized$g(_this), "priority", 90); + _defineProperty$g(_assertThisInitialized$g(_this), "incompatibleTokens", ['y', 'R', 'u', 'q', 'Q', 'M', 'L', 'I', 'd', 'D', 'E', 'i', 'c', 't', 'T']); + return _this; + } + _createClass$g(LocalDayParser, [{ + key: "parse", + value: function parse(dateString, token, match, options) { var valueCallback = function valueCallback(value) { var wholeWeekDays = Math.floor((value - 1) / 7) * 7; return (value + options.weekStartsOn + 6) % 7 + wholeWeekDays; }; - switch (token) { // 3 case 'e': case 'ee': // 03 - return parseNDigits(token.length, string, valueCallback); + return mapValue(parseNDigits(token.length, dateString), valueCallback); // 3rd case 'eo': - return match.ordinalNumber(string, { - unit: 'day', - valueCallback: valueCallback - }); + return mapValue(match.ordinalNumber(dateString, { + unit: 'day' + }), valueCallback); // Tue case 'eee': - return match.day(string, { + return match.day(dateString, { width: 'abbreviated', context: 'formatting' - }) || match.day(string, { + }) || match.day(dateString, { width: 'short', context: 'formatting' - }) || match.day(string, { + }) || match.day(dateString, { width: 'narrow', context: 'formatting' }); // T case 'eeeee': - return match.day(string, { + return match.day(dateString, { width: 'narrow', context: 'formatting' }); // Tu case 'eeeeee': - return match.day(string, { + return match.day(dateString, { width: 'short', context: 'formatting' - }) || match.day(string, { + }) || match.day(dateString, { width: 'narrow', context: 'formatting' }); // Tuesday case 'eeee': default: - return match.day(string, { + return match.day(dateString, { width: 'wide', context: 'formatting' - }) || match.day(string, { + }) || match.day(dateString, { width: 'abbreviated', context: 'formatting' - }) || match.day(string, { + }) || match.day(dateString, { width: 'short', context: 'formatting' - }) || match.day(string, { + }) || match.day(dateString, { width: 'narrow', context: 'formatting' }); } - }, - validate: function validate(_date, value, _options) { + } + }, { + key: "validate", + value: function validate(_date, value) { return value >= 0 && value <= 6; - }, - set: function set(date, _flags, value, options) { + } + }, { + key: "set", + value: function set(date, _flags, value, options) { date = setUTCDay(date, value, options); date.setUTCHours(0, 0, 0, 0); return date; - }, - incompatibleTokens: ['y', 'R', 'u', 'q', 'Q', 'M', 'L', 'I', 'd', 'D', 'E', 'i', 'c', 't', 'T'] - }, - // Stand-alone local day of week - c: { - priority: 90, - parse: function parse(string, token, match, options) { + } + }]); + return LocalDayParser; + }(Parser); + + function _typeof$g(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$g = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$g = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$g(obj); + } + function _classCallCheck$f(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$f(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$f(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$f(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$f(Constructor, staticProps); + return Constructor; + } + function _inherits$f(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$f(subClass, superClass); + } + function _setPrototypeOf$f(o, p) { + _setPrototypeOf$f = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$f(o, p); + } + function _createSuper$f(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$f(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$f(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$f(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$f(this, result); + }; + } + function _possibleConstructorReturn$f(self, call) { + if (call && (_typeof$g(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$f(self); + } + function _assertThisInitialized$f(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$f() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$f(o) { + _getPrototypeOf$f = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$f(o); + } + function _defineProperty$f(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + + var StandAloneLocalDayParser = /*#__PURE__*/function (_Parser) { + _inherits$f(StandAloneLocalDayParser, _Parser); + var _super = _createSuper$f(StandAloneLocalDayParser); + function StandAloneLocalDayParser() { + var _this; + _classCallCheck$f(this, StandAloneLocalDayParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$f(_assertThisInitialized$f(_this), "priority", 90); + _defineProperty$f(_assertThisInitialized$f(_this), "incompatibleTokens", ['y', 'R', 'u', 'q', 'Q', 'M', 'L', 'I', 'd', 'D', 'E', 'i', 'e', 't', 'T']); + return _this; + } + _createClass$f(StandAloneLocalDayParser, [{ + key: "parse", + value: function parse(dateString, token, match, options) { var valueCallback = function valueCallback(value) { var wholeWeekDays = Math.floor((value - 1) / 7) * 7; return (value + options.weekStartsOn + 6) % 7 + wholeWeekDays; }; - switch (token) { // 3 case 'c': case 'cc': // 03 - return parseNDigits(token.length, string, valueCallback); + return mapValue(parseNDigits(token.length, dateString), valueCallback); // 3rd case 'co': - return match.ordinalNumber(string, { - unit: 'day', - valueCallback: valueCallback - }); + return mapValue(match.ordinalNumber(dateString, { + unit: 'day' + }), valueCallback); // Tue case 'ccc': - return match.day(string, { + return match.day(dateString, { width: 'abbreviated', context: 'standalone' - }) || match.day(string, { + }) || match.day(dateString, { width: 'short', context: 'standalone' - }) || match.day(string, { + }) || match.day(dateString, { width: 'narrow', context: 'standalone' }); // T case 'ccccc': - return match.day(string, { + return match.day(dateString, { width: 'narrow', context: 'standalone' }); // Tu case 'cccccc': - return match.day(string, { + return match.day(dateString, { width: 'short', context: 'standalone' - }) || match.day(string, { + }) || match.day(dateString, { width: 'narrow', context: 'standalone' }); // Tuesday case 'cccc': default: - return match.day(string, { + return match.day(dateString, { width: 'wide', context: 'standalone' - }) || match.day(string, { + }) || match.day(dateString, { width: 'abbreviated', context: 'standalone' - }) || match.day(string, { + }) || match.day(dateString, { width: 'short', context: 'standalone' - }) || match.day(string, { + }) || match.day(dateString, { width: 'narrow', context: 'standalone' }); } - }, - validate: function validate(_date, value, _options) { + } + }, { + key: "validate", + value: function validate(_date, value) { return value >= 0 && value <= 6; - }, - set: function set(date, _flags, value, options) { + } + }, { + key: "set", + value: function set(date, _flags, value, options) { date = setUTCDay(date, value, options); date.setUTCHours(0, 0, 0, 0); return date; - }, - incompatibleTokens: ['y', 'R', 'u', 'q', 'Q', 'M', 'L', 'I', 'd', 'D', 'E', 'i', 'e', 't', 'T'] - }, - // ISO day of week - i: { - priority: 90, - parse: function parse(string, token, match, _options) { + } + }]); + return StandAloneLocalDayParser; + }(Parser); + + function setUTCISODay(dirtyDate, dirtyDay) { + requiredArgs(2, arguments); + var day = toInteger(dirtyDay); + if (day % 7 === 0) { + day = day - 7; + } + var weekStartsOn = 1; + var date = toDate(dirtyDate); + var currentDay = date.getUTCDay(); + var remainder = day % 7; + var dayIndex = (remainder + 7) % 7; + var diff = (dayIndex < weekStartsOn ? 7 : 0) + day - currentDay; + date.setUTCDate(date.getUTCDate() + diff); + return date; + } + + function _typeof$f(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$f = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$f = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$f(obj); + } + function _classCallCheck$e(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$e(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$e(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$e(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$e(Constructor, staticProps); + return Constructor; + } + function _inherits$e(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$e(subClass, superClass); + } + function _setPrototypeOf$e(o, p) { + _setPrototypeOf$e = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$e(o, p); + } + function _createSuper$e(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$e(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$e(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$e(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$e(this, result); + }; + } + function _possibleConstructorReturn$e(self, call) { + if (call && (_typeof$f(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$e(self); + } + function _assertThisInitialized$e(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$e() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$e(o) { + _getPrototypeOf$e = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$e(o); + } + function _defineProperty$e(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + + var ISODayParser = /*#__PURE__*/function (_Parser) { + _inherits$e(ISODayParser, _Parser); + var _super = _createSuper$e(ISODayParser); + function ISODayParser() { + var _this; + _classCallCheck$e(this, ISODayParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$e(_assertThisInitialized$e(_this), "priority", 90); + _defineProperty$e(_assertThisInitialized$e(_this), "incompatibleTokens", ['y', 'Y', 'u', 'q', 'Q', 'M', 'L', 'w', 'd', 'D', 'E', 'e', 'c', 't', 'T']); + return _this; + } + _createClass$e(ISODayParser, [{ + key: "parse", + value: function parse(dateString, token, match) { var valueCallback = function valueCallback(value) { if (value === 0) { return 7; } - return value; }; - switch (token) { // 2 case 'i': case 'ii': // 02 - return parseNDigits(token.length, string); + return parseNDigits(token.length, dateString); // 2nd case 'io': - return match.ordinalNumber(string, { + return match.ordinalNumber(dateString, { unit: 'day' }); // Tue case 'iii': - return match.day(string, { + return mapValue(match.day(dateString, { width: 'abbreviated', - context: 'formatting', - valueCallback: valueCallback - }) || match.day(string, { + context: 'formatting' + }) || match.day(dateString, { width: 'short', - context: 'formatting', - valueCallback: valueCallback - }) || match.day(string, { + context: 'formatting' + }) || match.day(dateString, { width: 'narrow', - context: 'formatting', - valueCallback: valueCallback - }); + context: 'formatting' + }), valueCallback); // T case 'iiiii': - return match.day(string, { + return mapValue(match.day(dateString, { width: 'narrow', - context: 'formatting', - valueCallback: valueCallback - }); + context: 'formatting' + }), valueCallback); // Tu case 'iiiiii': - return match.day(string, { + return mapValue(match.day(dateString, { width: 'short', - context: 'formatting', - valueCallback: valueCallback - }) || match.day(string, { + context: 'formatting' + }) || match.day(dateString, { width: 'narrow', - context: 'formatting', - valueCallback: valueCallback - }); + context: 'formatting' + }), valueCallback); // Tuesday case 'iiii': default: - return match.day(string, { + return mapValue(match.day(dateString, { width: 'wide', - context: 'formatting', - valueCallback: valueCallback - }) || match.day(string, { + context: 'formatting' + }) || match.day(dateString, { width: 'abbreviated', - context: 'formatting', - valueCallback: valueCallback - }) || match.day(string, { + context: 'formatting' + }) || match.day(dateString, { width: 'short', - context: 'formatting', - valueCallback: valueCallback - }) || match.day(string, { + context: 'formatting' + }) || match.day(dateString, { width: 'narrow', - context: 'formatting', - valueCallback: valueCallback - }); + context: 'formatting' + }), valueCallback); } - }, - validate: function validate(_date, value, _options) { + } + }, { + key: "validate", + value: function validate(_date, value) { return value >= 1 && value <= 7; - }, - set: function set(date, _flags, value, options) { - date = setUTCISODay(date, value, options); + } + }, { + key: "set", + value: function set(date, _flags, value) { + date = setUTCISODay(date, value); date.setUTCHours(0, 0, 0, 0); return date; - }, - incompatibleTokens: ['y', 'Y', 'u', 'q', 'Q', 'M', 'L', 'w', 'd', 'D', 'E', 'e', 'c', 't', 'T'] - }, - // AM or PM - a: { - priority: 80, - parse: function parse(string, token, match, _options) { + } + }]); + return ISODayParser; + }(Parser); + + function _typeof$e(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$e = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$e = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$e(obj); + } + function _classCallCheck$d(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$d(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$d(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$d(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$d(Constructor, staticProps); + return Constructor; + } + function _inherits$d(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$d(subClass, superClass); + } + function _setPrototypeOf$d(o, p) { + _setPrototypeOf$d = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$d(o, p); + } + function _createSuper$d(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$d(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$d(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$d(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$d(this, result); + }; + } + function _possibleConstructorReturn$d(self, call) { + if (call && (_typeof$e(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$d(self); + } + function _assertThisInitialized$d(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$d() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$d(o) { + _getPrototypeOf$d = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$d(o); + } + function _defineProperty$d(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + var AMPMParser = /*#__PURE__*/function (_Parser) { + _inherits$d(AMPMParser, _Parser); + var _super = _createSuper$d(AMPMParser); + function AMPMParser() { + var _this; + _classCallCheck$d(this, AMPMParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$d(_assertThisInitialized$d(_this), "priority", 80); + _defineProperty$d(_assertThisInitialized$d(_this), "incompatibleTokens", ['b', 'B', 'H', 'k', 't', 'T']); + return _this; + } + _createClass$d(AMPMParser, [{ + key: "parse", + value: function parse(dateString, token, match) { switch (token) { case 'a': case 'aa': case 'aaa': - return match.dayPeriod(string, { + return match.dayPeriod(dateString, { width: 'abbreviated', context: 'formatting' - }) || match.dayPeriod(string, { + }) || match.dayPeriod(dateString, { width: 'narrow', context: 'formatting' }); - case 'aaaaa': - return match.dayPeriod(string, { + return match.dayPeriod(dateString, { width: 'narrow', context: 'formatting' }); - case 'aaaa': default: - return match.dayPeriod(string, { + return match.dayPeriod(dateString, { width: 'wide', context: 'formatting' - }) || match.dayPeriod(string, { + }) || match.dayPeriod(dateString, { width: 'abbreviated', context: 'formatting' - }) || match.dayPeriod(string, { + }) || match.dayPeriod(dateString, { width: 'narrow', context: 'formatting' }); } - }, - set: function set(date, _flags, value, _options) { + } + }, { + key: "set", + value: function set(date, _flags, value) { date.setUTCHours(dayPeriodEnumToHours(value), 0, 0, 0); return date; - }, - incompatibleTokens: ['b', 'B', 'H', 'K', 'k', 't', 'T'] - }, - // AM, PM, midnight - b: { - priority: 80, - parse: function parse(string, token, match, _options) { + } + }]); + return AMPMParser; + }(Parser); + + function _typeof$d(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$d = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$d = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$d(obj); + } + function _classCallCheck$c(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$c(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$c(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$c(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$c(Constructor, staticProps); + return Constructor; + } + function _inherits$c(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$c(subClass, superClass); + } + function _setPrototypeOf$c(o, p) { + _setPrototypeOf$c = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$c(o, p); + } + function _createSuper$c(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$c(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$c(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$c(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$c(this, result); + }; + } + function _possibleConstructorReturn$c(self, call) { + if (call && (_typeof$d(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$c(self); + } + function _assertThisInitialized$c(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$c() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$c(o) { + _getPrototypeOf$c = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$c(o); + } + function _defineProperty$c(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + var AMPMMidnightParser = /*#__PURE__*/function (_Parser) { + _inherits$c(AMPMMidnightParser, _Parser); + var _super = _createSuper$c(AMPMMidnightParser); + function AMPMMidnightParser() { + var _this; + _classCallCheck$c(this, AMPMMidnightParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$c(_assertThisInitialized$c(_this), "priority", 80); + _defineProperty$c(_assertThisInitialized$c(_this), "incompatibleTokens", ['a', 'B', 'H', 'k', 't', 'T']); + return _this; + } + _createClass$c(AMPMMidnightParser, [{ + key: "parse", + value: function parse(dateString, token, match) { switch (token) { case 'b': case 'bb': case 'bbb': - return match.dayPeriod(string, { + return match.dayPeriod(dateString, { width: 'abbreviated', context: 'formatting' - }) || match.dayPeriod(string, { + }) || match.dayPeriod(dateString, { width: 'narrow', context: 'formatting' }); - case 'bbbbb': - return match.dayPeriod(string, { + return match.dayPeriod(dateString, { width: 'narrow', context: 'formatting' }); - case 'bbbb': default: - return match.dayPeriod(string, { + return match.dayPeriod(dateString, { width: 'wide', context: 'formatting' - }) || match.dayPeriod(string, { + }) || match.dayPeriod(dateString, { width: 'abbreviated', context: 'formatting' - }) || match.dayPeriod(string, { + }) || match.dayPeriod(dateString, { width: 'narrow', context: 'formatting' }); } - }, - set: function set(date, _flags, value, _options) { + } + }, { + key: "set", + value: function set(date, _flags, value) { date.setUTCHours(dayPeriodEnumToHours(value), 0, 0, 0); return date; - }, - incompatibleTokens: ['a', 'B', 'H', 'K', 'k', 't', 'T'] - }, - // in the morning, in the afternoon, in the evening, at night - B: { - priority: 80, - parse: function parse(string, token, match, _options) { + } + }]); + return AMPMMidnightParser; + }(Parser); + + function _typeof$c(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$c = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$c = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$c(obj); + } + function _classCallCheck$b(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$b(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$b(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$b(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$b(Constructor, staticProps); + return Constructor; + } + function _inherits$b(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$b(subClass, superClass); + } + function _setPrototypeOf$b(o, p) { + _setPrototypeOf$b = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$b(o, p); + } + function _createSuper$b(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$b(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$b(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$b(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$b(this, result); + }; + } + function _possibleConstructorReturn$b(self, call) { + if (call && (_typeof$c(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$b(self); + } + function _assertThisInitialized$b(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$b() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$b(o) { + _getPrototypeOf$b = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$b(o); + } + function _defineProperty$b(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + + var DayPeriodParser = /*#__PURE__*/function (_Parser) { + _inherits$b(DayPeriodParser, _Parser); + var _super = _createSuper$b(DayPeriodParser); + function DayPeriodParser() { + var _this; + _classCallCheck$b(this, DayPeriodParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$b(_assertThisInitialized$b(_this), "priority", 80); + _defineProperty$b(_assertThisInitialized$b(_this), "incompatibleTokens", ['a', 'b', 't', 'T']); + return _this; + } + _createClass$b(DayPeriodParser, [{ + key: "parse", + value: function parse(dateString, token, match) { switch (token) { case 'B': case 'BB': case 'BBB': - return match.dayPeriod(string, { + return match.dayPeriod(dateString, { width: 'abbreviated', context: 'formatting' - }) || match.dayPeriod(string, { + }) || match.dayPeriod(dateString, { width: 'narrow', context: 'formatting' }); - case 'BBBBB': - return match.dayPeriod(string, { + return match.dayPeriod(dateString, { width: 'narrow', context: 'formatting' }); - case 'BBBB': default: - return match.dayPeriod(string, { + return match.dayPeriod(dateString, { width: 'wide', context: 'formatting' - }) || match.dayPeriod(string, { + }) || match.dayPeriod(dateString, { width: 'abbreviated', context: 'formatting' - }) || match.dayPeriod(string, { + }) || match.dayPeriod(dateString, { width: 'narrow', context: 'formatting' }); } - }, - set: function set(date, _flags, value, _options) { + } + }, { + key: "set", + value: function set(date, _flags, value) { date.setUTCHours(dayPeriodEnumToHours(value), 0, 0, 0); return date; - }, - incompatibleTokens: ['a', 'b', 't', 'T'] - }, - // Hour [1-12] - h: { - priority: 70, - parse: function parse(string, token, match, _options) { + } + }]); + return DayPeriodParser; + }(Parser); + + function _typeof$b(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$b = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$b = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$b(obj); + } + function _classCallCheck$a(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$a(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$a(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$a(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$a(Constructor, staticProps); + return Constructor; + } + function _inherits$a(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$a(subClass, superClass); + } + function _setPrototypeOf$a(o, p) { + _setPrototypeOf$a = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$a(o, p); + } + function _createSuper$a(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$a(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$a(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$a(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$a(this, result); + }; + } + function _possibleConstructorReturn$a(self, call) { + if (call && (_typeof$b(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$a(self); + } + function _assertThisInitialized$a(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$a() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$a(o) { + _getPrototypeOf$a = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$a(o); + } + function _defineProperty$a(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + var Hour1to12Parser = /*#__PURE__*/function (_Parser) { + _inherits$a(Hour1to12Parser, _Parser); + var _super = _createSuper$a(Hour1to12Parser); + function Hour1to12Parser() { + var _this; + _classCallCheck$a(this, Hour1to12Parser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$a(_assertThisInitialized$a(_this), "priority", 70); + _defineProperty$a(_assertThisInitialized$a(_this), "incompatibleTokens", ['H', 'K', 'k', 't', 'T']); + return _this; + } + _createClass$a(Hour1to12Parser, [{ + key: "parse", + value: function parse(dateString, token, match) { switch (token) { case 'h': - return parseNumericPattern(numericPatterns.hour12h, string); - + return parseNumericPattern(numericPatterns.hour12h, dateString); case 'ho': - return match.ordinalNumber(string, { + return match.ordinalNumber(dateString, { unit: 'hour' }); - default: - return parseNDigits(token.length, string); + return parseNDigits(token.length, dateString); } - }, - validate: function validate(_date, value, _options) { + } + }, { + key: "validate", + value: function validate(_date, value) { return value >= 1 && value <= 12; - }, - set: function set(date, _flags, value, _options) { + } + }, { + key: "set", + value: function set(date, _flags, value) { var isPM = date.getUTCHours() >= 12; - if (isPM && value < 12) { date.setUTCHours(value + 12, 0, 0, 0); } else if (!isPM && value === 12) { date.setUTCHours(0, 0, 0, 0); } else { date.setUTCHours(value, 0, 0, 0); } - return date; - }, - incompatibleTokens: ['H', 'K', 'k', 't', 'T'] - }, - // Hour [0-23] - H: { - priority: 70, - parse: function parse(string, token, match, _options) { + } + }]); + return Hour1to12Parser; + }(Parser); + + function _typeof$a(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$a = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$a = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$a(obj); + } + function _classCallCheck$9(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$9(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$9(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$9(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$9(Constructor, staticProps); + return Constructor; + } + function _inherits$9(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$9(subClass, superClass); + } + function _setPrototypeOf$9(o, p) { + _setPrototypeOf$9 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$9(o, p); + } + function _createSuper$9(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$9(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$9(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$9(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$9(this, result); + }; + } + function _possibleConstructorReturn$9(self, call) { + if (call && (_typeof$a(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$9(self); + } + function _assertThisInitialized$9(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$9() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$9(o) { + _getPrototypeOf$9 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$9(o); + } + function _defineProperty$9(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + var Hour0to23Parser = /*#__PURE__*/function (_Parser) { + _inherits$9(Hour0to23Parser, _Parser); + var _super = _createSuper$9(Hour0to23Parser); + function Hour0to23Parser() { + var _this; + _classCallCheck$9(this, Hour0to23Parser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$9(_assertThisInitialized$9(_this), "priority", 70); + _defineProperty$9(_assertThisInitialized$9(_this), "incompatibleTokens", ['a', 'b', 'h', 'K', 'k', 't', 'T']); + return _this; + } + _createClass$9(Hour0to23Parser, [{ + key: "parse", + value: function parse(dateString, token, match) { switch (token) { case 'H': - return parseNumericPattern(numericPatterns.hour23h, string); - + return parseNumericPattern(numericPatterns.hour23h, dateString); case 'Ho': - return match.ordinalNumber(string, { + return match.ordinalNumber(dateString, { unit: 'hour' }); - default: - return parseNDigits(token.length, string); + return parseNDigits(token.length, dateString); } - }, - validate: function validate(_date, value, _options) { + } + }, { + key: "validate", + value: function validate(_date, value) { return value >= 0 && value <= 23; - }, - set: function set(date, _flags, value, _options) { + } + }, { + key: "set", + value: function set(date, _flags, value) { date.setUTCHours(value, 0, 0, 0); return date; - }, - incompatibleTokens: ['a', 'b', 'h', 'K', 'k', 't', 'T'] - }, - // Hour [0-11] - K: { - priority: 70, - parse: function parse(string, token, match, _options) { + } + }]); + return Hour0to23Parser; + }(Parser); + + function _typeof$9(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$9 = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$9 = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$9(obj); + } + function _classCallCheck$8(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$8(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$8(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$8(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$8(Constructor, staticProps); + return Constructor; + } + function _inherits$8(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$8(subClass, superClass); + } + function _setPrototypeOf$8(o, p) { + _setPrototypeOf$8 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$8(o, p); + } + function _createSuper$8(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$8(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$8(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$8(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$8(this, result); + }; + } + function _possibleConstructorReturn$8(self, call) { + if (call && (_typeof$9(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$8(self); + } + function _assertThisInitialized$8(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$8() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$8(o) { + _getPrototypeOf$8 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$8(o); + } + function _defineProperty$8(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + var Hour0To11Parser = /*#__PURE__*/function (_Parser) { + _inherits$8(Hour0To11Parser, _Parser); + var _super = _createSuper$8(Hour0To11Parser); + function Hour0To11Parser() { + var _this; + _classCallCheck$8(this, Hour0To11Parser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$8(_assertThisInitialized$8(_this), "priority", 70); + _defineProperty$8(_assertThisInitialized$8(_this), "incompatibleTokens", ['h', 'H', 'k', 't', 'T']); + return _this; + } + _createClass$8(Hour0To11Parser, [{ + key: "parse", + value: function parse(dateString, token, match) { switch (token) { case 'K': - return parseNumericPattern(numericPatterns.hour11h, string); - + return parseNumericPattern(numericPatterns.hour11h, dateString); case 'Ko': - return match.ordinalNumber(string, { + return match.ordinalNumber(dateString, { unit: 'hour' }); - default: - return parseNDigits(token.length, string); + return parseNDigits(token.length, dateString); } - }, - validate: function validate(_date, value, _options) { + } + }, { + key: "validate", + value: function validate(_date, value) { return value >= 0 && value <= 11; - }, - set: function set(date, _flags, value, _options) { + } + }, { + key: "set", + value: function set(date, _flags, value) { var isPM = date.getUTCHours() >= 12; - if (isPM && value < 12) { date.setUTCHours(value + 12, 0, 0, 0); } else { date.setUTCHours(value, 0, 0, 0); } - return date; - }, - incompatibleTokens: ['a', 'b', 'h', 'H', 'k', 't', 'T'] - }, - // Hour [1-24] - k: { - priority: 70, - parse: function parse(string, token, match, _options) { + } + }]); + return Hour0To11Parser; + }(Parser); + + function _typeof$8(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$8 = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$8 = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$8(obj); + } + function _classCallCheck$7(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$7(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$7(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$7(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$7(Constructor, staticProps); + return Constructor; + } + function _inherits$7(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$7(subClass, superClass); + } + function _setPrototypeOf$7(o, p) { + _setPrototypeOf$7 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$7(o, p); + } + function _createSuper$7(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$7(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$7(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$7(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$7(this, result); + }; + } + function _possibleConstructorReturn$7(self, call) { + if (call && (_typeof$8(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$7(self); + } + function _assertThisInitialized$7(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$7() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$7(o) { + _getPrototypeOf$7 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$7(o); + } + function _defineProperty$7(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + var Hour1To24Parser = /*#__PURE__*/function (_Parser) { + _inherits$7(Hour1To24Parser, _Parser); + var _super = _createSuper$7(Hour1To24Parser); + function Hour1To24Parser() { + var _this; + _classCallCheck$7(this, Hour1To24Parser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$7(_assertThisInitialized$7(_this), "priority", 70); + _defineProperty$7(_assertThisInitialized$7(_this), "incompatibleTokens", ['a', 'b', 'h', 'H', 'K', 't', 'T']); + return _this; + } + _createClass$7(Hour1To24Parser, [{ + key: "parse", + value: function parse(dateString, token, match) { switch (token) { case 'k': - return parseNumericPattern(numericPatterns.hour24h, string); - + return parseNumericPattern(numericPatterns.hour24h, dateString); case 'ko': - return match.ordinalNumber(string, { + return match.ordinalNumber(dateString, { unit: 'hour' }); - default: - return parseNDigits(token.length, string); + return parseNDigits(token.length, dateString); } - }, - validate: function validate(_date, value, _options) { + } + }, { + key: "validate", + value: function validate(_date, value) { return value >= 1 && value <= 24; - }, - set: function set(date, _flags, value, _options) { + } + }, { + key: "set", + value: function set(date, _flags, value) { var hours = value <= 24 ? value % 24 : value; date.setUTCHours(hours, 0, 0, 0); return date; - }, - incompatibleTokens: ['a', 'b', 'h', 'H', 'K', 't', 'T'] - }, - // Minute - m: { - priority: 60, - parse: function parse(string, token, match, _options) { + } + }]); + return Hour1To24Parser; + }(Parser); + + function _typeof$7(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$7 = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$7 = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$7(obj); + } + function _classCallCheck$6(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$6(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$6(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$6(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$6(Constructor, staticProps); + return Constructor; + } + function _inherits$6(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$6(subClass, superClass); + } + function _setPrototypeOf$6(o, p) { + _setPrototypeOf$6 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$6(o, p); + } + function _createSuper$6(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$6(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$6(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$6(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$6(this, result); + }; + } + function _possibleConstructorReturn$6(self, call) { + if (call && (_typeof$7(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$6(self); + } + function _assertThisInitialized$6(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$6() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$6(o) { + _getPrototypeOf$6 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$6(o); + } + function _defineProperty$6(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + var MinuteParser = /*#__PURE__*/function (_Parser) { + _inherits$6(MinuteParser, _Parser); + var _super = _createSuper$6(MinuteParser); + function MinuteParser() { + var _this; + _classCallCheck$6(this, MinuteParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$6(_assertThisInitialized$6(_this), "priority", 60); + _defineProperty$6(_assertThisInitialized$6(_this), "incompatibleTokens", ['t', 'T']); + return _this; + } + _createClass$6(MinuteParser, [{ + key: "parse", + value: function parse(dateString, token, match) { switch (token) { case 'm': - return parseNumericPattern(numericPatterns.minute, string); - + return parseNumericPattern(numericPatterns.minute, dateString); case 'mo': - return match.ordinalNumber(string, { + return match.ordinalNumber(dateString, { unit: 'minute' }); - default: - return parseNDigits(token.length, string); + return parseNDigits(token.length, dateString); } - }, - validate: function validate(_date, value, _options) { + } + }, { + key: "validate", + value: function validate(_date, value) { return value >= 0 && value <= 59; - }, - set: function set(date, _flags, value, _options) { + } + }, { + key: "set", + value: function set(date, _flags, value) { date.setUTCMinutes(value, 0, 0); return date; - }, - incompatibleTokens: ['t', 'T'] - }, - // Second - s: { - priority: 50, - parse: function parse(string, token, match, _options) { + } + }]); + return MinuteParser; + }(Parser); + + function _typeof$6(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$6 = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$6 = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$6(obj); + } + function _classCallCheck$5(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$5(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$5(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$5(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$5(Constructor, staticProps); + return Constructor; + } + function _inherits$5(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$5(subClass, superClass); + } + function _setPrototypeOf$5(o, p) { + _setPrototypeOf$5 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$5(o, p); + } + function _createSuper$5(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$5(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$5(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$5(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$5(this, result); + }; + } + function _possibleConstructorReturn$5(self, call) { + if (call && (_typeof$6(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$5(self); + } + function _assertThisInitialized$5(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$5() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$5(o) { + _getPrototypeOf$5 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$5(o); + } + function _defineProperty$5(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + var SecondParser = /*#__PURE__*/function (_Parser) { + _inherits$5(SecondParser, _Parser); + var _super = _createSuper$5(SecondParser); + function SecondParser() { + var _this; + _classCallCheck$5(this, SecondParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$5(_assertThisInitialized$5(_this), "priority", 50); + _defineProperty$5(_assertThisInitialized$5(_this), "incompatibleTokens", ['t', 'T']); + return _this; + } + _createClass$5(SecondParser, [{ + key: "parse", + value: function parse(dateString, token, match) { switch (token) { case 's': - return parseNumericPattern(numericPatterns.second, string); - + return parseNumericPattern(numericPatterns.second, dateString); case 'so': - return match.ordinalNumber(string, { + return match.ordinalNumber(dateString, { unit: 'second' }); - default: - return parseNDigits(token.length, string); + return parseNDigits(token.length, dateString); } - }, - validate: function validate(_date, value, _options) { + } + }, { + key: "validate", + value: function validate(_date, value) { return value >= 0 && value <= 59; - }, - set: function set(date, _flags, value, _options) { + } + }, { + key: "set", + value: function set(date, _flags, value) { date.setUTCSeconds(value, 0); return date; - }, - incompatibleTokens: ['t', 'T'] - }, - // Fraction of second - S: { - priority: 30, - parse: function parse(string, token, _match, _options) { + } + }]); + return SecondParser; + }(Parser); + + function _typeof$5(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$5 = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$5 = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$5(obj); + } + function _classCallCheck$4(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$4(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$4(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$4(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$4(Constructor, staticProps); + return Constructor; + } + function _inherits$4(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$4(subClass, superClass); + } + function _setPrototypeOf$4(o, p) { + _setPrototypeOf$4 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$4(o, p); + } + function _createSuper$4(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$4(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$4(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$4(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$4(this, result); + }; + } + function _possibleConstructorReturn$4(self, call) { + if (call && (_typeof$5(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$4(self); + } + function _assertThisInitialized$4(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$4() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$4(o) { + _getPrototypeOf$4 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$4(o); + } + function _defineProperty$4(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + var FractionOfSecondParser = /*#__PURE__*/function (_Parser) { + _inherits$4(FractionOfSecondParser, _Parser); + var _super = _createSuper$4(FractionOfSecondParser); + function FractionOfSecondParser() { + var _this; + _classCallCheck$4(this, FractionOfSecondParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$4(_assertThisInitialized$4(_this), "priority", 30); + _defineProperty$4(_assertThisInitialized$4(_this), "incompatibleTokens", ['t', 'T']); + return _this; + } + _createClass$4(FractionOfSecondParser, [{ + key: "parse", + value: function parse(dateString, token) { var valueCallback = function valueCallback(value) { return Math.floor(value * Math.pow(10, -token.length + 3)); }; - - return parseNDigits(token.length, string, valueCallback); - }, - set: function set(date, _flags, value, _options) { + return mapValue(parseNDigits(token.length, dateString), valueCallback); + } + }, { + key: "set", + value: function set(date, _flags, value) { date.setUTCMilliseconds(value); return date; - }, - incompatibleTokens: ['t', 'T'] - }, - // Timezone (ISO-8601. +00:00 is `'Z'`) - X: { - priority: 10, - parse: function parse(string, token, _match, _options) { + } + }]); + return FractionOfSecondParser; + }(Parser); + + function _typeof$4(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$4 = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$4 = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$4(obj); + } + function _classCallCheck$3(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$3(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$3(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$3(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$3(Constructor, staticProps); + return Constructor; + } + function _inherits$3(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$3(subClass, superClass); + } + function _setPrototypeOf$3(o, p) { + _setPrototypeOf$3 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$3(o, p); + } + function _createSuper$3(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$3(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$3(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$3(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$3(this, result); + }; + } + function _possibleConstructorReturn$3(self, call) { + if (call && (_typeof$4(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$3(self); + } + function _assertThisInitialized$3(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$3() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$3(o) { + _getPrototypeOf$3 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$3(o); + } + function _defineProperty$3(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + + var ISOTimezoneWithZParser = /*#__PURE__*/function (_Parser) { + _inherits$3(ISOTimezoneWithZParser, _Parser); + var _super = _createSuper$3(ISOTimezoneWithZParser); + function ISOTimezoneWithZParser() { + var _this; + _classCallCheck$3(this, ISOTimezoneWithZParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$3(_assertThisInitialized$3(_this), "priority", 10); + _defineProperty$3(_assertThisInitialized$3(_this), "incompatibleTokens", ['t', 'T', 'x']); + return _this; + } + _createClass$3(ISOTimezoneWithZParser, [{ + key: "parse", + value: function parse(dateString, token) { switch (token) { case 'X': - return parseTimezonePattern(timezonePatterns.basicOptionalMinutes, string); - + return parseTimezonePattern(timezonePatterns.basicOptionalMinutes, dateString); case 'XX': - return parseTimezonePattern(timezonePatterns.basic, string); - + return parseTimezonePattern(timezonePatterns.basic, dateString); case 'XXXX': - return parseTimezonePattern(timezonePatterns.basicOptionalSeconds, string); - + return parseTimezonePattern(timezonePatterns.basicOptionalSeconds, dateString); case 'XXXXX': - return parseTimezonePattern(timezonePatterns.extendedOptionalSeconds, string); - + return parseTimezonePattern(timezonePatterns.extendedOptionalSeconds, dateString); case 'XXX': default: - return parseTimezonePattern(timezonePatterns.extended, string); + return parseTimezonePattern(timezonePatterns.extended, dateString); } - }, - set: function set(date, flags, value, _options) { + } + }, { + key: "set", + value: function set(date, flags, value) { if (flags.timestampIsSet) { return date; } - return new Date(date.getTime() - value); - }, - incompatibleTokens: ['t', 'T', 'x'] - }, - // Timezone (ISO-8601) - x: { - priority: 10, - parse: function parse(string, token, _match, _options) { + } + }]); + return ISOTimezoneWithZParser; + }(Parser); + + function _typeof$3(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$3 = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$3 = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$3(obj); + } + function _classCallCheck$2(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$2(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$2(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$2(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$2(Constructor, staticProps); + return Constructor; + } + function _inherits$2(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$2(subClass, superClass); + } + function _setPrototypeOf$2(o, p) { + _setPrototypeOf$2 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$2(o, p); + } + function _createSuper$2(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$2(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$2(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$2(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$2(this, result); + }; + } + function _possibleConstructorReturn$2(self, call) { + if (call && (_typeof$3(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$2(self); + } + function _assertThisInitialized$2(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$2() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$2(o) { + _getPrototypeOf$2 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$2(o); + } + function _defineProperty$2(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + + var ISOTimezoneParser = /*#__PURE__*/function (_Parser) { + _inherits$2(ISOTimezoneParser, _Parser); + var _super = _createSuper$2(ISOTimezoneParser); + function ISOTimezoneParser() { + var _this; + _classCallCheck$2(this, ISOTimezoneParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$2(_assertThisInitialized$2(_this), "priority", 10); + _defineProperty$2(_assertThisInitialized$2(_this), "incompatibleTokens", ['t', 'T', 'X']); + return _this; + } + _createClass$2(ISOTimezoneParser, [{ + key: "parse", + value: function parse(dateString, token) { switch (token) { case 'x': - return parseTimezonePattern(timezonePatterns.basicOptionalMinutes, string); - + return parseTimezonePattern(timezonePatterns.basicOptionalMinutes, dateString); case 'xx': - return parseTimezonePattern(timezonePatterns.basic, string); - + return parseTimezonePattern(timezonePatterns.basic, dateString); case 'xxxx': - return parseTimezonePattern(timezonePatterns.basicOptionalSeconds, string); - + return parseTimezonePattern(timezonePatterns.basicOptionalSeconds, dateString); case 'xxxxx': - return parseTimezonePattern(timezonePatterns.extendedOptionalSeconds, string); - + return parseTimezonePattern(timezonePatterns.extendedOptionalSeconds, dateString); case 'xxx': default: - return parseTimezonePattern(timezonePatterns.extended, string); + return parseTimezonePattern(timezonePatterns.extended, dateString); } - }, - set: function set(date, flags, value, _options) { + } + }, { + key: "set", + value: function set(date, flags, value) { if (flags.timestampIsSet) { return date; } - return new Date(date.getTime() - value); - }, - incompatibleTokens: ['t', 'T', 'X'] - }, - // Seconds timestamp - t: { - priority: 40, - parse: function parse(string, _token, _match, _options) { - return parseAnyDigitsSigned(string); - }, - set: function set(_date, _flags, value, _options) { + } + }]); + return ISOTimezoneParser; + }(Parser); + + function _typeof$2(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$2 = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$2 = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$2(obj); + } + function _classCallCheck$1(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties$1(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass$1(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$1(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$1(Constructor, staticProps); + return Constructor; + } + function _inherits$1(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf$1(subClass, superClass); + } + function _setPrototypeOf$1(o, p) { + _setPrototypeOf$1 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf$1(o, p); + } + function _createSuper$1(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct$1(); + return function _createSuperInternal() { + var Super = _getPrototypeOf$1(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf$1(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn$1(this, result); + }; + } + function _possibleConstructorReturn$1(self, call) { + if (call && (_typeof$2(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized$1(self); + } + function _assertThisInitialized$1(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct$1() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf$1(o) { + _getPrototypeOf$1 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf$1(o); + } + function _defineProperty$1(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + var TimestampSecondsParser = /*#__PURE__*/function (_Parser) { + _inherits$1(TimestampSecondsParser, _Parser); + var _super = _createSuper$1(TimestampSecondsParser); + function TimestampSecondsParser() { + var _this; + _classCallCheck$1(this, TimestampSecondsParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty$1(_assertThisInitialized$1(_this), "priority", 40); + _defineProperty$1(_assertThisInitialized$1(_this), "incompatibleTokens", '*'); + return _this; + } + _createClass$1(TimestampSecondsParser, [{ + key: "parse", + value: function parse(dateString) { + return parseAnyDigitsSigned(dateString); + } + }, { + key: "set", + value: function set(_date, _flags, value) { return [new Date(value * 1000), { timestampIsSet: true }]; - }, - incompatibleTokens: '*' - }, - // Milliseconds timestamp - T: { - priority: 20, - parse: function parse(string, _token, _match, _options) { - return parseAnyDigitsSigned(string); - }, - set: function set(_date, _flags, value, _options) { + } + }]); + return TimestampSecondsParser; + }(Parser); + + function _typeof$1(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof$1 = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof$1 = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof$1(obj); + } + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf(subClass, superClass); + } + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf(o, p); + } + function _createSuper(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct(); + return function _createSuperInternal() { + var Super = _getPrototypeOf(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn(this, result); + }; + } + function _possibleConstructorReturn(self, call) { + if (call && (_typeof$1(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized(self); + } + function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); + } + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + var TimestampMillisecondsParser = /*#__PURE__*/function (_Parser) { + _inherits(TimestampMillisecondsParser, _Parser); + var _super = _createSuper(TimestampMillisecondsParser); + function TimestampMillisecondsParser() { + var _this; + _classCallCheck(this, TimestampMillisecondsParser); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _super.call.apply(_super, [this].concat(args)); + _defineProperty(_assertThisInitialized(_this), "priority", 20); + _defineProperty(_assertThisInitialized(_this), "incompatibleTokens", '*'); + return _this; + } + _createClass(TimestampMillisecondsParser, [{ + key: "parse", + value: function parse(dateString) { + return parseAnyDigitsSigned(dateString); + } + }, { + key: "set", + value: function set(_date, _flags, value) { return [new Date(value), { timestampIsSet: true }]; - }, - incompatibleTokens: '*' - } + } + }]); + return TimestampMillisecondsParser; + }(Parser); + + /* + * | | Unit | | Unit | + * |-----|--------------------------------|-----|--------------------------------| + * | a | AM, PM | A* | Milliseconds in day | + * | b | AM, PM, noon, midnight | B | Flexible day period | + * | c | Stand-alone local day of week | C* | Localized hour w/ day period | + * | d | Day of month | D | Day of year | + * | e | Local day of week | E | Day of week | + * | f | | F* | Day of week in month | + * | g* | Modified Julian day | G | Era | + * | h | Hour [1-12] | H | Hour [0-23] | + * | i! | ISO day of week | I! | ISO week of year | + * | j* | Localized hour w/ day period | J* | Localized hour w/o day period | + * | k | Hour [1-24] | K | Hour [0-11] | + * | l* | (deprecated) | L | Stand-alone month | + * | m | Minute | M | Month | + * | n | | N | | + * | o! | Ordinal number modifier | O* | Timezone (GMT) | + * | p | | P | | + * | q | Stand-alone quarter | Q | Quarter | + * | r* | Related Gregorian year | R! | ISO week-numbering year | + * | s | Second | S | Fraction of second | + * | t! | Seconds timestamp | T! | Milliseconds timestamp | + * | u | Extended year | U* | Cyclic year | + * | v* | Timezone (generic non-locat.) | V* | Timezone (location) | + * | w | Local week of year | W* | Week of month | + * | x | Timezone (ISO-8601 w/o Z) | X | Timezone (ISO-8601) | + * | y | Year (abs) | Y | Local week-numbering year | + * | z* | Timezone (specific non-locat.) | Z* | Timezone (aliases) | + * + * Letters marked by * are not implemented but reserved by Unicode standard. + * + * Letters marked by ! are non-standard, but implemented by date-fns: + * - `o` modifies the previous token to turn it into an ordinal (see `parse` docs) + * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days, + * i.e. 7 for Sunday, 1 for Monday, etc. + * - `I` is ISO week of year, as opposed to `w` which is local week of year. + * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year. + * `R` is supposed to be used in conjunction with `I` and `i` + * for universal ISO week-numbering date, whereas + * `Y` is supposed to be used in conjunction with `w` and `e` + * for week-numbering date specific to the locale. + */ + + var parsers = { + G: new EraParser(), + y: new YearParser(), + Y: new LocalWeekYearParser(), + R: new ISOWeekYearParser(), + u: new ExtendedYearParser(), + Q: new QuarterParser(), + q: new StandAloneQuarterParser(), + M: new MonthParser(), + L: new StandAloneMonthParser(), + w: new LocalWeekParser(), + I: new ISOWeekParser(), + d: new DateParser(), + D: new DayOfYearParser(), + E: new DayParser(), + e: new LocalDayParser(), + c: new StandAloneLocalDayParser(), + i: new ISODayParser(), + a: new AMPMParser(), + b: new AMPMMidnightParser(), + B: new DayPeriodParser(), + h: new Hour1to12Parser(), + H: new Hour0to23Parser(), + K: new Hour0To11Parser(), + k: new Hour1To24Parser(), + m: new MinuteParser(), + s: new SecondParser(), + S: new FractionOfSecondParser(), + X: new ISOTimezoneWithZParser(), + x: new ISOTimezoneParser(), + t: new TimestampSecondsParser(), + T: new TimestampMillisecondsParser() }; - var TIMEZONE_UNIT_PRIORITY = 10; // This RegExp consists of three parts separated by `|`: + function _typeof(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + return _typeof(obj); + } + function _createForOfIteratorHelper(o, allowArrayLike) { + var it; + if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + var F = function F() {}; + return { + s: F, + n: function n() { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }, + e: function e(_e) { + throw _e; + }, + f: F + }; + } + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + var normalCompletion = true, + didErr = false, + err; + return { + s: function s() { + it = o[Symbol.iterator](); + }, + n: function n() { + var step = it.next(); + normalCompletion = step.done; + return step; + }, + e: function e(_e2) { + didErr = true; + err = _e2; + }, + f: function f() { + try { + if (!normalCompletion && it["return"] != null) it["return"](); + } finally { + if (didErr) throw err; + } + } + }; + } + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); + } + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + return arr2; + } // - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token // (one of the certain letters followed by `o`) // - (\w)\1* matches any sequences of the same letter // - '' matches two quote characters in a row // - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('), @@ -22624,11 +26419,11 @@ * * @description * Return the date parsed from string using the given format string. * * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries. - * > See: https://git.io/fxCyr + * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md * * The characters in the format string wrapped between two single quotes characters (') are escaped. * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote. * * Format of the format string is based on Unicode Technical Standard #35: @@ -22712,32 +26507,32 @@ * | | | DDD | 001, 002, ..., 365, 366 | | * | | | DDDD | ... | 2 | * | Day of week (formatting) | 90 | E..EEE | Mon, Tue, Wed, ..., Sun | | * | | | EEEE | Monday, Tuesday, ..., Sunday | 2 | * | | | EEEEE | M, T, W, T, F, S, S | | - * | | | EEEEEE | Mo, Tu, We, Th, Fr, Su, Sa | | + * | | | EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | | * | ISO day of week (formatting) | 90 | i | 1, 2, 3, ..., 7 | 5 | * | | | io | 1st, 2nd, ..., 7th | 5 | * | | | ii | 01, 02, ..., 07 | 5 | * | | | iii | Mon, Tue, Wed, ..., Sun | 5 | * | | | iiii | Monday, Tuesday, ..., Sunday | 2,5 | * | | | iiiii | M, T, W, T, F, S, S | 5 | - * | | | iiiiii | Mo, Tu, We, Th, Fr, Su, Sa | 5 | + * | | | iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | 5 | * | Local day of week (formatting) | 90 | e | 2, 3, 4, ..., 1 | | * | | | eo | 2nd, 3rd, ..., 1st | 5 | * | | | ee | 02, 03, ..., 01 | | * | | | eee | Mon, Tue, Wed, ..., Sun | | * | | | eeee | Monday, Tuesday, ..., Sunday | 2 | * | | | eeeee | M, T, W, T, F, S, S | | - * | | | eeeeee | Mo, Tu, We, Th, Fr, Su, Sa | | + * | | | eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | | * | Local day of week (stand-alone) | 90 | c | 2, 3, 4, ..., 1 | | * | | | co | 2nd, 3rd, ..., 1st | 5 | * | | | cc | 02, 03, ..., 01 | | * | | | ccc | Mon, Tue, Wed, ..., Sun | | * | | | cccc | Monday, Tuesday, ..., Sunday | 2 | * | | | ccccc | M, T, W, T, F, S, S | | - * | | | cccccc | Mo, Tu, We, Th, Fr, Su, Sa | | + * | | | cccccc | Mo, Tu, We, Th, Fr, Sa, Su | | * | AM, PM | 80 | a..aaa | AM, PM | | * | | | aaaa | a.m., p.m. | 2 | * | | | aaaaa | a, p | | * | AM, PM, noon, midnight | 80 | b..bbb | AM, PM, noon, midnight | | * | | | bbbb | a.m., p.m., noon, midnight | 2 | @@ -22765,11 +26560,11 @@ * | | | ss | 00, 01, ..., 59 | | * | Seconds timestamp | 40 | t | 512969520 | | * | | | tt | ... | 2 | * | Fraction of second | 30 | S | 0, 1, ..., 9 | | * | | | SS | 00, 01, ..., 99 | | - * | | | SSS | 000, 0001, ..., 999 | | + * | | | SSS | 000, 001, ..., 999 | | * | | | SSSS | ... | 2 | * | Milliseconds timestamp | 20 | T | 512969520900 | | * | | | TT | ... | 2 | * | Timezone (ISO-8601 w/ Z) | 10 | X | -08, +0530, Z | | * | | | XX | -0800, +0530, Z | | @@ -22847,14 +26642,14 @@ * - `o`: ordinal number modifier * - `P`: long localized date * - `p`: long localized time * * 6. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years. - * You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://git.io/fxCyr + * You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md * * 7. `D` and `DD` tokens represent days of the year but they are ofthen confused with days of the month. - * You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://git.io/fxCyr + * You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md * * 8. `P+` tokens do not have a defined priority since they are merely aliases to other tokens based * on the given locale. * * using `en-US` locale: `P` => `MM/dd/yyyy` @@ -22881,47 +26676,30 @@ * * If parsing failed, `Invalid Date` will be returned. * Invalid Date is a Date, whose time value is NaN. * Time value of Date: http://es5.github.io/#x15.9.1.1 * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * - * - Old `parse` was renamed to `toDate`. - * Now `parse` is a new function which parses a string using a provided format. - * - * ```javascript - * // Before v2.0.0 - * parse('2016-01-01') - * - * // v2.0.0 onward (toDate no longer accepts a string) - * toDate(1392098430000) // Unix to timestamp - * toDate(new Date(2014, 1, 11, 11, 30, 30)) // Cloning the date - * parse('2016-01-01', 'yyyy-MM-dd', new Date()) - * ``` - * * @param {String} dateString - the string to parse * @param {String} formatString - the string of tokens * @param {Date|Number} referenceDate - defines values missing from the parsed dateString * @param {Object} [options] - an object with options. * @param {Locale} [options.locale=defaultLocale] - the locale object. See [Locale]{@link https://date-fns.org/docs/Locale} * @param {0|1|2|3|4|5|6} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) * @param {1|2|3|4|5|6|7} [options.firstWeekContainsDate=1] - the day of January, which is always in the first week of the year * @param {Boolean} [options.useAdditionalWeekYearTokens=false] - if true, allows usage of the week-numbering year tokens `YY` and `YYYY`; - * see: https://git.io/fxCyr + * see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md * @param {Boolean} [options.useAdditionalDayOfYearTokens=false] - if true, allows usage of the day of year tokens `D` and `DD`; - * see: https://git.io/fxCyr + * see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md * @returns {Date} the parsed date * @throws {TypeError} 3 arguments required * @throws {RangeError} `options.weekStartsOn` must be between 0 and 6 * @throws {RangeError} `options.firstWeekContainsDate` must be between 1 and 7 * @throws {RangeError} `options.locale` must contain `match` property - * @throws {RangeError} use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://git.io/fxCyr - * @throws {RangeError} use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://git.io/fxCyr - * @throws {RangeError} use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://git.io/fxCyr - * @throws {RangeError} use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://git.io/fxCyr + * @throws {RangeError} use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md + * @throws {RangeError} use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md + * @throws {RangeError} use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md + * @throws {RangeError} use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md * @throws {RangeError} format string contains an unescaped latin alphabet character * * @example * // Parse 11 February 2014 from middle-endian format: * var result = parse('02/11/2014', 'MM/dd/yyyy', new Date()) @@ -22934,151 +26712,122 @@ * locale: eo * }) * //=> Sun Feb 28 2010 00:00:00 */ - function parse(dirtyDateString, dirtyFormatString, dirtyReferenceDate, dirtyOptions) { + function parse(dirtyDateString, dirtyFormatString, dirtyReferenceDate, options) { + var _ref, _options$locale, _ref2, _ref3, _ref4, _options$firstWeekCon, _options$locale2, _options$locale2$opti, _defaultOptions$local, _defaultOptions$local2, _ref5, _ref6, _ref7, _options$weekStartsOn, _options$locale3, _options$locale3$opti, _defaultOptions$local3, _defaultOptions$local4; requiredArgs(3, arguments); var dateString = String(dirtyDateString); var formatString = String(dirtyFormatString); - var options = dirtyOptions || {}; - var locale$1 = options.locale || locale; - - if (!locale$1.match) { + var defaultOptions = getDefaultOptions(); + var locale = (_ref = (_options$locale = options === null || options === void 0 ? void 0 : options.locale) !== null && _options$locale !== void 0 ? _options$locale : defaultOptions.locale) !== null && _ref !== void 0 ? _ref : defaultLocale; + if (!locale.match) { throw new RangeError('locale must contain match property'); } + var firstWeekContainsDate = toInteger((_ref2 = (_ref3 = (_ref4 = (_options$firstWeekCon = options === null || options === void 0 ? void 0 : options.firstWeekContainsDate) !== null && _options$firstWeekCon !== void 0 ? _options$firstWeekCon : options === null || options === void 0 ? void 0 : (_options$locale2 = options.locale) === null || _options$locale2 === void 0 ? void 0 : (_options$locale2$opti = _options$locale2.options) === null || _options$locale2$opti === void 0 ? void 0 : _options$locale2$opti.firstWeekContainsDate) !== null && _ref4 !== void 0 ? _ref4 : defaultOptions.firstWeekContainsDate) !== null && _ref3 !== void 0 ? _ref3 : (_defaultOptions$local = defaultOptions.locale) === null || _defaultOptions$local === void 0 ? void 0 : (_defaultOptions$local2 = _defaultOptions$local.options) === null || _defaultOptions$local2 === void 0 ? void 0 : _defaultOptions$local2.firstWeekContainsDate) !== null && _ref2 !== void 0 ? _ref2 : 1); // Test if weekStartsOn is between 1 and 7 _and_ is not NaN - var localeFirstWeekContainsDate = locale$1.options && locale$1.options.firstWeekContainsDate; - var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate); - var firstWeekContainsDate = options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate); // Test if weekStartsOn is between 1 and 7 _and_ is not NaN - if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) { throw new RangeError('firstWeekContainsDate must be between 1 and 7 inclusively'); } + var weekStartsOn = toInteger((_ref5 = (_ref6 = (_ref7 = (_options$weekStartsOn = options === null || options === void 0 ? void 0 : options.weekStartsOn) !== null && _options$weekStartsOn !== void 0 ? _options$weekStartsOn : options === null || options === void 0 ? void 0 : (_options$locale3 = options.locale) === null || _options$locale3 === void 0 ? void 0 : (_options$locale3$opti = _options$locale3.options) === null || _options$locale3$opti === void 0 ? void 0 : _options$locale3$opti.weekStartsOn) !== null && _ref7 !== void 0 ? _ref7 : defaultOptions.weekStartsOn) !== null && _ref6 !== void 0 ? _ref6 : (_defaultOptions$local3 = defaultOptions.locale) === null || _defaultOptions$local3 === void 0 ? void 0 : (_defaultOptions$local4 = _defaultOptions$local3.options) === null || _defaultOptions$local4 === void 0 ? void 0 : _defaultOptions$local4.weekStartsOn) !== null && _ref5 !== void 0 ? _ref5 : 0); // Test if weekStartsOn is between 0 and 6 _and_ is not NaN - var localeWeekStartsOn = locale$1.options && locale$1.options.weekStartsOn; - var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn); - var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn); // Test if weekStartsOn is between 0 and 6 _and_ is not NaN - if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) { throw new RangeError('weekStartsOn must be between 0 and 6 inclusively'); } - if (formatString === '') { if (dateString === '') { return toDate(dirtyReferenceDate); } else { return new Date(NaN); } } - var subFnOptions = { firstWeekContainsDate: firstWeekContainsDate, weekStartsOn: weekStartsOn, - locale: locale$1 // If timezone isn't specified, it will be set to the system timezone + locale: locale + }; // If timezone isn't specified, it will be set to the system timezone - }; - var setters = [{ - priority: TIMEZONE_UNIT_PRIORITY, - subPriority: -1, - set: dateToSystemTimezone, - index: 0 - }]; - var i; + var setters = [new DateToSystemTimezoneSetter()]; var tokens = formatString.match(longFormattingTokensRegExp).map(function (substring) { var firstCharacter = substring[0]; - - if (firstCharacter === 'p' || firstCharacter === 'P') { - var longFormatter = longFormatters[firstCharacter]; - return longFormatter(substring, locale$1.formatLong, subFnOptions); + if (firstCharacter in longFormatters$1) { + var longFormatter = longFormatters$1[firstCharacter]; + return longFormatter(substring, locale.formatLong); } - return substring; }).join('').match(formattingTokensRegExp); var usedTokens = []; - - for (i = 0; i < tokens.length; i++) { - var token = tokens[i]; - - if (!options.useAdditionalWeekYearTokens && isProtectedWeekYearToken(token)) { - throwProtectedError(token, formatString, dirtyDateString); - } - - if (!options.useAdditionalDayOfYearTokens && isProtectedDayOfYearToken(token)) { - throwProtectedError(token, formatString, dirtyDateString); - } - - var firstCharacter = token[0]; - var parser = parsers[firstCharacter]; - - if (parser) { - var incompatibleTokens = parser.incompatibleTokens; - - if (Array.isArray(incompatibleTokens)) { - var incompatibleToken = void 0; - - for (var _i = 0; _i < usedTokens.length; _i++) { - var usedToken = usedTokens[_i].token; - - if (incompatibleTokens.indexOf(usedToken) !== -1 || usedToken === firstCharacter) { - incompatibleToken = usedTokens[_i]; - break; + var _iterator = _createForOfIteratorHelper(tokens), + _step; + try { + var _loop = function _loop() { + var token = _step.value; + if (!(options !== null && options !== void 0 && options.useAdditionalWeekYearTokens) && isProtectedWeekYearToken(token)) { + throwProtectedError(token, formatString, dirtyDateString); + } + if (!(options !== null && options !== void 0 && options.useAdditionalDayOfYearTokens) && isProtectedDayOfYearToken(token)) { + throwProtectedError(token, formatString, dirtyDateString); + } + var firstCharacter = token[0]; + var parser = parsers[firstCharacter]; + if (parser) { + var incompatibleTokens = parser.incompatibleTokens; + if (Array.isArray(incompatibleTokens)) { + var incompatibleToken = usedTokens.find(function (usedToken) { + return incompatibleTokens.includes(usedToken.token) || usedToken.token === firstCharacter; + }); + if (incompatibleToken) { + throw new RangeError("The format string mustn't contain `".concat(incompatibleToken.fullToken, "` and `").concat(token, "` at the same time")); } + } else if (parser.incompatibleTokens === '*' && usedTokens.length > 0) { + throw new RangeError("The format string mustn't contain `".concat(token, "` and any other token at the same time")); } - - if (incompatibleToken) { - throw new RangeError("The format string mustn't contain `".concat(incompatibleToken.fullToken, "` and `").concat(token, "` at the same time")); + usedTokens.push({ + token: firstCharacter, + fullToken: token + }); + var parseResult = parser.run(dateString, token, locale.match, subFnOptions); + if (!parseResult) { + return { + v: new Date(NaN) + }; } - } else if (parser.incompatibleTokens === '*' && usedTokens.length) { - throw new RangeError("The format string mustn't contain `".concat(token, "` and any other token at the same time")); - } - - usedTokens.push({ - token: firstCharacter, - fullToken: token - }); - var parseResult = parser.parse(dateString, token, locale$1.match, subFnOptions); - - if (!parseResult) { - return new Date(NaN); - } - - setters.push({ - priority: parser.priority, - subPriority: parser.subPriority || 0, - set: parser.set, - validate: parser.validate, - value: parseResult.value, - index: setters.length - }); - dateString = parseResult.rest; - } else { - if (firstCharacter.match(unescapedLatinCharacterRegExp)) { - throw new RangeError('Format string contains an unescaped latin alphabet character `' + firstCharacter + '`'); - } // Replace two single quote characters with one single quote character - - - if (token === "''") { - token = "'"; - } else if (firstCharacter === "'") { - token = cleanEscapedString(token); - } // Cut token from string, or, if string doesn't match the token, return Invalid Date - - - if (dateString.indexOf(token) === 0) { - dateString = dateString.slice(token.length); + setters.push(parseResult.setter); + dateString = parseResult.rest; } else { - return new Date(NaN); - } - } - } // Check if the remaining input contains something other than whitespace + if (firstCharacter.match(unescapedLatinCharacterRegExp)) { + throw new RangeError('Format string contains an unescaped latin alphabet character `' + firstCharacter + '`'); + } // Replace two single quote characters with one single quote character + if (token === "''") { + token = "'"; + } else if (firstCharacter === "'") { + token = cleanEscapedString(token); + } // Cut token from string, or, if string doesn't match the token, return Invalid Date + if (dateString.indexOf(token) === 0) { + dateString = dateString.slice(token.length); + } else { + return { + v: new Date(NaN) + }; + } + } + }; + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var _ret = _loop(); + if (_typeof(_ret) === "object") return _ret.v; + } // Check if the remaining input contains something other than whitespace + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } if (dateString.length > 0 && notWhitespaceRegExp.test(dateString)) { return new Date(NaN); } - var uniquePrioritySetters = setters.map(function (setter) { return setter.priority; }).sort(function (a, b) { return b - a; }).filter(function (priority, index, array) { @@ -23091,52 +26840,40 @@ }); }).map(function (setterArray) { return setterArray[0]; }); var date = toDate(dirtyReferenceDate); - - if (isNaN(date)) { + if (isNaN(date.getTime())) { return new Date(NaN); } // Convert the date in system timezone to the same date in UTC+00:00 timezone. - // This ensures that when UTC functions will be implemented, locales will be compatible with them. - // See an issue about UTC functions: https://github.com/date-fns/date-fns/issues/37 - var utcDate = subMilliseconds(date, getTimezoneOffsetInMilliseconds(date)); var flags = {}; + var _iterator2 = _createForOfIteratorHelper(uniquePrioritySetters), + _step2; + try { + for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { + var setter = _step2.value; + if (!setter.validate(utcDate, subFnOptions)) { + return new Date(NaN); + } + var result = setter.set(utcDate, flags, subFnOptions); // Result is tuple (date, flags) - for (i = 0; i < uniquePrioritySetters.length; i++) { - var setter = uniquePrioritySetters[i]; - - if (setter.validate && !setter.validate(utcDate, setter.value, subFnOptions)) { - return new Date(NaN); + if (Array.isArray(result)) { + utcDate = result[0]; + assign(flags, result[1]); // Result is date + } else { + utcDate = result; + } } - - var result = setter.set(utcDate, flags, setter.value, subFnOptions); // Result is tuple (date, flags) - - if (result[0]) { - utcDate = result[0]; - assign(flags, result[1]); // Result is date - } else { - utcDate = result; - } + } catch (err) { + _iterator2.e(err); + } finally { + _iterator2.f(); } - return utcDate; } - - function dateToSystemTimezone(date, flags) { - if (flags.timestampIsSet) { - return date; - } - - var convertedDate = new Date(0); - convertedDate.setFullYear(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()); - convertedDate.setHours(date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.getUTCMilliseconds()); - return convertedDate; - } - function cleanEscapedString(input) { return input.match(escapedStringRegExp)[1].replace(doubleQuoteRegExp, "'"); } /** @@ -23146,14 +26883,10 @@ * * @description * Return the start of an hour for the given date. * The result will be in the local timezone. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the original date * @returns {Date} the start of an hour * @throws {TypeError} 1 argument required * * @example @@ -23168,52 +26901,18 @@ date.setMinutes(0, 0, 0); return date; } /** - * @name startOfMinute - * @category Minute Helpers - * @summary Return the start of a minute for the given date. - * - * @description - * Return the start of a minute for the given date. - * The result will be in the local timezone. - * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * - * @param {Date|Number} date - the original date - * @returns {Date} the start of a minute - * @throws {TypeError} 1 argument required - * - * @example - * // The start of a minute for 1 December 2014 22:15:45.400: - * const result = startOfMinute(new Date(2014, 11, 1, 22, 15, 45, 400)) - * //=> Mon Dec 01 2014 22:15:00 - */ - - function startOfMinute(dirtyDate) { - requiredArgs(1, arguments); - var date = toDate(dirtyDate); - date.setSeconds(0, 0); - return date; - } - - /** * @name startOfSecond * @category Second Helpers * @summary Return the start of a second for the given date. * * @description * Return the start of a second for the given date. * The result will be in the local timezone. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * * @param {Date|Number} date - the original date * @returns {Date} the start of a second * @throws {TypeError} 1 argument required * * @example @@ -23227,21 +26926,10 @@ var date = toDate(dirtyDate); date.setMilliseconds(0); return date; } - var MILLISECONDS_IN_HOUR = 3600000; - var MILLISECONDS_IN_MINUTE = 60000; - var DEFAULT_ADDITIONAL_DIGITS = 2; - var patterns = { - dateTimeDelimiter: /[T ]/, - timeZoneDelimiter: /[Z ]/i, - timezone: /([Z+-].*)$/ - }; - var dateRegex = /^-?(?:(\d{3})|(\d{2})(?:-?(\d{2}))?|W(\d{2})(?:-?(\d{1}))?|)$/; - var timeRegex = /^(\d{2}(?:[.,]\d*)?)(?::?(\d{2}(?:[.,]\d*)?))?(?::?(\d{2}(?:[.,]\d*)?))?$/; - var timezoneRegex = /^([+-])(\d{2})(?::?(\d{2}))?$/; /** * @name parseISO * @category Common Helpers * @summary Parse ISO string * @@ -23252,94 +26940,59 @@ * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601 * * If the argument isn't a string, the function cannot parse the string or * the values are invalid, it returns Invalid Date. * - * ### v2.0.0 breaking changes: - * - * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes). - * - * - The previous `parse` implementation was renamed to `parseISO`. - * - * ```javascript - * // Before v2.0.0 - * parse('2016-01-01') - * - * // v2.0.0 onward - * parseISO('2016-01-01') - * ``` - * - * - `parseISO` now validates separate date and time values in ISO-8601 strings - * and returns `Invalid Date` if the date is invalid. - * - * ```javascript - * parseISO('2018-13-32') - * //=> Invalid Date - * ``` - * - * - `parseISO` now doesn't fall back to `new Date` constructor - * if it fails to parse a string argument. Instead, it returns `Invalid Date`. - * * @param {String} argument - the value to convert * @param {Object} [options] - an object with options. * @param {0|1|2} [options.additionalDigits=2] - the additional number of digits in the extended year format * @returns {Date} the parsed date in the local time zone * @throws {TypeError} 1 argument required * @throws {RangeError} `options.additionalDigits` must be 0, 1 or 2 * * @example * // Convert string '2014-02-11T11:30:30' to date: - * var result = parseISO('2014-02-11T11:30:30') + * const result = parseISO('2014-02-11T11:30:30') * //=> Tue Feb 11 2014 11:30:30 * * @example * // Convert string '+02014101' to date, * // if the additional number of digits in the extended year format is 1: - * var result = parseISO('+02014101', { additionalDigits: 1 }) + * const result = parseISO('+02014101', { additionalDigits: 1 }) * //=> Fri Apr 11 2014 00:00:00 */ - function parseISO(argument, dirtyOptions) { + function parseISO(argument, options) { + var _options$additionalDi; requiredArgs(1, arguments); - var options = dirtyOptions || {}; - var additionalDigits = options.additionalDigits == null ? DEFAULT_ADDITIONAL_DIGITS : toInteger(options.additionalDigits); - + var additionalDigits = toInteger((_options$additionalDi = options === null || options === void 0 ? void 0 : options.additionalDigits) !== null && _options$additionalDi !== void 0 ? _options$additionalDi : 2); if (additionalDigits !== 2 && additionalDigits !== 1 && additionalDigits !== 0) { throw new RangeError('additionalDigits must be 0, 1 or 2'); } - if (!(typeof argument === 'string' || Object.prototype.toString.call(argument) === '[object String]')) { return new Date(NaN); } - var dateStrings = splitDateString(argument); var date; - if (dateStrings.date) { var parseYearResult = parseYear(dateStrings.date, additionalDigits); date = parseDate(parseYearResult.restDateString, parseYearResult.year); } - - if (isNaN(date) || !date) { + if (!date || isNaN(date.getTime())) { return new Date(NaN); } - var timestamp = date.getTime(); var time = 0; var offset; - if (dateStrings.time) { time = parseTime(dateStrings.time); - - if (isNaN(time) || time === null) { + if (isNaN(time)) { return new Date(NaN); } } - if (dateStrings.timezone) { offset = parseTimezone(dateStrings.timezone); - if (isNaN(offset)) { return new Date(NaN); } } else { var dirtyDate = new Date(timestamp + time); // js parsed string assuming it's in UTC timezone @@ -23351,172 +27004,151 @@ var result = new Date(0); result.setFullYear(dirtyDate.getUTCFullYear(), dirtyDate.getUTCMonth(), dirtyDate.getUTCDate()); result.setHours(dirtyDate.getUTCHours(), dirtyDate.getUTCMinutes(), dirtyDate.getUTCSeconds(), dirtyDate.getUTCMilliseconds()); return result; } - return new Date(timestamp + time + offset); } - + var patterns = { + dateTimeDelimiter: /[T ]/, + timeZoneDelimiter: /[Z ]/i, + timezone: /([Z+-].*)$/ + }; + var dateRegex = /^-?(?:(\d{3})|(\d{2})(?:-?(\d{2}))?|W(\d{2})(?:-?(\d{1}))?|)$/; + var timeRegex = /^(\d{2}(?:[.,]\d*)?)(?::?(\d{2}(?:[.,]\d*)?))?(?::?(\d{2}(?:[.,]\d*)?))?$/; + var timezoneRegex = /^([+-])(\d{2})(?::?(\d{2}))?$/; function splitDateString(dateString) { var dateStrings = {}; var array = dateString.split(patterns.dateTimeDelimiter); var timeString; // The regex match should only return at maximum two array elements. // [date], [time], or [date, time]. if (array.length > 2) { return dateStrings; } - if (/:/.test(array[0])) { - dateStrings.date = null; timeString = array[0]; } else { dateStrings.date = array[0]; timeString = array[1]; - if (patterns.timeZoneDelimiter.test(dateStrings.date)) { dateStrings.date = dateString.split(patterns.timeZoneDelimiter)[0]; timeString = dateString.substr(dateStrings.date.length, dateString.length); } } - if (timeString) { var token = patterns.timezone.exec(timeString); - if (token) { dateStrings.time = timeString.replace(token[1], ''); dateStrings.timezone = token[1]; } else { dateStrings.time = timeString; } } - return dateStrings; } - function parseYear(dateString, additionalDigits) { var regex = new RegExp('^(?:(\\d{4}|[+-]\\d{' + (4 + additionalDigits) + '})|(\\d{2}|[+-]\\d{' + (2 + additionalDigits) + '})$)'); var captures = dateString.match(regex); // Invalid ISO-formatted year if (!captures) return { - year: null + year: NaN, + restDateString: '' }; - var year = captures[1] && parseInt(captures[1]); - var century = captures[2] && parseInt(captures[2]); + var year = captures[1] ? parseInt(captures[1]) : null; + var century = captures[2] ? parseInt(captures[2]) : null; // either year or century is null, not both + return { - year: century == null ? year : century * 100, + year: century === null ? year : century * 100, restDateString: dateString.slice((captures[1] || captures[2]).length) }; } - function parseDate(dateString, year) { // Invalid ISO-formatted year - if (year === null) return null; + if (year === null) return new Date(NaN); var captures = dateString.match(dateRegex); // Invalid ISO-formatted string - if (!captures) return null; + if (!captures) return new Date(NaN); var isWeekDate = !!captures[4]; var dayOfYear = parseDateUnit(captures[1]); var month = parseDateUnit(captures[2]) - 1; var day = parseDateUnit(captures[3]); var week = parseDateUnit(captures[4]); var dayOfWeek = parseDateUnit(captures[5]) - 1; - if (isWeekDate) { if (!validateWeekDate(year, week, dayOfWeek)) { return new Date(NaN); } - return dayOfISOWeekYear(year, week, dayOfWeek); } else { var date = new Date(0); - if (!validateDate(year, month, day) || !validateDayOfYearDate(year, dayOfYear)) { return new Date(NaN); } - date.setUTCFullYear(year, month, Math.max(dayOfYear, day)); return date; } } - function parseDateUnit(value) { return value ? parseInt(value) : 1; } - function parseTime(timeString) { var captures = timeString.match(timeRegex); - if (!captures) return null; // Invalid ISO-formatted time + if (!captures) return NaN; // Invalid ISO-formatted time var hours = parseTimeUnit(captures[1]); var minutes = parseTimeUnit(captures[2]); var seconds = parseTimeUnit(captures[3]); - if (!validateTime(hours, minutes, seconds)) { return NaN; } - - return hours * MILLISECONDS_IN_HOUR + minutes * MILLISECONDS_IN_MINUTE + seconds * 1000; + return hours * millisecondsInHour + minutes * millisecondsInMinute + seconds * 1000; } - function parseTimeUnit(value) { return value && parseFloat(value.replace(',', '.')) || 0; } - function parseTimezone(timezoneString) { if (timezoneString === 'Z') return 0; var captures = timezoneString.match(timezoneRegex); if (!captures) return 0; var sign = captures[1] === '+' ? -1 : 1; var hours = parseInt(captures[2]); var minutes = captures[3] && parseInt(captures[3]) || 0; - if (!validateTimezone(hours, minutes)) { return NaN; } - - return sign * (hours * MILLISECONDS_IN_HOUR + minutes * MILLISECONDS_IN_MINUTE); + return sign * (hours * millisecondsInHour + minutes * millisecondsInMinute); } - function dayOfISOWeekYear(isoWeekYear, week, day) { var date = new Date(0); date.setUTCFullYear(isoWeekYear, 0, 4); var fourthOfJanuaryDay = date.getUTCDay() || 7; var diff = (week - 1) * 7 + day + 1 - fourthOfJanuaryDay; date.setUTCDate(date.getUTCDate() + diff); return date; } // Validation functions // February is null to handle the leap year (using ||) - var daysInMonths = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; - function isLeapYearIndex(year) { - return year % 400 === 0 || year % 4 === 0 && year % 100; + return year % 400 === 0 || year % 4 === 0 && year % 100 !== 0; } - function validateDate(year, month, date) { return month >= 0 && month <= 11 && date >= 1 && date <= (daysInMonths[month] || (isLeapYearIndex(year) ? 29 : 28)); } - function validateDayOfYearDate(year, dayOfYear) { return dayOfYear >= 1 && dayOfYear <= (isLeapYearIndex(year) ? 366 : 365); } - function validateWeekDate(_year, week, day) { return week >= 1 && week <= 53 && day >= 0 && day <= 6; } - function validateTime(hours, minutes, seconds) { if (hours === 24) { return minutes === 0 && seconds === 0; } - return seconds >= 0 && seconds < 60 && minutes >= 0 && minutes < 60 && hours >= 0 && hours < 25; } - function validateTimezone(_hours, minutes) { return minutes >= 0 && minutes <= 59; } var FORMATS = { @@ -23529,170 +27161,151 @@ week: 'PP', month: 'MMM yyyy', quarter: 'qqq - yyyy', year: 'yyyy' }; - adapters._date.override({ _id: 'date-fns', // DEBUG + formats: function formats() { return FORMATS; }, parse: function parse$1(value, fmt) { if (value === null || typeof value === 'undefined') { return null; } - - var type = _typeof(value); - + var type = _typeof$z(value); if (type === 'number' || value instanceof Date) { value = toDate(value); } else if (type === 'string') { if (typeof fmt === 'string') { value = parse(value, fmt, new Date(), this.options); } else { value = parseISO(value, this.options); } } - return isValid(value) ? value.getTime() : null; }, format: function format$1(time, fmt) { return format(time, fmt, this.options); }, add: function add(time, amount, unit) { switch (unit) { case 'millisecond': return addMilliseconds(time, amount); - case 'second': return addSeconds(time, amount); - case 'minute': return addMinutes(time, amount); - case 'hour': return addHours(time, amount); - case 'day': return addDays(time, amount); - case 'week': return addWeeks(time, amount); - case 'month': return addMonths(time, amount); - case 'quarter': return addQuarters(time, amount); - case 'year': return addYears(time, amount); - default: return time; } }, diff: function diff(max, min, unit) { switch (unit) { case 'millisecond': return differenceInMilliseconds(max, min); - case 'second': return differenceInSeconds(max, min); - case 'minute': return differenceInMinutes(max, min); - case 'hour': return differenceInHours(max, min); - case 'day': return differenceInDays(max, min); - case 'week': return differenceInWeeks(max, min); - case 'month': return differenceInMonths(max, min); - case 'quarter': return differenceInQuarters(max, min); - case 'year': return differenceInYears(max, min); - default: return 0; } }, startOf: function startOf(time, unit, weekday) { switch (unit) { case 'second': return startOfSecond(time); - case 'minute': return startOfMinute(time); - case 'hour': return startOfHour(time); - case 'day': return startOfDay(time); - case 'week': return startOfWeek(time); - case 'isoWeek': return startOfWeek(time, { weekStartsOn: +weekday }); - case 'month': return startOfMonth(time); - case 'quarter': return startOfQuarter(time); - case 'year': return startOfYear(time); - default: return time; } }, endOf: function endOf(time, unit) { switch (unit) { case 'second': return endOfSecond(time); - case 'minute': return endOfMinute(time); - case 'hour': return endOfHour(time); - case 'day': return endOfDay(time); - case 'week': return endOfWeek(time); - case 'month': return endOfMonth(time); - case 'quarter': return endOfQuarter(time); - case 'year': return endOfYear(time); - default: return time; } } }); + // for plugins + // match src/index.umd.ts in Chart.js + // except for platforms (not exported) + Chart.helpers = _objectSpread2({}, helpers); + Chart._adapters = adapters; + Chart.Animation = Animation; + Chart.Animations = Animations; + Chart.animator = animator; + Chart.controllers = registry.controllers.items; + Chart.DatasetController = DatasetController; + Chart.Element = Element; + Chart.elements = elements; + Chart.Interaction = Interaction; + Chart.layouts = layouts; + Chart.Scale = Scale; + Chart.Ticks = Ticks; + Object.assign(Chart, controllers, scales, elements, plugins); + Chart.Chart = Chart; + return Chart; -}))); +}));