@svar-ui/gantt-store 2.4.2 → 2.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../node_modules/@svar-ui/lib-state/dist/index.js","../src/helpers/sort.ts","../src/GanttDataTree.ts","../../node_modules/date-fns/toDate.mjs","../../node_modules/date-fns/constructFrom.mjs","../../node_modules/date-fns/addDays.mjs","../../node_modules/date-fns/addMonths.mjs","../../node_modules/date-fns/addMilliseconds.mjs","../../node_modules/date-fns/constants.mjs","../../node_modules/date-fns/addHours.mjs","../../node_modules/date-fns/_lib/defaultOptions.mjs","../../node_modules/date-fns/startOfWeek.mjs","../../node_modules/date-fns/startOfISOWeek.mjs","../../node_modules/date-fns/getISOWeekYear.mjs","../../node_modules/date-fns/startOfDay.mjs","../../node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.mjs","../../node_modules/date-fns/differenceInCalendarDays.mjs","../../node_modules/date-fns/startOfISOWeekYear.mjs","../../node_modules/date-fns/addMinutes.mjs","../../node_modules/date-fns/addQuarters.mjs","../../node_modules/date-fns/addWeeks.mjs","../../node_modules/date-fns/addYears.mjs","../../node_modules/date-fns/compareAsc.mjs","../../node_modules/date-fns/isSameDay.mjs","../../node_modules/date-fns/isDate.mjs","../../node_modules/date-fns/isValid.mjs","../../node_modules/date-fns/differenceInCalendarISOWeeks.mjs","../../node_modules/date-fns/differenceInCalendarMonths.mjs","../../node_modules/date-fns/differenceInCalendarYears.mjs","../../node_modules/date-fns/_lib/getRoundingMethod.mjs","../../node_modules/date-fns/differenceInMilliseconds.mjs","../../node_modules/date-fns/differenceInHours.mjs","../../node_modules/date-fns/differenceInMinutes.mjs","../../node_modules/date-fns/endOfDay.mjs","../../node_modules/date-fns/endOfMonth.mjs","../../node_modules/date-fns/isLastDayOfMonth.mjs","../../node_modules/date-fns/differenceInMonths.mjs","../../node_modules/date-fns/differenceInQuarters.mjs","../../node_modules/date-fns/differenceInYears.mjs","../../node_modules/date-fns/startOfQuarter.mjs","../../node_modules/date-fns/startOfMonth.mjs","../../node_modules/date-fns/endOfYear.mjs","../../node_modules/date-fns/startOfYear.mjs","../../node_modules/date-fns/endOfHour.mjs","../../node_modules/date-fns/endOfWeek.mjs","../../node_modules/date-fns/endOfQuarter.mjs","../../node_modules/date-fns/locale/en-US/_lib/formatDistance.mjs","../../node_modules/date-fns/locale/_lib/buildFormatLongFn.mjs","../../node_modules/date-fns/locale/en-US/_lib/formatLong.mjs","../../node_modules/date-fns/locale/en-US/_lib/formatRelative.mjs","../../node_modules/date-fns/locale/_lib/buildLocalizeFn.mjs","../../node_modules/date-fns/locale/en-US/_lib/localize.mjs","../../node_modules/date-fns/locale/_lib/buildMatchFn.mjs","../../node_modules/date-fns/locale/_lib/buildMatchPatternFn.mjs","../../node_modules/date-fns/locale/en-US/_lib/match.mjs","../../node_modules/date-fns/locale/en-US.mjs","../../node_modules/date-fns/getDayOfYear.mjs","../../node_modules/date-fns/getISOWeek.mjs","../../node_modules/date-fns/getWeekYear.mjs","../../node_modules/date-fns/startOfWeekYear.mjs","../../node_modules/date-fns/getWeek.mjs","../../node_modules/date-fns/_lib/addLeadingZeros.mjs","../../node_modules/date-fns/_lib/format/lightFormatters.mjs","../../node_modules/date-fns/_lib/format/formatters.mjs","../../node_modules/date-fns/_lib/format/longFormatters.mjs","../../node_modules/date-fns/_lib/protectedTokens.mjs","../../node_modules/date-fns/format.mjs","../../node_modules/date-fns/getDaysInMonth.mjs","../../node_modules/date-fns/isLeapYear.mjs","../../node_modules/date-fns/getDaysInYear.mjs","../../node_modules/date-fns/getISOWeeksInYear.mjs","../../node_modules/date-fns/isEqual.mjs","../../node_modules/date-fns/startOfHour.mjs","../../node_modules/date-fns/isSameWeek.mjs","../../node_modules/date-fns/isSameMonth.mjs","../../node_modules/date-fns/isSameQuarter.mjs","../../node_modules/date-fns/isSameYear.mjs","../src/time.ts","../src/scales.ts","../src/tasks.ts","../src/links.ts","../src/columns.ts","../src/helpers/actionHandlers.ts","../src/normalizeDates.ts","../src/DataStore.ts","../src/dom/scales.ts","../src/helpers/menuOptions.ts","../src/helpers/toolbarButtons.ts","../src/helpers/editorItems.ts","../src/taskTypes.ts"],"sourcesContent":["// src/helpers.ts\nvar iid = (/* @__PURE__ */ new Date()).valueOf();\nvar uid = () => iid++;\nfunction tempID() {\n return \"temp://\" + iid++;\n}\nfunction isTempID(v) {\n return typeof v === \"string\" && v.length === 20 && parseInt(v.substr(7)) > 1e12;\n}\nfunction isSameObject(left, right) {\n if (Object.keys(left).length !== Object.keys(right).length) return false;\n for (const key in right) {\n const v = left[key];\n const nv = right[key];\n if (!isSame(v, nv)) return false;\n }\n return true;\n}\nfunction isSame(v, nv) {\n const primitiveValue = typeof v === \"number\" || typeof v === \"string\" || typeof v === \"boolean\" || v === null;\n if (primitiveValue) return v === nv;\n if (typeof v !== typeof nv) return false;\n if ((v === null || nv === null) && v !== nv) return false;\n if (v instanceof Date && nv instanceof Date && v.getTime() !== nv.getTime())\n return false;\n if (typeof v === \"object\") {\n if (Array.isArray(v) && Array.isArray(nv)) {\n if (v.length !== nv.length) return false;\n for (let i = v.length - 1; i >= 0; i--) {\n if (!isSame(v[i], nv[i])) return false;\n }\n return true;\n } else {\n return isSameObject(v, nv);\n }\n }\n return v === nv;\n}\nfunction deepCopy(obj) {\n if (typeof obj !== \"object\") return obj;\n if (obj === null) return obj;\n if (obj instanceof Date) return new Date(obj);\n if (obj instanceof Array) return obj.map(deepCopy);\n const out = {};\n for (const key in obj) {\n out[key] = deepCopy(obj[key]);\n }\n return out;\n}\n\n// src/DataArray.ts\nvar _DataArray = class {\n constructor(raw) {\n this._data = raw;\n this._pool = /* @__PURE__ */ new Map();\n for (let i = 0; i < raw.length; i++) {\n const obj = raw[i];\n this._pool.set(obj.id, obj);\n }\n }\n add(raw) {\n raw = { id: uid(), ...raw };\n this._data.push(raw);\n this._pool.set(raw.id, raw);\n }\n update(id, raw) {\n const index = this._data.findIndex((link) => link.id == id);\n const old = this._data[index];\n const updated = { ...old, ...raw };\n this._data[index] = updated;\n this._pool.set(updated.id, updated);\n }\n remove(id) {\n this._data = this._data.filter((a) => a.id != id);\n this._pool.delete(id);\n }\n filter(cb) {\n this._data = this._data.filter((x) => {\n const check = cb(x);\n if (!check) this._pool.delete(x.id);\n return check;\n });\n }\n byId(id) {\n return this._pool.get(id);\n }\n map(cb) {\n return this._data.map(cb);\n }\n forEach(cb) {\n this._data.forEach(cb);\n }\n};\n\n// src/DataTree.ts\nvar DataTree = class {\n constructor(raw) {\n const top = {\n id: 0,\n $level: 0,\n data: [],\n parent: null\n };\n const items = /* @__PURE__ */ new Map();\n items.set(0, top);\n this._pool = items;\n if (raw && raw.length) this.parse(raw, 0);\n }\n parse(raw, parent) {\n const items = this._pool;\n for (let i = 0; i < raw.length; i++) {\n const obj = raw[i];\n obj.parent = obj.parent || parent;\n obj.data = null;\n items.set(obj.id, obj);\n }\n for (let i = 0; i < raw.length; i++) {\n const obj = raw[i];\n const temp = items.get(obj.parent);\n if (temp) {\n if (!temp.data) temp.data = [];\n temp.data.push(obj);\n }\n }\n const top = items.get(parent);\n this.setLevel(top, top.$level + 1, false);\n }\n add(raw, index) {\n const parent = this._pool.get(raw.parent || 0);\n raw.$level = parent.$level + 1;\n this._pool.set(raw.id, raw);\n if (parent.data) {\n if (index === -1) parent.data = [...parent.data, raw];\n else insertElement(parent, index, raw);\n } else parent.data = [raw];\n }\n addAfter(raw, after) {\n if (!after) {\n return this.add(raw, -1);\n }\n const node = this.byId(after);\n const parent = this.byId(node.parent);\n const index = indexById(parent, node.id) + 1;\n raw.parent = parent.id;\n raw.$level = parent.$level + 1;\n this.add(raw, index);\n }\n remove(id) {\n const obj = this._pool.get(id);\n this._remove(obj);\n const parent = this._pool.get(obj.parent);\n parent.data = parent.data.filter((a) => a.id != id);\n this._clearBranch(parent);\n }\n _remove(obj) {\n if (obj.data) {\n obj.data.forEach((i) => this._remove(i));\n }\n this._pool.delete(obj.id);\n }\n update(id, values) {\n let obj = this._pool.get(id);\n const branch = this._pool.get(obj.parent);\n const index = indexById(branch, obj.id);\n obj = { ...obj, ...values };\n if (branch && index >= 0) {\n branch.data[index] = obj;\n branch.data = [...branch.data];\n }\n this._pool.set(obj.id, obj);\n }\n move(id, mode, target) {\n const now = this._pool.get(id);\n const dropChild = mode === \"child\";\n const tobj = this._pool.get(target);\n const tLevel = tobj.$level + (dropChild ? 1 : 0);\n if (!now || !tobj) return;\n const parent = this._pool.get(now.parent);\n const newParent = dropChild ? tobj : this._pool.get(tobj.parent);\n if (!newParent.data) newParent.data = [];\n const index = indexById(parent, now.id);\n deleteElement(parent, index);\n const newIndex = dropChild ? newParent.data.length : indexById(newParent, tobj.id) + (mode === \"after\" ? 1 : 0);\n insertElement(newParent, newIndex, now);\n if (parent.id === newParent.id && index === newIndex) return null;\n now.parent = newParent.id;\n if (now.$level !== tLevel) {\n now.$level = tLevel;\n this.setLevel(now, tLevel + 1, true);\n }\n this.update(now.id, now);\n this._clearBranch(parent);\n }\n _clearBranch(obj) {\n if (obj.data && !obj.data.length) {\n if (obj.open) delete obj.open;\n this.update(obj.id, { data: null });\n }\n }\n toArray() {\n const out = [];\n const kids = this._pool.get(0).data;\n if (kids) toArray(kids, out);\n return out;\n }\n byId(id) {\n return this._pool.get(id);\n }\n getBranch(id) {\n return this._pool.get(id).data;\n }\n forEach(cb) {\n this._pool.forEach((value, key) => {\n if (key !== 0) cb(value);\n });\n }\n eachChild(cb, parent) {\n const p = this.byId(parent);\n if (!p || !p.data) return;\n p.data.forEach((child, index) => {\n cb(this.byId(child.id), index);\n this.eachChild(cb, child.id);\n });\n }\n setLevel(root, level, copy) {\n if (!root.data) return;\n root.data = root.data.map((child) => {\n if (copy) {\n child = { ...child };\n this._pool.set(child.id, child);\n }\n child.$level = level;\n if (child.data) this.setLevel(child, level + 1, copy);\n return child;\n });\n }\n};\nfunction toArray(line, out) {\n line.forEach((a) => {\n out.push(a);\n if (a.open === true) {\n toArray(a.data, out);\n }\n });\n}\nfunction deleteElement(obj, index) {\n const newData = [...obj.data];\n newData.splice(index, 1);\n obj.data = newData;\n}\nfunction insertElement(obj, index, item) {\n const newData = [...obj.data];\n newData.splice(index, 0, item);\n obj.data = newData;\n}\nfunction indexById(parentNode, id) {\n return parentNode?.data.findIndex(\n (child) => child.id === id\n );\n}\n\n// src/Store.ts\nvar STORE_SET_SILENT = 2;\nvar Store = class {\n constructor(config) {\n if (config) {\n this._writable = config.writable;\n this._async = config.async;\n }\n this._values = {};\n this._state = {};\n }\n setState(data, mode = 0) {\n const signals = {};\n this._wrapProperties(\n data,\n this._state,\n this._values,\n \"\",\n signals,\n mode\n );\n return signals;\n }\n getState() {\n return this._values;\n }\n getReactive() {\n return this._state;\n }\n _wrapProperties(data, state, values, parent, signals, mode) {\n for (const key in data) {\n const os = state[key];\n const ov = values[key];\n const nv = data[key];\n if (os) {\n if (ov === nv && typeof nv !== \"object\") continue;\n if (nv instanceof Date) {\n if (ov instanceof Date && ov.getTime() === nv.getTime()) continue;\n }\n }\n const fullKey = parent + (parent ? \".\" : \"\") + key;\n if (os) {\n if (os.__parse(nv, fullKey, signals, mode)) values[key] = nv;\n if (mode & STORE_SET_SILENT) signals[fullKey] = os.__trigger;\n else os.__trigger();\n } else {\n if (nv && nv.__reactive) {\n state[key] = this._wrapNested(nv, nv, fullKey, signals);\n } else {\n state[key] = this._wrapWritable(nv);\n }\n values[key] = nv;\n }\n signals[fullKey] = signals[fullKey] || null;\n }\n }\n _wrapNested(data, values, fullKey, signals) {\n const state = this._wrapWritable(data);\n this._wrapProperties(data, state, values, fullKey, signals, 0);\n state.__parse = (v, fullKey2, signals2, mode) => {\n this._wrapProperties(v, state, values, fullKey2, signals2, mode);\n return false;\n };\n return state;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _wrapWritable(val) {\n const ss = [];\n const __triggerSync = function() {\n for (let i = 0; i < ss.length; i++) {\n ss[i](val);\n }\n };\n const __trigger = () => {\n if (ss.length) {\n if (this._async) setTimeout(__triggerSync, 1);\n else __triggerSync();\n }\n };\n const subscribe = (fn) => {\n ss.push(fn);\n if (this._async) setTimeout(fn, 1, val);\n else fn(val);\n return () => {\n const i = ss.indexOf(fn);\n if (i >= 0) ss.splice(i, 1);\n };\n };\n const __parse = function(v) {\n val = v;\n return true;\n };\n return {\n subscribe,\n __trigger,\n __parse\n };\n }\n};\nfunction markReactive(t, nested) {\n Object.defineProperty(t, \"__reactive\", {\n value: true,\n enumerable: false,\n writable: false\n });\n if (nested === true) {\n for (const key in t) {\n const sub = t[key];\n if (typeof sub === \"object\" && sub !== null) {\n markReactive(sub, true);\n }\n }\n }\n return t;\n}\n\n// src/DataRouter.ts\nvar DataRouter = class {\n constructor(s, r, p, b) {\n if (typeof s === \"function\") this._setter = s;\n else this._setter = s.setState.bind(s);\n this._routes = r;\n this._parsers = p;\n this._prev = {};\n this._triggers = /* @__PURE__ */ new Map();\n this._sources = /* @__PURE__ */ new Map();\n this._routes.forEach((a) => {\n a.in.forEach((k) => {\n const arr = this._triggers.get(k) || [];\n arr.push(a);\n this._triggers.set(k, arr);\n });\n a.out.forEach((k) => {\n const h = this._sources.get(k) || {};\n a.in.forEach((i) => h[i] = true);\n this._sources.set(k, h);\n });\n });\n this._routes.forEach((a) => {\n a.length = Math.max(\n ...a.in.map((key) => _calckSize(key, this._sources, 1))\n );\n });\n this._bus = b;\n }\n init(cfg) {\n const next = {};\n for (const key in cfg) {\n if (this._prev[key] !== cfg[key]) {\n const parser = this._parsers[key];\n next[key] = parser ? parser(cfg[key]) : cfg[key];\n }\n }\n this._prev = this._prev ? { ...this._prev, ...cfg } : { ...cfg };\n this.setState(next);\n if (this._bus) this._bus.exec(\"init-state\", next);\n }\n setStateAsync(updates) {\n const signals = this._setter(updates, STORE_SET_SILENT);\n if (this._async) {\n Object.assign(this._async.signals, signals);\n } else {\n this._async = {\n signals,\n timer: setTimeout(this._applyState.bind(this), 1)\n };\n }\n return signals;\n }\n _applyState() {\n const obj = this._async;\n if (!obj) return;\n this._async = null;\n this._triggerUpdates(obj.signals, []);\n for (const key in obj.signals) {\n const h = obj.signals[key];\n if (h) h();\n }\n }\n setState(updates, ctx = []) {\n const signals = this._setter(updates);\n this._triggerUpdates(signals, ctx);\n return signals;\n }\n _triggerUpdates(signals, ctx) {\n const keys = Object.keys(signals);\n const needExec = !ctx.length;\n ctx = ctx || [];\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const trgs = this._triggers.get(key);\n if (trgs) {\n trgs.forEach((a) => {\n if (ctx.indexOf(a) == -1) {\n ctx.push(a);\n }\n });\n }\n }\n if (needExec) {\n this._execNext(ctx);\n }\n }\n _execNext(ctx) {\n while (ctx.length) {\n ctx.sort((a, b) => a.length < b.length ? 1 : -1);\n const next = ctx[ctx.length - 1];\n ctx.splice(ctx.length - 1);\n next.exec(ctx);\n }\n }\n};\nfunction _calckSize(key, sources, prev) {\n const next = sources.get(key);\n if (!next) return prev;\n const sizes = Object.keys(next).map((a) => _calckSize(a, sources, prev + 1));\n return Math.max(...sizes);\n}\n\n// src/EventBus.ts\nvar EventBus = class {\n constructor() {\n this._nextHandler = null;\n this._handlers = {};\n this._tag = /* @__PURE__ */ new WeakMap();\n this.exec = this.exec.bind(this);\n }\n on(name, handler, config) {\n let prev = this._handlers[name];\n if (!prev) {\n prev = this._handlers[name] = [handler];\n } else {\n if (config && config.intercept) prev.unshift(handler);\n else prev.push(handler);\n }\n if (config && config.tag) this._tag.set(handler, config.tag);\n }\n intercept(name, handler, config) {\n this.on(name, handler, { ...config, intercept: true });\n }\n detach(tag) {\n for (const key in this._handlers) {\n const stack = this._handlers[key];\n for (let i = stack.length - 1; i >= 0; i--) {\n if (this._tag.get(stack[i]) === tag) {\n stack.splice(i, 1);\n }\n }\n }\n }\n async exec(name, ev) {\n const stack = this._handlers[name];\n if (stack) {\n for (let i = 0; i < stack.length; i++) {\n const res = stack[i](ev);\n if (res === false) return;\n if (res && res.then) {\n const res2 = await res;\n if (res2 === false) return;\n }\n }\n }\n if (this._nextHandler) await this._nextHandler.exec(name, ev);\n return ev;\n }\n setNext(next) {\n return this._nextHandler = next;\n }\n};\n\n// src/EventResolver.ts\nvar EventResolver = class {\n constructor(key) {\n this._key = key;\n this._nextHandler = null;\n this.exec = this.exec.bind(this);\n }\n async exec(name, ev) {\n if (ev && ev[this._key]) await ev[this._key](ev);\n if (this._nextHandler) {\n await this._nextHandler.exec(name, ev);\n }\n return ev;\n }\n setNext(next) {\n return this._nextHandler = next;\n }\n};\n\n// src/EventBusRouter.ts\nvar EventBusRouter = class {\n constructor(dispatch) {\n this._nextHandler = null;\n this._dispatch = dispatch;\n this.exec = this.exec.bind(this);\n }\n async exec(name, ev) {\n this._dispatch(name, ev);\n if (this._nextHandler) await this._nextHandler.exec(name, ev);\n return ev;\n }\n setNext(next) {\n return this._nextHandler = next;\n }\n};\n\nexport { _DataArray as DataArray, DataRouter, DataTree, EventBus, EventBusRouter, EventResolver, Store, deepCopy, isSame, isTempID, markReactive, tempID, uid };\n//# sourceMappingURL=index.js.map\n//# sourceMappingURL=index.js.map","import type { IParsedTask, TSort, TSortValue } from \"../types\";\nfunction sortAsc(a: TSortValue, b: TSortValue): number {\n\tif (typeof a === \"string\")\n\t\treturn a.localeCompare(b as string, undefined, { numeric: true });\n\tif (typeof a === \"object\") return a.getTime() - (b as Date).getTime();\n\treturn ((a ?? 0) as number) - ((b ?? 0) as number);\n}\n\nfunction sortDesc(a: TSortValue, b: TSortValue): number {\n\tif (typeof a === \"string\")\n\t\treturn -a.localeCompare(b as string, undefined, { numeric: true });\n\tif (typeof b === \"object\") return b.getTime() - (a as Date).getTime();\n\treturn ((b ?? 0) as number) - ((a ?? 0) as number);\n}\n\nfunction sortBy({ key, order }: TSort) {\n\tconst sortMethod = order === \"asc\" ? sortAsc : sortDesc;\n\treturn (a: IParsedTask, b: IParsedTask) => sortMethod(a[key], b[key]);\n}\n\nfunction sortByMany(sortArray: TSort[]) {\n\tif (!sortArray || !sortArray.length) return;\n\n\tconst sorts = sortArray.map(s => sortBy(s));\n\tif (sortArray.length === 1) return sorts[0];\n\n\treturn function (a: IParsedTask, b: IParsedTask) {\n\t\tfor (let i = 0; i < sorts.length; i++) {\n\t\t\tconst res = sorts[i](a, b);\n\t\t\tif (res !== 0) return res;\n\t\t}\n\t\treturn 0;\n\t};\n}\n\nexport function sort(data: IParsedTask[], conf: TSort[]) {\n\treturn data.sort(sortByMany(conf));\n}\n","import { DataTree, tempID, TID } from \"@svar-ui/lib-state\";\nimport type { ITask, IParsedTask, TSort } from \"./types\";\nimport { sort } from \"./helpers/sort\";\n\nexport default class GanttDataTree extends DataTree<IParsedTask> {\n\tprivate _sort: TSort[];\n\n\tconstructor(tasks?: Partial<ITask>[]) {\n\t\tsuper();\n\t\tthis.parse(tasks, 0);\n\t}\n\tparse(tasks: Partial<ITask>[], parent: TID): void {\n\t\tif (!tasks || !tasks.length) return;\n\t\tconst preparedTasks = tasks.map(task =>\n\t\t\tthis.normalizeTask(task, tasks)\n\t\t);\n\t\tsuper.parse(preparedTasks as IParsedTask[], parent);\n\t\tif (this._sort) this.sortBranch(this._sort, parent);\n\t}\n\tgetBranch(id: TID) {\n\t\tconst task = this._pool.get(id);\n\n\t\treturn this._pool.get(task.parent || 0).data;\n\t}\n\tcontains(id: TID, target: TID): boolean {\n\t\tconst branch = this._pool.get(id).data;\n\t\tlet res = false;\n\t\tif (branch) {\n\t\t\tfor (let i = 0; i < branch.length; i++) {\n\t\t\t\tif (branch[i].id === target) {\n\t\t\t\t\tres = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (branch[i].data) {\n\t\t\t\t\tres = this.contains(branch[i].id, target);\n\t\t\t\t\tif (res) break;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn res;\n\t}\n\tgetIndexById(id: TID) {\n\t\treturn this.getBranch(id).findIndex(task => task.id === id);\n\t}\n\tadd(task: Partial<ITask>, index: number): IParsedTask {\n\t\tconst normalizedTask = this.normalizeTask(task);\n\t\tsuper.add(normalizedTask as IParsedTask, index);\n\n\t\treturn normalizedTask as IParsedTask;\n\t}\n\n\tcopy(taskObj: ITask, parent: TID, ind: number) {\n\t\tconst n = this.add({ ...taskObj, id: null, data: null, parent }, ind);\n\t\tlet ids: Array<TID[]> = [[taskObj.id, n.id]];\n\t\ttaskObj.data?.forEach((kid: ITask, i: number) => {\n\t\t\tconst kIds = this.copy(kid, n.id, i);\n\t\t\tids = ids.concat(kIds);\n\t\t});\n\t\treturn ids;\n\t}\n\n\tnormalizeTask(task: Partial<ITask>): ITask {\n\t\tconst id = task.id || tempID();\n\t\tconst parentId = task.parent || 0;\n\t\tconst text = task.text || \"\";\n\t\tconst type = task.type || \"task\";\n\t\tconst progress = task.progress || 0;\n\t\tconst details = task.details || \"\";\n\n\t\tconst res: ITask = {\n\t\t\t...task,\n\t\t\tid,\n\t\t\ttext,\n\t\t\tparent: parentId,\n\t\t\tprogress,\n\t\t\ttype,\n\t\t\tdetails,\n\t\t};\n\t\tif (task.segments) res.segments = task.segments.map(s => ({ ...s }));\n\n\t\tif (task.segments) res.segments = task.segments.map(s => ({ ...s }));\n\n\t\treturn res;\n\t}\n\n\tgetSummaryId(id: TID): TID | null;\n\tgetSummaryId(id: TID, all: true): TID[] | null;\n\tgetSummaryId(id: TID, all: boolean = false): TID | TID[] | null {\n\t\tconst task = this._pool.get(id);\n\t\tif (!task.parent) return null;\n\t\tconst parent = this._pool.get(task.parent);\n\t\tif (all) {\n\t\t\tlet currentId = id;\n\t\t\tlet parentId = this.getSummaryId(currentId);\n\t\t\tconst parents = [];\n\n\t\t\twhile (parentId) {\n\t\t\t\tcurrentId = parentId as TID;\n\t\t\t\tparents.push(parentId);\n\t\t\t\tparentId = this.getSummaryId(currentId);\n\t\t\t}\n\t\t\treturn parents as TID[];\n\t\t}\n\t\tif (parent.type === \"summary\") return parent.id;\n\t\treturn this.getSummaryId(parent.id);\n\t}\n\n\tsort(conf: TSort[]) {\n\t\tthis._sort = conf;\n\t\tif (conf) this.sortBranch(conf, 0);\n\t}\n\tsortBranch(conf: TSort[], parent?: TID) {\n\t\tconst data = this._pool.get(parent || 0).data;\n\t\tif (data) {\n\t\t\tsort(data, conf);\n\t\t\tdata.forEach(item => {\n\t\t\t\tthis.sortBranch(conf, item.id);\n\t\t\t});\n\t\t}\n\t}\n\tserialize() {\n\t\tconst out: Partial<ITask>[] = [];\n\t\tconst kids = this._pool.get(0).data;\n\t\tif (kids) toArray(kids, out);\n\t\treturn out;\n\t}\n}\n\nfunction toArray(line: Partial<ITask>[], out: Partial<ITask>[]): void {\n\tline.forEach(a => {\n\t\tout.push(a);\n\t\tif (a.data) toArray(a.data, out);\n\t});\n}\n","/**\n * @name toDate\n * @category Common Helpers\n * @summary Convert the given argument to an instance of Date.\n *\n * @description\n * Convert the given argument to an instance of Date.\n *\n * If the argument is an instance of Date, the function returns its clone.\n *\n * If the argument is a number, it is treated as a timestamp.\n *\n * If the argument is none of the above, the function returns Invalid Date.\n *\n * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param argument - The value to convert\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Clone the date:\n * const result = toDate(new Date(2014, 1, 11, 11, 30, 30))\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert the timestamp to date:\n * const result = toDate(1392098430000)\n * //=> Tue Feb 11 2014 11:30:30\n */\nexport function toDate(argument) {\n const argStr = Object.prototype.toString.call(argument);\n\n // Clone the date\n if (\n argument instanceof Date ||\n (typeof argument === \"object\" && argStr === \"[object Date]\")\n ) {\n // Prevent the date to lose the milliseconds when passed to new Date() in IE10\n return new argument.constructor(+argument);\n } else if (\n typeof argument === \"number\" ||\n argStr === \"[object Number]\" ||\n typeof argument === \"string\" ||\n argStr === \"[object String]\"\n ) {\n // TODO: Can we get rid of as?\n return new Date(argument);\n } else {\n // TODO: Can we get rid of as?\n return new Date(NaN);\n }\n}\n\n// Fallback for modularized imports:\nexport default toDate;\n","/**\n * @name constructFrom\n * @category Generic Helpers\n * @summary Constructs a date using the reference date and the value\n *\n * @description\n * The function constructs a new date using the constructor from the reference\n * date and the given value. It helps to build generic functions that accept\n * date extensions.\n *\n * It defaults to `Date` if the passed reference date is a number or a string.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The reference date to take constructor from\n * @param value - The value to create the date\n *\n * @returns Date initialized using the given date and value\n *\n * @example\n * import { constructFrom } from 'date-fns'\n *\n * // A function that clones a date preserving the original type\n * function cloneDate<DateType extends Date(date: DateType): DateType {\n * return constructFrom(\n * date, // Use contrustor from the given date\n * date.getTime() // Use the date value to create a new date\n * )\n * }\n */\nexport function constructFrom(date, value) {\n if (date instanceof Date) {\n return new date.constructor(value);\n } else {\n return new Date(value);\n }\n}\n\n// Fallback for modularized imports:\nexport default constructFrom;\n","import { toDate } from \"./toDate.mjs\";\nimport { constructFrom } from \"./constructFrom.mjs\";\n\n/**\n * @name addDays\n * @category Day Helpers\n * @summary Add the specified number of days to the given date.\n *\n * @description\n * Add the specified number of days to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to be changed\n * @param amount - The amount of days to be added.\n *\n * @returns The new date with the days added\n *\n * @example\n * // Add 10 days to 1 September 2014:\n * const result = addDays(new Date(2014, 8, 1), 10)\n * //=> Thu Sep 11 2014 00:00:00\n */\nexport function addDays(date, amount) {\n const _date = toDate(date);\n if (isNaN(amount)) return constructFrom(date, NaN);\n if (!amount) {\n // If 0 days, no-op to avoid changing times in the hour before end of DST\n return _date;\n }\n _date.setDate(_date.getDate() + amount);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default addDays;\n","import { toDate } from \"./toDate.mjs\";\nimport { constructFrom } from \"./constructFrom.mjs\";\n\n/**\n * @name addMonths\n * @category Month Helpers\n * @summary Add the specified number of months to the given date.\n *\n * @description\n * Add the specified number of months to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to be changed\n * @param amount - The amount of months to be added.\n *\n * @returns The new date with the months added\n *\n * @example\n * // Add 5 months to 1 September 2014:\n * const result = addMonths(new Date(2014, 8, 1), 5)\n * //=> Sun Feb 01 2015 00:00:00\n *\n * // Add one month to 30 January 2023:\n * const result = addMonths(new Date(2023, 0, 30), 1)\n * //=> Tue Feb 28 2023 00:00:00\n */\nexport function addMonths(date, amount) {\n const _date = toDate(date);\n if (isNaN(amount)) return constructFrom(date, NaN);\n if (!amount) {\n // If 0 months, no-op to avoid changing times in the hour before end of DST\n return _date;\n }\n const dayOfMonth = _date.getDate();\n\n // The JS Date object supports date math by accepting out-of-bounds values for\n // month, day, etc. For example, new Date(2020, 0, 0) returns 31 Dec 2019 and\n // new Date(2020, 13, 1) returns 1 Feb 2021. This is *almost* the behavior we\n // want except that dates will wrap around the end of a month, meaning that\n // new Date(2020, 13, 31) will return 3 Mar 2021 not 28 Feb 2021 as desired. So\n // we'll default to the end of the desired month by adding 1 to the desired\n // month and using a date of 0 to back up one day to the end of the desired\n // month.\n const endOfDesiredMonth = constructFrom(date, _date.getTime());\n endOfDesiredMonth.setMonth(_date.getMonth() + amount + 1, 0);\n const daysInMonth = endOfDesiredMonth.getDate();\n if (dayOfMonth >= daysInMonth) {\n // If we're already at the end of the month, then this is the correct date\n // and we're done.\n return endOfDesiredMonth;\n } else {\n // Otherwise, we now know that setting the original day-of-month value won't\n // cause an overflow, so set the desired day-of-month. Note that we can't\n // just set the date of `endOfDesiredMonth` because that object may have had\n // its time changed in the unusual case where where a DST transition was on\n // the last day of the month and its local time was in the hour skipped or\n // repeated next to a DST transition. So we use `date` instead which is\n // guaranteed to still have the original time.\n _date.setFullYear(\n endOfDesiredMonth.getFullYear(),\n endOfDesiredMonth.getMonth(),\n dayOfMonth,\n );\n return _date;\n }\n}\n\n// Fallback for modularized imports:\nexport default addMonths;\n","import { toDate } from \"./toDate.mjs\";\nimport { constructFrom } from \"./constructFrom.mjs\";\n\n/**\n * @name addMilliseconds\n * @category Millisecond Helpers\n * @summary Add the specified number of milliseconds to the given date.\n *\n * @description\n * Add the specified number of milliseconds to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to be changed\n * @param amount - The amount of milliseconds to be added.\n *\n * @returns The new date with the milliseconds added\n *\n * @example\n * // Add 750 milliseconds to 10 July 2014 12:45:30.000:\n * const result = addMilliseconds(new Date(2014, 6, 10, 12, 45, 30, 0), 750)\n * //=> Thu Jul 10 2014 12:45:30.750\n */\nexport function addMilliseconds(date, amount) {\n const timestamp = +toDate(date);\n return constructFrom(date, timestamp + amount);\n}\n\n// Fallback for modularized imports:\nexport default addMilliseconds;\n","/**\n * @module constants\n * @summary Useful constants\n * @description\n * Collection of useful date constants.\n *\n * The constants could be imported from `date-fns/constants`:\n *\n * ```ts\n * import { maxTime, minTime } from \"./constants/date-fns/constants\";\n *\n * function isAllowedTime(time) {\n * return time <= maxTime && time >= minTime;\n * }\n * ```\n */\n\n/**\n * @constant\n * @name daysInWeek\n * @summary Days in 1 week.\n */\nexport const daysInWeek = 7;\n\n/**\n * @constant\n * @name daysInYear\n * @summary Days in 1 year.\n *\n * @description\n * How many days in a year.\n *\n * One years equals 365.2425 days according to the formula:\n *\n * > Leap year occures every 4 years, except for years that are divisable by 100 and not divisable by 400.\n * > 1 mean year = (365+1/4-1/100+1/400) days = 365.2425 days\n */\nexport const daysInYear = 365.2425;\n\n/**\n * @constant\n * @name maxTime\n * @summary Maximum allowed time.\n *\n * @example\n * import { maxTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = 8640000000000001 <= maxTime;\n * //=> false\n *\n * new Date(8640000000000001);\n * //=> Invalid Date\n */\nexport const maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1000;\n\n/**\n * @constant\n * @name minTime\n * @summary Minimum allowed time.\n *\n * @example\n * import { minTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = -8640000000000001 >= minTime;\n * //=> false\n *\n * new Date(-8640000000000001)\n * //=> Invalid Date\n */\nexport const minTime = -maxTime;\n\n/**\n * @constant\n * @name millisecondsInWeek\n * @summary Milliseconds in 1 week.\n */\nexport const millisecondsInWeek = 604800000;\n\n/**\n * @constant\n * @name millisecondsInDay\n * @summary Milliseconds in 1 day.\n */\nexport const millisecondsInDay = 86400000;\n\n/**\n * @constant\n * @name millisecondsInMinute\n * @summary Milliseconds in 1 minute\n */\nexport const millisecondsInMinute = 60000;\n\n/**\n * @constant\n * @name millisecondsInHour\n * @summary Milliseconds in 1 hour\n */\nexport const millisecondsInHour = 3600000;\n\n/**\n * @constant\n * @name millisecondsInSecond\n * @summary Milliseconds in 1 second\n */\nexport const millisecondsInSecond = 1000;\n\n/**\n * @constant\n * @name minutesInYear\n * @summary Minutes in 1 year.\n */\nexport const minutesInYear = 525600;\n\n/**\n * @constant\n * @name minutesInMonth\n * @summary Minutes in 1 month.\n */\nexport const minutesInMonth = 43200;\n\n/**\n * @constant\n * @name minutesInDay\n * @summary Minutes in 1 day.\n */\nexport const minutesInDay = 1440;\n\n/**\n * @constant\n * @name minutesInHour\n * @summary Minutes in 1 hour.\n */\nexport const minutesInHour = 60;\n\n/**\n * @constant\n * @name monthsInQuarter\n * @summary Months in 1 quarter.\n */\nexport const monthsInQuarter = 3;\n\n/**\n * @constant\n * @name monthsInYear\n * @summary Months in 1 year.\n */\nexport const monthsInYear = 12;\n\n/**\n * @constant\n * @name quartersInYear\n * @summary Quarters in 1 year\n */\nexport const quartersInYear = 4;\n\n/**\n * @constant\n * @name secondsInHour\n * @summary Seconds in 1 hour.\n */\nexport const secondsInHour = 3600;\n\n/**\n * @constant\n * @name secondsInMinute\n * @summary Seconds in 1 minute.\n */\nexport const secondsInMinute = 60;\n\n/**\n * @constant\n * @name secondsInDay\n * @summary Seconds in 1 day.\n */\nexport const secondsInDay = secondsInHour * 24;\n\n/**\n * @constant\n * @name secondsInWeek\n * @summary Seconds in 1 week.\n */\nexport const secondsInWeek = secondsInDay * 7;\n\n/**\n * @constant\n * @name secondsInYear\n * @summary Seconds in 1 year.\n */\nexport const secondsInYear = secondsInDay * daysInYear;\n\n/**\n * @constant\n * @name secondsInMonth\n * @summary Seconds in 1 month\n */\nexport const secondsInMonth = secondsInYear / 12;\n\n/**\n * @constant\n * @name secondsInQuarter\n * @summary Seconds in 1 quarter.\n */\nexport const secondsInQuarter = secondsInMonth * 3;\n","import { addMilliseconds } from \"./addMilliseconds.mjs\";\nimport { millisecondsInHour } from \"./constants.mjs\";\n\n/**\n * @name addHours\n * @category Hour Helpers\n * @summary Add the specified number of hours to the given date.\n *\n * @description\n * Add the specified number of hours to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to be changed\n * @param amount - The amount of hours to be added.\n *\n * @returns The new date with the hours added\n *\n * @example\n * // Add 2 hours to 10 July 2014 23:00:00:\n * const result = addHours(new Date(2014, 6, 10, 23, 0), 2)\n * //=> Fri Jul 11 2014 01:00:00\n */\nexport function addHours(date, amount) {\n return addMilliseconds(date, amount * millisecondsInHour);\n}\n\n// Fallback for modularized imports:\nexport default addHours;\n","let defaultOptions = {};\n\nexport function getDefaultOptions() {\n return defaultOptions;\n}\n\nexport function setDefaultOptions(newOptions) {\n defaultOptions = newOptions;\n}\n","import { toDate } from \"./toDate.mjs\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.mjs\";\n\n/**\n * The {@link startOfWeek} function options.\n */\n\n/**\n * @name startOfWeek\n * @category Week Helpers\n * @summary Return the start of a week for the given date.\n *\n * @description\n * Return the start of a week for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week\n *\n * @example\n * // The start of a week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sun Aug 31 2014 00:00:00\n *\n * @example\n * // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfWeek(date, options) {\n const defaultOptions = getDefaultOptions();\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const _date = toDate(date);\n const day = _date.getDay();\n const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n\n _date.setDate(_date.getDate() - diff);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeek;\n","import { startOfWeek } from \"./startOfWeek.mjs\";\n\n/**\n * @name startOfISOWeek\n * @category ISO Week Helpers\n * @summary Return the start of an ISO week for the given date.\n *\n * @description\n * Return the start of an ISO week for the given date.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The start of an ISO week\n *\n * @example\n * // The start of an ISO week for 2 September 2014 11:55:00:\n * const result = startOfISOWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfISOWeek(date) {\n return startOfWeek(date, { weekStartsOn: 1 });\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeek;\n","import { constructFrom } from \"./constructFrom.mjs\";\nimport { startOfISOWeek } from \"./startOfISOWeek.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name getISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Get the ISO week-numbering year of the given date.\n *\n * @description\n * Get the ISO week-numbering year of the given date,\n * which always starts 3 days before the year's first Thursday.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n *\n * @returns The ISO week-numbering year\n *\n * @example\n * // Which ISO-week numbering year is 2 January 2005?\n * const result = getISOWeekYear(new Date(2005, 0, 2))\n * //=> 2004\n */\nexport function getISOWeekYear(date) {\n const _date = toDate(date);\n const year = _date.getFullYear();\n\n const fourthOfJanuaryOfNextYear = constructFrom(date, 0);\n fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);\n fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);\n\n const fourthOfJanuaryOfThisYear = constructFrom(date, 0);\n fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);\n fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);\n\n if (_date.getTime() >= startOfNextYear.getTime()) {\n return year + 1;\n } else if (_date.getTime() >= startOfThisYear.getTime()) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getISOWeekYear;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name startOfDay\n * @category Day Helpers\n * @summary Return the start of a day for the given date.\n *\n * @description\n * Return the start of a day for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The start of a day\n *\n * @example\n * // The start of a day for 2 September 2014 11:55:00:\n * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 00:00:00\n */\nexport function startOfDay(date) {\n const _date = toDate(date);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfDay;\n","import { toDate } from \"../toDate.mjs\";\n\n/**\n * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds.\n * They usually appear for dates that denote time before the timezones were introduced\n * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891\n * and GMT+01:00:00 after that date)\n *\n * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above,\n * which would lead to incorrect calculations.\n *\n * This function returns the timezone offset in milliseconds that takes seconds in account.\n */\nexport function getTimezoneOffsetInMilliseconds(date) {\n const _date = toDate(date);\n const utcDate = new Date(\n Date.UTC(\n _date.getFullYear(),\n _date.getMonth(),\n _date.getDate(),\n _date.getHours(),\n _date.getMinutes(),\n _date.getSeconds(),\n _date.getMilliseconds(),\n ),\n );\n utcDate.setUTCFullYear(_date.getFullYear());\n return +date - +utcDate;\n}\n","import { millisecondsInDay } from \"./constants.mjs\";\nimport { startOfDay } from \"./startOfDay.mjs\";\nimport { getTimezoneOffsetInMilliseconds } from \"./_lib/getTimezoneOffsetInMilliseconds.mjs\";\n\n/**\n * @name differenceInCalendarDays\n * @category Day Helpers\n * @summary Get the number of calendar days between the given dates.\n *\n * @description\n * Get the number of calendar days between the given dates. This means that the times are removed\n * from the dates and then the difference in days is calculated.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The later date\n * @param dateRight - The earlier date\n *\n * @returns The number of calendar days\n *\n * @example\n * // How many calendar days are between\n * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?\n * const result = differenceInCalendarDays(\n * new Date(2012, 6, 2, 0, 0),\n * new Date(2011, 6, 2, 23, 0)\n * )\n * //=> 366\n * // How many calendar days are between\n * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?\n * const result = differenceInCalendarDays(\n * new Date(2011, 6, 3, 0, 1),\n * new Date(2011, 6, 2, 23, 59)\n * )\n * //=> 1\n */\nexport function differenceInCalendarDays(dateLeft, dateRight) {\n const startOfDayLeft = startOfDay(dateLeft);\n const startOfDayRight = startOfDay(dateRight);\n\n const timestampLeft =\n +startOfDayLeft - getTimezoneOffsetInMilliseconds(startOfDayLeft);\n const timestampRight =\n +startOfDayRight - getTimezoneOffsetInMilliseconds(startOfDayRight);\n\n // Round the number of days to the nearest integer because the number of\n // milliseconds in a day is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round((timestampLeft - timestampRight) / millisecondsInDay);\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarDays;\n","import { getISOWeekYear } from \"./getISOWeekYear.mjs\";\nimport { startOfISOWeek } from \"./startOfISOWeek.mjs\";\nimport { constructFrom } from \"./constructFrom.mjs\";\n\n/**\n * @name startOfISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Return the start of an ISO week-numbering year for the given date.\n *\n * @description\n * Return the start of an ISO week-numbering year,\n * which always starts 3 days before the year's first Thursday.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The start of an ISO week-numbering year\n *\n * @example\n * // The start of an ISO week-numbering year for 2 July 2005:\n * const result = startOfISOWeekYear(new Date(2005, 6, 2))\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfISOWeekYear(date) {\n const year = getISOWeekYear(date);\n const fourthOfJanuary = constructFrom(date, 0);\n fourthOfJanuary.setFullYear(year, 0, 4);\n fourthOfJanuary.setHours(0, 0, 0, 0);\n return startOfISOWeek(fourthOfJanuary);\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeekYear;\n","import { addMilliseconds } from \"./addMilliseconds.mjs\";\nimport { millisecondsInMinute } from \"./constants.mjs\";\n\n/**\n * @name addMinutes\n * @category Minute Helpers\n * @summary Add the specified number of minutes to the given date.\n *\n * @description\n * Add the specified number of minutes to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to be changed\n * @param amount - The amount of minutes to be added.\n *\n * @returns The new date with the minutes added\n *\n * @example\n * // Add 30 minutes to 10 July 2014 12:00:00:\n * const result = addMinutes(new Date(2014, 6, 10, 12, 0), 30)\n * //=> Thu Jul 10 2014 12:30:00\n */\nexport function addMinutes(date, amount) {\n return addMilliseconds(date, amount * millisecondsInMinute);\n}\n\n// Fallback for modularized imports:\nexport default addMinutes;\n","import { addMonths } from \"./addMonths.mjs\";\n\n/**\n * @name addQuarters\n * @category Quarter Helpers\n * @summary Add the specified number of year quarters to the given date.\n *\n * @description\n * Add the specified number of year quarters to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to be changed\n * @param amount - The amount of quarters to be added.\n *\n * @returns The new date with the quarters added\n *\n * @example\n * // Add 1 quarter to 1 September 2014:\n * const result = addQuarters(new Date(2014, 8, 1), 1)\n * //=> Mon Dec 01 2014 00:00:00\n */\nexport function addQuarters(date, amount) {\n const months = amount * 3;\n return addMonths(date, months);\n}\n\n// Fallback for modularized imports:\nexport default addQuarters;\n","import { addDays } from \"./addDays.mjs\";\n\n/**\n * @name addWeeks\n * @category Week Helpers\n * @summary Add the specified number of weeks to the given date.\n *\n * @description\n * Add the specified number of week to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to be changed\n * @param amount - The amount of weeks to be added.\n *\n * @returns The new date with the weeks added\n *\n * @example\n * // Add 4 weeks to 1 September 2014:\n * const result = addWeeks(new Date(2014, 8, 1), 4)\n * //=> Mon Sep 29 2014 00:00:00\n */\nexport function addWeeks(date, amount) {\n const days = amount * 7;\n return addDays(date, days);\n}\n\n// Fallback for modularized imports:\nexport default addWeeks;\n","import { addMonths } from \"./addMonths.mjs\";\n\n/**\n * @name addYears\n * @category Year Helpers\n * @summary Add the specified number of years to the given date.\n *\n * @description\n * Add the specified number of years to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to be changed\n * @param amount - The amount of years to be added.\n *\n * @returns The new date with the years added\n *\n * @example\n * // Add 5 years to 1 September 2014:\n * const result = addYears(new Date(2014, 8, 1), 5)\n * //=> Sun Sep 01 2019 00:00:00\n */\nexport function addYears(date, amount) {\n return addMonths(date, amount * 12);\n}\n\n// Fallback for modularized imports:\nexport default addYears;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name compareAsc\n * @category Common Helpers\n * @summary Compare the two dates and return -1, 0 or 1.\n *\n * @description\n * Compare the two dates and return 1 if the first date is after the second,\n * -1 if the first date is before the second or 0 if dates are equal.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The first date to compare\n * @param dateRight - The second date to compare\n *\n * @returns The result of the comparison\n *\n * @example\n * // Compare 11 February 1987 and 10 July 1989:\n * const result = compareAsc(new Date(1987, 1, 11), new Date(1989, 6, 10))\n * //=> -1\n *\n * @example\n * // Sort the array of dates:\n * const result = [\n * new Date(1995, 6, 2),\n * new Date(1987, 1, 11),\n * new Date(1989, 6, 10)\n * ].sort(compareAsc)\n * //=> [\n * // Wed Feb 11 1987 00:00:00,\n * // Mon Jul 10 1989 00:00:00,\n * // Sun Jul 02 1995 00:00:00\n * // ]\n */\nexport function compareAsc(dateLeft, dateRight) {\n const _dateLeft = toDate(dateLeft);\n const _dateRight = toDate(dateRight);\n\n const diff = _dateLeft.getTime() - _dateRight.getTime();\n\n if (diff < 0) {\n return -1;\n } else if (diff > 0) {\n return 1;\n // Return 0 if diff is 0; return NaN if diff is NaN\n } else {\n return diff;\n }\n}\n\n// Fallback for modularized imports:\nexport default compareAsc;\n","import { startOfDay } from \"./startOfDay.mjs\";\n\n/**\n * @name isSameDay\n * @category Day Helpers\n * @summary Are the given dates in the same day (and year and month)?\n *\n * @description\n * Are the given dates in the same day (and year and month)?\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The first date to check\n * @param dateRight - The second date to check\n\n * @returns The dates are in the same day (and year and month)\n *\n * @example\n * // Are 4 September 06:00:00 and 4 September 18:00:00 in the same day?\n * const result = isSameDay(new Date(2014, 8, 4, 6, 0), new Date(2014, 8, 4, 18, 0))\n * //=> true\n *\n * @example\n * // Are 4 September and 4 October in the same day?\n * const result = isSameDay(new Date(2014, 8, 4), new Date(2014, 9, 4))\n * //=> false\n *\n * @example\n * // Are 4 September, 2014 and 4 September, 2015 in the same day?\n * const result = isSameDay(new Date(2014, 8, 4), new Date(2015, 8, 4))\n * //=> false\n */\nexport function isSameDay(dateLeft, dateRight) {\n const dateLeftStartOfDay = startOfDay(dateLeft);\n const dateRightStartOfDay = startOfDay(dateRight);\n\n return +dateLeftStartOfDay === +dateRightStartOfDay;\n}\n\n// Fallback for modularized imports:\nexport default isSameDay;\n","/**\n * @name isDate\n * @category Common Helpers\n * @summary Is the given value a date?\n *\n * @description\n * Returns true if the given value is an instance of Date. The function works for dates transferred across iframes.\n *\n * @param value - The value to check\n *\n * @returns True if the given value is a date\n *\n * @example\n * // For a valid date:\n * const result = isDate(new Date())\n * //=> true\n *\n * @example\n * // For an invalid date:\n * const result = isDate(new Date(NaN))\n * //=> true\n *\n * @example\n * // For some value:\n * const result = isDate('2014-02-31')\n * //=> false\n *\n * @example\n * // For an object:\n * const result = isDate({})\n * //=> false\n */\nexport function isDate(value) {\n return (\n value instanceof Date ||\n (typeof value === \"object\" &&\n Object.prototype.toString.call(value) === \"[object Date]\")\n );\n}\n\n// Fallback for modularized imports:\nexport default isDate;\n","import { isDate } from \"./isDate.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name isValid\n * @category Common Helpers\n * @summary Is the given date valid?\n *\n * @description\n * Returns false if argument is Invalid Date and true otherwise.\n * Argument is converted to Date using `toDate`. See [toDate](https://date-fns.org/docs/toDate)\n * Invalid Date is a Date, whose time value is NaN.\n *\n * Time value of Date: http://es5.github.io/#x15.9.1.1\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to check\n *\n * @returns The date is valid\n *\n * @example\n * // For the valid date:\n * const result = isValid(new Date(2014, 1, 31))\n * //=> true\n *\n * @example\n * // For the value, convertable into a date:\n * const result = isValid(1393804800000)\n * //=> true\n *\n * @example\n * // For the invalid date:\n * const result = isValid(new Date(''))\n * //=> false\n */\nexport function isValid(date) {\n if (!isDate(date) && typeof date !== \"number\") {\n return false;\n }\n const _date = toDate(date);\n return !isNaN(Number(_date));\n}\n\n// Fallback for modularized imports:\nexport default isValid;\n","import { millisecondsInWeek } from \"./constants.mjs\";\nimport { startOfISOWeek } from \"./startOfISOWeek.mjs\";\nimport { getTimezoneOffsetInMilliseconds } from \"./_lib/getTimezoneOffsetInMilliseconds.mjs\";\n\n/**\n * @name differenceInCalendarISOWeeks\n * @category ISO Week Helpers\n * @summary Get the number of calendar ISO weeks between the given dates.\n *\n * @description\n * Get the number of calendar ISO weeks between the given dates.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The later date\n * @param dateRight - The earlier date\n *\n * @returns The number of calendar ISO weeks\n *\n * @example\n * // How many calendar ISO weeks are between 6 July 2014 and 21 July 2014?\n * const result = differenceInCalendarISOWeeks(\n * new Date(2014, 6, 21),\n * new Date(2014, 6, 6)\n * )\n * //=> 3\n */\nexport function differenceInCalendarISOWeeks(dateLeft, dateRight) {\n const startOfISOWeekLeft = startOfISOWeek(dateLeft);\n const startOfISOWeekRight = startOfISOWeek(dateRight);\n\n const timestampLeft =\n +startOfISOWeekLeft - getTimezoneOffsetInMilliseconds(startOfISOWeekLeft);\n const timestampRight =\n +startOfISOWeekRight - getTimezoneOffsetInMilliseconds(startOfISOWeekRight);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round((timestampLeft - timestampRight) / millisecondsInWeek);\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarISOWeeks;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name differenceInCalendarMonths\n * @category Month Helpers\n * @summary Get the number of calendar months between the given dates.\n *\n * @description\n * Get the number of calendar months between the given dates.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The later date\n * @param dateRight - The earlier date\n *\n * @returns The number of calendar months\n *\n * @example\n * // How many calendar months are between 31 January 2014 and 1 September 2014?\n * const result = differenceInCalendarMonths(\n * new Date(2014, 8, 1),\n * new Date(2014, 0, 31)\n * )\n * //=> 8\n */\nexport function differenceInCalendarMonths(dateLeft, dateRight) {\n const _dateLeft = toDate(dateLeft);\n const _dateRight = toDate(dateRight);\n\n const yearDiff = _dateLeft.getFullYear() - _dateRight.getFullYear();\n const monthDiff = _dateLeft.getMonth() - _dateRight.getMonth();\n\n return yearDiff * 12 + monthDiff;\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarMonths;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name differenceInCalendarYears\n * @category Year Helpers\n * @summary Get the number of calendar years between the given dates.\n *\n * @description\n * Get the number of calendar years between the given dates.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The later date\n * @param dateRight - The earlier date\n\n * @returns The number of calendar years\n *\n * @example\n * // How many calendar years are between 31 December 2013 and 11 February 2015?\n * const result = differenceInCalendarYears(\n * new Date(2015, 1, 11),\n * new Date(2013, 11, 31)\n * )\n * //=> 2\n */\nexport function differenceInCalendarYears(dateLeft, dateRight) {\n const _dateLeft = toDate(dateLeft);\n const _dateRight = toDate(dateRight);\n\n return _dateLeft.getFullYear() - _dateRight.getFullYear();\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarYears;\n","export function getRoundingMethod(method) {\n return (number) => {\n const round = method ? Math[method] : Math.trunc;\n const result = round(number);\n // Prevent negative zero\n return result === 0 ? 0 : result;\n };\n}\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name differenceInMilliseconds\n * @category Millisecond Helpers\n * @summary Get the number of milliseconds between the given dates.\n *\n * @description\n * Get the number of milliseconds between the given dates.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The later date\n * @param dateRight - The earlier date\n *\n * @returns The number of milliseconds\n *\n * @example\n * // How many milliseconds are between\n * // 2 July 2014 12:30:20.600 and 2 July 2014 12:30:21.700?\n * const result = differenceInMilliseconds(\n * new Date(2014, 6, 2, 12, 30, 21, 700),\n * new Date(2014, 6, 2, 12, 30, 20, 600)\n * )\n * //=> 1100\n */\nexport function differenceInMilliseconds(dateLeft, dateRight) {\n return +toDate(dateLeft) - +toDate(dateRight);\n}\n\n// Fallback for modularized imports:\nexport default differenceInMilliseconds;\n","import { getRoundingMethod } from \"./_lib/getRoundingMethod.mjs\";\nimport { millisecondsInHour } from \"./constants.mjs\";\nimport { differenceInMilliseconds } from \"./differenceInMilliseconds.mjs\";\n\n/**\n * The {@link differenceInHours} function options.\n */\n\n/**\n * @name differenceInHours\n * @category Hour Helpers\n * @summary Get the number of hours between the given dates.\n *\n * @description\n * Get the number of hours between the given dates.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The later date\n * @param dateRight - The earlier date\n * @param options - An object with options.\n *\n * @returns The number of hours\n *\n * @example\n * // How many hours are between 2 July 2014 06:50:00 and 2 July 2014 19:00:00?\n * const result = differenceInHours(\n * new Date(2014, 6, 2, 19, 0),\n * new Date(2014, 6, 2, 6, 50)\n * )\n * //=> 12\n */\nexport function differenceInHours(dateLeft, dateRight, options) {\n const diff =\n differenceInMilliseconds(dateLeft, dateRight) / millisecondsInHour;\n return getRoundingMethod(options?.roundingMethod)(diff);\n}\n\n// Fallback for modularized imports:\nexport default differenceInHours;\n","import { getRoundingMethod } from \"./_lib/getRoundingMethod.mjs\";\nimport { millisecondsInMinute } from \"./constants.mjs\";\nimport { differenceInMilliseconds } from \"./differenceInMilliseconds.mjs\";\n\n/**\n * The {@link differenceInMinutes} function options.\n */\n\n/**\n * @name differenceInMinutes\n * @category Minute Helpers\n * @summary Get the number of minutes between the given dates.\n *\n * @description\n * Get the signed number of full (rounded towards 0) minutes between the given dates.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The later date\n * @param dateRight - The earlier date\n * @param options - An object with options.\n *\n * @returns The number of minutes\n *\n * @example\n * // How many minutes are between 2 July 2014 12:07:59 and 2 July 2014 12:20:00?\n * const result = differenceInMinutes(\n * new Date(2014, 6, 2, 12, 20, 0),\n * new Date(2014, 6, 2, 12, 7, 59)\n * )\n * //=> 12\n *\n * @example\n * // How many minutes are between 10:01:59 and 10:00:00\n * const result = differenceInMinutes(\n * new Date(2000, 0, 1, 10, 0, 0),\n * new Date(2000, 0, 1, 10, 1, 59)\n * )\n * //=> -1\n */\nexport function differenceInMinutes(dateLeft, dateRight, options) {\n const diff =\n differenceInMilliseconds(dateLeft, dateRight) / millisecondsInMinute;\n return getRoundingMethod(options?.roundingMethod)(diff);\n}\n\n// Fallback for modularized imports:\nexport default differenceInMinutes;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name endOfDay\n * @category Day Helpers\n * @summary Return the end of a day for the given date.\n *\n * @description\n * Return the end of a day for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The end of a day\n *\n * @example\n * // The end of a day for 2 September 2014 11:55:00:\n * const result = endOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 23:59:59.999\n */\nexport function endOfDay(date) {\n const _date = toDate(date);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfDay;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name endOfMonth\n * @category Month Helpers\n * @summary Return the end of a month for the given date.\n *\n * @description\n * Return the end of a month for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The end of a month\n *\n * @example\n * // The end of a month for 2 September 2014 11:55:00:\n * const result = endOfMonth(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 30 2014 23:59:59.999\n */\nexport function endOfMonth(date) {\n const _date = toDate(date);\n const month = _date.getMonth();\n _date.setFullYear(_date.getFullYear(), month + 1, 0);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfMonth;\n","import { endOfDay } from \"./endOfDay.mjs\";\nimport { endOfMonth } from \"./endOfMonth.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name isLastDayOfMonth\n * @category Month Helpers\n * @summary Is the given date the last day of a month?\n *\n * @description\n * Is the given date the last day of a month?\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to check\n\n * @returns The date is the last day of a month\n *\n * @example\n * // Is 28 February 2014 the last day of a month?\n * const result = isLastDayOfMonth(new Date(2014, 1, 28))\n * //=> true\n */\nexport function isLastDayOfMonth(date) {\n const _date = toDate(date);\n return +endOfDay(_date) === +endOfMonth(_date);\n}\n\n// Fallback for modularized imports:\nexport default isLastDayOfMonth;\n","import { compareAsc } from \"./compareAsc.mjs\";\nimport { differenceInCalendarMonths } from \"./differenceInCalendarMonths.mjs\";\nimport { isLastDayOfMonth } from \"./isLastDayOfMonth.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name differenceInMonths\n * @category Month Helpers\n * @summary Get the number of full months between the given dates.\n *\n * @description\n * Get the number of full months between the given dates using trunc as a default rounding method.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The later date\n * @param dateRight - The earlier date\n *\n * @returns The number of full months\n *\n * @example\n * // How many full months are between 31 January 2014 and 1 September 2014?\n * const result = differenceInMonths(new Date(2014, 8, 1), new Date(2014, 0, 31))\n * //=> 7\n */\nexport function differenceInMonths(dateLeft, dateRight) {\n const _dateLeft = toDate(dateLeft);\n const _dateRight = toDate(dateRight);\n\n const sign = compareAsc(_dateLeft, _dateRight);\n const difference = Math.abs(\n differenceInCalendarMonths(_dateLeft, _dateRight),\n );\n let result;\n\n // Check for the difference of less than month\n if (difference < 1) {\n result = 0;\n } else {\n if (_dateLeft.getMonth() === 1 && _dateLeft.getDate() > 27) {\n // This will check if the date is end of Feb and assign a higher end of month date\n // to compare it with Jan\n _dateLeft.setDate(30);\n }\n\n _dateLeft.setMonth(_dateLeft.getMonth() - sign * difference);\n\n // Math.abs(diff in full months - diff in calendar months) === 1 if last calendar month is not full\n // If so, result must be decreased by 1 in absolute value\n let isLastMonthNotFull = compareAsc(_dateLeft, _dateRight) === -sign;\n\n // Check for cases of one full calendar month\n if (\n isLastDayOfMonth(toDate(dateLeft)) &&\n difference === 1 &&\n compareAsc(dateLeft, _dateRight) === 1\n ) {\n isLastMonthNotFull = false;\n }\n\n result = sign * (difference - Number(isLastMonthNotFull));\n }\n\n // Prevent negative zero\n return result === 0 ? 0 : result;\n}\n\n// Fallback for modularized imports:\nexport default differenceInMonths;\n","import { getRoundingMethod } from \"./_lib/getRoundingMethod.mjs\";\nimport { differenceInMonths } from \"./differenceInMonths.mjs\";\n\n/**\n * The {@link differenceInQuarters} function options.\n */\n\n/**\n * @name differenceInQuarters\n * @category Quarter Helpers\n * @summary Get the number of quarters between the given dates.\n *\n * @description\n * Get the number of quarters between the given dates.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The later date\n * @param dateRight - The earlier date\n * @param options - An object with options.\n *\n * @returns The number of full quarters\n *\n * @example\n * // How many full quarters are between 31 December 2013 and 2 July 2014?\n * const result = differenceInQuarters(new Date(2014, 6, 2), new Date(2013, 11, 31))\n * //=> 2\n */\nexport function differenceInQuarters(dateLeft, dateRight, options) {\n const diff = differenceInMonths(dateLeft, dateRight) / 3;\n return getRoundingMethod(options?.roundingMethod)(diff);\n}\n\n// Fallback for modularized imports:\nexport default differenceInQuarters;\n","import { compareAsc } from \"./compareAsc.mjs\";\nimport { differenceInCalendarYears } from \"./differenceInCalendarYears.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name differenceInYears\n * @category Year Helpers\n * @summary Get the number of full years between the given dates.\n *\n * @description\n * Get the number of full years between the given dates.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The later date\n * @param dateRight - The earlier date\n *\n * @returns The number of full years\n *\n * @example\n * // How many full years are between 31 December 2013 and 11 February 2015?\n * const result = differenceInYears(new Date(2015, 1, 11), new Date(2013, 11, 31))\n * //=> 1\n */\nexport function differenceInYears(dateLeft, dateRight) {\n const _dateLeft = toDate(dateLeft);\n const _dateRight = toDate(dateRight);\n\n const sign = compareAsc(_dateLeft, _dateRight);\n const difference = Math.abs(differenceInCalendarYears(_dateLeft, _dateRight));\n\n // Set both dates to a valid leap year for accurate comparison when dealing\n // with leap days\n _dateLeft.setFullYear(1584);\n _dateRight.setFullYear(1584);\n\n // Math.abs(diff in full years - diff in calendar years) === 1 if last calendar year is not full\n // If so, result must be decreased by 1 in absolute value\n const isLastYearNotFull = compareAsc(_dateLeft, _dateRight) === -sign;\n const result = sign * (difference - +isLastYearNotFull);\n\n // Prevent negative zero\n return result === 0 ? 0 : result;\n}\n\n// Fallback for modularized imports:\nexport default differenceInYears;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name startOfQuarter\n * @category Quarter Helpers\n * @summary Return the start of a year quarter for the given date.\n *\n * @description\n * Return the start of a year quarter for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The start of a quarter\n *\n * @example\n * // The start of a quarter for 2 September 2014 11:55:00:\n * const result = startOfQuarter(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Jul 01 2014 00:00:00\n */\nexport function startOfQuarter(date) {\n const _date = toDate(date);\n const currentMonth = _date.getMonth();\n const month = currentMonth - (currentMonth % 3);\n _date.setMonth(month, 1);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfQuarter;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name startOfMonth\n * @category Month Helpers\n * @summary Return the start of a month for the given date.\n *\n * @description\n * Return the start of a month for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The start of a month\n *\n * @example\n * // The start of a month for 2 September 2014 11:55:00:\n * const result = startOfMonth(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfMonth(date) {\n const _date = toDate(date);\n _date.setDate(1);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfMonth;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name endOfYear\n * @category Year Helpers\n * @summary Return the end of a year for the given date.\n *\n * @description\n * Return the end of a year for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The end of a year\n *\n * @example\n * // The end of a year for 2 September 2014 11:55:00:\n * const result = endOfYear(new Date(2014, 8, 2, 11, 55, 00))\n * //=> Wed Dec 31 2014 23:59:59.999\n */\nexport function endOfYear(date) {\n const _date = toDate(date);\n const year = _date.getFullYear();\n _date.setFullYear(year + 1, 0, 0);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfYear;\n","import { toDate } from \"./toDate.mjs\";\nimport { constructFrom } from \"./constructFrom.mjs\";\n\n/**\n * @name startOfYear\n * @category Year Helpers\n * @summary Return the start of a year for the given date.\n *\n * @description\n * Return the start of a year for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The start of a year\n *\n * @example\n * // The start of a year for 2 September 2014 11:55:00:\n * const result = startOfYear(new Date(2014, 8, 2, 11, 55, 00))\n * //=> Wed Jan 01 2014 00:00:00\n */\nexport function startOfYear(date) {\n const cleanDate = toDate(date);\n const _date = constructFrom(date, 0);\n _date.setFullYear(cleanDate.getFullYear(), 0, 1);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfYear;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name endOfHour\n * @category Hour Helpers\n * @summary Return the end of an hour for the given date.\n *\n * @description\n * Return the end of an hour for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The end of an hour\n *\n * @example\n * // The end of an hour for 2 September 2014 11:55:00:\n * const result = endOfHour(new Date(2014, 8, 2, 11, 55))\n * //=> Tue Sep 02 2014 11:59:59.999\n */\nexport function endOfHour(date) {\n const _date = toDate(date);\n _date.setMinutes(59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfHour;\n","import { toDate } from \"./toDate.mjs\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.mjs\";\n\n/**\n * The {@link endOfWeek} function options.\n */\n\n/**\n * @name endOfWeek\n * @category Week Helpers\n * @summary Return the end of a week for the given date.\n *\n * @description\n * Return the end of a week for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The end of a week\n *\n * @example\n * // The end of a week for 2 September 2014 11:55:00:\n * const result = endOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sat Sep 06 2014 23:59:59.999\n *\n * @example\n * // If the week starts on Monday, the end of the week for 2 September 2014 11:55:00:\n * const result = endOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })\n * //=> Sun Sep 07 2014 23:59:59.999\n */\nexport function endOfWeek(date, options) {\n const defaultOptions = getDefaultOptions();\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const _date = toDate(date);\n const day = _date.getDay();\n const diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn);\n\n _date.setDate(_date.getDate() + diff);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfWeek;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name endOfQuarter\n * @category Quarter Helpers\n * @summary Return the end of a year quarter for the given date.\n *\n * @description\n * Return the end of a year quarter for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The end of a quarter\n *\n * @example\n * // The end of a quarter for 2 September 2014 11:55:00:\n * const result = endOfQuarter(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 30 2014 23:59:59.999\n */\nexport function endOfQuarter(date) {\n const _date = toDate(date);\n const currentMonth = _date.getMonth();\n const month = currentMonth - (currentMonth % 3) + 3;\n _date.setMonth(month, 0);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfQuarter;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"less than a second\",\n other: \"less than {{count}} seconds\",\n },\n\n xSeconds: {\n one: \"1 second\",\n other: \"{{count}} seconds\",\n },\n\n halfAMinute: \"half a minute\",\n\n lessThanXMinutes: {\n one: \"less than a minute\",\n other: \"less than {{count}} minutes\",\n },\n\n xMinutes: {\n one: \"1 minute\",\n other: \"{{count}} minutes\",\n },\n\n aboutXHours: {\n one: \"about 1 hour\",\n other: \"about {{count}} hours\",\n },\n\n xHours: {\n one: \"1 hour\",\n other: \"{{count}} hours\",\n },\n\n xDays: {\n one: \"1 day\",\n other: \"{{count}} days\",\n },\n\n aboutXWeeks: {\n one: \"about 1 week\",\n other: \"about {{count}} weeks\",\n },\n\n xWeeks: {\n one: \"1 week\",\n other: \"{{count}} weeks\",\n },\n\n aboutXMonths: {\n one: \"about 1 month\",\n other: \"about {{count}} months\",\n },\n\n xMonths: {\n one: \"1 month\",\n other: \"{{count}} months\",\n },\n\n aboutXYears: {\n one: \"about 1 year\",\n other: \"about {{count}} years\",\n },\n\n xYears: {\n one: \"1 year\",\n other: \"{{count}} years\",\n },\n\n overXYears: {\n one: \"over 1 year\",\n other: \"over {{count}} years\",\n },\n\n almostXYears: {\n one: \"almost 1 year\",\n other: \"almost {{count}} years\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", count.toString());\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"in \" + result;\n } else {\n return result + \" ago\";\n }\n }\n\n return result;\n};\n","export function buildFormatLongFn(args) {\n return (options = {}) => {\n // TODO: Remove String()\n const width = options.width ? String(options.width) : args.defaultWidth;\n const format = args.formats[width] || args.formats[args.defaultWidth];\n return format;\n };\n}\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.mjs\";\n\nconst dateFormats = {\n full: \"EEEE, MMMM do, y\",\n long: \"MMMM do, y\",\n medium: \"MMM d, y\",\n short: \"MM/dd/yyyy\",\n};\n\nconst timeFormats = {\n full: \"h:mm:ss a zzzz\",\n long: \"h:mm:ss a z\",\n medium: \"h:mm:ss a\",\n short: \"h:mm a\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} 'at' {{time}}\",\n long: \"{{date}} 'at' {{time}}\",\n medium: \"{{date}}, {{time}}\",\n short: \"{{date}}, {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","const formatRelativeLocale = {\n lastWeek: \"'last' eeee 'at' p\",\n yesterday: \"'yesterday at' p\",\n today: \"'today at' p\",\n tomorrow: \"'tomorrow at' p\",\n nextWeek: \"eeee 'at' p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n formatRelativeLocale[token];\n","/* eslint-disable no-unused-vars */\n\n/**\n * The localize function argument callback which allows to convert raw value to\n * the actual type.\n *\n * @param value - The value to convert\n *\n * @returns The converted value\n */\n\n/**\n * The map of localized values for each width.\n */\n\n/**\n * The index type of the locale unit value. It types conversion of units of\n * values that don't start at 0 (i.e. quarters).\n */\n\n/**\n * Converts the unit value to the tuple of values.\n */\n\n/**\n * The tuple of localized era values. The first element represents BC,\n * the second element represents AD.\n */\n\n/**\n * The tuple of localized quarter values. The first element represents Q1.\n */\n\n/**\n * The tuple of localized day values. The first element represents Sunday.\n */\n\n/**\n * The tuple of localized month values. The first element represents January.\n */\n\nexport function buildLocalizeFn(args) {\n return (value, options) => {\n const context = options?.context ? String(options.context) : \"standalone\";\n\n let valuesArray;\n if (context === \"formatting\" && args.formattingValues) {\n const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;\n const width = options?.width ? String(options.width) : defaultWidth;\n\n valuesArray =\n args.formattingValues[width] || args.formattingValues[defaultWidth];\n } else {\n const defaultWidth = args.defaultWidth;\n const width = options?.width ? String(options.width) : args.defaultWidth;\n\n valuesArray = args.values[width] || args.values[defaultWidth];\n }\n const index = args.argumentCallback ? args.argumentCallback(value) : value;\n\n // @ts-expect-error - 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!\n return valuesArray[index];\n };\n}\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.mjs\";\n\nconst eraValues = {\n narrow: [\"B\", \"A\"],\n abbreviated: [\"BC\", \"AD\"],\n wide: [\"Before Christ\", \"Anno Domini\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n wide: [\"1st quarter\", \"2nd quarter\", \"3rd quarter\", \"4th quarter\"],\n};\n\n// Note: in English, the names of days of the week and months are capitalized.\n// If you are making a new locale based on this one, check if the same is true for the language you're working on.\n// Generally, formatted dates should look like they are in the middle of a sentence,\n// e.g. in Spanish language the weekdays and months should be in the lowercase.\nconst monthValues = {\n narrow: [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n abbreviated: [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ],\n\n wide: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"],\n short: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"],\n abbreviated: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n wide: [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n ],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n};\n\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, _options) => {\n const number = Number(dirtyNumber);\n\n // If ordinal numbers depend on context, for example,\n // if they are different for different grammatical genders,\n // use `options.unit`.\n //\n // `unit` can be 'year', 'quarter', 'month', 'week', 'date', 'dayOfYear',\n // 'day', 'hour', 'minute', 'second'.\n\n const rem100 = number % 100;\n if (rem100 > 20 || rem100 < 10) {\n switch (rem100 % 10) {\n case 1:\n return number + \"st\";\n case 2:\n return number + \"nd\";\n case 3:\n return number + \"rd\";\n }\n }\n return number + \"th\";\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","export function buildMatchFn(args) {\n return (string, options = {}) => {\n const width = options.width;\n\n const matchPattern =\n (width && args.matchPatterns[width]) ||\n args.matchPatterns[args.defaultMatchWidth];\n const matchResult = string.match(matchPattern);\n\n if (!matchResult) {\n return null;\n }\n const matchedString = matchResult[0];\n\n const parsePatterns =\n (width && args.parsePatterns[width]) ||\n args.parsePatterns[args.defaultParseWidth];\n\n const key = Array.isArray(parsePatterns)\n ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString))\n : // eslint-disable-next-line @typescript-eslint/no-explicit-any -- I challange you to fix the type\n findKey(parsePatterns, (pattern) => pattern.test(matchedString));\n\n let value;\n\n value = args.valueCallback ? args.valueCallback(key) : key;\n value = options.valueCallback\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any -- I challange you to fix the type\n options.valueCallback(value)\n : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n\nfunction findKey(object, predicate) {\n for (const key in object) {\n if (\n Object.prototype.hasOwnProperty.call(object, key) &&\n predicate(object[key])\n ) {\n return key;\n }\n }\n return undefined;\n}\n\nfunction findIndex(array, predicate) {\n for (let key = 0; key < array.length; key++) {\n if (predicate(array[key])) {\n return key;\n }\n }\n return undefined;\n}\n","export function buildMatchPatternFn(args) {\n return (string, options = {}) => {\n const matchResult = string.match(args.matchPattern);\n if (!matchResult) return null;\n const matchedString = matchResult[0];\n\n const parseResult = string.match(args.parsePattern);\n if (!parseResult) return null;\n let value = args.valueCallback\n ? args.valueCallback(parseResult[0])\n : parseResult[0];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- I challange you to fix the type\n value = options.valueCallback ? options.valueCallback(value) : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.mjs\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.mjs\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(th|st|nd|rd)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(b|a)/i,\n abbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n wide: /^(before christ|before common era|anno domini|common era)/i,\n};\nconst parseEraPatterns = {\n any: [/^b/i, /^(a|c)/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234](th|st|nd|rd)? quarter/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,\n wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^j/i,\n /^f/i,\n /^m/i,\n /^a/i,\n /^m/i,\n /^j/i,\n /^j/i,\n /^a/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n\n any: [\n /^ja/i,\n /^f/i,\n /^mar/i,\n /^ap/i,\n /^may/i,\n /^jun/i,\n /^jul/i,\n /^au/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[smtwf]/i,\n short: /^(su|mo|tu|we|th|fr|sa)/i,\n abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,\n wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i,\n};\nconst parseDayPatterns = {\n narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],\n any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i],\n};\n\nconst matchDayPeriodPatterns = {\n narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,\n any: /^([ap]\\.?\\s?m\\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mi/i,\n noon: /^no/i,\n morning: /morning/i,\n afternoon: /afternoon/i,\n evening: /evening/i,\n night: /night/i,\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value, 10),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import { formatDistance } from \"./en-US/_lib/formatDistance.mjs\";\nimport { formatLong } from \"./en-US/_lib/formatLong.mjs\";\nimport { formatRelative } from \"./en-US/_lib/formatRelative.mjs\";\nimport { localize } from \"./en-US/_lib/localize.mjs\";\nimport { match } from \"./en-US/_lib/match.mjs\";\n\n/**\n * @category Locales\n * @summary English locale (United States).\n * @language English\n * @iso-639-2 eng\n * @author Sasha Koss [@kossnocorp](https://github.com/kossnocorp)\n * @author Lesha Koss [@leshakoss](https://github.com/leshakoss)\n */\nexport const enUS = {\n code: \"en-US\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 0 /* Sunday */,\n firstWeekContainsDate: 1,\n },\n};\n\n// Fallback for modularized imports:\nexport default enUS;\n","import { differenceInCalendarDays } from \"./differenceInCalendarDays.mjs\";\nimport { startOfYear } from \"./startOfYear.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name getDayOfYear\n * @category Day Helpers\n * @summary Get the day of the year of the given date.\n *\n * @description\n * Get the day of the year of the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n *\n * @returns The day of year\n *\n * @example\n * // Which day of the year is 2 July 2014?\n * const result = getDayOfYear(new Date(2014, 6, 2))\n * //=> 183\n */\nexport function getDayOfYear(date) {\n const _date = toDate(date);\n const diff = differenceInCalendarDays(_date, startOfYear(_date));\n const dayOfYear = diff + 1;\n return dayOfYear;\n}\n\n// Fallback for modularized imports:\nexport default getDayOfYear;\n","import { millisecondsInWeek } from \"./constants.mjs\";\nimport { startOfISOWeek } from \"./startOfISOWeek.mjs\";\nimport { startOfISOWeekYear } from \"./startOfISOWeekYear.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name getISOWeek\n * @category ISO Week Helpers\n * @summary Get the ISO week of the given date.\n *\n * @description\n * Get the ISO week of the given date.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n *\n * @returns The ISO week\n *\n * @example\n * // Which week of the ISO-week numbering year is 2 January 2005?\n * const result = getISOWeek(new Date(2005, 0, 2))\n * //=> 53\n */\nexport function getISOWeek(date) {\n const _date = toDate(date);\n const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getISOWeek;\n","import { constructFrom } from \"./constructFrom.mjs\";\nimport { startOfWeek } from \"./startOfWeek.mjs\";\nimport { toDate } from \"./toDate.mjs\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.mjs\";\n\n/**\n * The {@link getWeekYear} function options.\n */\n\n/**\n * @name getWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Get the local week-numbering year of the given date.\n *\n * @description\n * Get the local week-numbering year of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n * @param options - An object with options.\n *\n * @returns The local week-numbering year\n *\n * @example\n * // Which week numbering year is 26 December 2004 with the default settings?\n * const result = getWeekYear(new Date(2004, 11, 26))\n * //=> 2005\n *\n * @example\n * // Which week numbering year is 26 December 2004 if week starts on Saturday?\n * const result = getWeekYear(new Date(2004, 11, 26), { weekStartsOn: 6 })\n * //=> 2004\n *\n * @example\n * // Which week numbering year is 26 December 2004 if the first week contains 4 January?\n * const result = getWeekYear(new Date(2004, 11, 26), { firstWeekContainsDate: 4 })\n * //=> 2004\n */\nexport function getWeekYear(date, options) {\n const _date = toDate(date);\n const year = _date.getFullYear();\n\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const firstWeekOfNextYear = constructFrom(date, 0);\n firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);\n firstWeekOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfWeek(firstWeekOfNextYear, options);\n\n const firstWeekOfThisYear = constructFrom(date, 0);\n firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);\n firstWeekOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfWeek(firstWeekOfThisYear, options);\n\n if (_date.getTime() >= startOfNextYear.getTime()) {\n return year + 1;\n } else if (_date.getTime() >= startOfThisYear.getTime()) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getWeekYear;\n","import { constructFrom } from \"./constructFrom.mjs\";\nimport { getWeekYear } from \"./getWeekYear.mjs\";\nimport { startOfWeek } from \"./startOfWeek.mjs\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.mjs\";\n\n/**\n * The {@link startOfWeekYear} function options.\n */\n\n/**\n * @name startOfWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Return the start of a local week-numbering year for the given date.\n *\n * @description\n * Return the start of a local week-numbering year.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week-numbering year\n *\n * @example\n * // The start of an a week-numbering year for 2 July 2005 with default settings:\n * const result = startOfWeekYear(new Date(2005, 6, 2))\n * //=> Sun Dec 26 2004 00:00:00\n *\n * @example\n * // The start of a week-numbering year for 2 July 2005\n * // if Monday is the first day of week\n * // and 4 January is always in the first week of the year:\n * const result = startOfWeekYear(new Date(2005, 6, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfWeekYear(date, options) {\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const year = getWeekYear(date, options);\n const firstWeek = constructFrom(date, 0);\n firstWeek.setFullYear(year, 0, firstWeekContainsDate);\n firstWeek.setHours(0, 0, 0, 0);\n const _date = startOfWeek(firstWeek, options);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeekYear;\n","import { millisecondsInWeek } from \"./constants.mjs\";\nimport { startOfWeek } from \"./startOfWeek.mjs\";\nimport { startOfWeekYear } from \"./startOfWeekYear.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * The {@link getWeek} function options.\n */\n\n/**\n * @name getWeek\n * @category Week Helpers\n * @summary Get the local week index of the given date.\n *\n * @description\n * Get the local week index of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The week\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005 with default options?\n * const result = getWeek(new Date(2005, 0, 2))\n * //=> 2\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005,\n * // if Monday is the first day of the week,\n * // and the first week of the year always contains 4 January?\n * const result = getWeek(new Date(2005, 0, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> 53\n */\n\nexport function getWeek(date, options) {\n const _date = toDate(date);\n const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getWeek;\n","export function addLeadingZeros(number, targetLength) {\n const sign = number < 0 ? \"-\" : \"\";\n const output = Math.abs(number).toString().padStart(targetLength, \"0\");\n return sign + output;\n}\n","import { addLeadingZeros } from \"../addLeadingZeros.mjs\";\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | |\n * | d | Day of month | D | |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | m | Minute | M | Month |\n * | s | Second | S | Fraction of second |\n * | y | Year (abs) | Y | |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n */\n\nexport const lightFormatters = {\n // Year\n y(date, token) {\n // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_tokens\n // | Year | y | yy | yyy | yyyy | yyyyy |\n // |----------|-------|----|-------|-------|-------|\n // | AD 1 | 1 | 01 | 001 | 0001 | 00001 |\n // | AD 12 | 12 | 12 | 012 | 0012 | 00012 |\n // | AD 123 | 123 | 23 | 123 | 0123 | 00123 |\n // | AD 1234 | 1234 | 34 | 1234 | 1234 | 01234 |\n // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\n\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return addLeadingZeros(token === \"yy\" ? year % 100 : year, token.length);\n },\n\n // Month\n M(date, token) {\n const month = date.getMonth();\n return token === \"M\" ? String(month + 1) : addLeadingZeros(month + 1, 2);\n },\n\n // Day of the month\n d(date, token) {\n return addLeadingZeros(date.getDate(), token.length);\n },\n\n // AM or PM\n a(date, token) {\n const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return dayPeriodEnumValue.toUpperCase();\n case \"aaa\":\n return dayPeriodEnumValue;\n case \"aaaaa\":\n return dayPeriodEnumValue[0];\n case \"aaaa\":\n default:\n return dayPeriodEnumValue === \"am\" ? \"a.m.\" : \"p.m.\";\n }\n },\n\n // Hour [1-12]\n h(date, token) {\n return addLeadingZeros(date.getHours() % 12 || 12, token.length);\n },\n\n // Hour [0-23]\n H(date, token) {\n return addLeadingZeros(date.getHours(), token.length);\n },\n\n // Minute\n m(date, token) {\n return addLeadingZeros(date.getMinutes(), token.length);\n },\n\n // Second\n s(date, token) {\n return addLeadingZeros(date.getSeconds(), token.length);\n },\n\n // Fraction of second\n S(date, token) {\n const numberOfDigits = token.length;\n const milliseconds = date.getMilliseconds();\n const fractionalSeconds = Math.trunc(\n milliseconds * Math.pow(10, numberOfDigits - 3),\n );\n return addLeadingZeros(fractionalSeconds, token.length);\n },\n};\n","import { getDayOfYear } from \"../../getDayOfYear.mjs\";\nimport { getISOWeek } from \"../../getISOWeek.mjs\";\nimport { getISOWeekYear } from \"../../getISOWeekYear.mjs\";\nimport { getWeek } from \"../../getWeek.mjs\";\nimport { getWeekYear } from \"../../getWeekYear.mjs\";\nimport { addLeadingZeros } from \"../addLeadingZeros.mjs\";\nimport { lightFormatters } from \"./lightFormatters.mjs\";\n\nconst dayPeriodEnum = {\n am: \"am\",\n pm: \"pm\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n};\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | Milliseconds in day |\n * | b | AM, PM, noon, midnight | B | Flexible day period |\n * | c | Stand-alone local day of week | C* | Localized hour w/ day period |\n * | d | Day of month | D | Day of year |\n * | e | Local day of week | E | Day of week |\n * | f | | F* | Day of week in month |\n * | g* | Modified Julian day | G | Era |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | i! | ISO day of week | I! | ISO week of year |\n * | j* | Localized hour w/ day period | J* | Localized hour w/o day period |\n * | k | Hour [1-24] | K | Hour [0-11] |\n * | l* | (deprecated) | L | Stand-alone month |\n * | m | Minute | M | Month |\n * | n | | N | |\n * | o! | Ordinal number modifier | O | Timezone (GMT) |\n * | p! | Long localized time | P! | Long localized date |\n * | q | Stand-alone quarter | Q | Quarter |\n * | r* | Related Gregorian year | R! | ISO week-numbering year |\n * | s | Second | S | Fraction of second |\n * | t! | Seconds timestamp | T! | Milliseconds timestamp |\n * | u | Extended year | U* | Cyclic year |\n * | v* | Timezone (generic non-locat.) | V* | Timezone (location) |\n * | w | Local week of year | W* | Week of month |\n * | x | Timezone (ISO-8601 w/o Z) | X | Timezone (ISO-8601) |\n * | y | Year (abs) | Y | Local week-numbering year |\n * | z | Timezone (specific non-locat.) | Z* | Timezone (aliases) |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n *\n * Letters marked by ! are non-standard, but implemented by date-fns:\n * - `o` modifies the previous token to turn it into an ordinal (see `format` docs)\n * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n * i.e. 7 for Sunday, 1 for Monday, etc.\n * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n * `R` is supposed to be used in conjunction with `I` and `i`\n * for universal ISO week-numbering date, whereas\n * `Y` is supposed to be used in conjunction with `w` and `e`\n * for week-numbering date specific to the locale.\n * - `P` is long localized date format\n * - `p` is long localized time format\n */\n\nexport const formatters = {\n // Era\n G: function (date, token, localize) {\n const era = date.getFullYear() > 0 ? 1 : 0;\n switch (token) {\n // AD, BC\n case \"G\":\n case \"GG\":\n case \"GGG\":\n return localize.era(era, { width: \"abbreviated\" });\n // A, B\n case \"GGGGG\":\n return localize.era(era, { width: \"narrow\" });\n // Anno Domini, Before Christ\n case \"GGGG\":\n default:\n return localize.era(era, { width: \"wide\" });\n }\n },\n\n // Year\n y: function (date, token, localize) {\n // Ordinal number\n if (token === \"yo\") {\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return localize.ordinalNumber(year, { unit: \"year\" });\n }\n\n return lightFormatters.y(date, token);\n },\n\n // Local week-numbering year\n Y: function (date, token, localize, options) {\n const signedWeekYear = getWeekYear(date, options);\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;\n\n // Two digit year\n if (token === \"YY\") {\n const twoDigitYear = weekYear % 100;\n return addLeadingZeros(twoDigitYear, 2);\n }\n\n // Ordinal number\n if (token === \"Yo\") {\n return localize.ordinalNumber(weekYear, { unit: \"year\" });\n }\n\n // Padding\n return addLeadingZeros(weekYear, token.length);\n },\n\n // ISO week-numbering year\n R: function (date, token) {\n const isoWeekYear = getISOWeekYear(date);\n\n // Padding\n return addLeadingZeros(isoWeekYear, token.length);\n },\n\n // Extended year. This is a single number designating the year of this calendar system.\n // The main difference between `y` and `u` localizers are B.C. years:\n // | Year | `y` | `u` |\n // |------|-----|-----|\n // | AC 1 | 1 | 1 |\n // | BC 1 | 1 | 0 |\n // | BC 2 | 2 | -1 |\n // Also `yy` always returns the last two digits of a year,\n // while `uu` pads single digit years to 2 characters and returns other years unchanged.\n u: function (date, token) {\n const year = date.getFullYear();\n return addLeadingZeros(year, token.length);\n },\n\n // Quarter\n Q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"Q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"QQ\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"Qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"QQQ\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"QQQQQ\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"QQQQ\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone quarter\n q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"qq\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"qqq\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"qqqqq\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"qqqq\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // Month\n M: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n case \"M\":\n case \"MM\":\n return lightFormatters.M(date, token);\n // 1st, 2nd, ..., 12th\n case \"Mo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"MMM\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // J, F, ..., D\n case \"MMMMM\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // January, February, ..., December\n case \"MMMM\":\n default:\n return localize.month(month, { width: \"wide\", context: \"formatting\" });\n }\n },\n\n // Stand-alone month\n L: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n // 1, 2, ..., 12\n case \"L\":\n return String(month + 1);\n // 01, 02, ..., 12\n case \"LL\":\n return addLeadingZeros(month + 1, 2);\n // 1st, 2nd, ..., 12th\n case \"Lo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"LLL\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // J, F, ..., D\n case \"LLLLL\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // January, February, ..., December\n case \"LLLL\":\n default:\n return localize.month(month, { width: \"wide\", context: \"standalone\" });\n }\n },\n\n // Local week of year\n w: function (date, token, localize, options) {\n const week = getWeek(date, options);\n\n if (token === \"wo\") {\n return localize.ordinalNumber(week, { unit: \"week\" });\n }\n\n return addLeadingZeros(week, token.length);\n },\n\n // ISO week of year\n I: function (date, token, localize) {\n const isoWeek = getISOWeek(date);\n\n if (token === \"Io\") {\n return localize.ordinalNumber(isoWeek, { unit: \"week\" });\n }\n\n return addLeadingZeros(isoWeek, token.length);\n },\n\n // Day of the month\n d: function (date, token, localize) {\n if (token === \"do\") {\n return localize.ordinalNumber(date.getDate(), { unit: \"date\" });\n }\n\n return lightFormatters.d(date, token);\n },\n\n // Day of year\n D: function (date, token, localize) {\n const dayOfYear = getDayOfYear(date);\n\n if (token === \"Do\") {\n return localize.ordinalNumber(dayOfYear, { unit: \"dayOfYear\" });\n }\n\n return addLeadingZeros(dayOfYear, token.length);\n },\n\n // Day of week\n E: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n switch (token) {\n // Tue\n case \"E\":\n case \"EE\":\n case \"EEE\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"EEEEE\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"EEEEEE\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"EEEE\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Local day of week\n e: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (Nth day of week with current locale or weekStartsOn)\n case \"e\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"ee\":\n return addLeadingZeros(localDayOfWeek, 2);\n // 1st, 2nd, ..., 7th\n case \"eo\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"eee\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"eeeee\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"eeeeee\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"eeee\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone local day of week\n c: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (same as in `e`)\n case \"c\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"cc\":\n return addLeadingZeros(localDayOfWeek, token.length);\n // 1st, 2nd, ..., 7th\n case \"co\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"ccc\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // T\n case \"ccccc\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // Tu\n case \"cccccc\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"standalone\",\n });\n // Tuesday\n case \"cccc\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // ISO day of week\n i: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;\n switch (token) {\n // 2\n case \"i\":\n return String(isoDayOfWeek);\n // 02\n case \"ii\":\n return addLeadingZeros(isoDayOfWeek, token.length);\n // 2nd\n case \"io\":\n return localize.ordinalNumber(isoDayOfWeek, { unit: \"day\" });\n // Tue\n case \"iii\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"iiiii\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"iiiiii\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"iiii\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM or PM\n a: function (date, token, localize) {\n const hours = date.getHours();\n const dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"aaa\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"aaaaa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"aaaa\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM, PM, midnight, noon\n b: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours === 12) {\n dayPeriodEnumValue = dayPeriodEnum.noon;\n } else if (hours === 0) {\n dayPeriodEnumValue = dayPeriodEnum.midnight;\n } else {\n dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n }\n\n switch (token) {\n case \"b\":\n case \"bb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"bbb\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"bbbbb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"bbbb\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // in the morning, in the afternoon, in the evening, at night\n B: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours >= 17) {\n dayPeriodEnumValue = dayPeriodEnum.evening;\n } else if (hours >= 12) {\n dayPeriodEnumValue = dayPeriodEnum.afternoon;\n } else if (hours >= 4) {\n dayPeriodEnumValue = dayPeriodEnum.morning;\n } else {\n dayPeriodEnumValue = dayPeriodEnum.night;\n }\n\n switch (token) {\n case \"B\":\n case \"BB\":\n case \"BBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"BBBBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"BBBB\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Hour [1-12]\n h: function (date, token, localize) {\n if (token === \"ho\") {\n let hours = date.getHours() % 12;\n if (hours === 0) hours = 12;\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return lightFormatters.h(date, token);\n },\n\n // Hour [0-23]\n H: function (date, token, localize) {\n if (token === \"Ho\") {\n return localize.ordinalNumber(date.getHours(), { unit: \"hour\" });\n }\n\n return lightFormatters.H(date, token);\n },\n\n // Hour [0-11]\n K: function (date, token, localize) {\n const hours = date.getHours() % 12;\n\n if (token === \"Ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Hour [1-24]\n k: function (date, token, localize) {\n let hours = date.getHours();\n if (hours === 0) hours = 24;\n\n if (token === \"ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Minute\n m: function (date, token, localize) {\n if (token === \"mo\") {\n return localize.ordinalNumber(date.getMinutes(), { unit: \"minute\" });\n }\n\n return lightFormatters.m(date, token);\n },\n\n // Second\n s: function (date, token, localize) {\n if (token === \"so\") {\n return localize.ordinalNumber(date.getSeconds(), { unit: \"second\" });\n }\n\n return lightFormatters.s(date, token);\n },\n\n // Fraction of second\n S: function (date, token) {\n return lightFormatters.S(date, token);\n },\n\n // Timezone (ISO-8601. If offset is 0, output is always `'Z'`)\n X: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n if (timezoneOffset === 0) {\n return \"Z\";\n }\n\n switch (token) {\n // Hours and optional minutes\n case \"X\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XX`\n case \"XXXX\":\n case \"XX\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XXX`\n case \"XXXXX\":\n case \"XXX\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent)\n x: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Hours and optional minutes\n case \"x\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xx`\n case \"xxxx\":\n case \"xx\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xxx`\n case \"xxxxx\":\n case \"xxx\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (GMT)\n O: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"O\":\n case \"OO\":\n case \"OOO\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"OOOO\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (specific non-location)\n z: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"z\":\n case \"zz\":\n case \"zzz\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"zzzz\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Seconds timestamp\n t: function (date, token, _localize) {\n const timestamp = Math.trunc(date.getTime() / 1000);\n return addLeadingZeros(timestamp, token.length);\n },\n\n // Milliseconds timestamp\n T: function (date, token, _localize) {\n const timestamp = date.getTime();\n return addLeadingZeros(timestamp, token.length);\n },\n};\n\nfunction formatTimezoneShort(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = Math.trunc(absOffset / 60);\n const minutes = absOffset % 60;\n if (minutes === 0) {\n return sign + String(hours);\n }\n return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);\n}\n\nfunction formatTimezoneWithOptionalMinutes(offset, delimiter) {\n if (offset % 60 === 0) {\n const sign = offset > 0 ? \"-\" : \"+\";\n return sign + addLeadingZeros(Math.abs(offset) / 60, 2);\n }\n return formatTimezone(offset, delimiter);\n}\n\nfunction formatTimezone(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = addLeadingZeros(Math.trunc(absOffset / 60), 2);\n const minutes = addLeadingZeros(absOffset % 60, 2);\n return sign + hours + delimiter + minutes;\n}\n","const dateLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"P\":\n return formatLong.date({ width: \"short\" });\n case \"PP\":\n return formatLong.date({ width: \"medium\" });\n case \"PPP\":\n return formatLong.date({ width: \"long\" });\n case \"PPPP\":\n default:\n return formatLong.date({ width: \"full\" });\n }\n};\n\nconst timeLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"p\":\n return formatLong.time({ width: \"short\" });\n case \"pp\":\n return formatLong.time({ width: \"medium\" });\n case \"ppp\":\n return formatLong.time({ width: \"long\" });\n case \"pppp\":\n default:\n return formatLong.time({ width: \"full\" });\n }\n};\n\nconst dateTimeLongFormatter = (pattern, formatLong) => {\n const matchResult = pattern.match(/(P+)(p+)?/) || [];\n const datePattern = matchResult[1];\n const timePattern = matchResult[2];\n\n if (!timePattern) {\n return dateLongFormatter(pattern, formatLong);\n }\n\n let dateTimeFormat;\n\n switch (datePattern) {\n case \"P\":\n dateTimeFormat = formatLong.dateTime({ width: \"short\" });\n break;\n case \"PP\":\n dateTimeFormat = formatLong.dateTime({ width: \"medium\" });\n break;\n case \"PPP\":\n dateTimeFormat = formatLong.dateTime({ width: \"long\" });\n break;\n case \"PPPP\":\n default:\n dateTimeFormat = formatLong.dateTime({ width: \"full\" });\n break;\n }\n\n return dateTimeFormat\n .replace(\"{{date}}\", dateLongFormatter(datePattern, formatLong))\n .replace(\"{{time}}\", timeLongFormatter(timePattern, formatLong));\n};\n\nexport const longFormatters = {\n p: timeLongFormatter,\n P: dateTimeLongFormatter,\n};\n","const dayOfYearTokenRE = /^D+$/;\nconst weekYearTokenRE = /^Y+$/;\n\nconst throwTokens = [\"D\", \"DD\", \"YY\", \"YYYY\"];\n\nexport function isProtectedDayOfYearToken(token) {\n return dayOfYearTokenRE.test(token);\n}\n\nexport function isProtectedWeekYearToken(token) {\n return weekYearTokenRE.test(token);\n}\n\nexport function warnOrThrowProtectedError(token, format, input) {\n const _message = message(token, format, input);\n console.warn(_message);\n if (throwTokens.includes(token)) throw new RangeError(_message);\n}\n\nfunction message(token, format, input) {\n const subject = token[0] === \"Y\" ? \"years\" : \"days of the month\";\n return `Use \\`${token.toLowerCase()}\\` instead of \\`${token}\\` (in \\`${format}\\`) for formatting ${subject} to the input \\`${input}\\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`;\n}\n","import { defaultLocale } from \"./_lib/defaultLocale.mjs\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.mjs\";\nimport { formatters } from \"./_lib/format/formatters.mjs\";\nimport { longFormatters } from \"./_lib/format/longFormatters.mjs\";\nimport {\n isProtectedDayOfYearToken,\n isProtectedWeekYearToken,\n warnOrThrowProtectedError,\n} from \"./_lib/protectedTokens.mjs\";\nimport { isValid } from \"./isValid.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n// Rexports of internal for libraries to use.\n// See: https://github.com/date-fns/date-fns/issues/3638#issuecomment-1877082874\nexport { formatters, longFormatters };\n\n// This RegExp consists of three parts separated by `|`:\n// - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n// (one of the certain letters followed by `o`)\n// - (\\w)\\1* matches any sequences of the same letter\n// - '' matches two quote characters in a row\n// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n// except a single quote symbol, which ends the sequence.\n// Two quote characters do not end the sequence.\n// If there is no matching single quote\n// then the sequence will continue until the end of the string.\n// - . matches any single character unmatched by previous parts of the RegExps\nconst formattingTokensRegExp =\n /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g;\n\n// This RegExp catches symbols escaped by quotes, and also\n// sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\nconst longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\n\nconst escapedStringRegExp = /^'([^]*?)'?$/;\nconst doubleQuoteRegExp = /''/g;\nconst unescapedLatinCharacterRegExp = /[a-zA-Z]/;\n\nexport { format as formatDate };\n\n/**\n * The {@link format} function options.\n */\n\n/**\n * @name format\n * @alias formatDate\n * @category Common Helpers\n * @summary Format the date.\n *\n * @description\n * Return the formatted date string in the given format. The result may vary by locale.\n *\n * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.\n * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * The characters wrapped between two single quotes characters (') are escaped.\n * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n * (see the last example)\n *\n * Format of the string is based on Unicode Technical Standard #35:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * with a few additions (see note 7 below the table).\n *\n * Accepted patterns:\n * | Unit | Pattern | Result examples | Notes |\n * |---------------------------------|---------|-----------------------------------|-------|\n * | Era | G..GGG | AD, BC | |\n * | | GGGG | Anno Domini, Before Christ | 2 |\n * | | GGGGG | A, B | |\n * | Calendar year | y | 44, 1, 1900, 2017 | 5 |\n * | | yo | 44th, 1st, 0th, 17th | 5,7 |\n * | | yy | 44, 01, 00, 17 | 5 |\n * | | yyy | 044, 001, 1900, 2017 | 5 |\n * | | yyyy | 0044, 0001, 1900, 2017 | 5 |\n * | | yyyyy | ... | 3,5 |\n * | Local week-numbering year | Y | 44, 1, 1900, 2017 | 5 |\n * | | Yo | 44th, 1st, 1900th, 2017th | 5,7 |\n * | | YY | 44, 01, 00, 17 | 5,8 |\n * | | YYY | 044, 001, 1900, 2017 | 5 |\n * | | YYYY | 0044, 0001, 1900, 2017 | 5,8 |\n * | | YYYYY | ... | 3,5 |\n * | ISO week-numbering year | R | -43, 0, 1, 1900, 2017 | 5,7 |\n * | | RR | -43, 00, 01, 1900, 2017 | 5,7 |\n * | | RRR | -043, 000, 001, 1900, 2017 | 5,7 |\n * | | RRRR | -0043, 0000, 0001, 1900, 2017 | 5,7 |\n * | | RRRRR | ... | 3,5,7 |\n * | Extended year | u | -43, 0, 1, 1900, 2017 | 5 |\n * | | uu | -43, 01, 1900, 2017 | 5 |\n * | | uuu | -043, 001, 1900, 2017 | 5 |\n * | | uuuu | -0043, 0001, 1900, 2017 | 5 |\n * | | uuuuu | ... | 3,5 |\n * | Quarter (formatting) | Q | 1, 2, 3, 4 | |\n * | | Qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | QQ | 01, 02, 03, 04 | |\n * | | QQQ | Q1, Q2, Q3, Q4 | |\n * | | QQQQ | 1st quarter, 2nd quarter, ... | 2 |\n * | | QQQQQ | 1, 2, 3, 4 | 4 |\n * | Quarter (stand-alone) | q | 1, 2, 3, 4 | |\n * | | qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | qq | 01, 02, 03, 04 | |\n * | | qqq | Q1, Q2, Q3, Q4 | |\n * | | qqqq | 1st quarter, 2nd quarter, ... | 2 |\n * | | qqqqq | 1, 2, 3, 4 | 4 |\n * | Month (formatting) | M | 1, 2, ..., 12 | |\n * | | Mo | 1st, 2nd, ..., 12th | 7 |\n * | | MM | 01, 02, ..., 12 | |\n * | | MMM | Jan, Feb, ..., Dec | |\n * | | MMMM | January, February, ..., December | 2 |\n * | | MMMMM | J, F, ..., D | |\n * | Month (stand-alone) | L | 1, 2, ..., 12 | |\n * | | Lo | 1st, 2nd, ..., 12th | 7 |\n * | | LL | 01, 02, ..., 12 | |\n * | | LLL | Jan, Feb, ..., Dec | |\n * | | LLLL | January, February, ..., December | 2 |\n * | | LLLLL | J, F, ..., D | |\n * | Local week of year | w | 1, 2, ..., 53 | |\n * | | wo | 1st, 2nd, ..., 53th | 7 |\n * | | ww | 01, 02, ..., 53 | |\n * | ISO week of year | I | 1, 2, ..., 53 | 7 |\n * | | Io | 1st, 2nd, ..., 53th | 7 |\n * | | II | 01, 02, ..., 53 | 7 |\n * | Day of month | d | 1, 2, ..., 31 | |\n * | | do | 1st, 2nd, ..., 31st | 7 |\n * | | dd | 01, 02, ..., 31 | |\n * | Day of year | D | 1, 2, ..., 365, 366 | 9 |\n * | | Do | 1st, 2nd, ..., 365th, 366th | 7 |\n * | | DD | 01, 02, ..., 365, 366 | 9 |\n * | | DDD | 001, 002, ..., 365, 366 | |\n * | | DDDD | ... | 3 |\n * | Day of week (formatting) | E..EEE | Mon, Tue, Wed, ..., Sun | |\n * | | EEEE | Monday, Tuesday, ..., Sunday | 2 |\n * | | EEEEE | M, T, W, T, F, S, S | |\n * | | EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | ISO day of week (formatting) | i | 1, 2, 3, ..., 7 | 7 |\n * | | io | 1st, 2nd, ..., 7th | 7 |\n * | | ii | 01, 02, ..., 07 | 7 |\n * | | iii | Mon, Tue, Wed, ..., Sun | 7 |\n * | | iiii | Monday, Tuesday, ..., Sunday | 2,7 |\n * | | iiiii | M, T, W, T, F, S, S | 7 |\n * | | iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | 7 |\n * | Local day of week (formatting) | e | 2, 3, 4, ..., 1 | |\n * | | eo | 2nd, 3rd, ..., 1st | 7 |\n * | | ee | 02, 03, ..., 01 | |\n * | | eee | Mon, Tue, Wed, ..., Sun | |\n * | | eeee | Monday, Tuesday, ..., Sunday | 2 |\n * | | eeeee | M, T, W, T, F, S, S | |\n * | | eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | Local day of week (stand-alone) | c | 2, 3, 4, ..., 1 | |\n * | | co | 2nd, 3rd, ..., 1st | 7 |\n * | | cc | 02, 03, ..., 01 | |\n * | | ccc | Mon, Tue, Wed, ..., Sun | |\n * | | cccc | Monday, Tuesday, ..., Sunday | 2 |\n * | | ccccc | M, T, W, T, F, S, S | |\n * | | cccccc | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | AM, PM | a..aa | AM, PM | |\n * | | aaa | am, pm | |\n * | | aaaa | a.m., p.m. | 2 |\n * | | aaaaa | a, p | |\n * | AM, PM, noon, midnight | b..bb | AM, PM, noon, midnight | |\n * | | bbb | am, pm, noon, midnight | |\n * | | bbbb | a.m., p.m., noon, midnight | 2 |\n * | | bbbbb | a, p, n, mi | |\n * | Flexible day period | B..BBB | at night, in the morning, ... | |\n * | | BBBB | at night, in the morning, ... | 2 |\n * | | BBBBB | at night, in the morning, ... | |\n * | Hour [1-12] | h | 1, 2, ..., 11, 12 | |\n * | | ho | 1st, 2nd, ..., 11th, 12th | 7 |\n * | | hh | 01, 02, ..., 11, 12 | |\n * | Hour [0-23] | H | 0, 1, 2, ..., 23 | |\n * | | Ho | 0th, 1st, 2nd, ..., 23rd | 7 |\n * | | HH | 00, 01, 02, ..., 23 | |\n * | Hour [0-11] | K | 1, 2, ..., 11, 0 | |\n * | | Ko | 1st, 2nd, ..., 11th, 0th | 7 |\n * | | KK | 01, 02, ..., 11, 00 | |\n * | Hour [1-24] | k | 24, 1, 2, ..., 23 | |\n * | | ko | 24th, 1st, 2nd, ..., 23rd | 7 |\n * | | kk | 24, 01, 02, ..., 23 | |\n * | Minute | m | 0, 1, ..., 59 | |\n * | | mo | 0th, 1st, ..., 59th | 7 |\n * | | mm | 00, 01, ..., 59 | |\n * | Second | s | 0, 1, ..., 59 | |\n * | | so | 0th, 1st, ..., 59th | 7 |\n * | | ss | 00, 01, ..., 59 | |\n * | Fraction of second | S | 0, 1, ..., 9 | |\n * | | SS | 00, 01, ..., 99 | |\n * | | SSS | 000, 001, ..., 999 | |\n * | | SSSS | ... | 3 |\n * | Timezone (ISO-8601 w/ Z) | X | -08, +0530, Z | |\n * | | XX | -0800, +0530, Z | |\n * | | XXX | -08:00, +05:30, Z | |\n * | | XXXX | -0800, +0530, Z, +123456 | 2 |\n * | | XXXXX | -08:00, +05:30, Z, +12:34:56 | |\n * | Timezone (ISO-8601 w/o Z) | x | -08, +0530, +00 | |\n * | | xx | -0800, +0530, +0000 | |\n * | | xxx | -08:00, +05:30, +00:00 | 2 |\n * | | xxxx | -0800, +0530, +0000, +123456 | |\n * | | xxxxx | -08:00, +05:30, +00:00, +12:34:56 | |\n * | Timezone (GMT) | O...OOO | GMT-8, GMT+5:30, GMT+0 | |\n * | | OOOO | GMT-08:00, GMT+05:30, GMT+00:00 | 2 |\n * | Timezone (specific non-locat.) | z...zzz | GMT-8, GMT+5:30, GMT+0 | 6 |\n * | | zzzz | GMT-08:00, GMT+05:30, GMT+00:00 | 2,6 |\n * | Seconds timestamp | t | 512969520 | 7 |\n * | | tt | ... | 3,7 |\n * | Milliseconds timestamp | T | 512969520900 | 7 |\n * | | TT | ... | 3,7 |\n * | Long localized date | P | 04/29/1453 | 7 |\n * | | PP | Apr 29, 1453 | 7 |\n * | | PPP | April 29th, 1453 | 7 |\n * | | PPPP | Friday, April 29th, 1453 | 2,7 |\n * | Long localized time | p | 12:00 AM | 7 |\n * | | pp | 12:00:00 AM | 7 |\n * | | ppp | 12:00:00 AM GMT+2 | 7 |\n * | | pppp | 12:00:00 AM GMT+02:00 | 2,7 |\n * | Combination of date and time | Pp | 04/29/1453, 12:00 AM | 7 |\n * | | PPpp | Apr 29, 1453, 12:00:00 AM | 7 |\n * | | PPPppp | April 29th, 1453 at ... | 7 |\n * | | PPPPpppp| Friday, April 29th, 1453 at ... | 2,7 |\n * Notes:\n * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n * are the same as \"stand-alone\" units, but are different in some languages.\n * \"Formatting\" units are declined according to the rules of the language\n * in the context of a date. \"Stand-alone\" units are always nominative singular:\n *\n * `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n *\n * `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n *\n * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n * the single quote characters (see below).\n * If the sequence is longer than listed in table (e.g. `EEEEEEEEEEE`)\n * the output will be the same as default pattern for this unit, usually\n * the longest one (in case of ISO weekdays, `EEEE`). Default patterns for units\n * are marked with \"2\" in the last column of the table.\n *\n * `format(new Date(2017, 10, 6), 'MMM') //=> 'Nov'`\n *\n * `format(new Date(2017, 10, 6), 'MMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMM') //=> 'N'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMMM') //=> 'November'`\n *\n * 3. Some patterns could be unlimited length (such as `yyyyyyyy`).\n * The output will be padded with zeros to match the length of the pattern.\n *\n * `format(new Date(2017, 10, 6), 'yyyyyyyy') //=> '00002017'`\n *\n * 4. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n * These tokens represent the shortest form of the quarter.\n *\n * 5. The main difference between `y` and `u` patterns are B.C. years:\n *\n * | Year | `y` | `u` |\n * |------|-----|-----|\n * | AC 1 | 1 | 1 |\n * | BC 1 | 1 | 0 |\n * | BC 2 | 2 | -1 |\n *\n * Also `yy` always returns the last two digits of a year,\n * while `uu` pads single digit years to 2 characters and returns other years unchanged:\n *\n * | Year | `yy` | `uu` |\n * |------|------|------|\n * | 1 | 01 | 01 |\n * | 14 | 14 | 14 |\n * | 376 | 76 | 376 |\n * | 1453 | 53 | 1453 |\n *\n * The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n * except local week-numbering years are dependent on `options.weekStartsOn`\n * and `options.firstWeekContainsDate` (compare [getISOWeekYear](https://date-fns.org/docs/getISOWeekYear)\n * and [getWeekYear](https://date-fns.org/docs/getWeekYear)).\n *\n * 6. Specific non-location timezones are currently unavailable in `date-fns`,\n * so right now these tokens fall back to GMT timezones.\n *\n * 7. These patterns are not in the Unicode Technical Standard #35:\n * - `i`: ISO day of week\n * - `I`: ISO week of year\n * - `R`: ISO week-numbering year\n * - `t`: seconds timestamp\n * - `T`: milliseconds timestamp\n * - `o`: ordinal number modifier\n * - `P`: long localized date\n * - `p`: long localized time\n *\n * 8. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.\n * You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 9. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.\n * You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n * @param format - The string of tokens\n * @param options - An object with options\n *\n * @returns The formatted date string\n *\n * @throws `date` must not be Invalid Date\n * @throws `options.locale` must contain `localize` property\n * @throws `options.locale` must contain `formatLong` property\n * @throws 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\n * @throws 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\n * @throws 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\n * @throws 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\n * @throws format string contains an unescaped latin alphabet character\n *\n * @example\n * // Represent 11 February 2014 in middle-endian format:\n * const result = format(new Date(2014, 1, 11), 'MM/dd/yyyy')\n * //=> '02/11/2014'\n *\n * @example\n * // Represent 2 July 2014 in Esperanto:\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = format(new Date(2014, 6, 2), \"do 'de' MMMM yyyy\", {\n * locale: eoLocale\n * })\n * //=> '2-a de julio 2014'\n *\n * @example\n * // Escape string by single quote characters:\n * const result = format(new Date(2014, 6, 2, 15), \"h 'o''clock'\")\n * //=> \"3 o'clock\"\n */\nexport function format(date, formatStr, options) {\n const defaultOptions = getDefaultOptions();\n const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;\n\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const originalDate = toDate(date);\n\n if (!isValid(originalDate)) {\n throw new RangeError(\"Invalid time value\");\n }\n\n let parts = formatStr\n .match(longFormattingTokensRegExp)\n .map((substring) => {\n const firstCharacter = substring[0];\n if (firstCharacter === \"p\" || firstCharacter === \"P\") {\n const longFormatter = longFormatters[firstCharacter];\n return longFormatter(substring, locale.formatLong);\n }\n return substring;\n })\n .join(\"\")\n .match(formattingTokensRegExp)\n .map((substring) => {\n // Replace two single quote characters with one single quote character\n if (substring === \"''\") {\n return { isToken: false, value: \"'\" };\n }\n\n const firstCharacter = substring[0];\n if (firstCharacter === \"'\") {\n return { isToken: false, value: cleanEscapedString(substring) };\n }\n\n if (formatters[firstCharacter]) {\n return { isToken: true, value: substring };\n }\n\n if (firstCharacter.match(unescapedLatinCharacterRegExp)) {\n throw new RangeError(\n \"Format string contains an unescaped latin alphabet character `\" +\n firstCharacter +\n \"`\",\n );\n }\n\n return { isToken: false, value: substring };\n });\n\n // invoke localize preprocessor (only for french locales at the moment)\n if (locale.localize.preprocessor) {\n parts = locale.localize.preprocessor(originalDate, parts);\n }\n\n const formatterOptions = {\n firstWeekContainsDate,\n weekStartsOn,\n locale,\n };\n\n return parts\n .map((part) => {\n if (!part.isToken) return part.value;\n\n const token = part.value;\n\n if (\n (!options?.useAdditionalWeekYearTokens &&\n isProtectedWeekYearToken(token)) ||\n (!options?.useAdditionalDayOfYearTokens &&\n isProtectedDayOfYearToken(token))\n ) {\n warnOrThrowProtectedError(token, formatStr, String(date));\n }\n\n const formatter = formatters[token[0]];\n return formatter(originalDate, token, locale.localize, formatterOptions);\n })\n .join(\"\");\n}\n\nfunction cleanEscapedString(input) {\n const matched = input.match(escapedStringRegExp);\n\n if (!matched) {\n return input;\n }\n\n return matched[1].replace(doubleQuoteRegExp, \"'\");\n}\n\n// Fallback for modularized imports:\nexport default format;\n","import { toDate } from \"./toDate.mjs\";\nimport { constructFrom } from \"./constructFrom.mjs\";\n\n/**\n * @name getDaysInMonth\n * @category Month Helpers\n * @summary Get the number of days in a month of the given date.\n *\n * @description\n * Get the number of days in a month of the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n *\n * @returns The number of days in a month\n *\n * @example\n * // How many days are in February 2000?\n * const result = getDaysInMonth(new Date(2000, 1))\n * //=> 29\n */\nexport function getDaysInMonth(date) {\n const _date = toDate(date);\n const year = _date.getFullYear();\n const monthIndex = _date.getMonth();\n const lastDayOfMonth = constructFrom(date, 0);\n lastDayOfMonth.setFullYear(year, monthIndex + 1, 0);\n lastDayOfMonth.setHours(0, 0, 0, 0);\n return lastDayOfMonth.getDate();\n}\n\n// Fallback for modularized imports:\nexport default getDaysInMonth;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name isLeapYear\n * @category Year Helpers\n * @summary Is the given date in the leap year?\n *\n * @description\n * Is the given date in the leap year?\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to check\n *\n * @returns The date is in the leap year\n *\n * @example\n * // Is 1 September 2012 in the leap year?\n * const result = isLeapYear(new Date(2012, 8, 1))\n * //=> true\n */\nexport function isLeapYear(date) {\n const _date = toDate(date);\n const year = _date.getFullYear();\n return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0);\n}\n\n// Fallback for modularized imports:\nexport default isLeapYear;\n","import { isLeapYear } from \"./isLeapYear.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name getDaysInYear\n * @category Year Helpers\n * @summary Get the number of days in a year of the given date.\n *\n * @description\n * Get the number of days in a year of the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n *\n * @returns The number of days in a year\n *\n * @example\n * // How many days are in 2012?\n * const result = getDaysInYear(new Date(2012, 0, 1))\n * //=> 366\n */\nexport function getDaysInYear(date) {\n const _date = toDate(date);\n\n if (String(new Date(_date)) === \"Invalid Date\") {\n return NaN;\n }\n\n return isLeapYear(_date) ? 366 : 365;\n}\n\n// Fallback for modularized imports:\nexport default getDaysInYear;\n","import { addWeeks } from \"./addWeeks.mjs\";\nimport { millisecondsInWeek } from \"./constants.mjs\";\nimport { startOfISOWeekYear } from \"./startOfISOWeekYear.mjs\";\n\n/**\n * @name getISOWeeksInYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Get the number of weeks in an ISO week-numbering year of the given date.\n *\n * @description\n * Get the number of weeks in an ISO week-numbering year of the given date.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n *\n * @returns The number of ISO weeks in a year\n *\n * @example\n * // How many weeks are in ISO week-numbering year 2015?\n * const result = getISOWeeksInYear(new Date(2015, 1, 11))\n * //=> 53\n */\nexport function getISOWeeksInYear(date) {\n const thisYear = startOfISOWeekYear(date);\n const nextYear = startOfISOWeekYear(addWeeks(thisYear, 60));\n const diff = +nextYear - +thisYear;\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek);\n}\n\n// Fallback for modularized imports:\nexport default getISOWeeksInYear;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name isEqual\n * @category Common Helpers\n * @summary Are the given dates equal?\n *\n * @description\n * Are the given dates equal?\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The first date to compare\n * @param dateRight - The second date to compare\n *\n * @returns The dates are equal\n *\n * @example\n * // Are 2 July 2014 06:30:45.000 and 2 July 2014 06:30:45.500 equal?\n * const result = isEqual(\n * new Date(2014, 6, 2, 6, 30, 45, 0),\n * new Date(2014, 6, 2, 6, 30, 45, 500)\n * )\n * //=> false\n */\nexport function isEqual(leftDate, rightDate) {\n const _dateLeft = toDate(leftDate);\n const _dateRight = toDate(rightDate);\n return +_dateLeft === +_dateRight;\n}\n\n// Fallback for modularized imports:\nexport default isEqual;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name startOfHour\n * @category Hour Helpers\n * @summary Return the start of an hour for the given date.\n *\n * @description\n * Return the start of an hour for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The start of an hour\n *\n * @example\n * // The start of an hour for 2 September 2014 11:55:00:\n * const result = startOfHour(new Date(2014, 8, 2, 11, 55))\n * //=> Tue Sep 02 2014 11:00:00\n */\nexport function startOfHour(date) {\n const _date = toDate(date);\n _date.setMinutes(0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfHour;\n","import { startOfWeek } from \"./startOfWeek.mjs\";\n\n/**\n * The {@link isSameWeek} function options.\n */\n\n/**\n * @name isSameWeek\n * @category Week Helpers\n * @summary Are the given dates in the same week (and month and year)?\n *\n * @description\n * Are the given dates in the same week (and month and year)?\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The first date to check\n * @param dateRight - The second date to check\n * @param options - An object with options\n *\n * @returns The dates are in the same week (and month and year)\n *\n * @example\n * // Are 31 August 2014 and 4 September 2014 in the same week?\n * const result = isSameWeek(new Date(2014, 7, 31), new Date(2014, 8, 4))\n * //=> true\n *\n * @example\n * // If week starts with Monday,\n * // are 31 August 2014 and 4 September 2014 in the same week?\n * const result = isSameWeek(new Date(2014, 7, 31), new Date(2014, 8, 4), {\n * weekStartsOn: 1\n * })\n * //=> false\n *\n * @example\n * // Are 1 January 2014 and 1 January 2015 in the same week?\n * const result = isSameWeek(new Date(2014, 0, 1), new Date(2015, 0, 1))\n * //=> false\n */\nexport function isSameWeek(dateLeft, dateRight, options) {\n const dateLeftStartOfWeek = startOfWeek(dateLeft, options);\n const dateRightStartOfWeek = startOfWeek(dateRight, options);\n\n return +dateLeftStartOfWeek === +dateRightStartOfWeek;\n}\n\n// Fallback for modularized imports:\nexport default isSameWeek;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name isSameMonth\n * @category Month Helpers\n * @summary Are the given dates in the same month (and year)?\n *\n * @description\n * Are the given dates in the same month (and year)?\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The first date to check\n * @param dateRight - The second date to check\n *\n * @returns The dates are in the same month (and year)\n *\n * @example\n * // Are 2 September 2014 and 25 September 2014 in the same month?\n * const result = isSameMonth(new Date(2014, 8, 2), new Date(2014, 8, 25))\n * //=> true\n *\n * @example\n * // Are 2 September 2014 and 25 September 2015 in the same month?\n * const result = isSameMonth(new Date(2014, 8, 2), new Date(2015, 8, 25))\n * //=> false\n */\nexport function isSameMonth(dateLeft, dateRight) {\n const _dateLeft = toDate(dateLeft);\n const _dateRight = toDate(dateRight);\n return (\n _dateLeft.getFullYear() === _dateRight.getFullYear() &&\n _dateLeft.getMonth() === _dateRight.getMonth()\n );\n}\n\n// Fallback for modularized imports:\nexport default isSameMonth;\n","import { startOfQuarter } from \"./startOfQuarter.mjs\";\n\n/**\n * @name isSameQuarter\n * @category Quarter Helpers\n * @summary Are the given dates in the same quarter (and year)?\n *\n * @description\n * Are the given dates in the same quarter (and year)?\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The first date to check\n * @param dateRight - The second date to check\n\n * @returns The dates are in the same quarter (and year)\n *\n * @example\n * // Are 1 January 2014 and 8 March 2014 in the same quarter?\n * const result = isSameQuarter(new Date(2014, 0, 1), new Date(2014, 2, 8))\n * //=> true\n *\n * @example\n * // Are 1 January 2014 and 1 January 2015 in the same quarter?\n * const result = isSameQuarter(new Date(2014, 0, 1), new Date(2015, 0, 1))\n * //=> false\n */\nexport function isSameQuarter(dateLeft, dateRight) {\n const dateLeftStartOfQuarter = startOfQuarter(dateLeft);\n const dateRightStartOfQuarter = startOfQuarter(dateRight);\n\n return +dateLeftStartOfQuarter === +dateRightStartOfQuarter;\n}\n\n// Fallback for modularized imports:\nexport default isSameQuarter;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name isSameYear\n * @category Year Helpers\n * @summary Are the given dates in the same year?\n *\n * @description\n * Are the given dates in the same year?\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The first date to check\n * @param dateRight - The second date to check\n *\n * @returns The dates are in the same year\n *\n * @example\n * // Are 2 September 2014 and 25 September 2014 in the same year?\n * const result = isSameYear(new Date(2014, 8, 2), new Date(2014, 8, 25))\n * //=> true\n */\nexport function isSameYear(dateLeft, dateRight) {\n const _dateLeft = toDate(dateLeft);\n const _dateRight = toDate(dateRight);\n return _dateLeft.getFullYear() === _dateRight.getFullYear();\n}\n\n// Fallback for modularized imports:\nexport default isSameYear;\n","import {\n\taddMinutes,\n\taddHours,\n\taddDays,\n\taddWeeks,\n\taddMonths,\n\taddQuarters,\n\taddYears,\n\tdifferenceInYears,\n\tdifferenceInMonths,\n\tdifferenceInQuarters,\n\tdifferenceInCalendarISOWeeks,\n\tdifferenceInCalendarDays,\n\tdifferenceInHours,\n\tdifferenceInMinutes,\n\tstartOfHour,\n\tstartOfDay,\n\tstartOfWeek,\n\tstartOfMonth,\n\tstartOfQuarter,\n\tendOfQuarter,\n\tstartOfYear,\n\tformat,\n\tgetDaysInMonth,\n\tgetDaysInYear,\n\tgetISOWeeksInYear,\n\tisSameDay,\n\tisSameWeek,\n\tisSameMonth,\n\tisSameQuarter,\n\tisSameYear,\n\tendOfYear,\n\tendOfMonth,\n\tendOfWeek,\n\tendOfDay,\n\tendOfHour,\n\tDay,\n} from \"date-fns\";\n\nimport { units } from \"./scales\";\nimport type { GanttScaleUnit, Calendar } from \"./types\";\n\nconst diff: { [name: string]: { (start: Date, end: Date): number } } = {\n\tyear: differenceInYears,\n\tquarter: differenceInQuarters,\n\tmonth: differenceInMonths,\n\tweek: differenceInCalendarISOWeeks,\n\tday: differenceInCalendarDays,\n\thour: differenceInHours,\n\tminute: differenceInMinutes,\n};\n\nconst smallerCount: {\n\t[name: string]: {\n\t\t[name: string]: number | ((date?: Date) => number);\n\t};\n} = {\n\tyear: {\n\t\tquarter: 4,\n\t\tmonth: 12,\n\t\tweek: getISOWeeksInYear,\n\t\tday: daysInYear,\n\t\thour: hoursInYear,\n\t},\n\tquarter: {\n\t\tmonth: 3,\n\t\tweek: weeksInQuarter,\n\t\tday: daysInQuarter,\n\t\thour: hoursInQuarter,\n\t},\n\tmonth: {\n\t\tweek: weeksInMonth,\n\t\tday: daysInMonth,\n\t\thour: hoursInMonth,\n\t},\n\tweek: {\n\t\tday: 7,\n\t\thour: 24 * 7,\n\t},\n\tday: {\n\t\thour: 24,\n\t},\n\thour: {\n\t\tminute: 60,\n\t},\n};\n\nfunction daysInYear(date?: Date): number {\n\tif (date) return getDaysInYear(date);\n\treturn 365;\n}\nfunction hoursInYear(date: Date): number {\n\treturn getDaysInYear(date) * 24;\n}\n\nfunction weeksInQuarter(date: Date): number {\n\tconst start = startOfQuarter(date);\n\tconst end = addDays(startOfDay(endOfQuarter(date)), 1);\n\treturn differenceInCalendarISOWeeks(end, start);\n}\nfunction daysInQuarter(date?: Date): number {\n\tif (date) {\n\t\tconst start = startOfQuarter(date);\n\t\tconst end = endOfQuarter(date);\n\t\treturn differenceInCalendarDays(end, start) + 1;\n\t}\n\treturn 91;\n}\nfunction hoursInQuarter(date: Date): number {\n\treturn daysInQuarter(date) * 24;\n}\n\nfunction weeksInMonth(date?: Date): number {\n\tif (date) {\n\t\tconst start = startOfMonth(date);\n\t\tconst end = addDays(startOfDay(endOfMonth(date)), 1);\n\t\treturn differenceInCalendarISOWeeks(end, start);\n\t}\n\treturn 5;\n}\nfunction daysInMonth(date?: Date): number {\n\tif (date) return getDaysInMonth(date);\n\treturn 30;\n}\nfunction hoursInMonth(date: Date): number {\n\treturn getDaysInMonth(date) * 24;\n}\n\nexport function getSmallerUnitCount(\n\tunit: string,\n\tlengthUnit: string,\n\tdate?: Date\n): number {\n\tconst count = smallerCount[unit][lengthUnit];\n\tif (!count) return 1;\n\tif (typeof count === \"number\") return count;\n\treturn count(date);\n}\n\nexport function isCorrectLengthUnit(\n\tminUnit: string,\n\tlengthUnit: string\n): boolean {\n\treturn (\n\t\tminUnit === lengthUnit ||\n\t\t!!(smallerCount[minUnit] && smallerCount[minUnit][lengthUnit])\n\t);\n}\n\nconst add: { [name: string]: { (start: number | Date, step: number): Date } } =\n\t{\n\t\tyear: addYears,\n\t\tquarter: addQuarters,\n\t\tmonth: addMonths,\n\t\tweek: addWeeks,\n\t\tday: addDays,\n\t\thour: addHours,\n\t\tminute: addMinutes,\n\t};\n\nexport function getDiffer(\n\tunit: string,\n\tcalendar?: Calendar,\n\t_weekStart?: Day\n): {\n\t(start: Date, end: Date, lengthUnit?: string, unitSize?: boolean): number;\n} {\n\tif (calendar) {\n\t\tif (unit === \"day\") {\n\t\t\treturn (start: Date, end: Date) => {\n\t\t\t\treturn calendar.getWorkingDays(end, start, true);\n\t\t\t};\n\t\t}\n\t\tif (unit === \"hour\") {\n\t\t\treturn (start: Date, end: Date) => {\n\t\t\t\treturn calendar.getWorkingHours(end, start, true);\n\t\t\t};\n\t\t}\n\t}\n\treturn (next, prev, lengthUnit, unitSize) => {\n\t\tif (\n\t\t\t!smallerCount[unit][lengthUnit] ||\n\t\t\ttypeof smallerCount[unit][lengthUnit] === \"number\" ||\n\t\t\tisSameUnit(unit, next, prev, _weekStart)\n\t\t) {\n\t\t\treturn innerDiff(\n\t\t\t\tunit,\n\t\t\t\tnext,\n\t\t\t\tprev,\n\t\t\t\tlengthUnit,\n\t\t\t\tunitSize,\n\t\t\t\t_weekStart\n\t\t\t);\n\t\t} else {\n\t\t\treturn getLengthUnitDiff(\n\t\t\t\tnext,\n\t\t\t\tprev,\n\t\t\t\tunit,\n\t\t\t\tlengthUnit,\n\t\t\t\tunitSize,\n\t\t\t\t_weekStart\n\t\t\t);\n\t\t}\n\t};\n}\n\nfunction innerDiff(\n\tunit: string,\n\tnext: Date,\n\tprev: Date,\n\tlengthUnit?: string,\n\tunitSize?: boolean,\n\t_weekStart?: Day\n): number {\n\tconst minUnit = lengthUnit || unit;\n\n\tlet start = prev;\n\tlet end = next;\n\tif (unitSize) {\n\t\tstart = getUnitStart(minUnit, prev, _weekStart);\n\t\tend = getUnitStart(minUnit, next, _weekStart);\n\t\tif (end < next) end = getAdder(minUnit)(end, 1);\n\t}\n\n\tif (unit !== minUnit) {\n\t\tconst filled = diff[minUnit](end, start);\n\t\tconst all = getSmallerUnitCount(unit, minUnit, prev);\n\t\treturn filled / all;\n\t} else {\n\t\treturn diff[minUnit](end, start);\n\t}\n}\n\nfunction getLengthUnitDiff(\n\tend: Date,\n\tstart: Date,\n\tunit: string,\n\tlengthUnit: string,\n\tunitSize?: boolean,\n\t_weekStart?: Day\n): number {\n\t// if not start of unit\n\tlet lengthUnitsOfFirstUnit = 0;\n\tconst unitStart = getUnitStart(unit, start, _weekStart);\n\tif (start > unitStart) {\n\t\tconst nextUnitStart = add[unit](unitStart, 1);\n\t\tlengthUnitsOfFirstUnit = innerDiff(\n\t\t\tunit,\n\t\t\tnextUnitStart,\n\t\t\tstart,\n\t\t\tlengthUnit,\n\t\t\tundefined,\n\t\t\t_weekStart\n\t\t);\n\t\tstart = nextUnitStart;\n\t}\n\n\t// if lasts 1+ whole units\n\tlet units = 0;\n\tif (!isSameUnit(unit, start, end, _weekStart)) {\n\t\tunits = innerDiff(\n\t\t\tunit,\n\t\t\tgetUnitStart(unit, end, _weekStart),\n\t\t\tstart,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\t_weekStart\n\t\t); // int part\n\t\tstart = add[unit](start, units);\n\t}\n\n\t// all above plus lenUns of last unit if any\n\tunits +=\n\t\tlengthUnitsOfFirstUnit +\n\t\tinnerDiff(unit, end, start, lengthUnit, undefined, _weekStart);\n\n\tif (!units && unitSize) {\n\t\t// ugly hack for weeks and tasks that are between larger units\n\t\tunits = innerDiff(unit, end, start, lengthUnit, unitSize, _weekStart);\n\t}\n\n\treturn units;\n}\n\nexport function getAdder(\n\tunit: string,\n\tcalendar?: Calendar\n): {\n\t(start: number | Date, step: number): Date;\n} {\n\tif (calendar) {\n\t\tif (unit === \"day\") {\n\t\t\treturn (date, amount) =>\n\t\t\t\tcalendar.addWorkingDays(date as Date, amount, true);\n\t\t} else if (unit === \"hour\") {\n\t\t\treturn (date, amount) =>\n\t\t\t\tcalendar.addWorkingHours(date as Date, amount);\n\t\t}\n\t}\n\treturn add[unit];\n}\n\nconst startHandlers: {\n\t[name: string]: (start: number | Date, _weekStart?: Day) => Date;\n} = {\n\tyear: startOfYear,\n\tquarter: startOfQuarter,\n\tmonth: startOfMonth,\n\tweek: (start, _weekStart) =>\n\t\tstartOfWeek(start, { weekStartsOn: _weekStart }),\n\tday: startOfDay,\n\thour: startOfHour,\n};\n\nexport function getUnitStart(unit: string, date: Date, _weekStart?: Day): Date {\n\tconst handler = startHandlers[unit];\n\treturn handler ? handler(date, _weekStart) : new Date(date);\n}\nconst endHandlers: {\n\t[name: string]: { (end: number | Date, _weekStart?: Day): Date };\n} = {\n\tyear: endOfYear,\n\tquarter: endOfQuarter,\n\tmonth: endOfMonth,\n\tweek: (end: Date, _weekStart?: Day) =>\n\t\tendOfWeek(end, { weekStartsOn: _weekStart }),\n\tday: endOfDay,\n\thour: endOfHour,\n};\nexport function getUnitEnd(unit: string, date: Date, _weekStart?: Day): Date {\n\tconst handler = endHandlers[unit];\n\treturn handler ? handler(date, _weekStart) : new Date(date);\n}\n\nconst sameHandlers: {\n\t[unit: string]: { (a: Date, b: Date, _weekStart?: Day): boolean };\n} = {\n\tyear: isSameYear,\n\tquarter: isSameQuarter,\n\tmonth: isSameMonth,\n\tweek: (a, b, _weekStart) => isSameWeek(a, b, { weekStartsOn: _weekStart }),\n\tday: isSameDay,\n};\n\nexport function isSameUnit(\n\tunit: string,\n\ta: Date,\n\tb: Date,\n\t_weekStart?: Day\n): boolean {\n\tconst handler = sameHandlers[unit];\n\treturn handler ? handler(a, b, _weekStart) : false;\n}\n\nconst handlers: { [name: string]: any } = {\n\tstart: startHandlers,\n\tend: endHandlers,\n\tadd,\n\tisSame: sameHandlers,\n\tdiff,\n\tsmallerCount,\n};\n\nconst getCount = (count: any) => {\n\tif (typeof count === \"function\") return count(new Date());\n\treturn count;\n};\n\nexport function registerScaleUnit(unit: string, config: GanttScaleUnit) {\n\tfor (const key in config) {\n\t\tif (key === \"smallerCount\") {\n\t\t\tconst childUnits = Object.keys(config[key]);\n\t\t\tconst baseUnit = childUnits\n\t\t\t\t.sort((a, b) => units.indexOf(a) - units.indexOf(b))\n\t\t\t\t.shift();\n\t\t\tlet index = units.indexOf(baseUnit);\n\t\t\tconst baseSmallerCount = config[key][baseUnit];\n\t\t\tconst count = getCount(baseSmallerCount);\n\t\t\tfor (let i = index - 1; i >= 0; i--) {\n\t\t\t\tconst unitI = units[i];\n\t\t\t\tconst countI = getCount(smallerCount[unitI][baseUnit]);\n\t\t\t\tif (count <= countI) break;\n\t\t\t\tindex = i;\n\t\t\t}\n\t\t\tunits.splice(index, 0, unit);\n\t\t}\n\t\tif (key === \"biggerCount\") {\n\t\t\tfor (const parentUnit in config[key])\n\t\t\t\tsmallerCount[parentUnit][unit] = config[key][parentUnit];\n\t\t} else handlers[key][unit] = config[key as keyof GanttScaleUnit];\n\t}\n}\n\nexport function adjustToWorkingDay(\n\tstart: Date,\n\tdiff: number = 1,\n\tcalendar: Calendar\n): Date {\n\tif (!calendar.isWorkingDay(start))\n\t\tstart =\n\t\t\tdiff > 0\n\t\t\t\t? calendar.getNextWorkingDay(start)\n\t\t\t\t: calendar.getPreviousWorkingDay(start);\n\treturn start;\n}\n\nexport function shiftByWorkingDays(calendar: Calendar) {\n\treturn (date: Date, diff: number) => {\n\t\tif (diff > 0) {\n\t\t\tfor (let i = 0; i < diff; i++) {\n\t\t\t\tdate = calendar.getNextWorkingDay(date);\n\t\t\t}\n\t\t}\n\t\tif (diff < 0) {\n\t\t\tfor (let i = 0; i > diff; i--) {\n\t\t\t\tdate = calendar.getPreviousWorkingDay(date);\n\t\t\t}\n\t\t}\n\t\treturn date;\n\t};\n}\n\nexport { format };\n","import type {\n\tIScaleConfig,\n\tGanttScaleData,\n\tIScaleLevel,\n\tIUnitFormats,\n\tIZoomConfig,\n\tTLengthUnit,\n} from \"./types\";\nimport { getUnitStart, getAdder, getDiffer, getSmallerUnitCount } from \"./time\";\nimport type GanttDataTree from \"./GanttDataTree\";\nimport { Day } from \"date-fns\";\n\nexport function getMinUnit(scales: IScaleConfig[]): IScaleConfig {\n\tconst start = new Date();\n\treturn scales\n\t\t.map(item => ({ item, len: getAdder(item.unit)(start, 1) }))\n\t\t.sort((a, b) => (a.len < b.len ? -1 : 1))[0].item;\n}\n\nexport const units = [\"year\", \"quarter\", \"month\", \"week\", \"day\", \"hour\"];\nconst defaultMinCellWidth = 50;\nconst defaultMaxCellWidth = 300;\n\nexport function calcScales(\n\tprevStart: Date,\n\tprevEnd: Date,\n\tautoScale: boolean,\n\tminUnit?: string,\n\ttasks?: GanttDataTree\n): { _start: Date; _end: Date } {\n\tlet _start = prevStart,\n\t\t_end = prevEnd;\n\tlet _sFix = false,\n\t\t_eFix = false;\n\tif (tasks) {\n\t\ttasks.forEach(t => {\n\t\t\tif ((!prevStart || autoScale) && (!_start || t.start <= _start)) {\n\t\t\t\t_start = t.start;\n\t\t\t\t_sFix = true;\n\t\t\t}\n\t\t\tconst taskEnd = t.type === \"milestone\" ? t.start : t.end;\n\t\t\tif ((!prevEnd || autoScale) && (!_end || taskEnd >= _end)) {\n\t\t\t\t_end = taskEnd;\n\t\t\t\t_eFix = true;\n\t\t\t}\n\t\t});\n\t}\n\tconst adder = getAdder(minUnit || \"day\");\n\tif (_start) {\n\t\tif (_sFix) _start = adder(_start, -1);\n\t} else if (_end) _start = adder(_end, -30);\n\telse _start = new Date();\n\n\tif (_end) {\n\t\tif (_eFix) _end = adder(_end, 1);\n\t} else _end = adder(_start, 30);\n\n\treturn { _start, _end };\n}\n\nexport function resetScales(\n\tstart: Date,\n\tend: Date,\n\tlengthUnit: TLengthUnit,\n\twidth: number,\n\theight: number,\n\t_weekStart: Day,\n\tscales: IScaleConfig[]\n): GanttScaleData | null {\n\tconst minUnit = getMinUnit(scales).unit;\n\tconst diff = getDiffer(minUnit, undefined, _weekStart);\n\tconst numOfMinUnits = diff(end, start, \"\", true);\n\n\tconst tempEnd = getUnitStart(minUnit, end, _weekStart);\n\tstart = getUnitStart(minUnit, start, _weekStart);\n\tend = tempEnd < end ? getAdder(minUnit)(tempEnd, 1) : tempEnd;\n\n\tconst fullWidth = numOfMinUnits * width;\n\tconst fullHeight = height * scales.length;\n\tconst rows = scales.map(line => {\n\t\tconst cells = [];\n\t\tconst add = getAdder(line.unit);\n\n\t\tlet date = getUnitStart(line.unit, start, _weekStart);\n\t\twhile (date < end) {\n\t\t\tconst next = add(date, line.step);\n\n\t\t\tconst cellStart = date < start ? start : date;\n\t\t\tconst cellEnd = next > end ? end : next;\n\n\t\t\tconst cellWidth = diff(cellEnd, cellStart, \"\", true) * width;\n\n\t\t\tconst value =\n\t\t\t\ttypeof line.format === \"function\"\n\t\t\t\t\t? line.format(date, next)\n\t\t\t\t\t: line.format;\n\t\t\tlet css = \"\";\n\t\t\tif (line.css)\n\t\t\t\tcss +=\n\t\t\t\t\ttypeof line.css === \"function\" ? line.css(date) : line.css;\n\n\t\t\tcells.push({\n\t\t\t\twidth: cellWidth,\n\t\t\t\tvalue,\n\t\t\t\tdate: cellStart,\n\t\t\t\tcss,\n\t\t\t\tunit: line.unit,\n\t\t\t});\n\n\t\t\tdate = next;\n\t\t}\n\n\t\treturn { cells, add, height };\n\t});\n\n\tlet lengthUnitWidth = width;\n\tif (minUnit !== lengthUnit) {\n\t\tlengthUnitWidth =\n\t\t\tMath.round(\n\t\t\t\tlengthUnitWidth / getSmallerUnitCount(minUnit, lengthUnit)\n\t\t\t) || 1;\n\t}\n\n\treturn {\n\t\trows,\n\t\twidth: fullWidth,\n\t\theight: fullHeight,\n\t\tdiff,\n\t\tstart,\n\t\tend,\n\t\tlengthUnit,\n\t\tminUnit,\n\t\tlengthUnitWidth,\n\t};\n}\n\nexport function normalizeZoom(\n\tzoom: boolean | IZoomConfig,\n\tunitFormats: IUnitFormats,\n\tscales: IScaleConfig[],\n\tcellWidth: number\n): { zoom: IZoomConfig; scales: IScaleConfig[]; cellWidth: number } {\n\tconst _zoom: any = typeof zoom === \"boolean\" ? {} : zoom;\n\tconst mainScaleLevel = units.indexOf(getMinUnit(scales).unit);\n\tif (typeof _zoom.level == \"undefined\") {\n\t\t_zoom.level = mainScaleLevel;\n\t}\n\n\tif (_zoom.levels) {\n\t\t_zoom.levels.forEach((level: IScaleLevel) => {\n\t\t\tif (!level.minCellWidth)\n\t\t\t\tlevel.minCellWidth = getCellWidth(\n\t\t\t\t\t_zoom.minCellWidth,\n\t\t\t\t\tdefaultMinCellWidth\n\t\t\t\t);\n\t\t\tif (!level.maxCellWidth)\n\t\t\t\tlevel.maxCellWidth = getCellWidth(\n\t\t\t\t\t_zoom.maxCellWidth,\n\t\t\t\t\tdefaultMaxCellWidth\n\t\t\t\t);\n\t\t});\n\t} else {\n\t\tconst levels: any[] = [];\n\t\tconst numOfScales = scales.length || 1;\n\t\tconst minCellWidth = getCellWidth(\n\t\t\t_zoom.minCellWidth,\n\t\t\tdefaultMinCellWidth\n\t\t);\n\t\tconst maxCellWidth = getCellWidth(\n\t\t\t_zoom.maxCellWidth,\n\t\t\tdefaultMaxCellWidth\n\t\t);\n\n\t\t// adds a format from a custom unit config to the format collection to be used during zoom\n\t\tscales.forEach(s => {\n\t\t\tif (s.format && !unitFormats[s.unit])\n\t\t\t\tunitFormats[s.unit] = s.format;\n\t\t});\n\n\t\tunits.forEach((unit, i) => {\n\t\t\tif (i === mainScaleLevel) {\n\t\t\t\tlevels.push({\n\t\t\t\t\tminCellWidth,\n\t\t\t\t\tmaxCellWidth,\n\t\t\t\t\tscales,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst levelScales: IScaleConfig[] = [];\n\t\t\t\tif (i) {\n\t\t\t\t\tfor (let j = numOfScales - 1; j > 0; j--) {\n\t\t\t\t\t\tconst pUnit = units[i - j];\n\t\t\t\t\t\tif (pUnit) {\n\t\t\t\t\t\t\tlevelScales.push({\n\t\t\t\t\t\t\t\tunit: pUnit,\n\t\t\t\t\t\t\t\tstep: 1,\n\t\t\t\t\t\t\t\tformat: unitFormats[pUnit],\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlevelScales.push({\n\t\t\t\t\tunit,\n\t\t\t\t\tstep: 1,\n\t\t\t\t\tformat: unitFormats[unit],\n\t\t\t\t});\n\n\t\t\t\tlevels.push({\n\t\t\t\t\tminCellWidth,\n\t\t\t\t\tmaxCellWidth,\n\t\t\t\t\tscales: levelScales,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t_zoom.levels = levels;\n\t}\n\n\tif (!_zoom.levels[_zoom.level]) {\n\t\t_zoom.level = 0;\n\t}\n\n\tconst currentLevel = _zoom.levels[_zoom.level];\n\tconst adjustedCellWidth = Math.min(\n\t\tMath.max(cellWidth, currentLevel.minCellWidth),\n\t\tcurrentLevel.maxCellWidth\n\t);\n\n\treturn {\n\t\tzoom: _zoom,\n\t\tscales: currentLevel.scales,\n\t\tcellWidth: adjustedCellWidth,\n\t};\n}\n\nexport function zoomScale(\n\tzoom: IZoomConfig,\n\tstep: number,\n\tlevel: number,\n\tnextUnit: any,\n\tlengthUnit: TLengthUnit,\n\tscales: IScaleConfig[],\n\tcellWidth: number\n): {\n\tscales: IScaleConfig[];\n\tcellWidth: number;\n\tlengthUnit: TLengthUnit;\n\tzoom: IZoomConfig;\n} {\n\tzoom.level = level;\n\tlet newCellWidth;\n\tconst nextScales = nextUnit.scales || nextUnit;\n\tconst nextMinUnit = getMinUnit(nextScales).unit;\n\tconst nextLengthUnit = setLengthUnit(\n\t\tnextMinUnit,\n\t\tlengthUnit\n\t) as TLengthUnit;\n\n\tif (step === -1) {\n\t\tconst count = getSmallerUnitCount(nextMinUnit, lengthUnit);\n\t\tnewCellWidth = cellWidth * count;\n\t} else {\n\t\tconst count = getSmallerUnitCount(getMinUnit(scales).unit, nextMinUnit);\n\t\tnewCellWidth = Math.round(cellWidth / count);\n\t}\n\n\tconst min = nextUnit.minCellWidth ?? defaultMinCellWidth;\n\tconst max = nextUnit.maxCellWidth ?? defaultMaxCellWidth;\n\n\treturn {\n\t\tscales: nextScales,\n\t\tcellWidth: Math.min(max, Math.max(min, newCellWidth)),\n\t\tlengthUnit: nextLengthUnit,\n\t\tzoom,\n\t};\n}\n\nfunction setLengthUnit(unit: string, lengthUnit: string): string {\n\tconst unitInd = units.indexOf(unit);\n\tconst lengthUnitInd = units.indexOf(lengthUnit);\n\tif (lengthUnitInd >= unitInd) {\n\t\tif (unit === \"hour\") return \"hour\";\n\t\treturn \"day\";\n\t}\n\n\treturn units[lengthUnitInd];\n}\n\nfunction getCellWidth(width: number | undefined, fallback: number) {\n\treturn width ?? fallback;\n}\n","import {\n\tIGanttTask,\n\tGanttScaleData,\n\tIParsedTask,\n\tGanttDataTree,\n\tITask,\n\tIData,\n\tIDataHash,\n} from \"./types\";\nimport { isEqual } from \"date-fns\";\nimport { isCommunity } from \"./package\";\n\nconst baselineHeight = 8;\nconst baselineTopPadding = 4;\nconst defaultPadding = 3;\nconst heightAdjustment = 7;\nconst baselineAdjustment = baselineHeight + baselineTopPadding;\n\nexport function dragSummaryKids(\n\ttask: IParsedTask,\n\tdx: number,\n\t_scales: GanttScaleData,\n\tcellWidth: number\n) {\n\tif (task.open || task.type != \"summary\") {\n\t\ttask.data?.forEach(kid => {\n\t\t\tif (typeof kid.$x === \"undefined\")\n\t\t\t\tsetTaskSizes(kid, _scales, cellWidth);\n\t\t\tkid.$x += dx;\n\t\t\tdragSummaryKids(kid, dx, _scales, cellWidth);\n\t\t});\n\t}\n}\n\nexport function dragSummary(\n\ttasks: GanttDataTree,\n\ttask: IParsedTask,\n\t_scales: GanttScaleData,\n\tcellWidth: number\n) {\n\tconst summary = tasks.getSummaryId(task.id);\n\tif (summary) {\n\t\tconst pobj = tasks.byId(summary);\n\t\tconst coords = {\n\t\t\txMin: Infinity,\n\t\t\txMax: 0,\n\t\t};\n\t\tgetSummaryBarSize(pobj, coords, _scales, cellWidth);\n\t\tpobj.$x = coords.xMin;\n\t\tpobj.$w = coords.xMax - coords.xMin;\n\n\t\tdragSummary(tasks, pobj, _scales, cellWidth);\n\t}\n}\n\nfunction getSummaryBarSize(\n\ttask: IParsedTask,\n\tcoords: { xMin: number; xMax: number },\n\t_scales: GanttScaleData,\n\tcellWidth: number\n) {\n\ttask.data?.forEach(kid => {\n\t\tif (!kid.unscheduled) {\n\t\t\tif (typeof kid.$x === \"undefined\")\n\t\t\t\tsetTaskSizes(kid, _scales, cellWidth);\n\t\t\tconst mD = kid.type === \"milestone\" && kid.$h ? kid.$h / 2 : 0;\n\t\t\tif (coords.xMin > kid.$x) {\n\t\t\t\tcoords.xMin = kid.$x + mD;\n\t\t\t}\n\t\t\tconst right = kid.$x + kid.$w - mD;\n\t\t\tif (coords.xMax < right) {\n\t\t\t\tcoords.xMax = right;\n\t\t\t}\n\t\t}\n\n\t\tif (kid.type !== \"summary\")\n\t\t\tgetSummaryBarSize(kid, coords, _scales, cellWidth);\n\t});\n}\n\nfunction setTaskSizes(task: IParsedTask, s: GanttScaleData, cellWidth: number) {\n\ttask.$x = Math.round(s.diff(task.start, s.start, s.lengthUnit) * cellWidth);\n\ttask.$w = Math.round(\n\t\ts.diff(task.end, task.start, s.lengthUnit, true) * cellWidth\n\t);\n}\n\nexport function setSummaryDates(task: ITask, tasks?: Partial<ITask>[]): ITask {\n\tlet data;\n\tif (tasks) {\n\t\tdata = tasks.filter(t => t.parent == task.id);\n\t}\n\n\tconst copy = { data, ...task } as IParsedTask;\n\tif (copy.data?.length) {\n\t\tcopy.data.forEach((kid: ITask) => {\n\t\t\tif (kid.unscheduled && !kid.data) return;\n\t\t\tif (tasks || (kid.type != \"summary\" && kid.data)) {\n\t\t\t\tif (kid.unscheduled)\n\t\t\t\t\t// reset own dates to take from kids\n\t\t\t\t\tkid = { ...kid, start: undefined, end: undefined };\n\t\t\t\tkid = setSummaryDates(kid, tasks);\n\t\t\t}\n\t\t\tif (kid.start && (!copy.start || copy.start > kid.start)) {\n\t\t\t\tcopy.start = new Date(kid.start);\n\t\t\t}\n\n\t\t\tconst end = kid.end || kid.start;\n\t\t\tif (end && (!copy.end || copy.end < end)) {\n\t\t\t\tcopy.end = new Date(end);\n\t\t\t}\n\t\t});\n\t} else if (task.type === \"summary\") {\n\t\tthrow Error(\n\t\t\t\"Summary tasks must have start and end dates if they have no subtasks\"\n\t\t);\n\t}\n\n\treturn copy;\n}\n\nexport function updateTask(\n\tt: IGanttTask,\n\ti: number,\n\tstate: Partial<IData>\n): IGanttTask {\n\tcalculateTaskDimensions(t, i, state, false);\n\tif (state.splitTasks) {\n\t\tt.segments?.forEach((s: Partial<IGanttTask>) => {\n\t\t\tupdateTask(s as IGanttTask, i, {\n\t\t\t\t...state,\n\t\t\t\tbaselines: false,\n\t\t\t});\n\t\t\ts.$x -= t.$x;\n\t\t});\n\t}\n\tif (state.baselines) {\n\t\tcalculateTaskDimensions(t, i, state, true);\n\t}\n\n\treturn t;\n}\n\nfunction calculateTaskDimensions(\n\tt: IGanttTask,\n\ti: number,\n\tstate: Partial<IData>,\n\tisBaseline: boolean\n) {\n\tconst { cellWidth, cellHeight, _scales, baselines } = state;\n\tconst { start: scaleStart, end: scaleEnd, lengthUnit, diff } = _scales;\n\tconst start = (isBaseline ? \"base_\" : \"\") + \"start\";\n\tconst end = (isBaseline ? \"base_\" : \"\") + \"end\";\n\tconst x = \"$x\" + (isBaseline ? \"_base\" : \"\");\n\tconst y = \"$y\" + (isBaseline ? \"_base\" : \"\");\n\tconst w = \"$w\" + (isBaseline ? \"_base\" : \"\");\n\tconst h = \"$h\" + (isBaseline ? \"_base\" : \"\");\n\tconst skip = \"$skip\" + (isBaseline ? \"_baseline\" : \"\");\n\n\tlet startDate = t[start];\n\tlet endDate = t[end];\n\n\tif (isBaseline && !startDate) {\n\t\tt[skip] = true;\n\t\treturn;\n\t}\n\n\tif (\n\t\tt[start] < scaleStart &&\n\t\t(t[end] < scaleStart || isEqual(t[end], scaleStart))\n\t) {\n\t\tstartDate = endDate = scaleStart;\n\t} else if (t[start] > scaleEnd) {\n\t\tstartDate = endDate = scaleEnd;\n\t}\n\n\tt[x] = Math.round(diff(startDate, scaleStart, lengthUnit) * cellWidth);\n\tt[y] = isBaseline\n\t\t? t.$y + t.$h + baselineTopPadding\n\t\t: cellHeight * i + defaultPadding;\n\tt[w] = Math.round(diff(endDate, startDate, lengthUnit, true) * cellWidth);\n\tt[h] = isBaseline\n\t\t? baselineHeight\n\t\t: baselines\n\t\t\t? cellHeight - heightAdjustment - baselineAdjustment\n\t\t\t: cellHeight - heightAdjustment;\n\n\tif (t.type === \"milestone\") {\n\t\tt[x] = t[x] - t.$h / 2;\n\t\tt[w] = t.$h;\n\n\t\tif (isBaseline) {\n\t\t\tt[y] = t.$y + baselineHeight;\n\t\t\tt[w] = t[h] = t.$h;\n\t\t}\n\t}\n\n\tif (state.unscheduledTasks && t.unscheduled && !isBaseline)\n\t\tt[\"$skip\"] = true;\n\telse t[skip] = isEqual(startDate, endDate);\n}\n\nexport function isSegmentMoveAllowed(task: IGanttTask, moveOptions: IDataHash) {\n\tif (isCommunity()) return false;\n\tconst { mode, l, w, dx, index } = moveOptions;\n\tconst { segments } = task;\n\tif (index || mode === \"end\") {\n\t\tif (dx > 0 && index < segments.length - 1) {\n\t\t\tif (l + w + dx > segments[index + 1].$x + task.$x) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if (dx < 0 && index) {\n\t\t\tconst d = mode === \"end\" ? w : 0;\n\t\t\tif (\n\t\t\t\tl + dx + d <\n\t\t\t\tsegments[index - 1].$x + task.$x + segments[index - 1].$w\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n\nexport function extendDragOptions(task: ITask, options: IDataHash) {\n\tif (isCommunity()) return;\n\tconst { segments } = task;\n\tconst { segmentIndex, mode } = options;\n\tconst s = segments[segmentIndex];\n\tif (segmentIndex || mode !== \"move\") {\n\t\toptions.index = segmentIndex;\n\t\toptions.l = s.$x + task.$x;\n\t\toptions.w = s.$w;\n\t\toptions.segment = true;\n\t}\n}\n","import { tempID } from \"@svar-ui/lib-state\";\nimport type { IGanttTask, IGanttLink, ILink } from \"./types\";\n\nconst delta = 20;\n\nexport const updateLink = function (\n\tlink: IGanttLink,\n\tstartTask: IGanttTask,\n\tendTask: IGanttTask,\n\theight: number,\n\tbaselines: boolean\n): IGanttLink {\n\tconst dy = Math.round(height / 2) - 3;\n\n\tif (\n\t\t!startTask ||\n\t\t!endTask ||\n\t\t!startTask.$y ||\n\t\t!endTask.$y ||\n\t\tstartTask.$skip ||\n\t\tendTask.$skip\n\t) {\n\t\tlink.$p = \"\";\n\t\tlink.$pl = 0;\n\t\treturn link;\n\t}\n\n\tlet s_start = false;\n\tlet e_start = false;\n\n\tswitch (link.type) {\n\t\tcase \"e2s\":\n\t\t\te_start = true;\n\t\t\tbreak;\n\n\t\tcase \"s2s\":\n\t\t\ts_start = true;\n\t\t\te_start = true;\n\t\t\tbreak;\n\n\t\tcase \"s2e\":\n\t\t\ts_start = true;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tconst sx = s_start ? startTask.$x : startTask.$x + startTask.$w;\n\tconst sy = baselines ? startTask.$y - 7 : startTask.$y;\n\tconst ex = e_start ? endTask.$x : endTask.$x + endTask.$w;\n\tconst ey = baselines ? endTask.$y - 7 : endTask.$y;\n\n\tif (sx !== ex || sy !== ey) {\n\t\tconst lineCoords = getLineCoords(\n\t\t\tsx,\n\t\t\tsy + dy,\n\t\t\tex,\n\t\t\tey + dy,\n\t\t\ts_start,\n\t\t\te_start,\n\t\t\theight / 2,\n\t\t\tbaselines\n\t\t);\n\n\t\tconst arrowCoords = getArrowCoords(ex, ey + dy, e_start);\n\t\tlink.$p = `${lineCoords},${arrowCoords}`;\n\t\tlink.$pl = getPolylineLength(link.$p);\n\t}\n\n\treturn link;\n};\n\nfunction getPolylineLength(pointsString: string) {\n\tconst nums = pointsString.split(\",\").map(Number);\n\tconst points = [];\n\n\tfor (let i = 0; i < nums.length; i += 2) {\n\t\tif (i + 1 < nums.length) {\n\t\t\tpoints.push([nums[i], nums[i + 1]]);\n\t\t}\n\t}\n\n\tlet length = 0;\n\tfor (let i = 0; i < points.length - 1; i++) {\n\t\tconst [x1, y1] = points[i];\n\t\tconst [x2, y2] = points[i + 1];\n\t\tlength += Math.hypot(x2 - x1, y2 - y1);\n\t}\n\treturn length;\n}\n\nfunction getLineCoords(\n\tsx: number,\n\tsy: number,\n\tex: number,\n\tey: number,\n\ts_start: boolean,\n\te_start: boolean,\n\tgapp: number,\n\tbaselines: boolean\n): string {\n\tconst shift = delta * (s_start ? -1 : 1);\n\tconst backshift = delta * (e_start ? -1 : 1);\n\n\tconst sx1 = sx + shift;\n\tconst ex1 = ex + backshift;\n\tconst line = [sx, sy, sx1, sy, 0, 0, 0, 0, ex1, ey, ex, ey];\n\n\tconst dx = ex1 - sx1;\n\tlet dy = ey - sy;\n\n\tconst same = e_start === s_start;\n\tif (!same) {\n\t\tif ((ex1 <= sx + delta - 2 && e_start) || (ex1 > sx && !e_start)) {\n\t\t\tdy = baselines ? dy - gapp + 6 : dy - gapp;\n\t\t}\n\t}\n\n\tif ((same && e_start && sx1 > ex1) || (same && !e_start && sx1 < ex1)) {\n\t\tline[4] = line[2] + dx;\n\t\tline[5] = line[3];\n\t\tline[6] = line[4];\n\t\tline[7] = line[5] + dy;\n\t} else {\n\t\tline[4] = line[2];\n\t\tline[5] = line[3] + dy;\n\t\tline[6] = line[4] + dx;\n\t\tline[7] = line[5];\n\t}\n\n\treturn line.join(\",\");\n}\n\nfunction getArrowCoords(x: number, y: number, start: boolean) {\n\tif (start) {\n\t\treturn `${x - 5},${y - 3},${x - 5},${y + 3},${x},${y}`;\n\t} else {\n\t\treturn `${x + 5},${y + 3},${x + 5},${y - 3},${x},${y}`;\n\t}\n}\n\nexport function placeLink(\n\tbox: { left: number; top: number },\n\tstart: { x: number; y: number },\n\tend: { x: number; y: number }\n): { width: number; height: number; left: number; top: number; p: string } {\n\tif (start && end) {\n\t\tconst width = end.x - start.x;\n\t\tconst height = end.y - start.y;\n\t\tconst left = (width > 0 ? start.x : end.x) - box.left;\n\t\tconst top = (height > 0 ? start.y : end.y) - box.top;\n\t\tconst p = `${width > 0 ? 0 : -width},${height > 0 ? 0 : -height},${\n\t\t\twidth > 0 ? width : 0\n\t\t},${height > 0 ? height : 0}`;\n\t\treturn {\n\t\t\twidth: Math.abs(width),\n\t\t\theight: Math.abs(height),\n\t\t\tleft,\n\t\t\ttop,\n\t\t\tp,\n\t\t};\n\t} else {\n\t\treturn null;\n\t}\n}\n\nexport function normalizeLinks(links: ILink[]) {\n\treturn links.map(link => {\n\t\tconst id = link.id || tempID();\n\t\treturn { ...link, id };\n\t});\n}\n","import type { IGanttColumn, ITask } from \"./types\";\n\nconst dateFields = [\"start\", \"end\", \"duration\"];\n\nfunction isCellEditable(task: ITask, columnId: string) {\n\tconst { type, unscheduled } = task;\n\tif (unscheduled || type === \"summary\")\n\t\treturn !dateFields.includes(columnId);\n\telse if (type === \"milestone\")\n\t\treturn ![\"end\", \"duration\"].includes(columnId);\n\treturn true;\n}\nfunction processEditor(\n\tid: string,\n\teditor: IGanttColumn[\"editor\"]\n): IGanttColumn[\"editor\"] {\n\tif (typeof editor === \"function\") return editor;\n\n\tif (dateFields.includes(id)) {\n\t\tif (typeof editor === \"string\") {\n\t\t\teditor = {\n\t\t\t\ttype: editor,\n\t\t\t\tconfig: {},\n\t\t\t};\n\t\t}\n\t\tif (!editor.config) editor.config = {};\n\t\tif (editor.type === \"datepicker\") {\n\t\t\teditor.config.buttons = [\"today\"];\n\t\t}\n\t\treturn (task: ITask, column: IGanttColumn) => {\n\t\t\tif (isCellEditable(task, column.id)) return editor as any;\n\t\t\treturn null;\n\t\t};\n\t}\n\treturn editor;\n}\n\nexport function normalizeColumns(columns: IGanttColumn[]): IGanttColumn[] {\n\tif (!columns || !columns.length) {\n\t\treturn [];\n\t}\n\n\tconst resColumns = columns.map<IGanttColumn>(a => {\n\t\tconst align = a.align || \"left\";\n\t\tconst isAddTaskColumn = a.id === \"add-task\";\n\t\tconst flexgrow = !isAddTaskColumn && a.flexgrow ? a.flexgrow : null;\n\t\tconst width = flexgrow ? 1 : a.width || (isAddTaskColumn ? 50 : 120);\n\n\t\tconst editor = a.editor && processEditor(a.id, a.editor);\n\n\t\treturn {\n\t\t\twidth,\n\t\t\talign,\n\t\t\theader: a.header,\n\t\t\tid: a.id,\n\t\t\ttemplate: a.template,\n\t\t\t_template: a._template,\n\t\t\t...(flexgrow && { flexgrow }),\n\t\t\tcell: a.cell,\n\t\t\tresize: a.resize ?? true,\n\t\t\tsort: a.sort ?? !isAddTaskColumn,\n\t\t\t...(editor && { editor }),\n\t\t\t...(a.options && { options: a.options }),\n\t\t};\n\t});\n\treturn resColumns;\n}\n\nexport const defaultColumns: IGanttColumn[] = [\n\t{ id: \"text\", header: \"Task name\", flexgrow: 1, sort: true },\n\t{ id: \"start\", header: \"Start date\", align: \"center\", sort: true },\n\t{\n\t\tid: \"duration\",\n\t\theader: \"Duration\",\n\t\twidth: 100,\n\t\talign: \"center\",\n\t\tsort: true,\n\t},\n\t{\n\t\tid: \"add-task\",\n\t\theader: \"Add task\",\n\t\twidth: 50,\n\t\talign: \"center\",\n\t\tsort: false,\n\t\tresize: false,\n\t},\n];\n","import type { TID } from \"@svar-ui/lib-state\";\nimport type { GanttDataTree, ILink, IDataHash, ITask } from \"../types\";\nimport { IOptionConfig } from \"./menuOptions\";\nimport { IButtonConfig } from \"./toolbarButtons\";\n\ntype TTarget = TID | IDataHash | null;\n\nexport function handleAction(\n\tapi: any,\n\taction: string,\n\ttarget: TTarget,\n\t_: any\n): void {\n\tconst { selected, tasks } = api.getState();\n\tconst hasSelection = selected.length;\n\t// single-target ops\n\tconst single = [\n\t\t\"edit-task\",\n\t\t\"paste-task\",\n\t\t\"edit-task:task\",\n\t\t\"edit-task:segment\",\n\t];\n\t// do not sort index-/level-wise\n\tconst avoidMap = [\"copy-task\", \"cut-task\"];\n\t// apply in reverse to maintain relative positions\n\tconst reversed = [\n\t\t\"copy-task\",\n\t\t\"cut-task\",\n\t\t\"delete-task\",\n\t\t\"indent-task:remove\",\n\t\t\"move-task:down\",\n\t];\n\t// targetless ops\n\tconst untargeted = [\"add-task\", \"undo\", \"redo\"];\n\t// direct children should move with entire branch\n\tconst checkParent = [\"indent-task:add\", \"move-task:down\", \"move-task:up\"];\n\tconst checkLevel: { [k: string]: number } = {\n\t\t\"indent-task:remove\": 2,\n\t};\n\tconst targetless = !hasSelection && untargeted.includes(action);\n\tconst limit = {\n\t\tparent: checkParent.includes(action),\n\t\tlevel: checkLevel[action],\n\t};\n\n\ttarget = target || (hasSelection ? selected[selected.length - 1] : null);\n\tif (!target && !targetless) return;\n\n\tif (action !== \"paste-task\") api._temp = null;\n\n\tif (single.includes(action) || targetless || selected.length === 1) {\n\t\trunSingleAction(api, action, target, _);\n\t} else if (hasSelection) {\n\t\tconst order = avoidMap.includes(action)\n\t\t\t? selected\n\t\t\t: mapOrder(selected, tasks, limit);\n\t\tif (reversed.includes(action)) {\n\t\t\torder.reverse();\n\t\t}\n\n\t\tconst history = api.getHistory();\n\n\t\t// start batch for mass operations\n\t\tif (history) history.startBatch();\n\t\torder.forEach((id: TID, i: number) =>\n\t\t\trunSingleAction(api, action, id, _, i)\n\t\t);\n\t\t// end batch for mass operations\n\t\tif (history) history.endBatch();\n\t}\n}\n\nfunction mapOrder(\n\tselected: TID[],\n\ttasks: GanttDataTree,\n\tlimit: { parent: boolean; level: number }\n): TID[] {\n\tlet order = selected.map(id => {\n\t\tconst tobj = tasks.byId(id);\n\t\treturn {\n\t\t\tid,\n\t\t\tlevel: tobj.$level,\n\t\t\tparent: tobj.parent,\n\t\t\tindex: tasks.getIndexById(id),\n\t\t};\n\t});\n\tif (limit.parent || limit.level) {\n\t\torder = order.filter(obj => {\n\t\t\tconst ignoreParent = limit.level && obj.level <= limit.level;\n\t\t\treturn ignoreParent || !selected.includes(obj.parent);\n\t\t});\n\t}\n\torder.sort((a, b) => {\n\t\treturn a.level - b.level || a.index - b.index;\n\t});\n\treturn order.map(o => o.id);\n}\n\nfunction runSingleAction(\n\tapi: any,\n\taction: string,\n\ttarget: TTarget,\n\t_: any,\n\torder?: number\n): void {\n\tconst exec = api.exec ? api.exec : api.in.exec;\n\tlet op: string = action.split(\":\")[0];\n\tlet mode: string | boolean = action.split(\":\")[1];\n\tconst id = (target as IDataHash)?.id || target;\n\tlet data: any = { id };\n\tlet extraData: any = {};\n\tlet select: boolean = false;\n\n\tif (op == \"copy-task\" || op == \"cut-task\") {\n\t\tif (!api._temp) api._temp = [];\n\t\tapi._temp.push({ id, cut: op == \"cut-task\" });\n\t\treturn;\n\t} else if (op == \"paste-task\") {\n\t\tif (api._temp && api._temp.length) {\n\t\t\tconst history = api.getHistory();\n\t\t\t// start batch for mass operations\n\t\t\tif (history) history.startBatch();\n\n\t\t\tconst idPairs = new Map<TID, TID>();\n\n\t\t\tapi._temp.forEach((temp: any) => {\n\t\t\t\tconst event = {\n\t\t\t\t\tid: temp.id,\n\t\t\t\t\ttarget: id,\n\t\t\t\t\tmode: \"after\",\n\t\t\t\t};\n\t\t\t\texec(temp.cut ? \"move-task\" : \"copy-task\", event);\n\t\t\t\tidPairs.set(temp.id, event.id);\n\t\t\t});\n\n\t\t\t// if copying tasks, find links between them and copy them too\n\t\t\tif (!api._temp[0].cut) {\n\t\t\t\tconst { links } = api.getState();\n\t\t\t\tconst taskIds = api._temp.map((temp: ILink) => temp.id);\n\t\t\t\tconst relevantLinks: ILink[] = [];\n\n\t\t\t\t// find links where both source and target ids are in copied tasks\n\t\t\t\tlinks.forEach((link: ILink) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\ttaskIds.includes(link.source) &&\n\t\t\t\t\t\ttaskIds.includes(link.target)\n\t\t\t\t\t) {\n\t\t\t\t\t\trelevantLinks.push(link);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\trelevantLinks.forEach((link: ILink) => {\n\t\t\t\t\texec(\"add-link\", {\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\tsource: idPairs.get(link.source),\n\t\t\t\t\t\t\ttarget: idPairs.get(link.target),\n\t\t\t\t\t\t\ttype: link.type,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tapi._temp.forEach((temp: any, i: number) => {\n\t\t\t\t\texec(\"select-task\", {\n\t\t\t\t\t\tid: idPairs.get(temp.id),\n\t\t\t\t\t\ttoggle: !!i,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// end batch for mass operations\n\t\t\tif (history) history.endBatch();\n\t\t\tapi._temp = null;\n\t\t}\n\t\treturn;\n\t} else if (op === \"add-task\") {\n\t\textraData = {\n\t\t\ttask: { type: \"task\", text: _(\"New Task\") },\n\t\t\ttarget: id,\n\t\t\tshow: true,\n\t\t\tselect: false,\n\t\t};\n\t\tdata = {};\n\t\tselect = true;\n\t} else if (op === \"edit-task\") {\n\t\top = \"show-editor\";\n\t\tif (mode === \"segment\" && typeof target === \"object\") {\n\t\t\textraData = target;\n\t\t}\n\t} else if (op === \"convert-task\") {\n\t\top = \"update-task\";\n\t\textraData = { task: { type: mode } };\n\t\tmode = undefined;\n\t} else if (op === \"indent-task\") {\n\t\tmode = mode === \"add\";\n\t}\n\tif (op === \"split-task\" && typeof target === \"object\") {\n\t\textraData = target;\n\t} else if (\n\t\top === \"delete-task\" &&\n\t\tmode === \"segment\" &&\n\t\ttypeof target === \"object\"\n\t) {\n\t\tconst task: ITask = api.getTask(id);\n\t\tconst { segmentIndex } = target;\n\t\tconst segments = task.segments.filter(\n\t\t\t(s, index) => index !== segmentIndex\n\t\t);\n\t\texec(\"update-task\", {\n\t\t\tid,\n\t\t\ttask: { segments },\n\t\t});\n\t\treturn;\n\t}\n\tif (typeof mode !== \"undefined\") extraData = { mode, ...extraData };\n\tdata = { ...data, ...extraData };\n\n\texec(op, data);\n\tif (select) exec(\"select-task\", { id: data.id, toggle: !!order });\n}\n\nexport function isHandledAction(\n\toptions: IOptionConfig[] | IButtonConfig[],\n\tid: TID\n): boolean {\n\treturn options.some(op => {\n\t\tif ((op as IOptionConfig).data)\n\t\t\treturn isHandledAction((op as IOptionConfig).data, id);\n\t\treturn op.id === id;\n\t});\n}\n","import type { ITask, TDurationUnit, IData, Calendar } from \"./types\";\nimport { getDiffer, getAdder } from \"./time\";\nimport { setSummaryDates } from \"./tasks\";\n// #if [!(WX_PACKAGE_TYPE=open)]\nimport { calcSplitDates } from \"./splitTasks.pro\";\n// #endif\n\nconst unitAdd = (unit: TDurationUnit, calendar?: Calendar) =>\n\tgetAdder(unit, calendar);\nconst unitDiff = (unit: TDurationUnit, calendar?: Calendar) =>\n\tgetDiffer(unit, calendar);\n\nexport function parseTaskDates(tasks: ITask[], state: Partial<IData>) {\n\tif (Array.isArray(tasks)) {\n\t\t//calc dates for single task\n\t\ttasks.forEach(task => normalizeDates(task, state));\n\t\t//calc summary dates\n\t\ttasks.forEach(task => {\n\t\t\tif (task.type === \"summary\" && !(task.start && task.end)) {\n\t\t\t\tconst { start, end } = setSummaryDates(task, tasks);\n\t\t\t\ttask.start = start;\n\t\t\t\ttask.end = end;\n\t\t\t\tnormalizeDates(task, state);\n\t\t\t}\n\t\t});\n\t}\n}\n\nexport function normalizeDates(task: Partial<ITask>, state: Partial<IData>) {\n\tif (!task.unscheduled) {\n\t\tcalcDates(task, state, false);\n\t}\n\tif (task.base_start) calcDates(task, state, true);\n}\n\nexport function calcDates(\n\ttask: Partial<ITask>,\n\tstate: Partial<IData>,\n\tisBaseline?: boolean\n) {\n\tconst { calendar, durationUnit } = state;\n\tconst unit = durationUnit || \"day\";\n\tconst [start, end, duration] = getFields(isBaseline);\n\tif (task.type === \"milestone\") {\n\t\ttask[duration] = 0;\n\t\ttask[end] = undefined;\n\t\t// start is must-have for correcting\n\t} else if (task[start]) {\n\t\t// #if [!(WX_PACKAGE_TYPE=open)]\n\t\tif (!isBaseline && state.splitTasks && task.segments)\n\t\t\treturn calcSplitDates(task, state);\n\t\t// #endif\n\t\tif (!task[duration]) {\n\t\t\tif (task[end]) {\n\t\t\t\ttask[duration] = unitDiff(unit, calendar)(\n\t\t\t\t\ttask[end],\n\t\t\t\t\ttask[start]\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\ttask[end] = unitAdd(unit, calendar)(task[start], 1);\n\t\t\t\ttask[duration] = 1;\n\t\t\t}\n\t\t} else {\n\t\t\ttask[end] = unitAdd(unit, calendar)(task[start], task[duration]);\n\t\t}\n\t}\n}\n\nexport function getFields(isBaseline: boolean) {\n\tif (isBaseline) return [\"base_start\", \"base_end\", \"base_duration\"];\n\treturn [\"start\", \"end\", \"duration\"];\n}\n\nfunction prepareDates(task: Partial<ITask>, key: string, isBaseline: boolean) {\n\tconst [start, end, duration] = getFields(isBaseline);\n\tif (key === duration || key === start) {\n\t\ttask[end] = null;\n\t}\n\tif (key === end) {\n\t\ttask[duration] = 0;\n\t\tif (task[start] && task[start] >= task[end]) {\n\t\t\ttask[end] = null;\n\t\t\ttask[duration] = 1;\n\t\t}\n\t}\n}\n\nexport function prepareEditTask(\n\ttask: Partial<ITask>,\n\tstate: Partial<IData>,\n\tkey: string\n) {\n\tprepareDates(task, key, false);\n\tif (task.base_start) prepareDates(task, key, true);\n\n\tnormalizeDates(task, state);\n}\n","import { Store, EventBus, DataArray, DataRouter, tempID } from \"@svar-ui/lib-state\";\nimport type { TDataConfig, TWritableCreator, TID } from \"@svar-ui/lib-state\";\n\nimport GanttDataTree from \"./GanttDataTree\";\nimport { calcScales, resetScales, getMinUnit, zoomScale } from \"./scales\";\nimport {\n\tupdateTask,\n\tdragSummary,\n\tdragSummaryKids,\n\tsetSummaryDates,\n} from \"./tasks\";\nimport { normalizeLinks, updateLink } from \"./links\";\nimport { normalizeColumns } from \"./columns\";\nimport {\n\tgetAdder,\n\tgetDiffer,\n\tisCorrectLengthUnit,\n\tgetUnitStart,\n\tadjustToWorkingDay,\n\tshiftByWorkingDays,\n} from \"./time\";\nimport { isCommunity } from \"./package\";\nimport { handleAction } from \"./helpers/actionHandlers\";\n\n// #if [!(WX_PACKAGE_TYPE=open)]\nimport {\n\tupdateSplitTask,\n\tsplitTask,\n\tdragSplitTask,\n\tisIndivisibleType,\n} from \"./splitTasks.pro\";\n\nimport { HistoryManager } from \"./modules/HistoryManager.pro\";\nimport { AutoSchedulerModule } from \"./modules/AutoScheduler.pro\";\nimport { CriticalPathModule } from \"./modules/CriticalPath.pro\";\nimport type { EventTracker } from \"./modules/EventTracker.pro\";\n// #endif\n\nimport type {\n\tIData,\n\tIDataConfig,\n\tITask,\n\tTMethodsConfig,\n\tIGanttColumn,\n\tIGanttTask,\n\tIGanttLink,\n\tILink,\n\tIVisibleArea,\n\tIZoomConfig,\n\tIParsedTask,\n\tTSort,\n\tTScrollTask,\n} from \"./types\";\n\nimport { isEqual } from \"date-fns\";\nimport { normalizeDates, parseTaskDates } from \"./normalizeDates\";\n\nexport default class DataStore extends Store<IData> {\n\tpublic in: EventBus<TMethodsConfig, keyof TMethodsConfig>;\n\tprivate _router: DataRouter<IData, IDataConfig, TMethodsConfig>;\n\tprivate _modules = new Map<string, any>();\n\n\tconstructor(w: TWritableCreator) {\n\t\tsuper({ writable: w, async: false });\n\n\t\tthis._router = new DataRouter(\n\t\t\tsuper.setState.bind(this),\n\t\t\t// data recalculation dependencies\n\t\t\t[\n\t\t\t\t// recalculate scales in auto-scale mode\n\t\t\t\t{\n\t\t\t\t\tin: [\"tasks\", \"start\", \"end\", \"scales\", \"autoScale\"],\n\t\t\t\t\tout: [\"_start\", \"_end\"],\n\t\t\t\t\texec: (ctx: TDataConfig) => {\n\t\t\t\t\t\tconst {\n\t\t\t\t\t\t\t_end,\n\t\t\t\t\t\t\t_start,\n\t\t\t\t\t\t\tstart,\n\t\t\t\t\t\t\tend,\n\t\t\t\t\t\t\ttasks,\n\t\t\t\t\t\t\tscales,\n\t\t\t\t\t\t\tautoScale,\n\t\t\t\t\t\t} = this.getState();\n\t\t\t\t\t\tif (!start || !end || autoScale) {\n\t\t\t\t\t\t\tconst minUnit = getMinUnit(scales).unit;\n\n\t\t\t\t\t\t\tconst bounds = calcScales(\n\t\t\t\t\t\t\t\tstart,\n\t\t\t\t\t\t\t\tend,\n\t\t\t\t\t\t\t\tautoScale,\n\t\t\t\t\t\t\t\tminUnit,\n\t\t\t\t\t\t\t\ttasks\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (bounds._end != _end || bounds._start != _start)\n\t\t\t\t\t\t\t\tthis.setState(bounds, ctx);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.setState({ _start: start, _end: end }, ctx);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// prepare scale structure for rendering\n\t\t\t\t{\n\t\t\t\t\tin: [\n\t\t\t\t\t\t\"_start\",\n\t\t\t\t\t\t\"_end\",\n\t\t\t\t\t\t\"cellWidth\",\n\t\t\t\t\t\t\"scaleHeight\",\n\t\t\t\t\t\t\"scales\",\n\t\t\t\t\t\t\"lengthUnit\",\n\t\t\t\t\t\t\"_weekStart\",\n\t\t\t\t\t],\n\t\t\t\t\tout: [\"_scales\"],\n\t\t\t\t\texec: (ctx: TDataConfig) => {\n\t\t\t\t\t\tconst state = this.getState();\n\t\t\t\t\t\tlet { lengthUnit } = state;\n\t\t\t\t\t\tconst {\n\t\t\t\t\t\t\t_start,\n\t\t\t\t\t\t\t_end,\n\t\t\t\t\t\t\tcellWidth,\n\t\t\t\t\t\t\tscaleHeight,\n\t\t\t\t\t\t\tscales,\n\t\t\t\t\t\t\t_weekStart,\n\t\t\t\t\t\t} = state;\n\n\t\t\t\t\t\tconst minUnit = getMinUnit(scales).unit;\n\t\t\t\t\t\tif (!isCorrectLengthUnit(minUnit, lengthUnit))\n\t\t\t\t\t\t\tlengthUnit = minUnit;\n\n\t\t\t\t\t\tconst _scales = resetScales(\n\t\t\t\t\t\t\t_start,\n\t\t\t\t\t\t\t_end,\n\t\t\t\t\t\t\tlengthUnit,\n\t\t\t\t\t\t\tcellWidth,\n\t\t\t\t\t\t\tscaleHeight,\n\t\t\t\t\t\t\t_weekStart,\n\t\t\t\t\t\t\tscales\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.setState({ _scales }, ctx);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// prepare tasks positions\n\t\t\t\t{\n\t\t\t\t\tin: [\n\t\t\t\t\t\t\"_scales\",\n\t\t\t\t\t\t\"tasks\",\n\t\t\t\t\t\t\"cellHeight\",\n\t\t\t\t\t\t\"baselines\",\n\t\t\t\t\t\t\"unscheduledTasks\",\n\t\t\t\t\t],\n\t\t\t\t\tout: [\"_tasks\"],\n\t\t\t\t\texec: (ctx: TDataConfig) => {\n\t\t\t\t\t\tconst {\n\t\t\t\t\t\t\tcellWidth,\n\t\t\t\t\t\t\tcellHeight,\n\t\t\t\t\t\t\ttasks,\n\t\t\t\t\t\t\t_scales,\n\t\t\t\t\t\t\tbaselines,\n\t\t\t\t\t\t\tsplitTasks,\n\t\t\t\t\t\t\tunscheduledTasks,\n\t\t\t\t\t\t} = this.getState();\n\n\t\t\t\t\t\tconst _tasks = tasks.toArray().map((task, i) =>\n\t\t\t\t\t\t\tupdateTask(task as IGanttTask, i, {\n\t\t\t\t\t\t\t\tcellWidth,\n\t\t\t\t\t\t\t\tcellHeight,\n\t\t\t\t\t\t\t\t_scales,\n\t\t\t\t\t\t\t\tbaselines,\n\t\t\t\t\t\t\t\tsplitTasks,\n\t\t\t\t\t\t\t\tunscheduledTasks,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.setState({ _tasks }, ctx);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// prepare link positions\n\t\t\t\t{\n\t\t\t\t\tin: [\"_tasks\", \"links\", \"cellHeight\"],\n\t\t\t\t\tout: [\"_links\"],\n\t\t\t\t\texec: (ctx: TDataConfig) => {\n\t\t\t\t\t\tconst {\n\t\t\t\t\t\t\ttasks,\n\t\t\t\t\t\t\tlinks,\n\t\t\t\t\t\t\tcellHeight,\n\t\t\t\t\t\t\tbaselines,\n\t\t\t\t\t\t\tcriticalPath,\n\t\t\t\t\t\t} = this.getState();\n\n\t\t\t\t\t\tconst _links = links\n\t\t\t\t\t\t\t.map<IGanttLink>(link => {\n\t\t\t\t\t\t\t\tconst startTask = tasks.byId(link.source);\n\t\t\t\t\t\t\t\tconst endTask = tasks.byId(link.target);\n\t\t\t\t\t\t\t\treturn updateLink(\n\t\t\t\t\t\t\t\t\tlink as IGanttLink,\n\t\t\t\t\t\t\t\t\tstartTask as IGanttTask,\n\t\t\t\t\t\t\t\t\tendTask as IGanttTask,\n\t\t\t\t\t\t\t\t\tcellHeight,\n\t\t\t\t\t\t\t\t\tbaselines\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.toSorted((a: IGanttLink, b: IGanttLink) => {\n\t\t\t\t\t\t\t\tif (criticalPath) {\n\t\t\t\t\t\t\t\t\t// sort by length (shortest first) when critical status is the same\n\t\t\t\t\t\t\t\t\tif (!!a.$critical === !!b.$critical) {\n\t\t\t\t\t\t\t\t\t\treturn b.$pl - a.$pl;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t// critical links first\n\t\t\t\t\t\t\t\t\treturn a.$critical ? 1 : -1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn b.$pl - a.$pl;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.filter(a => a !== null);\n\t\t\t\t\t\tthis.setState({ _links }, ctx);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// activeTask\n\t\t\t\t{\n\t\t\t\t\tin: [\"tasks\", \"activeTask\"],\n\t\t\t\t\tout: [\"_activeTask\"],\n\t\t\t\t\texec: (ctx: TDataConfig) => {\n\t\t\t\t\t\tconst state = this.getState();\n\t\t\t\t\t\tlet { activeTask } = state;\n\t\t\t\t\t\tif (activeTask && typeof activeTask === \"object\")\n\t\t\t\t\t\t\tactiveTask = activeTask.id;\n\t\t\t\t\t\tconst task = state.tasks.byId(activeTask as TID);\n\t\t\t\t\t\tthis.setState({ _activeTask: task || null }, ctx);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// selection\n\t\t\t\t{\n\t\t\t\t\tin: [\"tasks\", \"selected\"],\n\t\t\t\t\tout: [\"_selected\"],\n\t\t\t\t\texec: (ctx: TDataConfig) => {\n\t\t\t\t\t\tconst { tasks, selected } = this.getState();\n\t\t\t\t\t\tconst _selected = selected\n\t\t\t\t\t\t\t.map(id => tasks.byId(id))\n\t\t\t\t\t\t\t.filter((task: ITask) => !!task);\n\t\t\t\t\t\tthis.setState({ _selected }, ctx);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// restore config cellWidth on scale change\n\t\t\t\t{\n\t\t\t\t\tin: [\"start\", \"end\"],\n\t\t\t\t\tout: [\"cellWidth\"],\n\t\t\t\t\texec: (ctx: TDataConfig) => {\n\t\t\t\t\t\tconst { _cellWidth, cellWidth } = this.getState();\n\t\t\t\t\t\tif (_cellWidth != cellWidth)\n\t\t\t\t\t\t\tthis.setState({ cellWidth: _cellWidth }, ctx);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// #if [!(WX_PACKAGE_TYPE=open)]\n\t\t\t\t{\n\t\t\t\t\tin: [\"markers\", \"_scales\", \"cellWidth\"],\n\t\t\t\t\tout: [\"_markers\"],\n\t\t\t\t\texec: (ctx: TDataConfig) => {\n\t\t\t\t\t\tconst { markers, _scales, cellWidth } = this.getState();\n\t\t\t\t\t\tconst { start, diff } = _scales;\n\t\t\t\t\t\tconst _markers = markers.map(marker => {\n\t\t\t\t\t\t\tmarker.left = diff(marker.start, start) * cellWidth;\n\t\t\t\t\t\t\treturn marker;\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.setState({ _markers }, ctx);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tin: [\"unscheduledTasks\"],\n\t\t\t\t\tout: [\"columns\"],\n\t\t\t\t\texec: (ctx: TDataConfig) => {\n\t\t\t\t\t\tconst { columns, unscheduledTasks } = this.getState();\n\n\t\t\t\t\t\tconst newColumns = columns.map(col => {\n\t\t\t\t\t\t\t//user-defined template\n\t\t\t\t\t\t\tif (!col._template) return col;\n\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tcol.id == \"start\" ||\n\t\t\t\t\t\t\t\tcol.id == \"end\" ||\n\t\t\t\t\t\t\t\tcol.id == \"duration\"\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tcol = {\n\t\t\t\t\t\t\t\t\t...col,\n\t\t\t\t\t\t\t\t\ttemplate: (\n\t\t\t\t\t\t\t\t\t\tb: Date | number,\n\t\t\t\t\t\t\t\t\t\trow: ITask,\n\t\t\t\t\t\t\t\t\t\tcol: IGanttColumn\n\t\t\t\t\t\t\t\t\t) =>\n\t\t\t\t\t\t\t\t\t\trow.unscheduled && unscheduledTasks\n\t\t\t\t\t\t\t\t\t\t\t? \"-\"\n\t\t\t\t\t\t\t\t\t\t\t: col._template(b, row, col),\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn col;\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.setState({ columns: newColumns }, ctx);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// #endif\n\t\t\t],\n\t\t\t// data initializers\n\t\t\t{\n\t\t\t\ttasks: (v: ITask[]) => new GanttDataTree(v),\n\t\t\t\tlinks: (v: ILink[]) => new DataArray(v),\n\t\t\t\tcolumns: (v: IGanttColumn[]) => normalizeColumns(v),\n\t\t\t}\n\t\t);\n\n\t\tconst inBus = (this.in = new EventBus());\n\n\t\t/* before data modifications */\n\t\tinBus.on(\"show-editor\", (ev: TMethodsConfig[\"show-editor\"]) => {\n\t\t\tconst { splitTasks } = this.getState();\n\t\t\tif (splitTasks) {\n\t\t\t\tconst { id, segmentIndex } = ev;\n\t\t\t\tif (id && (segmentIndex || segmentIndex === 0)) {\n\t\t\t\t\tthis.setStateAsync({ activeTask: { id, segmentIndex } });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.setStateAsync({ activeTask: ev.id });\n\t\t});\n\t\tinBus.on(\n\t\t\t\"select-task\",\n\t\t\t({\n\t\t\t\tid,\n\t\t\t\ttoggle,\n\t\t\t\trange,\n\t\t\t\tshow,\n\t\t\t\tsegmentIndex,\n\t\t\t}: TMethodsConfig[\"select-task\"]) => {\n\t\t\t\tconst { selected, _tasks, activeTask, splitTasks } =\n\t\t\t\t\tthis.getState();\n\t\t\t\tlet unselect = false;\n\n\t\t\t\tlet ids;\n\t\t\t\tif (selected.length && (toggle || range)) {\n\t\t\t\t\tconst result = [...selected];\n\n\t\t\t\t\t// in case of Ctrl/Command+Shift, handle as Shift\n\t\t\t\t\tif (range) {\n\t\t\t\t\t\tconst sourceId = result[result.length - 1];\n\t\t\t\t\t\tconst sourceInd = _tasks.findIndex(\n\t\t\t\t\t\t\ttobj => tobj.id == sourceId\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst targetInd = _tasks.findIndex(\n\t\t\t\t\t\t\ttobj => tobj.id == id\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst start = Math.min(sourceInd, targetInd);\n\t\t\t\t\t\tconst end = Math.max(sourceInd, targetInd) + 1;\n\n\t\t\t\t\t\tconst range = _tasks\n\t\t\t\t\t\t\t.slice(start, end)\n\t\t\t\t\t\t\t.map(obj => obj.id);\n\t\t\t\t\t\tif (sourceInd > targetInd) range.reverse();\n\n\t\t\t\t\t\trange.forEach(selId => {\n\t\t\t\t\t\t\tif (!result.includes(selId)) result.push(selId);\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (toggle) {\n\t\t\t\t\t\tconst selIndex = result.findIndex(selId => selId == id);\n\t\t\t\t\t\tif (selIndex === -1) {\n\t\t\t\t\t\t\tresult.push(id);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tunselect = true;\n\t\t\t\t\t\t\tresult.splice(selIndex, 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tids = result;\n\t\t\t\t} else {\n\t\t\t\t\tids = [id];\n\t\t\t\t}\n\t\t\t\tconst update: Partial<IData> = {\n\t\t\t\t\tselected: ids,\n\t\t\t\t};\n\n\t\t\t\tif (show && ids.length)\n\t\t\t\t\tupdate._scrollTask = { id: ids[0], mode: show };\n\n\t\t\t\tthis.setStateAsync(update);\n\n\t\t\t\tif (\n\t\t\t\t\t!unselect &&\n\t\t\t\t\tactiveTask &&\n\t\t\t\t\t(activeTask !== id || splitTasks)\n\t\t\t\t) {\n\t\t\t\t\tinBus.exec(\"show-editor\", {\n\t\t\t\t\t\tid,\n\t\t\t\t\t\t...(splitTasks && { segmentIndex }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t\tinBus.on(\"delete-link\", ({ id }: TMethodsConfig[\"delete-link\"]) => {\n\t\t\tconst { links } = this.getState();\n\t\t\tlinks.remove(id);\n\t\t\tthis.setStateAsync({ links });\n\t\t});\n\t\tinBus.on(\"update-link\", (ev: TMethodsConfig[\"update-link\"]) => {\n\t\t\tconst { links } = this.getState();\n\t\t\tconst id = ev.id;\n\t\t\tlet link = ev.link;\n\n\t\t\tlinks.update(id, link as ILink);\n\t\t\tlink = links.byId(id);\n\n\t\t\tif (!link.lag && link.lag !== 0) delete link.lag;\n\n\t\t\tthis.setStateAsync({ links });\n\n\t\t\tev.link = link;\n\t\t});\n\t\tinBus.on(\"add-link\", (ev: TMethodsConfig[\"add-link\"]) => {\n\t\t\tconst { link } = ev;\n\t\t\tconst { links } = this.getState();\n\n\t\t\tif (!link.source || !link.target) return;\n\t\t\tif (!link.type) link.type = \"e2s\";\n\n\t\t\tlink.id = link.id || tempID();\n\n\t\t\tlinks.add(link as ILink);\n\t\t\tthis.setStateAsync({ links });\n\n\t\t\tev.id = link.id;\n\t\t\tev.link = links.byId(link.id);\n\t\t});\n\n\t\tlet source: TID = null; //stable task parent until final call\n\t\tinBus.on(\"move-task\", (ev: TMethodsConfig[\"move-task\"]) => {\n\t\t\tconst { tasks } = this.getState();\n\t\t\tlet { mode, target } = ev;\n\t\t\tconst { id, inProgress } = ev;\n\t\t\tconst task = tasks.byId(id);\n\n\t\t\tif (typeof inProgress == \"undefined\") ev.source = task.parent;\n\t\t\telse ev.source = source = source ?? task.parent;\n\n\t\t\tif (inProgress === false) {\n\t\t\t\t// end of dnd move\n\t\t\t\ttasks.update(task.id, { $reorder: false });\n\t\t\t\tthis.setState({ tasks });\n\t\t\t\tsource = null;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (target === id || tasks.contains(id, target)) {\n\t\t\t\tev.skipProvider = true;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (mode === \"up\" || mode === \"down\") {\n\t\t\t\tconst parent = tasks.getBranch(id);\n\t\t\t\tlet taskIndex = tasks.getIndexById(id);\n\n\t\t\t\tif (mode === \"up\") {\n\t\t\t\t\tconst isRootBranch = task.parent === 0;\n\t\t\t\t\tif (taskIndex === 0 && isRootBranch) {\n\t\t\t\t\t\tev.skipProvider = true;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\ttaskIndex -= 1;\n\t\t\t\t\tmode = \"before\";\n\t\t\t\t} else if (mode === \"down\") {\n\t\t\t\t\tconst isLastIndex = taskIndex === parent.length - 1;\n\t\t\t\t\tconst isRootBranch = task.parent === 0;\n\n\t\t\t\t\tif (isLastIndex && isRootBranch) {\n\t\t\t\t\t\tev.skipProvider = true;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\ttaskIndex += 1;\n\t\t\t\t\tmode = \"after\";\n\t\t\t\t}\n\n\t\t\t\t// expected target\n\t\t\t\ttarget =\n\t\t\t\t\t(parent[taskIndex] && parent[taskIndex].id) || task.parent;\n\n\t\t\t\tif (target) {\n\t\t\t\t\tconst targetBranch = tasks.getBranch(target);\n\t\t\t\t\tlet targetIndex = tasks.getIndexById(target);\n\t\t\t\t\tlet targetTask = targetBranch[targetIndex];\n\n\t\t\t\t\t// check for branches\n\t\t\t\t\tif (targetTask.data) {\n\t\t\t\t\t\tif (mode === \"before\") {\n\t\t\t\t\t\t\tif (targetTask.parent === task.parent) {\n\t\t\t\t\t\t\t\t// return deepest branch if the task is being moved upwards\n\t\t\t\t\t\t\t\twhile (targetTask.data) {\n\t\t\t\t\t\t\t\t\tif (!targetTask.open)\n\t\t\t\t\t\t\t\t\t\tinBus.exec(\"open-task\", {\n\t\t\t\t\t\t\t\t\t\t\tid: targetTask.id,\n\t\t\t\t\t\t\t\t\t\t\tmode: true,\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\ttargetTask =\n\t\t\t\t\t\t\t\t\t\ttargetTask.data[\n\t\t\t\t\t\t\t\t\t\t\ttargetTask.data.length - 1\n\t\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttarget = targetTask.id;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (mode === \"after\") {\n\t\t\t\t\t\t\tlet targetParent;\n\t\t\t\t\t\t\tif (targetTask.parent === task.parent) {\n\t\t\t\t\t\t\t\t// target is on the same level - add it as the first child to the target branch\n\t\t\t\t\t\t\t\ttargetParent = targetTask;\n\t\t\t\t\t\t\t\ttargetTask = targetTask.data[0];\n\t\t\t\t\t\t\t\ttarget = targetTask.id;\n\n\t\t\t\t\t\t\t\tmode = \"before\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif (targetBranch.length - 1 !== targetIndex) {\n\t\t\t\t\t\t\t\t\ttargetParent = targetTask;\n\t\t\t\t\t\t\t\t\ttargetIndex += 1;\n\t\t\t\t\t\t\t\t\ttargetTask = targetBranch[targetIndex];\n\n\t\t\t\t\t\t\t\t\t// target is on a lower level - add it as the first child to the target branch\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\ttask.$level > targetTask.$level &&\n\t\t\t\t\t\t\t\t\t\ttargetTask.data\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\ttargetParent = targetTask;\n\t\t\t\t\t\t\t\t\t\ttargetTask = targetTask.data[0];\n\t\t\t\t\t\t\t\t\t\ttarget = targetTask.id;\n\n\t\t\t\t\t\t\t\t\t\tmode = \"before\";\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\ttarget = targetTask.id;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (targetParent && !targetParent.open)\n\t\t\t\t\t\t\t\tinBus.exec(\"open-task\", {\n\t\t\t\t\t\t\t\t\tid: targetParent.id,\n\t\t\t\t\t\t\t\t\tmode: true,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst oldSummary = tasks.getSummaryId(task.id);\n\n\t\t\t\t\ttasks.move(id, mode, target);\n\n\t\t\t\t\tconst newSummary = tasks.getSummaryId(id);\n\t\t\t\t\tif (oldSummary != newSummary) {\n\t\t\t\t\t\tif (oldSummary)\n\t\t\t\t\t\t\tthis.resetSummaryDates(oldSummary, \"move-task\");\n\t\t\t\t\t\tif (newSummary)\n\t\t\t\t\t\t\tthis.resetSummaryDates(newSummary, \"move-task\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst targetTask = tasks.byId(target);\n\n\t\t\t\t//prevent moving into itself, copy-paste\n\t\t\t\tlet tobj = targetTask;\n\t\t\t\tlet isDirectDescendant = false;\n\t\t\t\twhile (tobj.$level > task.$level) {\n\t\t\t\t\ttobj = tasks.byId(tobj.parent);\n\t\t\t\t\tif (tobj.id === id) isDirectDescendant = true;\n\t\t\t\t}\n\t\t\t\tif (isDirectDescendant) return;\n\n\t\t\t\tconst oldSummary = tasks.getSummaryId(task.id);\n\n\t\t\t\ttasks.move(id, mode, target);\n\n\t\t\t\tif (mode == \"child\") {\n\t\t\t\t\tlet tobj = targetTask;\n\t\t\t\t\twhile (tobj.id !== 0 && !tobj.open) {\n\t\t\t\t\t\tinBus.exec(\"open-task\", {\n\t\t\t\t\t\t\tid: tobj.id,\n\t\t\t\t\t\t\tmode: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t\ttobj = tasks.byId(tobj.parent);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst newSummary = tasks.getSummaryId(id);\n\t\t\t\tif (oldSummary != newSummary) {\n\t\t\t\t\tif (oldSummary)\n\t\t\t\t\t\tthis.resetSummaryDates(oldSummary, \"move-task\");\n\t\t\t\t\tif (newSummary)\n\t\t\t\t\t\tthis.resetSummaryDates(newSummary, \"move-task\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (inProgress)\n\t\t\t\t//smooth dnd requires sync calculations\n\t\t\t\tthis.setState({ tasks });\n\t\t\telse this.setStateAsync({ tasks });\n\n\t\t\tev.target = target;\n\t\t\tev.mode = mode;\n\t\t});\n\n\t\tinBus.on(\"drag-task\", (ev: TMethodsConfig[\"drag-task\"]) => {\n\t\t\tconst state = this.getState();\n\t\t\tconst { tasks, _tasks, _selected, _scales, cellWidth } = state;\n\t\t\tconst task = tasks.byId(ev.id);\n\t\t\t// #if [!(WX_PACKAGE_TYPE=open)]\n\t\t\tif (ev.segmentIndex >= 0 && state.splitTasks) {\n\t\t\t\tconst updated = dragSplitTask(task, ev);\n\t\t\t\tif (updated === false) {\n\t\t\t\t\tthis.setState({ _tasks });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// #endif\n\t\t\tconst { left, top, width, inProgress } = ev;\n\n\t\t\tconst update: Partial<IData> = { _tasks, _selected };\n\n\t\t\tif (typeof width !== \"undefined\") {\n\t\t\t\ttask.$w = width;\n\t\t\t\tdragSummary(tasks, task, _scales, cellWidth);\n\t\t\t}\n\t\t\tif (typeof left !== \"undefined\") {\n\t\t\t\tif (task.type === \"summary\") {\n\t\t\t\t\tconst dx = left - task.$x;\n\t\t\t\t\tdragSummaryKids(task, dx, _scales, cellWidth);\n\t\t\t\t}\n\t\t\t\ttask.$x = left;\n\t\t\t\tdragSummary(tasks, task, _scales, cellWidth);\n\t\t\t}\n\t\t\tif (typeof top !== \"undefined\") {\n\t\t\t\ttask.$y = top + 4;\n\t\t\t\ttask.$reorder = inProgress;\n\t\t\t}\n\n\t\t\tif (typeof width !== \"undefined\") task.$w = width;\n\t\t\tif (typeof left !== \"undefined\") task.$x = left;\n\t\t\tif (typeof top !== \"undefined\") {\n\t\t\t\ttask.$y = top + 4;\n\t\t\t\ttask.$reorder = inProgress;\n\t\t\t}\n\n\t\t\t// we need not calculate task position,\n\t\t\t// but we need to recalculate things which depends on task positions\n\t\t\tthis.setState(update);\n\t\t});\n\n\t\tinBus.on(\"update-task\", (ev: TMethodsConfig[\"update-task\"]) => {\n\t\t\tconst { id, segmentIndex, diff, eventSource } = ev;\n\t\t\tlet { task } = ev;\n\t\t\tconst { tasks, _scales, durationUnit, splitTasks, calendar } =\n\t\t\t\tthis.getState();\n\n\t\t\tconst t = tasks.byId(id);\n\t\t\tconst stateOptions: Partial<IData> = {\n\t\t\t\t_scales,\n\t\t\t\tdurationUnit,\n\t\t\t\tcalendar,\n\t\t\t\tsplitTasks,\n\t\t\t};\n\n\t\t\tif (\n\t\t\t\teventSource === \"add-task\" ||\n\t\t\t\teventSource === \"copy-task\" ||\n\t\t\t\teventSource === \"move-task\" ||\n\t\t\t\teventSource === \"update-task\" ||\n\t\t\t\teventSource === \"delete-task\" ||\n\t\t\t\teventSource === \"provide-data\"\n\t\t\t) {\n\t\t\t\t// #if [!(WX_PACKAGE_TYPE=open)]\n\t\t\t\tif (splitTasks && t.segments) {\n\t\t\t\t\ttask = updateSplitTask(t, task, stateOptions);\n\t\t\t\t}\n\t\t\t\t// #endif\n\n\t\t\t\tnormalizeDates(task, stateOptions);\n\t\t\t\ttasks.update(id, task);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst minUnit = _scales.lengthUnit;\n\n\t\t\tlet adder = getAdder(minUnit);\n\t\t\tconst differ = getDiffer(minUnit, calendar);\n\n\t\t\tif (diff) {\n\t\t\t\tif (task.start) task.start = adder(task.start, diff);\n\n\t\t\t\tif (!segmentIndex && segmentIndex !== 0) {\n\t\t\t\t\tif (task.start && task.end) {\n\t\t\t\t\t\ttask.duration = t.duration;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// preserve end date to recalculate duration when only start changes\n\t\t\t\t\t\tif (task.start) task.end = t.end;\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\ttask.end = adder(task.end, diff);\n\t\t\t\t\t\t\t// preserve start date and calculate duration to recalculate correct end when only end changes\n\t\t\t\t\t\t\ttask.start = t.start;\n\t\t\t\t\t\t\ttask.duration = differ(task.end, task.start);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!differ(task.end, task.start)) {\n\t\t\t\t\t\t\ttask.duration = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// #if [!(WX_PACKAGE_TYPE=open)]\n\t\t\tif (splitTasks && t.segments) {\n\t\t\t\tif (diff && segmentIndex >= 0 && task.end)\n\t\t\t\t\ttask.end = adder(task.end, diff);\n\t\t\t\ttask = updateSplitTask(\n\t\t\t\t\tt,\n\t\t\t\t\ttask,\n\t\t\t\t\tstateOptions,\n\t\t\t\t\tsegmentIndex,\n\t\t\t\t\tdiff\n\t\t\t\t);\n\t\t\t}\n\t\t\t// #endif\n\n\t\t\ttask.type = task.type ?? t.type;\n\n\t\t\t// adjust start date to nearest working day based on drag direction\n\t\t\tif (calendar && task.start)\n\t\t\t\ttask.start = adjustToWorkingDay(task.start, diff, calendar);\n\n\t\t\tif (task.start && task.end) {\n\t\t\t\tif (\n\t\t\t\t\t!isEqual(task.start, t.start) ||\n\t\t\t\t\t!isEqual(task.end, t.end)\n\t\t\t\t) {\n\t\t\t\t\tif (task.type === \"summary\" && t.data?.length) {\n\t\t\t\t\t\tlet shift = diff || differ(task.start, t.start);\n\t\t\t\t\t\tif (calendar) {\n\t\t\t\t\t\t\t//recalculate real diff\n\t\t\t\t\t\t\tshift =\n\t\t\t\t\t\t\t\ttask.start > t.start\n\t\t\t\t\t\t\t\t\t? differ(task.start, t.start)\n\t\t\t\t\t\t\t\t\t: -differ(t.start, task.start);\n\t\t\t\t\t\t\tadder = shiftByWorkingDays(calendar);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.moveSummaryKids(\n\t\t\t\t\t\t\tt,\n\t\t\t\t\t\t\tdate => {\n\t\t\t\t\t\t\t\tdate = adder(date, shift);\n\t\t\t\t\t\t\t\treturn calendar\n\t\t\t\t\t\t\t\t\t? adjustToWorkingDay(date, diff, calendar)\n\t\t\t\t\t\t\t\t\t: date;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"update-task\"\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// for partial task objects - fill related field for calculation\n\t\t\tif (!task.start) task.start = t.start;\n\t\t\tif (!task.end && !task.duration) task.duration = t.duration;\n\n\t\t\tnormalizeDates(task, stateOptions);\n\t\t\ttasks.update(id, task);\n\n\t\t\tif (\n\t\t\t\t(calendar && task.type === \"summary\") ||\n\t\t\t\t(task.type === \"summary\" && t.type !== \"summary\")\n\t\t\t) {\n\t\t\t\t//silent update for itself\n\t\t\t\tthis.resetSummaryDates(id, \"update-task\", true);\n\t\t\t}\n\n\t\t\tconst summary = tasks.getSummaryId(id);\n\t\t\tif (summary) {\n\t\t\t\tthis.resetSummaryDates(summary, \"update-task\");\n\t\t\t}\n\n\t\t\tthis.setStateAsync({ tasks });\n\n\t\t\tev.task = tasks.byId(id);\n\t\t});\n\n\t\tinBus.on(\"add-task\", (ev: TMethodsConfig[\"add-task\"]) => {\n\t\t\tconst {\n\t\t\t\ttasks,\n\t\t\t\t_scales,\n\t\t\t\tunscheduledTasks,\n\t\t\t\tdurationUnit,\n\t\t\t\tsplitTasks,\n\t\t\t\tcalendar,\n\t\t\t} = this.getState();\n\n\t\t\tconst { target, mode, task, show, select = true } = ev;\n\n\t\t\tif (!ev.eventSource && unscheduledTasks) task.unscheduled = true;\n\t\t\tlet ind = -1;\n\t\t\tlet parent;\n\t\t\tlet targetObj;\n\n\t\t\tif (target) {\n\t\t\t\ttargetObj = tasks.byId(target);\n\t\t\t\tif (mode == \"child\") {\n\t\t\t\t\tparent = targetObj;\n\t\t\t\t\ttask.parent = parent.id;\n\t\t\t\t} else {\n\t\t\t\t\tif (targetObj.parent !== null) {\n\t\t\t\t\t\tparent = tasks.byId(targetObj.parent);\n\t\t\t\t\t\ttask.parent = parent.id;\n\t\t\t\t\t}\n\t\t\t\t\tind = tasks.getIndexById(target);\n\t\t\t\t\tif (mode == \"after\") ind += 1;\n\t\t\t\t}\n\t\t\t} else if (task.parent) parent = tasks.byId(task.parent);\n\n\t\t\tif (!task.start) {\n\t\t\t\tif (parent?.start)\n\t\t\t\t\ttask.start = new Date(parent.start.valueOf());\n\t\t\t\telse if (targetObj)\n\t\t\t\t\ttask.start = new Date(targetObj.start.valueOf());\n\t\t\t\telse {\n\t\t\t\t\tconst branch = tasks.getBranch(0);\n\t\t\t\t\tlet start;\n\t\t\t\t\tif (branch?.length) {\n\t\t\t\t\t\tconst task = branch[branch.length - 1];\n\t\t\t\t\t\tif (!task.$skip) {\n\t\t\t\t\t\t\tconst d = new Date(task.start.valueOf());\n\t\t\t\t\t\t\tif (_scales.start <= d) start = d;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttask.start =\n\t\t\t\t\t\tstart ||\n\t\t\t\t\t\tgetAdder(durationUnit, calendar)(_scales.start, 1);\n\t\t\t\t}\n\t\t\t\ttask.duration = 1;\n\t\t\t}\n\n\t\t\tif (calendar)\n\t\t\t\ttask.start = adjustToWorkingDay(task.start, 1, calendar);\n\n\t\t\tif (this.getState().baselines) {\n\t\t\t\ttask.base_start = task.start;\n\t\t\t\ttask.base_duration = task.duration;\n\t\t\t}\n\n\t\t\tnormalizeDates(task, { durationUnit, splitTasks, calendar });\n\t\t\tconst newTask = tasks.add(task, ind);\n\n\t\t\tconst update: Partial<IData> = {\n\t\t\t\ttasks,\n\t\t\t};\n\n\t\t\tif (parent && show) {\n\t\t\t\twhile (parent && parent.id) {\n\t\t\t\t\tinBus.exec(\"open-task\", {\n\t\t\t\t\t\tid: parent.id,\n\t\t\t\t\t\tmode: true,\n\t\t\t\t\t});\n\t\t\t\t\tparent = tasks.byId(parent.parent);\n\t\t\t\t}\n\n\t\t\t\tupdate._scrollTask = { id: newTask.id, mode: show };\n\t\t\t}\n\n\t\t\tev.id = newTask.id;\n\n\t\t\tconst summary = tasks.getSummaryId(newTask.id);\n\t\t\tif (summary) {\n\t\t\t\tthis.resetSummaryDates(summary, \"add-task\");\n\t\t\t}\n\n\t\t\tthis.setStateAsync(update);\n\n\t\t\tev.id = newTask.id;\n\t\t\tev.task = newTask;\n\n\t\t\tif (select) inBus.exec(\"select-task\", { id: newTask.id });\n\t\t});\n\n\t\tinBus.on(\"delete-task\", (ev: TMethodsConfig[\"delete-task\"]) => {\n\t\t\tconst { id } = ev;\n\t\t\tconst { tasks, links, selected } = this.getState();\n\t\t\tev.source = tasks.byId(id).parent;\n\n\t\t\tconst summary = tasks.getSummaryId(id);\n\n\t\t\tconst toRemove = [id];\n\t\t\ttasks.eachChild(t => toRemove.push(t.id), id);\n\t\t\tlinks.filter(a => {\n\t\t\t\treturn !(\n\t\t\t\t\ttoRemove.includes(a.source) || toRemove.includes(a.target)\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tconst update: Partial<IData> = { tasks, links };\n\t\t\tif (selected.includes(id)) {\n\t\t\t\tupdate.selected = selected.filter(sel => sel !== id);\n\t\t\t}\n\n\t\t\ttasks.remove(id);\n\n\t\t\tif (summary) {\n\t\t\t\tthis.resetSummaryDates(summary, \"delete-task\");\n\t\t\t}\n\n\t\t\tthis.setStateAsync(update);\n\t\t});\n\n\t\tinBus.on(\n\t\t\t\"indent-task\",\n\t\t\t({ id, mode }: TMethodsConfig[\"indent-task\"]) => {\n\t\t\t\tconst { tasks } = this.getState();\n\t\t\t\tif (mode) {\n\t\t\t\t\t// Increase indentation\n\t\t\t\t\tconst parent = tasks.getBranch(id);\n\t\t\t\t\tconst targetTask = parent[tasks.getIndexById(id) - 1];\n\n\t\t\t\t\tif (targetTask)\n\t\t\t\t\t\tinBus.exec(\"move-task\", {\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\tmode: \"child\",\n\t\t\t\t\t\t\ttarget: targetTask.id,\n\t\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Decrease indentation\n\t\t\t\t\tconst task = tasks.byId(id);\n\t\t\t\t\tconst targetTask = tasks.byId(task.parent);\n\n\t\t\t\t\tif (targetTask && targetTask.parent !== null)\n\t\t\t\t\t\tinBus.exec(\"move-task\", {\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\tmode: \"after\",\n\t\t\t\t\t\t\ttarget: task.parent,\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\n\t\tinBus.on(\"copy-task\", (ev: TMethodsConfig[\"copy-task\"]) => {\n\t\t\tconst { id, target, mode, eventSource } = ev;\n\t\t\tif (eventSource === \"copy-task\") return;\n\n\t\t\tconst { tasks, links } = this.getState();\n\t\t\tif (tasks.contains(id, target)) {\n\t\t\t\tev.skipProvider = true;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst oldSummary = tasks.getSummaryId(id);\n\t\t\tconst newSummary = tasks.getSummaryId(target);\n\n\t\t\tlet ind = tasks.getIndexById(target);\n\t\t\tif (mode == \"before\") ind -= 1;\n\n\t\t\tconst origin = tasks.byId(id);\n\t\t\tconst idPairs = tasks.copy(\n\t\t\t\torigin,\n\t\t\t\ttasks.byId(target).parent,\n\t\t\t\tind + 1\n\t\t\t);\n\n\t\t\tev.source = ev.id;\n\t\t\tev.id = idPairs[0][1];\n\t\t\tif (origin.lazy) ev.lazy = true;\n\n\t\t\tif (oldSummary != newSummary && newSummary)\n\t\t\t\tthis.resetSummaryDates(newSummary, \"copy-task\");\n\n\t\t\tlet linkCopies: ILink[] = [];\n\t\t\tfor (let i = 1; i < idPairs.length; i++) {\n\t\t\t\tconst [id, newId] = idPairs[i];\n\t\t\t\tlinks.forEach(link => {\n\t\t\t\t\tif (link.source === id) {\n\t\t\t\t\t\tconst l = { ...link };\n\t\t\t\t\t\tdelete l.target;\n\t\t\t\t\t\tlinkCopies.push({\n\t\t\t\t\t\t\t...l,\n\t\t\t\t\t\t\tsource: newId,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (link.target === id) {\n\t\t\t\t\t\tconst l = { ...link };\n\t\t\t\t\t\tdelete l.source;\n\t\t\t\t\t\tlinkCopies.push({\n\t\t\t\t\t\t\t...l,\n\t\t\t\t\t\t\ttarget: newId,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlinkCopies = linkCopies.reduce((arr, l) => {\n\t\t\t\tconst match = arr.findIndex(r => r.id === l.id);\n\t\t\t\tif (match > -1) arr[match] = { ...arr[match], ...l };\n\t\t\t\telse arr.push(l);\n\t\t\t\treturn arr;\n\t\t\t}, []);\n\n\t\t\tfor (let i = 1; i < idPairs.length; i++) {\n\t\t\t\tconst [id, newId] = idPairs[i];\n\t\t\t\tconst copy = tasks.byId(newId);\n\n\t\t\t\tinBus.exec(\"copy-task\", {\n\t\t\t\t\tsource: id,\n\t\t\t\t\tid: newId,\n\t\t\t\t\tlazy: !!copy.lazy,\n\t\t\t\t\teventSource: \"copy-task\",\n\t\t\t\t\ttarget: copy.parent,\n\t\t\t\t\tmode: \"child\",\n\t\t\t\t\tskipUndo: true,\n\t\t\t\t});\n\t\t\t}\n\t\t\t// relink copied branch links\n\t\t\tlinkCopies.forEach(link => {\n\t\t\t\tinBus.exec(\"add-link\", {\n\t\t\t\t\tlink: {\n\t\t\t\t\t\tsource: link.source,\n\t\t\t\t\t\ttarget: link.target,\n\t\t\t\t\t\ttype: link.type,\n\t\t\t\t\t},\n\t\t\t\t\teventSource: \"copy-task\",\n\t\t\t\t\tskipUndo: true,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tthis.setStateAsync({ tasks });\n\t\t});\n\n\t\tinBus.on(\"open-task\", ({ id, mode }: TMethodsConfig[\"open-task\"]) => {\n\t\t\tconst { tasks } = this.getState();\n\t\t\tconst task = tasks.byId(id);\n\n\t\t\tif (task.lazy) inBus.exec(\"request-data\", { id: task.id });\n\t\t\telse {\n\t\t\t\ttasks.toArray().forEach(t => (t.$y = 0));\n\t\t\t\ttasks.update(id, { open: mode });\n\t\t\t\tthis.setState({ tasks });\n\t\t\t}\n\t\t});\n\n\t\tinBus.on(\n\t\t\t\"scroll-chart\",\n\t\t\t({ left, top }: TMethodsConfig[\"scroll-chart\"]) => {\n\t\t\t\tif (!isNaN(left)) {\n\t\t\t\t\tconst d = this.calcScaleDate(left);\n\t\t\t\t\tthis.setState({\n\t\t\t\t\t\tscrollLeft: left,\n\t\t\t\t\t\t_scaleDate: d,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (!isNaN(top)) this.setState({ scrollTop: top });\n\t\t\t}\n\t\t);\n\n\t\tinBus.on(\"render-data\", (ev: TMethodsConfig[\"render-data\"]) => {\n\t\t\tthis.setState({ area: ev });\n\t\t});\n\n\t\tinBus.on(\"provide-data\", (ev: TMethodsConfig[\"provide-data\"]) => {\n\t\t\tconst { tasks, links, durationUnit, calendar, splitTasks } =\n\t\t\t\tthis.getState();\n\t\t\tconst parent = tasks.byId(ev.id);\n\n\t\t\tif (parent.lazy) {\n\t\t\t\tparent.lazy = false;\n\t\t\t\tparent.open = true;\n\t\t\t} else parent.data = [];\n\n\t\t\tparseTaskDates(ev.data.tasks, {\n\t\t\t\tdurationUnit,\n\t\t\t\tsplitTasks,\n\t\t\t\tcalendar,\n\t\t\t});\n\t\t\ttasks.parse(ev.data.tasks, ev.id);\n\t\t\tif (parent.type == \"summary\")\n\t\t\t\tthis.resetSummaryDates(parent.id, \"provide-data\");\n\t\t\t// fixme: DataArray needs the parse() method\n\t\t\tthis.setStateAsync({\n\t\t\t\ttasks,\n\t\t\t\tlinks: new DataArray(\n\t\t\t\t\tlinks.map(l => l).concat(normalizeLinks(ev.data.links))\n\t\t\t\t),\n\t\t\t});\n\t\t});\n\n\t\tinBus.on(\n\t\t\t\"zoom-scale\",\n\t\t\t({ dir, offset }: TMethodsConfig[\"zoom-scale\"]) => {\n\t\t\t\tconst { zoom, cellWidth, _cellWidth, scrollLeft } =\n\t\t\t\t\tthis.getState();\n\t\t\t\tconst pointerX = offset + scrollLeft;\n\t\t\t\tconst date = this.calcScaleDate(pointerX);\n\t\t\t\tlet w = cellWidth;\n\t\t\t\tif (dir < 0) w = _cellWidth || cellWidth;\n\t\t\t\tconst width = w + dir * 50; // 50px is a zoom step\n\t\t\t\tconst currentLevel = zoom.levels[zoom.level];\n\t\t\t\tconst isExpanded =\n\t\t\t\t\tdir < 0 && cellWidth > currentLevel.maxCellWidth;\n\t\t\t\tif (\n\t\t\t\t\twidth < currentLevel.minCellWidth ||\n\t\t\t\t\twidth > currentLevel.maxCellWidth ||\n\t\t\t\t\tisExpanded\n\t\t\t\t) {\n\t\t\t\t\tif (!this.changeScale(zoom, dir)) return;\n\t\t\t\t} else {\n\t\t\t\t\tthis.setState({ cellWidth: width, _cellWidth: width });\n\t\t\t\t}\n\n\t\t\t\tconst {\n\t\t\t\t\t_scales,\n\t\t\t\t\t_start,\n\t\t\t\t\tcellWidth: cw,\n\t\t\t\t\t_weekStart,\n\t\t\t\t} = this.getState();\n\t\t\t\tconst start = getUnitStart(_scales.minUnit, _start, _weekStart);\n\t\t\t\tconst num = _scales.diff(date, start, \"hour\");\n\t\t\t\tif (typeof offset === \"undefined\") offset = cw;\n\t\t\t\tlet newScrollLeft = Math.round(num * cw) - offset;\n\t\t\t\tif (newScrollLeft < 0) {\n\t\t\t\t\tnewScrollLeft = 0;\n\t\t\t\t}\n\n\t\t\t\tthis.setState({\n\t\t\t\t\tscrollLeft: newScrollLeft,\n\t\t\t\t\t_scaleDate: date,\n\t\t\t\t\t_zoomOffset: offset,\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\n\t\tinBus.on(\n\t\t\t\"expand-scale\",\n\t\t\t({ minWidth }: TMethodsConfig[\"expand-scale\"]) => {\n\t\t\t\tconst {\n\t\t\t\t\t_start,\n\t\t\t\t\t_scales,\n\t\t\t\t\tstart,\n\t\t\t\t\tend,\n\t\t\t\t\t_end,\n\t\t\t\t\tcellWidth,\n\t\t\t\t\t_scaleDate,\n\t\t\t\t\t_zoomOffset,\n\t\t\t\t} = this.getState();\n\t\t\t\tconst adder = getAdder(_scales.minUnit);\n\n\t\t\t\tlet width = _scales.width;\n\t\t\t\tif (start && end) {\n\t\t\t\t\tif (width < minWidth && width) {\n\t\t\t\t\t\tconst k = minWidth / width;\n\t\t\t\t\t\tthis.setState({\n\t\t\t\t\t\t\tcellWidth: cellWidth * k,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tlet step = 0;\n\t\t\t\twhile (width < minWidth) {\n\t\t\t\t\twidth += cellWidth;\n\t\t\t\t\tstep++;\n\t\t\t\t}\n\n\t\t\t\tconst startStep = step ? (end ? -step : -1) : 0;\n\t\t\t\tconst newStart = start || adder(_start, startStep);\n\t\t\t\tlet newScroll = 0;\n\t\t\t\tif (_scaleDate) {\n\t\t\t\t\tconst num = _scales.diff(_scaleDate, newStart, \"hour\");\n\t\t\t\t\tnewScroll = Math.max(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tMath.round(num * cellWidth) - (_zoomOffset || 0)\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tthis.setState({\n\t\t\t\t\t_start: newStart,\n\t\t\t\t\t_end: end || adder(_end, step),\n\t\t\t\t\tscrollLeft: newScroll,\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\t\tinBus.on(\n\t\t\t\"sort-tasks\",\n\t\t\t({ key, order, add }: TMethodsConfig[\"sort-tasks\"]) => {\n\t\t\t\tconst state = this.getState();\n\t\t\t\tconst { tasks } = state;\n\t\t\t\tlet sort = state._sort;\n\t\t\t\tconst sortBy: TSort = { key, order };\n\n\t\t\t\tlet index = sort?.length || 0;\n\t\t\t\tif (index && add) {\n\t\t\t\t\tsort.forEach((a, i) => {\n\t\t\t\t\t\tif (a.key === key) index = i;\n\t\t\t\t\t});\n\t\t\t\t\tsort[index] = sortBy;\n\t\t\t\t} else sort = [sortBy];\n\n\t\t\t\ttasks.sort(sort);\n\t\t\t\tthis.setState({ _sort: sort, tasks });\n\t\t\t}\n\t\t);\n\t\tinBus.on(\n\t\t\t\"hotkey\",\n\t\t\t({ key, event, eventSource }: IDataMethodsConfig[\"hotkey\"]) => {\n\t\t\t\tswitch (key) {\n\t\t\t\t\tcase \"arrowup\":\n\t\t\t\t\tcase \"arrowdown\": {\n\t\t\t\t\t\tconst { selected, _tasks } = this.getState();\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tconst len = selected.length;\n\t\t\t\t\t\tlet id;\n\t\t\t\t\t\tif (key === \"arrowup\") {\n\t\t\t\t\t\t\tid = len\n\t\t\t\t\t\t\t\t? this.getPrevRow(selected[len - 1])?.id\n\t\t\t\t\t\t\t\t: _tasks[_tasks.length - 1]?.id;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tid = len\n\t\t\t\t\t\t\t\t? this.getNextRow(selected[len - 1])?.id\n\t\t\t\t\t\t\t\t: _tasks[0]?.id;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (id) {\n\t\t\t\t\t\t\tconst show = eventSource === \"chart\" ? \"xy\" : true;\n\t\t\t\t\t\t\tthis.in.exec(\"select-task\", { id, show });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"ctrl+c\": {\n\t\t\t\t\t\thandleAction(this, \"copy-task\", null, null);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"ctrl+x\": {\n\t\t\t\t\t\thandleAction(this, \"cut-task\", null, null);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"ctrl+v\": {\n\t\t\t\t\t\thandleAction(this, \"paste-task\", null, null);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"ctrl+d\":\n\t\t\t\t\tcase \"backspace\": {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\thandleAction(this, \"delete-task\", null, null);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"ctrl+z\": {\n\t\t\t\t\t\tthis.in.exec(\"undo\", {});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"ctrl+y\": {\n\t\t\t\t\t\tthis.in.exec(\"redo\", {});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t/*case \"ctrl+e\": {\n\t\t\t\t\tconst { selected, _tasks } = this.getState();\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tconst id = selected.length\n\t\t\t\t\t\t? selected[selected.length - 1]\n\t\t\t\t\t\t: _tasks[0]?.id;\n\n\t\t\t\t\tthis.in.exec(\"show-editor\", { id });\n\t\t\t\t\tbreak;\n\t\t\t\t}*/\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t\t// #if [!(WX_PACKAGE_TYPE=open)]\n\t\tinBus.on(\"undo\", () => {\n\t\t\tthis.getHistory()?.handleUndo();\n\t\t});\n\t\tinBus.on(\"redo\", () => {\n\t\t\tthis.getHistory()?.handleRedo();\n\t\t});\n\t\tinBus.on(\n\t\t\t\"split-task\",\n\t\t\t({ id, segmentIndex }: TMethodsConfig[\"split-task\"]) => {\n\t\t\t\tconst state = this.getState();\n\t\t\t\tconst { tasks, _scales, durationUnit, splitTasks, calendar } =\n\t\t\t\t\tstate;\n\t\t\t\tif (!splitTasks) return;\n\t\t\t\tconst task = tasks.byId(id);\n\t\t\t\tif (isIndivisibleType(task)) return;\n\n\t\t\t\tconst update = splitTask(task, segmentIndex, {\n\t\t\t\t\t_scales,\n\t\t\t\t\tdurationUnit,\n\t\t\t\t\tcalendar,\n\t\t\t\t\tsplitTasks,\n\t\t\t\t});\n\n\t\t\t\tif (update) {\n\t\t\t\t\tinBus.exec(\"update-task\", {\n\t\t\t\t\t\tid,\n\t\t\t\t\t\ttask: update,\n\t\t\t\t\t\teventSource: \"split-task\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t\t// #endif\n\t}\n\n\tinit(state: Partial<IDataConfig>) {\n\t\tconst update: Partial<IDataConfig> = this.getState().area\n\t\t\t? {}\n\t\t\t: {\n\t\t\t\t\tscrollLeft: 0,\n\t\t\t\t\tscrollTop: 0,\n\t\t\t\t\tarea: { from: 0, start: 0, end: 0 },\n\t\t\t\t};\n\n\t\tif (state.cellWidth) state._cellWidth = state.cellWidth;\n\t\tstate._sort = null;\n\n\t\tif (isCommunity()) {\n\t\t\tstate.unscheduledTasks = false;\n\t\t\tstate.baselines = false;\n\t\t\tstate.markers = [];\n\t\t\tstate.undo = false;\n\t\t\tstate.schedule = {};\n\t\t\tstate.criticalPath = null;\n\t\t\tstate.splitTasks = false;\n\t\t}\n\n\t\tif (Array.isArray(state.tasks)) {\n\t\t\tthis.getHistory()?.resetHistory();\n\t\t}\n\n\t\tthis._router.init({\n\t\t\t_scrollTask: null,\n\t\t\tselected: [],\n\t\t\tmarkers: [],\n\t\t\tautoScale: true,\n\t\t\tdurationUnit: \"day\",\n\t\t\t...update,\n\t\t\t...state,\n\t\t});\n\n\t\t// [FIXME] reacts to any external changes to props\n\t\t// must compare prev. and current state (+use the initOnce logic?)\n\n\t\t// #if [!(WX_PACKAGE_TYPE=open)]\n\t\tif (state.schedule?.auto) {\n\t\t\tconst scheduler = this.enableModule(\n\t\t\t\t\"autoScheduler\",\n\t\t\t\tAutoSchedulerModule\n\t\t\t);\n\t\t\t// initial scheduling\n\t\t\tscheduler.schedule(0, true);\n\t\t} else {\n\t\t\tthis.disableModule(\"autoScheduler\");\n\t\t}\n\n\t\tif (state.criticalPath) {\n\t\t\tconst criticalPath = this.enableModule(\n\t\t\t\t\"criticalPath\",\n\t\t\t\tCriticalPathModule\n\t\t\t);\n\t\t\t// initial critical path calculation\n\t\t\tcriticalPath.calculate();\n\t\t} else {\n\t\t\tthis.disableModule(\"criticalPath\");\n\t\t}\n\n\t\tif (state.undo) {\n\t\t\tthis.enableModule(\"historyManager\", HistoryManager);\n\t\t} else this.disableModule(\"historyManager\");\n\t\t// #endif\n\t}\n\t// #if [!(WX_PACKAGE_TYPE=open)]\n\tprivate enableModule<T extends EventTracker>(\n\t\tname: string,\n\t\tModuleClass: new (...args: any[]) => T\n\t): T {\n\t\tif (!this._modules.has(name)) {\n\t\t\tconst plugin = new ModuleClass(\n\t\t\t\tthis.in,\n\t\t\t\tthis.getState.bind(this),\n\t\t\t\tthis.setState.bind(this),\n\t\t\t\tthis.getHistory.bind(this)\n\t\t\t);\n\t\t\tplugin.init();\n\t\t\tthis._modules.set(name, plugin);\n\t\t\treturn plugin;\n\t\t}\n\t\treturn this._modules.get(name) as T;\n\t}\n\n\tprivate disableModule(name: string) {\n\t\tconst plugin = this._modules.get(name);\n\t\tif (plugin) {\n\t\t\tplugin.destroy();\n\t\t\tthis._modules.delete(name);\n\t\t}\n\t}\n\t// #endif\n\n\tsetState(state: Partial<IData>, ctx?: TDataConfig) {\n\t\treturn this._router.setState(state, ctx);\n\t}\n\n\tsetStateAsync(state: Partial<IData>) {\n\t\tthis._router.setStateAsync(state);\n\t}\n\n\tgetTask(id: TID) {\n\t\tconst { tasks } = this.getState();\n\t\treturn tasks.byId(id);\n\t}\n\n\tgetHistory() {\n\t\tif (!this.getState().undo) return null;\n\t\treturn this._modules.get(\"historyManager\") as\n\t\t\t| HistoryManager\n\t\t\t| undefined;\n\t}\n\n\tserialize() {\n\t\tconst { tasks } = this.getState();\n\t\treturn tasks.serialize();\n\t}\n\n\tprivate changeScale(zoom: IZoomConfig, step: number) {\n\t\tconst level = zoom.level + step;\n\t\tconst nextUnit = zoom.levels[level];\n\t\tif (nextUnit) {\n\t\t\tconst { cellWidth, scales, _scales } = this.getState();\n\t\t\tconst scaleState: Partial<IData> = zoomScale(\n\t\t\t\tzoom,\n\t\t\t\tstep,\n\t\t\t\tlevel,\n\t\t\t\tnextUnit,\n\t\t\t\t_scales.lengthUnit,\n\t\t\t\tscales,\n\t\t\t\tcellWidth\n\t\t\t);\n\t\t\tscaleState._cellWidth = scaleState.cellWidth;\n\t\t\tthis.setState(scaleState);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate isScheduled(data: ITask[]) {\n\t\tif (!this.getState().unscheduledTasks) return true;\n\n\t\tconst result = data.some((kid: ITask) => {\n\t\t\treturn !kid.unscheduled || (kid.data && this.isScheduled(kid.data));\n\t\t});\n\t\treturn result;\n\t}\n\n\tprivate resetSummaryDates(id: TID, eventSource: string, silent?: boolean) {\n\t\tconst { tasks, durationUnit, splitTasks, calendar } = this.getState();\n\t\tconst obj = tasks.byId(id);\n\t\tconst kids = obj.data;\n\n\t\t// do not reset dates if there are no kids or all kids are unscheduled\n\t\tif (kids?.length && this.isScheduled(kids)) {\n\t\t\tconst task = setSummaryDates({\n\t\t\t\t...obj,\n\t\t\t\tstart: undefined,\n\t\t\t\tend: undefined,\n\t\t\t\tduration: undefined,\n\t\t\t});\n\n\t\t\tif (\n\t\t\t\t!isEqual(obj.start, task.start) ||\n\t\t\t\t!isEqual(obj.end, task.end)\n\t\t\t) {\n\t\t\t\tif (silent) {\n\t\t\t\t\tnormalizeDates(task, {\n\t\t\t\t\t\tdurationUnit,\n\t\t\t\t\t\tsplitTasks,\n\t\t\t\t\t\tcalendar,\n\t\t\t\t\t});\n\t\t\t\t\ttasks.update(id, task);\n\t\t\t\t} else\n\t\t\t\t\tthis.in.exec(\"update-task\", {\n\t\t\t\t\t\tid,\n\t\t\t\t\t\ttask,\n\t\t\t\t\t\teventSource,\n\t\t\t\t\t\tskipUndo: true,\n\t\t\t\t\t});\n\n\t\t\t\tconst summary = tasks.getSummaryId(id);\n\t\t\t\tif (summary) this.resetSummaryDates(summary, eventSource);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate moveSummaryKids(\n\t\ttask: Partial<ITask>,\n\t\tmove: (date: Date) => Date,\n\t\teventSource: string\n\t) {\n\t\tconst { tasks } = this.getState();\n\n\t\ttask.data.forEach((kid: IParsedTask) => {\n\t\t\tconst task = {\n\t\t\t\t...tasks.byId(kid.id),\n\t\t\t\tstart: move(kid.start),\n\t\t\t};\n\t\t\tdelete task.end;\n\t\t\tdelete task.id;\n\t\t\tthis.in.exec(\"update-task\", {\n\t\t\t\tid: kid.id,\n\t\t\t\ttask,\n\t\t\t\teventSource,\n\t\t\t\tskipUndo: true,\n\t\t\t});\n\n\t\t\tif (kid.data?.length) this.moveSummaryKids(kid, move, eventSource);\n\t\t});\n\t}\n\n\tprivate calcScaleDate(x: number) {\n\t\tconst { _scales, _start, _weekStart } = this.getState();\n\t\tconst width =\n\t\t\t_scales.lengthUnit === \"day\"\n\t\t\t\t? _scales.lengthUnitWidth / 24\n\t\t\t\t: _scales.lengthUnitWidth;\n\t\treturn getAdder(\"hour\")(\n\t\t\tgetUnitStart(_scales.minUnit, _start, _weekStart),\n\t\t\tMath.floor(x / width)\n\t\t);\n\t}\n\tgetNextRow(id: TID): IParsedTask {\n\t\tconst data = this.getState()._tasks;\n\t\tconst index = data.findIndex((t: IParsedTask) => t.id == id);\n\t\treturn data[index + 1];\n\t}\n\n\tgetPrevRow(id: TID): IParsedTask {\n\t\tconst data = this.getState()._tasks;\n\t\tconst index = data.findIndex((t: IParsedTask) => t.id == id);\n\t\treturn data[index - 1];\n\t}\n}\n\ntype CombineTypes<T, N> = {\n\t[P in keyof T]: T[P] & N;\n};\n\nexport type IDataMethodsConfig = CombineTypes<\n\t{\n\t\t[\"add-task\"]: {\n\t\t\tid?: TID;\n\t\t\ttask: Partial<ITask>;\n\t\t\ttarget?: TID;\n\t\t\tmode?: \"before\" | \"after\" | \"child\";\n\t\t\tshow?: TScrollTask[\"mode\"];\n\t\t\tselect?: boolean;\n\t\t\teventSource?: string;\n\t\t};\n\t\t[\"update-task\"]: {\n\t\t\tid: TID;\n\t\t\tsegmentIndex?: number;\n\t\t\ttask: Partial<ITask>;\n\t\t\tdiff?: number;\n\t\t\tinProgress?: boolean;\n\t\t\teventSource?: string;\n\t\t\tskipUndo?: boolean;\n\t\t};\n\t\t[\"delete-task\"]: { id: TID; source?: TID };\n\t\t[\"open-task\"]: { id: TID; mode: boolean };\n\t\t[\"select-task\"]: {\n\t\t\tid: TID;\n\t\t\ttoggle?: boolean;\n\t\t\trange?: boolean;\n\t\t\tshow?: TScrollTask[\"mode\"];\n\t\t};\n\t\t[\"drag-task\"]: {\n\t\t\tid: TID;\n\t\t\tsegmentIndex?: number;\n\t\t\twidth?: number;\n\t\t\tleft?: number;\n\t\t\ttop?: number;\n\t\t\tinProgress?: boolean;\n\t\t};\n\t\t[\"copy-task\"]: {\n\t\t\tid: TID;\n\t\t\ttarget?: TID;\n\t\t\tmode?: \"before\" | \"after\" | \"child\";\n\t\t\tsource?: TID;\n\t\t\tlazy?: boolean;\n\t\t\teventSource?: string;\n\t\t\tskipUndo?: boolean;\n\t\t};\n\t\t[\"move-task\"]: {\n\t\t\tid: TID;\n\t\t\ttarget?: TID;\n\t\t\tmode: \"before\" | \"after\" | \"up\" | \"down\" | \"child\";\n\t\t\tinProgress?: boolean;\n\t\t\tsource?: TID;\n\t\t};\n\n\t\t[\"indent-task\"]: { id: TID; mode: boolean };\n\n\t\t[\"show-editor\"]: { id: TID };\n\t\t[\"add-link\"]: {\n\t\t\tid?: TID;\n\t\t\tlink: Partial<ILink>;\n\t\t\teventSource?: string;\n\t\t\tskipUndo: boolean;\n\t\t};\n\t\t[\"update-link\"]: { id: TID; link: Partial<ILink> };\n\t\t[\"delete-link\"]: { id: TID };\n\n\t\t[\"scroll-chart\"]: { left?: number; top?: number };\n\t\t[\"render-data\"]: IVisibleArea;\n\t\t[\"request-data\"]: {\n\t\t\tid: TID;\n\t\t};\n\t\t[\"provide-data\"]: {\n\t\t\tid: TID;\n\t\t\tdata: {\n\t\t\t\ttasks?: Array<ITask>;\n\t\t\t\tlinks?: Array<ILink>;\n\t\t\t};\n\t\t};\n\n\t\t[\"zoom-scale\"]: { dir: number; date: Date; offset?: number };\n\t\t[\"expand-scale\"]: {\n\t\t\tminWidth: number;\n\t\t\tdate?: Date;\n\t\t\toffset?: number;\n\t\t};\n\t\t[\"sort-tasks\"]: { key: string; order: \"asc\" | \"desc\"; add?: boolean };\n\t\t[\"hotkey\"]: {\n\t\t\tkey: string;\n\t\t\tevent: any;\n\t\t\teventSource?: string;\n\t\t};\n\t\t[\"schedule-tasks\"]: {\n\t\t\tid?: TID;\n\t\t\ttask?: Partial<ITask>;\n\t\t};\n\t\t[\"undo\"]: void;\n\t\t[\"redo\"]: void;\n\t\t[\"split-task\"]: { id: TID; segmentIndex?: number };\n\t},\n\t{\n\t\tskipProvider?: boolean;\n\t\tspipUndo?: boolean;\n\t\t[key: string]: any;\n\t}\n>;\n","// #if [WX_PACKAGE_TYPE=trial]\nimport { isValid, isExpired } from \"../package\";\n// #endif\n\nexport function grid(\n\twidth: number,\n\theight: number,\n\tcolor: string,\n\tmode?: \"full\"\n): string {\n\t// FIXME :: Svelte-kit\n\tif (typeof document === \"undefined\") return \"\";\n\tconst canvas = document.createElement(\"canvas\");\n\n\tlet fillMode = true;\n\t// #if [WX_PACKAGE_TYPE=trial]\n\tfillMode = isValid();\n\tif (!fillMode) {\n\t\tconst ctx = canvasSize(canvas, width, height, 3, color);\n\t\tconst expired = isExpired();\n\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tfor (let j = 0; j < 3; j++) {\n\t\t\t\trenderCell(\n\t\t\t\t\tctx,\n\t\t\t\t\tmode,\n\t\t\t\t\twidth * i,\n\t\t\t\t\twidth * (i + 1),\n\t\t\t\t\theight * j,\n\t\t\t\t\theight * (j + 1)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tctx.font = \"10px monospace\";\n\t\tctx.fillStyle = expired ? \"#ff0000\" : \"#CCCCCC\";\n\t\tctx.translate(width * (expired ? 1.35 : 1.5), height * 1.5);\n\t\tctx.rotate(Math.PI / 6);\n\t\tctx.fillText(\n\t\t\texpired ? atob(\"VFJJQUwgRVhQSVJFRA==\") : atob(\"VFJJQUw=\"),\n\t\t\t-15,\n\t\t\t4\n\t\t);\n\t}\n\t// #endif\n\n\tif (fillMode) {\n\t\tconst ctx = canvasSize(canvas, width, height, 1, color);\n\t\trenderCell(ctx, mode, 0, width, 0, height);\n\t}\n\t// #endif\n\treturn canvas.toDataURL();\n}\n\nfunction canvasSize(\n\tcanvas: HTMLCanvasElement,\n\twidth: number,\n\theight: number,\n\tzoom: number,\n\tcolor: string\n): CanvasRenderingContext2D {\n\tcanvas.setAttribute(\"width\", (width * zoom).toString());\n\tcanvas.setAttribute(\"height\", (height * zoom).toString());\n\tconst ctx = canvas.getContext(\"2d\");\n\tctx.translate(-0.5, -0.5);\n\tctx.strokeStyle = color;\n\n\treturn ctx;\n}\n\nfunction renderCell(\n\tctx: CanvasRenderingContext2D,\n\tmode: string,\n\txA: number,\n\txB: number,\n\tyA: number,\n\tyB: number\n) {\n\tctx.beginPath();\n\tctx.moveTo(xB, yA);\n\tctx.lineTo(xB, yB);\n\n\tif (mode === \"full\") ctx.lineTo(xA, yB);\n\tctx.stroke();\n}\n","import type { TID } from \"@svar-ui/lib-state\";\nimport type {\n\tITask,\n\tIParsedTask,\n\tIHistory,\n\tIData,\n\tIDataConfig,\n\tIDataHash,\n} from \"../types\";\n// #if [!(WX_PACKAGE_TYPE=open)]\nimport { isIndivisible } from \"../splitTasks.pro\";\n// #endif\n\nexport function getMenuOptions(config: IDataConfig) {\n\tlet options = [...defaultMenuOptions];\n\n\t// #if [!(WX_PACKAGE_TYPE=open)]\n\tif (config?.splitTasks) {\n\t\toptions.splice(4, 0, {\n\t\t\tid: \"split-task\",\n\t\t\ttext: \"Split\",\n\t\t\ticon: \"wxi-arrow-split\",\n\t\t});\n\t\toptions.splice(4, 0, {\n\t\t\tid: \"edit\",\n\t\t\ttext: \"Edit\",\n\t\t\ticon: \"wxi-edit\",\n\t\t\tdata: [\n\t\t\t\t{\n\t\t\t\t\tid: \"edit-task:task\",\n\t\t\t\t\ttext: \"Task\",\n\t\t\t\t\tisHidden: (t, s, target) => !isSegment(target),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"edit-task:segment\",\n\t\t\t\t\ttext: \"Segment\",\n\t\t\t\t\tisHidden: (t, s, target) => !isSegment(target),\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\t\toptions.push({\n\t\t\tid: \"delete\",\n\t\t\ticon: \"wxi-delete\",\n\t\t\ttext: \"Delete\",\n\t\t\tdata: [\n\t\t\t\t{\n\t\t\t\t\tid: \"delete-task:task\",\n\t\t\t\t\ttext: \"Task\",\n\t\t\t\t\tisHidden: (t, s, target) =>\n\t\t\t\t\t\t!isSingle(s) || !isSegment(target),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"delete-task:segment\",\n\t\t\t\t\ttext: \"Segment\",\n\t\t\t\t\tisHidden: (t, s, target) =>\n\t\t\t\t\t\t!isSingle(s) || !isSegment(target),\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\t}\n\tif (options.length > defaultMenuOptions.length)\n\t\toptions = assignChecks(options);\n\t// #endif\n\treturn options;\n}\n\nexport interface IOptionConfig {\n\tid?: TID;\n\tseparator?: boolean;\n\ttext?: string;\n\ticon?: string;\n\tdata?: IOptionConfig[];\n\ttype?: string;\n\tisDisabled?:\n\t\t| ((\n\t\t\t\ttask: IParsedTask,\n\t\t\t\tstate: IData,\n\t\t\t\ttarget?: TID | IDataHash\n\t\t ) => boolean)\n\t\t| ((history: IHistory) => boolean);\n\tdataFactory?: (obj: any) => IOptionConfig;\n\tsubtext?: string;\n\tisHidden?: (\n\t\ttask: IParsedTask,\n\t\tstate: IData,\n\t\ttarget?: TID | IDataHash\n\t) => boolean;\n}\n\nexport function assignChecks<T extends IOptionConfig>(items: T[]): T[] {\n\treturn items.map(item => {\n\t\tif (item.data) assignChecks(item.data);\n\n\t\tswitch (item.id) {\n\t\t\tcase \"add-task:before\":\n\t\t\tcase \"move-task:up\":\n\t\t\t\titem.isDisabled = (task, state) => isFirstTask(task, state);\n\t\t\t\tbreak;\n\t\t\tcase \"move-task:down\":\n\t\t\t\titem.isDisabled = (task, state) => isLastTask(task, state);\n\t\t\t\tbreak;\n\t\t\tcase \"indent-task:add\":\n\t\t\t\titem.isDisabled = (task, state) =>\n\t\t\t\t\tprevTaskID(task, state) === task.parent;\n\t\t\t\tbreak;\n\t\t\tcase \"indent-task:remove\":\n\t\t\t\titem.isDisabled = (task: IParsedTask) => isRootTask(task);\n\t\t\t\tbreak;\n\t\t\t// #if [!(WX_PACKAGE_TYPE=open)]\n\t\t\tcase \"undo\":\n\t\t\t\titem.isDisabled = (history: IHistory) => !history.undo;\n\t\t\t\tbreak;\n\t\t\tcase \"redo\":\n\t\t\t\titem.isDisabled = (history: IHistory) => !history.redo;\n\t\t\t\tbreak;\n\t\t\tcase \"split-task\":\n\t\t\t\titem.isDisabled = (task, state, target) => {\n\t\t\t\t\tlet index;\n\t\t\t\t\tif (typeof target === \"object\") index = target.segmentIndex;\n\t\t\t\t\treturn isIndivisible(task, state, index);\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\t// #endif\n\t\t}\n\t\treturn item;\n\t});\n}\n\nfunction isRootTask(task: ITask) {\n\treturn task.parent === 0;\n}\n\nfunction isFirstTask(task: ITask, state: IData): boolean {\n\tconst { _tasks } = state;\n\treturn _tasks[0]?.id === task.id;\n}\nfunction isLastTask(task: ITask, state: IData): boolean {\n\tconst { _tasks } = state;\n\treturn _tasks[_tasks.length - 1]?.id === task.id;\n}\nfunction prevTaskID(task: ITask, state: IData): TID {\n\tconst { _tasks } = state;\n\tconst taskIndex = _tasks.findIndex(t => t.id === task.id);\n\treturn _tasks[taskIndex - 1]?.id ?? task.parent;\n}\n\nfunction isSegment(target: TID | IDataHash): boolean {\n\treturn target && typeof target === \"object\";\n}\nfunction isSingle(s: IData): boolean {\n\treturn !s.selected || s.selected.length < 2;\n}\n\nconst exclude = (v: any) => (task: ITask) => task.type === v;\n\nexport const defaultMenuOptions: IOptionConfig[] = assignChecks<IOptionConfig>([\n\t{\n\t\tid: \"add-task\",\n\t\ttext: \"Add\",\n\t\ticon: \"wxi-plus\",\n\t\tdata: [\n\t\t\t{ id: \"add-task:child\", text: \"Child task\" },\n\t\t\t{ id: \"add-task:before\", text: \"Task above\" },\n\t\t\t{ id: \"add-task:after\", text: \"Task below\" },\n\t\t],\n\t},\n\t{ type: \"separator\" },\n\t{\n\t\tid: \"convert-task\",\n\t\ttext: \"Convert to\",\n\t\ticon: \"wxi-swap-horizontal\",\n\t\tdataFactory: type => ({\n\t\t\tid: `convert-task:${type.id}`,\n\t\t\ttext: `${type.label}`,\n\t\t\tisDisabled: exclude(type.id),\n\t\t}),\n\t},\n\t{\n\t\tid: \"edit-task\",\n\t\ttext: \"Edit\",\n\t\ticon: \"wxi-edit\",\n\t\tisHidden: (t, s, target) => isSegment(target),\n\t},\n\t{ type: \"separator\" },\n\t{ id: \"cut-task\", text: \"Cut\", icon: \"wxi-content-cut\", subtext: \"Ctrl+X\" },\n\t{\n\t\tid: \"copy-task\",\n\t\ttext: \"Copy\",\n\t\ticon: \"wxi-content-copy\",\n\t\tsubtext: \"Ctrl+C\",\n\t},\n\t{\n\t\tid: \"paste-task\",\n\t\ttext: \"Paste\",\n\t\ticon: \"wxi-content-paste\",\n\t\tsubtext: \"Ctrl+V\",\n\t},\n\t{\n\t\tid: \"move-task\",\n\t\ttext: \"Move\",\n\t\ticon: \"wxi-swap-vertical\",\n\t\tdata: [\n\t\t\t{ id: \"move-task:up\", text: \"Up\" },\n\t\t\t{ id: \"move-task:down\", text: \"Down\" },\n\t\t],\n\t},\n\t{ type: \"separator\" },\n\t{ id: \"indent-task:add\", text: \"Indent\", icon: \"wxi-indent\" },\n\t{ id: \"indent-task:remove\", text: \"Outdent\", icon: \"wxi-unindent\" },\n\t{ type: \"separator\" },\n\t{\n\t\tid: \"delete-task\",\n\t\ticon: \"wxi-delete\",\n\t\ttext: \"Delete\",\n\t\tsubtext: \"Ctrl+D / BS\",\n\t\tisHidden: (t, s, target) => isSingle(s) && isSegment(target),\n\t},\n]);\n","import { assignChecks } from \"./menuOptions\";\nimport type {\n\tIData,\n\tIDataHash,\n\tIParsedTask,\n\tIHistory,\n\tIDataConfig,\n} from \"../types\";\nimport type { TID } from \"@svar-ui/lib-state\";\n\nexport function getToolbarButtons(config: IDataConfig) {\n\tlet buttons = [...defaultToolbarButtons];\n\n\t// #if [!(WX_PACKAGE_TYPE=open)]\n\tif (config?.undo) {\n\t\tbuttons = buttons.concat([\n\t\t\t{ comp: \"separator\" },\n\t\t\t{\n\t\t\t\tid: \"undo\",\n\t\t\t\tcomp: \"icon\",\n\t\t\t\ticon: \"wxi-undo\",\n\t\t\t\tmenuText: \"Undo\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"redo\",\n\t\t\t\tcomp: \"icon\",\n\t\t\t\ticon: \"wxi-redo\",\n\t\t\t\tmenuText: \"Redo\",\n\t\t\t},\n\t\t]);\n\t}\n\tif (config?.splitTasks) {\n\t\tbuttons.splice(2, 0, {\n\t\t\tid: \"split-task\",\n\t\t\tcomp: \"icon\",\n\t\t\ticon: \"wxi-arrow-split\",\n\t\t\tmenuText: \"Split\",\n\t\t});\n\t}\n\tif (buttons.length > defaultToolbarButtons.length)\n\t\tbuttons = assignChecks(buttons);\n\t// #endif\n\treturn buttons;\n}\n\nexport interface IButtonConfig {\n\tid?: string;\n\tcomp: string;\n\ttext?: string;\n\ticon?: string;\n\ttype?: string;\n\tmenuText?: string;\n\tisDisabled?:\n\t\t| ((\n\t\t\t\ttask: IParsedTask,\n\t\t\t\tstate: IData,\n\t\t\t\ttarget?: TID | IDataHash\n\t\t ) => boolean)\n\t\t| ((history: IHistory) => boolean);\n\tisHidden?: (\n\t\ttask: IParsedTask,\n\t\tstate: IData,\n\t\ttarget?: TID | IDataHash\n\t) => boolean;\n}\n\nexport const defaultToolbarButtons: IButtonConfig[] =\n\tassignChecks<IButtonConfig>([\n\t\t{\n\t\t\tid: \"add-task\",\n\t\t\tcomp: \"button\",\n\t\t\ticon: \"wxi-plus\",\n\t\t\ttext: \"New task\",\n\t\t\ttype: \"primary\",\n\t\t},\n\t\t{\n\t\t\tid: \"edit-task\",\n\t\t\tcomp: \"icon\",\n\t\t\ticon: \"wxi-edit\",\n\t\t\tmenuText: \"Edit\",\n\t\t\ttext: \"Ctrl+E\",\n\t\t},\n\t\t{\n\t\t\tid: \"delete-task\",\n\t\t\tcomp: \"icon\",\n\t\t\ticon: \"wxi-delete\",\n\t\t\tmenuText: \"Delete\",\n\t\t\ttext: \"Ctrl+D, Backspace\",\n\t\t},\n\t\t{ comp: \"separator\" },\n\t\t{\n\t\t\tid: \"move-task:up\",\n\t\t\tcomp: \"icon\",\n\t\t\ticon: \"wxi-angle-up\",\n\t\t\tmenuText: \"Move up\",\n\t\t},\n\t\t{\n\t\t\tid: \"move-task:down\",\n\t\t\tcomp: \"icon\",\n\t\t\ticon: \"wxi-angle-down\",\n\t\t\tmenuText: \"Move down\",\n\t\t},\n\t\t{ comp: \"separator\" },\n\t\t{\n\t\t\tid: \"copy-task\",\n\t\t\tcomp: \"icon\",\n\t\t\ticon: \"wxi-content-copy\",\n\t\t\tmenuText: \"Copy\",\n\t\t\ttext: \"Ctrl+V\",\n\t\t},\n\t\t{\n\t\t\tid: \"cut-task\",\n\t\t\tcomp: \"icon\",\n\t\t\ticon: \"wxi-content-cut\",\n\t\t\tmenuText: \"Cut\",\n\t\t\ttext: \"Ctrl+X\",\n\t\t},\n\t\t{\n\t\t\tid: \"paste-task\",\n\t\t\tcomp: \"icon\",\n\t\t\ticon: \"wxi-content-paste\",\n\t\t\tmenuText: \"Paste\",\n\t\t\ttext: \"Ctrl+V\",\n\t\t},\n\t\t{ comp: \"separator\" },\n\t\t{\n\t\t\tid: \"indent-task:add\",\n\t\t\tcomp: \"icon\",\n\t\t\ticon: \"wxi-indent\",\n\t\t\tmenuText: \"Indent\",\n\t\t},\n\t\t{\n\t\t\tid: \"indent-task:remove\",\n\t\t\tcomp: \"icon\",\n\t\t\ticon: \"wxi-unindent\",\n\t\t\tmenuText: \"Outdent\",\n\t\t},\n\t]);\n","import type { TEditorItem, ITask, IData, IDataConfig } from \"../types\";\n\nfunction isSummary(task: Partial<ITask>) {\n\treturn task.type === \"summary\";\n}\n\nfunction isMilestone(task: Partial<ITask>) {\n\treturn task.type === \"milestone\";\n}\n\nfunction isSegment(task: Partial<ITask>): boolean {\n\treturn typeof task.parent === \"undefined\";\n}\n\nfunction isUnscheduled(task: Partial<ITask>, state: IData) {\n\treturn state.unscheduledTasks && task.unscheduled;\n}\n\nexport function getEditorItems(config: IDataConfig) {\n\tconst items = [...defaultEditorItems];\n\n\t// #if [!(WX_PACKAGE_TYPE=open)]\n\tif (config?.unscheduledTasks)\n\t\titems.splice(6, 0, {\n\t\t\tkey: \"unscheduled\",\n\t\t\tcomp: \"twostate\",\n\t\t\tlabel: \"\",\n\t\t\tconfig: { value: true, text: \"Unschedule\", textActive: \"Schedule\" },\n\t\t\tisHidden: task => isSummary(task) || isSegment(task),\n\t\t});\n\t// #endif\n\treturn items;\n}\n\nexport const defaultEditorItems: TEditorItem[] = [\n\t{\n\t\tkey: \"text\",\n\t\tcomp: \"text\",\n\t\tlabel: \"Name\",\n\t\tconfig: {\n\t\t\tplaceholder: \"Add task name\",\n\t\t},\n\t},\n\t{\n\t\tkey: \"details\",\n\t\tcomp: \"textarea\",\n\t\tlabel: \"Description\",\n\t\tconfig: {\n\t\t\tplaceholder: \"Add description\",\n\t\t},\n\t},\n\t{\n\t\tkey: \"type\",\n\t\tcomp: \"select\",\n\t\tlabel: \"Type\",\n\t\tisHidden: task => isSegment(task),\n\t},\n\t{\n\t\tkey: \"start\",\n\t\tcomp: \"date\",\n\t\tlabel: \"Start date\",\n\t\tisHidden: task => isSummary(task),\n\t\tisDisabled: isUnscheduled,\n\t},\n\t{\n\t\tkey: \"end\",\n\t\tcomp: \"date\",\n\t\tlabel: \"End date\",\n\t\tisHidden: task => isSummary(task) || isMilestone(task),\n\t\tisDisabled: isUnscheduled,\n\t},\n\t{\n\t\tkey: \"duration\",\n\t\tcomp: \"counter\",\n\t\tlabel: \"Duration\",\n\t\tconfig: {\n\t\t\tmin: 1,\n\t\t},\n\t\tisHidden: task => isSummary(task) || isMilestone(task),\n\t\tisDisabled: isUnscheduled,\n\t},\n\t{\n\t\tkey: \"progress\",\n\t\tcomp: \"slider\",\n\t\tlabel: \"Progress\",\n\t\tconfig: {\n\t\t\tmin: 1,\n\t\t\tmax: 100,\n\t\t},\n\t\tisHidden: task => isMilestone(task) || isSegment(task),\n\t},\n\t{\n\t\tkey: \"links\",\n\t\tcomp: \"links\",\n\t\tlabel: \"\",\n\t\tisHidden: task => isSegment(task),\n\t},\n];\n","import { ITaskType } from \"./types\";\n\nexport const defaultTaskTypes: ITaskType[] = [\n\t{ id: \"task\", label: \"Task\" },\n\t{ id: \"summary\", label: \"Summary task\" },\n\t{ id: \"milestone\", label: \"Milestone\" },\n];\n"],"names":["iid","uid","tempID","_DataArray","raw","i","obj","id","index","link","updated","a","cb","x","check","DataTree","top","items","parent","temp","insertElement","after","node","indexById","values","branch","mode","target","now","dropChild","tobj","tLevel","newParent","deleteElement","newIndex","out","kids","toArray","value","key","p","child","root","level","copy","line","newData","item","parentNode","STORE_SET_SILENT","Store","config","data","signals","state","os","ov","nv","fullKey","v","fullKey2","signals2","val","ss","__triggerSync","fn","DataRouter","s","r","b","k","arr","h","_calckSize","cfg","next","parser","updates","ctx","keys","needExec","trgs","sources","prev","sizes","EventBus","name","handler","tag","stack","ev","res","sortAsc","localeCompare","undefined","numeric","getTime","sortDesc","sortBy","order","sortMethod","sortByMany","sortArray","length","sorts","map","sort","conf","GanttDataTree","_sort","constructor","tasks","parse","preparedTasks","task","normalizeTask","sortBranch","getBranch","_pool","get","contains","getIndexById","findIndex","add","normalizedTask","taskObj","ind","n","ids","forEach","kid","kIds","concat","parentId","text","type","progress","details","segments","getSummaryId","all","currentId","parents","push","serialize","toDate","argument","argStr","constructFrom","date","addDays","amount","_date","addMonths","dayOfMonth","endOfDesiredMonth","daysInMonth","addMilliseconds","timestamp","millisecondsInWeek","millisecondsInDay","millisecondsInMinute","millisecondsInHour","addHours","defaultOptions","getDefaultOptions","startOfWeek","options","weekStartsOn","day","diff","startOfISOWeek","getISOWeekYear","year","fourthOfJanuaryOfNextYear","startOfNextYear","fourthOfJanuaryOfThisYear","startOfThisYear","startOfDay","getTimezoneOffsetInMilliseconds","utcDate","differenceInCalendarDays","dateLeft","dateRight","startOfDayLeft","startOfDayRight","timestampLeft","timestampRight","startOfISOWeekYear","fourthOfJanuary","addMinutes","addQuarters","months","addWeeks","days","addYears","compareAsc","_dateLeft","_dateRight","isSameDay","dateLeftStartOfDay","dateRightStartOfDay","isDate","isValid","differenceInCalendarISOWeeks","startOfISOWeekLeft","startOfISOWeekRight","differenceInCalendarMonths","yearDiff","monthDiff","differenceInCalendarYears","getRoundingMethod","method","number","result","differenceInMilliseconds","differenceInHours","differenceInMinutes","endOfDay","endOfMonth","month","isLastDayOfMonth","differenceInMonths","sign","difference","isLastMonthNotFull","differenceInQuarters","differenceInYears","isLastYearNotFull","startOfQuarter","currentMonth","startOfMonth","endOfYear","startOfYear","cleanDate","endOfHour","endOfWeek","endOfQuarter","formatDistanceLocale","formatDistance","token","count","tokenValue","buildFormatLongFn","args","width","dateFormats","timeFormats","dateTimeFormats","formatLong","formatRelativeLocale","formatRelative","_baseDate","_options","buildLocalizeFn","context","valuesArray","defaultWidth","eraValues","quarterValues","monthValues","dayValues","dayPeriodValues","formattingDayPeriodValues","ordinalNumber","dirtyNumber","rem100","localize","quarter","buildMatchFn","string","matchPattern","matchResult","matchedString","parsePatterns","pattern","findKey","rest","object","predicate","array","buildMatchPatternFn","parseResult","matchOrdinalNumberPattern","parseOrdinalNumberPattern","matchEraPatterns","parseEraPatterns","matchQuarterPatterns","parseQuarterPatterns","matchMonthPatterns","parseMonthPatterns","matchDayPatterns","parseDayPatterns","matchDayPeriodPatterns","parseDayPeriodPatterns","match","enUS","getDayOfYear","getISOWeek","getWeekYear","firstWeekContainsDate","firstWeekOfNextYear","firstWeekOfThisYear","startOfWeekYear","firstWeek","getWeek","addLeadingZeros","targetLength","output","lightFormatters","signedYear","dayPeriodEnumValue","numberOfDigits","milliseconds","fractionalSeconds","dayPeriodEnum","formatters","era","signedWeekYear","weekYear","twoDigitYear","isoWeekYear","week","isoWeek","dayOfYear","dayOfWeek","localDayOfWeek","isoDayOfWeek","hours","_localize","timezoneOffset","formatTimezoneWithOptionalMinutes","formatTimezone","formatTimezoneShort","offset","delimiter","absOffset","minutes","dateLongFormatter","timeLongFormatter","dateTimeLongFormatter","datePattern","timePattern","dateTimeFormat","longFormatters","dayOfYearTokenRE","weekYearTokenRE","throwTokens","isProtectedDayOfYearToken","isProtectedWeekYearToken","warnOrThrowProtectedError","format","input","_message","message","subject","formattingTokensRegExp","longFormattingTokensRegExp","escapedStringRegExp","doubleQuoteRegExp","unescapedLatinCharacterRegExp","formatStr","locale","defaultLocale","originalDate","parts","substring","firstCharacter","longFormatter","cleanEscapedString","formatterOptions","part","formatter","matched","getDaysInMonth","monthIndex","lastDayOfMonth","isLeapYear","getDaysInYear","getISOWeeksInYear","thisYear","isEqual","leftDate","rightDate","startOfHour","isSameWeek","dateLeftStartOfWeek","dateRightStartOfWeek","isSameMonth","isSameQuarter","dateLeftStartOfQuarter","dateRightStartOfQuarter","isSameYear","hour","minute","smallerCount","daysInYear","hoursInYear","weeksInQuarter","daysInQuarter","hoursInQuarter","weeksInMonth","hoursInMonth","start","end","getSmallerUnitCount","unit","lengthUnit","isCorrectLengthUnit","minUnit","getDiffer","calendar","_weekStart","getWorkingDays","getWorkingHours","unitSize","isSameUnit","innerDiff","getLengthUnitDiff","getUnitStart","getAdder","filled","lengthUnitsOfFirstUnit","unitStart","nextUnitStart","units","addWorkingDays","addWorkingHours","startHandlers","Date","endHandlers","sameHandlers","handlers","isSame","getCount","registerScaleUnit","baseUnit","Object","indexOf","shift","baseSmallerCount","unitI","countI","splice","parentUnit","adjustToWorkingDay","isWorkingDay","getNextWorkingDay","getPreviousWorkingDay","shiftByWorkingDays","getMinUnit","scales","len","defaultMinCellWidth","defaultMaxCellWidth","calcScales","prevStart","prevEnd","autoScale","_start","_end","_sFix","_eFix","t","taskEnd","adder","resetScales","height","numOfMinUnits","tempEnd","fullWidth","fullHeight","rows","cells","step","cellStart","cellEnd","cellWidth","css","lengthUnitWidth","Math","round","normalizeZoom","zoom","unitFormats","_zoom","mainScaleLevel","levels","minCellWidth","getCellWidth","maxCellWidth","numOfScales","levelScales","j","pUnit","currentLevel","adjustedCellWidth","min","max","zoomScale","nextUnit","newCellWidth","nextScales","nextMinUnit","nextLengthUnit","setLengthUnit","unitInd","lengthUnitInd","fallback","baselineHeight","baselineTopPadding","defaultPadding","heightAdjustment","baselineAdjustment","dragSummaryKids","dx","_scales","open","$x","setTaskSizes","dragSummary","summary","pobj","byId","coords","xMin","Infinity","xMax","getSummaryBarSize","$w","unscheduled","mD","$h","right","setSummaryDates","filter","Error","updateTask","calculateTaskDimensions","splitTasks","baselines","isBaseline","cellHeight","scaleStart","scaleEnd","y","w","skip","startDate","endDate","$y","unscheduledTasks","isSegmentMoveAllowed","moveOptions","extendDragOptions","delta","updateLink","startTask","endTask","dy","$skip","$p","$pl","s_start","e_start","sx","sy","ex","ey","lineCoords","getLineCoords","arrowCoords","getArrowCoords","getPolylineLength","pointsString","nums","split","Number","points","x1","y1","x2","y2","hypot","gapp","backshift","sx1","ex1","same","join","placeLink","box","left","abs","normalizeLinks","links","dateFields","isCellEditable","columnId","includes","processEditor","editor","buttons","column","normalizeColumns","columns","align","isAddTaskColumn","flexgrow","header","template","_template","cell","resize","defaultColumns","handleAction","api","action","_","selected","getState","hasSelection","single","avoidMap","reversed","untargeted","checkParent","checkLevel","targetless","limit","_temp","runSingleAction","mapOrder","reverse","history","getHistory","startBatch","endBatch","$level","o","exec","in","op","extraData","select","cut","idPairs","Map","event","set","taskIds","relevantLinks","source","toggle","show","getTask","segmentIndex","isHandledAction","some","unitAdd","unitDiff","parseTaskDates","Array","isArray","normalizeDates","calcDates","base_start","durationUnit","duration","getFields","prepareDates","prepareEditTask","DataStore","_router","_modules","writable","async","setState","bind","bounds","scaleHeight","_tasks","criticalPath","_links","toSorted","$critical","activeTask","_activeTask","_selected","_cellWidth","DataArray","inBus","on","setStateAsync","range","unselect","sourceId","sourceInd","targetInd","slice","selId","selIndex","update","_scrollTask","remove","lag","inProgress","$reorder","skipProvider","taskIndex","isRootBranch","isLastIndex","targetBranch","targetIndex","targetTask","targetParent","oldSummary","move","newSummary","resetSummaryDates","isDirectDescendant","eventSource","stateOptions","differ","moveSummaryKids","targetObj","valueOf","d","base_duration","newTask","toRemove","eachChild","sel","origin","lazy","linkCopies","newId","l","reduce","skipUndo","isNaN","calcScaleDate","scrollLeft","_scaleDate","scrollTop","area","dir","pointerX","isExpanded","changeScale","cw","num","newScrollLeft","_zoomOffset","minWidth","startStep","newStart","newScroll","preventDefault","getPrevRow","getNextRow","init","from","markers","undo","schedule","resetHistory","scaleState","isScheduled","silent","floor","grid","color","document","canvas","createElement","canvasSize","renderCell","toDataURL","setAttribute","toString","getContext","translate","strokeStyle","xA","xB","yA","yB","beginPath","moveTo","lineTo","stroke","getMenuOptions","defaultMenuOptions","assignChecks","isDisabled","isFirstTask","isLastTask","prevTaskID","isRootTask","isSegment","isSingle","exclude","icon","dataFactory","label","isHidden","subtext","getToolbarButtons","defaultToolbarButtons","comp","menuText","isSummary","isMilestone","isUnscheduled","getEditorItems","defaultEditorItems","placeholder","defaultTaskTypes"],"mappings":"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","x_google_ignoreList":[0,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76]}
1
+ {"version":3,"file":"index.js","sources":["../../node_modules/@svar-ui/lib-state/dist/index.js","../src/helpers/sort.ts","../src/GanttDataTree.ts","../../node_modules/date-fns/toDate.mjs","../../node_modules/date-fns/constructFrom.mjs","../../node_modules/date-fns/addDays.mjs","../../node_modules/date-fns/addMonths.mjs","../../node_modules/date-fns/addMilliseconds.mjs","../../node_modules/date-fns/constants.mjs","../../node_modules/date-fns/addHours.mjs","../../node_modules/date-fns/_lib/defaultOptions.mjs","../../node_modules/date-fns/startOfWeek.mjs","../../node_modules/date-fns/startOfISOWeek.mjs","../../node_modules/date-fns/getISOWeekYear.mjs","../../node_modules/date-fns/startOfDay.mjs","../../node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.mjs","../../node_modules/date-fns/differenceInCalendarDays.mjs","../../node_modules/date-fns/startOfISOWeekYear.mjs","../../node_modules/date-fns/addMinutes.mjs","../../node_modules/date-fns/addQuarters.mjs","../../node_modules/date-fns/addWeeks.mjs","../../node_modules/date-fns/addYears.mjs","../../node_modules/date-fns/compareAsc.mjs","../../node_modules/date-fns/isSameDay.mjs","../../node_modules/date-fns/isDate.mjs","../../node_modules/date-fns/isValid.mjs","../../node_modules/date-fns/differenceInCalendarISOWeeks.mjs","../../node_modules/date-fns/differenceInCalendarMonths.mjs","../../node_modules/date-fns/differenceInCalendarYears.mjs","../../node_modules/date-fns/_lib/getRoundingMethod.mjs","../../node_modules/date-fns/differenceInMilliseconds.mjs","../../node_modules/date-fns/differenceInHours.mjs","../../node_modules/date-fns/differenceInMinutes.mjs","../../node_modules/date-fns/endOfDay.mjs","../../node_modules/date-fns/endOfMonth.mjs","../../node_modules/date-fns/isLastDayOfMonth.mjs","../../node_modules/date-fns/differenceInMonths.mjs","../../node_modules/date-fns/differenceInQuarters.mjs","../../node_modules/date-fns/differenceInYears.mjs","../../node_modules/date-fns/startOfQuarter.mjs","../../node_modules/date-fns/startOfMonth.mjs","../../node_modules/date-fns/endOfYear.mjs","../../node_modules/date-fns/startOfYear.mjs","../../node_modules/date-fns/endOfHour.mjs","../../node_modules/date-fns/endOfWeek.mjs","../../node_modules/date-fns/endOfQuarter.mjs","../../node_modules/date-fns/locale/en-US/_lib/formatDistance.mjs","../../node_modules/date-fns/locale/_lib/buildFormatLongFn.mjs","../../node_modules/date-fns/locale/en-US/_lib/formatLong.mjs","../../node_modules/date-fns/locale/en-US/_lib/formatRelative.mjs","../../node_modules/date-fns/locale/_lib/buildLocalizeFn.mjs","../../node_modules/date-fns/locale/en-US/_lib/localize.mjs","../../node_modules/date-fns/locale/_lib/buildMatchFn.mjs","../../node_modules/date-fns/locale/_lib/buildMatchPatternFn.mjs","../../node_modules/date-fns/locale/en-US/_lib/match.mjs","../../node_modules/date-fns/locale/en-US.mjs","../../node_modules/date-fns/getDayOfYear.mjs","../../node_modules/date-fns/getISOWeek.mjs","../../node_modules/date-fns/getWeekYear.mjs","../../node_modules/date-fns/startOfWeekYear.mjs","../../node_modules/date-fns/getWeek.mjs","../../node_modules/date-fns/_lib/addLeadingZeros.mjs","../../node_modules/date-fns/_lib/format/lightFormatters.mjs","../../node_modules/date-fns/_lib/format/formatters.mjs","../../node_modules/date-fns/_lib/format/longFormatters.mjs","../../node_modules/date-fns/_lib/protectedTokens.mjs","../../node_modules/date-fns/format.mjs","../../node_modules/date-fns/getDaysInMonth.mjs","../../node_modules/date-fns/isLeapYear.mjs","../../node_modules/date-fns/getDaysInYear.mjs","../../node_modules/date-fns/getISOWeeksInYear.mjs","../../node_modules/date-fns/isEqual.mjs","../../node_modules/date-fns/startOfHour.mjs","../../node_modules/date-fns/isSameWeek.mjs","../../node_modules/date-fns/isSameMonth.mjs","../../node_modules/date-fns/isSameQuarter.mjs","../../node_modules/date-fns/isSameYear.mjs","../src/time.ts","../src/scales.ts","../src/tasks.ts","../src/links.ts","../src/columns.ts","../src/helpers/actionHandlers.ts","../src/normalizeDates.ts","../src/DataStore.ts","../src/dom/scales.ts","../src/helpers/menuOptions.ts","../src/helpers/toolbarButtons.ts","../src/helpers/editorItems.ts","../src/taskTypes.ts"],"sourcesContent":["// src/helpers.ts\nvar iid = (/* @__PURE__ */ new Date()).valueOf();\nvar uid = () => iid++;\nfunction tempID() {\n return \"temp://\" + iid++;\n}\nfunction isTempID(v) {\n return typeof v === \"string\" && v.length === 20 && parseInt(v.substr(7)) > 1e12;\n}\nfunction isSameObject(left, right) {\n if (Object.keys(left).length !== Object.keys(right).length) return false;\n for (const key in right) {\n const v = left[key];\n const nv = right[key];\n if (!isSame(v, nv)) return false;\n }\n return true;\n}\nfunction isSame(v, nv) {\n const primitiveValue = typeof v === \"number\" || typeof v === \"string\" || typeof v === \"boolean\" || v === null;\n if (primitiveValue) return v === nv;\n if (typeof v !== typeof nv) return false;\n if ((v === null || nv === null) && v !== nv) return false;\n if (v instanceof Date && nv instanceof Date && v.getTime() !== nv.getTime())\n return false;\n if (typeof v === \"object\") {\n if (Array.isArray(v) && Array.isArray(nv)) {\n if (v.length !== nv.length) return false;\n for (let i = v.length - 1; i >= 0; i--) {\n if (!isSame(v[i], nv[i])) return false;\n }\n return true;\n } else {\n return isSameObject(v, nv);\n }\n }\n return v === nv;\n}\nfunction deepCopy(obj) {\n if (typeof obj !== \"object\") return obj;\n if (obj === null) return obj;\n if (obj instanceof Date) return new Date(obj);\n if (obj instanceof Array) return obj.map(deepCopy);\n const out = {};\n for (const key in obj) {\n out[key] = deepCopy(obj[key]);\n }\n return out;\n}\n\n// src/DataArray.ts\nvar _DataArray = class {\n constructor(raw) {\n this._data = raw;\n this._pool = /* @__PURE__ */ new Map();\n for (let i = 0; i < raw.length; i++) {\n const obj = raw[i];\n this._pool.set(obj.id, obj);\n }\n }\n add(raw) {\n raw = { id: uid(), ...raw };\n this._data.push(raw);\n this._pool.set(raw.id, raw);\n }\n update(id, raw) {\n const index = this._data.findIndex((link) => link.id == id);\n const old = this._data[index];\n const updated = { ...old, ...raw };\n this._data[index] = updated;\n this._pool.set(updated.id, updated);\n }\n remove(id) {\n this._data = this._data.filter((a) => a.id != id);\n this._pool.delete(id);\n }\n filter(cb) {\n this._data = this._data.filter((x) => {\n const check = cb(x);\n if (!check) this._pool.delete(x.id);\n return check;\n });\n }\n byId(id) {\n return this._pool.get(id);\n }\n map(cb) {\n return this._data.map(cb);\n }\n forEach(cb) {\n this._data.forEach(cb);\n }\n};\n\n// src/DataTree.ts\nvar DataTree = class {\n constructor(raw) {\n const top = {\n id: 0,\n $level: 0,\n data: [],\n parent: null\n };\n const items = /* @__PURE__ */ new Map();\n items.set(0, top);\n this._pool = items;\n if (raw && raw.length) this.parse(raw, 0);\n }\n parse(raw, parent) {\n const items = this._pool;\n for (let i = 0; i < raw.length; i++) {\n const obj = raw[i];\n obj.parent = obj.parent || parent;\n obj.data = null;\n items.set(obj.id, obj);\n }\n for (let i = 0; i < raw.length; i++) {\n const obj = raw[i];\n const temp = items.get(obj.parent);\n if (temp) {\n if (!temp.data) temp.data = [];\n temp.data.push(obj);\n }\n }\n const top = items.get(parent);\n this.setLevel(top, top.$level + 1, false);\n }\n add(raw, index) {\n const parent = this._pool.get(raw.parent || 0);\n raw.$level = parent.$level + 1;\n this._pool.set(raw.id, raw);\n if (parent.data) {\n if (index === -1) parent.data = [...parent.data, raw];\n else insertElement(parent, index, raw);\n } else parent.data = [raw];\n }\n addAfter(raw, after) {\n if (!after) {\n return this.add(raw, -1);\n }\n const node = this.byId(after);\n const parent = this.byId(node.parent);\n const index = indexById(parent, node.id) + 1;\n raw.parent = parent.id;\n raw.$level = parent.$level + 1;\n this.add(raw, index);\n }\n remove(id) {\n const obj = this._pool.get(id);\n this._remove(obj);\n const parent = this._pool.get(obj.parent);\n parent.data = parent.data.filter((a) => a.id != id);\n this._clearBranch(parent);\n }\n _remove(obj) {\n if (obj.data) {\n obj.data.forEach((i) => this._remove(i));\n }\n this._pool.delete(obj.id);\n }\n update(id, values) {\n let obj = this._pool.get(id);\n const branch = this._pool.get(obj.parent);\n const index = indexById(branch, obj.id);\n obj = { ...obj, ...values };\n if (branch && index >= 0) {\n branch.data[index] = obj;\n branch.data = [...branch.data];\n }\n this._pool.set(obj.id, obj);\n }\n move(id, mode, target) {\n const now = this._pool.get(id);\n const dropChild = mode === \"child\";\n const tobj = this._pool.get(target);\n const tLevel = tobj.$level + (dropChild ? 1 : 0);\n if (!now || !tobj) return;\n const parent = this._pool.get(now.parent);\n const newParent = dropChild ? tobj : this._pool.get(tobj.parent);\n if (!newParent.data) newParent.data = [];\n const index = indexById(parent, now.id);\n deleteElement(parent, index);\n const newIndex = dropChild ? newParent.data.length : indexById(newParent, tobj.id) + (mode === \"after\" ? 1 : 0);\n insertElement(newParent, newIndex, now);\n if (parent.id === newParent.id && index === newIndex) return null;\n now.parent = newParent.id;\n if (now.$level !== tLevel) {\n now.$level = tLevel;\n this.setLevel(now, tLevel + 1, true);\n }\n this.update(now.id, now);\n this._clearBranch(parent);\n }\n _clearBranch(obj) {\n if (obj.data && !obj.data.length) {\n if (obj.open) delete obj.open;\n this.update(obj.id, { data: null });\n }\n }\n toArray() {\n const out = [];\n const kids = this._pool.get(0).data;\n if (kids) toArray(kids, out);\n return out;\n }\n byId(id) {\n return this._pool.get(id);\n }\n getBranch(id) {\n return this._pool.get(id).data;\n }\n forEach(cb) {\n this._pool.forEach((value, key) => {\n if (key !== 0) cb(value);\n });\n }\n eachChild(cb, parent) {\n const p = this.byId(parent);\n if (!p || !p.data) return;\n p.data.forEach((child, index) => {\n cb(this.byId(child.id), index);\n this.eachChild(cb, child.id);\n });\n }\n setLevel(root, level, copy) {\n if (!root.data) return;\n root.data = root.data.map((child) => {\n if (copy) {\n child = { ...child };\n this._pool.set(child.id, child);\n }\n child.$level = level;\n if (child.data) this.setLevel(child, level + 1, copy);\n return child;\n });\n }\n};\nfunction toArray(line, out) {\n line.forEach((a) => {\n out.push(a);\n if (a.open === true) {\n toArray(a.data, out);\n }\n });\n}\nfunction deleteElement(obj, index) {\n const newData = [...obj.data];\n newData.splice(index, 1);\n obj.data = newData;\n}\nfunction insertElement(obj, index, item) {\n const newData = [...obj.data];\n newData.splice(index, 0, item);\n obj.data = newData;\n}\nfunction indexById(parentNode, id) {\n return parentNode?.data.findIndex(\n (child) => child.id === id\n );\n}\n\n// src/Store.ts\nvar STORE_SET_SILENT = 2;\nvar Store = class {\n constructor(config) {\n if (config) {\n this._writable = config.writable;\n this._async = config.async;\n }\n this._values = {};\n this._state = {};\n }\n setState(data, mode = 0) {\n const signals = {};\n this._wrapProperties(\n data,\n this._state,\n this._values,\n \"\",\n signals,\n mode\n );\n return signals;\n }\n getState() {\n return this._values;\n }\n getReactive() {\n return this._state;\n }\n _wrapProperties(data, state, values, parent, signals, mode) {\n for (const key in data) {\n const os = state[key];\n const ov = values[key];\n const nv = data[key];\n if (os) {\n if (ov === nv && typeof nv !== \"object\") continue;\n if (nv instanceof Date) {\n if (ov instanceof Date && ov.getTime() === nv.getTime()) continue;\n }\n }\n const fullKey = parent + (parent ? \".\" : \"\") + key;\n if (os) {\n if (os.__parse(nv, fullKey, signals, mode)) values[key] = nv;\n if (mode & STORE_SET_SILENT) signals[fullKey] = os.__trigger;\n else os.__trigger();\n } else {\n if (nv && nv.__reactive) {\n state[key] = this._wrapNested(nv, nv, fullKey, signals);\n } else {\n state[key] = this._wrapWritable(nv);\n }\n values[key] = nv;\n }\n signals[fullKey] = signals[fullKey] || null;\n }\n }\n _wrapNested(data, values, fullKey, signals) {\n const state = this._wrapWritable(data);\n this._wrapProperties(data, state, values, fullKey, signals, 0);\n state.__parse = (v, fullKey2, signals2, mode) => {\n this._wrapProperties(v, state, values, fullKey2, signals2, mode);\n return false;\n };\n return state;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _wrapWritable(val) {\n const ss = [];\n const __triggerSync = function() {\n for (let i = 0; i < ss.length; i++) {\n ss[i](val);\n }\n };\n const __trigger = () => {\n if (ss.length) {\n if (this._async) setTimeout(__triggerSync, 1);\n else __triggerSync();\n }\n };\n const subscribe = (fn) => {\n ss.push(fn);\n if (this._async) setTimeout(fn, 1, val);\n else fn(val);\n return () => {\n const i = ss.indexOf(fn);\n if (i >= 0) ss.splice(i, 1);\n };\n };\n const __parse = function(v) {\n val = v;\n return true;\n };\n return {\n subscribe,\n __trigger,\n __parse\n };\n }\n};\nfunction markReactive(t, nested) {\n Object.defineProperty(t, \"__reactive\", {\n value: true,\n enumerable: false,\n writable: false\n });\n if (nested === true) {\n for (const key in t) {\n const sub = t[key];\n if (typeof sub === \"object\" && sub !== null) {\n markReactive(sub, true);\n }\n }\n }\n return t;\n}\n\n// src/DataRouter.ts\nvar DataRouter = class {\n constructor(s, r, p, b) {\n if (typeof s === \"function\") this._setter = s;\n else this._setter = s.setState.bind(s);\n this._routes = r;\n this._parsers = p;\n this._prev = {};\n this._triggers = /* @__PURE__ */ new Map();\n this._sources = /* @__PURE__ */ new Map();\n this._routes.forEach((a) => {\n a.in.forEach((k) => {\n const arr = this._triggers.get(k) || [];\n arr.push(a);\n this._triggers.set(k, arr);\n });\n a.out.forEach((k) => {\n const h = this._sources.get(k) || {};\n a.in.forEach((i) => h[i] = true);\n this._sources.set(k, h);\n });\n });\n this._routes.forEach((a) => {\n a.length = Math.max(\n ...a.in.map((key) => _calckSize(key, this._sources, 1))\n );\n });\n this._bus = b;\n }\n init(cfg) {\n const next = {};\n for (const key in cfg) {\n if (this._prev[key] !== cfg[key]) {\n const parser = this._parsers[key];\n next[key] = parser ? parser(cfg[key]) : cfg[key];\n }\n }\n this._prev = this._prev ? { ...this._prev, ...cfg } : { ...cfg };\n this.setState(next);\n if (this._bus) this._bus.exec(\"init-state\", next);\n }\n setStateAsync(updates) {\n const signals = this._setter(updates, STORE_SET_SILENT);\n if (this._async) {\n Object.assign(this._async.signals, signals);\n } else {\n this._async = {\n signals,\n timer: setTimeout(this._applyState.bind(this), 1)\n };\n }\n return signals;\n }\n _applyState() {\n const obj = this._async;\n if (!obj) return;\n this._async = null;\n this._triggerUpdates(obj.signals, []);\n for (const key in obj.signals) {\n const h = obj.signals[key];\n if (h) h();\n }\n }\n setState(updates, ctx = []) {\n const signals = this._setter(updates);\n this._triggerUpdates(signals, ctx);\n return signals;\n }\n _triggerUpdates(signals, ctx) {\n const keys = Object.keys(signals);\n const needExec = !ctx.length;\n ctx = ctx || [];\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const trgs = this._triggers.get(key);\n if (trgs) {\n trgs.forEach((a) => {\n if (ctx.indexOf(a) == -1) {\n ctx.push(a);\n }\n });\n }\n }\n if (needExec) {\n this._execNext(ctx);\n }\n }\n _execNext(ctx) {\n while (ctx.length) {\n ctx.sort((a, b) => a.length < b.length ? 1 : -1);\n const next = ctx[ctx.length - 1];\n ctx.splice(ctx.length - 1);\n next.exec(ctx);\n }\n }\n};\nfunction _calckSize(key, sources, prev) {\n const next = sources.get(key);\n if (!next) return prev;\n const sizes = Object.keys(next).map((a) => _calckSize(a, sources, prev + 1));\n return Math.max(...sizes);\n}\n\n// src/EventBus.ts\nvar EventBus = class {\n constructor() {\n this._nextHandler = null;\n this._handlers = {};\n this._tag = /* @__PURE__ */ new WeakMap();\n this.exec = this.exec.bind(this);\n }\n on(name, handler, config) {\n let prev = this._handlers[name];\n if (!prev) {\n prev = this._handlers[name] = [handler];\n } else {\n if (config && config.intercept) prev.unshift(handler);\n else prev.push(handler);\n }\n if (config && config.tag) this._tag.set(handler, config.tag);\n }\n intercept(name, handler, config) {\n this.on(name, handler, { ...config, intercept: true });\n }\n detach(tag) {\n for (const key in this._handlers) {\n const stack = this._handlers[key];\n for (let i = stack.length - 1; i >= 0; i--) {\n if (this._tag.get(stack[i]) === tag) {\n stack.splice(i, 1);\n }\n }\n }\n }\n async exec(name, ev) {\n const stack = this._handlers[name];\n if (stack) {\n for (let i = 0; i < stack.length; i++) {\n const res = stack[i](ev);\n if (res === false) return;\n if (res && res.then) {\n const res2 = await res;\n if (res2 === false) return;\n }\n }\n }\n if (this._nextHandler) await this._nextHandler.exec(name, ev);\n return ev;\n }\n setNext(next) {\n return this._nextHandler = next;\n }\n};\n\n// src/EventResolver.ts\nvar EventResolver = class {\n constructor(key) {\n this._key = key;\n this._nextHandler = null;\n this.exec = this.exec.bind(this);\n }\n async exec(name, ev) {\n if (ev && ev[this._key]) await ev[this._key](ev);\n if (this._nextHandler) {\n await this._nextHandler.exec(name, ev);\n }\n return ev;\n }\n setNext(next) {\n return this._nextHandler = next;\n }\n};\n\n// src/EventBusRouter.ts\nvar EventBusRouter = class {\n constructor(dispatch) {\n this._nextHandler = null;\n this._dispatch = dispatch;\n this.exec = this.exec.bind(this);\n }\n async exec(name, ev) {\n this._dispatch(name, ev);\n if (this._nextHandler) await this._nextHandler.exec(name, ev);\n return ev;\n }\n setNext(next) {\n return this._nextHandler = next;\n }\n};\n\nexport { _DataArray as DataArray, DataRouter, DataTree, EventBus, EventBusRouter, EventResolver, Store, deepCopy, isSame, isTempID, markReactive, tempID, uid };\n//# sourceMappingURL=index.js.map\n//# sourceMappingURL=index.js.map","import type { IParsedTask, TSort, TSortValue } from \"../types\";\nfunction sortAsc(a: TSortValue, b: TSortValue): number {\n\tif (typeof a === \"string\")\n\t\treturn a.localeCompare(b as string, undefined, { numeric: true });\n\tif (typeof a === \"object\") return a.getTime() - (b as Date).getTime();\n\treturn ((a ?? 0) as number) - ((b ?? 0) as number);\n}\n\nfunction sortDesc(a: TSortValue, b: TSortValue): number {\n\tif (typeof a === \"string\")\n\t\treturn -a.localeCompare(b as string, undefined, { numeric: true });\n\tif (typeof b === \"object\") return b.getTime() - (a as Date).getTime();\n\treturn ((b ?? 0) as number) - ((a ?? 0) as number);\n}\n\nfunction sortBy({ key, order }: TSort) {\n\tconst sortMethod = order === \"asc\" ? sortAsc : sortDesc;\n\treturn (a: IParsedTask, b: IParsedTask) => sortMethod(a[key], b[key]);\n}\n\nfunction sortByMany(sortArray: TSort[]) {\n\tif (!sortArray || !sortArray.length) return;\n\n\tconst sorts = sortArray.map(s => sortBy(s));\n\tif (sortArray.length === 1) return sorts[0];\n\n\treturn function (a: IParsedTask, b: IParsedTask) {\n\t\tfor (let i = 0; i < sorts.length; i++) {\n\t\t\tconst res = sorts[i](a, b);\n\t\t\tif (res !== 0) return res;\n\t\t}\n\t\treturn 0;\n\t};\n}\n\nexport function sort(data: IParsedTask[], conf: TSort[]) {\n\treturn data.sort(sortByMany(conf));\n}\n","import { DataTree, tempID, TID } from \"@svar-ui/lib-state\";\nimport type { ITask, IParsedTask, TSort } from \"./types\";\nimport { sort } from \"./helpers/sort\";\n\nexport default class GanttDataTree extends DataTree<IParsedTask> {\n\tprivate _sort: TSort[];\n\n\tconstructor(tasks?: Partial<ITask>[]) {\n\t\tsuper();\n\t\tthis.parse(tasks, 0);\n\t}\n\tparse(tasks: Partial<ITask>[], parent: TID): void {\n\t\tif (!tasks || !tasks.length) return;\n\t\tconst preparedTasks = tasks.map(task => this.normalizeTask(task));\n\t\tsuper.parse(preparedTasks as IParsedTask[], parent);\n\t\tif (this._sort) this.sortBranch(this._sort, parent);\n\t}\n\tgetBranch(id: TID) {\n\t\tconst task = this._pool.get(id);\n\n\t\treturn this._pool.get(task.parent || 0).data;\n\t}\n\tcontains(id: TID, target: TID): boolean {\n\t\tconst branch = this._pool.get(id).data;\n\t\tlet res = false;\n\t\tif (branch) {\n\t\t\tfor (let i = 0; i < branch.length; i++) {\n\t\t\t\tif (branch[i].id === target) {\n\t\t\t\t\tres = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (branch[i].data) {\n\t\t\t\t\tres = this.contains(branch[i].id, target);\n\t\t\t\t\tif (res) break;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn res;\n\t}\n\tgetIndexById(id: TID) {\n\t\treturn this.getBranch(id).findIndex(task => task.id === id);\n\t}\n\tadd(task: Partial<ITask>, index: number): IParsedTask {\n\t\tconst normalizedTask = this.normalizeTask(task);\n\t\tsuper.add(normalizedTask as IParsedTask, index);\n\n\t\treturn normalizedTask as IParsedTask;\n\t}\n\n\tcopy(taskObj: ITask, parent: TID, ind: number) {\n\t\tconst n = this.add({ ...taskObj, id: null, data: null, parent }, ind);\n\t\tlet ids: Array<TID[]> = [[taskObj.id, n.id]];\n\t\ttaskObj.data?.forEach((kid: ITask, i: number) => {\n\t\t\tconst kIds = this.copy(kid, n.id, i);\n\t\t\tids = ids.concat(kIds);\n\t\t});\n\t\treturn ids;\n\t}\n\n\tnormalizeTask(task: Partial<ITask>): ITask {\n\t\tconst id = task.id || tempID();\n\t\tconst parentId = task.parent || 0;\n\t\tconst text = task.text || \"\";\n\t\tconst type = task.type || \"task\";\n\t\tconst progress = task.progress || 0;\n\t\tconst details = task.details || \"\";\n\n\t\tconst res: ITask = {\n\t\t\t...task,\n\t\t\tid,\n\t\t\ttext,\n\t\t\tparent: parentId,\n\t\t\tprogress,\n\t\t\ttype,\n\t\t\tdetails,\n\t\t};\n\t\tif (task.segments) res.segments = task.segments.map(s => ({ ...s }));\n\n\t\tif (task.segments) res.segments = task.segments.map(s => ({ ...s }));\n\n\t\treturn res;\n\t}\n\n\tgetSummaryId(id: TID): TID | null;\n\tgetSummaryId(id: TID, all: true): TID[] | null;\n\tgetSummaryId(id: TID, all: boolean = false): TID | TID[] | null {\n\t\tconst task = this._pool.get(id);\n\t\tif (!task.parent) return null;\n\t\tconst parent = this._pool.get(task.parent);\n\t\tif (all) {\n\t\t\tlet currentId = id;\n\t\t\tlet parentId = this.getSummaryId(currentId);\n\t\t\tconst parents = [];\n\n\t\t\twhile (parentId) {\n\t\t\t\tcurrentId = parentId as TID;\n\t\t\t\tparents.push(parentId);\n\t\t\t\tparentId = this.getSummaryId(currentId);\n\t\t\t}\n\t\t\treturn parents as TID[];\n\t\t}\n\t\tif (parent.type === \"summary\") return parent.id;\n\t\treturn this.getSummaryId(parent.id);\n\t}\n\n\tsort(conf: TSort[]) {\n\t\tthis._sort = conf;\n\t\tif (conf) this.sortBranch(conf, 0);\n\t}\n\tsortBranch(conf: TSort[], parent?: TID) {\n\t\tconst data = this._pool.get(parent || 0).data;\n\t\tif (data) {\n\t\t\tsort(data, conf);\n\t\t\tdata.forEach(item => {\n\t\t\t\tthis.sortBranch(conf, item.id);\n\t\t\t});\n\t\t}\n\t}\n\tserialize() {\n\t\tconst out: Partial<ITask>[] = [];\n\t\tconst kids = this._pool.get(0).data;\n\t\tif (kids) toArray(kids, out);\n\t\treturn out;\n\t}\n}\n\nfunction toArray(line: Partial<ITask>[], out: Partial<ITask>[]): void {\n\tline.forEach(a => {\n\t\tout.push(a);\n\t\tif (a.data) toArray(a.data, out);\n\t});\n}\n","/**\n * @name toDate\n * @category Common Helpers\n * @summary Convert the given argument to an instance of Date.\n *\n * @description\n * Convert the given argument to an instance of Date.\n *\n * If the argument is an instance of Date, the function returns its clone.\n *\n * If the argument is a number, it is treated as a timestamp.\n *\n * If the argument is none of the above, the function returns Invalid Date.\n *\n * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param argument - The value to convert\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Clone the date:\n * const result = toDate(new Date(2014, 1, 11, 11, 30, 30))\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert the timestamp to date:\n * const result = toDate(1392098430000)\n * //=> Tue Feb 11 2014 11:30:30\n */\nexport function toDate(argument) {\n const argStr = Object.prototype.toString.call(argument);\n\n // Clone the date\n if (\n argument instanceof Date ||\n (typeof argument === \"object\" && argStr === \"[object Date]\")\n ) {\n // Prevent the date to lose the milliseconds when passed to new Date() in IE10\n return new argument.constructor(+argument);\n } else if (\n typeof argument === \"number\" ||\n argStr === \"[object Number]\" ||\n typeof argument === \"string\" ||\n argStr === \"[object String]\"\n ) {\n // TODO: Can we get rid of as?\n return new Date(argument);\n } else {\n // TODO: Can we get rid of as?\n return new Date(NaN);\n }\n}\n\n// Fallback for modularized imports:\nexport default toDate;\n","/**\n * @name constructFrom\n * @category Generic Helpers\n * @summary Constructs a date using the reference date and the value\n *\n * @description\n * The function constructs a new date using the constructor from the reference\n * date and the given value. It helps to build generic functions that accept\n * date extensions.\n *\n * It defaults to `Date` if the passed reference date is a number or a string.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The reference date to take constructor from\n * @param value - The value to create the date\n *\n * @returns Date initialized using the given date and value\n *\n * @example\n * import { constructFrom } from 'date-fns'\n *\n * // A function that clones a date preserving the original type\n * function cloneDate<DateType extends Date(date: DateType): DateType {\n * return constructFrom(\n * date, // Use contrustor from the given date\n * date.getTime() // Use the date value to create a new date\n * )\n * }\n */\nexport function constructFrom(date, value) {\n if (date instanceof Date) {\n return new date.constructor(value);\n } else {\n return new Date(value);\n }\n}\n\n// Fallback for modularized imports:\nexport default constructFrom;\n","import { toDate } from \"./toDate.mjs\";\nimport { constructFrom } from \"./constructFrom.mjs\";\n\n/**\n * @name addDays\n * @category Day Helpers\n * @summary Add the specified number of days to the given date.\n *\n * @description\n * Add the specified number of days to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to be changed\n * @param amount - The amount of days to be added.\n *\n * @returns The new date with the days added\n *\n * @example\n * // Add 10 days to 1 September 2014:\n * const result = addDays(new Date(2014, 8, 1), 10)\n * //=> Thu Sep 11 2014 00:00:00\n */\nexport function addDays(date, amount) {\n const _date = toDate(date);\n if (isNaN(amount)) return constructFrom(date, NaN);\n if (!amount) {\n // If 0 days, no-op to avoid changing times in the hour before end of DST\n return _date;\n }\n _date.setDate(_date.getDate() + amount);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default addDays;\n","import { toDate } from \"./toDate.mjs\";\nimport { constructFrom } from \"./constructFrom.mjs\";\n\n/**\n * @name addMonths\n * @category Month Helpers\n * @summary Add the specified number of months to the given date.\n *\n * @description\n * Add the specified number of months to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to be changed\n * @param amount - The amount of months to be added.\n *\n * @returns The new date with the months added\n *\n * @example\n * // Add 5 months to 1 September 2014:\n * const result = addMonths(new Date(2014, 8, 1), 5)\n * //=> Sun Feb 01 2015 00:00:00\n *\n * // Add one month to 30 January 2023:\n * const result = addMonths(new Date(2023, 0, 30), 1)\n * //=> Tue Feb 28 2023 00:00:00\n */\nexport function addMonths(date, amount) {\n const _date = toDate(date);\n if (isNaN(amount)) return constructFrom(date, NaN);\n if (!amount) {\n // If 0 months, no-op to avoid changing times in the hour before end of DST\n return _date;\n }\n const dayOfMonth = _date.getDate();\n\n // The JS Date object supports date math by accepting out-of-bounds values for\n // month, day, etc. For example, new Date(2020, 0, 0) returns 31 Dec 2019 and\n // new Date(2020, 13, 1) returns 1 Feb 2021. This is *almost* the behavior we\n // want except that dates will wrap around the end of a month, meaning that\n // new Date(2020, 13, 31) will return 3 Mar 2021 not 28 Feb 2021 as desired. So\n // we'll default to the end of the desired month by adding 1 to the desired\n // month and using a date of 0 to back up one day to the end of the desired\n // month.\n const endOfDesiredMonth = constructFrom(date, _date.getTime());\n endOfDesiredMonth.setMonth(_date.getMonth() + amount + 1, 0);\n const daysInMonth = endOfDesiredMonth.getDate();\n if (dayOfMonth >= daysInMonth) {\n // If we're already at the end of the month, then this is the correct date\n // and we're done.\n return endOfDesiredMonth;\n } else {\n // Otherwise, we now know that setting the original day-of-month value won't\n // cause an overflow, so set the desired day-of-month. Note that we can't\n // just set the date of `endOfDesiredMonth` because that object may have had\n // its time changed in the unusual case where where a DST transition was on\n // the last day of the month and its local time was in the hour skipped or\n // repeated next to a DST transition. So we use `date` instead which is\n // guaranteed to still have the original time.\n _date.setFullYear(\n endOfDesiredMonth.getFullYear(),\n endOfDesiredMonth.getMonth(),\n dayOfMonth,\n );\n return _date;\n }\n}\n\n// Fallback for modularized imports:\nexport default addMonths;\n","import { toDate } from \"./toDate.mjs\";\nimport { constructFrom } from \"./constructFrom.mjs\";\n\n/**\n * @name addMilliseconds\n * @category Millisecond Helpers\n * @summary Add the specified number of milliseconds to the given date.\n *\n * @description\n * Add the specified number of milliseconds to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to be changed\n * @param amount - The amount of milliseconds to be added.\n *\n * @returns The new date with the milliseconds added\n *\n * @example\n * // Add 750 milliseconds to 10 July 2014 12:45:30.000:\n * const result = addMilliseconds(new Date(2014, 6, 10, 12, 45, 30, 0), 750)\n * //=> Thu Jul 10 2014 12:45:30.750\n */\nexport function addMilliseconds(date, amount) {\n const timestamp = +toDate(date);\n return constructFrom(date, timestamp + amount);\n}\n\n// Fallback for modularized imports:\nexport default addMilliseconds;\n","/**\n * @module constants\n * @summary Useful constants\n * @description\n * Collection of useful date constants.\n *\n * The constants could be imported from `date-fns/constants`:\n *\n * ```ts\n * import { maxTime, minTime } from \"./constants/date-fns/constants\";\n *\n * function isAllowedTime(time) {\n * return time <= maxTime && time >= minTime;\n * }\n * ```\n */\n\n/**\n * @constant\n * @name daysInWeek\n * @summary Days in 1 week.\n */\nexport const daysInWeek = 7;\n\n/**\n * @constant\n * @name daysInYear\n * @summary Days in 1 year.\n *\n * @description\n * How many days in a year.\n *\n * One years equals 365.2425 days according to the formula:\n *\n * > Leap year occures every 4 years, except for years that are divisable by 100 and not divisable by 400.\n * > 1 mean year = (365+1/4-1/100+1/400) days = 365.2425 days\n */\nexport const daysInYear = 365.2425;\n\n/**\n * @constant\n * @name maxTime\n * @summary Maximum allowed time.\n *\n * @example\n * import { maxTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = 8640000000000001 <= maxTime;\n * //=> false\n *\n * new Date(8640000000000001);\n * //=> Invalid Date\n */\nexport const maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1000;\n\n/**\n * @constant\n * @name minTime\n * @summary Minimum allowed time.\n *\n * @example\n * import { minTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = -8640000000000001 >= minTime;\n * //=> false\n *\n * new Date(-8640000000000001)\n * //=> Invalid Date\n */\nexport const minTime = -maxTime;\n\n/**\n * @constant\n * @name millisecondsInWeek\n * @summary Milliseconds in 1 week.\n */\nexport const millisecondsInWeek = 604800000;\n\n/**\n * @constant\n * @name millisecondsInDay\n * @summary Milliseconds in 1 day.\n */\nexport const millisecondsInDay = 86400000;\n\n/**\n * @constant\n * @name millisecondsInMinute\n * @summary Milliseconds in 1 minute\n */\nexport const millisecondsInMinute = 60000;\n\n/**\n * @constant\n * @name millisecondsInHour\n * @summary Milliseconds in 1 hour\n */\nexport const millisecondsInHour = 3600000;\n\n/**\n * @constant\n * @name millisecondsInSecond\n * @summary Milliseconds in 1 second\n */\nexport const millisecondsInSecond = 1000;\n\n/**\n * @constant\n * @name minutesInYear\n * @summary Minutes in 1 year.\n */\nexport const minutesInYear = 525600;\n\n/**\n * @constant\n * @name minutesInMonth\n * @summary Minutes in 1 month.\n */\nexport const minutesInMonth = 43200;\n\n/**\n * @constant\n * @name minutesInDay\n * @summary Minutes in 1 day.\n */\nexport const minutesInDay = 1440;\n\n/**\n * @constant\n * @name minutesInHour\n * @summary Minutes in 1 hour.\n */\nexport const minutesInHour = 60;\n\n/**\n * @constant\n * @name monthsInQuarter\n * @summary Months in 1 quarter.\n */\nexport const monthsInQuarter = 3;\n\n/**\n * @constant\n * @name monthsInYear\n * @summary Months in 1 year.\n */\nexport const monthsInYear = 12;\n\n/**\n * @constant\n * @name quartersInYear\n * @summary Quarters in 1 year\n */\nexport const quartersInYear = 4;\n\n/**\n * @constant\n * @name secondsInHour\n * @summary Seconds in 1 hour.\n */\nexport const secondsInHour = 3600;\n\n/**\n * @constant\n * @name secondsInMinute\n * @summary Seconds in 1 minute.\n */\nexport const secondsInMinute = 60;\n\n/**\n * @constant\n * @name secondsInDay\n * @summary Seconds in 1 day.\n */\nexport const secondsInDay = secondsInHour * 24;\n\n/**\n * @constant\n * @name secondsInWeek\n * @summary Seconds in 1 week.\n */\nexport const secondsInWeek = secondsInDay * 7;\n\n/**\n * @constant\n * @name secondsInYear\n * @summary Seconds in 1 year.\n */\nexport const secondsInYear = secondsInDay * daysInYear;\n\n/**\n * @constant\n * @name secondsInMonth\n * @summary Seconds in 1 month\n */\nexport const secondsInMonth = secondsInYear / 12;\n\n/**\n * @constant\n * @name secondsInQuarter\n * @summary Seconds in 1 quarter.\n */\nexport const secondsInQuarter = secondsInMonth * 3;\n","import { addMilliseconds } from \"./addMilliseconds.mjs\";\nimport { millisecondsInHour } from \"./constants.mjs\";\n\n/**\n * @name addHours\n * @category Hour Helpers\n * @summary Add the specified number of hours to the given date.\n *\n * @description\n * Add the specified number of hours to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to be changed\n * @param amount - The amount of hours to be added.\n *\n * @returns The new date with the hours added\n *\n * @example\n * // Add 2 hours to 10 July 2014 23:00:00:\n * const result = addHours(new Date(2014, 6, 10, 23, 0), 2)\n * //=> Fri Jul 11 2014 01:00:00\n */\nexport function addHours(date, amount) {\n return addMilliseconds(date, amount * millisecondsInHour);\n}\n\n// Fallback for modularized imports:\nexport default addHours;\n","let defaultOptions = {};\n\nexport function getDefaultOptions() {\n return defaultOptions;\n}\n\nexport function setDefaultOptions(newOptions) {\n defaultOptions = newOptions;\n}\n","import { toDate } from \"./toDate.mjs\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.mjs\";\n\n/**\n * The {@link startOfWeek} function options.\n */\n\n/**\n * @name startOfWeek\n * @category Week Helpers\n * @summary Return the start of a week for the given date.\n *\n * @description\n * Return the start of a week for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week\n *\n * @example\n * // The start of a week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sun Aug 31 2014 00:00:00\n *\n * @example\n * // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfWeek(date, options) {\n const defaultOptions = getDefaultOptions();\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const _date = toDate(date);\n const day = _date.getDay();\n const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n\n _date.setDate(_date.getDate() - diff);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeek;\n","import { startOfWeek } from \"./startOfWeek.mjs\";\n\n/**\n * @name startOfISOWeek\n * @category ISO Week Helpers\n * @summary Return the start of an ISO week for the given date.\n *\n * @description\n * Return the start of an ISO week for the given date.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The start of an ISO week\n *\n * @example\n * // The start of an ISO week for 2 September 2014 11:55:00:\n * const result = startOfISOWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfISOWeek(date) {\n return startOfWeek(date, { weekStartsOn: 1 });\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeek;\n","import { constructFrom } from \"./constructFrom.mjs\";\nimport { startOfISOWeek } from \"./startOfISOWeek.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name getISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Get the ISO week-numbering year of the given date.\n *\n * @description\n * Get the ISO week-numbering year of the given date,\n * which always starts 3 days before the year's first Thursday.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n *\n * @returns The ISO week-numbering year\n *\n * @example\n * // Which ISO-week numbering year is 2 January 2005?\n * const result = getISOWeekYear(new Date(2005, 0, 2))\n * //=> 2004\n */\nexport function getISOWeekYear(date) {\n const _date = toDate(date);\n const year = _date.getFullYear();\n\n const fourthOfJanuaryOfNextYear = constructFrom(date, 0);\n fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);\n fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);\n\n const fourthOfJanuaryOfThisYear = constructFrom(date, 0);\n fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);\n fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);\n\n if (_date.getTime() >= startOfNextYear.getTime()) {\n return year + 1;\n } else if (_date.getTime() >= startOfThisYear.getTime()) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getISOWeekYear;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name startOfDay\n * @category Day Helpers\n * @summary Return the start of a day for the given date.\n *\n * @description\n * Return the start of a day for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The start of a day\n *\n * @example\n * // The start of a day for 2 September 2014 11:55:00:\n * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 00:00:00\n */\nexport function startOfDay(date) {\n const _date = toDate(date);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfDay;\n","import { toDate } from \"../toDate.mjs\";\n\n/**\n * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds.\n * They usually appear for dates that denote time before the timezones were introduced\n * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891\n * and GMT+01:00:00 after that date)\n *\n * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above,\n * which would lead to incorrect calculations.\n *\n * This function returns the timezone offset in milliseconds that takes seconds in account.\n */\nexport function getTimezoneOffsetInMilliseconds(date) {\n const _date = toDate(date);\n const utcDate = new Date(\n Date.UTC(\n _date.getFullYear(),\n _date.getMonth(),\n _date.getDate(),\n _date.getHours(),\n _date.getMinutes(),\n _date.getSeconds(),\n _date.getMilliseconds(),\n ),\n );\n utcDate.setUTCFullYear(_date.getFullYear());\n return +date - +utcDate;\n}\n","import { millisecondsInDay } from \"./constants.mjs\";\nimport { startOfDay } from \"./startOfDay.mjs\";\nimport { getTimezoneOffsetInMilliseconds } from \"./_lib/getTimezoneOffsetInMilliseconds.mjs\";\n\n/**\n * @name differenceInCalendarDays\n * @category Day Helpers\n * @summary Get the number of calendar days between the given dates.\n *\n * @description\n * Get the number of calendar days between the given dates. This means that the times are removed\n * from the dates and then the difference in days is calculated.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The later date\n * @param dateRight - The earlier date\n *\n * @returns The number of calendar days\n *\n * @example\n * // How many calendar days are between\n * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?\n * const result = differenceInCalendarDays(\n * new Date(2012, 6, 2, 0, 0),\n * new Date(2011, 6, 2, 23, 0)\n * )\n * //=> 366\n * // How many calendar days are between\n * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?\n * const result = differenceInCalendarDays(\n * new Date(2011, 6, 3, 0, 1),\n * new Date(2011, 6, 2, 23, 59)\n * )\n * //=> 1\n */\nexport function differenceInCalendarDays(dateLeft, dateRight) {\n const startOfDayLeft = startOfDay(dateLeft);\n const startOfDayRight = startOfDay(dateRight);\n\n const timestampLeft =\n +startOfDayLeft - getTimezoneOffsetInMilliseconds(startOfDayLeft);\n const timestampRight =\n +startOfDayRight - getTimezoneOffsetInMilliseconds(startOfDayRight);\n\n // Round the number of days to the nearest integer because the number of\n // milliseconds in a day is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round((timestampLeft - timestampRight) / millisecondsInDay);\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarDays;\n","import { getISOWeekYear } from \"./getISOWeekYear.mjs\";\nimport { startOfISOWeek } from \"./startOfISOWeek.mjs\";\nimport { constructFrom } from \"./constructFrom.mjs\";\n\n/**\n * @name startOfISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Return the start of an ISO week-numbering year for the given date.\n *\n * @description\n * Return the start of an ISO week-numbering year,\n * which always starts 3 days before the year's first Thursday.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The start of an ISO week-numbering year\n *\n * @example\n * // The start of an ISO week-numbering year for 2 July 2005:\n * const result = startOfISOWeekYear(new Date(2005, 6, 2))\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfISOWeekYear(date) {\n const year = getISOWeekYear(date);\n const fourthOfJanuary = constructFrom(date, 0);\n fourthOfJanuary.setFullYear(year, 0, 4);\n fourthOfJanuary.setHours(0, 0, 0, 0);\n return startOfISOWeek(fourthOfJanuary);\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeekYear;\n","import { addMilliseconds } from \"./addMilliseconds.mjs\";\nimport { millisecondsInMinute } from \"./constants.mjs\";\n\n/**\n * @name addMinutes\n * @category Minute Helpers\n * @summary Add the specified number of minutes to the given date.\n *\n * @description\n * Add the specified number of minutes to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to be changed\n * @param amount - The amount of minutes to be added.\n *\n * @returns The new date with the minutes added\n *\n * @example\n * // Add 30 minutes to 10 July 2014 12:00:00:\n * const result = addMinutes(new Date(2014, 6, 10, 12, 0), 30)\n * //=> Thu Jul 10 2014 12:30:00\n */\nexport function addMinutes(date, amount) {\n return addMilliseconds(date, amount * millisecondsInMinute);\n}\n\n// Fallback for modularized imports:\nexport default addMinutes;\n","import { addMonths } from \"./addMonths.mjs\";\n\n/**\n * @name addQuarters\n * @category Quarter Helpers\n * @summary Add the specified number of year quarters to the given date.\n *\n * @description\n * Add the specified number of year quarters to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to be changed\n * @param amount - The amount of quarters to be added.\n *\n * @returns The new date with the quarters added\n *\n * @example\n * // Add 1 quarter to 1 September 2014:\n * const result = addQuarters(new Date(2014, 8, 1), 1)\n * //=> Mon Dec 01 2014 00:00:00\n */\nexport function addQuarters(date, amount) {\n const months = amount * 3;\n return addMonths(date, months);\n}\n\n// Fallback for modularized imports:\nexport default addQuarters;\n","import { addDays } from \"./addDays.mjs\";\n\n/**\n * @name addWeeks\n * @category Week Helpers\n * @summary Add the specified number of weeks to the given date.\n *\n * @description\n * Add the specified number of week to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to be changed\n * @param amount - The amount of weeks to be added.\n *\n * @returns The new date with the weeks added\n *\n * @example\n * // Add 4 weeks to 1 September 2014:\n * const result = addWeeks(new Date(2014, 8, 1), 4)\n * //=> Mon Sep 29 2014 00:00:00\n */\nexport function addWeeks(date, amount) {\n const days = amount * 7;\n return addDays(date, days);\n}\n\n// Fallback for modularized imports:\nexport default addWeeks;\n","import { addMonths } from \"./addMonths.mjs\";\n\n/**\n * @name addYears\n * @category Year Helpers\n * @summary Add the specified number of years to the given date.\n *\n * @description\n * Add the specified number of years to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to be changed\n * @param amount - The amount of years to be added.\n *\n * @returns The new date with the years added\n *\n * @example\n * // Add 5 years to 1 September 2014:\n * const result = addYears(new Date(2014, 8, 1), 5)\n * //=> Sun Sep 01 2019 00:00:00\n */\nexport function addYears(date, amount) {\n return addMonths(date, amount * 12);\n}\n\n// Fallback for modularized imports:\nexport default addYears;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name compareAsc\n * @category Common Helpers\n * @summary Compare the two dates and return -1, 0 or 1.\n *\n * @description\n * Compare the two dates and return 1 if the first date is after the second,\n * -1 if the first date is before the second or 0 if dates are equal.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The first date to compare\n * @param dateRight - The second date to compare\n *\n * @returns The result of the comparison\n *\n * @example\n * // Compare 11 February 1987 and 10 July 1989:\n * const result = compareAsc(new Date(1987, 1, 11), new Date(1989, 6, 10))\n * //=> -1\n *\n * @example\n * // Sort the array of dates:\n * const result = [\n * new Date(1995, 6, 2),\n * new Date(1987, 1, 11),\n * new Date(1989, 6, 10)\n * ].sort(compareAsc)\n * //=> [\n * // Wed Feb 11 1987 00:00:00,\n * // Mon Jul 10 1989 00:00:00,\n * // Sun Jul 02 1995 00:00:00\n * // ]\n */\nexport function compareAsc(dateLeft, dateRight) {\n const _dateLeft = toDate(dateLeft);\n const _dateRight = toDate(dateRight);\n\n const diff = _dateLeft.getTime() - _dateRight.getTime();\n\n if (diff < 0) {\n return -1;\n } else if (diff > 0) {\n return 1;\n // Return 0 if diff is 0; return NaN if diff is NaN\n } else {\n return diff;\n }\n}\n\n// Fallback for modularized imports:\nexport default compareAsc;\n","import { startOfDay } from \"./startOfDay.mjs\";\n\n/**\n * @name isSameDay\n * @category Day Helpers\n * @summary Are the given dates in the same day (and year and month)?\n *\n * @description\n * Are the given dates in the same day (and year and month)?\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The first date to check\n * @param dateRight - The second date to check\n\n * @returns The dates are in the same day (and year and month)\n *\n * @example\n * // Are 4 September 06:00:00 and 4 September 18:00:00 in the same day?\n * const result = isSameDay(new Date(2014, 8, 4, 6, 0), new Date(2014, 8, 4, 18, 0))\n * //=> true\n *\n * @example\n * // Are 4 September and 4 October in the same day?\n * const result = isSameDay(new Date(2014, 8, 4), new Date(2014, 9, 4))\n * //=> false\n *\n * @example\n * // Are 4 September, 2014 and 4 September, 2015 in the same day?\n * const result = isSameDay(new Date(2014, 8, 4), new Date(2015, 8, 4))\n * //=> false\n */\nexport function isSameDay(dateLeft, dateRight) {\n const dateLeftStartOfDay = startOfDay(dateLeft);\n const dateRightStartOfDay = startOfDay(dateRight);\n\n return +dateLeftStartOfDay === +dateRightStartOfDay;\n}\n\n// Fallback for modularized imports:\nexport default isSameDay;\n","/**\n * @name isDate\n * @category Common Helpers\n * @summary Is the given value a date?\n *\n * @description\n * Returns true if the given value is an instance of Date. The function works for dates transferred across iframes.\n *\n * @param value - The value to check\n *\n * @returns True if the given value is a date\n *\n * @example\n * // For a valid date:\n * const result = isDate(new Date())\n * //=> true\n *\n * @example\n * // For an invalid date:\n * const result = isDate(new Date(NaN))\n * //=> true\n *\n * @example\n * // For some value:\n * const result = isDate('2014-02-31')\n * //=> false\n *\n * @example\n * // For an object:\n * const result = isDate({})\n * //=> false\n */\nexport function isDate(value) {\n return (\n value instanceof Date ||\n (typeof value === \"object\" &&\n Object.prototype.toString.call(value) === \"[object Date]\")\n );\n}\n\n// Fallback for modularized imports:\nexport default isDate;\n","import { isDate } from \"./isDate.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name isValid\n * @category Common Helpers\n * @summary Is the given date valid?\n *\n * @description\n * Returns false if argument is Invalid Date and true otherwise.\n * Argument is converted to Date using `toDate`. See [toDate](https://date-fns.org/docs/toDate)\n * Invalid Date is a Date, whose time value is NaN.\n *\n * Time value of Date: http://es5.github.io/#x15.9.1.1\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to check\n *\n * @returns The date is valid\n *\n * @example\n * // For the valid date:\n * const result = isValid(new Date(2014, 1, 31))\n * //=> true\n *\n * @example\n * // For the value, convertable into a date:\n * const result = isValid(1393804800000)\n * //=> true\n *\n * @example\n * // For the invalid date:\n * const result = isValid(new Date(''))\n * //=> false\n */\nexport function isValid(date) {\n if (!isDate(date) && typeof date !== \"number\") {\n return false;\n }\n const _date = toDate(date);\n return !isNaN(Number(_date));\n}\n\n// Fallback for modularized imports:\nexport default isValid;\n","import { millisecondsInWeek } from \"./constants.mjs\";\nimport { startOfISOWeek } from \"./startOfISOWeek.mjs\";\nimport { getTimezoneOffsetInMilliseconds } from \"./_lib/getTimezoneOffsetInMilliseconds.mjs\";\n\n/**\n * @name differenceInCalendarISOWeeks\n * @category ISO Week Helpers\n * @summary Get the number of calendar ISO weeks between the given dates.\n *\n * @description\n * Get the number of calendar ISO weeks between the given dates.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The later date\n * @param dateRight - The earlier date\n *\n * @returns The number of calendar ISO weeks\n *\n * @example\n * // How many calendar ISO weeks are between 6 July 2014 and 21 July 2014?\n * const result = differenceInCalendarISOWeeks(\n * new Date(2014, 6, 21),\n * new Date(2014, 6, 6)\n * )\n * //=> 3\n */\nexport function differenceInCalendarISOWeeks(dateLeft, dateRight) {\n const startOfISOWeekLeft = startOfISOWeek(dateLeft);\n const startOfISOWeekRight = startOfISOWeek(dateRight);\n\n const timestampLeft =\n +startOfISOWeekLeft - getTimezoneOffsetInMilliseconds(startOfISOWeekLeft);\n const timestampRight =\n +startOfISOWeekRight - getTimezoneOffsetInMilliseconds(startOfISOWeekRight);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round((timestampLeft - timestampRight) / millisecondsInWeek);\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarISOWeeks;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name differenceInCalendarMonths\n * @category Month Helpers\n * @summary Get the number of calendar months between the given dates.\n *\n * @description\n * Get the number of calendar months between the given dates.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The later date\n * @param dateRight - The earlier date\n *\n * @returns The number of calendar months\n *\n * @example\n * // How many calendar months are between 31 January 2014 and 1 September 2014?\n * const result = differenceInCalendarMonths(\n * new Date(2014, 8, 1),\n * new Date(2014, 0, 31)\n * )\n * //=> 8\n */\nexport function differenceInCalendarMonths(dateLeft, dateRight) {\n const _dateLeft = toDate(dateLeft);\n const _dateRight = toDate(dateRight);\n\n const yearDiff = _dateLeft.getFullYear() - _dateRight.getFullYear();\n const monthDiff = _dateLeft.getMonth() - _dateRight.getMonth();\n\n return yearDiff * 12 + monthDiff;\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarMonths;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name differenceInCalendarYears\n * @category Year Helpers\n * @summary Get the number of calendar years between the given dates.\n *\n * @description\n * Get the number of calendar years between the given dates.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The later date\n * @param dateRight - The earlier date\n\n * @returns The number of calendar years\n *\n * @example\n * // How many calendar years are between 31 December 2013 and 11 February 2015?\n * const result = differenceInCalendarYears(\n * new Date(2015, 1, 11),\n * new Date(2013, 11, 31)\n * )\n * //=> 2\n */\nexport function differenceInCalendarYears(dateLeft, dateRight) {\n const _dateLeft = toDate(dateLeft);\n const _dateRight = toDate(dateRight);\n\n return _dateLeft.getFullYear() - _dateRight.getFullYear();\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarYears;\n","export function getRoundingMethod(method) {\n return (number) => {\n const round = method ? Math[method] : Math.trunc;\n const result = round(number);\n // Prevent negative zero\n return result === 0 ? 0 : result;\n };\n}\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name differenceInMilliseconds\n * @category Millisecond Helpers\n * @summary Get the number of milliseconds between the given dates.\n *\n * @description\n * Get the number of milliseconds between the given dates.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The later date\n * @param dateRight - The earlier date\n *\n * @returns The number of milliseconds\n *\n * @example\n * // How many milliseconds are between\n * // 2 July 2014 12:30:20.600 and 2 July 2014 12:30:21.700?\n * const result = differenceInMilliseconds(\n * new Date(2014, 6, 2, 12, 30, 21, 700),\n * new Date(2014, 6, 2, 12, 30, 20, 600)\n * )\n * //=> 1100\n */\nexport function differenceInMilliseconds(dateLeft, dateRight) {\n return +toDate(dateLeft) - +toDate(dateRight);\n}\n\n// Fallback for modularized imports:\nexport default differenceInMilliseconds;\n","import { getRoundingMethod } from \"./_lib/getRoundingMethod.mjs\";\nimport { millisecondsInHour } from \"./constants.mjs\";\nimport { differenceInMilliseconds } from \"./differenceInMilliseconds.mjs\";\n\n/**\n * The {@link differenceInHours} function options.\n */\n\n/**\n * @name differenceInHours\n * @category Hour Helpers\n * @summary Get the number of hours between the given dates.\n *\n * @description\n * Get the number of hours between the given dates.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The later date\n * @param dateRight - The earlier date\n * @param options - An object with options.\n *\n * @returns The number of hours\n *\n * @example\n * // How many hours are between 2 July 2014 06:50:00 and 2 July 2014 19:00:00?\n * const result = differenceInHours(\n * new Date(2014, 6, 2, 19, 0),\n * new Date(2014, 6, 2, 6, 50)\n * )\n * //=> 12\n */\nexport function differenceInHours(dateLeft, dateRight, options) {\n const diff =\n differenceInMilliseconds(dateLeft, dateRight) / millisecondsInHour;\n return getRoundingMethod(options?.roundingMethod)(diff);\n}\n\n// Fallback for modularized imports:\nexport default differenceInHours;\n","import { getRoundingMethod } from \"./_lib/getRoundingMethod.mjs\";\nimport { millisecondsInMinute } from \"./constants.mjs\";\nimport { differenceInMilliseconds } from \"./differenceInMilliseconds.mjs\";\n\n/**\n * The {@link differenceInMinutes} function options.\n */\n\n/**\n * @name differenceInMinutes\n * @category Minute Helpers\n * @summary Get the number of minutes between the given dates.\n *\n * @description\n * Get the signed number of full (rounded towards 0) minutes between the given dates.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The later date\n * @param dateRight - The earlier date\n * @param options - An object with options.\n *\n * @returns The number of minutes\n *\n * @example\n * // How many minutes are between 2 July 2014 12:07:59 and 2 July 2014 12:20:00?\n * const result = differenceInMinutes(\n * new Date(2014, 6, 2, 12, 20, 0),\n * new Date(2014, 6, 2, 12, 7, 59)\n * )\n * //=> 12\n *\n * @example\n * // How many minutes are between 10:01:59 and 10:00:00\n * const result = differenceInMinutes(\n * new Date(2000, 0, 1, 10, 0, 0),\n * new Date(2000, 0, 1, 10, 1, 59)\n * )\n * //=> -1\n */\nexport function differenceInMinutes(dateLeft, dateRight, options) {\n const diff =\n differenceInMilliseconds(dateLeft, dateRight) / millisecondsInMinute;\n return getRoundingMethod(options?.roundingMethod)(diff);\n}\n\n// Fallback for modularized imports:\nexport default differenceInMinutes;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name endOfDay\n * @category Day Helpers\n * @summary Return the end of a day for the given date.\n *\n * @description\n * Return the end of a day for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The end of a day\n *\n * @example\n * // The end of a day for 2 September 2014 11:55:00:\n * const result = endOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 23:59:59.999\n */\nexport function endOfDay(date) {\n const _date = toDate(date);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfDay;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name endOfMonth\n * @category Month Helpers\n * @summary Return the end of a month for the given date.\n *\n * @description\n * Return the end of a month for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The end of a month\n *\n * @example\n * // The end of a month for 2 September 2014 11:55:00:\n * const result = endOfMonth(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 30 2014 23:59:59.999\n */\nexport function endOfMonth(date) {\n const _date = toDate(date);\n const month = _date.getMonth();\n _date.setFullYear(_date.getFullYear(), month + 1, 0);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfMonth;\n","import { endOfDay } from \"./endOfDay.mjs\";\nimport { endOfMonth } from \"./endOfMonth.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name isLastDayOfMonth\n * @category Month Helpers\n * @summary Is the given date the last day of a month?\n *\n * @description\n * Is the given date the last day of a month?\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to check\n\n * @returns The date is the last day of a month\n *\n * @example\n * // Is 28 February 2014 the last day of a month?\n * const result = isLastDayOfMonth(new Date(2014, 1, 28))\n * //=> true\n */\nexport function isLastDayOfMonth(date) {\n const _date = toDate(date);\n return +endOfDay(_date) === +endOfMonth(_date);\n}\n\n// Fallback for modularized imports:\nexport default isLastDayOfMonth;\n","import { compareAsc } from \"./compareAsc.mjs\";\nimport { differenceInCalendarMonths } from \"./differenceInCalendarMonths.mjs\";\nimport { isLastDayOfMonth } from \"./isLastDayOfMonth.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name differenceInMonths\n * @category Month Helpers\n * @summary Get the number of full months between the given dates.\n *\n * @description\n * Get the number of full months between the given dates using trunc as a default rounding method.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The later date\n * @param dateRight - The earlier date\n *\n * @returns The number of full months\n *\n * @example\n * // How many full months are between 31 January 2014 and 1 September 2014?\n * const result = differenceInMonths(new Date(2014, 8, 1), new Date(2014, 0, 31))\n * //=> 7\n */\nexport function differenceInMonths(dateLeft, dateRight) {\n const _dateLeft = toDate(dateLeft);\n const _dateRight = toDate(dateRight);\n\n const sign = compareAsc(_dateLeft, _dateRight);\n const difference = Math.abs(\n differenceInCalendarMonths(_dateLeft, _dateRight),\n );\n let result;\n\n // Check for the difference of less than month\n if (difference < 1) {\n result = 0;\n } else {\n if (_dateLeft.getMonth() === 1 && _dateLeft.getDate() > 27) {\n // This will check if the date is end of Feb and assign a higher end of month date\n // to compare it with Jan\n _dateLeft.setDate(30);\n }\n\n _dateLeft.setMonth(_dateLeft.getMonth() - sign * difference);\n\n // Math.abs(diff in full months - diff in calendar months) === 1 if last calendar month is not full\n // If so, result must be decreased by 1 in absolute value\n let isLastMonthNotFull = compareAsc(_dateLeft, _dateRight) === -sign;\n\n // Check for cases of one full calendar month\n if (\n isLastDayOfMonth(toDate(dateLeft)) &&\n difference === 1 &&\n compareAsc(dateLeft, _dateRight) === 1\n ) {\n isLastMonthNotFull = false;\n }\n\n result = sign * (difference - Number(isLastMonthNotFull));\n }\n\n // Prevent negative zero\n return result === 0 ? 0 : result;\n}\n\n// Fallback for modularized imports:\nexport default differenceInMonths;\n","import { getRoundingMethod } from \"./_lib/getRoundingMethod.mjs\";\nimport { differenceInMonths } from \"./differenceInMonths.mjs\";\n\n/**\n * The {@link differenceInQuarters} function options.\n */\n\n/**\n * @name differenceInQuarters\n * @category Quarter Helpers\n * @summary Get the number of quarters between the given dates.\n *\n * @description\n * Get the number of quarters between the given dates.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The later date\n * @param dateRight - The earlier date\n * @param options - An object with options.\n *\n * @returns The number of full quarters\n *\n * @example\n * // How many full quarters are between 31 December 2013 and 2 July 2014?\n * const result = differenceInQuarters(new Date(2014, 6, 2), new Date(2013, 11, 31))\n * //=> 2\n */\nexport function differenceInQuarters(dateLeft, dateRight, options) {\n const diff = differenceInMonths(dateLeft, dateRight) / 3;\n return getRoundingMethod(options?.roundingMethod)(diff);\n}\n\n// Fallback for modularized imports:\nexport default differenceInQuarters;\n","import { compareAsc } from \"./compareAsc.mjs\";\nimport { differenceInCalendarYears } from \"./differenceInCalendarYears.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name differenceInYears\n * @category Year Helpers\n * @summary Get the number of full years between the given dates.\n *\n * @description\n * Get the number of full years between the given dates.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The later date\n * @param dateRight - The earlier date\n *\n * @returns The number of full years\n *\n * @example\n * // How many full years are between 31 December 2013 and 11 February 2015?\n * const result = differenceInYears(new Date(2015, 1, 11), new Date(2013, 11, 31))\n * //=> 1\n */\nexport function differenceInYears(dateLeft, dateRight) {\n const _dateLeft = toDate(dateLeft);\n const _dateRight = toDate(dateRight);\n\n const sign = compareAsc(_dateLeft, _dateRight);\n const difference = Math.abs(differenceInCalendarYears(_dateLeft, _dateRight));\n\n // Set both dates to a valid leap year for accurate comparison when dealing\n // with leap days\n _dateLeft.setFullYear(1584);\n _dateRight.setFullYear(1584);\n\n // Math.abs(diff in full years - diff in calendar years) === 1 if last calendar year is not full\n // If so, result must be decreased by 1 in absolute value\n const isLastYearNotFull = compareAsc(_dateLeft, _dateRight) === -sign;\n const result = sign * (difference - +isLastYearNotFull);\n\n // Prevent negative zero\n return result === 0 ? 0 : result;\n}\n\n// Fallback for modularized imports:\nexport default differenceInYears;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name startOfQuarter\n * @category Quarter Helpers\n * @summary Return the start of a year quarter for the given date.\n *\n * @description\n * Return the start of a year quarter for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The start of a quarter\n *\n * @example\n * // The start of a quarter for 2 September 2014 11:55:00:\n * const result = startOfQuarter(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Jul 01 2014 00:00:00\n */\nexport function startOfQuarter(date) {\n const _date = toDate(date);\n const currentMonth = _date.getMonth();\n const month = currentMonth - (currentMonth % 3);\n _date.setMonth(month, 1);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfQuarter;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name startOfMonth\n * @category Month Helpers\n * @summary Return the start of a month for the given date.\n *\n * @description\n * Return the start of a month for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The start of a month\n *\n * @example\n * // The start of a month for 2 September 2014 11:55:00:\n * const result = startOfMonth(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfMonth(date) {\n const _date = toDate(date);\n _date.setDate(1);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfMonth;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name endOfYear\n * @category Year Helpers\n * @summary Return the end of a year for the given date.\n *\n * @description\n * Return the end of a year for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The end of a year\n *\n * @example\n * // The end of a year for 2 September 2014 11:55:00:\n * const result = endOfYear(new Date(2014, 8, 2, 11, 55, 00))\n * //=> Wed Dec 31 2014 23:59:59.999\n */\nexport function endOfYear(date) {\n const _date = toDate(date);\n const year = _date.getFullYear();\n _date.setFullYear(year + 1, 0, 0);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfYear;\n","import { toDate } from \"./toDate.mjs\";\nimport { constructFrom } from \"./constructFrom.mjs\";\n\n/**\n * @name startOfYear\n * @category Year Helpers\n * @summary Return the start of a year for the given date.\n *\n * @description\n * Return the start of a year for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The start of a year\n *\n * @example\n * // The start of a year for 2 September 2014 11:55:00:\n * const result = startOfYear(new Date(2014, 8, 2, 11, 55, 00))\n * //=> Wed Jan 01 2014 00:00:00\n */\nexport function startOfYear(date) {\n const cleanDate = toDate(date);\n const _date = constructFrom(date, 0);\n _date.setFullYear(cleanDate.getFullYear(), 0, 1);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfYear;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name endOfHour\n * @category Hour Helpers\n * @summary Return the end of an hour for the given date.\n *\n * @description\n * Return the end of an hour for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The end of an hour\n *\n * @example\n * // The end of an hour for 2 September 2014 11:55:00:\n * const result = endOfHour(new Date(2014, 8, 2, 11, 55))\n * //=> Tue Sep 02 2014 11:59:59.999\n */\nexport function endOfHour(date) {\n const _date = toDate(date);\n _date.setMinutes(59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfHour;\n","import { toDate } from \"./toDate.mjs\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.mjs\";\n\n/**\n * The {@link endOfWeek} function options.\n */\n\n/**\n * @name endOfWeek\n * @category Week Helpers\n * @summary Return the end of a week for the given date.\n *\n * @description\n * Return the end of a week for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The end of a week\n *\n * @example\n * // The end of a week for 2 September 2014 11:55:00:\n * const result = endOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sat Sep 06 2014 23:59:59.999\n *\n * @example\n * // If the week starts on Monday, the end of the week for 2 September 2014 11:55:00:\n * const result = endOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })\n * //=> Sun Sep 07 2014 23:59:59.999\n */\nexport function endOfWeek(date, options) {\n const defaultOptions = getDefaultOptions();\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const _date = toDate(date);\n const day = _date.getDay();\n const diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn);\n\n _date.setDate(_date.getDate() + diff);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfWeek;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name endOfQuarter\n * @category Quarter Helpers\n * @summary Return the end of a year quarter for the given date.\n *\n * @description\n * Return the end of a year quarter for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The end of a quarter\n *\n * @example\n * // The end of a quarter for 2 September 2014 11:55:00:\n * const result = endOfQuarter(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 30 2014 23:59:59.999\n */\nexport function endOfQuarter(date) {\n const _date = toDate(date);\n const currentMonth = _date.getMonth();\n const month = currentMonth - (currentMonth % 3) + 3;\n _date.setMonth(month, 0);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfQuarter;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"less than a second\",\n other: \"less than {{count}} seconds\",\n },\n\n xSeconds: {\n one: \"1 second\",\n other: \"{{count}} seconds\",\n },\n\n halfAMinute: \"half a minute\",\n\n lessThanXMinutes: {\n one: \"less than a minute\",\n other: \"less than {{count}} minutes\",\n },\n\n xMinutes: {\n one: \"1 minute\",\n other: \"{{count}} minutes\",\n },\n\n aboutXHours: {\n one: \"about 1 hour\",\n other: \"about {{count}} hours\",\n },\n\n xHours: {\n one: \"1 hour\",\n other: \"{{count}} hours\",\n },\n\n xDays: {\n one: \"1 day\",\n other: \"{{count}} days\",\n },\n\n aboutXWeeks: {\n one: \"about 1 week\",\n other: \"about {{count}} weeks\",\n },\n\n xWeeks: {\n one: \"1 week\",\n other: \"{{count}} weeks\",\n },\n\n aboutXMonths: {\n one: \"about 1 month\",\n other: \"about {{count}} months\",\n },\n\n xMonths: {\n one: \"1 month\",\n other: \"{{count}} months\",\n },\n\n aboutXYears: {\n one: \"about 1 year\",\n other: \"about {{count}} years\",\n },\n\n xYears: {\n one: \"1 year\",\n other: \"{{count}} years\",\n },\n\n overXYears: {\n one: \"over 1 year\",\n other: \"over {{count}} years\",\n },\n\n almostXYears: {\n one: \"almost 1 year\",\n other: \"almost {{count}} years\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", count.toString());\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"in \" + result;\n } else {\n return result + \" ago\";\n }\n }\n\n return result;\n};\n","export function buildFormatLongFn(args) {\n return (options = {}) => {\n // TODO: Remove String()\n const width = options.width ? String(options.width) : args.defaultWidth;\n const format = args.formats[width] || args.formats[args.defaultWidth];\n return format;\n };\n}\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.mjs\";\n\nconst dateFormats = {\n full: \"EEEE, MMMM do, y\",\n long: \"MMMM do, y\",\n medium: \"MMM d, y\",\n short: \"MM/dd/yyyy\",\n};\n\nconst timeFormats = {\n full: \"h:mm:ss a zzzz\",\n long: \"h:mm:ss a z\",\n medium: \"h:mm:ss a\",\n short: \"h:mm a\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} 'at' {{time}}\",\n long: \"{{date}} 'at' {{time}}\",\n medium: \"{{date}}, {{time}}\",\n short: \"{{date}}, {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","const formatRelativeLocale = {\n lastWeek: \"'last' eeee 'at' p\",\n yesterday: \"'yesterday at' p\",\n today: \"'today at' p\",\n tomorrow: \"'tomorrow at' p\",\n nextWeek: \"eeee 'at' p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n formatRelativeLocale[token];\n","/* eslint-disable no-unused-vars */\n\n/**\n * The localize function argument callback which allows to convert raw value to\n * the actual type.\n *\n * @param value - The value to convert\n *\n * @returns The converted value\n */\n\n/**\n * The map of localized values for each width.\n */\n\n/**\n * The index type of the locale unit value. It types conversion of units of\n * values that don't start at 0 (i.e. quarters).\n */\n\n/**\n * Converts the unit value to the tuple of values.\n */\n\n/**\n * The tuple of localized era values. The first element represents BC,\n * the second element represents AD.\n */\n\n/**\n * The tuple of localized quarter values. The first element represents Q1.\n */\n\n/**\n * The tuple of localized day values. The first element represents Sunday.\n */\n\n/**\n * The tuple of localized month values. The first element represents January.\n */\n\nexport function buildLocalizeFn(args) {\n return (value, options) => {\n const context = options?.context ? String(options.context) : \"standalone\";\n\n let valuesArray;\n if (context === \"formatting\" && args.formattingValues) {\n const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;\n const width = options?.width ? String(options.width) : defaultWidth;\n\n valuesArray =\n args.formattingValues[width] || args.formattingValues[defaultWidth];\n } else {\n const defaultWidth = args.defaultWidth;\n const width = options?.width ? String(options.width) : args.defaultWidth;\n\n valuesArray = args.values[width] || args.values[defaultWidth];\n }\n const index = args.argumentCallback ? args.argumentCallback(value) : value;\n\n // @ts-expect-error - 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!\n return valuesArray[index];\n };\n}\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.mjs\";\n\nconst eraValues = {\n narrow: [\"B\", \"A\"],\n abbreviated: [\"BC\", \"AD\"],\n wide: [\"Before Christ\", \"Anno Domini\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n wide: [\"1st quarter\", \"2nd quarter\", \"3rd quarter\", \"4th quarter\"],\n};\n\n// Note: in English, the names of days of the week and months are capitalized.\n// If you are making a new locale based on this one, check if the same is true for the language you're working on.\n// Generally, formatted dates should look like they are in the middle of a sentence,\n// e.g. in Spanish language the weekdays and months should be in the lowercase.\nconst monthValues = {\n narrow: [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n abbreviated: [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ],\n\n wide: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"],\n short: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"],\n abbreviated: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n wide: [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n ],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n};\n\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, _options) => {\n const number = Number(dirtyNumber);\n\n // If ordinal numbers depend on context, for example,\n // if they are different for different grammatical genders,\n // use `options.unit`.\n //\n // `unit` can be 'year', 'quarter', 'month', 'week', 'date', 'dayOfYear',\n // 'day', 'hour', 'minute', 'second'.\n\n const rem100 = number % 100;\n if (rem100 > 20 || rem100 < 10) {\n switch (rem100 % 10) {\n case 1:\n return number + \"st\";\n case 2:\n return number + \"nd\";\n case 3:\n return number + \"rd\";\n }\n }\n return number + \"th\";\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","export function buildMatchFn(args) {\n return (string, options = {}) => {\n const width = options.width;\n\n const matchPattern =\n (width && args.matchPatterns[width]) ||\n args.matchPatterns[args.defaultMatchWidth];\n const matchResult = string.match(matchPattern);\n\n if (!matchResult) {\n return null;\n }\n const matchedString = matchResult[0];\n\n const parsePatterns =\n (width && args.parsePatterns[width]) ||\n args.parsePatterns[args.defaultParseWidth];\n\n const key = Array.isArray(parsePatterns)\n ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString))\n : // eslint-disable-next-line @typescript-eslint/no-explicit-any -- I challange you to fix the type\n findKey(parsePatterns, (pattern) => pattern.test(matchedString));\n\n let value;\n\n value = args.valueCallback ? args.valueCallback(key) : key;\n value = options.valueCallback\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any -- I challange you to fix the type\n options.valueCallback(value)\n : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n\nfunction findKey(object, predicate) {\n for (const key in object) {\n if (\n Object.prototype.hasOwnProperty.call(object, key) &&\n predicate(object[key])\n ) {\n return key;\n }\n }\n return undefined;\n}\n\nfunction findIndex(array, predicate) {\n for (let key = 0; key < array.length; key++) {\n if (predicate(array[key])) {\n return key;\n }\n }\n return undefined;\n}\n","export function buildMatchPatternFn(args) {\n return (string, options = {}) => {\n const matchResult = string.match(args.matchPattern);\n if (!matchResult) return null;\n const matchedString = matchResult[0];\n\n const parseResult = string.match(args.parsePattern);\n if (!parseResult) return null;\n let value = args.valueCallback\n ? args.valueCallback(parseResult[0])\n : parseResult[0];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- I challange you to fix the type\n value = options.valueCallback ? options.valueCallback(value) : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.mjs\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.mjs\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(th|st|nd|rd)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(b|a)/i,\n abbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n wide: /^(before christ|before common era|anno domini|common era)/i,\n};\nconst parseEraPatterns = {\n any: [/^b/i, /^(a|c)/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234](th|st|nd|rd)? quarter/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,\n wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^j/i,\n /^f/i,\n /^m/i,\n /^a/i,\n /^m/i,\n /^j/i,\n /^j/i,\n /^a/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n\n any: [\n /^ja/i,\n /^f/i,\n /^mar/i,\n /^ap/i,\n /^may/i,\n /^jun/i,\n /^jul/i,\n /^au/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[smtwf]/i,\n short: /^(su|mo|tu|we|th|fr|sa)/i,\n abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,\n wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i,\n};\nconst parseDayPatterns = {\n narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],\n any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i],\n};\n\nconst matchDayPeriodPatterns = {\n narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,\n any: /^([ap]\\.?\\s?m\\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mi/i,\n noon: /^no/i,\n morning: /morning/i,\n afternoon: /afternoon/i,\n evening: /evening/i,\n night: /night/i,\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value, 10),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import { formatDistance } from \"./en-US/_lib/formatDistance.mjs\";\nimport { formatLong } from \"./en-US/_lib/formatLong.mjs\";\nimport { formatRelative } from \"./en-US/_lib/formatRelative.mjs\";\nimport { localize } from \"./en-US/_lib/localize.mjs\";\nimport { match } from \"./en-US/_lib/match.mjs\";\n\n/**\n * @category Locales\n * @summary English locale (United States).\n * @language English\n * @iso-639-2 eng\n * @author Sasha Koss [@kossnocorp](https://github.com/kossnocorp)\n * @author Lesha Koss [@leshakoss](https://github.com/leshakoss)\n */\nexport const enUS = {\n code: \"en-US\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 0 /* Sunday */,\n firstWeekContainsDate: 1,\n },\n};\n\n// Fallback for modularized imports:\nexport default enUS;\n","import { differenceInCalendarDays } from \"./differenceInCalendarDays.mjs\";\nimport { startOfYear } from \"./startOfYear.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name getDayOfYear\n * @category Day Helpers\n * @summary Get the day of the year of the given date.\n *\n * @description\n * Get the day of the year of the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n *\n * @returns The day of year\n *\n * @example\n * // Which day of the year is 2 July 2014?\n * const result = getDayOfYear(new Date(2014, 6, 2))\n * //=> 183\n */\nexport function getDayOfYear(date) {\n const _date = toDate(date);\n const diff = differenceInCalendarDays(_date, startOfYear(_date));\n const dayOfYear = diff + 1;\n return dayOfYear;\n}\n\n// Fallback for modularized imports:\nexport default getDayOfYear;\n","import { millisecondsInWeek } from \"./constants.mjs\";\nimport { startOfISOWeek } from \"./startOfISOWeek.mjs\";\nimport { startOfISOWeekYear } from \"./startOfISOWeekYear.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name getISOWeek\n * @category ISO Week Helpers\n * @summary Get the ISO week of the given date.\n *\n * @description\n * Get the ISO week of the given date.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n *\n * @returns The ISO week\n *\n * @example\n * // Which week of the ISO-week numbering year is 2 January 2005?\n * const result = getISOWeek(new Date(2005, 0, 2))\n * //=> 53\n */\nexport function getISOWeek(date) {\n const _date = toDate(date);\n const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getISOWeek;\n","import { constructFrom } from \"./constructFrom.mjs\";\nimport { startOfWeek } from \"./startOfWeek.mjs\";\nimport { toDate } from \"./toDate.mjs\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.mjs\";\n\n/**\n * The {@link getWeekYear} function options.\n */\n\n/**\n * @name getWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Get the local week-numbering year of the given date.\n *\n * @description\n * Get the local week-numbering year of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n * @param options - An object with options.\n *\n * @returns The local week-numbering year\n *\n * @example\n * // Which week numbering year is 26 December 2004 with the default settings?\n * const result = getWeekYear(new Date(2004, 11, 26))\n * //=> 2005\n *\n * @example\n * // Which week numbering year is 26 December 2004 if week starts on Saturday?\n * const result = getWeekYear(new Date(2004, 11, 26), { weekStartsOn: 6 })\n * //=> 2004\n *\n * @example\n * // Which week numbering year is 26 December 2004 if the first week contains 4 January?\n * const result = getWeekYear(new Date(2004, 11, 26), { firstWeekContainsDate: 4 })\n * //=> 2004\n */\nexport function getWeekYear(date, options) {\n const _date = toDate(date);\n const year = _date.getFullYear();\n\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const firstWeekOfNextYear = constructFrom(date, 0);\n firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);\n firstWeekOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfWeek(firstWeekOfNextYear, options);\n\n const firstWeekOfThisYear = constructFrom(date, 0);\n firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);\n firstWeekOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfWeek(firstWeekOfThisYear, options);\n\n if (_date.getTime() >= startOfNextYear.getTime()) {\n return year + 1;\n } else if (_date.getTime() >= startOfThisYear.getTime()) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getWeekYear;\n","import { constructFrom } from \"./constructFrom.mjs\";\nimport { getWeekYear } from \"./getWeekYear.mjs\";\nimport { startOfWeek } from \"./startOfWeek.mjs\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.mjs\";\n\n/**\n * The {@link startOfWeekYear} function options.\n */\n\n/**\n * @name startOfWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Return the start of a local week-numbering year for the given date.\n *\n * @description\n * Return the start of a local week-numbering year.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week-numbering year\n *\n * @example\n * // The start of an a week-numbering year for 2 July 2005 with default settings:\n * const result = startOfWeekYear(new Date(2005, 6, 2))\n * //=> Sun Dec 26 2004 00:00:00\n *\n * @example\n * // The start of a week-numbering year for 2 July 2005\n * // if Monday is the first day of week\n * // and 4 January is always in the first week of the year:\n * const result = startOfWeekYear(new Date(2005, 6, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfWeekYear(date, options) {\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const year = getWeekYear(date, options);\n const firstWeek = constructFrom(date, 0);\n firstWeek.setFullYear(year, 0, firstWeekContainsDate);\n firstWeek.setHours(0, 0, 0, 0);\n const _date = startOfWeek(firstWeek, options);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeekYear;\n","import { millisecondsInWeek } from \"./constants.mjs\";\nimport { startOfWeek } from \"./startOfWeek.mjs\";\nimport { startOfWeekYear } from \"./startOfWeekYear.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * The {@link getWeek} function options.\n */\n\n/**\n * @name getWeek\n * @category Week Helpers\n * @summary Get the local week index of the given date.\n *\n * @description\n * Get the local week index of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The week\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005 with default options?\n * const result = getWeek(new Date(2005, 0, 2))\n * //=> 2\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005,\n * // if Monday is the first day of the week,\n * // and the first week of the year always contains 4 January?\n * const result = getWeek(new Date(2005, 0, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> 53\n */\n\nexport function getWeek(date, options) {\n const _date = toDate(date);\n const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getWeek;\n","export function addLeadingZeros(number, targetLength) {\n const sign = number < 0 ? \"-\" : \"\";\n const output = Math.abs(number).toString().padStart(targetLength, \"0\");\n return sign + output;\n}\n","import { addLeadingZeros } from \"../addLeadingZeros.mjs\";\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | |\n * | d | Day of month | D | |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | m | Minute | M | Month |\n * | s | Second | S | Fraction of second |\n * | y | Year (abs) | Y | |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n */\n\nexport const lightFormatters = {\n // Year\n y(date, token) {\n // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_tokens\n // | Year | y | yy | yyy | yyyy | yyyyy |\n // |----------|-------|----|-------|-------|-------|\n // | AD 1 | 1 | 01 | 001 | 0001 | 00001 |\n // | AD 12 | 12 | 12 | 012 | 0012 | 00012 |\n // | AD 123 | 123 | 23 | 123 | 0123 | 00123 |\n // | AD 1234 | 1234 | 34 | 1234 | 1234 | 01234 |\n // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\n\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return addLeadingZeros(token === \"yy\" ? year % 100 : year, token.length);\n },\n\n // Month\n M(date, token) {\n const month = date.getMonth();\n return token === \"M\" ? String(month + 1) : addLeadingZeros(month + 1, 2);\n },\n\n // Day of the month\n d(date, token) {\n return addLeadingZeros(date.getDate(), token.length);\n },\n\n // AM or PM\n a(date, token) {\n const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return dayPeriodEnumValue.toUpperCase();\n case \"aaa\":\n return dayPeriodEnumValue;\n case \"aaaaa\":\n return dayPeriodEnumValue[0];\n case \"aaaa\":\n default:\n return dayPeriodEnumValue === \"am\" ? \"a.m.\" : \"p.m.\";\n }\n },\n\n // Hour [1-12]\n h(date, token) {\n return addLeadingZeros(date.getHours() % 12 || 12, token.length);\n },\n\n // Hour [0-23]\n H(date, token) {\n return addLeadingZeros(date.getHours(), token.length);\n },\n\n // Minute\n m(date, token) {\n return addLeadingZeros(date.getMinutes(), token.length);\n },\n\n // Second\n s(date, token) {\n return addLeadingZeros(date.getSeconds(), token.length);\n },\n\n // Fraction of second\n S(date, token) {\n const numberOfDigits = token.length;\n const milliseconds = date.getMilliseconds();\n const fractionalSeconds = Math.trunc(\n milliseconds * Math.pow(10, numberOfDigits - 3),\n );\n return addLeadingZeros(fractionalSeconds, token.length);\n },\n};\n","import { getDayOfYear } from \"../../getDayOfYear.mjs\";\nimport { getISOWeek } from \"../../getISOWeek.mjs\";\nimport { getISOWeekYear } from \"../../getISOWeekYear.mjs\";\nimport { getWeek } from \"../../getWeek.mjs\";\nimport { getWeekYear } from \"../../getWeekYear.mjs\";\nimport { addLeadingZeros } from \"../addLeadingZeros.mjs\";\nimport { lightFormatters } from \"./lightFormatters.mjs\";\n\nconst dayPeriodEnum = {\n am: \"am\",\n pm: \"pm\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n};\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | Milliseconds in day |\n * | b | AM, PM, noon, midnight | B | Flexible day period |\n * | c | Stand-alone local day of week | C* | Localized hour w/ day period |\n * | d | Day of month | D | Day of year |\n * | e | Local day of week | E | Day of week |\n * | f | | F* | Day of week in month |\n * | g* | Modified Julian day | G | Era |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | i! | ISO day of week | I! | ISO week of year |\n * | j* | Localized hour w/ day period | J* | Localized hour w/o day period |\n * | k | Hour [1-24] | K | Hour [0-11] |\n * | l* | (deprecated) | L | Stand-alone month |\n * | m | Minute | M | Month |\n * | n | | N | |\n * | o! | Ordinal number modifier | O | Timezone (GMT) |\n * | p! | Long localized time | P! | Long localized date |\n * | q | Stand-alone quarter | Q | Quarter |\n * | r* | Related Gregorian year | R! | ISO week-numbering year |\n * | s | Second | S | Fraction of second |\n * | t! | Seconds timestamp | T! | Milliseconds timestamp |\n * | u | Extended year | U* | Cyclic year |\n * | v* | Timezone (generic non-locat.) | V* | Timezone (location) |\n * | w | Local week of year | W* | Week of month |\n * | x | Timezone (ISO-8601 w/o Z) | X | Timezone (ISO-8601) |\n * | y | Year (abs) | Y | Local week-numbering year |\n * | z | Timezone (specific non-locat.) | Z* | Timezone (aliases) |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n *\n * Letters marked by ! are non-standard, but implemented by date-fns:\n * - `o` modifies the previous token to turn it into an ordinal (see `format` docs)\n * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n * i.e. 7 for Sunday, 1 for Monday, etc.\n * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n * `R` is supposed to be used in conjunction with `I` and `i`\n * for universal ISO week-numbering date, whereas\n * `Y` is supposed to be used in conjunction with `w` and `e`\n * for week-numbering date specific to the locale.\n * - `P` is long localized date format\n * - `p` is long localized time format\n */\n\nexport const formatters = {\n // Era\n G: function (date, token, localize) {\n const era = date.getFullYear() > 0 ? 1 : 0;\n switch (token) {\n // AD, BC\n case \"G\":\n case \"GG\":\n case \"GGG\":\n return localize.era(era, { width: \"abbreviated\" });\n // A, B\n case \"GGGGG\":\n return localize.era(era, { width: \"narrow\" });\n // Anno Domini, Before Christ\n case \"GGGG\":\n default:\n return localize.era(era, { width: \"wide\" });\n }\n },\n\n // Year\n y: function (date, token, localize) {\n // Ordinal number\n if (token === \"yo\") {\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return localize.ordinalNumber(year, { unit: \"year\" });\n }\n\n return lightFormatters.y(date, token);\n },\n\n // Local week-numbering year\n Y: function (date, token, localize, options) {\n const signedWeekYear = getWeekYear(date, options);\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;\n\n // Two digit year\n if (token === \"YY\") {\n const twoDigitYear = weekYear % 100;\n return addLeadingZeros(twoDigitYear, 2);\n }\n\n // Ordinal number\n if (token === \"Yo\") {\n return localize.ordinalNumber(weekYear, { unit: \"year\" });\n }\n\n // Padding\n return addLeadingZeros(weekYear, token.length);\n },\n\n // ISO week-numbering year\n R: function (date, token) {\n const isoWeekYear = getISOWeekYear(date);\n\n // Padding\n return addLeadingZeros(isoWeekYear, token.length);\n },\n\n // Extended year. This is a single number designating the year of this calendar system.\n // The main difference between `y` and `u` localizers are B.C. years:\n // | Year | `y` | `u` |\n // |------|-----|-----|\n // | AC 1 | 1 | 1 |\n // | BC 1 | 1 | 0 |\n // | BC 2 | 2 | -1 |\n // Also `yy` always returns the last two digits of a year,\n // while `uu` pads single digit years to 2 characters and returns other years unchanged.\n u: function (date, token) {\n const year = date.getFullYear();\n return addLeadingZeros(year, token.length);\n },\n\n // Quarter\n Q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"Q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"QQ\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"Qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"QQQ\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"QQQQQ\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"QQQQ\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone quarter\n q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"qq\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"qqq\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"qqqqq\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"qqqq\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // Month\n M: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n case \"M\":\n case \"MM\":\n return lightFormatters.M(date, token);\n // 1st, 2nd, ..., 12th\n case \"Mo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"MMM\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // J, F, ..., D\n case \"MMMMM\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // January, February, ..., December\n case \"MMMM\":\n default:\n return localize.month(month, { width: \"wide\", context: \"formatting\" });\n }\n },\n\n // Stand-alone month\n L: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n // 1, 2, ..., 12\n case \"L\":\n return String(month + 1);\n // 01, 02, ..., 12\n case \"LL\":\n return addLeadingZeros(month + 1, 2);\n // 1st, 2nd, ..., 12th\n case \"Lo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"LLL\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // J, F, ..., D\n case \"LLLLL\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // January, February, ..., December\n case \"LLLL\":\n default:\n return localize.month(month, { width: \"wide\", context: \"standalone\" });\n }\n },\n\n // Local week of year\n w: function (date, token, localize, options) {\n const week = getWeek(date, options);\n\n if (token === \"wo\") {\n return localize.ordinalNumber(week, { unit: \"week\" });\n }\n\n return addLeadingZeros(week, token.length);\n },\n\n // ISO week of year\n I: function (date, token, localize) {\n const isoWeek = getISOWeek(date);\n\n if (token === \"Io\") {\n return localize.ordinalNumber(isoWeek, { unit: \"week\" });\n }\n\n return addLeadingZeros(isoWeek, token.length);\n },\n\n // Day of the month\n d: function (date, token, localize) {\n if (token === \"do\") {\n return localize.ordinalNumber(date.getDate(), { unit: \"date\" });\n }\n\n return lightFormatters.d(date, token);\n },\n\n // Day of year\n D: function (date, token, localize) {\n const dayOfYear = getDayOfYear(date);\n\n if (token === \"Do\") {\n return localize.ordinalNumber(dayOfYear, { unit: \"dayOfYear\" });\n }\n\n return addLeadingZeros(dayOfYear, token.length);\n },\n\n // Day of week\n E: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n switch (token) {\n // Tue\n case \"E\":\n case \"EE\":\n case \"EEE\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"EEEEE\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"EEEEEE\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"EEEE\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Local day of week\n e: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (Nth day of week with current locale or weekStartsOn)\n case \"e\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"ee\":\n return addLeadingZeros(localDayOfWeek, 2);\n // 1st, 2nd, ..., 7th\n case \"eo\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"eee\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"eeeee\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"eeeeee\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"eeee\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone local day of week\n c: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (same as in `e`)\n case \"c\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"cc\":\n return addLeadingZeros(localDayOfWeek, token.length);\n // 1st, 2nd, ..., 7th\n case \"co\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"ccc\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // T\n case \"ccccc\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // Tu\n case \"cccccc\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"standalone\",\n });\n // Tuesday\n case \"cccc\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // ISO day of week\n i: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;\n switch (token) {\n // 2\n case \"i\":\n return String(isoDayOfWeek);\n // 02\n case \"ii\":\n return addLeadingZeros(isoDayOfWeek, token.length);\n // 2nd\n case \"io\":\n return localize.ordinalNumber(isoDayOfWeek, { unit: \"day\" });\n // Tue\n case \"iii\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"iiiii\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"iiiiii\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"iiii\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM or PM\n a: function (date, token, localize) {\n const hours = date.getHours();\n const dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"aaa\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"aaaaa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"aaaa\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM, PM, midnight, noon\n b: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours === 12) {\n dayPeriodEnumValue = dayPeriodEnum.noon;\n } else if (hours === 0) {\n dayPeriodEnumValue = dayPeriodEnum.midnight;\n } else {\n dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n }\n\n switch (token) {\n case \"b\":\n case \"bb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"bbb\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"bbbbb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"bbbb\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // in the morning, in the afternoon, in the evening, at night\n B: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours >= 17) {\n dayPeriodEnumValue = dayPeriodEnum.evening;\n } else if (hours >= 12) {\n dayPeriodEnumValue = dayPeriodEnum.afternoon;\n } else if (hours >= 4) {\n dayPeriodEnumValue = dayPeriodEnum.morning;\n } else {\n dayPeriodEnumValue = dayPeriodEnum.night;\n }\n\n switch (token) {\n case \"B\":\n case \"BB\":\n case \"BBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"BBBBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"BBBB\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Hour [1-12]\n h: function (date, token, localize) {\n if (token === \"ho\") {\n let hours = date.getHours() % 12;\n if (hours === 0) hours = 12;\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return lightFormatters.h(date, token);\n },\n\n // Hour [0-23]\n H: function (date, token, localize) {\n if (token === \"Ho\") {\n return localize.ordinalNumber(date.getHours(), { unit: \"hour\" });\n }\n\n return lightFormatters.H(date, token);\n },\n\n // Hour [0-11]\n K: function (date, token, localize) {\n const hours = date.getHours() % 12;\n\n if (token === \"Ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Hour [1-24]\n k: function (date, token, localize) {\n let hours = date.getHours();\n if (hours === 0) hours = 24;\n\n if (token === \"ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Minute\n m: function (date, token, localize) {\n if (token === \"mo\") {\n return localize.ordinalNumber(date.getMinutes(), { unit: \"minute\" });\n }\n\n return lightFormatters.m(date, token);\n },\n\n // Second\n s: function (date, token, localize) {\n if (token === \"so\") {\n return localize.ordinalNumber(date.getSeconds(), { unit: \"second\" });\n }\n\n return lightFormatters.s(date, token);\n },\n\n // Fraction of second\n S: function (date, token) {\n return lightFormatters.S(date, token);\n },\n\n // Timezone (ISO-8601. If offset is 0, output is always `'Z'`)\n X: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n if (timezoneOffset === 0) {\n return \"Z\";\n }\n\n switch (token) {\n // Hours and optional minutes\n case \"X\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XX`\n case \"XXXX\":\n case \"XX\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XXX`\n case \"XXXXX\":\n case \"XXX\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent)\n x: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Hours and optional minutes\n case \"x\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xx`\n case \"xxxx\":\n case \"xx\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xxx`\n case \"xxxxx\":\n case \"xxx\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (GMT)\n O: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"O\":\n case \"OO\":\n case \"OOO\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"OOOO\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (specific non-location)\n z: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"z\":\n case \"zz\":\n case \"zzz\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"zzzz\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Seconds timestamp\n t: function (date, token, _localize) {\n const timestamp = Math.trunc(date.getTime() / 1000);\n return addLeadingZeros(timestamp, token.length);\n },\n\n // Milliseconds timestamp\n T: function (date, token, _localize) {\n const timestamp = date.getTime();\n return addLeadingZeros(timestamp, token.length);\n },\n};\n\nfunction formatTimezoneShort(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = Math.trunc(absOffset / 60);\n const minutes = absOffset % 60;\n if (minutes === 0) {\n return sign + String(hours);\n }\n return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);\n}\n\nfunction formatTimezoneWithOptionalMinutes(offset, delimiter) {\n if (offset % 60 === 0) {\n const sign = offset > 0 ? \"-\" : \"+\";\n return sign + addLeadingZeros(Math.abs(offset) / 60, 2);\n }\n return formatTimezone(offset, delimiter);\n}\n\nfunction formatTimezone(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = addLeadingZeros(Math.trunc(absOffset / 60), 2);\n const minutes = addLeadingZeros(absOffset % 60, 2);\n return sign + hours + delimiter + minutes;\n}\n","const dateLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"P\":\n return formatLong.date({ width: \"short\" });\n case \"PP\":\n return formatLong.date({ width: \"medium\" });\n case \"PPP\":\n return formatLong.date({ width: \"long\" });\n case \"PPPP\":\n default:\n return formatLong.date({ width: \"full\" });\n }\n};\n\nconst timeLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"p\":\n return formatLong.time({ width: \"short\" });\n case \"pp\":\n return formatLong.time({ width: \"medium\" });\n case \"ppp\":\n return formatLong.time({ width: \"long\" });\n case \"pppp\":\n default:\n return formatLong.time({ width: \"full\" });\n }\n};\n\nconst dateTimeLongFormatter = (pattern, formatLong) => {\n const matchResult = pattern.match(/(P+)(p+)?/) || [];\n const datePattern = matchResult[1];\n const timePattern = matchResult[2];\n\n if (!timePattern) {\n return dateLongFormatter(pattern, formatLong);\n }\n\n let dateTimeFormat;\n\n switch (datePattern) {\n case \"P\":\n dateTimeFormat = formatLong.dateTime({ width: \"short\" });\n break;\n case \"PP\":\n dateTimeFormat = formatLong.dateTime({ width: \"medium\" });\n break;\n case \"PPP\":\n dateTimeFormat = formatLong.dateTime({ width: \"long\" });\n break;\n case \"PPPP\":\n default:\n dateTimeFormat = formatLong.dateTime({ width: \"full\" });\n break;\n }\n\n return dateTimeFormat\n .replace(\"{{date}}\", dateLongFormatter(datePattern, formatLong))\n .replace(\"{{time}}\", timeLongFormatter(timePattern, formatLong));\n};\n\nexport const longFormatters = {\n p: timeLongFormatter,\n P: dateTimeLongFormatter,\n};\n","const dayOfYearTokenRE = /^D+$/;\nconst weekYearTokenRE = /^Y+$/;\n\nconst throwTokens = [\"D\", \"DD\", \"YY\", \"YYYY\"];\n\nexport function isProtectedDayOfYearToken(token) {\n return dayOfYearTokenRE.test(token);\n}\n\nexport function isProtectedWeekYearToken(token) {\n return weekYearTokenRE.test(token);\n}\n\nexport function warnOrThrowProtectedError(token, format, input) {\n const _message = message(token, format, input);\n console.warn(_message);\n if (throwTokens.includes(token)) throw new RangeError(_message);\n}\n\nfunction message(token, format, input) {\n const subject = token[0] === \"Y\" ? \"years\" : \"days of the month\";\n return `Use \\`${token.toLowerCase()}\\` instead of \\`${token}\\` (in \\`${format}\\`) for formatting ${subject} to the input \\`${input}\\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`;\n}\n","import { defaultLocale } from \"./_lib/defaultLocale.mjs\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.mjs\";\nimport { formatters } from \"./_lib/format/formatters.mjs\";\nimport { longFormatters } from \"./_lib/format/longFormatters.mjs\";\nimport {\n isProtectedDayOfYearToken,\n isProtectedWeekYearToken,\n warnOrThrowProtectedError,\n} from \"./_lib/protectedTokens.mjs\";\nimport { isValid } from \"./isValid.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n// Rexports of internal for libraries to use.\n// See: https://github.com/date-fns/date-fns/issues/3638#issuecomment-1877082874\nexport { formatters, longFormatters };\n\n// This RegExp consists of three parts separated by `|`:\n// - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n// (one of the certain letters followed by `o`)\n// - (\\w)\\1* matches any sequences of the same letter\n// - '' matches two quote characters in a row\n// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n// except a single quote symbol, which ends the sequence.\n// Two quote characters do not end the sequence.\n// If there is no matching single quote\n// then the sequence will continue until the end of the string.\n// - . matches any single character unmatched by previous parts of the RegExps\nconst formattingTokensRegExp =\n /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g;\n\n// This RegExp catches symbols escaped by quotes, and also\n// sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\nconst longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\n\nconst escapedStringRegExp = /^'([^]*?)'?$/;\nconst doubleQuoteRegExp = /''/g;\nconst unescapedLatinCharacterRegExp = /[a-zA-Z]/;\n\nexport { format as formatDate };\n\n/**\n * The {@link format} function options.\n */\n\n/**\n * @name format\n * @alias formatDate\n * @category Common Helpers\n * @summary Format the date.\n *\n * @description\n * Return the formatted date string in the given format. The result may vary by locale.\n *\n * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.\n * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * The characters wrapped between two single quotes characters (') are escaped.\n * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n * (see the last example)\n *\n * Format of the string is based on Unicode Technical Standard #35:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * with a few additions (see note 7 below the table).\n *\n * Accepted patterns:\n * | Unit | Pattern | Result examples | Notes |\n * |---------------------------------|---------|-----------------------------------|-------|\n * | Era | G..GGG | AD, BC | |\n * | | GGGG | Anno Domini, Before Christ | 2 |\n * | | GGGGG | A, B | |\n * | Calendar year | y | 44, 1, 1900, 2017 | 5 |\n * | | yo | 44th, 1st, 0th, 17th | 5,7 |\n * | | yy | 44, 01, 00, 17 | 5 |\n * | | yyy | 044, 001, 1900, 2017 | 5 |\n * | | yyyy | 0044, 0001, 1900, 2017 | 5 |\n * | | yyyyy | ... | 3,5 |\n * | Local week-numbering year | Y | 44, 1, 1900, 2017 | 5 |\n * | | Yo | 44th, 1st, 1900th, 2017th | 5,7 |\n * | | YY | 44, 01, 00, 17 | 5,8 |\n * | | YYY | 044, 001, 1900, 2017 | 5 |\n * | | YYYY | 0044, 0001, 1900, 2017 | 5,8 |\n * | | YYYYY | ... | 3,5 |\n * | ISO week-numbering year | R | -43, 0, 1, 1900, 2017 | 5,7 |\n * | | RR | -43, 00, 01, 1900, 2017 | 5,7 |\n * | | RRR | -043, 000, 001, 1900, 2017 | 5,7 |\n * | | RRRR | -0043, 0000, 0001, 1900, 2017 | 5,7 |\n * | | RRRRR | ... | 3,5,7 |\n * | Extended year | u | -43, 0, 1, 1900, 2017 | 5 |\n * | | uu | -43, 01, 1900, 2017 | 5 |\n * | | uuu | -043, 001, 1900, 2017 | 5 |\n * | | uuuu | -0043, 0001, 1900, 2017 | 5 |\n * | | uuuuu | ... | 3,5 |\n * | Quarter (formatting) | Q | 1, 2, 3, 4 | |\n * | | Qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | QQ | 01, 02, 03, 04 | |\n * | | QQQ | Q1, Q2, Q3, Q4 | |\n * | | QQQQ | 1st quarter, 2nd quarter, ... | 2 |\n * | | QQQQQ | 1, 2, 3, 4 | 4 |\n * | Quarter (stand-alone) | q | 1, 2, 3, 4 | |\n * | | qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | qq | 01, 02, 03, 04 | |\n * | | qqq | Q1, Q2, Q3, Q4 | |\n * | | qqqq | 1st quarter, 2nd quarter, ... | 2 |\n * | | qqqqq | 1, 2, 3, 4 | 4 |\n * | Month (formatting) | M | 1, 2, ..., 12 | |\n * | | Mo | 1st, 2nd, ..., 12th | 7 |\n * | | MM | 01, 02, ..., 12 | |\n * | | MMM | Jan, Feb, ..., Dec | |\n * | | MMMM | January, February, ..., December | 2 |\n * | | MMMMM | J, F, ..., D | |\n * | Month (stand-alone) | L | 1, 2, ..., 12 | |\n * | | Lo | 1st, 2nd, ..., 12th | 7 |\n * | | LL | 01, 02, ..., 12 | |\n * | | LLL | Jan, Feb, ..., Dec | |\n * | | LLLL | January, February, ..., December | 2 |\n * | | LLLLL | J, F, ..., D | |\n * | Local week of year | w | 1, 2, ..., 53 | |\n * | | wo | 1st, 2nd, ..., 53th | 7 |\n * | | ww | 01, 02, ..., 53 | |\n * | ISO week of year | I | 1, 2, ..., 53 | 7 |\n * | | Io | 1st, 2nd, ..., 53th | 7 |\n * | | II | 01, 02, ..., 53 | 7 |\n * | Day of month | d | 1, 2, ..., 31 | |\n * | | do | 1st, 2nd, ..., 31st | 7 |\n * | | dd | 01, 02, ..., 31 | |\n * | Day of year | D | 1, 2, ..., 365, 366 | 9 |\n * | | Do | 1st, 2nd, ..., 365th, 366th | 7 |\n * | | DD | 01, 02, ..., 365, 366 | 9 |\n * | | DDD | 001, 002, ..., 365, 366 | |\n * | | DDDD | ... | 3 |\n * | Day of week (formatting) | E..EEE | Mon, Tue, Wed, ..., Sun | |\n * | | EEEE | Monday, Tuesday, ..., Sunday | 2 |\n * | | EEEEE | M, T, W, T, F, S, S | |\n * | | EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | ISO day of week (formatting) | i | 1, 2, 3, ..., 7 | 7 |\n * | | io | 1st, 2nd, ..., 7th | 7 |\n * | | ii | 01, 02, ..., 07 | 7 |\n * | | iii | Mon, Tue, Wed, ..., Sun | 7 |\n * | | iiii | Monday, Tuesday, ..., Sunday | 2,7 |\n * | | iiiii | M, T, W, T, F, S, S | 7 |\n * | | iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | 7 |\n * | Local day of week (formatting) | e | 2, 3, 4, ..., 1 | |\n * | | eo | 2nd, 3rd, ..., 1st | 7 |\n * | | ee | 02, 03, ..., 01 | |\n * | | eee | Mon, Tue, Wed, ..., Sun | |\n * | | eeee | Monday, Tuesday, ..., Sunday | 2 |\n * | | eeeee | M, T, W, T, F, S, S | |\n * | | eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | Local day of week (stand-alone) | c | 2, 3, 4, ..., 1 | |\n * | | co | 2nd, 3rd, ..., 1st | 7 |\n * | | cc | 02, 03, ..., 01 | |\n * | | ccc | Mon, Tue, Wed, ..., Sun | |\n * | | cccc | Monday, Tuesday, ..., Sunday | 2 |\n * | | ccccc | M, T, W, T, F, S, S | |\n * | | cccccc | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | AM, PM | a..aa | AM, PM | |\n * | | aaa | am, pm | |\n * | | aaaa | a.m., p.m. | 2 |\n * | | aaaaa | a, p | |\n * | AM, PM, noon, midnight | b..bb | AM, PM, noon, midnight | |\n * | | bbb | am, pm, noon, midnight | |\n * | | bbbb | a.m., p.m., noon, midnight | 2 |\n * | | bbbbb | a, p, n, mi | |\n * | Flexible day period | B..BBB | at night, in the morning, ... | |\n * | | BBBB | at night, in the morning, ... | 2 |\n * | | BBBBB | at night, in the morning, ... | |\n * | Hour [1-12] | h | 1, 2, ..., 11, 12 | |\n * | | ho | 1st, 2nd, ..., 11th, 12th | 7 |\n * | | hh | 01, 02, ..., 11, 12 | |\n * | Hour [0-23] | H | 0, 1, 2, ..., 23 | |\n * | | Ho | 0th, 1st, 2nd, ..., 23rd | 7 |\n * | | HH | 00, 01, 02, ..., 23 | |\n * | Hour [0-11] | K | 1, 2, ..., 11, 0 | |\n * | | Ko | 1st, 2nd, ..., 11th, 0th | 7 |\n * | | KK | 01, 02, ..., 11, 00 | |\n * | Hour [1-24] | k | 24, 1, 2, ..., 23 | |\n * | | ko | 24th, 1st, 2nd, ..., 23rd | 7 |\n * | | kk | 24, 01, 02, ..., 23 | |\n * | Minute | m | 0, 1, ..., 59 | |\n * | | mo | 0th, 1st, ..., 59th | 7 |\n * | | mm | 00, 01, ..., 59 | |\n * | Second | s | 0, 1, ..., 59 | |\n * | | so | 0th, 1st, ..., 59th | 7 |\n * | | ss | 00, 01, ..., 59 | |\n * | Fraction of second | S | 0, 1, ..., 9 | |\n * | | SS | 00, 01, ..., 99 | |\n * | | SSS | 000, 001, ..., 999 | |\n * | | SSSS | ... | 3 |\n * | Timezone (ISO-8601 w/ Z) | X | -08, +0530, Z | |\n * | | XX | -0800, +0530, Z | |\n * | | XXX | -08:00, +05:30, Z | |\n * | | XXXX | -0800, +0530, Z, +123456 | 2 |\n * | | XXXXX | -08:00, +05:30, Z, +12:34:56 | |\n * | Timezone (ISO-8601 w/o Z) | x | -08, +0530, +00 | |\n * | | xx | -0800, +0530, +0000 | |\n * | | xxx | -08:00, +05:30, +00:00 | 2 |\n * | | xxxx | -0800, +0530, +0000, +123456 | |\n * | | xxxxx | -08:00, +05:30, +00:00, +12:34:56 | |\n * | Timezone (GMT) | O...OOO | GMT-8, GMT+5:30, GMT+0 | |\n * | | OOOO | GMT-08:00, GMT+05:30, GMT+00:00 | 2 |\n * | Timezone (specific non-locat.) | z...zzz | GMT-8, GMT+5:30, GMT+0 | 6 |\n * | | zzzz | GMT-08:00, GMT+05:30, GMT+00:00 | 2,6 |\n * | Seconds timestamp | t | 512969520 | 7 |\n * | | tt | ... | 3,7 |\n * | Milliseconds timestamp | T | 512969520900 | 7 |\n * | | TT | ... | 3,7 |\n * | Long localized date | P | 04/29/1453 | 7 |\n * | | PP | Apr 29, 1453 | 7 |\n * | | PPP | April 29th, 1453 | 7 |\n * | | PPPP | Friday, April 29th, 1453 | 2,7 |\n * | Long localized time | p | 12:00 AM | 7 |\n * | | pp | 12:00:00 AM | 7 |\n * | | ppp | 12:00:00 AM GMT+2 | 7 |\n * | | pppp | 12:00:00 AM GMT+02:00 | 2,7 |\n * | Combination of date and time | Pp | 04/29/1453, 12:00 AM | 7 |\n * | | PPpp | Apr 29, 1453, 12:00:00 AM | 7 |\n * | | PPPppp | April 29th, 1453 at ... | 7 |\n * | | PPPPpppp| Friday, April 29th, 1453 at ... | 2,7 |\n * Notes:\n * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n * are the same as \"stand-alone\" units, but are different in some languages.\n * \"Formatting\" units are declined according to the rules of the language\n * in the context of a date. \"Stand-alone\" units are always nominative singular:\n *\n * `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n *\n * `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n *\n * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n * the single quote characters (see below).\n * If the sequence is longer than listed in table (e.g. `EEEEEEEEEEE`)\n * the output will be the same as default pattern for this unit, usually\n * the longest one (in case of ISO weekdays, `EEEE`). Default patterns for units\n * are marked with \"2\" in the last column of the table.\n *\n * `format(new Date(2017, 10, 6), 'MMM') //=> 'Nov'`\n *\n * `format(new Date(2017, 10, 6), 'MMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMM') //=> 'N'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMMM') //=> 'November'`\n *\n * 3. Some patterns could be unlimited length (such as `yyyyyyyy`).\n * The output will be padded with zeros to match the length of the pattern.\n *\n * `format(new Date(2017, 10, 6), 'yyyyyyyy') //=> '00002017'`\n *\n * 4. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n * These tokens represent the shortest form of the quarter.\n *\n * 5. The main difference between `y` and `u` patterns are B.C. years:\n *\n * | Year | `y` | `u` |\n * |------|-----|-----|\n * | AC 1 | 1 | 1 |\n * | BC 1 | 1 | 0 |\n * | BC 2 | 2 | -1 |\n *\n * Also `yy` always returns the last two digits of a year,\n * while `uu` pads single digit years to 2 characters and returns other years unchanged:\n *\n * | Year | `yy` | `uu` |\n * |------|------|------|\n * | 1 | 01 | 01 |\n * | 14 | 14 | 14 |\n * | 376 | 76 | 376 |\n * | 1453 | 53 | 1453 |\n *\n * The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n * except local week-numbering years are dependent on `options.weekStartsOn`\n * and `options.firstWeekContainsDate` (compare [getISOWeekYear](https://date-fns.org/docs/getISOWeekYear)\n * and [getWeekYear](https://date-fns.org/docs/getWeekYear)).\n *\n * 6. Specific non-location timezones are currently unavailable in `date-fns`,\n * so right now these tokens fall back to GMT timezones.\n *\n * 7. These patterns are not in the Unicode Technical Standard #35:\n * - `i`: ISO day of week\n * - `I`: ISO week of year\n * - `R`: ISO week-numbering year\n * - `t`: seconds timestamp\n * - `T`: milliseconds timestamp\n * - `o`: ordinal number modifier\n * - `P`: long localized date\n * - `p`: long localized time\n *\n * 8. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.\n * You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 9. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.\n * You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n * @param format - The string of tokens\n * @param options - An object with options\n *\n * @returns The formatted date string\n *\n * @throws `date` must not be Invalid Date\n * @throws `options.locale` must contain `localize` property\n * @throws `options.locale` must contain `formatLong` property\n * @throws 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\n * @throws 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\n * @throws 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\n * @throws 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\n * @throws format string contains an unescaped latin alphabet character\n *\n * @example\n * // Represent 11 February 2014 in middle-endian format:\n * const result = format(new Date(2014, 1, 11), 'MM/dd/yyyy')\n * //=> '02/11/2014'\n *\n * @example\n * // Represent 2 July 2014 in Esperanto:\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = format(new Date(2014, 6, 2), \"do 'de' MMMM yyyy\", {\n * locale: eoLocale\n * })\n * //=> '2-a de julio 2014'\n *\n * @example\n * // Escape string by single quote characters:\n * const result = format(new Date(2014, 6, 2, 15), \"h 'o''clock'\")\n * //=> \"3 o'clock\"\n */\nexport function format(date, formatStr, options) {\n const defaultOptions = getDefaultOptions();\n const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;\n\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const originalDate = toDate(date);\n\n if (!isValid(originalDate)) {\n throw new RangeError(\"Invalid time value\");\n }\n\n let parts = formatStr\n .match(longFormattingTokensRegExp)\n .map((substring) => {\n const firstCharacter = substring[0];\n if (firstCharacter === \"p\" || firstCharacter === \"P\") {\n const longFormatter = longFormatters[firstCharacter];\n return longFormatter(substring, locale.formatLong);\n }\n return substring;\n })\n .join(\"\")\n .match(formattingTokensRegExp)\n .map((substring) => {\n // Replace two single quote characters with one single quote character\n if (substring === \"''\") {\n return { isToken: false, value: \"'\" };\n }\n\n const firstCharacter = substring[0];\n if (firstCharacter === \"'\") {\n return { isToken: false, value: cleanEscapedString(substring) };\n }\n\n if (formatters[firstCharacter]) {\n return { isToken: true, value: substring };\n }\n\n if (firstCharacter.match(unescapedLatinCharacterRegExp)) {\n throw new RangeError(\n \"Format string contains an unescaped latin alphabet character `\" +\n firstCharacter +\n \"`\",\n );\n }\n\n return { isToken: false, value: substring };\n });\n\n // invoke localize preprocessor (only for french locales at the moment)\n if (locale.localize.preprocessor) {\n parts = locale.localize.preprocessor(originalDate, parts);\n }\n\n const formatterOptions = {\n firstWeekContainsDate,\n weekStartsOn,\n locale,\n };\n\n return parts\n .map((part) => {\n if (!part.isToken) return part.value;\n\n const token = part.value;\n\n if (\n (!options?.useAdditionalWeekYearTokens &&\n isProtectedWeekYearToken(token)) ||\n (!options?.useAdditionalDayOfYearTokens &&\n isProtectedDayOfYearToken(token))\n ) {\n warnOrThrowProtectedError(token, formatStr, String(date));\n }\n\n const formatter = formatters[token[0]];\n return formatter(originalDate, token, locale.localize, formatterOptions);\n })\n .join(\"\");\n}\n\nfunction cleanEscapedString(input) {\n const matched = input.match(escapedStringRegExp);\n\n if (!matched) {\n return input;\n }\n\n return matched[1].replace(doubleQuoteRegExp, \"'\");\n}\n\n// Fallback for modularized imports:\nexport default format;\n","import { toDate } from \"./toDate.mjs\";\nimport { constructFrom } from \"./constructFrom.mjs\";\n\n/**\n * @name getDaysInMonth\n * @category Month Helpers\n * @summary Get the number of days in a month of the given date.\n *\n * @description\n * Get the number of days in a month of the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n *\n * @returns The number of days in a month\n *\n * @example\n * // How many days are in February 2000?\n * const result = getDaysInMonth(new Date(2000, 1))\n * //=> 29\n */\nexport function getDaysInMonth(date) {\n const _date = toDate(date);\n const year = _date.getFullYear();\n const monthIndex = _date.getMonth();\n const lastDayOfMonth = constructFrom(date, 0);\n lastDayOfMonth.setFullYear(year, monthIndex + 1, 0);\n lastDayOfMonth.setHours(0, 0, 0, 0);\n return lastDayOfMonth.getDate();\n}\n\n// Fallback for modularized imports:\nexport default getDaysInMonth;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name isLeapYear\n * @category Year Helpers\n * @summary Is the given date in the leap year?\n *\n * @description\n * Is the given date in the leap year?\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to check\n *\n * @returns The date is in the leap year\n *\n * @example\n * // Is 1 September 2012 in the leap year?\n * const result = isLeapYear(new Date(2012, 8, 1))\n * //=> true\n */\nexport function isLeapYear(date) {\n const _date = toDate(date);\n const year = _date.getFullYear();\n return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0);\n}\n\n// Fallback for modularized imports:\nexport default isLeapYear;\n","import { isLeapYear } from \"./isLeapYear.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name getDaysInYear\n * @category Year Helpers\n * @summary Get the number of days in a year of the given date.\n *\n * @description\n * Get the number of days in a year of the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n *\n * @returns The number of days in a year\n *\n * @example\n * // How many days are in 2012?\n * const result = getDaysInYear(new Date(2012, 0, 1))\n * //=> 366\n */\nexport function getDaysInYear(date) {\n const _date = toDate(date);\n\n if (String(new Date(_date)) === \"Invalid Date\") {\n return NaN;\n }\n\n return isLeapYear(_date) ? 366 : 365;\n}\n\n// Fallback for modularized imports:\nexport default getDaysInYear;\n","import { addWeeks } from \"./addWeeks.mjs\";\nimport { millisecondsInWeek } from \"./constants.mjs\";\nimport { startOfISOWeekYear } from \"./startOfISOWeekYear.mjs\";\n\n/**\n * @name getISOWeeksInYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Get the number of weeks in an ISO week-numbering year of the given date.\n *\n * @description\n * Get the number of weeks in an ISO week-numbering year of the given date.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n *\n * @returns The number of ISO weeks in a year\n *\n * @example\n * // How many weeks are in ISO week-numbering year 2015?\n * const result = getISOWeeksInYear(new Date(2015, 1, 11))\n * //=> 53\n */\nexport function getISOWeeksInYear(date) {\n const thisYear = startOfISOWeekYear(date);\n const nextYear = startOfISOWeekYear(addWeeks(thisYear, 60));\n const diff = +nextYear - +thisYear;\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek);\n}\n\n// Fallback for modularized imports:\nexport default getISOWeeksInYear;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name isEqual\n * @category Common Helpers\n * @summary Are the given dates equal?\n *\n * @description\n * Are the given dates equal?\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The first date to compare\n * @param dateRight - The second date to compare\n *\n * @returns The dates are equal\n *\n * @example\n * // Are 2 July 2014 06:30:45.000 and 2 July 2014 06:30:45.500 equal?\n * const result = isEqual(\n * new Date(2014, 6, 2, 6, 30, 45, 0),\n * new Date(2014, 6, 2, 6, 30, 45, 500)\n * )\n * //=> false\n */\nexport function isEqual(leftDate, rightDate) {\n const _dateLeft = toDate(leftDate);\n const _dateRight = toDate(rightDate);\n return +_dateLeft === +_dateRight;\n}\n\n// Fallback for modularized imports:\nexport default isEqual;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name startOfHour\n * @category Hour Helpers\n * @summary Return the start of an hour for the given date.\n *\n * @description\n * Return the start of an hour for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The start of an hour\n *\n * @example\n * // The start of an hour for 2 September 2014 11:55:00:\n * const result = startOfHour(new Date(2014, 8, 2, 11, 55))\n * //=> Tue Sep 02 2014 11:00:00\n */\nexport function startOfHour(date) {\n const _date = toDate(date);\n _date.setMinutes(0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfHour;\n","import { startOfWeek } from \"./startOfWeek.mjs\";\n\n/**\n * The {@link isSameWeek} function options.\n */\n\n/**\n * @name isSameWeek\n * @category Week Helpers\n * @summary Are the given dates in the same week (and month and year)?\n *\n * @description\n * Are the given dates in the same week (and month and year)?\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The first date to check\n * @param dateRight - The second date to check\n * @param options - An object with options\n *\n * @returns The dates are in the same week (and month and year)\n *\n * @example\n * // Are 31 August 2014 and 4 September 2014 in the same week?\n * const result = isSameWeek(new Date(2014, 7, 31), new Date(2014, 8, 4))\n * //=> true\n *\n * @example\n * // If week starts with Monday,\n * // are 31 August 2014 and 4 September 2014 in the same week?\n * const result = isSameWeek(new Date(2014, 7, 31), new Date(2014, 8, 4), {\n * weekStartsOn: 1\n * })\n * //=> false\n *\n * @example\n * // Are 1 January 2014 and 1 January 2015 in the same week?\n * const result = isSameWeek(new Date(2014, 0, 1), new Date(2015, 0, 1))\n * //=> false\n */\nexport function isSameWeek(dateLeft, dateRight, options) {\n const dateLeftStartOfWeek = startOfWeek(dateLeft, options);\n const dateRightStartOfWeek = startOfWeek(dateRight, options);\n\n return +dateLeftStartOfWeek === +dateRightStartOfWeek;\n}\n\n// Fallback for modularized imports:\nexport default isSameWeek;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name isSameMonth\n * @category Month Helpers\n * @summary Are the given dates in the same month (and year)?\n *\n * @description\n * Are the given dates in the same month (and year)?\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The first date to check\n * @param dateRight - The second date to check\n *\n * @returns The dates are in the same month (and year)\n *\n * @example\n * // Are 2 September 2014 and 25 September 2014 in the same month?\n * const result = isSameMonth(new Date(2014, 8, 2), new Date(2014, 8, 25))\n * //=> true\n *\n * @example\n * // Are 2 September 2014 and 25 September 2015 in the same month?\n * const result = isSameMonth(new Date(2014, 8, 2), new Date(2015, 8, 25))\n * //=> false\n */\nexport function isSameMonth(dateLeft, dateRight) {\n const _dateLeft = toDate(dateLeft);\n const _dateRight = toDate(dateRight);\n return (\n _dateLeft.getFullYear() === _dateRight.getFullYear() &&\n _dateLeft.getMonth() === _dateRight.getMonth()\n );\n}\n\n// Fallback for modularized imports:\nexport default isSameMonth;\n","import { startOfQuarter } from \"./startOfQuarter.mjs\";\n\n/**\n * @name isSameQuarter\n * @category Quarter Helpers\n * @summary Are the given dates in the same quarter (and year)?\n *\n * @description\n * Are the given dates in the same quarter (and year)?\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The first date to check\n * @param dateRight - The second date to check\n\n * @returns The dates are in the same quarter (and year)\n *\n * @example\n * // Are 1 January 2014 and 8 March 2014 in the same quarter?\n * const result = isSameQuarter(new Date(2014, 0, 1), new Date(2014, 2, 8))\n * //=> true\n *\n * @example\n * // Are 1 January 2014 and 1 January 2015 in the same quarter?\n * const result = isSameQuarter(new Date(2014, 0, 1), new Date(2015, 0, 1))\n * //=> false\n */\nexport function isSameQuarter(dateLeft, dateRight) {\n const dateLeftStartOfQuarter = startOfQuarter(dateLeft);\n const dateRightStartOfQuarter = startOfQuarter(dateRight);\n\n return +dateLeftStartOfQuarter === +dateRightStartOfQuarter;\n}\n\n// Fallback for modularized imports:\nexport default isSameQuarter;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name isSameYear\n * @category Year Helpers\n * @summary Are the given dates in the same year?\n *\n * @description\n * Are the given dates in the same year?\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The first date to check\n * @param dateRight - The second date to check\n *\n * @returns The dates are in the same year\n *\n * @example\n * // Are 2 September 2014 and 25 September 2014 in the same year?\n * const result = isSameYear(new Date(2014, 8, 2), new Date(2014, 8, 25))\n * //=> true\n */\nexport function isSameYear(dateLeft, dateRight) {\n const _dateLeft = toDate(dateLeft);\n const _dateRight = toDate(dateRight);\n return _dateLeft.getFullYear() === _dateRight.getFullYear();\n}\n\n// Fallback for modularized imports:\nexport default isSameYear;\n","import {\n\taddMinutes,\n\taddHours,\n\taddDays,\n\taddWeeks,\n\taddMonths,\n\taddQuarters,\n\taddYears,\n\tdifferenceInYears,\n\tdifferenceInMonths,\n\tdifferenceInQuarters,\n\tdifferenceInCalendarISOWeeks,\n\tdifferenceInCalendarDays,\n\tdifferenceInHours,\n\tdifferenceInMinutes,\n\tstartOfHour,\n\tstartOfDay,\n\tstartOfWeek,\n\tstartOfMonth,\n\tstartOfQuarter,\n\tendOfQuarter,\n\tstartOfYear,\n\tformat,\n\tgetDaysInMonth,\n\tgetDaysInYear,\n\tgetISOWeeksInYear,\n\tisSameDay,\n\tisSameWeek,\n\tisSameMonth,\n\tisSameQuarter,\n\tisSameYear,\n\tendOfYear,\n\tendOfMonth,\n\tendOfWeek,\n\tendOfDay,\n\tendOfHour,\n\tDay,\n} from \"date-fns\";\n\nimport { units } from \"./scales\";\nimport type { GanttScaleUnit, Calendar } from \"./types\";\n\nconst diff: { [name: string]: { (start: Date, end: Date): number } } = {\n\tyear: differenceInYears,\n\tquarter: differenceInQuarters,\n\tmonth: differenceInMonths,\n\tweek: differenceInCalendarISOWeeks,\n\tday: differenceInCalendarDays,\n\thour: differenceInHours,\n\tminute: differenceInMinutes,\n};\n\nconst smallerCount: {\n\t[name: string]: {\n\t\t[name: string]: number | ((date?: Date) => number);\n\t};\n} = {\n\tyear: {\n\t\tquarter: 4,\n\t\tmonth: 12,\n\t\tweek: getISOWeeksInYear,\n\t\tday: daysInYear,\n\t\thour: hoursInYear,\n\t},\n\tquarter: {\n\t\tmonth: 3,\n\t\tweek: weeksInQuarter,\n\t\tday: daysInQuarter,\n\t\thour: hoursInQuarter,\n\t},\n\tmonth: {\n\t\tweek: weeksInMonth,\n\t\tday: daysInMonth,\n\t\thour: hoursInMonth,\n\t},\n\tweek: {\n\t\tday: 7,\n\t\thour: 24 * 7,\n\t},\n\tday: {\n\t\thour: 24,\n\t},\n\thour: {\n\t\tminute: 60,\n\t},\n};\n\nfunction daysInYear(date?: Date): number {\n\tif (date) return getDaysInYear(date);\n\treturn 365;\n}\nfunction hoursInYear(date: Date): number {\n\treturn getDaysInYear(date) * 24;\n}\n\nfunction weeksInQuarter(date: Date): number {\n\tconst start = startOfQuarter(date);\n\tconst end = addDays(startOfDay(endOfQuarter(date)), 1);\n\treturn differenceInCalendarISOWeeks(end, start);\n}\nfunction daysInQuarter(date?: Date): number {\n\tif (date) {\n\t\tconst start = startOfQuarter(date);\n\t\tconst end = endOfQuarter(date);\n\t\treturn differenceInCalendarDays(end, start) + 1;\n\t}\n\treturn 91;\n}\nfunction hoursInQuarter(date: Date): number {\n\treturn daysInQuarter(date) * 24;\n}\n\nfunction weeksInMonth(date?: Date): number {\n\tif (date) {\n\t\tconst start = startOfMonth(date);\n\t\tconst end = addDays(startOfDay(endOfMonth(date)), 1);\n\t\treturn differenceInCalendarISOWeeks(end, start);\n\t}\n\treturn 5;\n}\nfunction daysInMonth(date?: Date): number {\n\tif (date) return getDaysInMonth(date);\n\treturn 30;\n}\nfunction hoursInMonth(date: Date): number {\n\treturn getDaysInMonth(date) * 24;\n}\n\nexport function getSmallerUnitCount(\n\tunit: string,\n\tlengthUnit: string,\n\tdate?: Date\n): number {\n\tconst count = smallerCount[unit][lengthUnit];\n\tif (!count) return 1;\n\tif (typeof count === \"number\") return count;\n\treturn count(date);\n}\n\nexport function isCorrectLengthUnit(\n\tminUnit: string,\n\tlengthUnit: string\n): boolean {\n\treturn (\n\t\tminUnit === lengthUnit ||\n\t\t!!(smallerCount[minUnit] && smallerCount[minUnit][lengthUnit])\n\t);\n}\n\nconst add: { [name: string]: { (start: number | Date, step: number): Date } } =\n\t{\n\t\tyear: addYears,\n\t\tquarter: addQuarters,\n\t\tmonth: addMonths,\n\t\tweek: addWeeks,\n\t\tday: addDays,\n\t\thour: addHours,\n\t\tminute: addMinutes,\n\t};\n\nexport function getDiffer(\n\tunit: string,\n\tcalendar?: Calendar,\n\t_weekStart?: Day\n): {\n\t(start: Date, end: Date, lengthUnit?: string, unitSize?: boolean): number;\n} {\n\tif (calendar) {\n\t\tif (unit === \"day\") {\n\t\t\treturn (start: Date, end: Date) => {\n\t\t\t\treturn calendar.getWorkingDays(end, start, true);\n\t\t\t};\n\t\t}\n\t\tif (unit === \"hour\") {\n\t\t\treturn (start: Date, end: Date) => {\n\t\t\t\treturn calendar.getWorkingHours(end, start, true);\n\t\t\t};\n\t\t}\n\t}\n\treturn (next, prev, lengthUnit, unitSize) => {\n\t\tif (\n\t\t\t!smallerCount[unit][lengthUnit] ||\n\t\t\ttypeof smallerCount[unit][lengthUnit] === \"number\" ||\n\t\t\tisSameUnit(unit, next, prev, _weekStart)\n\t\t) {\n\t\t\treturn innerDiff(\n\t\t\t\tunit,\n\t\t\t\tnext,\n\t\t\t\tprev,\n\t\t\t\tlengthUnit,\n\t\t\t\tunitSize,\n\t\t\t\t_weekStart\n\t\t\t);\n\t\t} else {\n\t\t\treturn getLengthUnitDiff(\n\t\t\t\tnext,\n\t\t\t\tprev,\n\t\t\t\tunit,\n\t\t\t\tlengthUnit,\n\t\t\t\tunitSize,\n\t\t\t\t_weekStart\n\t\t\t);\n\t\t}\n\t};\n}\n\nfunction innerDiff(\n\tunit: string,\n\tnext: Date,\n\tprev: Date,\n\tlengthUnit?: string,\n\tunitSize?: boolean,\n\t_weekStart?: Day\n): number {\n\tconst minUnit = lengthUnit || unit;\n\n\tlet start = prev;\n\tlet end = next;\n\tif (unitSize) {\n\t\tstart = getUnitStart(minUnit, prev, _weekStart);\n\t\tend = getUnitStart(minUnit, next, _weekStart);\n\t\tif (end < next) end = getAdder(minUnit)(end, 1);\n\t}\n\n\tif (unit !== minUnit) {\n\t\tconst filled = diff[minUnit](end, start);\n\t\tconst all = getSmallerUnitCount(unit, minUnit, prev);\n\t\treturn filled / all;\n\t} else {\n\t\treturn diff[minUnit](end, start);\n\t}\n}\n\nfunction getLengthUnitDiff(\n\tend: Date,\n\tstart: Date,\n\tunit: string,\n\tlengthUnit: string,\n\tunitSize?: boolean,\n\t_weekStart?: Day\n): number {\n\t// if not start of unit\n\tlet lengthUnitsOfFirstUnit = 0;\n\tconst unitStart = getUnitStart(unit, start, _weekStart);\n\tif (start > unitStart) {\n\t\tconst nextUnitStart = add[unit](unitStart, 1);\n\t\tlengthUnitsOfFirstUnit = innerDiff(\n\t\t\tunit,\n\t\t\tnextUnitStart,\n\t\t\tstart,\n\t\t\tlengthUnit,\n\t\t\tundefined,\n\t\t\t_weekStart\n\t\t);\n\t\tstart = nextUnitStart;\n\t}\n\n\t// if lasts 1+ whole units\n\tlet units = 0;\n\tif (!isSameUnit(unit, start, end, _weekStart)) {\n\t\tunits = innerDiff(\n\t\t\tunit,\n\t\t\tgetUnitStart(unit, end, _weekStart),\n\t\t\tstart,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\t_weekStart\n\t\t); // int part\n\t\tstart = add[unit](start, units);\n\t}\n\n\t// all above plus lenUns of last unit if any\n\tunits +=\n\t\tlengthUnitsOfFirstUnit +\n\t\tinnerDiff(unit, end, start, lengthUnit, undefined, _weekStart);\n\n\tif (!units && unitSize) {\n\t\t// ugly hack for weeks and tasks that are between larger units\n\t\tunits = innerDiff(unit, end, start, lengthUnit, unitSize, _weekStart);\n\t}\n\n\treturn units;\n}\n\nexport function getAdder(\n\tunit: string,\n\tcalendar?: Calendar\n): {\n\t(start: number | Date, step: number): Date;\n} {\n\tif (calendar) {\n\t\tif (unit === \"day\") {\n\t\t\treturn (date, amount) =>\n\t\t\t\tcalendar.addWorkingDays(date as Date, amount, true);\n\t\t} else if (unit === \"hour\") {\n\t\t\treturn (date, amount) =>\n\t\t\t\tcalendar.addWorkingHours(date as Date, amount);\n\t\t}\n\t}\n\treturn add[unit];\n}\n\nconst startHandlers: {\n\t[name: string]: (start: number | Date, _weekStart?: Day) => Date;\n} = {\n\tyear: startOfYear,\n\tquarter: startOfQuarter,\n\tmonth: startOfMonth,\n\tweek: (start, _weekStart) =>\n\t\tstartOfWeek(start, { weekStartsOn: _weekStart }),\n\tday: startOfDay,\n\thour: startOfHour,\n};\n\nexport function getUnitStart(unit: string, date: Date, _weekStart?: Day): Date {\n\tconst handler = startHandlers[unit];\n\treturn handler ? handler(date, _weekStart) : new Date(date);\n}\nconst endHandlers: {\n\t[name: string]: { (end: number | Date, _weekStart?: Day): Date };\n} = {\n\tyear: endOfYear,\n\tquarter: endOfQuarter,\n\tmonth: endOfMonth,\n\tweek: (end: Date, _weekStart?: Day) =>\n\t\tendOfWeek(end, { weekStartsOn: _weekStart }),\n\tday: endOfDay,\n\thour: endOfHour,\n};\nexport function getUnitEnd(unit: string, date: Date, _weekStart?: Day): Date {\n\tconst handler = endHandlers[unit];\n\treturn handler ? handler(date, _weekStart) : new Date(date);\n}\n\nconst sameHandlers: {\n\t[unit: string]: { (a: Date, b: Date, _weekStart?: Day): boolean };\n} = {\n\tyear: isSameYear,\n\tquarter: isSameQuarter,\n\tmonth: isSameMonth,\n\tweek: (a, b, _weekStart) => isSameWeek(a, b, { weekStartsOn: _weekStart }),\n\tday: isSameDay,\n};\n\nexport function isSameUnit(\n\tunit: string,\n\ta: Date,\n\tb: Date,\n\t_weekStart?: Day\n): boolean {\n\tconst handler = sameHandlers[unit];\n\treturn handler ? handler(a, b, _weekStart) : false;\n}\n\nconst handlers: { [name: string]: any } = {\n\tstart: startHandlers,\n\tend: endHandlers,\n\tadd,\n\tisSame: sameHandlers,\n\tdiff,\n\tsmallerCount,\n};\n\nconst getCount = (count: any) => {\n\tif (typeof count === \"function\") return count(new Date());\n\treturn count;\n};\n\nexport function registerScaleUnit(unit: string, config: GanttScaleUnit) {\n\tfor (const key in config) {\n\t\tif (key === \"smallerCount\") {\n\t\t\tconst childUnits = Object.keys(config[key]);\n\t\t\tconst baseUnit = childUnits\n\t\t\t\t.sort((a, b) => units.indexOf(a) - units.indexOf(b))\n\t\t\t\t.shift();\n\t\t\tlet index = units.indexOf(baseUnit);\n\t\t\tconst baseSmallerCount = config[key][baseUnit];\n\t\t\tconst count = getCount(baseSmallerCount);\n\t\t\tfor (let i = index - 1; i >= 0; i--) {\n\t\t\t\tconst unitI = units[i];\n\t\t\t\tconst countI = getCount(smallerCount[unitI][baseUnit]);\n\t\t\t\tif (count <= countI) break;\n\t\t\t\tindex = i;\n\t\t\t}\n\t\t\tunits.splice(index, 0, unit);\n\t\t}\n\t\tif (key === \"biggerCount\") {\n\t\t\tfor (const parentUnit in config[key])\n\t\t\t\tsmallerCount[parentUnit][unit] = config[key][parentUnit];\n\t\t} else handlers[key][unit] = config[key as keyof GanttScaleUnit];\n\t}\n}\n\nexport function adjustToWorkingDay(\n\tstart: Date,\n\tdiff: number = 1,\n\tcalendar: Calendar\n): Date {\n\tif (!calendar.isWorkingDay(start))\n\t\tstart =\n\t\t\tdiff > 0\n\t\t\t\t? calendar.getNextWorkingDay(start)\n\t\t\t\t: calendar.getPreviousWorkingDay(start);\n\treturn start;\n}\n\nexport function shiftByWorkingDays(calendar: Calendar) {\n\treturn (date: Date, diff: number) => {\n\t\tif (diff > 0) {\n\t\t\tfor (let i = 0; i < diff; i++) {\n\t\t\t\tdate = calendar.getNextWorkingDay(date);\n\t\t\t}\n\t\t}\n\t\tif (diff < 0) {\n\t\t\tfor (let i = 0; i > diff; i--) {\n\t\t\t\tdate = calendar.getPreviousWorkingDay(date);\n\t\t\t}\n\t\t}\n\t\treturn date;\n\t};\n}\n\nexport { format };\n","import type {\n\tIScaleConfig,\n\tGanttScaleData,\n\tIScaleLevel,\n\tIUnitFormats,\n\tIZoomConfig,\n\tTLengthUnit,\n} from \"./types\";\nimport { getUnitStart, getAdder, getDiffer, getSmallerUnitCount } from \"./time\";\nimport type GanttDataTree from \"./GanttDataTree\";\nimport { Day } from \"date-fns\";\n\nexport function getMinUnit(scales: IScaleConfig[]): IScaleConfig {\n\tconst start = new Date();\n\treturn scales\n\t\t.map(item => ({ item, len: getAdder(item.unit)(start, 1) }))\n\t\t.sort((a, b) => (a.len < b.len ? -1 : 1))[0].item;\n}\n\nexport const units = [\"year\", \"quarter\", \"month\", \"week\", \"day\", \"hour\"];\nconst defaultMinCellWidth = 50;\nconst defaultMaxCellWidth = 300;\n\nexport function calcScales(\n\tprevStart: Date,\n\tprevEnd: Date,\n\tautoScale: boolean,\n\tminUnit?: string,\n\ttasks?: GanttDataTree\n): { _start: Date; _end: Date } {\n\tlet _start = prevStart,\n\t\t_end = prevEnd;\n\tlet _sFix = false,\n\t\t_eFix = false;\n\tif (tasks) {\n\t\ttasks.forEach(t => {\n\t\t\tif ((!prevStart || autoScale) && (!_start || t.start <= _start)) {\n\t\t\t\t_start = t.start;\n\t\t\t\t_sFix = true;\n\t\t\t}\n\t\t\tconst taskEnd = t.type === \"milestone\" ? t.start : t.end;\n\t\t\tif ((!prevEnd || autoScale) && (!_end || taskEnd >= _end)) {\n\t\t\t\t_end = taskEnd;\n\t\t\t\t_eFix = true;\n\t\t\t}\n\t\t});\n\t}\n\tconst adder = getAdder(minUnit || \"day\");\n\tif (_start) {\n\t\tif (_sFix) _start = adder(_start, -1);\n\t} else if (_end) _start = adder(_end, -30);\n\telse _start = new Date();\n\n\tif (_end) {\n\t\tif (_eFix) _end = adder(_end, 1);\n\t} else _end = adder(_start, 30);\n\n\treturn { _start, _end };\n}\n\nexport function resetScales(\n\tstart: Date,\n\tend: Date,\n\tlengthUnit: TLengthUnit,\n\twidth: number,\n\theight: number,\n\t_weekStart: Day,\n\tscales: IScaleConfig[]\n): GanttScaleData | null {\n\tconst minUnit = getMinUnit(scales).unit;\n\tconst diff = getDiffer(minUnit, undefined, _weekStart);\n\tconst numOfMinUnits = diff(end, start, \"\", true);\n\n\tconst tempEnd = getUnitStart(minUnit, end, _weekStart);\n\tstart = getUnitStart(minUnit, start, _weekStart);\n\tend = tempEnd < end ? getAdder(minUnit)(tempEnd, 1) : tempEnd;\n\n\tconst fullWidth = numOfMinUnits * width;\n\tconst fullHeight = height * scales.length;\n\tconst rows = scales.map(line => {\n\t\tconst cells = [];\n\t\tconst add = getAdder(line.unit);\n\n\t\tlet date = getUnitStart(line.unit, start, _weekStart);\n\t\twhile (date < end) {\n\t\t\tconst next = add(date, line.step);\n\n\t\t\tconst cellStart = date < start ? start : date;\n\t\t\tconst cellEnd = next > end ? end : next;\n\n\t\t\tconst cellWidth = diff(cellEnd, cellStart, \"\", true) * width;\n\n\t\t\tconst value =\n\t\t\t\ttypeof line.format === \"function\"\n\t\t\t\t\t? line.format(date, next)\n\t\t\t\t\t: line.format;\n\t\t\tlet css = \"\";\n\t\t\tif (line.css)\n\t\t\t\tcss +=\n\t\t\t\t\ttypeof line.css === \"function\" ? line.css(date) : line.css;\n\n\t\t\tcells.push({\n\t\t\t\twidth: cellWidth,\n\t\t\t\tvalue,\n\t\t\t\tdate: cellStart,\n\t\t\t\tcss,\n\t\t\t\tunit: line.unit,\n\t\t\t});\n\n\t\t\tdate = next;\n\t\t}\n\n\t\treturn { cells, add, height };\n\t});\n\n\tlet lengthUnitWidth = width;\n\tif (minUnit !== lengthUnit) {\n\t\tlengthUnitWidth =\n\t\t\tMath.round(\n\t\t\t\tlengthUnitWidth / getSmallerUnitCount(minUnit, lengthUnit)\n\t\t\t) || 1;\n\t}\n\n\treturn {\n\t\trows,\n\t\twidth: fullWidth,\n\t\theight: fullHeight,\n\t\tdiff,\n\t\tstart,\n\t\tend,\n\t\tlengthUnit,\n\t\tminUnit,\n\t\tlengthUnitWidth,\n\t};\n}\n\nexport function normalizeZoom(\n\tzoom: boolean | IZoomConfig,\n\tunitFormats: IUnitFormats,\n\tscales: IScaleConfig[],\n\tcellWidth: number\n): { zoom: IZoomConfig; scales: IScaleConfig[]; cellWidth: number } {\n\tconst _zoom: any = typeof zoom === \"boolean\" ? {} : zoom;\n\tconst mainScaleLevel = units.indexOf(getMinUnit(scales).unit);\n\tif (typeof _zoom.level == \"undefined\") {\n\t\t_zoom.level = mainScaleLevel;\n\t}\n\n\tif (_zoom.levels) {\n\t\t_zoom.levels.forEach((level: IScaleLevel) => {\n\t\t\tif (!level.minCellWidth)\n\t\t\t\tlevel.minCellWidth = getCellWidth(\n\t\t\t\t\t_zoom.minCellWidth,\n\t\t\t\t\tdefaultMinCellWidth\n\t\t\t\t);\n\t\t\tif (!level.maxCellWidth)\n\t\t\t\tlevel.maxCellWidth = getCellWidth(\n\t\t\t\t\t_zoom.maxCellWidth,\n\t\t\t\t\tdefaultMaxCellWidth\n\t\t\t\t);\n\t\t});\n\t} else {\n\t\tconst levels: any[] = [];\n\t\tconst numOfScales = scales.length || 1;\n\t\tconst minCellWidth = getCellWidth(\n\t\t\t_zoom.minCellWidth,\n\t\t\tdefaultMinCellWidth\n\t\t);\n\t\tconst maxCellWidth = getCellWidth(\n\t\t\t_zoom.maxCellWidth,\n\t\t\tdefaultMaxCellWidth\n\t\t);\n\n\t\t// adds a format from a custom unit config to the format collection to be used during zoom\n\t\tscales.forEach(s => {\n\t\t\tif (s.format && !unitFormats[s.unit])\n\t\t\t\tunitFormats[s.unit] = s.format;\n\t\t});\n\n\t\tunits.forEach((unit, i) => {\n\t\t\tif (i === mainScaleLevel) {\n\t\t\t\tlevels.push({\n\t\t\t\t\tminCellWidth,\n\t\t\t\t\tmaxCellWidth,\n\t\t\t\t\tscales,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst levelScales: IScaleConfig[] = [];\n\t\t\t\tif (i) {\n\t\t\t\t\tfor (let j = numOfScales - 1; j > 0; j--) {\n\t\t\t\t\t\tconst pUnit = units[i - j];\n\t\t\t\t\t\tif (pUnit) {\n\t\t\t\t\t\t\tlevelScales.push({\n\t\t\t\t\t\t\t\tunit: pUnit,\n\t\t\t\t\t\t\t\tstep: 1,\n\t\t\t\t\t\t\t\tformat: unitFormats[pUnit],\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlevelScales.push({\n\t\t\t\t\tunit,\n\t\t\t\t\tstep: 1,\n\t\t\t\t\tformat: unitFormats[unit],\n\t\t\t\t});\n\n\t\t\t\tlevels.push({\n\t\t\t\t\tminCellWidth,\n\t\t\t\t\tmaxCellWidth,\n\t\t\t\t\tscales: levelScales,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t_zoom.levels = levels;\n\t}\n\n\tif (!_zoom.levels[_zoom.level]) {\n\t\t_zoom.level = 0;\n\t}\n\n\tconst currentLevel = _zoom.levels[_zoom.level];\n\tconst adjustedCellWidth = Math.min(\n\t\tMath.max(cellWidth, currentLevel.minCellWidth),\n\t\tcurrentLevel.maxCellWidth\n\t);\n\n\treturn {\n\t\tzoom: _zoom,\n\t\tscales: currentLevel.scales,\n\t\tcellWidth: adjustedCellWidth,\n\t};\n}\n\nexport function zoomScale(\n\tzoom: IZoomConfig,\n\tstep: number,\n\tlevel: number,\n\tnextUnit: any,\n\tlengthUnit: TLengthUnit,\n\tscales: IScaleConfig[],\n\tcellWidth: number\n): {\n\tscales: IScaleConfig[];\n\tcellWidth: number;\n\tlengthUnit: TLengthUnit;\n\tzoom: IZoomConfig;\n} {\n\tzoom.level = level;\n\tlet newCellWidth;\n\tconst nextScales = nextUnit.scales || nextUnit;\n\tconst nextMinUnit = getMinUnit(nextScales).unit;\n\tconst nextLengthUnit = setLengthUnit(\n\t\tnextMinUnit,\n\t\tlengthUnit\n\t) as TLengthUnit;\n\n\tif (step === -1) {\n\t\tconst count = getSmallerUnitCount(nextMinUnit, lengthUnit);\n\t\tnewCellWidth = cellWidth * count;\n\t} else {\n\t\tconst count = getSmallerUnitCount(getMinUnit(scales).unit, nextMinUnit);\n\t\tnewCellWidth = Math.round(cellWidth / count);\n\t}\n\n\tconst min = nextUnit.minCellWidth ?? defaultMinCellWidth;\n\tconst max = nextUnit.maxCellWidth ?? defaultMaxCellWidth;\n\n\treturn {\n\t\tscales: nextScales,\n\t\tcellWidth: Math.min(max, Math.max(min, newCellWidth)),\n\t\tlengthUnit: nextLengthUnit,\n\t\tzoom,\n\t};\n}\n\nfunction setLengthUnit(unit: string, lengthUnit: string): string {\n\tconst unitInd = units.indexOf(unit);\n\tconst lengthUnitInd = units.indexOf(lengthUnit);\n\tif (lengthUnitInd >= unitInd) {\n\t\tif (unit === \"hour\") return \"hour\";\n\t\treturn \"day\";\n\t}\n\n\treturn units[lengthUnitInd];\n}\n\nfunction getCellWidth(width: number | undefined, fallback: number) {\n\treturn width ?? fallback;\n}\n","import {\n\tIGanttTask,\n\tGanttScaleData,\n\tIParsedTask,\n\tGanttDataTree,\n\tITask,\n\tIData,\n\tIDataHash,\n} from \"./types\";\nimport { isEqual } from \"date-fns\";\nimport { isCommunity } from \"./package\";\n\nconst baselineHeight = 8;\nconst baselineTopPadding = 4;\nconst defaultPadding = 3;\nconst heightAdjustment = 7;\nconst baselineAdjustment = baselineHeight + baselineTopPadding;\n\nexport function dragSummaryKids(\n\ttask: IParsedTask,\n\tdx: number,\n\t_scales: GanttScaleData,\n\tcellWidth: number\n) {\n\tif (task.open || task.type != \"summary\") {\n\t\ttask.data?.forEach(kid => {\n\t\t\tif (typeof kid.$x === \"undefined\")\n\t\t\t\tsetTaskSizes(kid, _scales, cellWidth);\n\t\t\tkid.$x += dx;\n\t\t\tdragSummaryKids(kid, dx, _scales, cellWidth);\n\t\t});\n\t}\n}\n\nexport function dragSummary(\n\ttasks: GanttDataTree,\n\ttask: IParsedTask,\n\t_scales: GanttScaleData,\n\tcellWidth: number\n) {\n\tconst summary = tasks.getSummaryId(task.id);\n\tif (summary) {\n\t\tconst pobj = tasks.byId(summary);\n\t\tconst coords = {\n\t\t\txMin: Infinity,\n\t\t\txMax: 0,\n\t\t};\n\t\tgetSummaryBarSize(pobj, coords, _scales, cellWidth);\n\t\tpobj.$x = coords.xMin;\n\t\tpobj.$w = coords.xMax - coords.xMin;\n\n\t\tdragSummary(tasks, pobj, _scales, cellWidth);\n\t}\n}\n\nfunction getSummaryBarSize(\n\ttask: IParsedTask,\n\tcoords: { xMin: number; xMax: number },\n\t_scales: GanttScaleData,\n\tcellWidth: number\n) {\n\ttask.data?.forEach(kid => {\n\t\tif (!kid.unscheduled) {\n\t\t\tif (typeof kid.$x === \"undefined\")\n\t\t\t\tsetTaskSizes(kid, _scales, cellWidth);\n\t\t\tconst mD = kid.type === \"milestone\" && kid.$h ? kid.$h / 2 : 0;\n\t\t\tif (coords.xMin > kid.$x) {\n\t\t\t\tcoords.xMin = kid.$x + mD;\n\t\t\t}\n\t\t\tconst right = kid.$x + kid.$w - mD;\n\t\t\tif (coords.xMax < right) {\n\t\t\t\tcoords.xMax = right;\n\t\t\t}\n\t\t}\n\n\t\tif (kid.type !== \"summary\")\n\t\t\tgetSummaryBarSize(kid, coords, _scales, cellWidth);\n\t});\n}\n\nfunction setTaskSizes(task: IParsedTask, s: GanttScaleData, cellWidth: number) {\n\ttask.$x = Math.round(s.diff(task.start, s.start, s.lengthUnit) * cellWidth);\n\ttask.$w = Math.round(\n\t\ts.diff(task.end, task.start, s.lengthUnit, true) * cellWidth\n\t);\n}\n\nexport function setSummaryDates(task: ITask, tasks?: Partial<ITask>[]): ITask {\n\tlet data;\n\tif (tasks) {\n\t\tdata = tasks.filter(t => t.parent == task.id);\n\t}\n\n\tconst copy = { data, ...task } as IParsedTask;\n\tif (copy.data?.length) {\n\t\tcopy.data.forEach((kid: ITask) => {\n\t\t\tif (kid.unscheduled && !kid.data) return;\n\t\t\tif (tasks || (kid.type != \"summary\" && kid.data)) {\n\t\t\t\tif (kid.unscheduled)\n\t\t\t\t\t// reset own dates to take from kids\n\t\t\t\t\tkid = { ...kid, start: undefined, end: undefined };\n\t\t\t\tkid = setSummaryDates(kid, tasks);\n\t\t\t}\n\t\t\tif (kid.start && (!copy.start || copy.start > kid.start)) {\n\t\t\t\tcopy.start = new Date(kid.start);\n\t\t\t}\n\n\t\t\tconst end = kid.end || kid.start;\n\t\t\tif (end && (!copy.end || copy.end < end)) {\n\t\t\t\tcopy.end = new Date(end);\n\t\t\t}\n\t\t});\n\t} else if (task.type === \"summary\") {\n\t\tthrow Error(\n\t\t\t\"Summary tasks must have start and end dates if they have no subtasks\"\n\t\t);\n\t}\n\n\treturn copy;\n}\n\nexport function updateTask(\n\tt: IGanttTask,\n\ti: number,\n\tstate: Partial<IData>\n): IGanttTask {\n\tcalculateTaskDimensions(t, i, state, false);\n\tif (state.splitTasks) {\n\t\tt.segments?.forEach((s: Partial<IGanttTask>) => {\n\t\t\tupdateTask(s as IGanttTask, i, {\n\t\t\t\t...state,\n\t\t\t\tbaselines: false,\n\t\t\t});\n\t\t\ts.$x -= t.$x;\n\t\t});\n\t}\n\tif (state.baselines) {\n\t\tcalculateTaskDimensions(t, i, state, true);\n\t}\n\n\treturn t;\n}\n\nfunction calculateTaskDimensions(\n\tt: IGanttTask,\n\ti: number,\n\tstate: Partial<IData>,\n\tisBaseline: boolean\n) {\n\tconst { cellWidth, cellHeight, _scales, baselines } = state;\n\tconst { start: scaleStart, end: scaleEnd, lengthUnit, diff } = _scales;\n\tconst start = (isBaseline ? \"base_\" : \"\") + \"start\";\n\tconst end = (isBaseline ? \"base_\" : \"\") + \"end\";\n\tconst x = \"$x\" + (isBaseline ? \"_base\" : \"\");\n\tconst y = \"$y\" + (isBaseline ? \"_base\" : \"\");\n\tconst w = \"$w\" + (isBaseline ? \"_base\" : \"\");\n\tconst h = \"$h\" + (isBaseline ? \"_base\" : \"\");\n\tconst skip = \"$skip\" + (isBaseline ? \"_baseline\" : \"\");\n\n\tlet startDate = t[start];\n\tlet endDate = t[end];\n\n\tif (isBaseline && !startDate) {\n\t\tt[skip] = true;\n\t\treturn;\n\t}\n\n\tif (\n\t\tt[start] < scaleStart &&\n\t\t(t[end] < scaleStart || isEqual(t[end], scaleStart))\n\t) {\n\t\tstartDate = endDate = scaleStart;\n\t} else if (t[start] > scaleEnd) {\n\t\tstartDate = endDate = scaleEnd;\n\t}\n\n\tt[x] = Math.round(diff(startDate, scaleStart, lengthUnit) * cellWidth);\n\tt[y] = isBaseline\n\t\t? t.$y + t.$h + baselineTopPadding\n\t\t: cellHeight * i + defaultPadding;\n\tt[w] = Math.round(diff(endDate, startDate, lengthUnit, true) * cellWidth);\n\tt[h] = isBaseline\n\t\t? baselineHeight\n\t\t: baselines\n\t\t\t? cellHeight - heightAdjustment - baselineAdjustment\n\t\t\t: cellHeight - heightAdjustment;\n\n\tif (t.type === \"milestone\") {\n\t\tt[x] = t[x] - t.$h / 2;\n\t\tt[w] = t.$h;\n\n\t\tif (isBaseline) {\n\t\t\tt[y] = t.$y + baselineHeight;\n\t\t\tt[w] = t[h] = t.$h;\n\t\t}\n\t}\n\n\tif (state.unscheduledTasks && t.unscheduled && !isBaseline)\n\t\tt[\"$skip\"] = true;\n\telse t[skip] = isEqual(startDate, endDate);\n}\n\nexport function isSegmentMoveAllowed(task: IGanttTask, moveOptions: IDataHash) {\n\tif (isCommunity()) return false;\n\tconst { mode, l, w, dx, index } = moveOptions;\n\tconst { segments } = task;\n\tif (index || mode === \"end\") {\n\t\tif (dx > 0 && index < segments.length - 1) {\n\t\t\tif (l + w + dx > segments[index + 1].$x + task.$x) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if (dx < 0 && index) {\n\t\t\tconst d = mode === \"end\" ? w : 0;\n\t\t\tif (\n\t\t\t\tl + dx + d <\n\t\t\t\tsegments[index - 1].$x + task.$x + segments[index - 1].$w\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n\nexport function extendDragOptions(task: ITask, options: IDataHash) {\n\tif (isCommunity()) return;\n\tconst { segments } = task;\n\tconst { segmentIndex, mode } = options;\n\tconst s = segments[segmentIndex];\n\tif (segmentIndex || mode !== \"move\") {\n\t\toptions.index = segmentIndex;\n\t\toptions.l = s.$x + task.$x;\n\t\toptions.w = s.$w;\n\t\toptions.segment = true;\n\t}\n}\n","import { tempID } from \"@svar-ui/lib-state\";\nimport type { IGanttTask, IGanttLink, ILink } from \"./types\";\n\nconst delta = 20;\n\nexport const updateLink = function (\n\tlink: IGanttLink,\n\tstartTask: IGanttTask,\n\tendTask: IGanttTask,\n\theight: number,\n\tbaselines: boolean\n): IGanttLink {\n\tconst dy = Math.round(height / 2) - 3;\n\n\tif (\n\t\t!startTask ||\n\t\t!endTask ||\n\t\t!startTask.$y ||\n\t\t!endTask.$y ||\n\t\tstartTask.$skip ||\n\t\tendTask.$skip\n\t) {\n\t\tlink.$p = \"\";\n\t\tlink.$pl = 0;\n\t\treturn link;\n\t}\n\n\tlet s_start = false;\n\tlet e_start = false;\n\n\tswitch (link.type) {\n\t\tcase \"e2s\":\n\t\t\te_start = true;\n\t\t\tbreak;\n\n\t\tcase \"s2s\":\n\t\t\ts_start = true;\n\t\t\te_start = true;\n\t\t\tbreak;\n\n\t\tcase \"s2e\":\n\t\t\ts_start = true;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tconst sx = s_start ? startTask.$x : startTask.$x + startTask.$w;\n\tconst sy = baselines ? startTask.$y - 7 : startTask.$y;\n\tconst ex = e_start ? endTask.$x : endTask.$x + endTask.$w;\n\tconst ey = baselines ? endTask.$y - 7 : endTask.$y;\n\n\tif (sx !== ex || sy !== ey) {\n\t\tconst lineCoords = getLineCoords(\n\t\t\tsx,\n\t\t\tsy + dy,\n\t\t\tex,\n\t\t\tey + dy,\n\t\t\ts_start,\n\t\t\te_start,\n\t\t\theight / 2,\n\t\t\tbaselines\n\t\t);\n\n\t\tconst arrowCoords = getArrowCoords(ex, ey + dy, e_start);\n\t\tlink.$p = `${lineCoords},${arrowCoords}`;\n\t\tlink.$pl = getPolylineLength(link.$p);\n\t}\n\n\treturn link;\n};\n\nfunction getPolylineLength(pointsString: string) {\n\tconst nums = pointsString.split(\",\").map(Number);\n\tconst points = [];\n\n\tfor (let i = 0; i < nums.length; i += 2) {\n\t\tif (i + 1 < nums.length) {\n\t\t\tpoints.push([nums[i], nums[i + 1]]);\n\t\t}\n\t}\n\n\tlet length = 0;\n\tfor (let i = 0; i < points.length - 1; i++) {\n\t\tconst [x1, y1] = points[i];\n\t\tconst [x2, y2] = points[i + 1];\n\t\tlength += Math.hypot(x2 - x1, y2 - y1);\n\t}\n\treturn length;\n}\n\nfunction getLineCoords(\n\tsx: number,\n\tsy: number,\n\tex: number,\n\tey: number,\n\ts_start: boolean,\n\te_start: boolean,\n\tgapp: number,\n\tbaselines: boolean\n): string {\n\tconst shift = delta * (s_start ? -1 : 1);\n\tconst backshift = delta * (e_start ? -1 : 1);\n\n\tconst sx1 = sx + shift;\n\tconst ex1 = ex + backshift;\n\tconst line = [sx, sy, sx1, sy, 0, 0, 0, 0, ex1, ey, ex, ey];\n\n\tconst dx = ex1 - sx1;\n\tlet dy = ey - sy;\n\n\tconst same = e_start === s_start;\n\tif (!same) {\n\t\tif ((ex1 <= sx + delta - 2 && e_start) || (ex1 > sx && !e_start)) {\n\t\t\tdy = baselines ? dy - gapp + 6 : dy - gapp;\n\t\t}\n\t}\n\n\tif ((same && e_start && sx1 > ex1) || (same && !e_start && sx1 < ex1)) {\n\t\tline[4] = line[2] + dx;\n\t\tline[5] = line[3];\n\t\tline[6] = line[4];\n\t\tline[7] = line[5] + dy;\n\t} else {\n\t\tline[4] = line[2];\n\t\tline[5] = line[3] + dy;\n\t\tline[6] = line[4] + dx;\n\t\tline[7] = line[5];\n\t}\n\n\treturn line.join(\",\");\n}\n\nfunction getArrowCoords(x: number, y: number, start: boolean) {\n\tif (start) {\n\t\treturn `${x - 5},${y - 3},${x - 5},${y + 3},${x},${y}`;\n\t} else {\n\t\treturn `${x + 5},${y + 3},${x + 5},${y - 3},${x},${y}`;\n\t}\n}\n\nexport function placeLink(\n\tbox: { left: number; top: number },\n\tstart: { x: number; y: number },\n\tend: { x: number; y: number }\n): { width: number; height: number; left: number; top: number; p: string } {\n\tif (start && end) {\n\t\tconst width = end.x - start.x;\n\t\tconst height = end.y - start.y;\n\t\tconst left = (width > 0 ? start.x : end.x) - box.left;\n\t\tconst top = (height > 0 ? start.y : end.y) - box.top;\n\t\tconst p = `${width > 0 ? 0 : -width},${height > 0 ? 0 : -height},${\n\t\t\twidth > 0 ? width : 0\n\t\t},${height > 0 ? height : 0}`;\n\t\treturn {\n\t\t\twidth: Math.abs(width),\n\t\t\theight: Math.abs(height),\n\t\t\tleft,\n\t\t\ttop,\n\t\t\tp,\n\t\t};\n\t} else {\n\t\treturn null;\n\t}\n}\n\nexport function normalizeLinks(links: ILink[]) {\n\treturn links.map(link => {\n\t\tconst id = link.id || tempID();\n\t\treturn { ...link, id };\n\t});\n}\n","import type { IGanttColumn, ITask } from \"./types\";\n\nconst dateFields = [\"start\", \"end\", \"duration\"];\n\nfunction isCellEditable(task: ITask, columnId: string) {\n\tconst { type, unscheduled } = task;\n\tif (unscheduled || type === \"summary\")\n\t\treturn !dateFields.includes(columnId);\n\telse if (type === \"milestone\")\n\t\treturn ![\"end\", \"duration\"].includes(columnId);\n\treturn true;\n}\nfunction processEditor(\n\tid: string,\n\teditor: IGanttColumn[\"editor\"]\n): IGanttColumn[\"editor\"] {\n\tif (typeof editor === \"function\") return editor;\n\n\tif (dateFields.includes(id)) {\n\t\tif (typeof editor === \"string\") {\n\t\t\teditor = {\n\t\t\t\ttype: editor,\n\t\t\t\tconfig: {},\n\t\t\t};\n\t\t}\n\t\tif (!editor.config) editor.config = {};\n\t\tif (editor.type === \"datepicker\") {\n\t\t\teditor.config.buttons = [\"today\"];\n\t\t}\n\t\treturn (task: ITask, column: IGanttColumn) => {\n\t\t\tif (isCellEditable(task, column.id)) return editor as any;\n\t\t\treturn null;\n\t\t};\n\t}\n\treturn editor;\n}\n\nexport function normalizeColumns(columns: IGanttColumn[]): IGanttColumn[] {\n\tif (!columns || !columns.length) {\n\t\treturn [];\n\t}\n\n\tconst resColumns = columns.map<IGanttColumn>(a => {\n\t\tconst align = a.align || \"left\";\n\t\tconst isAddTaskColumn = a.id === \"add-task\";\n\t\tconst flexgrow = !isAddTaskColumn && a.flexgrow ? a.flexgrow : null;\n\t\tconst width = flexgrow ? 1 : a.width || (isAddTaskColumn ? 50 : 120);\n\n\t\tconst editor = a.editor && processEditor(a.id, a.editor);\n\n\t\treturn {\n\t\t\twidth,\n\t\t\talign,\n\t\t\theader: a.header,\n\t\t\tid: a.id,\n\t\t\ttemplate: a.template,\n\t\t\t_template: a._template,\n\t\t\t...(flexgrow && { flexgrow }),\n\t\t\tcell: a.cell,\n\t\t\tresize: a.resize ?? true,\n\t\t\tsort: a.sort ?? !isAddTaskColumn,\n\t\t\t...(editor && { editor }),\n\t\t\t...(a.options && { options: a.options }),\n\t\t};\n\t});\n\treturn resColumns;\n}\n\nexport const defaultColumns: IGanttColumn[] = [\n\t{ id: \"text\", header: \"Task name\", flexgrow: 1, sort: true },\n\t{ id: \"start\", header: \"Start date\", align: \"center\", sort: true },\n\t{\n\t\tid: \"duration\",\n\t\theader: \"Duration\",\n\t\twidth: 100,\n\t\talign: \"center\",\n\t\tsort: true,\n\t},\n\t{\n\t\tid: \"add-task\",\n\t\theader: \"Add task\",\n\t\twidth: 50,\n\t\talign: \"center\",\n\t\tsort: false,\n\t\tresize: false,\n\t},\n];\n","import type { TID } from \"@svar-ui/lib-state\";\nimport type { GanttDataTree, ILink, IDataHash, ITask } from \"../types\";\nimport { IOptionConfig } from \"./menuOptions\";\nimport { IButtonConfig } from \"./toolbarButtons\";\n\ntype TTarget = TID | IDataHash | null;\n\nexport function handleAction(\n\tapi: any,\n\taction: string,\n\ttarget: TTarget,\n\t_: any\n): void {\n\tconst { selected, tasks } = api.getState();\n\tconst hasSelection = selected.length;\n\t// single-target ops\n\tconst single = [\n\t\t\"edit-task\",\n\t\t\"paste-task\",\n\t\t\"edit-task:task\",\n\t\t\"edit-task:segment\",\n\t];\n\t// do not sort index-/level-wise\n\tconst avoidMap = [\"copy-task\", \"cut-task\"];\n\t// apply in reverse to maintain relative positions\n\tconst reversed = [\n\t\t\"copy-task\",\n\t\t\"cut-task\",\n\t\t\"delete-task\",\n\t\t\"indent-task:remove\",\n\t\t\"move-task:down\",\n\t];\n\t// targetless ops\n\tconst untargeted = [\"add-task\", \"undo\", \"redo\"];\n\t// direct children should move with entire branch\n\tconst checkParent = [\"indent-task:add\", \"move-task:down\", \"move-task:up\"];\n\tconst checkLevel: { [k: string]: number } = {\n\t\t\"indent-task:remove\": 2,\n\t};\n\tconst targetless = !hasSelection && untargeted.includes(action);\n\tconst limit = {\n\t\tparent: checkParent.includes(action),\n\t\tlevel: checkLevel[action],\n\t};\n\n\ttarget = target || (hasSelection ? selected[selected.length - 1] : null);\n\tif (!target && !targetless) return;\n\n\tif (action !== \"paste-task\") api._temp = null;\n\n\tif (single.includes(action) || targetless || selected.length === 1) {\n\t\trunSingleAction(api, action, target, _);\n\t} else if (hasSelection) {\n\t\tconst order = avoidMap.includes(action)\n\t\t\t? selected\n\t\t\t: mapOrder(selected, tasks, limit);\n\t\tif (reversed.includes(action)) {\n\t\t\torder.reverse();\n\t\t}\n\n\t\tconst history = api.getHistory();\n\n\t\t// start batch for mass operations\n\t\tif (history) history.startBatch();\n\t\torder.forEach((id: TID, i: number) =>\n\t\t\trunSingleAction(api, action, id, _, i)\n\t\t);\n\t\t// end batch for mass operations\n\t\tif (history) history.endBatch();\n\t}\n}\n\nfunction mapOrder(\n\tselected: TID[],\n\ttasks: GanttDataTree,\n\tlimit: { parent: boolean; level: number }\n): TID[] {\n\tlet order = selected.map(id => {\n\t\tconst tobj = tasks.byId(id);\n\t\treturn {\n\t\t\tid,\n\t\t\tlevel: tobj.$level,\n\t\t\tparent: tobj.parent,\n\t\t\tindex: tasks.getIndexById(id),\n\t\t};\n\t});\n\tif (limit.parent || limit.level) {\n\t\torder = order.filter(obj => {\n\t\t\tconst ignoreParent = limit.level && obj.level <= limit.level;\n\t\t\treturn ignoreParent || !selected.includes(obj.parent);\n\t\t});\n\t}\n\torder.sort((a, b) => {\n\t\treturn a.level - b.level || a.index - b.index;\n\t});\n\treturn order.map(o => o.id);\n}\n\nfunction runSingleAction(\n\tapi: any,\n\taction: string,\n\ttarget: TTarget,\n\t_: any,\n\torder?: number\n): void {\n\tconst exec = api.exec ? api.exec : api.in.exec;\n\tlet op: string = action.split(\":\")[0];\n\tlet mode: string | boolean = action.split(\":\")[1];\n\tconst id = (target as IDataHash)?.id || target;\n\tlet data: any = { id };\n\tlet extraData: any = {};\n\tlet select: boolean = false;\n\n\tif (op == \"copy-task\" || op == \"cut-task\") {\n\t\tif (!api._temp) api._temp = [];\n\t\tapi._temp.push({ id, cut: op == \"cut-task\" });\n\t\treturn;\n\t} else if (op == \"paste-task\") {\n\t\tif (api._temp && api._temp.length) {\n\t\t\tconst history = api.getHistory();\n\t\t\t// start batch for mass operations\n\t\t\tif (history) history.startBatch();\n\n\t\t\tconst idPairs = new Map<TID, TID>();\n\n\t\t\tapi._temp.forEach((temp: any) => {\n\t\t\t\tconst event = {\n\t\t\t\t\tid: temp.id,\n\t\t\t\t\ttarget: id,\n\t\t\t\t\tmode: \"after\",\n\t\t\t\t};\n\t\t\t\texec(temp.cut ? \"move-task\" : \"copy-task\", event);\n\t\t\t\tidPairs.set(temp.id, event.id);\n\t\t\t});\n\n\t\t\t// if copying tasks, find links between them and copy them too\n\t\t\tif (!api._temp[0].cut) {\n\t\t\t\tconst { links } = api.getState();\n\t\t\t\tconst taskIds = api._temp.map((temp: ILink) => temp.id);\n\t\t\t\tconst relevantLinks: ILink[] = [];\n\n\t\t\t\t// find links where both source and target ids are in copied tasks\n\t\t\t\tlinks.forEach((link: ILink) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\ttaskIds.includes(link.source) &&\n\t\t\t\t\t\ttaskIds.includes(link.target)\n\t\t\t\t\t) {\n\t\t\t\t\t\trelevantLinks.push(link);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\trelevantLinks.forEach((link: ILink) => {\n\t\t\t\t\texec(\"add-link\", {\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\tsource: idPairs.get(link.source),\n\t\t\t\t\t\t\ttarget: idPairs.get(link.target),\n\t\t\t\t\t\t\ttype: link.type,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tapi._temp.forEach((temp: any, i: number) => {\n\t\t\t\t\texec(\"select-task\", {\n\t\t\t\t\t\tid: idPairs.get(temp.id),\n\t\t\t\t\t\ttoggle: !!i,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// end batch for mass operations\n\t\t\tif (history) history.endBatch();\n\t\t\tapi._temp = null;\n\t\t}\n\t\treturn;\n\t} else if (op === \"add-task\") {\n\t\textraData = {\n\t\t\ttask: { type: \"task\", text: _(\"New Task\") },\n\t\t\ttarget: id,\n\t\t\tshow: true,\n\t\t\tselect: false,\n\t\t};\n\t\tdata = {};\n\t\tselect = true;\n\t} else if (op === \"edit-task\") {\n\t\top = \"show-editor\";\n\t\tif (mode === \"segment\" && typeof target === \"object\") {\n\t\t\textraData = target;\n\t\t}\n\t} else if (op === \"convert-task\") {\n\t\top = \"update-task\";\n\t\textraData = { task: { type: mode } };\n\t\tmode = undefined;\n\t} else if (op === \"indent-task\") {\n\t\tmode = mode === \"add\";\n\t}\n\tif (op === \"split-task\" && typeof target === \"object\") {\n\t\textraData = target;\n\t} else if (\n\t\top === \"delete-task\" &&\n\t\tmode === \"segment\" &&\n\t\ttypeof target === \"object\"\n\t) {\n\t\tconst task: ITask = api.getTask(id);\n\t\tconst { segmentIndex } = target;\n\t\tconst segments = task.segments.filter(\n\t\t\t(s, index) => index !== segmentIndex\n\t\t);\n\t\texec(\"update-task\", {\n\t\t\tid,\n\t\t\ttask: { segments },\n\t\t});\n\t\treturn;\n\t}\n\tif (typeof mode !== \"undefined\") extraData = { mode, ...extraData };\n\tdata = { ...data, ...extraData };\n\n\texec(op, data);\n\tif (select) exec(\"select-task\", { id: data.id, toggle: !!order });\n}\n\nexport function isHandledAction(\n\toptions: IOptionConfig[] | IButtonConfig[],\n\tid: TID\n): boolean {\n\treturn options.some(op => {\n\t\tif ((op as IOptionConfig).data)\n\t\t\treturn isHandledAction((op as IOptionConfig).data, id);\n\t\treturn op.id === id;\n\t});\n}\n","import type { ITask, TDurationUnit, IData, Calendar } from \"./types\";\nimport { getDiffer, getAdder } from \"./time\";\nimport { setSummaryDates } from \"./tasks\";\n// #if [!(WX_PACKAGE_TYPE=open)]\nimport { calcSplitDates } from \"./pro/splitTasks\";\n// #endif\n\nconst unitAdd = (unit: TDurationUnit, calendar?: Calendar) =>\n\tgetAdder(unit, calendar);\nconst unitDiff = (unit: TDurationUnit, calendar?: Calendar) =>\n\tgetDiffer(unit, calendar);\n\nexport function parseTaskDates(tasks: ITask[], state: Partial<IData>) {\n\tif (Array.isArray(tasks)) {\n\t\t//calc dates for single task\n\t\ttasks.forEach(task => normalizeDates(task, state));\n\t\t//calc summary dates\n\t\ttasks.forEach(task => {\n\t\t\tif (task.type === \"summary\" && !(task.start && task.end)) {\n\t\t\t\tconst { start, end } = setSummaryDates(task, tasks);\n\t\t\t\ttask.start = start;\n\t\t\t\ttask.end = end;\n\t\t\t\tnormalizeDates(task, state);\n\t\t\t}\n\t\t});\n\t}\n}\n\nexport function normalizeDates(task: Partial<ITask>, state: Partial<IData>) {\n\tif (!task.unscheduled) {\n\t\tcalcDates(task, state, false);\n\t}\n\tif (task.base_start) calcDates(task, state, true);\n}\n\nexport function calcDates(\n\ttask: Partial<ITask>,\n\tstate: Partial<IData>,\n\tisBaseline?: boolean\n) {\n\tconst { calendar, durationUnit } = state;\n\tconst unit = durationUnit || \"day\";\n\tconst [start, end, duration] = getFields(isBaseline);\n\tif (task.type === \"milestone\") {\n\t\ttask[duration] = 0;\n\t\ttask[end] = undefined;\n\t\t// start is must-have for correcting\n\t} else if (task[start]) {\n\t\t// #if [!(WX_PACKAGE_TYPE=open)]\n\t\tif (!isBaseline && state.splitTasks && task.segments)\n\t\t\treturn calcSplitDates(task, state);\n\t\t// #endif\n\t\tif (!task[duration]) {\n\t\t\tif (task[end]) {\n\t\t\t\ttask[duration] = unitDiff(unit, calendar)(\n\t\t\t\t\ttask[end],\n\t\t\t\t\ttask[start]\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\ttask[end] = unitAdd(unit, calendar)(task[start], 1);\n\t\t\t\ttask[duration] = 1;\n\t\t\t}\n\t\t} else {\n\t\t\ttask[end] = unitAdd(unit, calendar)(task[start], task[duration]);\n\t\t}\n\t}\n}\n\nexport function getFields(isBaseline: boolean) {\n\tif (isBaseline) return [\"base_start\", \"base_end\", \"base_duration\"];\n\treturn [\"start\", \"end\", \"duration\"];\n}\n\nfunction prepareDates(task: Partial<ITask>, key: string, isBaseline: boolean) {\n\tconst [start, end, duration] = getFields(isBaseline);\n\tif (key === duration || key === start) {\n\t\ttask[end] = null;\n\t}\n\tif (key === end) {\n\t\ttask[duration] = 0;\n\t\tif (task[start] && task[start] >= task[end]) {\n\t\t\ttask[end] = null;\n\t\t\ttask[duration] = 1;\n\t\t}\n\t}\n}\n\nexport function prepareEditTask(\n\ttask: Partial<ITask>,\n\tstate: Partial<IData>,\n\tkey: string\n) {\n\tprepareDates(task, key, false);\n\tif (task.base_start) prepareDates(task, key, true);\n\n\tnormalizeDates(task, state);\n}\n","import { Store, EventBus, DataArray, DataRouter, tempID } from \"@svar-ui/lib-state\";\nimport type { TDataConfig, TWritableCreator, TID } from \"@svar-ui/lib-state\";\n\nimport GanttDataTree from \"./GanttDataTree\";\nimport { calcScales, resetScales, getMinUnit, zoomScale } from \"./scales\";\nimport {\n\tupdateTask,\n\tdragSummary,\n\tdragSummaryKids,\n\tsetSummaryDates,\n} from \"./tasks\";\nimport { normalizeLinks, updateLink } from \"./links\";\nimport { normalizeColumns } from \"./columns\";\nimport {\n\tgetAdder,\n\tgetDiffer,\n\tisCorrectLengthUnit,\n\tgetUnitStart,\n\tadjustToWorkingDay,\n\tshiftByWorkingDays,\n} from \"./time\";\nimport { isCommunity } from \"./package\";\nimport { handleAction } from \"./helpers/actionHandlers\";\n\n// #if [!(WX_PACKAGE_TYPE=open)]\nimport {\n\tupdateSplitTask,\n\tsplitTask,\n\tdragSplitTask,\n\tisIndivisibleType,\n} from \"./pro/splitTasks\";\n\nimport { HistoryManager } from \"./pro/HistoryManager\";\nimport { AutoSchedulerModule } from \"./pro/AutoScheduler\";\nimport { CriticalPathModule } from \"./pro/CriticalPath\";\nimport type { EventTracker } from \"./pro/EventTracker\";\n// #endif\n\nimport type {\n\tIData,\n\tIDataConfig,\n\tITask,\n\tTMethodsConfig,\n\tIGanttColumn,\n\tIGanttTask,\n\tIGanttLink,\n\tILink,\n\tIVisibleArea,\n\tIZoomConfig,\n\tIParsedTask,\n\tTSort,\n\tTScrollTask,\n} from \"./types\";\n\nimport { isEqual } from \"date-fns\";\nimport { normalizeDates, parseTaskDates } from \"./normalizeDates\";\n\nexport default class DataStore extends Store<IData> {\n\tpublic in: EventBus<TMethodsConfig, keyof TMethodsConfig>;\n\tprivate _router: DataRouter<IData, IDataConfig, TMethodsConfig>;\n\tprivate _modules = new Map<string, any>();\n\n\tconstructor(w: TWritableCreator) {\n\t\tsuper({ writable: w, async: false });\n\n\t\tthis._router = new DataRouter(\n\t\t\tsuper.setState.bind(this),\n\t\t\t// data recalculation dependencies\n\t\t\t[\n\t\t\t\t// recalculate scales in auto-scale mode\n\t\t\t\t{\n\t\t\t\t\tin: [\"tasks\", \"start\", \"end\", \"scales\", \"autoScale\"],\n\t\t\t\t\tout: [\"_start\", \"_end\"],\n\t\t\t\t\texec: (ctx: TDataConfig) => {\n\t\t\t\t\t\tconst {\n\t\t\t\t\t\t\t_end,\n\t\t\t\t\t\t\t_start,\n\t\t\t\t\t\t\tstart,\n\t\t\t\t\t\t\tend,\n\t\t\t\t\t\t\ttasks,\n\t\t\t\t\t\t\tscales,\n\t\t\t\t\t\t\tautoScale,\n\t\t\t\t\t\t} = this.getState();\n\t\t\t\t\t\tif (!start || !end || autoScale) {\n\t\t\t\t\t\t\tconst minUnit = getMinUnit(scales).unit;\n\n\t\t\t\t\t\t\tconst bounds = calcScales(\n\t\t\t\t\t\t\t\tstart,\n\t\t\t\t\t\t\t\tend,\n\t\t\t\t\t\t\t\tautoScale,\n\t\t\t\t\t\t\t\tminUnit,\n\t\t\t\t\t\t\t\ttasks\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (bounds._end != _end || bounds._start != _start)\n\t\t\t\t\t\t\t\tthis.setState(bounds, ctx);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.setState({ _start: start, _end: end }, ctx);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// prepare scale structure for rendering\n\t\t\t\t{\n\t\t\t\t\tin: [\n\t\t\t\t\t\t\"_start\",\n\t\t\t\t\t\t\"_end\",\n\t\t\t\t\t\t\"cellWidth\",\n\t\t\t\t\t\t\"scaleHeight\",\n\t\t\t\t\t\t\"scales\",\n\t\t\t\t\t\t\"lengthUnit\",\n\t\t\t\t\t\t\"_weekStart\",\n\t\t\t\t\t],\n\t\t\t\t\tout: [\"_scales\"],\n\t\t\t\t\texec: (ctx: TDataConfig) => {\n\t\t\t\t\t\tconst state = this.getState();\n\t\t\t\t\t\tlet { lengthUnit } = state;\n\t\t\t\t\t\tconst {\n\t\t\t\t\t\t\t_start,\n\t\t\t\t\t\t\t_end,\n\t\t\t\t\t\t\tcellWidth,\n\t\t\t\t\t\t\tscaleHeight,\n\t\t\t\t\t\t\tscales,\n\t\t\t\t\t\t\t_weekStart,\n\t\t\t\t\t\t} = state;\n\n\t\t\t\t\t\tconst minUnit = getMinUnit(scales).unit;\n\t\t\t\t\t\tif (!isCorrectLengthUnit(minUnit, lengthUnit))\n\t\t\t\t\t\t\tlengthUnit = minUnit;\n\n\t\t\t\t\t\tconst _scales = resetScales(\n\t\t\t\t\t\t\t_start,\n\t\t\t\t\t\t\t_end,\n\t\t\t\t\t\t\tlengthUnit,\n\t\t\t\t\t\t\tcellWidth,\n\t\t\t\t\t\t\tscaleHeight,\n\t\t\t\t\t\t\t_weekStart,\n\t\t\t\t\t\t\tscales\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.setState({ _scales }, ctx);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// prepare tasks positions\n\t\t\t\t{\n\t\t\t\t\tin: [\n\t\t\t\t\t\t\"_scales\",\n\t\t\t\t\t\t\"tasks\",\n\t\t\t\t\t\t\"cellHeight\",\n\t\t\t\t\t\t\"baselines\",\n\t\t\t\t\t\t\"unscheduledTasks\",\n\t\t\t\t\t],\n\t\t\t\t\tout: [\"_tasks\"],\n\t\t\t\t\texec: (ctx: TDataConfig) => {\n\t\t\t\t\t\tconst {\n\t\t\t\t\t\t\tcellWidth,\n\t\t\t\t\t\t\tcellHeight,\n\t\t\t\t\t\t\ttasks,\n\t\t\t\t\t\t\t_scales,\n\t\t\t\t\t\t\tbaselines,\n\t\t\t\t\t\t\tsplitTasks,\n\t\t\t\t\t\t\tunscheduledTasks,\n\t\t\t\t\t\t} = this.getState();\n\n\t\t\t\t\t\tconst _tasks = tasks.toArray().map((task, i) =>\n\t\t\t\t\t\t\tupdateTask(task as IGanttTask, i, {\n\t\t\t\t\t\t\t\tcellWidth,\n\t\t\t\t\t\t\t\tcellHeight,\n\t\t\t\t\t\t\t\t_scales,\n\t\t\t\t\t\t\t\tbaselines,\n\t\t\t\t\t\t\t\tsplitTasks,\n\t\t\t\t\t\t\t\tunscheduledTasks,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.setState({ _tasks }, ctx);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// prepare link positions\n\t\t\t\t{\n\t\t\t\t\tin: [\"_tasks\", \"links\", \"cellHeight\"],\n\t\t\t\t\tout: [\"_links\"],\n\t\t\t\t\texec: (ctx: TDataConfig) => {\n\t\t\t\t\t\tconst {\n\t\t\t\t\t\t\ttasks,\n\t\t\t\t\t\t\tlinks,\n\t\t\t\t\t\t\tcellHeight,\n\t\t\t\t\t\t\tbaselines,\n\t\t\t\t\t\t\tcriticalPath,\n\t\t\t\t\t\t} = this.getState();\n\n\t\t\t\t\t\tconst _links = links\n\t\t\t\t\t\t\t.map<IGanttLink>(link => {\n\t\t\t\t\t\t\t\tconst startTask = tasks.byId(link.source);\n\t\t\t\t\t\t\t\tconst endTask = tasks.byId(link.target);\n\t\t\t\t\t\t\t\treturn updateLink(\n\t\t\t\t\t\t\t\t\tlink as IGanttLink,\n\t\t\t\t\t\t\t\t\tstartTask as IGanttTask,\n\t\t\t\t\t\t\t\t\tendTask as IGanttTask,\n\t\t\t\t\t\t\t\t\tcellHeight,\n\t\t\t\t\t\t\t\t\tbaselines\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.toSorted((a: IGanttLink, b: IGanttLink) => {\n\t\t\t\t\t\t\t\tif (criticalPath) {\n\t\t\t\t\t\t\t\t\t// sort by length (shortest first) when critical status is the same\n\t\t\t\t\t\t\t\t\tif (!!a.$critical === !!b.$critical) {\n\t\t\t\t\t\t\t\t\t\treturn b.$pl - a.$pl;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t// critical links first\n\t\t\t\t\t\t\t\t\treturn a.$critical ? 1 : -1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn b.$pl - a.$pl;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.filter(a => a !== null);\n\t\t\t\t\t\tthis.setState({ _links }, ctx);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// activeTask\n\t\t\t\t{\n\t\t\t\t\tin: [\"tasks\", \"activeTask\"],\n\t\t\t\t\tout: [\"_activeTask\"],\n\t\t\t\t\texec: (ctx: TDataConfig) => {\n\t\t\t\t\t\tconst state = this.getState();\n\t\t\t\t\t\tlet { activeTask } = state;\n\t\t\t\t\t\tif (activeTask && typeof activeTask === \"object\")\n\t\t\t\t\t\t\tactiveTask = activeTask.id;\n\t\t\t\t\t\tconst task = state.tasks.byId(activeTask as TID);\n\t\t\t\t\t\tthis.setState({ _activeTask: task || null }, ctx);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// selection\n\t\t\t\t{\n\t\t\t\t\tin: [\"tasks\", \"selected\"],\n\t\t\t\t\tout: [\"_selected\"],\n\t\t\t\t\texec: (ctx: TDataConfig) => {\n\t\t\t\t\t\tconst { tasks, selected } = this.getState();\n\t\t\t\t\t\tconst _selected = selected\n\t\t\t\t\t\t\t.map(id => tasks.byId(id))\n\t\t\t\t\t\t\t.filter((task: ITask) => !!task);\n\t\t\t\t\t\tthis.setState({ _selected }, ctx);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// restore config cellWidth on scale change\n\t\t\t\t{\n\t\t\t\t\tin: [\"start\", \"end\"],\n\t\t\t\t\tout: [\"cellWidth\"],\n\t\t\t\t\texec: (ctx: TDataConfig) => {\n\t\t\t\t\t\tconst { _cellWidth, cellWidth } = this.getState();\n\t\t\t\t\t\tif (_cellWidth != cellWidth)\n\t\t\t\t\t\t\tthis.setState({ cellWidth: _cellWidth }, ctx);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// #if [!(WX_PACKAGE_TYPE=open)]\n\t\t\t\t{\n\t\t\t\t\tin: [\"markers\", \"_scales\", \"cellWidth\"],\n\t\t\t\t\tout: [\"_markers\"],\n\t\t\t\t\texec: (ctx: TDataConfig) => {\n\t\t\t\t\t\tconst { markers, _scales, cellWidth } = this.getState();\n\t\t\t\t\t\tconst { start, diff } = _scales;\n\t\t\t\t\t\tconst _markers = markers.map(marker => {\n\t\t\t\t\t\t\tmarker.left = diff(marker.start, start) * cellWidth;\n\t\t\t\t\t\t\treturn marker;\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.setState({ _markers }, ctx);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tin: [\"unscheduledTasks\"],\n\t\t\t\t\tout: [\"columns\"],\n\t\t\t\t\texec: (ctx: TDataConfig) => {\n\t\t\t\t\t\tconst { columns, unscheduledTasks } = this.getState();\n\n\t\t\t\t\t\tconst newColumns = columns.map(col => {\n\t\t\t\t\t\t\t//user-defined template\n\t\t\t\t\t\t\tif (!col._template) return col;\n\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tcol.id == \"start\" ||\n\t\t\t\t\t\t\t\tcol.id == \"end\" ||\n\t\t\t\t\t\t\t\tcol.id == \"duration\"\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tcol = {\n\t\t\t\t\t\t\t\t\t...col,\n\t\t\t\t\t\t\t\t\ttemplate: (\n\t\t\t\t\t\t\t\t\t\tb: Date | number,\n\t\t\t\t\t\t\t\t\t\trow: ITask,\n\t\t\t\t\t\t\t\t\t\tcol: IGanttColumn\n\t\t\t\t\t\t\t\t\t) =>\n\t\t\t\t\t\t\t\t\t\trow.unscheduled && unscheduledTasks\n\t\t\t\t\t\t\t\t\t\t\t? \"-\"\n\t\t\t\t\t\t\t\t\t\t\t: col._template(b, row, col),\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn col;\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.setState({ columns: newColumns }, ctx);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// #endif\n\t\t\t],\n\t\t\t// data initializers\n\t\t\t{\n\t\t\t\ttasks: (v: ITask[]) => new GanttDataTree(v),\n\t\t\t\tlinks: (v: ILink[]) => new DataArray(v),\n\t\t\t\tcolumns: (v: IGanttColumn[]) => normalizeColumns(v),\n\t\t\t}\n\t\t);\n\n\t\tconst inBus = (this.in = new EventBus());\n\n\t\t/* before data modifications */\n\t\tinBus.on(\"show-editor\", (ev: TMethodsConfig[\"show-editor\"]) => {\n\t\t\tconst { splitTasks } = this.getState();\n\t\t\tif (splitTasks) {\n\t\t\t\tconst { id, segmentIndex } = ev;\n\t\t\t\tif (id && (segmentIndex || segmentIndex === 0)) {\n\t\t\t\t\tthis.setStateAsync({ activeTask: { id, segmentIndex } });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.setStateAsync({ activeTask: ev.id });\n\t\t});\n\t\tinBus.on(\n\t\t\t\"select-task\",\n\t\t\t({\n\t\t\t\tid,\n\t\t\t\ttoggle,\n\t\t\t\trange,\n\t\t\t\tshow,\n\t\t\t\tsegmentIndex,\n\t\t\t}: TMethodsConfig[\"select-task\"]) => {\n\t\t\t\tconst { selected, _tasks, activeTask, splitTasks } =\n\t\t\t\t\tthis.getState();\n\t\t\t\tlet unselect = false;\n\n\t\t\t\tlet ids;\n\t\t\t\tif (selected.length && (toggle || range)) {\n\t\t\t\t\tconst result = [...selected];\n\n\t\t\t\t\t// in case of Ctrl/Command+Shift, handle as Shift\n\t\t\t\t\tif (range) {\n\t\t\t\t\t\tconst sourceId = result[result.length - 1];\n\t\t\t\t\t\tconst sourceInd = _tasks.findIndex(\n\t\t\t\t\t\t\ttobj => tobj.id == sourceId\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst targetInd = _tasks.findIndex(\n\t\t\t\t\t\t\ttobj => tobj.id == id\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst start = Math.min(sourceInd, targetInd);\n\t\t\t\t\t\tconst end = Math.max(sourceInd, targetInd) + 1;\n\n\t\t\t\t\t\tconst range = _tasks\n\t\t\t\t\t\t\t.slice(start, end)\n\t\t\t\t\t\t\t.map(obj => obj.id);\n\t\t\t\t\t\tif (sourceInd > targetInd) range.reverse();\n\n\t\t\t\t\t\trange.forEach(selId => {\n\t\t\t\t\t\t\tif (!result.includes(selId)) result.push(selId);\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (toggle) {\n\t\t\t\t\t\tconst selIndex = result.findIndex(selId => selId == id);\n\t\t\t\t\t\tif (selIndex === -1) {\n\t\t\t\t\t\t\tresult.push(id);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tunselect = true;\n\t\t\t\t\t\t\tresult.splice(selIndex, 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tids = result;\n\t\t\t\t} else {\n\t\t\t\t\tids = [id];\n\t\t\t\t}\n\t\t\t\tconst update: Partial<IData> = {\n\t\t\t\t\tselected: ids,\n\t\t\t\t};\n\n\t\t\t\tif (show && ids.length)\n\t\t\t\t\tupdate._scrollTask = { id: ids[0], mode: show };\n\n\t\t\t\tthis.setStateAsync(update);\n\n\t\t\t\tif (\n\t\t\t\t\t!unselect &&\n\t\t\t\t\tactiveTask &&\n\t\t\t\t\t(activeTask !== id || splitTasks)\n\t\t\t\t) {\n\t\t\t\t\tinBus.exec(\"show-editor\", {\n\t\t\t\t\t\tid,\n\t\t\t\t\t\t...(splitTasks && { segmentIndex }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t\tinBus.on(\"delete-link\", ({ id }: TMethodsConfig[\"delete-link\"]) => {\n\t\t\tconst { links } = this.getState();\n\t\t\tlinks.remove(id);\n\t\t\tthis.setStateAsync({ links });\n\t\t});\n\t\tinBus.on(\"update-link\", (ev: TMethodsConfig[\"update-link\"]) => {\n\t\t\tconst { links } = this.getState();\n\t\t\tconst id = ev.id;\n\t\t\tlet link = ev.link;\n\n\t\t\tlinks.update(id, link as ILink);\n\t\t\tlink = links.byId(id);\n\n\t\t\tif (!link.lag && link.lag !== 0) delete link.lag;\n\n\t\t\tthis.setStateAsync({ links });\n\n\t\t\tev.link = link;\n\t\t});\n\t\tinBus.on(\"add-link\", (ev: TMethodsConfig[\"add-link\"]) => {\n\t\t\tconst { link } = ev;\n\t\t\tconst { links } = this.getState();\n\n\t\t\tif (!link.source || !link.target) return;\n\t\t\tif (!link.type) link.type = \"e2s\";\n\n\t\t\tlink.id = link.id || tempID();\n\n\t\t\tlinks.add(link as ILink);\n\t\t\tthis.setStateAsync({ links });\n\n\t\t\tev.id = link.id;\n\t\t\tev.link = links.byId(link.id);\n\t\t});\n\n\t\tlet source: TID = null; //stable task parent until final call\n\t\tinBus.on(\"move-task\", (ev: TMethodsConfig[\"move-task\"]) => {\n\t\t\tconst { tasks } = this.getState();\n\t\t\tlet { mode, target } = ev;\n\t\t\tconst { id, inProgress } = ev;\n\t\t\tconst task = tasks.byId(id);\n\n\t\t\tif (typeof inProgress == \"undefined\") ev.source = task.parent;\n\t\t\telse ev.source = source = source ?? task.parent;\n\n\t\t\tif (inProgress === false) {\n\t\t\t\t// end of dnd move\n\t\t\t\ttasks.update(task.id, { $reorder: false });\n\t\t\t\tthis.setState({ tasks });\n\t\t\t\tsource = null;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (target === id || tasks.contains(id, target)) {\n\t\t\t\tev.skipProvider = true;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (mode === \"up\" || mode === \"down\") {\n\t\t\t\tconst parent = tasks.getBranch(id);\n\t\t\t\tlet taskIndex = tasks.getIndexById(id);\n\n\t\t\t\tif (mode === \"up\") {\n\t\t\t\t\tconst isRootBranch = task.parent === 0;\n\t\t\t\t\tif (taskIndex === 0 && isRootBranch) {\n\t\t\t\t\t\tev.skipProvider = true;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\ttaskIndex -= 1;\n\t\t\t\t\tmode = \"before\";\n\t\t\t\t} else if (mode === \"down\") {\n\t\t\t\t\tconst isLastIndex = taskIndex === parent.length - 1;\n\t\t\t\t\tconst isRootBranch = task.parent === 0;\n\n\t\t\t\t\tif (isLastIndex && isRootBranch) {\n\t\t\t\t\t\tev.skipProvider = true;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\ttaskIndex += 1;\n\t\t\t\t\tmode = \"after\";\n\t\t\t\t}\n\n\t\t\t\t// expected target\n\t\t\t\ttarget =\n\t\t\t\t\t(parent[taskIndex] && parent[taskIndex].id) || task.parent;\n\n\t\t\t\tif (target) {\n\t\t\t\t\tconst targetBranch = tasks.getBranch(target);\n\t\t\t\t\tlet targetIndex = tasks.getIndexById(target);\n\t\t\t\t\tlet targetTask = targetBranch[targetIndex];\n\n\t\t\t\t\t// check for branches\n\t\t\t\t\tif (targetTask.data) {\n\t\t\t\t\t\tif (mode === \"before\") {\n\t\t\t\t\t\t\tif (targetTask.parent === task.parent) {\n\t\t\t\t\t\t\t\t// return deepest branch if the task is being moved upwards\n\t\t\t\t\t\t\t\twhile (targetTask.data) {\n\t\t\t\t\t\t\t\t\tif (!targetTask.open)\n\t\t\t\t\t\t\t\t\t\tinBus.exec(\"open-task\", {\n\t\t\t\t\t\t\t\t\t\t\tid: targetTask.id,\n\t\t\t\t\t\t\t\t\t\t\tmode: true,\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\ttargetTask =\n\t\t\t\t\t\t\t\t\t\ttargetTask.data[\n\t\t\t\t\t\t\t\t\t\t\ttargetTask.data.length - 1\n\t\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttarget = targetTask.id;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (mode === \"after\") {\n\t\t\t\t\t\t\tlet targetParent;\n\t\t\t\t\t\t\tif (targetTask.parent === task.parent) {\n\t\t\t\t\t\t\t\t// target is on the same level - add it as the first child to the target branch\n\t\t\t\t\t\t\t\ttargetParent = targetTask;\n\t\t\t\t\t\t\t\ttargetTask = targetTask.data[0];\n\t\t\t\t\t\t\t\ttarget = targetTask.id;\n\n\t\t\t\t\t\t\t\tmode = \"before\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif (targetBranch.length - 1 !== targetIndex) {\n\t\t\t\t\t\t\t\t\ttargetParent = targetTask;\n\t\t\t\t\t\t\t\t\ttargetIndex += 1;\n\t\t\t\t\t\t\t\t\ttargetTask = targetBranch[targetIndex];\n\n\t\t\t\t\t\t\t\t\t// target is on a lower level - add it as the first child to the target branch\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\ttask.$level > targetTask.$level &&\n\t\t\t\t\t\t\t\t\t\ttargetTask.data\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\ttargetParent = targetTask;\n\t\t\t\t\t\t\t\t\t\ttargetTask = targetTask.data[0];\n\t\t\t\t\t\t\t\t\t\ttarget = targetTask.id;\n\n\t\t\t\t\t\t\t\t\t\tmode = \"before\";\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\ttarget = targetTask.id;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (targetParent && !targetParent.open)\n\t\t\t\t\t\t\t\tinBus.exec(\"open-task\", {\n\t\t\t\t\t\t\t\t\tid: targetParent.id,\n\t\t\t\t\t\t\t\t\tmode: true,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst oldSummary = tasks.getSummaryId(task.id);\n\n\t\t\t\t\ttasks.move(id, mode, target);\n\n\t\t\t\t\tconst newSummary = tasks.getSummaryId(id);\n\t\t\t\t\tif (oldSummary != newSummary) {\n\t\t\t\t\t\tif (oldSummary)\n\t\t\t\t\t\t\tthis.resetSummaryDates(oldSummary, \"move-task\");\n\t\t\t\t\t\tif (newSummary)\n\t\t\t\t\t\t\tthis.resetSummaryDates(newSummary, \"move-task\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst targetTask = tasks.byId(target);\n\n\t\t\t\t//prevent moving into itself, copy-paste\n\t\t\t\tlet tobj = targetTask;\n\t\t\t\tlet isDirectDescendant = false;\n\t\t\t\twhile (tobj.$level > task.$level) {\n\t\t\t\t\ttobj = tasks.byId(tobj.parent);\n\t\t\t\t\tif (tobj.id === id) isDirectDescendant = true;\n\t\t\t\t}\n\t\t\t\tif (isDirectDescendant) return;\n\n\t\t\t\tconst oldSummary = tasks.getSummaryId(task.id);\n\n\t\t\t\ttasks.move(id, mode, target);\n\n\t\t\t\tif (mode == \"child\") {\n\t\t\t\t\tlet tobj = targetTask;\n\t\t\t\t\twhile (tobj.id !== 0 && !tobj.open) {\n\t\t\t\t\t\tinBus.exec(\"open-task\", {\n\t\t\t\t\t\t\tid: tobj.id,\n\t\t\t\t\t\t\tmode: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t\ttobj = tasks.byId(tobj.parent);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst newSummary = tasks.getSummaryId(id);\n\t\t\t\tif (oldSummary != newSummary) {\n\t\t\t\t\tif (oldSummary)\n\t\t\t\t\t\tthis.resetSummaryDates(oldSummary, \"move-task\");\n\t\t\t\t\tif (newSummary)\n\t\t\t\t\t\tthis.resetSummaryDates(newSummary, \"move-task\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (inProgress)\n\t\t\t\t//smooth dnd requires sync calculations\n\t\t\t\tthis.setState({ tasks });\n\t\t\telse this.setStateAsync({ tasks });\n\n\t\t\tev.target = target;\n\t\t\tev.mode = mode;\n\t\t});\n\n\t\tinBus.on(\"drag-task\", (ev: TMethodsConfig[\"drag-task\"]) => {\n\t\t\tconst state = this.getState();\n\t\t\tconst { tasks, _tasks, _selected, _scales, cellWidth } = state;\n\t\t\tconst task = tasks.byId(ev.id);\n\t\t\t// #if [!(WX_PACKAGE_TYPE=open)]\n\t\t\tif (ev.segmentIndex >= 0 && state.splitTasks) {\n\t\t\t\tconst updated = dragSplitTask(task, ev);\n\t\t\t\tif (updated === false) {\n\t\t\t\t\tthis.setState({ _tasks });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// #endif\n\t\t\tconst { left, top, width, inProgress } = ev;\n\n\t\t\tconst update: Partial<IData> = { _tasks, _selected };\n\n\t\t\tif (typeof width !== \"undefined\") {\n\t\t\t\ttask.$w = width;\n\t\t\t\tdragSummary(tasks, task, _scales, cellWidth);\n\t\t\t}\n\t\t\tif (typeof left !== \"undefined\") {\n\t\t\t\tif (task.type === \"summary\") {\n\t\t\t\t\tconst dx = left - task.$x;\n\t\t\t\t\tdragSummaryKids(task, dx, _scales, cellWidth);\n\t\t\t\t}\n\t\t\t\ttask.$x = left;\n\t\t\t\tdragSummary(tasks, task, _scales, cellWidth);\n\t\t\t}\n\t\t\tif (typeof top !== \"undefined\") {\n\t\t\t\ttask.$y = top + 4;\n\t\t\t\ttask.$reorder = inProgress;\n\t\t\t}\n\n\t\t\tif (typeof width !== \"undefined\") task.$w = width;\n\t\t\tif (typeof left !== \"undefined\") task.$x = left;\n\t\t\tif (typeof top !== \"undefined\") {\n\t\t\t\ttask.$y = top + 4;\n\t\t\t\ttask.$reorder = inProgress;\n\t\t\t}\n\n\t\t\t// we need not calculate task position,\n\t\t\t// but we need to recalculate things which depends on task positions\n\t\t\tthis.setState(update);\n\t\t});\n\n\t\tinBus.on(\"update-task\", (ev: TMethodsConfig[\"update-task\"]) => {\n\t\t\tconst { id, segmentIndex, diff, eventSource } = ev;\n\t\t\tlet { task } = ev;\n\t\t\tconst { tasks, _scales, durationUnit, splitTasks, calendar } =\n\t\t\t\tthis.getState();\n\n\t\t\tconst t = tasks.byId(id);\n\t\t\tconst stateOptions: Partial<IData> = {\n\t\t\t\t_scales,\n\t\t\t\tdurationUnit,\n\t\t\t\tcalendar,\n\t\t\t\tsplitTasks,\n\t\t\t};\n\n\t\t\tif (\n\t\t\t\teventSource === \"add-task\" ||\n\t\t\t\teventSource === \"copy-task\" ||\n\t\t\t\teventSource === \"move-task\" ||\n\t\t\t\teventSource === \"update-task\" ||\n\t\t\t\teventSource === \"delete-task\" ||\n\t\t\t\teventSource === \"provide-data\"\n\t\t\t) {\n\t\t\t\t// #if [!(WX_PACKAGE_TYPE=open)]\n\t\t\t\tif (splitTasks && t.segments) {\n\t\t\t\t\ttask = updateSplitTask(t, task, stateOptions);\n\t\t\t\t}\n\t\t\t\t// #endif\n\n\t\t\t\tnormalizeDates(task, stateOptions);\n\t\t\t\ttasks.update(id, task);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst minUnit = _scales.lengthUnit;\n\n\t\t\tlet adder = getAdder(minUnit);\n\t\t\tconst differ = getDiffer(minUnit, calendar);\n\n\t\t\tif (diff) {\n\t\t\t\tif (task.start) task.start = adder(task.start, diff);\n\n\t\t\t\tif (!segmentIndex && segmentIndex !== 0) {\n\t\t\t\t\tif (task.start && task.end) {\n\t\t\t\t\t\ttask.duration = t.duration;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// preserve end date to recalculate duration when only start changes\n\t\t\t\t\t\tif (task.start) task.end = t.end;\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\ttask.end = adder(task.end, diff);\n\t\t\t\t\t\t\t// preserve start date and calculate duration to recalculate correct end when only end changes\n\t\t\t\t\t\t\ttask.start = t.start;\n\t\t\t\t\t\t\ttask.duration = differ(task.end, task.start);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!differ(task.end, task.start)) {\n\t\t\t\t\t\t\ttask.duration = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// #if [!(WX_PACKAGE_TYPE=open)]\n\t\t\tif (splitTasks && t.segments) {\n\t\t\t\tif (diff && segmentIndex >= 0 && task.end)\n\t\t\t\t\ttask.end = adder(task.end, diff);\n\t\t\t\ttask = updateSplitTask(\n\t\t\t\t\tt,\n\t\t\t\t\ttask,\n\t\t\t\t\tstateOptions,\n\t\t\t\t\tsegmentIndex,\n\t\t\t\t\tdiff\n\t\t\t\t);\n\t\t\t}\n\t\t\t// #endif\n\n\t\t\ttask.type = task.type ?? t.type;\n\n\t\t\t// adjust start date to nearest working day based on drag direction\n\t\t\tif (calendar && task.start)\n\t\t\t\ttask.start = adjustToWorkingDay(task.start, diff, calendar);\n\n\t\t\tif (task.start && task.end) {\n\t\t\t\tif (\n\t\t\t\t\t!isEqual(task.start, t.start) ||\n\t\t\t\t\t!isEqual(task.end, t.end)\n\t\t\t\t) {\n\t\t\t\t\tif (task.type === \"summary\" && t.data?.length) {\n\t\t\t\t\t\tlet shift = diff || differ(task.start, t.start);\n\t\t\t\t\t\tif (calendar) {\n\t\t\t\t\t\t\t//recalculate real diff\n\t\t\t\t\t\t\tshift =\n\t\t\t\t\t\t\t\ttask.start > t.start\n\t\t\t\t\t\t\t\t\t? differ(task.start, t.start)\n\t\t\t\t\t\t\t\t\t: -differ(t.start, task.start);\n\t\t\t\t\t\t\tadder = shiftByWorkingDays(calendar);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.moveSummaryKids(\n\t\t\t\t\t\t\tt,\n\t\t\t\t\t\t\tdate => {\n\t\t\t\t\t\t\t\tdate = adder(date, shift);\n\t\t\t\t\t\t\t\treturn calendar\n\t\t\t\t\t\t\t\t\t? adjustToWorkingDay(date, diff, calendar)\n\t\t\t\t\t\t\t\t\t: date;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"update-task\"\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// for partial task objects - fill related field for calculation\n\t\t\tif (!task.start) task.start = t.start;\n\t\t\tif (!task.end && !task.duration) task.duration = t.duration;\n\n\t\t\tnormalizeDates(task, stateOptions);\n\t\t\ttasks.update(id, task);\n\n\t\t\tif (\n\t\t\t\t(calendar && task.type === \"summary\") ||\n\t\t\t\t(task.type === \"summary\" && t.type !== \"summary\")\n\t\t\t) {\n\t\t\t\t//silent update for itself\n\t\t\t\tthis.resetSummaryDates(id, \"update-task\", true);\n\t\t\t}\n\n\t\t\tconst summary = tasks.getSummaryId(id);\n\t\t\tif (summary) {\n\t\t\t\tthis.resetSummaryDates(summary, \"update-task\");\n\t\t\t}\n\n\t\t\tthis.setStateAsync({ tasks });\n\n\t\t\tev.task = tasks.byId(id);\n\t\t});\n\n\t\tinBus.on(\"add-task\", (ev: TMethodsConfig[\"add-task\"]) => {\n\t\t\tconst {\n\t\t\t\ttasks,\n\t\t\t\t_scales,\n\t\t\t\tunscheduledTasks,\n\t\t\t\tdurationUnit,\n\t\t\t\tsplitTasks,\n\t\t\t\tcalendar,\n\t\t\t} = this.getState();\n\n\t\t\tconst { target, mode, task, show, select = true } = ev;\n\n\t\t\tif (!ev.eventSource && unscheduledTasks) task.unscheduled = true;\n\t\t\tlet ind = -1;\n\t\t\tlet parent;\n\t\t\tlet targetObj;\n\n\t\t\tif (target) {\n\t\t\t\ttargetObj = tasks.byId(target);\n\t\t\t\tif (mode == \"child\") {\n\t\t\t\t\tparent = targetObj;\n\t\t\t\t\ttask.parent = parent.id;\n\t\t\t\t} else {\n\t\t\t\t\tif (targetObj.parent !== null) {\n\t\t\t\t\t\tparent = tasks.byId(targetObj.parent);\n\t\t\t\t\t\ttask.parent = parent.id;\n\t\t\t\t\t}\n\t\t\t\t\tind = tasks.getIndexById(target);\n\t\t\t\t\tif (mode == \"after\") ind += 1;\n\t\t\t\t}\n\t\t\t} else if (task.parent) parent = tasks.byId(task.parent);\n\n\t\t\tif (!task.start) {\n\t\t\t\tif (parent?.start)\n\t\t\t\t\ttask.start = new Date(parent.start.valueOf());\n\t\t\t\telse if (targetObj)\n\t\t\t\t\ttask.start = new Date(targetObj.start.valueOf());\n\t\t\t\telse {\n\t\t\t\t\tconst branch = tasks.getBranch(0);\n\t\t\t\t\tlet start;\n\t\t\t\t\tif (branch?.length) {\n\t\t\t\t\t\tconst task = branch[branch.length - 1];\n\t\t\t\t\t\tif (!task.$skip) {\n\t\t\t\t\t\t\tconst d = new Date(task.start.valueOf());\n\t\t\t\t\t\t\tif (_scales.start <= d) start = d;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttask.start =\n\t\t\t\t\t\tstart ||\n\t\t\t\t\t\tgetAdder(durationUnit, calendar)(_scales.start, 1);\n\t\t\t\t}\n\t\t\t\ttask.duration = 1;\n\t\t\t}\n\n\t\t\tif (calendar)\n\t\t\t\ttask.start = adjustToWorkingDay(task.start, 1, calendar);\n\n\t\t\tif (this.getState().baselines) {\n\t\t\t\ttask.base_start = task.start;\n\t\t\t\ttask.base_duration = task.duration;\n\t\t\t}\n\n\t\t\tnormalizeDates(task, { durationUnit, splitTasks, calendar });\n\t\t\tconst newTask = tasks.add(task, ind);\n\n\t\t\tconst update: Partial<IData> = {\n\t\t\t\ttasks,\n\t\t\t};\n\n\t\t\tif (parent && show) {\n\t\t\t\twhile (parent && parent.id) {\n\t\t\t\t\tinBus.exec(\"open-task\", {\n\t\t\t\t\t\tid: parent.id,\n\t\t\t\t\t\tmode: true,\n\t\t\t\t\t});\n\t\t\t\t\tparent = tasks.byId(parent.parent);\n\t\t\t\t}\n\n\t\t\t\tupdate._scrollTask = { id: newTask.id, mode: show };\n\t\t\t}\n\n\t\t\tev.id = newTask.id;\n\n\t\t\tconst summary = tasks.getSummaryId(newTask.id);\n\t\t\tif (summary) {\n\t\t\t\tthis.resetSummaryDates(summary, \"add-task\");\n\t\t\t}\n\n\t\t\tthis.setStateAsync(update);\n\n\t\t\tev.id = newTask.id;\n\t\t\tev.task = newTask;\n\n\t\t\tif (select) inBus.exec(\"select-task\", { id: newTask.id });\n\t\t});\n\n\t\tinBus.on(\"delete-task\", (ev: TMethodsConfig[\"delete-task\"]) => {\n\t\t\tconst { id } = ev;\n\t\t\tconst { tasks, links, selected } = this.getState();\n\t\t\tev.source = tasks.byId(id).parent;\n\n\t\t\tconst summary = tasks.getSummaryId(id);\n\n\t\t\tconst toRemove = [id];\n\t\t\ttasks.eachChild(t => toRemove.push(t.id), id);\n\t\t\tlinks.filter(a => {\n\t\t\t\treturn !(\n\t\t\t\t\ttoRemove.includes(a.source) || toRemove.includes(a.target)\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tconst update: Partial<IData> = { tasks, links };\n\t\t\tif (selected.includes(id)) {\n\t\t\t\tupdate.selected = selected.filter(sel => sel !== id);\n\t\t\t}\n\n\t\t\ttasks.remove(id);\n\n\t\t\tif (summary) {\n\t\t\t\tthis.resetSummaryDates(summary, \"delete-task\");\n\t\t\t}\n\n\t\t\tthis.setStateAsync(update);\n\t\t});\n\n\t\tinBus.on(\n\t\t\t\"indent-task\",\n\t\t\t({ id, mode }: TMethodsConfig[\"indent-task\"]) => {\n\t\t\t\tconst { tasks } = this.getState();\n\t\t\t\tif (mode) {\n\t\t\t\t\t// Increase indentation\n\t\t\t\t\tconst parent = tasks.getBranch(id);\n\t\t\t\t\tconst targetTask = parent[tasks.getIndexById(id) - 1];\n\n\t\t\t\t\tif (targetTask)\n\t\t\t\t\t\tinBus.exec(\"move-task\", {\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\tmode: \"child\",\n\t\t\t\t\t\t\ttarget: targetTask.id,\n\t\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Decrease indentation\n\t\t\t\t\tconst task = tasks.byId(id);\n\t\t\t\t\tconst targetTask = tasks.byId(task.parent);\n\n\t\t\t\t\tif (targetTask && targetTask.parent !== null)\n\t\t\t\t\t\tinBus.exec(\"move-task\", {\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\tmode: \"after\",\n\t\t\t\t\t\t\ttarget: task.parent,\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\n\t\tinBus.on(\"copy-task\", (ev: TMethodsConfig[\"copy-task\"]) => {\n\t\t\tconst { id, target, mode, eventSource } = ev;\n\t\t\tif (eventSource === \"copy-task\") return;\n\n\t\t\tconst { tasks, links } = this.getState();\n\t\t\tif (tasks.contains(id, target)) {\n\t\t\t\tev.skipProvider = true;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst oldSummary = tasks.getSummaryId(id);\n\t\t\tconst newSummary = tasks.getSummaryId(target);\n\n\t\t\tlet ind = tasks.getIndexById(target);\n\t\t\tif (mode == \"before\") ind -= 1;\n\n\t\t\tconst origin = tasks.byId(id);\n\t\t\tconst idPairs = tasks.copy(\n\t\t\t\torigin,\n\t\t\t\ttasks.byId(target).parent,\n\t\t\t\tind + 1\n\t\t\t);\n\n\t\t\tev.source = ev.id;\n\t\t\tev.id = idPairs[0][1];\n\t\t\tif (origin.lazy) ev.lazy = true;\n\n\t\t\tif (oldSummary != newSummary && newSummary)\n\t\t\t\tthis.resetSummaryDates(newSummary, \"copy-task\");\n\n\t\t\tlet linkCopies: ILink[] = [];\n\t\t\tfor (let i = 1; i < idPairs.length; i++) {\n\t\t\t\tconst [id, newId] = idPairs[i];\n\t\t\t\tlinks.forEach(link => {\n\t\t\t\t\tif (link.source === id) {\n\t\t\t\t\t\tconst l = { ...link };\n\t\t\t\t\t\tdelete l.target;\n\t\t\t\t\t\tlinkCopies.push({\n\t\t\t\t\t\t\t...l,\n\t\t\t\t\t\t\tsource: newId,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (link.target === id) {\n\t\t\t\t\t\tconst l = { ...link };\n\t\t\t\t\t\tdelete l.source;\n\t\t\t\t\t\tlinkCopies.push({\n\t\t\t\t\t\t\t...l,\n\t\t\t\t\t\t\ttarget: newId,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlinkCopies = linkCopies.reduce((arr, l) => {\n\t\t\t\tconst match = arr.findIndex(r => r.id === l.id);\n\t\t\t\tif (match > -1) arr[match] = { ...arr[match], ...l };\n\t\t\t\telse arr.push(l);\n\t\t\t\treturn arr;\n\t\t\t}, []);\n\n\t\t\tfor (let i = 1; i < idPairs.length; i++) {\n\t\t\t\tconst [id, newId] = idPairs[i];\n\t\t\t\tconst copy = tasks.byId(newId);\n\n\t\t\t\tinBus.exec(\"copy-task\", {\n\t\t\t\t\tsource: id,\n\t\t\t\t\tid: newId,\n\t\t\t\t\tlazy: !!copy.lazy,\n\t\t\t\t\teventSource: \"copy-task\",\n\t\t\t\t\ttarget: copy.parent,\n\t\t\t\t\tmode: \"child\",\n\t\t\t\t\tskipUndo: true,\n\t\t\t\t});\n\t\t\t}\n\t\t\t// relink copied branch links\n\t\t\tlinkCopies.forEach(link => {\n\t\t\t\tinBus.exec(\"add-link\", {\n\t\t\t\t\tlink: {\n\t\t\t\t\t\tsource: link.source,\n\t\t\t\t\t\ttarget: link.target,\n\t\t\t\t\t\ttype: link.type,\n\t\t\t\t\t},\n\t\t\t\t\teventSource: \"copy-task\",\n\t\t\t\t\tskipUndo: true,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tthis.setStateAsync({ tasks });\n\t\t});\n\n\t\tinBus.on(\"open-task\", ({ id, mode }: TMethodsConfig[\"open-task\"]) => {\n\t\t\tconst { tasks } = this.getState();\n\t\t\tconst task = tasks.byId(id);\n\n\t\t\tif (task.lazy) inBus.exec(\"request-data\", { id: task.id });\n\t\t\telse {\n\t\t\t\ttasks.toArray().forEach(t => (t.$y = 0));\n\t\t\t\ttasks.update(id, { open: mode });\n\t\t\t\tthis.setState({ tasks });\n\t\t\t}\n\t\t});\n\n\t\tinBus.on(\n\t\t\t\"scroll-chart\",\n\t\t\t({ left, top }: TMethodsConfig[\"scroll-chart\"]) => {\n\t\t\t\tif (!isNaN(left)) {\n\t\t\t\t\tconst d = this.calcScaleDate(left);\n\t\t\t\t\tthis.setState({\n\t\t\t\t\t\tscrollLeft: left,\n\t\t\t\t\t\t_scaleDate: d,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (!isNaN(top)) this.setState({ scrollTop: top });\n\t\t\t}\n\t\t);\n\n\t\tinBus.on(\"render-data\", (ev: TMethodsConfig[\"render-data\"]) => {\n\t\t\tthis.setState({ area: ev });\n\t\t});\n\n\t\tinBus.on(\"provide-data\", (ev: TMethodsConfig[\"provide-data\"]) => {\n\t\t\tconst { tasks, links, durationUnit, calendar, splitTasks } =\n\t\t\t\tthis.getState();\n\t\t\tconst parent = tasks.byId(ev.id);\n\n\t\t\tif (parent.lazy) {\n\t\t\t\tparent.lazy = false;\n\t\t\t\tparent.open = true;\n\t\t\t} else parent.data = [];\n\n\t\t\tparseTaskDates(ev.data.tasks, {\n\t\t\t\tdurationUnit,\n\t\t\t\tsplitTasks,\n\t\t\t\tcalendar,\n\t\t\t});\n\t\t\ttasks.parse(ev.data.tasks, ev.id);\n\t\t\tif (parent.type == \"summary\")\n\t\t\t\tthis.resetSummaryDates(parent.id, \"provide-data\");\n\t\t\t// fixme: DataArray needs the parse() method\n\t\t\tthis.setStateAsync({\n\t\t\t\ttasks,\n\t\t\t\tlinks: new DataArray(\n\t\t\t\t\tlinks.map(l => l).concat(normalizeLinks(ev.data.links))\n\t\t\t\t),\n\t\t\t});\n\t\t});\n\n\t\tinBus.on(\n\t\t\t\"zoom-scale\",\n\t\t\t({ dir, offset }: TMethodsConfig[\"zoom-scale\"]) => {\n\t\t\t\tconst { zoom, cellWidth, _cellWidth, scrollLeft } =\n\t\t\t\t\tthis.getState();\n\t\t\t\tconst pointerX = offset + scrollLeft;\n\t\t\t\tconst date = this.calcScaleDate(pointerX);\n\t\t\t\tlet w = cellWidth;\n\t\t\t\tif (dir < 0) w = _cellWidth || cellWidth;\n\t\t\t\tconst width = w + dir * 50; // 50px is a zoom step\n\t\t\t\tconst currentLevel = zoom.levels[zoom.level];\n\t\t\t\tconst isExpanded =\n\t\t\t\t\tdir < 0 && cellWidth > currentLevel.maxCellWidth;\n\t\t\t\tif (\n\t\t\t\t\twidth < currentLevel.minCellWidth ||\n\t\t\t\t\twidth > currentLevel.maxCellWidth ||\n\t\t\t\t\tisExpanded\n\t\t\t\t) {\n\t\t\t\t\tif (!this.changeScale(zoom, dir)) return;\n\t\t\t\t} else {\n\t\t\t\t\tthis.setState({ cellWidth: width, _cellWidth: width });\n\t\t\t\t}\n\n\t\t\t\tconst {\n\t\t\t\t\t_scales,\n\t\t\t\t\t_start,\n\t\t\t\t\tcellWidth: cw,\n\t\t\t\t\t_weekStart,\n\t\t\t\t} = this.getState();\n\t\t\t\tconst start = getUnitStart(_scales.minUnit, _start, _weekStart);\n\t\t\t\tconst num = _scales.diff(date, start, \"hour\");\n\t\t\t\tif (typeof offset === \"undefined\") offset = cw;\n\t\t\t\tlet newScrollLeft = Math.round(num * cw) - offset;\n\t\t\t\tif (newScrollLeft < 0) {\n\t\t\t\t\tnewScrollLeft = 0;\n\t\t\t\t}\n\n\t\t\t\tthis.setState({\n\t\t\t\t\tscrollLeft: newScrollLeft,\n\t\t\t\t\t_scaleDate: date,\n\t\t\t\t\t_zoomOffset: offset,\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\n\t\tinBus.on(\n\t\t\t\"expand-scale\",\n\t\t\t({ minWidth }: TMethodsConfig[\"expand-scale\"]) => {\n\t\t\t\tconst {\n\t\t\t\t\t_start,\n\t\t\t\t\t_scales,\n\t\t\t\t\tstart,\n\t\t\t\t\tend,\n\t\t\t\t\t_end,\n\t\t\t\t\tcellWidth,\n\t\t\t\t\t_scaleDate,\n\t\t\t\t\t_zoomOffset,\n\t\t\t\t} = this.getState();\n\t\t\t\tconst adder = getAdder(_scales.minUnit);\n\n\t\t\t\tlet width = _scales.width;\n\t\t\t\tif (start && end) {\n\t\t\t\t\tif (width < minWidth && width) {\n\t\t\t\t\t\tconst k = minWidth / width;\n\t\t\t\t\t\tthis.setState({\n\t\t\t\t\t\t\tcellWidth: cellWidth * k,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tlet step = 0;\n\t\t\t\twhile (width < minWidth) {\n\t\t\t\t\twidth += cellWidth;\n\t\t\t\t\tstep++;\n\t\t\t\t}\n\n\t\t\t\tconst startStep = step ? (end ? -step : -1) : 0;\n\t\t\t\tconst newStart = start || adder(_start, startStep);\n\t\t\t\tlet newScroll = 0;\n\t\t\t\tif (_scaleDate) {\n\t\t\t\t\tconst num = _scales.diff(_scaleDate, newStart, \"hour\");\n\t\t\t\t\tnewScroll = Math.max(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tMath.round(num * cellWidth) - (_zoomOffset || 0)\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tthis.setState({\n\t\t\t\t\t_start: newStart,\n\t\t\t\t\t_end: end || adder(_end, step),\n\t\t\t\t\tscrollLeft: newScroll,\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\t\tinBus.on(\n\t\t\t\"sort-tasks\",\n\t\t\t({ key, order, add }: TMethodsConfig[\"sort-tasks\"]) => {\n\t\t\t\tconst state = this.getState();\n\t\t\t\tconst { tasks } = state;\n\t\t\t\tlet sort = state._sort;\n\t\t\t\tconst sortBy: TSort = { key, order };\n\n\t\t\t\tlet index = sort?.length || 0;\n\t\t\t\tif (index && add) {\n\t\t\t\t\tsort.forEach((a, i) => {\n\t\t\t\t\t\tif (a.key === key) index = i;\n\t\t\t\t\t});\n\t\t\t\t\tsort[index] = sortBy;\n\t\t\t\t} else sort = [sortBy];\n\n\t\t\t\ttasks.sort(sort);\n\t\t\t\tthis.setState({ _sort: sort, tasks });\n\t\t\t}\n\t\t);\n\t\tinBus.on(\n\t\t\t\"hotkey\",\n\t\t\t({ key, event, eventSource }: IDataMethodsConfig[\"hotkey\"]) => {\n\t\t\t\tswitch (key) {\n\t\t\t\t\tcase \"arrowup\":\n\t\t\t\t\tcase \"arrowdown\": {\n\t\t\t\t\t\tconst { selected, _tasks } = this.getState();\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tconst len = selected.length;\n\t\t\t\t\t\tlet id;\n\t\t\t\t\t\tif (key === \"arrowup\") {\n\t\t\t\t\t\t\tid = len\n\t\t\t\t\t\t\t\t? this.getPrevRow(selected[len - 1])?.id\n\t\t\t\t\t\t\t\t: _tasks[_tasks.length - 1]?.id;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tid = len\n\t\t\t\t\t\t\t\t? this.getNextRow(selected[len - 1])?.id\n\t\t\t\t\t\t\t\t: _tasks[0]?.id;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (id) {\n\t\t\t\t\t\t\tconst show = eventSource === \"chart\" ? \"xy\" : true;\n\t\t\t\t\t\t\tthis.in.exec(\"select-task\", { id, show });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"ctrl+c\": {\n\t\t\t\t\t\thandleAction(this, \"copy-task\", null, null);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"ctrl+x\": {\n\t\t\t\t\t\thandleAction(this, \"cut-task\", null, null);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"ctrl+v\": {\n\t\t\t\t\t\thandleAction(this, \"paste-task\", null, null);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"ctrl+d\":\n\t\t\t\t\tcase \"backspace\": {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\thandleAction(this, \"delete-task\", null, null);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"ctrl+z\": {\n\t\t\t\t\t\tthis.in.exec(\"undo\", {});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"ctrl+y\": {\n\t\t\t\t\t\tthis.in.exec(\"redo\", {});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t/*case \"ctrl+e\": {\n\t\t\t\t\tconst { selected, _tasks } = this.getState();\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tconst id = selected.length\n\t\t\t\t\t\t? selected[selected.length - 1]\n\t\t\t\t\t\t: _tasks[0]?.id;\n\n\t\t\t\t\tthis.in.exec(\"show-editor\", { id });\n\t\t\t\t\tbreak;\n\t\t\t\t}*/\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t\t// #if [!(WX_PACKAGE_TYPE=open)]\n\t\tinBus.on(\"undo\", () => {\n\t\t\tthis.getHistory()?.handleUndo();\n\t\t});\n\t\tinBus.on(\"redo\", () => {\n\t\t\tthis.getHistory()?.handleRedo();\n\t\t});\n\t\tinBus.on(\n\t\t\t\"split-task\",\n\t\t\t({ id, segmentIndex }: TMethodsConfig[\"split-task\"]) => {\n\t\t\t\tconst state = this.getState();\n\t\t\t\tconst { tasks, _scales, durationUnit, splitTasks, calendar } =\n\t\t\t\t\tstate;\n\t\t\t\tif (!splitTasks) return;\n\t\t\t\tconst task = tasks.byId(id);\n\t\t\t\tif (isIndivisibleType(task)) return;\n\n\t\t\t\tconst update = splitTask(task, segmentIndex, {\n\t\t\t\t\t_scales,\n\t\t\t\t\tdurationUnit,\n\t\t\t\t\tcalendar,\n\t\t\t\t\tsplitTasks,\n\t\t\t\t});\n\n\t\t\t\tif (update) {\n\t\t\t\t\tinBus.exec(\"update-task\", {\n\t\t\t\t\t\tid,\n\t\t\t\t\t\ttask: update,\n\t\t\t\t\t\teventSource: \"split-task\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t\t// #endif\n\t}\n\n\tinit(state: Partial<IDataConfig>) {\n\t\tconst update: Partial<IDataConfig> = this.getState().area\n\t\t\t? {}\n\t\t\t: {\n\t\t\t\t\tscrollLeft: 0,\n\t\t\t\t\tscrollTop: 0,\n\t\t\t\t\tarea: { from: 0, start: 0, end: 0 },\n\t\t\t\t};\n\n\t\tif (state.cellWidth) state._cellWidth = state.cellWidth;\n\t\tstate._sort = null;\n\n\t\tif (isCommunity()) {\n\t\t\tstate.unscheduledTasks = false;\n\t\t\tstate.baselines = false;\n\t\t\tstate.markers = [];\n\t\t\tstate._markers = [];\n\t\t\tstate.undo = false;\n\t\t\tstate.schedule = {};\n\t\t\tstate.criticalPath = null;\n\t\t\tstate.splitTasks = false;\n\t\t}\n\n\t\tif (Array.isArray(state.tasks)) {\n\t\t\tthis.getHistory()?.resetHistory();\n\t\t}\n\n\t\tthis._router.init({\n\t\t\t_scrollTask: null,\n\t\t\tselected: [],\n\t\t\tmarkers: [],\n\t\t\tautoScale: true,\n\t\t\tdurationUnit: \"day\",\n\t\t\t...update,\n\t\t\t...state,\n\t\t});\n\n\t\t// [FIXME] reacts to any external changes to props\n\t\t// must compare prev. and current state (+use the initOnce logic?)\n\n\t\t// #if [!(WX_PACKAGE_TYPE=open)]\n\t\tif (state.schedule?.auto) {\n\t\t\tconst scheduler = this.enableModule(\n\t\t\t\t\"autoScheduler\",\n\t\t\t\tAutoSchedulerModule\n\t\t\t);\n\t\t\t// initial scheduling\n\t\t\tscheduler.schedule(0, true);\n\t\t} else {\n\t\t\tthis.disableModule(\"autoScheduler\");\n\t\t}\n\n\t\tif (state.criticalPath) {\n\t\t\tconst criticalPath = this.enableModule(\n\t\t\t\t\"criticalPath\",\n\t\t\t\tCriticalPathModule\n\t\t\t);\n\t\t\t// initial critical path calculation\n\t\t\tcriticalPath.calculate();\n\t\t} else {\n\t\t\tthis.disableModule(\"criticalPath\");\n\t\t}\n\n\t\tif (state.undo) {\n\t\t\tthis.enableModule(\"historyManager\", HistoryManager);\n\t\t} else this.disableModule(\"historyManager\");\n\t\t// #endif\n\t}\n\t// #if [!(WX_PACKAGE_TYPE=open)]\n\tprivate enableModule<T extends EventTracker>(\n\t\tname: string,\n\t\tModuleClass: new (...args: any[]) => T\n\t): T {\n\t\tif (!this._modules.has(name)) {\n\t\t\tconst plugin = new ModuleClass(\n\t\t\t\tthis.in,\n\t\t\t\tthis.getState.bind(this),\n\t\t\t\tthis.setState.bind(this),\n\t\t\t\tthis.getHistory.bind(this)\n\t\t\t);\n\t\t\tplugin.init();\n\t\t\tthis._modules.set(name, plugin);\n\t\t\treturn plugin;\n\t\t}\n\t\treturn this._modules.get(name) as T;\n\t}\n\n\tprivate disableModule(name: string) {\n\t\tconst plugin = this._modules.get(name);\n\t\tif (plugin) {\n\t\t\tplugin.destroy();\n\t\t\tthis._modules.delete(name);\n\t\t}\n\t}\n\t// #endif\n\n\tsetState(state: Partial<IData>, ctx?: TDataConfig) {\n\t\treturn this._router.setState(state, ctx);\n\t}\n\n\tsetStateAsync(state: Partial<IData>) {\n\t\tthis._router.setStateAsync(state);\n\t}\n\n\tgetTask(id: TID) {\n\t\tconst { tasks } = this.getState();\n\t\treturn tasks.byId(id);\n\t}\n\n\tgetHistory() {\n\t\tif (!this.getState().undo) return null;\n\t\treturn this._modules.get(\"historyManager\") as\n\t\t\t| HistoryManager\n\t\t\t| undefined;\n\t}\n\n\tserialize() {\n\t\tconst { tasks } = this.getState();\n\t\treturn tasks.serialize();\n\t}\n\n\tprivate changeScale(zoom: IZoomConfig, step: number) {\n\t\tconst level = zoom.level + step;\n\t\tconst nextUnit = zoom.levels[level];\n\t\tif (nextUnit) {\n\t\t\tconst { cellWidth, scales, _scales } = this.getState();\n\t\t\tconst scaleState: Partial<IData> = zoomScale(\n\t\t\t\tzoom,\n\t\t\t\tstep,\n\t\t\t\tlevel,\n\t\t\t\tnextUnit,\n\t\t\t\t_scales.lengthUnit,\n\t\t\t\tscales,\n\t\t\t\tcellWidth\n\t\t\t);\n\t\t\tscaleState._cellWidth = scaleState.cellWidth;\n\t\t\tthis.setState(scaleState);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate isScheduled(data: ITask[]) {\n\t\tif (!this.getState().unscheduledTasks) return true;\n\n\t\tconst result = data.some((kid: ITask) => {\n\t\t\treturn !kid.unscheduled || (kid.data && this.isScheduled(kid.data));\n\t\t});\n\t\treturn result;\n\t}\n\n\tprivate resetSummaryDates(id: TID, eventSource: string, silent?: boolean) {\n\t\tconst { tasks, durationUnit, splitTasks, calendar } = this.getState();\n\t\tconst obj = tasks.byId(id);\n\t\tconst kids = obj.data;\n\n\t\t// do not reset dates if there are no kids or all kids are unscheduled\n\t\tif (kids?.length && this.isScheduled(kids)) {\n\t\t\tconst task = setSummaryDates({\n\t\t\t\t...obj,\n\t\t\t\tstart: undefined,\n\t\t\t\tend: undefined,\n\t\t\t\tduration: undefined,\n\t\t\t});\n\n\t\t\tif (\n\t\t\t\t!isEqual(obj.start, task.start) ||\n\t\t\t\t!isEqual(obj.end, task.end)\n\t\t\t) {\n\t\t\t\tif (silent) {\n\t\t\t\t\tnormalizeDates(task, {\n\t\t\t\t\t\tdurationUnit,\n\t\t\t\t\t\tsplitTasks,\n\t\t\t\t\t\tcalendar,\n\t\t\t\t\t});\n\t\t\t\t\ttasks.update(id, task);\n\t\t\t\t} else\n\t\t\t\t\tthis.in.exec(\"update-task\", {\n\t\t\t\t\t\tid,\n\t\t\t\t\t\ttask,\n\t\t\t\t\t\teventSource,\n\t\t\t\t\t\tskipUndo: true,\n\t\t\t\t\t});\n\n\t\t\t\tconst summary = tasks.getSummaryId(id);\n\t\t\t\tif (summary) this.resetSummaryDates(summary, eventSource);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate moveSummaryKids(\n\t\ttask: Partial<ITask>,\n\t\tmove: (date: Date) => Date,\n\t\teventSource: string\n\t) {\n\t\tconst { tasks } = this.getState();\n\n\t\ttask.data.forEach((kid: IParsedTask) => {\n\t\t\tconst task = {\n\t\t\t\t...tasks.byId(kid.id),\n\t\t\t\tstart: move(kid.start),\n\t\t\t};\n\t\t\tdelete task.end;\n\t\t\tdelete task.id;\n\t\t\tthis.in.exec(\"update-task\", {\n\t\t\t\tid: kid.id,\n\t\t\t\ttask,\n\t\t\t\teventSource,\n\t\t\t\tskipUndo: true,\n\t\t\t});\n\n\t\t\tif (kid.data?.length) this.moveSummaryKids(kid, move, eventSource);\n\t\t});\n\t}\n\n\tprivate calcScaleDate(x: number) {\n\t\tconst { _scales, _start, _weekStart } = this.getState();\n\t\tconst width =\n\t\t\t_scales.lengthUnit === \"day\"\n\t\t\t\t? _scales.lengthUnitWidth / 24\n\t\t\t\t: _scales.lengthUnitWidth;\n\t\treturn getAdder(\"hour\")(\n\t\t\tgetUnitStart(_scales.minUnit, _start, _weekStart),\n\t\t\tMath.floor(x / width)\n\t\t);\n\t}\n\tgetNextRow(id: TID): IParsedTask {\n\t\tconst data = this.getState()._tasks;\n\t\tconst index = data.findIndex((t: IParsedTask) => t.id == id);\n\t\treturn data[index + 1];\n\t}\n\n\tgetPrevRow(id: TID): IParsedTask {\n\t\tconst data = this.getState()._tasks;\n\t\tconst index = data.findIndex((t: IParsedTask) => t.id == id);\n\t\treturn data[index - 1];\n\t}\n}\n\ntype CombineTypes<T, N> = {\n\t[P in keyof T]: T[P] & N;\n};\n\nexport type IDataMethodsConfig = CombineTypes<\n\t{\n\t\t[\"add-task\"]: {\n\t\t\tid?: TID;\n\t\t\ttask: Partial<ITask>;\n\t\t\ttarget?: TID;\n\t\t\tmode?: \"before\" | \"after\" | \"child\";\n\t\t\tshow?: TScrollTask[\"mode\"];\n\t\t\tselect?: boolean;\n\t\t\teventSource?: string;\n\t\t};\n\t\t[\"update-task\"]: {\n\t\t\tid: TID;\n\t\t\tsegmentIndex?: number;\n\t\t\ttask: Partial<ITask>;\n\t\t\tdiff?: number;\n\t\t\tinProgress?: boolean;\n\t\t\teventSource?: string;\n\t\t\tskipUndo?: boolean;\n\t\t};\n\t\t[\"delete-task\"]: { id: TID; source?: TID };\n\t\t[\"open-task\"]: { id: TID; mode: boolean };\n\t\t[\"select-task\"]: {\n\t\t\tid: TID;\n\t\t\ttoggle?: boolean;\n\t\t\trange?: boolean;\n\t\t\tshow?: TScrollTask[\"mode\"];\n\t\t};\n\t\t[\"drag-task\"]: {\n\t\t\tid: TID;\n\t\t\tsegmentIndex?: number;\n\t\t\twidth?: number;\n\t\t\tleft?: number;\n\t\t\ttop?: number;\n\t\t\tinProgress?: boolean;\n\t\t};\n\t\t[\"copy-task\"]: {\n\t\t\tid: TID;\n\t\t\ttarget?: TID;\n\t\t\tmode?: \"before\" | \"after\" | \"child\";\n\t\t\tsource?: TID;\n\t\t\tlazy?: boolean;\n\t\t\teventSource?: string;\n\t\t\tskipUndo?: boolean;\n\t\t};\n\t\t[\"move-task\"]: {\n\t\t\tid: TID;\n\t\t\ttarget?: TID;\n\t\t\tmode: \"before\" | \"after\" | \"up\" | \"down\" | \"child\";\n\t\t\tinProgress?: boolean;\n\t\t\tsource?: TID;\n\t\t};\n\n\t\t[\"indent-task\"]: { id: TID; mode: boolean };\n\n\t\t[\"show-editor\"]: { id: TID };\n\t\t[\"add-link\"]: {\n\t\t\tid?: TID;\n\t\t\tlink: Partial<ILink>;\n\t\t\teventSource?: string;\n\t\t\tskipUndo: boolean;\n\t\t};\n\t\t[\"update-link\"]: { id: TID; link: Partial<ILink> };\n\t\t[\"delete-link\"]: { id: TID };\n\n\t\t[\"scroll-chart\"]: { left?: number; top?: number };\n\t\t[\"render-data\"]: IVisibleArea;\n\t\t[\"request-data\"]: {\n\t\t\tid: TID;\n\t\t};\n\t\t[\"provide-data\"]: {\n\t\t\tid: TID;\n\t\t\tdata: {\n\t\t\t\ttasks?: Array<ITask>;\n\t\t\t\tlinks?: Array<ILink>;\n\t\t\t};\n\t\t};\n\n\t\t[\"zoom-scale\"]: { dir: number; date: Date; offset?: number };\n\t\t[\"expand-scale\"]: {\n\t\t\tminWidth: number;\n\t\t\tdate?: Date;\n\t\t\toffset?: number;\n\t\t};\n\t\t[\"sort-tasks\"]: { key: string; order: \"asc\" | \"desc\"; add?: boolean };\n\t\t[\"hotkey\"]: {\n\t\t\tkey: string;\n\t\t\tevent: any;\n\t\t\teventSource?: string;\n\t\t};\n\t\t[\"schedule-tasks\"]: {\n\t\t\tid?: TID;\n\t\t\ttask?: Partial<ITask>;\n\t\t};\n\t\t[\"undo\"]: void;\n\t\t[\"redo\"]: void;\n\t\t[\"split-task\"]: { id: TID; segmentIndex?: number };\n\t},\n\t{\n\t\tskipProvider?: boolean;\n\t\tspipUndo?: boolean;\n\t\t[key: string]: any;\n\t}\n>;\n","// #if [WX_PACKAGE_TYPE=trial]\nimport { isValid, isExpired } from \"../package\";\n// #endif\n\nexport function grid(\n\twidth: number,\n\theight: number,\n\tcolor: string,\n\tmode?: \"full\"\n): string {\n\t// FIXME :: Svelte-kit\n\tif (typeof document === \"undefined\") return \"\";\n\tconst canvas = document.createElement(\"canvas\");\n\n\tlet fillMode = true;\n\t// #if [WX_PACKAGE_TYPE=trial]\n\tfillMode = isValid();\n\tif (!fillMode) {\n\t\tconst ctx = canvasSize(canvas, width, height, 3, color);\n\t\tconst expired = isExpired();\n\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tfor (let j = 0; j < 3; j++) {\n\t\t\t\trenderCell(\n\t\t\t\t\tctx,\n\t\t\t\t\tmode,\n\t\t\t\t\twidth * i,\n\t\t\t\t\twidth * (i + 1),\n\t\t\t\t\theight * j,\n\t\t\t\t\theight * (j + 1)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tctx.font = \"10px monospace\";\n\t\tctx.fillStyle = expired ? \"#ff0000\" : \"#CCCCCC\";\n\t\tctx.translate(width * (expired ? 1.35 : 1.5), height * 1.5);\n\t\tctx.rotate(Math.PI / 6);\n\t\tctx.fillText(\n\t\t\texpired ? atob(\"VFJJQUwgRVhQSVJFRA==\") : atob(\"VFJJQUw=\"),\n\t\t\t-15,\n\t\t\t4\n\t\t);\n\t}\n\t// #endif\n\n\tif (fillMode) {\n\t\tconst ctx = canvasSize(canvas, width, height, 1, color);\n\t\trenderCell(ctx, mode, 0, width, 0, height);\n\t}\n\t// #endif\n\treturn canvas.toDataURL();\n}\n\nfunction canvasSize(\n\tcanvas: HTMLCanvasElement,\n\twidth: number,\n\theight: number,\n\tzoom: number,\n\tcolor: string\n): CanvasRenderingContext2D {\n\tcanvas.setAttribute(\"width\", (width * zoom).toString());\n\tcanvas.setAttribute(\"height\", (height * zoom).toString());\n\tconst ctx = canvas.getContext(\"2d\");\n\tctx.translate(-0.5, -0.5);\n\tctx.strokeStyle = color;\n\n\treturn ctx;\n}\n\nfunction renderCell(\n\tctx: CanvasRenderingContext2D,\n\tmode: string,\n\txA: number,\n\txB: number,\n\tyA: number,\n\tyB: number\n) {\n\tctx.beginPath();\n\tctx.moveTo(xB, yA);\n\tctx.lineTo(xB, yB);\n\n\tif (mode === \"full\") ctx.lineTo(xA, yB);\n\tctx.stroke();\n}\n","import type { TID } from \"@svar-ui/lib-state\";\nimport type {\n\tITask,\n\tIParsedTask,\n\tIHistory,\n\tIData,\n\tIDataConfig,\n\tIDataHash,\n} from \"../types\";\n// #if [!(WX_PACKAGE_TYPE=open)]\nimport { isIndivisible } from \"../pro/splitTasks\";\n// #endif\n\nexport function getMenuOptions(config?: IDataConfig) {\n\tlet options = [...defaultMenuOptions];\n\n\t// #if [!(WX_PACKAGE_TYPE=open)]\n\tif (config?.splitTasks) {\n\t\toptions.splice(4, 0, {\n\t\t\tid: \"split-task\",\n\t\t\ttext: \"Split\",\n\t\t\ticon: \"wxi-arrow-split\",\n\t\t});\n\t\toptions.splice(4, 0, {\n\t\t\tid: \"edit\",\n\t\t\ttext: \"Edit\",\n\t\t\ticon: \"wxi-edit\",\n\t\t\tdata: [\n\t\t\t\t{\n\t\t\t\t\tid: \"edit-task:task\",\n\t\t\t\t\ttext: \"Task\",\n\t\t\t\t\tisHidden: (t, s, target) => !isSegment(target),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"edit-task:segment\",\n\t\t\t\t\ttext: \"Segment\",\n\t\t\t\t\tisHidden: (t, s, target) => !isSegment(target),\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\t\toptions.push({\n\t\t\tid: \"delete\",\n\t\t\ticon: \"wxi-delete\",\n\t\t\ttext: \"Delete\",\n\t\t\tdata: [\n\t\t\t\t{\n\t\t\t\t\tid: \"delete-task:task\",\n\t\t\t\t\ttext: \"Task\",\n\t\t\t\t\tisHidden: (t, s, target) =>\n\t\t\t\t\t\t!isSingle(s) || !isSegment(target),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"delete-task:segment\",\n\t\t\t\t\ttext: \"Segment\",\n\t\t\t\t\tisHidden: (t, s, target) =>\n\t\t\t\t\t\t!isSingle(s) || !isSegment(target),\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\t}\n\tif (options.length > defaultMenuOptions.length)\n\t\toptions = assignChecks(options);\n\t// #endif\n\treturn options;\n}\n\nexport interface IOptionConfig {\n\tid?: TID;\n\tseparator?: boolean;\n\ttext?: string;\n\ticon?: string;\n\tdata?: IOptionConfig[];\n\ttype?: string;\n\tisDisabled?:\n\t\t| ((\n\t\t\t\ttask: IParsedTask,\n\t\t\t\tstate: IData,\n\t\t\t\ttarget?: TID | IDataHash\n\t\t ) => boolean)\n\t\t| ((history: IHistory) => boolean);\n\tdataFactory?: (obj: any) => IOptionConfig;\n\tsubtext?: string;\n\tisHidden?: (\n\t\ttask: IParsedTask,\n\t\tstate: IData,\n\t\ttarget?: TID | IDataHash\n\t) => boolean;\n}\n\nexport function assignChecks<T extends IOptionConfig>(items: T[]): T[] {\n\treturn items.map(item => {\n\t\tif (item.data) assignChecks(item.data);\n\n\t\tswitch (item.id) {\n\t\t\tcase \"add-task:before\":\n\t\t\tcase \"move-task:up\":\n\t\t\t\titem.isDisabled = (task, state) => isFirstTask(task, state);\n\t\t\t\tbreak;\n\t\t\tcase \"move-task:down\":\n\t\t\t\titem.isDisabled = (task, state) => isLastTask(task, state);\n\t\t\t\tbreak;\n\t\t\tcase \"indent-task:add\":\n\t\t\t\titem.isDisabled = (task, state) =>\n\t\t\t\t\tprevTaskID(task, state) === task.parent;\n\t\t\t\tbreak;\n\t\t\tcase \"indent-task:remove\":\n\t\t\t\titem.isDisabled = (task: IParsedTask) => isRootTask(task);\n\t\t\t\tbreak;\n\t\t\t// #if [!(WX_PACKAGE_TYPE=open)]\n\t\t\tcase \"undo\":\n\t\t\t\titem.isDisabled = (history: IHistory) => !history.undo;\n\t\t\t\tbreak;\n\t\t\tcase \"redo\":\n\t\t\t\titem.isDisabled = (history: IHistory) => !history.redo;\n\t\t\t\tbreak;\n\t\t\tcase \"split-task\":\n\t\t\t\titem.isDisabled = (task, state, target) => {\n\t\t\t\t\tlet index;\n\t\t\t\t\tif (typeof target === \"object\") index = target.segmentIndex;\n\t\t\t\t\treturn isIndivisible(task, state, index);\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\t// #endif\n\t\t}\n\t\treturn item;\n\t});\n}\n\nfunction isRootTask(task: ITask) {\n\treturn task.parent === 0;\n}\n\nfunction isFirstTask(task: ITask, state: IData): boolean {\n\tconst { _tasks } = state;\n\treturn _tasks[0]?.id === task.id;\n}\nfunction isLastTask(task: ITask, state: IData): boolean {\n\tconst { _tasks } = state;\n\treturn _tasks[_tasks.length - 1]?.id === task.id;\n}\nfunction prevTaskID(task: ITask, state: IData): TID {\n\tconst { _tasks } = state;\n\tconst taskIndex = _tasks.findIndex(t => t.id === task.id);\n\treturn _tasks[taskIndex - 1]?.id ?? task.parent;\n}\n\nfunction isSegment(target: TID | IDataHash): boolean {\n\treturn target && typeof target === \"object\";\n}\nfunction isSingle(s: IData): boolean {\n\treturn !s.selected || s.selected.length < 2;\n}\n\nconst exclude = (v: any) => (task: ITask) => task.type === v;\n\nexport const defaultMenuOptions: IOptionConfig[] = assignChecks<IOptionConfig>([\n\t{\n\t\tid: \"add-task\",\n\t\ttext: \"Add\",\n\t\ticon: \"wxi-plus\",\n\t\tdata: [\n\t\t\t{ id: \"add-task:child\", text: \"Child task\" },\n\t\t\t{ id: \"add-task:before\", text: \"Task above\" },\n\t\t\t{ id: \"add-task:after\", text: \"Task below\" },\n\t\t],\n\t},\n\t{ type: \"separator\" },\n\t{\n\t\tid: \"convert-task\",\n\t\ttext: \"Convert to\",\n\t\ticon: \"wxi-swap-horizontal\",\n\t\tdataFactory: type => ({\n\t\t\tid: `convert-task:${type.id}`,\n\t\t\ttext: `${type.label}`,\n\t\t\tisDisabled: exclude(type.id),\n\t\t}),\n\t},\n\t{\n\t\tid: \"edit-task\",\n\t\ttext: \"Edit\",\n\t\ticon: \"wxi-edit\",\n\t\tisHidden: (t, s, target) => isSegment(target),\n\t},\n\t{ type: \"separator\" },\n\t{ id: \"cut-task\", text: \"Cut\", icon: \"wxi-content-cut\", subtext: \"Ctrl+X\" },\n\t{\n\t\tid: \"copy-task\",\n\t\ttext: \"Copy\",\n\t\ticon: \"wxi-content-copy\",\n\t\tsubtext: \"Ctrl+C\",\n\t},\n\t{\n\t\tid: \"paste-task\",\n\t\ttext: \"Paste\",\n\t\ticon: \"wxi-content-paste\",\n\t\tsubtext: \"Ctrl+V\",\n\t},\n\t{\n\t\tid: \"move-task\",\n\t\ttext: \"Move\",\n\t\ticon: \"wxi-swap-vertical\",\n\t\tdata: [\n\t\t\t{ id: \"move-task:up\", text: \"Up\" },\n\t\t\t{ id: \"move-task:down\", text: \"Down\" },\n\t\t],\n\t},\n\t{ type: \"separator\" },\n\t{ id: \"indent-task:add\", text: \"Indent\", icon: \"wxi-indent\" },\n\t{ id: \"indent-task:remove\", text: \"Outdent\", icon: \"wxi-unindent\" },\n\t{ type: \"separator\" },\n\t{\n\t\tid: \"delete-task\",\n\t\ticon: \"wxi-delete\",\n\t\ttext: \"Delete\",\n\t\tsubtext: \"Ctrl+D / BS\",\n\t\tisHidden: (t, s, target) => isSingle(s) && isSegment(target),\n\t},\n]);\n","import { assignChecks } from \"./menuOptions\";\nimport type {\n\tIData,\n\tIDataHash,\n\tIParsedTask,\n\tIHistory,\n\tIDataConfig,\n} from \"../types\";\nimport type { TID } from \"@svar-ui/lib-state\";\n\nexport function getToolbarButtons(config?: IDataConfig) {\n\tlet buttons = [...defaultToolbarButtons];\n\n\t// #if [!(WX_PACKAGE_TYPE=open)]\n\tif (config?.undo) {\n\t\tbuttons = buttons.concat([\n\t\t\t{ comp: \"separator\" },\n\t\t\t{\n\t\t\t\tid: \"undo\",\n\t\t\t\tcomp: \"icon\",\n\t\t\t\ticon: \"wxi-undo\",\n\t\t\t\tmenuText: \"Undo\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"redo\",\n\t\t\t\tcomp: \"icon\",\n\t\t\t\ticon: \"wxi-redo\",\n\t\t\t\tmenuText: \"Redo\",\n\t\t\t},\n\t\t]);\n\t}\n\tif (config?.splitTasks) {\n\t\tbuttons.splice(2, 0, {\n\t\t\tid: \"split-task\",\n\t\t\tcomp: \"icon\",\n\t\t\ticon: \"wxi-arrow-split\",\n\t\t\tmenuText: \"Split\",\n\t\t});\n\t}\n\tif (buttons.length > defaultToolbarButtons.length)\n\t\tbuttons = assignChecks(buttons);\n\t// #endif\n\treturn buttons;\n}\n\nexport interface IButtonConfig {\n\tid?: string;\n\tcomp: string;\n\ttext?: string;\n\ticon?: string;\n\ttype?: string;\n\tmenuText?: string;\n\tisDisabled?:\n\t\t| ((\n\t\t\t\ttask: IParsedTask,\n\t\t\t\tstate: IData,\n\t\t\t\ttarget?: TID | IDataHash\n\t\t ) => boolean)\n\t\t| ((history: IHistory) => boolean);\n\tisHidden?: (\n\t\ttask: IParsedTask,\n\t\tstate: IData,\n\t\ttarget?: TID | IDataHash\n\t) => boolean;\n}\n\nexport const defaultToolbarButtons: IButtonConfig[] =\n\tassignChecks<IButtonConfig>([\n\t\t{\n\t\t\tid: \"add-task\",\n\t\t\tcomp: \"button\",\n\t\t\ticon: \"wxi-plus\",\n\t\t\ttext: \"New task\",\n\t\t\ttype: \"primary\",\n\t\t},\n\t\t{\n\t\t\tid: \"edit-task\",\n\t\t\tcomp: \"icon\",\n\t\t\ticon: \"wxi-edit\",\n\t\t\tmenuText: \"Edit\",\n\t\t\ttext: \"Ctrl+E\",\n\t\t},\n\t\t{\n\t\t\tid: \"delete-task\",\n\t\t\tcomp: \"icon\",\n\t\t\ticon: \"wxi-delete\",\n\t\t\tmenuText: \"Delete\",\n\t\t\ttext: \"Ctrl+D, Backspace\",\n\t\t},\n\t\t{ comp: \"separator\" },\n\t\t{\n\t\t\tid: \"move-task:up\",\n\t\t\tcomp: \"icon\",\n\t\t\ticon: \"wxi-angle-up\",\n\t\t\tmenuText: \"Move up\",\n\t\t},\n\t\t{\n\t\t\tid: \"move-task:down\",\n\t\t\tcomp: \"icon\",\n\t\t\ticon: \"wxi-angle-down\",\n\t\t\tmenuText: \"Move down\",\n\t\t},\n\t\t{ comp: \"separator\" },\n\t\t{\n\t\t\tid: \"copy-task\",\n\t\t\tcomp: \"icon\",\n\t\t\ticon: \"wxi-content-copy\",\n\t\t\tmenuText: \"Copy\",\n\t\t\ttext: \"Ctrl+V\",\n\t\t},\n\t\t{\n\t\t\tid: \"cut-task\",\n\t\t\tcomp: \"icon\",\n\t\t\ticon: \"wxi-content-cut\",\n\t\t\tmenuText: \"Cut\",\n\t\t\ttext: \"Ctrl+X\",\n\t\t},\n\t\t{\n\t\t\tid: \"paste-task\",\n\t\t\tcomp: \"icon\",\n\t\t\ticon: \"wxi-content-paste\",\n\t\t\tmenuText: \"Paste\",\n\t\t\ttext: \"Ctrl+V\",\n\t\t},\n\t\t{ comp: \"separator\" },\n\t\t{\n\t\t\tid: \"indent-task:add\",\n\t\t\tcomp: \"icon\",\n\t\t\ticon: \"wxi-indent\",\n\t\t\tmenuText: \"Indent\",\n\t\t},\n\t\t{\n\t\t\tid: \"indent-task:remove\",\n\t\t\tcomp: \"icon\",\n\t\t\ticon: \"wxi-unindent\",\n\t\t\tmenuText: \"Outdent\",\n\t\t},\n\t]);\n","import type { TEditorItem, ITask, IData, IDataConfig } from \"../types\";\n\nfunction isSummary(task: Partial<ITask>) {\n\treturn task.type === \"summary\";\n}\n\nfunction isMilestone(task: Partial<ITask>) {\n\treturn task.type === \"milestone\";\n}\n\nfunction isSegment(task: Partial<ITask>): boolean {\n\treturn typeof task.parent === \"undefined\";\n}\n\nfunction isUnscheduled(task: Partial<ITask>, state: IData) {\n\treturn state.unscheduledTasks && task.unscheduled;\n}\n\nexport function getEditorItems(config?: IDataConfig) {\n\tconst items = [...defaultEditorItems];\n\n\t// #if [!(WX_PACKAGE_TYPE=open)]\n\tif (config?.unscheduledTasks)\n\t\titems.splice(6, 0, {\n\t\t\tkey: \"unscheduled\",\n\t\t\tcomp: \"twostate\",\n\t\t\tlabel: \"\",\n\t\t\tconfig: { value: true, text: \"Unschedule\", textActive: \"Schedule\" },\n\t\t\tisHidden: task => isSummary(task) || isSegment(task),\n\t\t});\n\t// #endif\n\treturn items;\n}\n\nexport const defaultEditorItems: TEditorItem[] = [\n\t{\n\t\tkey: \"text\",\n\t\tcomp: \"text\",\n\t\tlabel: \"Name\",\n\t\tconfig: {\n\t\t\tplaceholder: \"Add task name\",\n\t\t},\n\t},\n\t{\n\t\tkey: \"details\",\n\t\tcomp: \"textarea\",\n\t\tlabel: \"Description\",\n\t\tconfig: {\n\t\t\tplaceholder: \"Add description\",\n\t\t},\n\t},\n\t{\n\t\tkey: \"type\",\n\t\tcomp: \"select\",\n\t\tlabel: \"Type\",\n\t\tisHidden: task => isSegment(task),\n\t},\n\t{\n\t\tkey: \"start\",\n\t\tcomp: \"date\",\n\t\tlabel: \"Start date\",\n\t\tisHidden: task => isSummary(task),\n\t\tisDisabled: isUnscheduled,\n\t},\n\t{\n\t\tkey: \"end\",\n\t\tcomp: \"date\",\n\t\tlabel: \"End date\",\n\t\tisHidden: task => isSummary(task) || isMilestone(task),\n\t\tisDisabled: isUnscheduled,\n\t},\n\t{\n\t\tkey: \"duration\",\n\t\tcomp: \"counter\",\n\t\tlabel: \"Duration\",\n\t\tconfig: {\n\t\t\tmin: 1,\n\t\t},\n\t\tisHidden: task => isSummary(task) || isMilestone(task),\n\t\tisDisabled: isUnscheduled,\n\t},\n\t{\n\t\tkey: \"progress\",\n\t\tcomp: \"slider\",\n\t\tlabel: \"Progress\",\n\t\tconfig: {\n\t\t\tmin: 1,\n\t\t\tmax: 100,\n\t\t},\n\t\tisHidden: task => isMilestone(task) || isSegment(task),\n\t},\n\t{\n\t\tkey: \"links\",\n\t\tcomp: \"links\",\n\t\tlabel: \"\",\n\t\tisHidden: task => isSegment(task),\n\t},\n];\n","import { ITaskType } from \"./types\";\n\nexport const defaultTaskTypes: ITaskType[] = [\n\t{ id: \"task\", label: \"Task\" },\n\t{ id: \"summary\", label: \"Summary task\" },\n\t{ id: \"milestone\", label: \"Milestone\" },\n];\n"],"names":["iid","uid","tempID","_DataArray","raw","i","obj","id","index","link","updated","a","cb","x","check","DataTree","top","items","parent","temp","insertElement","after","node","indexById","values","branch","mode","target","now","dropChild","tobj","tLevel","newParent","deleteElement","newIndex","out","kids","toArray","value","key","p","child","root","level","copy","line","newData","item","parentNode","STORE_SET_SILENT","Store","config","data","signals","state","os","ov","nv","fullKey","v","fullKey2","signals2","val","ss","__triggerSync","fn","DataRouter","s","r","b","k","arr","h","_calckSize","cfg","next","parser","updates","ctx","keys","needExec","trgs","sources","prev","sizes","EventBus","name","handler","tag","stack","ev","res","sortAsc","localeCompare","undefined","numeric","getTime","sortDesc","sortBy","order","sortMethod","sortByMany","sortArray","length","sorts","map","sort","conf","GanttDataTree","_sort","constructor","tasks","parse","preparedTasks","task","normalizeTask","sortBranch","getBranch","_pool","get","contains","getIndexById","findIndex","add","normalizedTask","taskObj","ind","n","ids","forEach","kid","kIds","concat","parentId","text","type","progress","details","segments","getSummaryId","all","currentId","parents","push","serialize","toDate","argument","argStr","constructFrom","date","addDays","amount","_date","addMonths","dayOfMonth","endOfDesiredMonth","daysInMonth","addMilliseconds","timestamp","millisecondsInWeek","millisecondsInDay","millisecondsInMinute","millisecondsInHour","addHours","defaultOptions","getDefaultOptions","startOfWeek","options","weekStartsOn","day","diff","startOfISOWeek","getISOWeekYear","year","fourthOfJanuaryOfNextYear","startOfNextYear","fourthOfJanuaryOfThisYear","startOfThisYear","startOfDay","getTimezoneOffsetInMilliseconds","utcDate","differenceInCalendarDays","dateLeft","dateRight","startOfDayLeft","startOfDayRight","timestampLeft","timestampRight","startOfISOWeekYear","fourthOfJanuary","addMinutes","addQuarters","months","addWeeks","days","addYears","compareAsc","_dateLeft","_dateRight","isSameDay","dateLeftStartOfDay","dateRightStartOfDay","isDate","isValid","differenceInCalendarISOWeeks","startOfISOWeekLeft","startOfISOWeekRight","differenceInCalendarMonths","yearDiff","monthDiff","differenceInCalendarYears","getRoundingMethod","method","number","result","differenceInMilliseconds","differenceInHours","differenceInMinutes","endOfDay","endOfMonth","month","isLastDayOfMonth","differenceInMonths","sign","difference","isLastMonthNotFull","differenceInQuarters","differenceInYears","isLastYearNotFull","startOfQuarter","currentMonth","startOfMonth","endOfYear","startOfYear","cleanDate","endOfHour","endOfWeek","endOfQuarter","formatDistanceLocale","formatDistance","token","count","tokenValue","buildFormatLongFn","args","width","dateFormats","timeFormats","dateTimeFormats","formatLong","formatRelativeLocale","formatRelative","_baseDate","_options","buildLocalizeFn","context","valuesArray","defaultWidth","eraValues","quarterValues","monthValues","dayValues","dayPeriodValues","formattingDayPeriodValues","ordinalNumber","dirtyNumber","rem100","localize","quarter","buildMatchFn","string","matchPattern","matchResult","matchedString","parsePatterns","pattern","findKey","rest","object","predicate","array","buildMatchPatternFn","parseResult","matchOrdinalNumberPattern","parseOrdinalNumberPattern","matchEraPatterns","parseEraPatterns","matchQuarterPatterns","parseQuarterPatterns","matchMonthPatterns","parseMonthPatterns","matchDayPatterns","parseDayPatterns","matchDayPeriodPatterns","parseDayPeriodPatterns","match","enUS","getDayOfYear","getISOWeek","getWeekYear","firstWeekContainsDate","firstWeekOfNextYear","firstWeekOfThisYear","startOfWeekYear","firstWeek","getWeek","addLeadingZeros","targetLength","output","lightFormatters","signedYear","dayPeriodEnumValue","numberOfDigits","milliseconds","fractionalSeconds","dayPeriodEnum","formatters","era","signedWeekYear","weekYear","twoDigitYear","isoWeekYear","week","isoWeek","dayOfYear","dayOfWeek","localDayOfWeek","isoDayOfWeek","hours","_localize","timezoneOffset","formatTimezoneWithOptionalMinutes","formatTimezone","formatTimezoneShort","offset","delimiter","absOffset","minutes","dateLongFormatter","timeLongFormatter","dateTimeLongFormatter","datePattern","timePattern","dateTimeFormat","longFormatters","dayOfYearTokenRE","weekYearTokenRE","throwTokens","isProtectedDayOfYearToken","isProtectedWeekYearToken","warnOrThrowProtectedError","format","input","_message","message","subject","formattingTokensRegExp","longFormattingTokensRegExp","escapedStringRegExp","doubleQuoteRegExp","unescapedLatinCharacterRegExp","formatStr","locale","defaultLocale","originalDate","parts","substring","firstCharacter","longFormatter","cleanEscapedString","formatterOptions","part","formatter","matched","getDaysInMonth","monthIndex","lastDayOfMonth","isLeapYear","getDaysInYear","getISOWeeksInYear","thisYear","isEqual","leftDate","rightDate","startOfHour","isSameWeek","dateLeftStartOfWeek","dateRightStartOfWeek","isSameMonth","isSameQuarter","dateLeftStartOfQuarter","dateRightStartOfQuarter","isSameYear","hour","minute","smallerCount","daysInYear","hoursInYear","weeksInQuarter","daysInQuarter","hoursInQuarter","weeksInMonth","hoursInMonth","start","end","getSmallerUnitCount","unit","lengthUnit","isCorrectLengthUnit","minUnit","getDiffer","calendar","_weekStart","getWorkingDays","getWorkingHours","unitSize","isSameUnit","innerDiff","getLengthUnitDiff","getUnitStart","getAdder","filled","lengthUnitsOfFirstUnit","unitStart","nextUnitStart","units","addWorkingDays","addWorkingHours","startHandlers","Date","endHandlers","sameHandlers","handlers","isSame","getCount","registerScaleUnit","baseUnit","Object","indexOf","shift","baseSmallerCount","unitI","countI","splice","parentUnit","adjustToWorkingDay","isWorkingDay","getNextWorkingDay","getPreviousWorkingDay","shiftByWorkingDays","getMinUnit","scales","len","defaultMinCellWidth","defaultMaxCellWidth","calcScales","prevStart","prevEnd","autoScale","_start","_end","_sFix","_eFix","t","taskEnd","adder","resetScales","height","numOfMinUnits","tempEnd","fullWidth","fullHeight","rows","cells","step","cellStart","cellEnd","cellWidth","css","lengthUnitWidth","Math","round","normalizeZoom","zoom","unitFormats","_zoom","mainScaleLevel","levels","minCellWidth","getCellWidth","maxCellWidth","numOfScales","levelScales","j","pUnit","currentLevel","adjustedCellWidth","min","max","zoomScale","nextUnit","newCellWidth","nextScales","nextMinUnit","nextLengthUnit","setLengthUnit","unitInd","lengthUnitInd","fallback","baselineHeight","baselineTopPadding","defaultPadding","heightAdjustment","baselineAdjustment","dragSummaryKids","dx","_scales","open","$x","setTaskSizes","dragSummary","summary","pobj","byId","coords","xMin","Infinity","xMax","getSummaryBarSize","$w","unscheduled","mD","$h","right","setSummaryDates","filter","Error","updateTask","calculateTaskDimensions","splitTasks","baselines","isBaseline","cellHeight","scaleStart","scaleEnd","y","w","skip","startDate","endDate","$y","unscheduledTasks","isSegmentMoveAllowed","moveOptions","extendDragOptions","delta","updateLink","startTask","endTask","dy","$skip","$p","$pl","s_start","e_start","sx","sy","ex","ey","lineCoords","getLineCoords","arrowCoords","getArrowCoords","getPolylineLength","pointsString","nums","split","Number","points","x1","y1","x2","y2","hypot","gapp","backshift","sx1","ex1","same","join","placeLink","box","left","abs","normalizeLinks","links","dateFields","isCellEditable","columnId","includes","processEditor","editor","buttons","column","normalizeColumns","columns","align","isAddTaskColumn","flexgrow","header","template","_template","cell","resize","defaultColumns","handleAction","api","action","_","selected","getState","hasSelection","single","avoidMap","reversed","untargeted","checkParent","checkLevel","targetless","limit","_temp","runSingleAction","mapOrder","reverse","history","getHistory","startBatch","endBatch","$level","o","exec","in","op","extraData","select","cut","idPairs","Map","event","set","taskIds","relevantLinks","source","toggle","show","getTask","segmentIndex","isHandledAction","some","unitAdd","unitDiff","parseTaskDates","Array","isArray","normalizeDates","calcDates","base_start","durationUnit","duration","getFields","prepareDates","prepareEditTask","DataStore","_router","_modules","writable","async","setState","bind","bounds","scaleHeight","_tasks","criticalPath","_links","toSorted","$critical","activeTask","_activeTask","_selected","_cellWidth","DataArray","inBus","on","setStateAsync","range","unselect","sourceId","sourceInd","targetInd","slice","selId","selIndex","update","_scrollTask","remove","lag","inProgress","$reorder","skipProvider","taskIndex","isRootBranch","isLastIndex","targetBranch","targetIndex","targetTask","targetParent","oldSummary","move","newSummary","resetSummaryDates","isDirectDescendant","eventSource","stateOptions","differ","moveSummaryKids","targetObj","valueOf","d","base_duration","newTask","toRemove","eachChild","sel","origin","lazy","linkCopies","newId","l","reduce","skipUndo","isNaN","calcScaleDate","scrollLeft","_scaleDate","scrollTop","area","dir","pointerX","isExpanded","changeScale","cw","num","newScrollLeft","_zoomOffset","minWidth","startStep","newStart","newScroll","preventDefault","getPrevRow","getNextRow","init","from","markers","_markers","undo","schedule","resetHistory","scaleState","isScheduled","silent","floor","grid","color","document","canvas","createElement","canvasSize","renderCell","toDataURL","setAttribute","toString","getContext","translate","strokeStyle","xA","xB","yA","yB","beginPath","moveTo","lineTo","stroke","getMenuOptions","defaultMenuOptions","assignChecks","isDisabled","isFirstTask","isLastTask","prevTaskID","isRootTask","isSegment","isSingle","exclude","icon","dataFactory","label","isHidden","subtext","getToolbarButtons","defaultToolbarButtons","comp","menuText","isSummary","isMilestone","isUnscheduled","getEditorItems","defaultEditorItems","placeholder","defaultTaskTypes"],"mappings":"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","x_google_ignoreList":[0,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76]}