@ryuzaki13/react-foundation-lib 1.2.2 → 1.2.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.
@@ -1,6 +1,6 @@
1
1
  import { _ as e, b as t, g as n, v as r, x as i, y as a } from "../chunks/array-BBSjoTRy.js";
2
- import { $ as o, A as s, At as c, B as l, Bt as u, C as d, Ct as f, D as p, Dt as m, E as h, Et as g, F as _, Ft as v, G as y, Gt as b, H as x, Ht as S, I as C, It as w, J as T, Jt as E, K as D, Kt as O, L as k, Lt as A, M as j, Mt as M, N, Nt as P, O as F, Ot as I, P as L, Pt as R, Q as z, R as B, Rt as V, S as H, St as U, T as W, Tt as G, U as K, Ut as q, V as J, Vt as Y, W as X, Wt as Z, X as Q, Xt as $, Y as ee, Yt as te, Z as ne, _ as re, _t as ie, a as ae, at as oe, b as se, bt as ce, c as le, ct as ue, d as de, dt as fe, et as pe, f as me, ft as he, g as ge, gt as _e, h as ve, ht as ye, i as be, it as xe, j as Se, jt as Ce, k as we, kt as Te, l as Ee, lt as De, m as Oe, mt as ke, n as Ae, nt as je, o as Me, ot as Ne, p as Pe, pt as Fe, q as Ie, qt as Le, r as Re, rt as ze, s as Be, st as Ve, t as He, tt as Ue, u as We, ut as Ge, v as Ke, vt as qe, w as Je, wt as Ye, x as Xe, xt as Ze, y as Qe, yt as $e, z as et, zt as tt } from "../chunks/formatters-DbsO3__r.js";
3
- import { Ft as nt, It as rt, Mt as it, Nt as at, Pt as ot, jt as st } from "../chunks/odata-service-DNYr2dDx.js";
4
- import { A as ct, B as lt, C as ut, D as dt, E as ft, F as pt, H as mt, I as ht, L as gt, M as _t, N as vt, O as yt, P as bt, R as xt, S as St, T as Ct, U as wt, V as Tt, W as Et, _ as Dt, a as Ot, b as kt, c as At, d as jt, f as Mt, g as Nt, h as Pt, i as Ft, j as It, k as Lt, l as Rt, m as zt, n as Bt, o as Vt, p as Ht, r as Ut, s as Wt, u as Gt, v as Kt, w as qt, x as Jt, y as Yt, z as Xt } from "../chunks/dateUtils-D9dpdTl7.js";
5
- import { a as Zt, c as Qt, d as $t, f as en, i as tn, l as nn, m as rn, n as an, o as on, p as sn, r as cn, s as ln, t as un, u as dn } from "../chunks/validate-DTZxzs5k.js";
6
- export { ct as DATE_FORMAT_DEFAULTS, It as DATE_FORMAT_STYLE_PRESET_NAMES, Tt as DATE_PATTERN_DATE_TOKENS, mt as DATE_PATTERN_TIME_TOKENS, wt as DATE_PATTERN_TOKENS, Et as DATE_PATTERN_TOKEN_RE, _t as DEFAULT_DATE_PRESET_NAMES, nn as DEFAULT_NUMBER_PRESET_NAMES, Ae as DEFAULT_VALUE_STATES, dn as NUMBER_FORMAT_DEFAULTS, Re as VALUE_STATE_COLOR_TOKENS, M as addCalendarDays, P as addCalendarMonths, R as addCalendarYears, _ as clearFormatCache, S as clearPhone, Ze as cloneDate, h as cloneFormatterPipelinePlanStep, p as cloneFormatterPipelinePlanStepToNode, F as cloneFormattersPipelineConfig, we as cloneNormalizeLeadingZerosConfig, s as cloneResolveValueStateConfig, Se as cloneRowBasedOverrideConfig, j as cloneTypedValueFormatConfig, Je as collectFormattersPipelineDependencyIds, W as collectRuntimeFieldDependencyIds, de as compileFormattersPipelineExecutor, be as compileFormattersPipelineRuntime, ae as compileFormattersPipelineRuntimeFields, re as computeShortHash, tn as configureRowBasedFormatterRegistry, U as countCalendarDaysInDateRange, v as createCalendarDate, Ve as createEducationDateTime, ve as createFixedResolver, Qt as createRowBasedFormatterContext, Zt as createRowBasedFormatterRegistry, Pe as createThresholdResolver, Ke as findResolverByCanonicalKey, Bt as formatDate, Ut as formatDateAsAbapDate, Ft as formatDateAsAbapDatetime, Ot as formatDateAsAbapMonth, Vt as formatDateAsAbapYear, Wt as formatDateAsDate, At as formatDateAsDateLong, Rt as formatDateAsDateMedium, Gt as formatDateAsDateShort, jt as formatDateAsDateTime, Mt as formatDateAsDatetimeLong, Ht as formatDateAsDatetimeMedium, zt as formatDateAsDatetimeShort, Pt as formatDateAsMonthLong, Nt as formatDateAsMonthShort, Dt as formatDateAsODataDate, Kt as formatDateAsODataDatetime, Yt as formatDateAsODataTime, kt as formatDateAsTime, Jt as formatDateAsTimeLong, St as formatDateAsTimeMedium, ut as formatDateAsTimeSeconds, qt as formatDateAsTimeShort, Ct as formatDateRange, ue as formatEducationDateKey, De as formatEducationTimeKey, Z as formatFullName, C as formatNumber, k as formatNumberAsCurrency, B as formatNumberAsCurrencyOrEmpty, et as formatNumberAsDecimal, l as formatNumberAsDecimal2, J as formatNumberAsDecimal2OrEmpty, x as formatNumberAsDecimal3, K as formatNumberAsDecimal3OrEmpty, X as formatNumberAsDecimalOrEmpty, y as formatNumberAsInteger, D as formatNumberAsIntegerOrEmpty, Ie as formatNumberAsPercent, T as formatNumberAsPercentOrEmpty, ee as formatNumberAsPrice, Q as formatNumberAsPriceOrEmpty, ne as formatNumberAsTonnage, z as formatNumberAsTonnageOrEmpty, q as formatPhone, Me as formatPipelineDisplayValue, b as formatShortName, me as formatTypedCellValue, Te as getCalendarPeriod, Ge as getCurrentEducationWeekKey, vt as getDatePreset, bt as getDatePresetNames, fe as getEducationWeekDays, he as getEducationWeekRange, Fe as getEducationWeekStartDate, ke as getEducationYear, ye as getEducationYearRange, w as getEndOfDay, le as getFormattersPipelineDefinitionById, Ee as getFormattersPipelineDefinitions, $t as getNumberPreset, en as getNumberPresetNames, on as getRowBasedFormatterById, ln as getRowBasedFormatterList, A as getStartOfDay, V as getStartOfMonth, tt as getStartOfWeek, u as getStartOfYear, Qe as getValueStateResolver, se as getValueStateResolverIds, c as isCalendarPeriodWithinDateBounds, _e as isCurrentEducationWeek, pt as isDateFormatPrecision, ht as isDateFormatStyle, Ce as isDateInsideCalendarPeriod, f as isDateRangeTuple, ie as isEducationDateInCurrentYear, st as isPositiveValue, Y as isSameCalendarDay, Ye as isValidDate, pe as isZeroValue, G as normalizeDateRange, Ue as normalizeDateRangeReferenceDate, qe as normalizeEducationWeekKey, We as normalizeFormattersPipelineConfig, N as normalizeLeadingZeros, L as normalizeLeadingZerosStrict, n as normalizeRequiredText, e as normalizeText, r as normalizeTextSpaces, a as normalizeTextToLower, t as normalizeTextWithFallback, g as orderDates, nt as parseAbapBoolean, rt as parseBoolean, ft as parseDate, dt as parseDateByFormat, yt as parseDateByPattern, Lt as parseDateValue, $e as parseEducationDateKey, it as parseNumber, gt as registerDatePreset, ge as registerFixedResolver, sn as registerNumberPreset, Xe as registerResolver, Oe as registerThresholdResolver, Be as rekeyFormattersPipelineConfig, m as requireDateRange, xt as resetDatePresets, rn as resetNumberPresets, H as resetValueStateResolvers, Xt as resolveDateFormatName, lt as resolveDateFormatPreset, I as resolveDateRangePair, ce as resolveEducationWeekKey, je as resolveMonthAgoRange, ze as resolveMonthStartToTodayRange, xe as resolveMonthStartToYesterdayRange, oe as resolveTodayRange, d as resolveValueState, He as resolveValueStateClassName, Ne as resolveYesterdayRange, $ as startsWithIgnoringZeros, te as stripInnerSpaces, E as stripLeadingZeros, O as toAbapBoolean, at as toFiniteNumber, ot as toPositiveInteger, i as toSafeString, o as truncateNumber, Le as truncateText, un as validateFormattersPipelineConfig, an as validateFormattersPipelineGraph, cn as validateFormattersPipelinePlan };
2
+ import { $ as o, A as s, At as c, B as l, Bt as u, C as d, Ct as f, D as p, Dt as m, E as h, Et as g, F as _, Ft as v, G as y, Gt as b, H as x, Ht as S, I as C, It as w, J as T, Jt as E, K as D, Kt as O, L as k, Lt as A, M as j, Mt as M, N, Nt as P, O as F, Ot as I, P as L, Pt as R, Q as z, R as B, Rt as V, S as H, St as U, T as W, Tt as G, U as K, Ut as q, V as J, Vt as Y, W as X, Wt as Z, X as Q, Xt as $, Y as ee, Yt as te, Z as ne, _ as re, _t as ie, a as ae, at as oe, b as se, bt as ce, c as le, ct as ue, d as de, dt as fe, et as pe, f as me, ft as he, g as ge, gt as _e, h as ve, ht as ye, i as be, it as xe, j as Se, jt as Ce, k as we, kt as Te, l as Ee, lt as De, m as Oe, mt as ke, n as Ae, nt as je, o as Me, ot as Ne, p as Pe, pt as Fe, q as Ie, qt as Le, r as Re, rt as ze, s as Be, st as Ve, t as He, tt as Ue, u as We, ut as Ge, v as Ke, vt as qe, w as Je, wt as Ye, x as Xe, xt as Ze, y as Qe, yt as $e, z as et, zt as tt } from "../chunks/formatters-Bckm8txP.js";
3
+ import { Ft as nt, It as rt, Mt as it, Nt as at, Pt as ot, jt as st } from "../chunks/odata-service-C5L6DX_m.js";
4
+ import { A as ct, B as lt, C as ut, D as dt, E as ft, F as pt, G as mt, H as ht, I as gt, L as _t, M as vt, N as yt, O as bt, P as xt, R as St, S as Ct, T as wt, U as Tt, V as Et, W as Dt, _ as Ot, a as kt, b as At, c as jt, d as Mt, f as Nt, g as Pt, h as Ft, i as It, j as Lt, k as Rt, l as zt, m as Bt, n as Vt, o as Ht, p as Ut, r as Wt, s as Gt, u as Kt, v as qt, w as Jt, x as Yt, y as Xt, z as Zt } from "../chunks/dateUtils-DbmM5pTG.js";
5
+ import { a as Qt, c as $t, d as en, f as tn, i as nn, l as rn, m as an, n as on, o as sn, p as cn, r as ln, s as un, t as dn, u as fn } from "../chunks/validate-KI8hXshg.js";
6
+ export { Lt as DATE_FORMAT_DEFAULTS, vt as DATE_FORMAT_STYLE_PRESET_NAMES, ht as DATE_PATTERN_DATE_TOKENS, Tt as DATE_PATTERN_TIME_TOKENS, Dt as DATE_PATTERN_TOKENS, mt as DATE_PATTERN_TOKEN_RE, yt as DEFAULT_DATE_PRESET_NAMES, rn as DEFAULT_NUMBER_PRESET_NAMES, Ae as DEFAULT_VALUE_STATES, fn as NUMBER_FORMAT_DEFAULTS, Re as VALUE_STATE_COLOR_TOKENS, M as addCalendarDays, P as addCalendarMonths, R as addCalendarYears, _ as clearFormatCache, S as clearPhone, Ze as cloneDate, h as cloneFormatterPipelinePlanStep, p as cloneFormatterPipelinePlanStepToNode, F as cloneFormattersPipelineConfig, we as cloneNormalizeLeadingZerosConfig, s as cloneResolveValueStateConfig, Se as cloneRowBasedOverrideConfig, j as cloneTypedValueFormatConfig, Je as collectFormattersPipelineDependencyIds, W as collectRuntimeFieldDependencyIds, de as compileFormattersPipelineExecutor, be as compileFormattersPipelineRuntime, ae as compileFormattersPipelineRuntimeFields, re as computeShortHash, nn as configureRowBasedFormatterRegistry, U as countCalendarDaysInDateRange, v as createCalendarDate, Ve as createEducationDateTime, ve as createFixedResolver, $t as createRowBasedFormatterContext, Qt as createRowBasedFormatterRegistry, Pe as createThresholdResolver, Ke as findResolverByCanonicalKey, Vt as formatDate, Wt as formatDateAsAbapDate, It as formatDateAsAbapDatetime, kt as formatDateAsAbapMonth, Ht as formatDateAsAbapYear, Gt as formatDateAsDate, jt as formatDateAsDateLong, zt as formatDateAsDateMedium, Kt as formatDateAsDateShort, Mt as formatDateAsDateTime, Nt as formatDateAsDatetimeLong, Ut as formatDateAsDatetimeMedium, Bt as formatDateAsDatetimeShort, Ft as formatDateAsMonthLong, Pt as formatDateAsMonthMedium, Ot as formatDateAsMonthShort, qt as formatDateAsODataDate, Xt as formatDateAsODataDatetime, At as formatDateAsODataTime, Yt as formatDateAsTime, Ct as formatDateAsTimeLong, ut as formatDateAsTimeMedium, Jt as formatDateAsTimeSeconds, wt as formatDateAsTimeShort, ft as formatDateRange, ue as formatEducationDateKey, De as formatEducationTimeKey, Z as formatFullName, C as formatNumber, k as formatNumberAsCurrency, B as formatNumberAsCurrencyOrEmpty, et as formatNumberAsDecimal, l as formatNumberAsDecimal2, J as formatNumberAsDecimal2OrEmpty, x as formatNumberAsDecimal3, K as formatNumberAsDecimal3OrEmpty, X as formatNumberAsDecimalOrEmpty, y as formatNumberAsInteger, D as formatNumberAsIntegerOrEmpty, Ie as formatNumberAsPercent, T as formatNumberAsPercentOrEmpty, ee as formatNumberAsPrice, Q as formatNumberAsPriceOrEmpty, ne as formatNumberAsTonnage, z as formatNumberAsTonnageOrEmpty, q as formatPhone, Me as formatPipelineDisplayValue, b as formatShortName, me as formatTypedCellValue, Te as getCalendarPeriod, Ge as getCurrentEducationWeekKey, xt as getDatePreset, pt as getDatePresetNames, fe as getEducationWeekDays, he as getEducationWeekRange, Fe as getEducationWeekStartDate, ke as getEducationYear, ye as getEducationYearRange, w as getEndOfDay, le as getFormattersPipelineDefinitionById, Ee as getFormattersPipelineDefinitions, en as getNumberPreset, tn as getNumberPresetNames, sn as getRowBasedFormatterById, un as getRowBasedFormatterList, A as getStartOfDay, V as getStartOfMonth, tt as getStartOfWeek, u as getStartOfYear, Qe as getValueStateResolver, se as getValueStateResolverIds, c as isCalendarPeriodWithinDateBounds, _e as isCurrentEducationWeek, gt as isDateFormatPrecision, _t as isDateFormatStyle, Ce as isDateInsideCalendarPeriod, f as isDateRangeTuple, ie as isEducationDateInCurrentYear, st as isPositiveValue, Y as isSameCalendarDay, Ye as isValidDate, pe as isZeroValue, G as normalizeDateRange, Ue as normalizeDateRangeReferenceDate, qe as normalizeEducationWeekKey, We as normalizeFormattersPipelineConfig, N as normalizeLeadingZeros, L as normalizeLeadingZerosStrict, n as normalizeRequiredText, e as normalizeText, r as normalizeTextSpaces, a as normalizeTextToLower, t as normalizeTextWithFallback, g as orderDates, nt as parseAbapBoolean, rt as parseBoolean, dt as parseDate, bt as parseDateByFormat, Rt as parseDateByPattern, ct as parseDateValue, $e as parseEducationDateKey, it as parseNumber, St as registerDatePreset, ge as registerFixedResolver, cn as registerNumberPreset, Xe as registerResolver, Oe as registerThresholdResolver, Be as rekeyFormattersPipelineConfig, m as requireDateRange, Zt as resetDatePresets, an as resetNumberPresets, H as resetValueStateResolvers, lt as resolveDateFormatName, Et as resolveDateFormatPreset, I as resolveDateRangePair, ce as resolveEducationWeekKey, je as resolveMonthAgoRange, ze as resolveMonthStartToTodayRange, xe as resolveMonthStartToYesterdayRange, oe as resolveTodayRange, d as resolveValueState, He as resolveValueStateClassName, Ne as resolveYesterdayRange, $ as startsWithIgnoringZeros, te as stripInnerSpaces, E as stripLeadingZeros, O as toAbapBoolean, at as toFiniteNumber, ot as toPositiveInteger, i as toSafeString, o as truncateNumber, Le as truncateText, dn as validateFormattersPipelineConfig, on as validateFormattersPipelineGraph, ln as validateFormattersPipelinePlan };
@@ -1,4 +1,4 @@
1
- import { t as e } from "../chunks/dateUtils-D9dpdTl7.js";
1
+ import { t as e } from "../chunks/dateUtils-DbmM5pTG.js";
2
2
  import { t } from "../chunks/string-comparison-BKT7PXmq.js";
3
3
  import { create as n } from "zustand";
4
4
  import { immer as r } from "zustand/middleware/immer";
@@ -1,2 +1,2 @@
1
- import { $ as e, A as t, At as n, B as r, C as i, Ct as a, D as o, Dt as s, E as c, Et as l, F as u, G as d, H as f, I as p, J as m, K as h, L as g, M as _, N as v, O as y, Ot as b, P as x, Q as S, R as C, S as w, St as T, T as E, Tt as D, U as O, V as k, W as A, X as j, Y as M, Z as N, _ as P, _t as F, a as I, at as L, b as R, bt as z, c as B, ct as V, d as H, dt as U, et as W, f as G, ft as K, g as q, gt as J, h as Y, ht as X, i as Z, it as Q, j as $, k as ee, kt as te, l as ne, lt as re, m as ie, mt as ae, n as oe, nt as se, o as ce, ot as le, p as ue, pt as de, q as fe, r as pe, rt as me, s as he, st as ge, t as _e, tt as ve, u as ye, ut as be, v as xe, vt as Se, w as Ce, wt as we, x as Te, xt as Ee, y as De, yt as Oe, z as ke } from "../chunks/odata-service-DNYr2dDx.js";
1
+ import { $ as e, A as t, At as n, B as r, C as i, Ct as a, D as o, Dt as s, E as c, Et as l, F as u, G as d, H as f, I as p, J as m, K as h, L as g, M as _, N as v, O as y, Ot as b, P as x, Q as S, R as C, S as w, St as T, T as E, Tt as D, U as O, V as k, W as A, X as j, Y as M, Z as N, _ as P, _t as F, a as I, at as L, b as R, bt as z, c as B, ct as V, d as H, dt as U, et as W, f as G, ft as K, g as q, gt as J, h as Y, ht as X, i as Z, it as Q, j as $, k as ee, kt as te, l as ne, lt as re, m as ie, mt as ae, n as oe, nt as se, o as ce, ot as le, p as ue, pt as de, q as fe, r as pe, rt as me, s as he, st as ge, t as _e, tt as ve, u as ye, ut as be, v as xe, vt as Se, w as Ce, wt as we, x as Te, xt as Ee, y as De, yt as Oe, z as ke } from "../chunks/odata-service-C5L6DX_m.js";
2
2
  export { s as BASE_META_TYPES, b as BASE_META_TYPE_LABELS, k as FILTER_OPERATIONS, i as FORCED_CODE_TEXT_IDS, f as FilterOperation, H as assertSqlFilterFieldId, ve as buildEntityOperationPath, se as buildEntityParameters, me as buildEntityPath, Q as buildFunctionImportParameters, L as buildFunctionImportPath, O as buildODataFilter, A as buildODataFilterRecursive, P as buildODataOrder, xe as buildODataOrderBy, le as buildParameterEntries, G as buildSqlFilter, y as collapseChainedODataSegmentFilterValues, e as collectFilterableColumns, W as collectFilterableColumnsIds, ee as compileFiltersToExpression, ge as createBooleanFormatter, V as createDateFormatter, d as createFilter, h as createFilterBetween, fe as createFilterContains, m as createFilterEqual, M as createFilterEqualFalsy, re as createFormatter, be as createNumberFormatter, ue as createSqlFilterEqual, ie as createSqlFilterGroup, Y as createSqlFilterIn, U as createStringFormatter, K as defaultControlTypeValue, de as defaultODataTypeValue, t as flattenFilterValuesToODataDependencies, ae as getBaseTypeFromODataType, X as getFormatter, J as getFormatterForBaseType, F as getFormattersFor, Se as getFormattersForBaseType, De as getSortIndex, R as getSortIndicator, te as isBaseMetaType, pe as isBaseValue, T as isBooleanSafe, a as isDateSafe, $ as isFilterLocalComponentId, j as isFilterOperation, Ce as isForcedCodeTextFamilyId, E as isForcedCodeTextId, we as isNumberSafe, he as isODataBooleanType, B as isODataDateType, ne as isODataIntegerType, ye as isODataNumericType, q as isSqlFilterScalarValue, D as isStringSafe, N as mergeFilterExpressions, _ as mergeFilterValuePatch, Z as normalizeBaseValue, v as normalizeDictionaryCodeKey, I as normalizeRangeValue, Oe as odataFormatValue, z as odataParseValue, Ee as odataParseValueByMetadata, l as odataTypeSchemas, c as parseServiceMetadata, n as resolveBaseTypeLabel, Te as resolveEffectiveSorts, o as resolveMetadataColumnLabel, x as resolveODataFilterDefinitionActiveColumnIds, u as resolveODataFilterDefinitionColumnIds, S as resolveOperationLabel, p as sanitizeFilterBinding, g as sanitizeFilterConditionGroup, C as sanitizeFilterDefinitions, ke as sanitizeFilterValue, r as sanitizeFilterValues, w as toggleSort, _e as unwrapODataParams, ce as unwrapODataQueryResult, oe as wrapODataParams };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ryuzaki13/react-foundation-lib",
3
- "version": "1.2.2",
3
+ "version": "1.2.3",
4
4
  "description": "Reusable React and TypeScript foundation utilities, hooks, and primitives.",
5
5
  "license": "MIT",
6
6
  "author": "Ryuzaki13",
@@ -58,7 +58,8 @@
58
58
  - `date-short`: `03.03.2026`
59
59
  - `date-medium`: `3 мар. 2026 г.`
60
60
  - `date-long`: `3 марта 2026 г.`
61
- - `month-short`: `3 мар.`
61
+ - `month-short`: `03.03`
62
+ - `month-medium`: `3 мар.`
62
63
  - `month-long`: `3 марта`
63
64
  - `time-short`: `18:03`
64
65
  - `time-medium`: `18:03:50`
@@ -71,7 +72,7 @@
71
72
  - `abap-date`: `yyyyMMdd`
72
73
  - `abap-datetime`: `yyyyMMddHHmmss`
73
74
 
74
- Style-пресеты используют `Intl.DateTimeFormat` с `ru-RU`, но время описано явными полями. Это важно для `long`: стандартный `timeStyle: "long"` добавляет timezone, а в этом модуле timezone-семантика запрещена.
75
+ Style-пресеты используют `Intl.DateTimeFormat` с `ru-RU`. Семейство `month-short|medium|long` повторяет уровни детализации даты, но не выводит год. Время описано явными полями: стандартный `timeStyle: "long"` добавляет timezone, а в этом модуле timezone-семантика запрещена.
75
76
 
76
77
  Значения по умолчанию для любого пресета:
77
78
 
@@ -114,7 +115,7 @@ formatDate("20260303", "date");
114
115
  // "03.03.2026"
115
116
 
116
117
  formatDate("2026-06-25", "month-short");
117
- // "25 июн."
118
+ // "25.06"
118
119
 
119
120
  formatDate("datetimeoffset'2026-03-03T18:03:50.327Z'", "datetimeSeconds");
120
121
  // "03.03.2026 18:03:50"
@@ -155,16 +156,29 @@ formatDate("abc", "datetime", { fallback: "н/д" });
155
156
  // "н/д"
156
157
  ```
157
158
 
158
- ### `formatDateAsDate`, `formatDateAsMonthLong`, `formatDateAsDateTime`, `formatDateAsTime`
159
+ ### `formatDateAsDate`, `formatDateAsMonthShort`, `formatDateAsMonthMedium`, `formatDateAsMonthLong`, `formatDateAsDateTime`, `formatDateAsTime`
159
160
 
160
161
  Упрощённые helper-обёртки поверх встроенных пресетов:
161
162
 
162
163
  ```ts
163
- import { formatDateAsDate, formatDateAsDateTime, formatDateAsMonthLong, formatDateAsTime } from "@/shared/lib";
164
+ import {
165
+ formatDateAsDate,
166
+ formatDateAsDateTime,
167
+ formatDateAsMonthLong,
168
+ formatDateAsMonthMedium,
169
+ formatDateAsMonthShort,
170
+ formatDateAsTime
171
+ } from "@/shared/lib";
164
172
 
165
173
  formatDateAsDate("2026-03-03T18:03:50Z");
166
174
  // "03.03.2026"
167
175
 
176
+ formatDateAsMonthShort("2026-03-03T18:03:50Z");
177
+ // "03.03"
178
+
179
+ formatDateAsMonthMedium("2026-03-03T18:03:50Z");
180
+ // "3 мар."
181
+
168
182
  formatDateAsMonthLong("2026-03-03T18:03:50Z");
169
183
  // "3 марта"
170
184
 
@@ -423,8 +437,9 @@ isSameCalendarDay(new Date(2026, 2, 3, 1, 0, 0), new Date(2026, 2, 3, 23, 59, 59
423
437
  - `formatDate`
424
438
  - `formatDateAsDate`
425
439
  - `formatDateAsDateTime`
426
- - `formatDateAsMonthLong`
427
440
  - `formatDateAsMonthShort`
441
+ - `formatDateAsMonthMedium`
442
+ - `formatDateAsMonthLong`
428
443
  - `formatDateAsTime`
429
444
  - `formatDateRange`
430
445
  - `parseDateValue`
@@ -1 +0,0 @@
1
- {"version":3,"file":"dateUtils-D9dpdTl7.js","names":[],"sources":["../../src/formatters/date/pattern.ts","../../src/formatters/date/presets.ts","../../src/formatters/date/parseDate.ts","../../src/formatters/date/formatDate.ts","../../src/odata/dateUtils.ts"],"sourcesContent":["import type { DateFormatPrecision } from \"./types\";\n\n/**\n * Токены календарной даты, поддерживаемые ручными шаблонами форматирования.\n */\nexport const DATE_PATTERN_DATE_TOKENS = Object.freeze([\"dd\", \"MM\", \"yyyy\", \"yy\"] as const);\n\n/**\n * Токены времени, поддерживаемые ручными шаблонами форматирования.\n */\nexport const DATE_PATTERN_TIME_TOKENS = Object.freeze([\"HH\", \"mm\", \"ss\"] as const);\n\n/**\n * Все токены ручного шаблона даты/времени.\n */\nexport const DATE_PATTERN_TOKENS = Object.freeze([...DATE_PATTERN_DATE_TOKENS, ...DATE_PATTERN_TIME_TOKENS] as const);\n\n/**\n * Регулярное выражение для поиска токенов ручного шаблона.\n */\nexport const DATE_PATTERN_TOKEN_RE = /(yyyy|yy|MM|dd|HH|mm|ss)/g;\n\nconst DATE_PATTERN_TOKEN_SET = new Set<string>(DATE_PATTERN_TOKENS);\nconst DATE_PATTERN_PRECISION_TOKENS: Readonly<Record<DateFormatPrecision, ReadonlySet<string>>> = Object.freeze({\n\tday: new Set(DATE_PATTERN_TOKENS),\n\tmonth: new Set([\"MM\", \"yyyy\", \"yy\"]),\n\tyear: new Set([\"yyyy\", \"yy\"])\n});\n\n/**\n * Проверяет, что сегмент шаблона является поддерживаемым токеном даты/времени.\n */\nexport function isDatePatternToken(value: string): boolean {\n\treturn DATE_PATTERN_TOKEN_SET.has(value);\n}\n\n/**\n * Проверяет, что шаблон содержит хотя бы один токен из списка.\n */\nexport function containsDatePatternToken(pattern: string, tokens: readonly string[]): boolean {\n\treturn tokens.some((token) => pattern.includes(token));\n}\n\n/**\n * Проверяет, похожа ли строка на ручной шаблон даты.\n */\nexport function hasDatePatternTokens(pattern: string): boolean {\n\tDATE_PATTERN_TOKEN_RE.lastIndex = 0;\n\treturn DATE_PATTERN_TOKEN_RE.test(pattern);\n}\n\n/**\n * Возвращает токены, допустимые для выбранной точности календарной даты.\n */\nexport function getDatePatternPrecisionTokens(precision: DateFormatPrecision): ReadonlySet<string> {\n\treturn DATE_PATTERN_PRECISION_TOKENS[precision];\n}\n\n/**\n * Удаляет из ручного шаблона части даты, которые ниже выбранной точности.\n */\nexport function resolveDatePatternPrecision(pattern: string, precision: DateFormatPrecision): string {\n\tif (precision === \"day\") return pattern;\n\n\tconst allowedTokens = getDatePatternPrecisionTokens(precision);\n\tconst resultSegments: string[] = [];\n\tlet pendingLiteral = \"\";\n\tlet hasKeptToken = false;\n\tlet keptTokenCount = 0;\n\tlet cursor = 0;\n\tlet match: RegExpExecArray | null;\n\n\tDATE_PATTERN_TOKEN_RE.lastIndex = 0;\n\twhile ((match = DATE_PATTERN_TOKEN_RE.exec(pattern))) {\n\t\tconst literal = pattern.slice(cursor, match.index);\n\t\tconst token = match[0];\n\n\t\tif (hasKeptToken) pendingLiteral += literal;\n\n\t\tif (allowedTokens.has(token)) {\n\t\t\tif (hasKeptToken) resultSegments.push(pendingLiteral);\n\t\t\tresultSegments.push(token);\n\t\t\tpendingLiteral = \"\";\n\t\t\thasKeptToken = true;\n\t\t\tkeptTokenCount += 1;\n\t\t}\n\n\t\tcursor = match.index + token.length;\n\t}\n\n\tif (keptTokenCount === 0) return pattern;\n\treturn resultSegments.join(\"\");\n}\n","import {\n\tcontainsDatePatternToken,\n\tDATE_PATTERN_DATE_TOKENS,\n\tDATE_PATTERN_TIME_TOKENS,\n\tDATE_PATTERN_TOKEN_RE,\n\tisDatePatternToken,\n\tresolveDatePatternPrecision\n} from \"./pattern\";\n\nimport type { DateFormatPrecision, DateFormatPreset, DateFormatPresetConfig, DateFormatStyle } from \"./types\";\n\n/**\n * Функция, которая форматирует уже подготовленную календарную дату.\n */\nexport type CompiledDateFormatter = (date: Date, precision?: DateFormatPrecision) => string;\n\n/**\n * Внутреннее представление предустановки с заранее созданными форматтерами.\n */\nexport interface CompiledDateFormatPreset extends DateFormatPreset {\n\tformatDateTime: CompiledDateFormatter;\n\tformatDuration?: (durationMs: number, fallback: string) => string;\n}\n\n/**\n * Локаль форматирования дат по умолчанию.\n */\nconst DEFAULT_LOCALE = \"ru-RU\";\n\n/**\n * Уровни детализации, для которых создаются встроенные style-пресеты.\n */\nconst FORMAT_STYLES = Object.freeze([\"short\", \"medium\", \"long\"] as const);\nconst FORMAT_PRECISIONS = Object.freeze([\"day\", \"month\", \"year\"] as const);\n\n/**\n * Значения по умолчанию для предустановок форматирования дат.\n */\nexport const DATE_FORMAT_DEFAULTS: Omit<DateFormatPreset, \"name\" | \"intlOptions\"> & { intlOptions: Intl.DateTimeFormatOptions } = {\n\tlocale: DEFAULT_LOCALE,\n\tintlOptions: { day: \"2-digit\", month: \"2-digit\", year: \"numeric\" },\n\tinvalidFallback: \"\"\n};\n\n/**\n * Имена встроенных предустановок.\n */\nexport const DEFAULT_DATE_PRESET_NAMES = Object.freeze({\n\tdate: \"date\",\n\tdateShort: \"date-short\",\n\tdateMedium: \"date-medium\",\n\tdateLong: \"date-long\",\n\tmonthShort: \"month-short\",\n\tmonthLong: \"month-long\",\n\tdatetime: \"datetime\",\n\tdatetimeSeconds: \"datetime-seconds\",\n\tdatetimeShort: \"datetime-short\",\n\tdatetimeMedium: \"datetime-medium\",\n\tdatetimeLong: \"datetime-long\",\n\ttime: \"time\",\n\ttimeSeconds: \"time-seconds\",\n\ttimeShort: \"time-short\",\n\ttimeMedium: \"time-medium\",\n\ttimeLong: \"time-long\",\n\todataDate: \"odata-date\",\n\todataDatetime: \"odata-datetime\",\n\tabapDatetime: \"abap-datetime\",\n\tabapDate: \"abap-date\",\n\tabapMonth: \"abap-month\",\n\tabapYear: \"abap-year\"\n});\n\n/**\n * Алиасы style-форматов даты к именам встроенных date-пресетов.\n */\nexport const DATE_FORMAT_STYLE_PRESET_NAMES: Readonly<Record<DateFormatStyle, string>> = Object.freeze({\n\tshort: DEFAULT_DATE_PRESET_NAMES.dateShort,\n\tmedium: DEFAULT_DATE_PRESET_NAMES.dateMedium,\n\tlong: DEFAULT_DATE_PRESET_NAMES.dateLong\n});\n\nconst patternPresetCache = new Map<string, DateFormatPreset>();\n\n/**\n * Встроенные предустановки форматирования дат.\n */\nconst BUILTIN_PRESETS: DateFormatPresetConfig[] = [\n\t{ name: DEFAULT_DATE_PRESET_NAMES.date, intlOptions: { day: \"2-digit\", month: \"2-digit\", year: \"numeric\" } },\n\t{\n\t\tname: DEFAULT_DATE_PRESET_NAMES.datetime,\n\t\tintlDateOptions: { day: \"2-digit\", month: \"2-digit\", year: \"numeric\" },\n\t\tintlTimeOptions: { hour: \"2-digit\", minute: \"2-digit\", hourCycle: \"h23\" },\n\t\tintlJoiner: \" \"\n\t},\n\t{\n\t\tname: DEFAULT_DATE_PRESET_NAMES.datetimeSeconds,\n\t\tintlDateOptions: { day: \"2-digit\", month: \"2-digit\", year: \"numeric\" },\n\t\tintlTimeOptions: { hour: \"2-digit\", minute: \"2-digit\", second: \"2-digit\", hourCycle: \"h23\" },\n\t\tintlJoiner: \" \"\n\t},\n\t{\n\t\tname: DEFAULT_DATE_PRESET_NAMES.time,\n\t\tintlOptions: { hour: \"2-digit\", minute: \"2-digit\", hourCycle: \"h23\" },\n\t\tdurationPattern: \"HH:mm\"\n\t},\n\t{\n\t\tname: DEFAULT_DATE_PRESET_NAMES.timeSeconds,\n\t\tintlOptions: { hour: \"2-digit\", minute: \"2-digit\", second: \"2-digit\", hourCycle: \"h23\" },\n\t\tdurationPattern: \"HH:mm:ss\"\n\t},\n\t...FORMAT_STYLES.map((style) => ({\n\t\tname: `date-${style}`,\n\t\tintlOptions: getDateStyleIntlOptions(style)\n\t})),\n\t{\n\t\tname: DEFAULT_DATE_PRESET_NAMES.monthShort,\n\t\tintlOptions: { day: \"numeric\", month: \"short\" }\n\t},\n\t{\n\t\tname: DEFAULT_DATE_PRESET_NAMES.monthLong,\n\t\tintlOptions: { day: \"numeric\", month: \"long\" }\n\t},\n\t...FORMAT_STYLES.map((style) => ({\n\t\tname: `time-${style}`,\n\t\tintlOptions: getTimeStyleIntlOptions(style),\n\t\tdurationPattern: style === \"short\" ? \"HH:mm\" : \"HH:mm:ss\"\n\t})),\n\t...FORMAT_STYLES.map((style) => ({\n\t\tname: `datetime-${style}`,\n\t\tintlDateOptions: getDateStyleIntlOptions(style),\n\t\tintlTimeOptions: getTimeStyleIntlOptions(style),\n\t\tintlJoiner: \", \"\n\t})),\n\t{ name: DEFAULT_DATE_PRESET_NAMES.odataDate, pattern: \"yyyy-MM-dd\" },\n\t{ name: DEFAULT_DATE_PRESET_NAMES.odataDatetime, pattern: \"yyyy-MM-ddTHH:mm:ss\" },\n\t{ name: DEFAULT_DATE_PRESET_NAMES.abapDatetime, pattern: \"yyyyMMddHHmmss\" },\n\t{ name: DEFAULT_DATE_PRESET_NAMES.abapDate, pattern: \"yyyyMMdd\" },\n\t{ name: DEFAULT_DATE_PRESET_NAMES.abapMonth, pattern: \"yyyyMM\" },\n\t{ name: DEFAULT_DATE_PRESET_NAMES.abapYear, pattern: \"yyyy\" }\n];\n\n/**\n * Реестр предустановок форматирования.\n */\nconst registry = new Map<string, CompiledDateFormatPreset>();\n\n/**\n * Дополняет числовую часть даты ведущим нулём.\n */\nfunction padDatePart(value: number, size = 2): string {\n\treturn String(value).padStart(size, \"0\");\n}\n\n/**\n * Возвращает настройки Intl для dateStyle-подобного формата без timezone-семантики.\n */\nfunction getDateStyleIntlOptions(style: DateFormatStyle, precision: DateFormatPrecision = \"day\"): Intl.DateTimeFormatOptions {\n\tif (precision === \"year\") return { year: \"numeric\" };\n\n\tif (precision === \"month\") {\n\t\tif (style === \"short\") return { month: \"2-digit\", year: \"numeric\" };\n\t\tif (style === \"medium\") return { month: \"short\", year: \"numeric\" };\n\t\treturn { month: \"long\", year: \"numeric\" };\n\t}\n\n\tif (style === \"short\") return { day: \"2-digit\", month: \"2-digit\", year: \"numeric\" };\n\tif (style === \"medium\") return { day: \"numeric\", month: \"short\", year: \"numeric\" };\n\treturn { day: \"numeric\", month: \"long\", year: \"numeric\" };\n}\n\n/**\n * Возвращает настройки Intl для timeStyle-подобного формата без timezoneName.\n *\n * Intl timeStyle=\"long\" добавляет часовой пояс в результат. В этом модуле\n * timezone намеренно не существует, поэтому long повторяет секундную точность\n * без вывода GMT/UTC-метки.\n */\nfunction getTimeStyleIntlOptions(style: DateFormatStyle): Intl.DateTimeFormatOptions {\n\tif (style === \"short\") return { hour: \"2-digit\", minute: \"2-digit\", hourCycle: \"h23\" };\n\treturn { hour: \"2-digit\", minute: \"2-digit\", second: \"2-digit\", hourCycle: \"h23\" };\n}\n\n/**\n * Удаляет timezone из настроек Intl, чтобы форматирование не могло сдвинуть\n * календарные компоненты или вывести timezoneName в строку.\n */\nfunction sanitizeIntlOptions(options: Intl.DateTimeFormatOptions): Intl.DateTimeFormatOptions {\n\tconst { timeZone, timeZoneName, ...safeOptions } = options;\n\tvoid timeZone;\n\tvoid timeZoneName;\n\treturn safeOptions;\n}\n\n/**\n * Проверяет, содержит ли Intl-конфигурация календарные поля.\n */\nfunction hasIntlDateFields(options: Intl.DateTimeFormatOptions): boolean {\n\treturn Boolean(options.dateStyle || options.year || options.month || options.day);\n}\n\n/**\n * Приводит Intl-конфигурацию к выбранной точности календарной даты.\n */\nfunction resolveIntlDatePrecisionOptions(options: Intl.DateTimeFormatOptions, precision: DateFormatPrecision): Intl.DateTimeFormatOptions {\n\tconst safeOptions = sanitizeIntlOptions(options);\n\tif (precision === \"day\" || !hasIntlDateFields(safeOptions)) return safeOptions;\n\n\tif (safeOptions.dateStyle) {\n\t\tconst style = safeOptions.dateStyle === \"short\" || safeOptions.dateStyle === \"medium\" ? safeOptions.dateStyle : \"long\";\n\t\treturn getDateStyleIntlOptions(style, precision);\n\t}\n\n\tif (precision === \"year\") {\n\t\treturn { year: safeOptions.year ?? \"numeric\" };\n\t}\n\n\treturn {\n\t\tmonth: safeOptions.month ?? \"2-digit\",\n\t\tyear: safeOptions.year ?? \"numeric\"\n\t};\n}\n\n/**\n * Создаёт функцию Intl-форматирования без timezone-настроек.\n *\n * Стандартный Intl timeStyle=\"long\" и timeStyle=\"full\" выводят timezoneName.\n * Поэтому любые timeStyle-настройки нормализуются в явные поля времени.\n */\nfunction createIntlFormatter(locale: string, options: Intl.DateTimeFormatOptions): CompiledDateFormatter {\n\tconst safeOptions = sanitizeIntlOptions(options);\n\tconst precisionFormatters = new Map<DateFormatPrecision, Intl.DateTimeFormat>();\n\n\tif (safeOptions.timeStyle) {\n\t\tconst timeOptions = getTimeStyleIntlOptions(safeOptions.timeStyle === \"short\" ? \"short\" : \"medium\");\n\n\t\tif (safeOptions.dateStyle) {\n\t\t\tconst dateFormatter = new Intl.DateTimeFormat(locale, { dateStyle: safeOptions.dateStyle });\n\t\t\tconst timeFormatter = new Intl.DateTimeFormat(locale, timeOptions);\n\t\t\treturn (date, precision = \"day\") => {\n\t\t\t\tif (precision === \"day\") return `${dateFormatter.format(date)}, ${timeFormatter.format(date)}`;\n\n\t\t\t\tconst precisionOptions = resolveIntlDatePrecisionOptions({ dateStyle: safeOptions.dateStyle }, precision);\n\t\t\t\tlet precisionFormatter = precisionFormatters.get(precision);\n\t\t\t\tif (!precisionFormatter) {\n\t\t\t\t\tprecisionFormatter = new Intl.DateTimeFormat(locale, precisionOptions);\n\t\t\t\t\tprecisionFormatters.set(precision, precisionFormatter);\n\t\t\t\t}\n\n\t\t\t\treturn precisionFormatter.format(date);\n\t\t\t};\n\t\t}\n\n\t\treturn new Intl.DateTimeFormat(locale, timeOptions).format;\n\t}\n\n\tconst defaultFormatter = new Intl.DateTimeFormat(locale, safeOptions);\n\treturn (date, precision = \"day\") => {\n\t\tif (precision === \"day\") return defaultFormatter.format(date);\n\n\t\tlet precisionFormatter = precisionFormatters.get(precision);\n\t\tif (!precisionFormatter) {\n\t\t\tprecisionFormatter = new Intl.DateTimeFormat(locale, resolveIntlDatePrecisionOptions(safeOptions, precision));\n\t\t\tprecisionFormatters.set(precision, precisionFormatter);\n\t\t}\n\n\t\treturn precisionFormatter.format(date);\n\t};\n}\n\n/**\n * Возвращает значение токена шаблона для календарной даты.\n */\nfunction getPatternTokenValue(token: string, date: Date): string {\n\tconst fullYear = String(date.getFullYear());\n\n\tswitch (token) {\n\t\tcase \"yyyy\":\n\t\t\treturn fullYear;\n\t\tcase \"yy\":\n\t\t\treturn fullYear.slice(-2);\n\t\tcase \"MM\":\n\t\t\treturn padDatePart(date.getMonth() + 1);\n\t\tcase \"dd\":\n\t\t\treturn padDatePart(date.getDate());\n\t\tcase \"HH\":\n\t\t\treturn padDatePart(date.getHours());\n\t\tcase \"mm\":\n\t\t\treturn padDatePart(date.getMinutes());\n\t\tcase \"ss\":\n\t\t\treturn padDatePart(date.getSeconds());\n\t\tdefault:\n\t\t\treturn token;\n\t}\n}\n\n/**\n * Компилирует машинный шаблон в функцию без разбора шаблона на каждый вызов.\n */\nfunction compileFixedPatternFormatter(pattern: string): CompiledDateFormatter {\n\tswitch (pattern) {\n\t\tcase \"yyyyMMdd\":\n\t\t\treturn (date) => `${date.getFullYear()}${padDatePart(date.getMonth() + 1)}${padDatePart(date.getDate())}`;\n\t\tcase \"yyyyMMddHHmmss\":\n\t\t\treturn (date) =>\n\t\t\t\t`${date.getFullYear()}${padDatePart(date.getMonth() + 1)}${padDatePart(date.getDate())}${padDatePart(date.getHours())}${padDatePart(\n\t\t\t\t\tdate.getMinutes()\n\t\t\t\t)}${padDatePart(date.getSeconds())}`;\n\t\tcase \"yyyy-MM-dd\":\n\t\t\treturn (date) => `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(date.getDate())}`;\n\t\tcase \"yyyy-MM-ddTHH:mm:ss\":\n\t\t\treturn (date) =>\n\t\t\t\t`${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(date.getDate())}T${padDatePart(date.getHours())}:${padDatePart(\n\t\t\t\t\tdate.getMinutes()\n\t\t\t\t)}:${padDatePart(date.getSeconds())}`;\n\t\tdefault:\n\t\t\treturn compileGenericPatternFormatter(pattern);\n\t}\n}\n\n/**\n * Компилирует машинный шаблон с учётом точности календарной даты.\n */\nfunction compilePatternFormatter(pattern: string): CompiledDateFormatter {\n\tconst precisionFormatters = new Map<DateFormatPrecision, CompiledDateFormatter>();\n\n\treturn (date, precision = \"day\") => {\n\t\tlet formatter = precisionFormatters.get(precision);\n\t\tif (!formatter) {\n\t\t\tformatter = compileFixedPatternFormatter(resolveDatePatternPrecision(pattern, precision));\n\t\t\tprecisionFormatters.set(precision, formatter);\n\t\t}\n\n\t\treturn formatter(date, \"day\");\n\t};\n}\n\n/**\n * Компилирует произвольный шаблон один раз при регистрации предустановки.\n */\nfunction compileGenericPatternFormatter(pattern: string): CompiledDateFormatter {\n\tconst segments: string[] = [];\n\tlet lastIndex = 0;\n\tlet match: RegExpExecArray | null;\n\n\tDATE_PATTERN_TOKEN_RE.lastIndex = 0;\n\twhile ((match = DATE_PATTERN_TOKEN_RE.exec(pattern))) {\n\t\tif (match.index > lastIndex) segments.push(pattern.slice(lastIndex, match.index));\n\t\tsegments.push(match[0]);\n\t\tlastIndex = match.index + match[0].length;\n\t}\n\tif (lastIndex < pattern.length) segments.push(pattern.slice(lastIndex));\n\n\treturn (date) => {\n\t\tlet result = \"\";\n\t\tfor (const segment of segments) {\n\t\t\tresult += isDatePatternToken(segment) ? getPatternTokenValue(segment, date) : segment;\n\t\t}\n\t\treturn result;\n\t};\n}\n\n/**\n * Форматирует длительность в предскомпилированный time-шаблон.\n */\nfunction formatDurationByPattern(durationMs: number, pattern: string, fallback: string): string {\n\tif (containsDatePatternToken(pattern, DATE_PATTERN_DATE_TOKENS)) return fallback;\n\tif (!containsDatePatternToken(pattern, DATE_PATTERN_TIME_TOKENS)) return fallback;\n\n\tconst sign = durationMs < 0 ? \"-\" : \"\";\n\tconst absoluteSeconds = Math.trunc(Math.abs(durationMs) / 1_000);\n\tconst hours = Math.trunc(absoluteSeconds / 3_600);\n\tconst minutes = Math.trunc((absoluteSeconds % 3_600) / 60);\n\tconst seconds = absoluteSeconds % 60;\n\n\tif (pattern === \"HH:mm\") return `${sign}${padDatePart(hours)}:${padDatePart(minutes)}`;\n\tif (pattern === \"HH:mm:ss\") return `${sign}${padDatePart(hours)}:${padDatePart(minutes)}:${padDatePart(seconds)}`;\n\n\treturn (\n\t\tsign + pattern.replaceAll(\"HH\", padDatePart(hours)).replaceAll(\"mm\", padDatePart(minutes)).replaceAll(\"ss\", padDatePart(seconds))\n\t);\n}\n\n/**\n * Компилирует Intl-форматтер или машинный шаблон для предустановки.\n */\nexport function compileDatePreset(config: DateFormatPresetConfig | DateFormatPreset): CompiledDateFormatPreset {\n\tconst preset: DateFormatPreset = { ...DATE_FORMAT_DEFAULTS, ...config };\n\tconst formatDateTime = createPresetFormatter(preset);\n\tconst durationPattern = preset.durationPattern ?? preset.pattern;\n\tconst compiledPreset: CompiledDateFormatPreset = { ...preset, formatDateTime };\n\n\tif (durationPattern) {\n\t\tcompiledPreset.formatDuration = (durationMs, fallback) => formatDurationByPattern(durationMs, durationPattern, fallback);\n\t}\n\n\treturn compiledPreset;\n}\n\n/**\n * Создаёт функцию форматирования даты для предустановки.\n */\nfunction createPresetFormatter(preset: DateFormatPreset): CompiledDateFormatter {\n\tif (preset.pattern) return compilePatternFormatter(preset.pattern);\n\n\tif (preset.intlDateOptions && preset.intlTimeOptions) {\n\t\tconst dateFormatter = createIntlFormatter(preset.locale, preset.intlDateOptions);\n\t\tconst timeFormatter = createIntlFormatter(preset.locale, preset.intlTimeOptions);\n\t\tconst joiner = preset.intlJoiner ?? \" \";\n\n\t\treturn (date, precision = \"day\") => {\n\t\t\tif (precision !== \"day\") return dateFormatter(date, precision);\n\t\t\treturn `${dateFormatter(date)}${joiner}${timeFormatter(date)}`;\n\t\t};\n\t}\n\n\treturn createIntlFormatter(preset.locale, preset.intlOptions ?? DATE_FORMAT_DEFAULTS.intlOptions);\n}\n\n/**\n * Инициализирует реестр встроенными предустановками.\n */\nfunction initPresets(): void {\n\tfor (const config of BUILTIN_PRESETS) {\n\t\tregistry.set(config.name, compileDatePreset(config));\n\t}\n}\n\ninitPresets();\n\n/**\n * Возвращает предустановку по имени.\n */\nexport function getDatePreset(name: string): DateFormatPreset | undefined {\n\treturn registry.get(name);\n}\n\n/**\n * Возвращает скомпилированную предустановку по имени.\n */\nexport function getCompiledDatePreset(name: string): CompiledDateFormatPreset | undefined {\n\treturn registry.get(name);\n}\n\n/**\n * Возвращает список имён доступных предустановок.\n */\nexport function getDatePresetNames(): string[] {\n\treturn Array.from(registry.keys());\n}\n\n/**\n * Проверяет, что строка является алиасом style-пресета даты.\n */\nexport function isDateFormatStyle(value: string): value is DateFormatStyle {\n\treturn FORMAT_STYLES.includes(value as DateFormatStyle);\n}\n\n/**\n * Проверяет, что строка является поддерживаемой точностью даты.\n */\nexport function isDateFormatPrecision(value: string): value is DateFormatPrecision {\n\treturn FORMAT_PRECISIONS.includes(value as DateFormatPrecision);\n}\n\n/**\n * Нормализует имя пресета, алиас style-формата или ручной шаблон.\n */\nexport function resolveDateFormatName(dateFormat?: string, defaultFormat: string = DEFAULT_DATE_PRESET_NAMES.date): string {\n\tconst normalizedFormat = dateFormat?.trim();\n\tif (!normalizedFormat) return defaultFormat;\n\n\treturn isDateFormatStyle(normalizedFormat) ? DATE_FORMAT_STYLE_PRESET_NAMES[normalizedFormat] : normalizedFormat;\n}\n\n/**\n * Создаёт кешируемый объектный пресет для ручного шаблона.\n */\nfunction createPatternDatePreset(pattern: string, presetName: string, locale: string, invalidFallback: string): DateFormatPreset {\n\tconst cacheKey = `${presetName}\\u0000${locale}\\u0000${invalidFallback}\\u0000${pattern}`;\n\tconst cachedPreset = patternPresetCache.get(cacheKey);\n\tif (cachedPreset) return cachedPreset;\n\n\tconst preset = {\n\t\tname: `${presetName}:${pattern}`,\n\t\tpattern,\n\t\tlocale,\n\t\tinvalidFallback\n\t};\n\n\tpatternPresetCache.set(cacheKey, preset);\n\treturn preset;\n}\n\nexport interface ResolveDateFormatPresetOptions {\n\t/**\n\t * Формат по умолчанию, если входная строка пустая.\n\t */\n\tdefaultFormat?: string;\n\t/**\n\t * Префикс имени для объектных пресетов ручных шаблонов.\n\t */\n\tpatternPresetName?: string;\n\t/**\n\t * Локаль объектного пресета ручного шаблона.\n\t */\n\tlocale?: string;\n\t/**\n\t * Fallback объектного пресета ручного шаблона.\n\t */\n\tinvalidFallback?: string;\n}\n\n/**\n * Возвращает зарегистрированный пресет или кешируемый объектный пресет для ручного шаблона.\n */\nexport function resolveDateFormatPreset(\n\tdateFormat?: string,\n\t{\n\t\tdefaultFormat = DEFAULT_DATE_PRESET_NAMES.date,\n\t\tpatternPresetName = \"__date_pattern__\",\n\t\tlocale = DEFAULT_LOCALE,\n\t\tinvalidFallback = \"\"\n\t}: ResolveDateFormatPresetOptions = {}\n): string | DateFormatPreset {\n\tconst resolvedFormat = resolveDateFormatName(dateFormat, defaultFormat);\n\tif (getDatePreset(resolvedFormat)) return resolvedFormat;\n\n\treturn createPatternDatePreset(resolvedFormat, patternPresetName, locale, invalidFallback);\n}\n\n/**\n * Регистрирует или перезаписывает предустановку.\n */\nexport function registerDatePreset(config: DateFormatPresetConfig): DateFormatPreset {\n\tconst preset = compileDatePreset(config);\n\tregistry.set(preset.name, preset);\n\treturn preset;\n}\n\n/**\n * Сбрасывает реестр к встроенному состоянию.\n */\nexport function resetDatePresets(): void {\n\tregistry.clear();\n\tinitPresets();\n}\n","import { DATE_PATTERN_TOKEN_RE, hasDatePatternTokens, resolveDatePatternPrecision } from \"./pattern\";\nimport { DATE_FORMAT_DEFAULTS, DEFAULT_DATE_PRESET_NAMES, getDatePreset, resolveDateFormatName } from \"./presets\";\n\nimport type { DateFormatPattern, DateFormatPrecision, ParsedDateTimeValue, ParsedDateValue } from \"./types\";\n\n/**\n * Регулярное выражение для OData даты вида `/Date(1720137600000+0300)/`.\n */\nconst ODATA_TICKS_RE = /^\\/Date\\((-?\\d+)([+-]\\d{4})?\\)\\/$/;\n\n/**\n * Регулярное выражение для OData литералов вида `datetime'2026-03-03T18:03:50'`.\n */\nconst ODATA_LITERAL_RE = /^(datetimeoffset|datetime)'(.+)'$/i;\n\n/**\n * Регулярное выражение для ISO-даты без timezone.\n */\nconst ISO_LOCAL_RE = /^(\\d{4})-(\\d{2})-(\\d{2})(?:[T ](\\d{2})(?::(\\d{2})(?::(\\d{2})(?:\\.(\\d{1,9}))?)?)?)?$/;\n\n/**\n * Регулярное выражение для даты с явным timezone.\n */\nconst ISO_ZONED_RE = /(Z|[+-]\\d{2}:?\\d{2})$/i;\n\n/**\n * Регулярное выражение для ABAP даты `YYYYMMDD`.\n */\nconst ABAP_COMPACT_RE = /^\\d{8}$/;\n\n/**\n * Регулярное выражение для ABAP timestamp `YYYYMMDDHHmmss...`.\n * Хвост после секунд содержит доли/служебные разряды и не влияет на календарное время.\n */\nconst ABAP_TIMESTAMP_RE = /^\\d{14,}$/;\n\n/**\n * Регулярное выражение для даты вида `DD.MM.YYYY`.\n */\nconst ABAP_DOTTED_RE = /^(\\d{2})\\.(\\d{2})\\.(\\d{4})$/;\n\n/**\n * Регулярное выражение для даты вида `MM/DD/YYYY`.\n */\nconst SLASH_DATE_RE = /^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/;\n\n/**\n * Регулярное выражение для ISO-8601 длительности.\n */\nconst ISO_DURATION_RE = /^([+-])?P(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+)(?:\\.(\\d+))?S)?)?$/;\n\n/**\n * Набор строковых значений, трактуемых как пустые.\n */\nconst EMPTY_STRING_VALUES = new Set([\"\", \"null\", \"undefined\"]);\n\n/**\n * Константы для расчёта длительностей.\n */\nconst MS_IN_SECOND = 1_000;\nconst MS_IN_MINUTE = 60_000;\nconst MS_IN_HOUR = 3_600_000;\nconst MS_IN_DAY = 86_400_000;\nconst APPROX_DAYS_IN_MONTH = 30;\nconst APPROX_DAYS_IN_YEAR = 365;\nconst TWO_DIGIT_YEAR_PIVOT = 70;\n\n/**\n * Шаблоны ручного ввода для встроенных Intl-пресетов.\n */\nconst DATE_FORMAT_PARSE_PATTERNS: Readonly<Record<string, readonly DateFormatPattern[]>> = Object.freeze({\n\t[DEFAULT_DATE_PRESET_NAMES.date]: Object.freeze([\"dd.MM.yyyy\"] as const),\n\t[DEFAULT_DATE_PRESET_NAMES.dateShort]: Object.freeze([\"dd.MM.yyyy\"] as const),\n\t[DEFAULT_DATE_PRESET_NAMES.datetime]: Object.freeze([\"dd.MM.yyyy HH:mm\"] as const),\n\t[DEFAULT_DATE_PRESET_NAMES.datetimeSeconds]: Object.freeze([\"dd.MM.yyyy HH:mm:ss\"] as const),\n\t[DEFAULT_DATE_PRESET_NAMES.datetimeShort]: Object.freeze([\"dd.MM.yyyy, HH:mm\"] as const)\n});\n\n/**\n * Регулярное выражение для человекочитаемых дат вида `3 марта 2026 г.`.\n */\nconst LOCALIZED_DATE_RE = /^(\\d{1,2})\\s+([\\p{L}.]+)\\s+(\\d{4})(?:\\s*[\\p{L}.]+)?(?:,?\\s+(\\d{1,2}):(\\d{2})(?::(\\d{2}))?)?$/iu;\nconst LOCALIZED_DAY_MONTH_RE = /^(\\d{1,2})\\s+([\\p{L}.]+)$/iu;\nconst LOCALIZED_MONTH_RE = /^([\\p{L}.]+)\\s+(\\d{4})(?:\\s*[\\p{L}.]+)?$/iu;\nconst LOCALIZED_YEAR_RE = /^(\\d{4})(?:\\s*[\\p{L}.]+)?$/iu;\n\nconst localizedMonthIndexCache = new Map<string, ReadonlyMap<string, number>>();\nconst DAY_MONTH_PRESET_NAMES = new Set<string>([DEFAULT_DATE_PRESET_NAMES.monthShort, DEFAULT_DATE_PRESET_NAMES.monthLong]);\n\n/**\n * Создаёт календарную дату без timezone-семантики и валидирует компоненты.\n */\nfunction createCalendarDate(year: number, month: number, day: number, hour = 0, minute = 0, second = 0, millisecond = 0): Date | null {\n\tconst result = new Date(year, month - 1, day, hour, minute, second, millisecond);\n\tconst isValid =\n\t\tresult.getFullYear() === year &&\n\t\tresult.getMonth() === month - 1 &&\n\t\tresult.getDate() === day &&\n\t\tresult.getHours() === hour &&\n\t\tresult.getMinutes() === minute &&\n\t\tresult.getSeconds() === second;\n\n\treturn isValid ? result : null;\n}\n\n/**\n * Нормализует имя месяца из Intl-форматтера для обратного парсинга.\n */\nfunction normalizeLocalizedMonthName(monthName: string, locale: string): string {\n\treturn monthName.toLocaleLowerCase(locale).replace(/\\.$/, \"\");\n}\n\n/**\n * Добавляет имя месяца в runtime-словарь локали.\n */\nfunction addLocalizedMonthName(monthIndex: Map<string, number>, monthName: string, index: number, locale: string): void {\n\tmonthIndex.set(normalizeLocalizedMonthName(monthName, locale), index);\n}\n\n/**\n * Добавляет имя месяца из formatToParts, чтобы учитывать падеж в составе полной даты.\n */\nfunction addLocalizedMonthPart(\n\tmonthIndex: Map<string, number>,\n\tformatter: Intl.DateTimeFormat,\n\tdate: Date,\n\tindex: number,\n\tlocale: string\n): void {\n\tconst monthPart = formatter.formatToParts(date).find((part) => part.type === \"month\");\n\tif (monthPart) addLocalizedMonthName(monthIndex, monthPart.value, index, locale);\n}\n\n/**\n * Собирает словарь названий месяцев через Intl.DateTimeFormat для заданной локали.\n */\nfunction getLocalizedMonthIndex(locale: string): ReadonlyMap<string, number> {\n\tconst cachedIndex = localizedMonthIndexCache.get(locale);\n\tif (cachedIndex) return cachedIndex;\n\n\tconst monthIndex = new Map<string, number>();\n\tconst shortFormatter = new Intl.DateTimeFormat(locale, { month: \"short\" });\n\tconst longFormatter = new Intl.DateTimeFormat(locale, { month: \"long\" });\n\tconst shortDateFormatter = new Intl.DateTimeFormat(locale, { day: \"numeric\", month: \"short\", year: \"numeric\" });\n\tconst longDateFormatter = new Intl.DateTimeFormat(locale, { day: \"numeric\", month: \"long\", year: \"numeric\" });\n\n\tfor (let month = 0; month < 12; month += 1) {\n\t\tconst date = new Date(2026, month, 1);\n\t\taddLocalizedMonthName(monthIndex, shortFormatter.format(date), month, locale);\n\t\taddLocalizedMonthName(monthIndex, longFormatter.format(date), month, locale);\n\t\taddLocalizedMonthPart(monthIndex, shortDateFormatter, date, month, locale);\n\t\taddLocalizedMonthPart(monthIndex, longDateFormatter, date, month, locale);\n\t}\n\n\tlocalizedMonthIndexCache.set(locale, monthIndex);\n\treturn monthIndex;\n}\n\n/**\n * Парсит человекочитаемую дату, сформированную Intl-пресетами текущей локали.\n */\nfunction parseLocalizedDayString(value: string, locale: string): ParsedDateTimeValue | null {\n\tconst match = LOCALIZED_DATE_RE.exec(value.trim());\n\tif (!match) return null;\n\n\tconst day = Number(match[1]);\n\tconst monthIndex = getLocalizedMonthIndex(locale).get(normalizeLocalizedMonthName(match[2], locale));\n\tconst year = Number(match[3]);\n\tconst hour = Number(match[4] ?? 0);\n\tconst minute = Number(match[5] ?? 0);\n\tconst second = Number(match[6] ?? 0);\n\n\tif (monthIndex === undefined) return null;\n\tif (!Number.isFinite(day) || !Number.isFinite(year) || !Number.isFinite(hour) || !Number.isFinite(minute) || !Number.isFinite(second)) {\n\t\treturn null;\n\t}\n\n\tconst parsed = createCalendarDate(year, monthIndex + 1, day, hour, minute, second);\n\treturn parsed ? asDateTimeValue(parsed, \"iso-local\") : null;\n}\n\n/**\n * Парсит человекочитаемую дату без года, сформированную day+month-пресетами.\n */\nfunction parseLocalizedDayMonthString(value: string, locale: string, year: number): ParsedDateTimeValue | null {\n\tconst match = LOCALIZED_DAY_MONTH_RE.exec(value.trim());\n\tif (!match) return null;\n\n\tconst day = Number(match[1]);\n\tconst monthIndex = getLocalizedMonthIndex(locale).get(normalizeLocalizedMonthName(match[2], locale));\n\n\tif (monthIndex === undefined || !Number.isFinite(day)) {\n\t\treturn null;\n\t}\n\n\tconst parsed = createCalendarDate(year, monthIndex + 1, day);\n\treturn parsed ? asDateTimeValue(parsed, \"iso-local\") : null;\n}\n\n/**\n * Парсит человекочитаемый месяц, сформированный Intl-пресетами текущей локали.\n */\nfunction parseLocalizedMonthString(value: string, locale: string): ParsedDateTimeValue | null {\n\tconst match = LOCALIZED_MONTH_RE.exec(value.trim());\n\tif (!match) return null;\n\n\tconst monthIndex = getLocalizedMonthIndex(locale).get(normalizeLocalizedMonthName(match[1], locale));\n\tconst year = Number(match[2]);\n\n\tif (monthIndex === undefined || !Number.isFinite(year)) return null;\n\n\tconst parsed = createCalendarDate(year, monthIndex + 1, 1);\n\treturn parsed ? asDateTimeValue(parsed, \"iso-local\") : null;\n}\n\n/**\n * Парсит человекочитаемый год, сформированный Intl-пресетами текущей локали.\n */\nfunction parseLocalizedYearString(value: string): ParsedDateTimeValue | null {\n\tconst match = LOCALIZED_YEAR_RE.exec(value.trim());\n\tif (!match) return null;\n\n\tconst year = Number(match[1]);\n\tif (!Number.isFinite(year)) return null;\n\n\tconst parsed = createCalendarDate(year, 1, 1);\n\treturn parsed ? asDateTimeValue(parsed, \"iso-local\") : null;\n}\n\n/**\n * Парсит человекочитаемую дату с учётом точности календарного значения.\n */\nfunction parseLocalizedDateString(value: string, locale: string, precision: DateFormatPrecision): ParsedDateTimeValue | null {\n\tif (precision === \"year\") return parseLocalizedYearString(value);\n\tif (precision === \"month\") return parseLocalizedMonthString(value, locale);\n\n\treturn parseLocalizedDayString(value, locale);\n}\n\n/**\n * Проверяет, что формат может быть распарсен как `день месяц` без года.\n */\nfunction isDayMonthPresetName(dateFormat: string): boolean {\n\treturn DAY_MONTH_PRESET_NAMES.has(dateFormat);\n}\n\n/**\n * Возвращает опорный год для пресетов без года.\n */\nfunction resolveReferenceYear(referenceDate: Date | undefined): number {\n\tif (referenceDate instanceof Date && !Number.isNaN(referenceDate.getTime())) {\n\t\treturn referenceDate.getFullYear();\n\t}\n\n\treturn new Date().getFullYear();\n}\n\n/**\n * Пересобирает `Date` в календарную дату через локальные компоненты.\n */\nfunction cloneCalendarDate(date: Date): Date {\n\treturn new Date(\n\t\tdate.getFullYear(),\n\t\tdate.getMonth(),\n\t\tdate.getDate(),\n\t\tdate.getHours(),\n\t\tdate.getMinutes(),\n\t\tdate.getSeconds(),\n\t\tdate.getMilliseconds()\n\t);\n}\n\n/**\n * Пересобирает `Date` в календарную дату через UTC-компоненты.\n *\n * Используется для источников, где дата уже пришла как instant,\n * но визуальные компоненты нужно сохранить без timezone-сдвига.\n */\nfunction cloneUtcCalendarDate(date: Date): Date {\n\treturn new Date(\n\t\tdate.getUTCFullYear(),\n\t\tdate.getUTCMonth(),\n\t\tdate.getUTCDate(),\n\t\tdate.getUTCHours(),\n\t\tdate.getUTCMinutes(),\n\t\tdate.getUTCSeconds(),\n\t\tdate.getUTCMilliseconds()\n\t);\n}\n\n/**\n * Формирует результат парсинга календарной даты/времени.\n */\nfunction asDateTimeValue(date: Date, source: ParsedDateTimeValue[\"source\"]): ParsedDateTimeValue {\n\treturn { kind: \"date-time\", source, date };\n}\n\n/**\n * Парсит timestamp (секунды или миллисекунды Unix epoch).\n */\nfunction parseTimestamp(value: number): ParsedDateTimeValue | null {\n\tif (!Number.isFinite(value)) return null;\n\n\tconst timestamp = Math.abs(value) < 1e12 ? value * 1_000 : value;\n\tconst parsed = new Date(timestamp);\n\tif (Number.isNaN(parsed.getTime())) return null;\n\n\treturn asDateTimeValue(cloneUtcCalendarDate(parsed), \"timestamp\");\n}\n\n/**\n * Парсит OData ticks и учитывает смещение, если оно передано.\n */\nfunction parseODataTicks(value: string): ParsedDateTimeValue | null {\n\tconst match = ODATA_TICKS_RE.exec(value);\n\tif (!match) return null;\n\n\tconst timestamp = Number(match[1]);\n\tif (!Number.isFinite(timestamp)) return null;\n\n\tconst offset = match[2];\n\tif (!offset) return asDateTimeValue(cloneUtcCalendarDate(new Date(timestamp)), \"odata-ticks\");\n\n\tconst sign = offset.startsWith(\"-\") ? -1 : 1;\n\tconst hours = Number(offset.slice(1, 3));\n\tconst minutes = Number(offset.slice(3, 5));\n\tif (!Number.isFinite(hours) || !Number.isFinite(minutes)) return null;\n\n\tconst offsetMs = sign * (hours * MS_IN_HOUR + minutes * MS_IN_MINUTE);\n\treturn asDateTimeValue(cloneUtcCalendarDate(new Date(timestamp + offsetMs)), \"odata-ticks\");\n}\n\n/**\n * Парсит даты без timezone в ISO-подобных форматах.\n */\nfunction parseIsoLocal(value: string): ParsedDateTimeValue | null {\n\tconst match = ISO_LOCAL_RE.exec(value);\n\tif (!match) return null;\n\n\tconst year = Number(match[1]);\n\tconst month = Number(match[2]);\n\tconst day = Number(match[3]);\n\tconst hour = Number(match[4] ?? 0);\n\tconst minute = Number(match[5] ?? 0);\n\tconst second = Number(match[6] ?? 0);\n\tconst millisecondsRaw = (match[7] ?? \"\").slice(0, 3).padEnd(3, \"0\");\n\tconst millisecond = Number(millisecondsRaw || 0);\n\n\tconst parsed = createCalendarDate(year, month, day, hour, minute, second, millisecond);\n\treturn parsed ? asDateTimeValue(parsed, \"iso-local\") : null;\n}\n\n/**\n * Парсит даты с явным timezone.\n */\nfunction parseIsoZoned(value: string): ParsedDateTimeValue | null {\n\tif (!ISO_ZONED_RE.test(value)) return null;\n\n\tconst normalizedValue = value.replace(ISO_ZONED_RE, \"\");\n\tconst parsed = parseIsoLocal(normalizedValue);\n\treturn parsed ? asDateTimeValue(parsed.date, \"iso-zoned\") : null;\n}\n\n/**\n * Парсит ABAP дату формата `YYYYMMDD`.\n */\nfunction parseAbapCompact(value: string): ParsedDateTimeValue | null {\n\tif (!ABAP_COMPACT_RE.test(value)) return null;\n\n\tconst year = Number(value.slice(0, 4));\n\tconst month = Number(value.slice(4, 6));\n\tconst day = Number(value.slice(6, 8));\n\n\tconst parsed = createCalendarDate(year, month, day);\n\treturn parsed ? asDateTimeValue(parsed, \"abap-compact\") : null;\n}\n\n/**\n * Парсит ABAP timestamp формата `YYYYMMDDHHmmss...`.\n */\nfunction parseAbapTimestamp(value: string): ParsedDateTimeValue | null {\n\tif (!ABAP_TIMESTAMP_RE.test(value)) return null;\n\n\tconst year = Number(value.slice(0, 4));\n\tconst month = Number(value.slice(4, 6));\n\tconst day = Number(value.slice(6, 8));\n\tconst hour = Number(value.slice(8, 10));\n\tconst minute = Number(value.slice(10, 12));\n\tconst second = Number(value.slice(12, 14));\n\n\tconst parsed = createCalendarDate(year, month, day, hour, minute, second);\n\treturn parsed ? asDateTimeValue(parsed, \"abap-timestamp\") : null;\n}\n\n/**\n * Парсит дату формата `DD.MM.YYYY`.\n */\nfunction parseAbapDotted(value: string): ParsedDateTimeValue | null {\n\tconst match = ABAP_DOTTED_RE.exec(value);\n\tif (!match) return null;\n\n\tconst day = Number(match[1]);\n\tconst month = Number(match[2]);\n\tconst year = Number(match[3]);\n\n\tconst parsed = createCalendarDate(year, month, day);\n\treturn parsed ? asDateTimeValue(parsed, \"abap-dotted\") : null;\n}\n\n/**\n * Парсит дату формата `MM/DD/YYYY`.\n */\nfunction parseSlashDate(value: string): ParsedDateTimeValue | null {\n\tconst match = SLASH_DATE_RE.exec(value);\n\tif (!match) return null;\n\n\tconst month = Number(match[1]);\n\tconst day = Number(match[2]);\n\tconst year = Number(match[3]);\n\n\tconst parsed = createCalendarDate(year, month, day);\n\treturn parsed ? asDateTimeValue(parsed, \"slash-date\") : null;\n}\n\n/**\n * Парсит OData литералы `datetime'...'` и `datetimeoffset'...'`.\n */\nfunction parseODataLiteral(value: string): ParsedDateTimeValue | null {\n\tconst match = ODATA_LITERAL_RE.exec(value);\n\tif (!match) return null;\n\n\tconst innerValue = match[2].trim();\n\treturn parseDateString(innerValue, \"odata-literal\");\n}\n\n/**\n * Парсит ISO-8601 длительность.\n *\n * Для год/месяц используется приближение: 365 и 30 суток соответственно.\n */\nfunction parseIsoDuration(value: string): ParsedDateValue | null {\n\tconst match = ISO_DURATION_RE.exec(value);\n\tif (!match) return null;\n\n\tconst sign = match[1] === \"-\" ? -1 : 1;\n\tconst years = Number(match[2] ?? 0);\n\tconst months = Number(match[3] ?? 0);\n\tconst days = Number(match[4] ?? 0);\n\tconst hours = Number(match[5] ?? 0);\n\tconst minutes = Number(match[6] ?? 0);\n\tconst seconds = Number(match[7] ?? 0);\n\tconst fractionRaw = (match[8] ?? \"\").slice(0, 3).padEnd(3, \"0\");\n\tconst milliseconds = Number(fractionRaw || 0);\n\n\tconst hasAnyComponent = Boolean(years || months || days || hours || minutes || seconds || milliseconds);\n\tif (!hasAnyComponent) return null;\n\n\tconst durationMs =\n\t\tsign *\n\t\t(years * APPROX_DAYS_IN_YEAR * MS_IN_DAY +\n\t\t\tmonths * APPROX_DAYS_IN_MONTH * MS_IN_DAY +\n\t\t\tdays * MS_IN_DAY +\n\t\t\thours * MS_IN_HOUR +\n\t\t\tminutes * MS_IN_MINUTE +\n\t\t\tseconds * MS_IN_SECOND +\n\t\t\tmilliseconds);\n\n\treturn { kind: \"duration\", source: \"iso-duration\", durationMs };\n}\n\n/**\n * Перезаписывает источник, если требуется проставить контекст вызова.\n */\nfunction withSourceOverride(value: ParsedDateTimeValue, sourceOverride?: ParsedDateTimeValue[\"source\"]): ParsedDateTimeValue {\n\treturn sourceOverride ? { ...value, source: sourceOverride } : value;\n}\n\n/**\n * Парсит строку в дату.\n */\nfunction parseDateString(value: string, sourceOverride?: ParsedDateTimeValue[\"source\"]): ParsedDateTimeValue | null {\n\tconst zoned = parseIsoZoned(value);\n\tif (zoned) return withSourceOverride(zoned, sourceOverride);\n\n\tconst localIso = parseIsoLocal(value);\n\tif (localIso) return withSourceOverride(localIso, sourceOverride);\n\n\tconst dotted = parseAbapDotted(value);\n\tif (dotted) return withSourceOverride(dotted, sourceOverride);\n\n\tconst slashed = parseSlashDate(value);\n\tif (slashed) return withSourceOverride(slashed, sourceOverride);\n\n\tconst timestamp = parseAbapTimestamp(value);\n\tif (timestamp) return withSourceOverride(timestamp, sourceOverride);\n\n\tconst compact = parseAbapCompact(value);\n\tif (compact) return withSourceOverride(compact, sourceOverride);\n\n\tconst timestampAsNumber = Number(value);\n\tif (/^-?\\d+$/.test(value) && Number.isFinite(timestampAsNumber)) {\n\t\tconst timestamp = parseTimestamp(timestampAsNumber);\n\t\tif (timestamp) return withSourceOverride(timestamp, sourceOverride);\n\t}\n\n\treturn null;\n}\n\n/**\n * Экранирует литерал для безопасной подстановки в регулярное выражение.\n */\nfunction escapeRegExp(value: string): string {\n\treturn value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Преобразует двузначный год в четырёхзначный.\n *\n * Значения `00-69` трактуются как `2000-2069`,\n * значения `70-99` трактуются как `1970-1999`.\n */\nfunction resolveTwoDigitYear(year: number): number {\n\treturn year < TWO_DIGIT_YEAR_PIVOT ? 2000 + year : 1900 + year;\n}\n\n/**\n * Парсит строку по пользовательскому шаблону даты.\n *\n * Поддерживаются токены `dd`, `MM`, `yyyy`, `yy`, `HH`, `mm` и `ss`.\n */\nexport interface ParseDateByPatternOptions {\n\t/**\n\t * Точность календарной даты.\n\t */\n\tprecision?: DateFormatPrecision;\n}\n\nexport function parseDateByPattern(\n\tvalue: unknown,\n\tpattern = \"dd.MM.yyyy\",\n\toptions: ParseDateByPatternOptions = {}\n): ParsedDateValue | null {\n\tif (typeof value !== \"string\") {\n\t\treturn parseDateValue(value);\n\t}\n\n\tconst trimmed = value.trim();\n\tif (EMPTY_STRING_VALUES.has(trimmed.toLowerCase())) return null;\n\n\tconst precision = options.precision ?? \"day\";\n\tconst precisionPattern = resolveDatePatternPrecision(pattern, precision);\n\tconst captureNames: string[] = [];\n\tlet cursor = 0;\n\tlet regexPattern = \"^\";\n\tlet matchPart: RegExpExecArray | null = null;\n\n\tDATE_PATTERN_TOKEN_RE.lastIndex = 0;\n\n\twhile ((matchPart = DATE_PATTERN_TOKEN_RE.exec(precisionPattern)) !== null) {\n\t\tregexPattern += escapeRegExp(precisionPattern.slice(cursor, matchPart.index));\n\t\tcaptureNames.push(matchPart[0]);\n\n\t\tif (matchPart[0] === \"yyyy\") regexPattern += \"(\\\\d{4})\";\n\t\telse regexPattern += \"(\\\\d{2})\";\n\n\t\tcursor = matchPart.index + matchPart[0].length;\n\t}\n\n\tif (captureNames.length === 0) return null;\n\n\tregexPattern += `${escapeRegExp(precisionPattern.slice(cursor))}$`;\n\tconst regex = new RegExp(regexPattern);\n\tconst match = regex.exec(trimmed);\n\tif (!match) return null;\n\n\tlet year: number | null = null;\n\tlet month: number | null = null;\n\tlet day: number | null = null;\n\tlet hour = 0;\n\tlet minute = 0;\n\tlet second = 0;\n\n\tfor (let index = 0; index < captureNames.length; index += 1) {\n\t\tconst token = captureNames[index];\n\t\tconst rawValue = match[index + 1];\n\t\tconst numericValue = Number(rawValue);\n\t\tif (!Number.isFinite(numericValue)) return null;\n\n\t\tif (token === \"yyyy\") year = numericValue;\n\t\tif (token === \"yy\") year = resolveTwoDigitYear(numericValue);\n\t\tif (token === \"MM\") month = numericValue;\n\t\tif (token === \"dd\") day = numericValue;\n\t\tif (token === \"HH\") hour = numericValue;\n\t\tif (token === \"mm\") minute = numericValue;\n\t\tif (token === \"ss\") second = numericValue;\n\t}\n\n\tif (!year) return null;\n\tif (precision !== \"year\" && !month) return null;\n\tif (precision === \"day\" && !day) return null;\n\n\tconst parsed = createCalendarDate(year, month ?? 1, day ?? 1, hour, minute, second);\n\treturn parsed ? asDateTimeValue(parsed, \"iso-local\") : null;\n}\n\nexport interface ParseDateByFormatOptions {\n\t/**\n\t * Формат по умолчанию, если входной формат не задан.\n\t */\n\tdefaultFormat?: DateFormatPattern;\n\t/**\n\t * Локаль для обратного парсинга человекочитаемых Intl-строк.\n\t */\n\tlocale?: string;\n\t/**\n\t * Точность календарной даты.\n\t */\n\tprecision?: DateFormatPrecision;\n\t/**\n\t * Опорная дата для пресетов без года, например `month-long`.\n\t */\n\treferenceDate?: Date;\n}\n\n/**\n * Возвращает набор строгих шаблонов для парсинга по имени пресета или ручному формату.\n */\nfunction getDateFormatParsePatterns(dateFormat: string, precision: DateFormatPrecision): readonly DateFormatPattern[] {\n\tconst preset = getDatePreset(dateFormat);\n\tconst presetPatterns = DATE_FORMAT_PARSE_PATTERNS[dateFormat];\n\n\tif (preset?.pattern) return [resolveDatePatternPrecision(preset.pattern, precision)];\n\tif (presetPatterns) return presetPatterns.map((pattern) => resolveDatePatternPrecision(pattern, precision));\n\tif (!preset && hasDatePatternTokens(dateFormat)) return [resolveDatePatternPrecision(dateFormat, precision)];\n\n\treturn [];\n}\n\n/**\n * Парсит календарную дату по имени пресета, style-алиасу или ручному шаблону.\n */\nexport function parseDateByFormat(value: unknown, dateFormat?: string, options: ParseDateByFormatOptions = {}): ParsedDateTimeValue | null {\n\tif (typeof value !== \"string\") {\n\t\tconst parsed = parseDateValue(value);\n\t\treturn parsed?.kind === \"date-time\" ? parsed : null;\n\t}\n\n\tconst trimmed = value.trim();\n\tif (EMPTY_STRING_VALUES.has(trimmed.toLowerCase())) return null;\n\n\tconst precision = options.precision ?? \"day\";\n\tconst resolvedFormat = resolveDateFormatName(dateFormat, options.defaultFormat ?? DEFAULT_DATE_PRESET_NAMES.date);\n\tfor (const pattern of getDateFormatParsePatterns(resolvedFormat, precision)) {\n\t\tconst parsedByPattern = parseDateByPattern(trimmed, pattern, { precision });\n\t\tif (parsedByPattern?.kind === \"date-time\") return parsedByPattern;\n\t}\n\n\tif (precision === \"day\") {\n\t\tconst parsedByValue = parseDateValue(trimmed);\n\t\tif (parsedByValue?.kind === \"date-time\") return parsedByValue;\n\t}\n\n\tconst preset = getDatePreset(resolvedFormat);\n\tconst locale = preset?.locale ?? options.locale ?? DATE_FORMAT_DEFAULTS.locale;\n\n\tif (precision === \"day\" && isDayMonthPresetName(resolvedFormat)) {\n\t\tconst parsedDayMonth = parseLocalizedDayMonthString(trimmed, locale, resolveReferenceYear(options.referenceDate));\n\t\tif (parsedDayMonth) return parsedDayMonth;\n\t}\n\n\treturn parseLocalizedDateString(trimmed, locale, precision);\n}\n\n/**\n * Универсально парсит вход даты/времени из `unknown`.\n */\nexport function parseDateValue(value: unknown): ParsedDateValue | null {\n\tif (value == null) return null;\n\n\tif (value instanceof Date) {\n\t\tif (Number.isNaN(value.getTime())) return null;\n\t\treturn asDateTimeValue(cloneCalendarDate(value), \"date-object\");\n\t}\n\n\tif (typeof value === \"number\") {\n\t\treturn parseTimestamp(value);\n\t}\n\n\tif (typeof value !== \"string\") return null;\n\n\tconst trimmed = value.trim();\n\tif (EMPTY_STRING_VALUES.has(trimmed.toLowerCase())) return null;\n\n\tconst odataTicks = parseODataTicks(trimmed);\n\tif (odataTicks) return odataTicks;\n\n\tconst odataLiteral = parseODataLiteral(trimmed);\n\tif (odataLiteral) return odataLiteral;\n\n\tconst duration = parseIsoDuration(trimmed);\n\tif (duration) return duration;\n\n\treturn parseDateString(trimmed);\n}\n\n/**\n * Преобразует результат парсинга к `Date`, в том числе для duration-значений.\n *\n * Для duration используется та же \"плавающая\" календарная семантика, что и для timestamp:\n * UTC-компоненты пересобираются в локальный `Date`, чтобы не появлялся timezone-сдвиг.\n */\nfunction coerceParsedDateToDate(value: ParsedDateValue | null): Date | null {\n\tif (!value) return null;\n\tif (value.kind === \"date-time\") return value.date;\n\n\tconst durationDate = new Date(value.durationMs);\n\tif (Number.isNaN(durationDate.getTime())) return null;\n\n\treturn cloneUtcCalendarDate(durationDate);\n}\n\n/**\n * Универсально парсит вход и всегда возвращает `Date | null`.\n */\nexport function parseDate(value: unknown): Date | null {\n\treturn coerceParsedDateToDate(parseDateValue(value));\n}\n","import { parseDateValue } from \"./parseDate\";\nimport { compileDatePreset, CompiledDateFormatPreset, DEFAULT_DATE_PRESET_NAMES, getCompiledDatePreset } from \"./presets\";\nimport { DateFormatPrecision, DateFormatPreset, FormatDateOptions, ParsedDateValue } from \"./types\";\n\n/**\n * Кеш скомпилированных объектных предустановок.\n *\n * Именованные предустановки компилируются в реестре, а объектные могут\n * передаваться напрямую в горячем пути таблиц. WeakMap сохраняет готовый\n * Intl.DateTimeFormat на время жизни объекта и не мешает сборке мусора.\n */\nconst objectPresetCache = new WeakMap<DateFormatPreset, CompiledDateFormatPreset>();\n\n/**\n * Дополняет числовую часть даты ведущим нулём.\n */\nfunction padDatePart(value: number): string {\n\treturn String(value).padStart(2, \"0\");\n}\n\n/**\n * Разрешает предустановку по имени или объекту.\n */\nfunction resolvePreset(presetOrName: string | DateFormatPreset): CompiledDateFormatPreset {\n\tif (typeof presetOrName !== \"string\") {\n\t\tconst cachedPreset = objectPresetCache.get(presetOrName);\n\t\tif (cachedPreset) return cachedPreset;\n\n\t\tconst compiledPreset = compileDatePreset(presetOrName);\n\t\tobjectPresetCache.set(presetOrName, compiledPreset);\n\t\treturn compiledPreset;\n\t}\n\n\tconst preset = getCompiledDatePreset(presetOrName);\n\tif (!preset) {\n\t\tthrow new Error(`Предустановка даты \"${presetOrName}\" не найдена`);\n\t}\n\treturn preset;\n}\n\n/**\n * Определяет fallback с учётом опций вызова и предустановки.\n */\nfunction resolveFallback(preset: CompiledDateFormatPreset, options?: FormatDateOptions): string {\n\treturn options?.fallback ?? preset.invalidFallback;\n}\n\n/**\n * Форматирует уже распарсенное значение.\n */\nfunction formatParsedValue(\n\tparsed: ParsedDateValue,\n\tpreset: CompiledDateFormatPreset,\n\tfallback: string,\n\tprecision: DateFormatPrecision\n): string {\n\tif (parsed.kind === \"duration\") {\n\t\treturn preset.formatDuration ? preset.formatDuration(parsed.durationMs, fallback) : fallback;\n\t}\n\n\treturn preset.formatDateTime(parsed.date, precision);\n}\n\n/**\n * Универсально форматирует дату/время по предустановке или её имени.\n */\nexport function formatDate(\n\tvalue: unknown,\n\tpresetOrName: string | DateFormatPreset = DEFAULT_DATE_PRESET_NAMES.date,\n\toptions?: FormatDateOptions\n): string {\n\tconst preset = resolvePreset(presetOrName);\n\tconst fallback = resolveFallback(preset, options);\n\tconst precision = options?.precision ?? \"day\";\n\tconst parsed = parseDateValue(value);\n\n\tif (!parsed) return fallback;\n\treturn formatParsedValue(parsed, preset, fallback, precision);\n}\n\n/**\n * Форматирует значение как дату `dd.MM.yyyy`.\n */\nexport function formatDateAsDate(value: unknown, options?: FormatDateOptions): string {\n\treturn formatDate(value, DEFAULT_DATE_PRESET_NAMES.date, options);\n}\n\n/**\n * Форматирует значение как дату и время `dd.MM.yyyy HH:mm`.\n */\nexport function formatDateAsDateTime(value: unknown, options?: FormatDateOptions): string {\n\treturn formatDate(value, DEFAULT_DATE_PRESET_NAMES.datetime, options);\n}\n\n/**\n * Форматирует значение как время `HH:mm`.\n */\nexport function formatDateAsTime(value: unknown, options?: FormatDateOptions): string {\n\treturn formatDate(value, DEFAULT_DATE_PRESET_NAMES.time, options);\n}\n\n/**\n * Форматирует значение как время `HH:mm:ss`.\n */\nexport function formatDateAsTimeSeconds(value: unknown, options?: FormatDateOptions): string {\n\treturn formatDate(value, DEFAULT_DATE_PRESET_NAMES.timeSeconds, options);\n}\n\n/**\n * Форматирует значение как короткую дату `03.03.2026`.\n */\nexport function formatDateAsDateShort(value: unknown, options?: FormatDateOptions): string {\n\treturn formatDate(value, DEFAULT_DATE_PRESET_NAMES.dateShort, options);\n}\n\n/**\n * Форматирует значение как среднюю дату `3 мар. 2026 г.`.\n */\nexport function formatDateAsDateMedium(value: unknown, options?: FormatDateOptions): string {\n\treturn formatDate(value, DEFAULT_DATE_PRESET_NAMES.dateMedium, options);\n}\n\n/**\n * Форматирует значение как длинную дату `3 марта 2026 г.`.\n */\nexport function formatDateAsDateLong(value: unknown, options?: FormatDateOptions): string {\n\treturn formatDate(value, DEFAULT_DATE_PRESET_NAMES.dateLong, options);\n}\n\n/**\n * Форматирует значение как короткую дату без года `3 мар.`.\n */\nexport function formatDateAsMonthShort(value: unknown, options?: FormatDateOptions): string {\n\treturn formatDate(value, DEFAULT_DATE_PRESET_NAMES.monthShort, options);\n}\n\n/**\n * Форматирует значение как длинную дату без года `3 марта`.\n */\nexport function formatDateAsMonthLong(value: unknown, options?: FormatDateOptions): string {\n\treturn formatDate(value, DEFAULT_DATE_PRESET_NAMES.monthLong, options);\n}\n\n/**\n * Форматирует значение как короткое время `18:03`.\n */\nexport function formatDateAsTimeShort(value: unknown, options?: FormatDateOptions): string {\n\treturn formatDate(value, DEFAULT_DATE_PRESET_NAMES.timeShort, options);\n}\n\n/**\n * Форматирует значение как среднее время `18:03:50`.\n */\nexport function formatDateAsTimeMedium(value: unknown, options?: FormatDateOptions): string {\n\treturn formatDate(value, DEFAULT_DATE_PRESET_NAMES.timeMedium, options);\n}\n\n/**\n * Форматирует значение как длинное время `18:03:50`.\n */\nexport function formatDateAsTimeLong(value: unknown, options?: FormatDateOptions): string {\n\treturn formatDate(value, DEFAULT_DATE_PRESET_NAMES.timeLong, options);\n}\n\n/**\n * Форматирует значение как короткую дату и время `03.03.2026 18:03`.\n */\nexport function formatDateAsDatetimeShort(value: unknown, options?: FormatDateOptions): string {\n\treturn formatDate(value, DEFAULT_DATE_PRESET_NAMES.datetimeShort, options);\n}\n\n/**\n * Форматирует значение как среднюю дату и время `3 мар. 2026 г. 18:03:50`.\n */\nexport function formatDateAsDatetimeMedium(value: unknown, options?: FormatDateOptions): string {\n\treturn formatDate(value, DEFAULT_DATE_PRESET_NAMES.datetimeMedium, options);\n}\n\n/**\n * Форматирует значение как длинную дату и время `3 марта 2026 г. 18:03:50`.\n */\nexport function formatDateAsDatetimeLong(value: unknown, options?: FormatDateOptions): string {\n\treturn formatDate(value, DEFAULT_DATE_PRESET_NAMES.datetimeLong, options);\n}\n\n/**\n * Форматирует диапазон дат через разделитель ` - `.\n */\nexport function formatDateRange(\n\tstartValue: unknown,\n\tendValue: unknown,\n\tpresetOrName: string | DateFormatPreset = DEFAULT_DATE_PRESET_NAMES.date,\n\toptions?: FormatDateOptions\n): string {\n\tconst preset = resolvePreset(presetOrName);\n\tconst fallback = resolveFallback(preset, options);\n\tconst precision = options?.precision ?? \"day\";\n\n\tconst startParsed = parseDateValue(startValue);\n\tconst endParsed = parseDateValue(endValue);\n\tif (!startParsed || !endParsed) return fallback;\n\n\tconst start = formatParsedValue(startParsed, preset, fallback, precision);\n\tconst end = formatParsedValue(endParsed, preset, fallback, precision);\n\tif (!start || !end) return fallback;\n\n\treturn `${start} - ${end}`;\n}\n\n/**\n * Форматирует значение как год `yyyy`.\n */\nexport function formatDateAsAbapYear(value: unknown, options?: FormatDateOptions): string {\n\treturn formatDate(value, DEFAULT_DATE_PRESET_NAMES.abapYear, options);\n}\n\n/**\n * Форматирует значение как календарный месяц `yyyyMM`.\n */\nexport function formatDateAsAbapMonth(value: unknown, options?: FormatDateOptions): string {\n\treturn formatDate(value, DEFAULT_DATE_PRESET_NAMES.abapMonth, options);\n}\n\n/**\n * Форматирует значение как дату `yyyyMMdd`.\n */\nexport function formatDateAsAbapDate(value: unknown, options?: FormatDateOptions): string {\n\treturn formatDate(value, DEFAULT_DATE_PRESET_NAMES.abapDate, options);\n}\n\n/**\n * Форматирует значение как дату `yyyyMMddHHmmss`.\n */\nexport function formatDateAsAbapDatetime(value: unknown, options?: FormatDateOptions): string {\n\treturn formatDate(value, DEFAULT_DATE_PRESET_NAMES.abapDatetime, options);\n}\n\n/**\n * Форматирует значение как дату `yyyy-MM-dd`.\n */\nexport function formatDateAsODataDate(value: unknown, options?: FormatDateOptions): string {\n\treturn formatDate(value, DEFAULT_DATE_PRESET_NAMES.odataDate, options);\n}\n\n/**\n * Форматирует значение как дату и время `yyyy-MM-ddTHH:mm:ss`.\n */\nexport function formatDateAsODataDatetime(value: unknown, options?: FormatDateOptions): string {\n\treturn formatDate(value, DEFAULT_DATE_PRESET_NAMES.odataDatetime, options);\n}\n\n/**\n * Форматирует значение как время `PT00H00M00S`.\n */\nexport function formatDateAsODataTime(value: unknown, options?: FormatDateOptions): string {\n\tconst fallback = options?.fallback ?? \"\";\n\tconst parsed = parseDateValue(value);\n\tif (!parsed) return fallback;\n\n\tif (parsed.kind === \"duration\") {\n\t\tconst timePreset = resolvePreset(DEFAULT_DATE_PRESET_NAMES.timeSeconds);\n\t\tconst formattedDuration = timePreset.formatDuration?.(parsed.durationMs, fallback) ?? fallback;\n\t\tif (formattedDuration === fallback) return fallback;\n\n\t\tconst [hours = \"00\", minutes = \"00\", seconds = \"00\"] = formattedDuration.split(\":\");\n\t\treturn `PT${hours}H${minutes}M${seconds}S`;\n\t}\n\n\tconst date = parsed.date;\n\treturn `PT${padDatePart(date.getHours())}H${padDatePart(date.getMinutes())}M${padDatePart(date.getSeconds())}S`;\n}\n","import { formatDateAsODataDatetime, formatDateAsODataTime } from \"../formatters/date/formatDate\";\n\n/**\n * Форматы в стиле OData (совместимы с SAP UI5 DateFormat)\n *\n * Примеры:\n * * datetime'2025-11-11T12:00:00'\n * * datetimeoffset'2025-11-11T12:00:00Z'\n * * time'PT12H30M00S'\n */\nexport const ODataDateFormat = {\n\tdatetime(date: Date): string {\n\t\treturn `datetime'${formatDateAsODataDatetime(date)}'`;\n\t},\n\tdatetimeOffset(date: Date): string {\n\t\treturn `datetimeoffset'${date.toISOString()}'`;\n\t},\n\ttime(date: Date): string {\n\t\treturn `time'${formatDateAsODataTime(date)}'`;\n\t}\n};\n"],"mappings":"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"}