@ryuzaki13/react-foundation-lib 2.32.0 → 2.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
- import { $ as e, A as t, At as n, B as r, Bt as i, C as a, Ct as o, D as s, Dt as c, E as l, Et as u, F as d, Ft as f, G as p, Gt as m, H as h, Ht as g, I as _, It as v, J as y, Jt as b, K as x, Kt as S, L as C, Lt as w, M as T, Mt as E, N as D, Nt as O, O as k, Ot as A, P as j, Pt as M, Q as N, R as P, Rt as F, S as I, St as L, T as R, Tt as z, U as B, Ut as V, V as H, Vt as U, W, Wt as G, X as K, Y as q, Z as J, _ as Y, _t as X, a as Z, at as Q, b as $, bt as ee, c as te, ct as ne, d as re, dt as ie, et as ae, f as oe, ft as se, g as ce, gt as le, h as ue, ht as de, i as fe, it as pe, j as me, jt as he, k as ge, kt as _e, l as ve, lt as ye, m as be, mt as xe, n as Se, nt as Ce, o as we, ot as Te, p as Ee, pt as De, q as Oe, qt as ke, r as Ae, rt as je, s as Me, st as Ne, t as Pe, tt as Fe, u as Ie, ut as Le, v as Re, vt as ze, w as Be, wt as Ve, x as He, xt as Ue, y as We, yt as Ge, z as Ke, zt as qe } from "../chunks/formatters-CO40zvVB.js";
1
+ import { $ as e, A as t, At as n, B as r, Bt as i, C as a, Ct as o, D as s, Dt as c, E as l, Et as u, F as d, Ft as f, G as p, Gt as m, H as h, Ht as g, I as _, It as v, J as y, Jt as b, K as x, Kt as S, L as C, Lt as w, M as T, Mt as E, N as D, Nt as O, O as k, Ot as A, P as j, Pt as M, Q as N, R as P, Rt as F, S as I, St as L, T as R, Tt as z, U as B, Ut as V, V as H, Vt as U, W, Wt as G, X as K, Y as q, Z as J, _ as Y, _t as X, a as Z, at as Q, b as $, bt as ee, c as te, ct as ne, d as re, dt as ie, et as ae, f as oe, ft as se, g as ce, gt as le, h as ue, ht as de, i as fe, it as pe, j as me, jt as he, k as ge, kt as _e, l as ve, lt as ye, m as be, mt as xe, n as Se, nt as Ce, o as we, ot as Te, p as Ee, pt as De, q as Oe, qt as ke, r as Ae, rt as je, s as Me, st as Ne, t as Pe, tt as Fe, u as Ie, ut as Le, v as Re, vt as ze, w as Be, wt as Ve, x as He, xt as Ue, y as We, yt as Ge, z as Ke, zt as qe } from "../chunks/formatters-CMfD97RB.js";
2
2
  import { _ as Je, b as Ye, g as Xe, v as Ze, x as Qe, y as $e } from "../chunks/array-bd7LYFto.js";
3
3
  import { C as et, D as tt, E as nt, O as rt, S as it, T as at, _ as ot, at as st, b as ct, c as lt, d as ut, f as dt, it as ft, l as pt, m as mt, o as ht, ot as gt, p as _t, s as vt, st as yt, u as bt, v as xt, w as St, x as Ct, y as wt } from "../chunks/scalarTypeClassification-D4YcGxtQ.js";
4
4
  import { C as Tt, D as Et, E as Dt, O as Ot, S as kt, T as At, _ as jt, a as Mt, b as Nt, c as Pt, d as Ft, f as It, g as Lt, h as Rt, i as zt, k as Bt, l as Vt, m as Ht, n as Ut, o as Wt, p as Gt, r as Kt, s as qt, t as Jt, u as Yt, v as Xt, w as Zt, x as Qt, y as $t } from "../chunks/formatDate-CNPcfNte.js";
5
- import { B as en, H as tn, R as nn, U as rn, V as an, _ as on, c as sn, d as cn, f as ln, g as un, h as dn, l as fn, m as pn, n as mn, o as hn, p as gn, r as _n, s as vn, t as yn, u as bn, z as xn } from "../chunks/validate-8URYKKly.js";
5
+ import { B as en, H as tn, R as nn, U as rn, V as an, _ as on, c as sn, d as cn, f as ln, g as un, h as dn, l as fn, m as pn, n as mn, o as hn, p as gn, r as _n, s as vn, t as yn, u as bn, z as xn } from "../chunks/validate-rivmPJyV.js";
6
6
  export { dt as DATE_FORMAT_DEFAULTS, _t as DATE_FORMAT_STYLE_PRESET_NAMES, at as DATE_PATTERN_DATE_TOKENS, nt as DATE_PATTERN_TIME_TOKENS, tt as DATE_PATTERN_TOKENS, rt as DATE_PATTERN_TOKEN_RE, mt as DEFAULT_DATE_PRESET_NAMES, nn as DEFAULT_NUMBER_PRESET_NAMES, Se as DEFAULT_VALUE_STATES, xn as NUMBER_FORMAT_DEFAULTS, Ae as VALUE_STATE_COLOR_TOKENS, Te as addCalendarDays, Ne as addCalendarMonths, ne as addCalendarYears, ee as clearFormatCache, le as clearPhone, q as cloneDate, cn as cloneFormatterPipelinePlanStep, ln as cloneFormatterPipelinePlanStepToNode, gn as cloneFormattersPipelineConfig, pn as cloneNormalizeLeadingZerosConfig, dn as cloneResolveValueStateConfig, un as cloneRowBasedOverrideConfig, on as cloneTypedValueFormatConfig, Be as collectFormattersPipelineDependencyIds, R as collectRuntimeFieldDependencyIds, re as compileFormattersPipelineExecutor, fe as compileFormattersPipelineRuntime, Z as compileFormattersPipelineRuntimeFields, Y as computeShortHash, hn as configureRowBasedFormatterRegistry, K as countCalendarDaysInDateRange, ye as createCalendarDate, d as createEducationDateTime, ue as createFixedResolver, bn as createRowBasedFormatterContext, vn as createRowBasedFormatterRegistry, Ee as createThresholdResolver, Re as findResolverByCanonicalKey, Jt as formatDate, Ut as formatDateAsAbapDate, Kt as formatDateAsAbapDatetime, zt as formatDateAsAbapMonth, Mt as formatDateAsAbapYear, Wt as formatDateAsDate, qt as formatDateAsDateLong, Pt as formatDateAsDateMedium, Vt as formatDateAsDateShort, Yt as formatDateAsDateTime, Ft as formatDateAsDatetimeLong, It as formatDateAsDatetimeMedium, Gt as formatDateAsDatetimeShort, Ht as formatDateAsMonthLong, Rt as formatDateAsMonthMedium, Lt as formatDateAsMonthShort, jt as formatDateAsMonthYearLong, Xt as formatDateAsMonthYearMedium, $t as formatDateAsODataDate, Nt as formatDateAsODataDatetime, Qt as formatDateAsODataTime, kt as formatDateAsTime, Tt as formatDateAsTimeLong, Zt as formatDateAsTimeMedium, At as formatDateAsTimeSeconds, Dt as formatDateAsTimeShort, Et as formatDateRange, ze as formatDurationMinutes, _ as formatEducationDateKey, C as formatEducationTimeKey, Ge as formatFileSize, i as formatFullName, j as formatInstantDateTime, Ue as formatNumber, L as formatNumberAsCurrency, o as formatNumberAsCurrencyOrEmpty, Ve as formatNumberAsDecimal, z as formatNumberAsDecimal2, u as formatNumberAsDecimal2OrEmpty, c as formatNumberAsDecimal3, A as formatNumberAsDecimal3OrEmpty, _e as formatNumberAsDecimalOrEmpty, n as formatNumberAsInteger, he as formatNumberAsIntegerOrEmpty, E as formatNumberAsPercent, O as formatNumberAsPercentOrEmpty, M as formatNumberAsPrice, f as formatNumberAsPriceOrEmpty, v as formatNumberAsTonnage, w as formatNumberAsTonnageOrEmpty, X as formatPhone, we as formatPipelineDisplayValue, ke as formatRussianPlural, U as formatShortName, oe as formatTypedCellValue, je as getCalendarPeriod, P as getCurrentEducationWeekKey, ot as getDatePreset, xt as getDatePresetNames, Ke as getEducationWeekDays, r as getEducationWeekRange, H as getEducationWeekStartDate, h as getEducationYear, B as getEducationYearRange, Le as getEndOfDay, te as getFormattersPipelineDefinitionById, ve as getFormattersPipelineDefinitions, en as getNumberPreset, an as getNumberPresetNames, sn as getRowBasedFormatterById, fn as getRowBasedFormatterList, ie as getStartOfDay, se as getStartOfMonth, De as getStartOfWeek, xe as getStartOfYear, We as getValueStateResolver, $ as getValueStateResolverIds, pe as isCalendarPeriodWithinDateBounds, W as isCurrentEducationWeek, wt as isDateFormatPrecision, ct as isDateFormatStyle, Q as isDateInsideCalendarPeriod, J as isDateRangeTuple, p as isEducationDateInCurrentYear, ft as isPositiveValue, de as isSameCalendarDay, N as isValidDate, qe as isZeroValue, e as normalizeDateRange, k as normalizeDateRangeReferenceDate, x as normalizeEducationWeekKey, Ie as normalizeFormattersPipelineConfig, l as normalizeLeadingZeros, s as normalizeLeadingZerosStrict, Xe as normalizeRequiredText, Je as normalizeText, Ze as normalizeTextSpaces, $e as normalizeTextToLower, Ye as normalizeTextWithFallback, ae as orderDates, Ot as parseAbapBoolean, Bt as parseBoolean, ht as parseDate, vt as parseDateByFormat, lt as parseDateByPattern, pt as parseDateTZ, bt as parseDateValue, ut as parseDateValueTZ, Oe as parseEducationDateKey, st as parseNumber, Ct as registerDatePreset, ce as registerFixedResolver, tn as registerNumberPreset, He as registerResolver, be as registerThresholdResolver, Me as rekeyFormattersPipelineConfig, Fe as requireDateRange, it as resetDatePresets, rn as resetNumberPresets, I as resetValueStateResolvers, et as resolveDateFormatName, St as resolveDateFormatPreset, Ce as resolveDateRangePair, y as resolveEducationWeekKey, ge as resolveMonthAgoRange, t as resolveMonthStartToTodayRange, me as resolveMonthStartToYesterdayRange, T as resolveTodayRange, a as resolveValueState, Pe as resolveValueStateClassName, D as resolveYesterdayRange, b as selectRussianPluralForm, S as startsWithIgnoringZeros, m as stripInnerSpaces, G as stripLeadingZeros, g as toAbapBoolean, gt as toFiniteNumber, yt as toPositiveInteger, Qe as toSafeString, F as truncateNumber, V as truncateText, yn as validateFormattersPipelineConfig, mn as validateFormattersPipelineGraph, _n as validateFormattersPipelinePlan };
@@ -1,5 +1,5 @@
1
1
  import { TABLE_FORMULA_NOT_FOUND, TABLE_FORMULA_INVALID_RESULT, TABLE_FORMULA_RUNTIME_ERROR } from "./tableFormulaConstants";
2
- import { type TableFormulaContext, type TableFormulaDependency, type TableFormulaRowData } from "./types";
2
+ import { type TableFormulaContext, type TableFormulaDependency, type TableFormulaResolvedArgument, type TableFormulaRowData } from "./types";
3
3
  type TableFormulaContextInstrumentation = {
4
4
  onReadIndex?: (index: number) => void;
5
5
  onOutOfRangeIndex?: (index: number) => void;
@@ -17,6 +17,28 @@ export type TableFormulaExecutionResult = {
17
17
  reason: typeof TABLE_FORMULA_NOT_FOUND | typeof TABLE_FORMULA_INVALID_RESULT | typeof TABLE_FORMULA_RUNTIME_ERROR;
18
18
  };
19
19
  export type TableFormulaCompiledExecutor = (rowData: TableFormulaRowData) => TableFormulaExecutionResult;
20
+ /** Каждый вызов получает свой набор готовых значений, не удерживаемый compiled executor. */
21
+ export type TableFormulaResolvedExecutor = (resolvedArguments: readonly TableFormulaResolvedArgument[]) => TableFormulaExecutionResult;
22
+ type CompileTableFormulaWithResolvedArgumentsResult = {
23
+ ok: true;
24
+ execute: TableFormulaResolvedExecutor;
25
+ } | {
26
+ ok: false;
27
+ reason: typeof TABLE_FORMULA_NOT_FOUND;
28
+ };
29
+ /**
30
+ * Компилирует зарегистрированную формулу независимо от строк и источников её аргументов.
31
+ * Host разрешает позиции перед каждым execute; отдельный контекст сохраняет корректность
32
+ * вложенного вызова того же executor без общего изменяемого указателя на массив.
33
+ */
34
+ export declare function compileTableFormulaWithResolvedArguments(args: {
35
+ formulaId: string | undefined;
36
+ }): CompileTableFormulaWithResolvedArgumentsResult;
37
+ /** Разовое выполнение готовых позиций; загрузка источников и их диагностика принадлежат host. */
38
+ export declare function executeTableFormulaWithResolvedArguments(args: {
39
+ formulaId: string | undefined;
40
+ arguments: readonly TableFormulaResolvedArgument[];
41
+ }): TableFormulaExecutionResult;
20
42
  type CompileTableFormulaResult = {
21
43
  ok: true;
22
44
  execute: TableFormulaCompiledExecutor;
@@ -1 +1 @@
1
- {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/formulas/execute.ts"],"names":[],"mappings":"AAEA,OAAO,EAEN,uBAAuB,EACvB,4BAA4B,EAC5B,2BAA2B,EAC3B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,sBAAsB,EAAE,KAAK,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE1G,KAAK,kCAAkC,GAAG;IACzC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C,CAAC;AAkBF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC/C,OAAO,EAAE,mBAAmB,CAAC;IAC7B,IAAI,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACzC,eAAe,CAAC,EAAE,kCAAkC,CAAC;CACrD,GAAG,mBAAmB,CAiCtB;AAED,MAAM,MAAM,2BAA2B,GACpC;IACA,EAAE,EAAE,IAAI,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;CACb,GACD;IACA,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,OAAO,uBAAuB,GAAG,OAAO,4BAA4B,GAAG,OAAO,2BAA2B,CAAC;CACjH,CAAC;AAEL,MAAM,MAAM,4BAA4B,GAAG,CAAC,OAAO,EAAE,mBAAmB,KAAK,2BAA2B,CAAC;AAEzG,KAAK,yBAAyB,GAC3B;IACA,EAAE,EAAE,IAAI,CAAC;IACT,OAAO,EAAE,4BAA4B,CAAC;CACrC,GACD;IACA,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,OAAO,uBAAuB,CAAC;CACtC,CAAC;AAEL,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACzC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,IAAI,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACzC,GAAG,yBAAyB,CAmD5B;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACzC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,IAAI,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACzC,GAAG,2BAA2B,CAU9B"}
1
+ {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/formulas/execute.ts"],"names":[],"mappings":"AAEA,OAAO,EAEN,uBAAuB,EACvB,4BAA4B,EAC5B,2BAA2B,EAC3B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACN,KAAK,mBAAmB,EAExB,KAAK,sBAAsB,EAC3B,KAAK,4BAA4B,EACjC,KAAK,mBAAmB,EACxB,MAAM,SAAS,CAAC;AAEjB,KAAK,kCAAkC,GAAG;IACzC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C,CAAC;AAkBF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC/C,OAAO,EAAE,mBAAmB,CAAC;IAC7B,IAAI,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACzC,eAAe,CAAC,EAAE,kCAAkC,CAAC;CACrD,GAAG,mBAAmB,CAiCtB;AAED,MAAM,MAAM,2BAA2B,GACpC;IACA,EAAE,EAAE,IAAI,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;CACb,GACD;IACA,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,OAAO,uBAAuB,GAAG,OAAO,4BAA4B,GAAG,OAAO,2BAA2B,CAAC;CACjH,CAAC;AAEL,MAAM,MAAM,4BAA4B,GAAG,CAAC,OAAO,EAAE,mBAAmB,KAAK,2BAA2B,CAAC;AAEzG,4FAA4F;AAC5F,MAAM,MAAM,4BAA4B,GAAG,CAAC,iBAAiB,EAAE,SAAS,4BAA4B,EAAE,KAAK,2BAA2B,CAAC;AAgDvI,KAAK,8CAA8C,GAClD;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,4BAA4B,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,OAAO,uBAAuB,CAAA;CAAE,CAAC;AAE7G;;;;GAIG;AACH,wBAAgB,wCAAwC,CAAC,IAAI,EAAE;IAC9D,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B,GAAG,8CAA8C,CAUjD;AAED,iGAAiG;AACjG,wBAAgB,wCAAwC,CAAC,IAAI,EAAE;IAC9D,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,SAAS,4BAA4B,EAAE,CAAC;CACnD,GAAG,2BAA2B,CAO9B;AAED,KAAK,yBAAyB,GAC3B;IACA,EAAE,EAAE,IAAI,CAAC;IACT,OAAO,EAAE,4BAA4B,CAAC;CACrC,GACD;IACA,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,OAAO,uBAAuB,CAAC;CACtC,CAAC;AAEL,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACzC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,IAAI,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACzC,GAAG,yBAAyB,CA2C5B;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACzC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,IAAI,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACzC,GAAG,2BAA2B,CAU9B"}
@@ -1,2 +1,2 @@
1
- import { a as e, c as t, i as n, l as r, n as i, o as a, r as o, s, t as c } from "../chunks/formulas-Y0HOcFhe.js";
2
- export { o as compileTableFormula, a as configureTableFormulaRegistry, n as createTableFormulaContext, s as createTableFormulaRegistry, e as executeTableFormula, i as formatTableFormulaExpression, t as getTableFormulaById, r as getTableFormulaList, c as validateTableFormulaDependencies };
1
+ import { a as e, c as t, d as n, i as r, l as i, n as a, o, r as s, s as c, t as l, u } from "../chunks/formulas-BZtCqzBj.js";
2
+ export { s as compileTableFormula, r as compileTableFormulaWithResolvedArguments, t as configureTableFormulaRegistry, e as createTableFormulaContext, i as createTableFormulaRegistry, o as executeTableFormula, c as executeTableFormulaWithResolvedArguments, a as formatTableFormulaExpression, u as getTableFormulaById, n as getTableFormulaList, l as validateTableFormulaDependencies };
@@ -10,8 +10,18 @@ export type TableFormulaDependency = string | {
10
10
  readonly kind: typeof TABLE_FORMULA_DEPENDENCY_KIND_CONSTANT;
11
11
  readonly value: number;
12
12
  };
13
+ /**
14
+ * Значение позиционного аргумента, источник которого уже разрешило host-приложение.
15
+ *
16
+ * value сохраняется буквально, включая undefined. key задаётся только для поля
17
+ * текущей строки: константам и внешним агрегатам синтетические ключи не нужны.
18
+ */
19
+ export type TableFormulaResolvedArgument = {
20
+ readonly value: unknown;
21
+ readonly key?: string;
22
+ };
13
23
  export interface TableFormulaContext {
14
- /** Возвращает ID только для аргумента-поля; у константы ключа строки нет. */
24
+ /** Возвращает ID поля текущей строки; у констант и внешних значений ключа строки нет. */
15
25
  key: (index: number) => string | undefined;
16
26
  value: (index: number) => unknown;
17
27
  num: (index: number) => number;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/formulas/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,sCAAsC,EAAE,MAAM,yBAAyB,CAAC;AAEtF,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,sCAAsC,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvI,MAAM,WAAW,mBAAmB;IACnC,6EAA6E;IAC7E,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC3C,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CAC/B;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,mBAAmB,KAAK,MAAM,CAAC;AAElE,MAAM,WAAW,sBAAsB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,qGAAqG;IACrG,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,EAAE,EAAE,cAAc,CAAC;CACnB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/formulas/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,sCAAsC,EAAE,MAAM,yBAAyB,CAAC;AAEtF,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,sCAAsC,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvI;;;;;GAKG;AACH,MAAM,MAAM,4BAA4B,GAAG;IAC1C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,WAAW,mBAAmB;IACnC,yFAAyF;IACzF,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC3C,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CAC/B;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,mBAAmB,KAAK,MAAM,CAAC;AAElE,MAAM,WAAW,sBAAsB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,qGAAqG;IACrG,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,EAAE,EAAE,cAAc,CAAC;CACnB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ryuzaki13/react-foundation-lib",
3
- "version": "2.32.0",
3
+ "version": "2.33.0",
4
4
  "description": "Reusable React and TypeScript foundation utilities, hooks, and primitives.",
5
5
  "license": "MIT",
6
6
  "author": "Ryuzaki13",
@@ -6,7 +6,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
6
6
 
7
7
  Модуль `@ryuzaki13/react-foundation-lib/formulas` предоставляет безопасную инфраструктуру для заранее написанных клиентских формул таблицы.
8
8
 
9
- Формула получает значения полей текущей строки и числовые константы, выполняет синхронный расчёт и возвращает конечное JavaScript-число. Например, она может вычислить сумму, разницу, отношение или процент для calculated-колонки.
9
+ Формула получает значения полей текущей строки и числовые константы либо заранее подготовленные host-приложением позиции, выполняет синхронный расчёт и возвращает конечное JavaScript-число. Например, она может вычислить сумму, разницу, отношение или процент для calculated-колонки.
10
10
 
11
11
  ```text
12
12
  данные строки + упорядоченные зависимости
@@ -30,6 +30,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
30
30
  - [Чтение активного реестра](#чтение-активного-реестра)
31
31
  - [Выполнение формулы](#выполнение-формулы)
32
32
  - [Предварительная компиляция](#предварительная-компиляция)
33
+ - [Заранее разрешённые аргументы](#заранее-разрешённые-аргументы)
33
34
  - [Валидация зависимостей](#валидация-зависимостей)
34
35
  - [Интеграция с formatter pipeline](#интеграция-с-formatter-pipeline)
35
36
  - [Отличие от row-based formatter](#отличие-от-row-based-formatter)
@@ -50,6 +51,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
50
51
  - хранит один активный реестр в текущем экземпляре модуля;
51
52
  - выполняет формулы без выбрасывания их runtime-ошибок наружу;
52
53
  - компилирует formula + keys в переиспользуемый executor;
54
+ - исполняет ту же зарегистрированную функцию над готовыми позиционными значениями без промежуточных полей строки;
53
55
  - проверяет существование формулы и корректность выбранных dependencies;
54
56
  - сообщает, какие dependency indexes реально использовала формула на тестовых данных.
55
57
 
@@ -68,7 +70,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
68
70
 
69
71
  Host-приложение владеет прикладными `TableFormulaDefinition`: оно объявляет их в коде, тестирует, собирает в реестр и устанавливает на старте приложения.
70
72
 
71
- Сериализуемая конфигурация колонки хранит только стабильный `formulaId` и ordered dependencies. Реальная функция остаётся доверенным кодом приложения.
73
+ В row-only API сериализуемая конфигурация колонки хранит стабильный `formulaId` и ordered dependencies. Реальная функция остаётся доверенным кодом приложения.
72
74
 
73
75
  ## Импорт
74
76
 
@@ -77,16 +79,21 @@ Host-приложение владеет прикладными `TableFormulaDef
77
79
  ```ts
78
80
  import {
79
81
  compileTableFormula,
82
+ compileTableFormulaWithResolvedArguments,
80
83
  configureTableFormulaRegistry,
81
84
  createTableFormulaRegistry,
82
85
  executeTableFormula,
86
+ executeTableFormulaWithResolvedArguments,
83
87
  getTableFormulaById,
84
88
  getTableFormulaList,
85
89
  formatTableFormulaExpression,
86
- validateTableFormulaDependencies
90
+ validateTableFormulaDependencies,
91
+ type TableFormulaDefinition,
92
+ type TableFormulaExecutionResult,
93
+ type TableFormulaRegistry,
94
+ type TableFormulaResolvedArgument,
95
+ type TableFormulaResolvedExecutor
87
96
  } from "@ryuzaki13/react-foundation-lib/formulas";
88
-
89
- import type { TableFormulaDefinition, TableFormulaExecutionResult, TableFormulaRegistry } from "@ryuzaki13/react-foundation-lib/formulas";
90
97
  ```
91
98
 
92
99
  Корневой импорт пакета и private imports из исходников не поддерживаются:
@@ -365,7 +372,7 @@ interface TableFormulaContext {
365
372
 
366
373
  ### `ctx.key(index)`
367
374
 
368
- Возвращает id dependency по индексу:
375
+ В row-only API возвращает id dependency по индексу:
369
376
 
370
377
  ```ts
371
378
  // keys = ["planned", "actual"]
@@ -380,6 +387,8 @@ ctx.key(1.5); // undefined
380
387
 
381
388
  Пустая строка технически может вернуться из `key`, если она была передана в `keys`, но `value` и `num` считают пустой key отсутствующим. Используйте только непустые dependency ids.
382
389
 
390
+ Для [заранее разрешённых аргументов](#заранее-разрешённые-аргументы) key передаёт host; он не используется для поиска значения в строке.
391
+
383
392
  ### `ctx.value(index)`
384
393
 
385
394
  Возвращает исходное значение без преобразования:
@@ -389,7 +398,7 @@ ctx.key(1.5); // undefined
389
398
  ctx.value(1); // "25"
390
399
  ```
391
400
 
392
- Для константы возвращается непосредственно её числовое значение. Для неправильного индекса, пустого key или отсутствующего свойства возвращается `undefined`.
401
+ В row-only API для константы возвращается непосредственно её числовое значение. Для неправильного индекса, пустого key или отсутствующего свойства возвращается `undefined`. Для готовых позиций действуют [правила разрешённых аргументов](#заранее-разрешённые-аргументы).
393
402
 
394
403
  Используйте `value`, когда нужно отличать отсутствующее значение от нуля или применять собственный parser:
395
404
 
@@ -809,9 +818,69 @@ if (compiled.ok) {
809
818
 
810
819
  ### Синхронность и повторный вход
811
820
 
812
- Compiled executor переиспользует один context с изменяемой внутренней ссылкой на `rowData`. Это безопасно для обычной синхронной формулы.
821
+ Executor `compileTableFormula` переиспользует один context с изменяемой внутренней ссылкой на `rowData`. Это безопасно для обычной синхронной формулы.
822
+
823
+ Не делайте formula `async`, не сохраняйте `ctx` во внешнем state и не запускайте тот же row-only executor рекурсивно из formula. Такой код нарушает lifecycle переиспользуемого context. Отдельный контракт повторного входа для готовых позиций описан ниже.
824
+
825
+ ## Заранее разрешённые аргументы
826
+
827
+ Когда значения относятся к разным строкам или вычисляются host-приложением, передайте их в позициях непосредственно. Используются существующие `TableFormulaDefinition`, registry и методы `ctx.key`, `ctx.value`, `ctx.num`; новую арифметическую функцию для другого источника писать не требуется.
828
+
829
+ ```ts
830
+ type TableFormulaResolvedArgument = {
831
+ readonly value: unknown;
832
+ readonly key?: string;
833
+ };
834
+
835
+ type TableFormulaResolvedExecutor = (resolvedArguments: readonly TableFormulaResolvedArgument[]) => TableFormulaExecutionResult;
836
+ ```
837
+
838
+ ### Подготовка и выполнение
839
+
840
+ Реестр из быстрого старта уже содержит `sum`. Host получает значения до вызова runtime и сохраняет нужный порядок:
841
+
842
+ ```ts
843
+ import {
844
+ compileTableFormulaWithResolvedArguments,
845
+ executeTableFormulaWithResolvedArguments,
846
+ type TableFormulaResolvedArgument
847
+ } from "@ryuzaki13/react-foundation-lib/formulas";
848
+
849
+ const resolvedArguments: readonly TableFormulaResolvedArgument[] = [
850
+ { value: 20, key: "amount" }, // Поле текущей строки.
851
+ { value: 100 } // Уже полученное host-ом значение другой строки.
852
+ ];
853
+
854
+ const result = executeTableFormulaWithResolvedArguments({ formulaId: "sum", arguments: resolvedArguments });
855
+ // result: { ok: true, value: 120 }
856
+
857
+ const compiled = compileTableFormulaWithResolvedArguments({ formulaId: "sum" });
858
+
859
+ if (compiled.ok) {
860
+ const first = compiled.execute(resolvedArguments);
861
+ const second = compiled.execute([{ value: 30, key: "amount" }, { value: 200 }]);
862
+ // first.value === 120, second.value === 230 при успешном результате.
863
+ }
864
+ ```
865
+
866
+ Compile result содержит либо `ok: true` и `execute: TableFormulaResolvedExecutor`, либо `ok: false, reason: "formula_not_found"`. Массив передаётся при каждом execute, а не при compile. Для разового вычисления `executeTableFormulaWithResolvedArguments` выполняет compile и один вызов executor.
867
+
868
+ ### Значения, ключи и границы
869
+
870
+ - `value(index)` возвращает переданный `value` буквально, включая `null`, `undefined`, число или числовую строку. Значение не ищется в `rowData`; `key` не влияет на его чтение.
871
+ - Host задаёт `key` только для поля текущей строки. Для константы и внешнего источника его опускают, поэтому `key(index)` возвращает `undefined`. Не создавайте фиктивные ID вроде `TOTAL:Amount`.
872
+ - Порядок и повторы сохраняются. Для отрицательного, нецелого или вышедшего за массив индекса `key()` и `value()` возвращают `undefined`, `num()` — `0`.
873
+ - `num()` использует [действующее числовое преобразование](#числовое-преобразование-ctxnum). Исключение преобразования даёт `runtime_error`, а не успешный ноль.
874
+ - Каждая позиция содержит собственное поле `value`: `{ value: undefined }` корректен, дырка массива или запись без `value` дают `runtime_error`. Ошибка подготовки не подменяется временным нулём.
875
+ - Используется существующий `TableFormulaExecutionResult`: не конечный результат формулы даёт `invalid_result`, исключение — `runtime_error`. Значения и текст исключения не добавляются в результат ошибки.
876
+
877
+ ### Время жизни и ответственность host
878
+
879
+ Compiled executor сохраняет зарегистрированную функцию без массива аргументов. Контекст создаётся для отдельного синхронного вызова, поэтому вложенное выполнение того же executor не подменяет значения внешнего или следующего вызова. Входные массивы и записи не изменяются; значения не нормализуются и не копируются глубоко. Формулы остаются чистыми и синхронными; `ctx` нельзя сохранять для чтения после завершения вызова.
880
+
881
+ Host владеет сериализуемой ссылкой на источник, её доступностью, загрузкой, выбором исходного или вычисленного значения и проверкой циклов. Для ожидания данных он может явно подготовить `{ value: 0 }`, сохраняя состояние загрузки и диагностику отдельно. Runtime не получает DataSource callbacks и не разрешает ИТОГО или родителя самостоятельно.
813
882
 
814
- Не делайте formula `async`, не сохраняйте `ctx` во внешнем state и не запускайте тот же executor рекурсивно из formula. Такой код нарушает lifecycle переиспользуемого context.
883
+ `TableFormulaDependency`, row-only compile/execute, validator зависимостей, formatter выражения и formatter pipeline сохраняют свои контракты. `validateTableFormulaDependencies` не проверяет адреса внешних источников, а `formatTableFormulaExpression` не строит для них scoped preview. Готовые позиции — вход текущего выполнения, а не новый формат сохранённой конфигурации.
815
884
 
816
885
  ## Валидация зависимостей
817
886
 
@@ -862,7 +931,7 @@ Validator:
862
931
  | ------------------------------- | ----------------------------------------------------------- |
863
932
  | `formula_not_found` | Formula id отсутствует в registry |
864
933
  | `dependency_not_available` | Dependency id отсутствует среди доступных колонок |
865
- | `invalid_constant` | Константа не содержит конечное числовое значение |
934
+ | `invalid_constant` | Константа не содержит конечное числовое значение |
866
935
  | `dependency_index_out_of_range` | Formula прочитала index, для которого dependency не передан |
867
936
 
868
937
  ### Warnings
@@ -1165,7 +1234,7 @@ expect(
1165
1234
  быстрее: compileTableFormula один раз → execute(rowData) для каждой строки
1166
1235
  ```
1167
1236
 
1168
- Compiled executor переиспользует context и не делает registry lookup на каждую строку.
1237
+ Executor `compileTableFormula` переиспользует context и не делает registry lookup на каждую строку. `compileTableFormulaWithResolvedArguments` также находит функцию один раз, но создаёт отдельный контекст на каждый вызов; значения host подготавливает перед execute.
1169
1238
 
1170
1239
  Formatter pipeline уже использует этот подход: runtime field компилируется на construction-stage.
1171
1240
 
@@ -1235,42 +1304,46 @@ Promise не является конечным number и даст `invalid_resul
1235
1304
 
1236
1305
  ### Runtime functions
1237
1306
 
1238
- | API | Назначение | Важное поведение |
1239
- | ---------------------------------- | -------------------------------- | ------------------------------------------------------- |
1240
- | `createTableFormulaContext` | Создать context вручную | Копирует keys, но не rowData; `num` использует `Number` |
1241
- | `createTableFormulaRegistry` | Собрать нормализованный registry | Бросает `Error` для пустого/повторного id |
1242
- | `configureTableFormulaRegistry` | Установить активный registry | Полностью заменяет module-level registry |
1243
- | `getTableFormulaList` | Получить ordered catalog | Возвращает тот же readonly list |
1244
- | `getTableFormulaById` | Найти definition | Trim id; `undefined` для пустого/неизвестного |
1245
- | `formatTableFormulaExpression` | Подставить ID в шаблон превью | Сохраняет незаполненные `$n`; не исполняет выражение |
1246
- | `compileTableFormula` | Подготовить reusable executor | Фиксирует formula и копирует keys |
1247
- | `executeTableFormula` | Compile + один execute | Возвращает controlled result, не бросает formula error |
1248
- | `validateTableFormulaDependencies` | Проверить mapping dependencies | Дважды исполняет formula на synthetic data |
1307
+ | API | Назначение | Важное поведение |
1308
+ | ------------------------------------------ | ------------------------------------ | ------------------------------------------------------- |
1309
+ | `createTableFormulaContext` | Создать context вручную | Копирует keys, но не rowData; `num` использует `Number` |
1310
+ | `createTableFormulaRegistry` | Собрать нормализованный registry | Бросает `Error` для пустого/повторного id |
1311
+ | `configureTableFormulaRegistry` | Установить активный registry | Полностью заменяет module-level registry |
1312
+ | `getTableFormulaList` | Получить ordered catalog | Возвращает тот же readonly list |
1313
+ | `getTableFormulaById` | Найти definition | Trim id; `undefined` для пустого/неизвестного |
1314
+ | `formatTableFormulaExpression` | Подставить ID в шаблон превью | Сохраняет незаполненные `$n`; не исполняет выражение |
1315
+ | `compileTableFormula` | Подготовить reusable executor | Фиксирует formula и копирует keys |
1316
+ | `executeTableFormula` | Compile + один execute | Возвращает controlled result, не бросает formula error |
1317
+ | `compileTableFormulaWithResolvedArguments` | Подготовить executor готовых позиций | Фиксирует функцию; аргументы передаются при execute |
1318
+ | `executeTableFormulaWithResolvedArguments` | Выполнить готовые позиции один раз | Использует тот же registry и execution result |
1319
+ | `validateTableFormulaDependencies` | Проверить mapping dependencies | Дважды исполняет formula на synthetic data |
1249
1320
 
1250
1321
  ### Публичные TypeScript-типы
1251
1322
 
1252
- | Тип | Назначение |
1253
- | ------------------------------------------ | ------------------------------------------ |
1254
- | `TableFormulaRowData` | Строка `Record<string, unknown>` |
1323
+ | Тип | Назначение |
1324
+ | ------------------------------------------ | ----------------------------------------------- |
1325
+ | `TableFormulaRowData` | Строка `Record<string, unknown>` |
1255
1326
  | `TableFormulaDependency` | ID поля либо объект конечной числовой константы |
1256
- | `TableFormulaContext` | Методы `key`, `value`, `num` |
1257
- | `TableFormulaFn` | Синхронная function `context → number` |
1258
- | `TableFormulaDefinition` | Metadata и function одной formula |
1259
- | `TableFormulaRegistry` | Readonly `list` + `byId` |
1260
- | `TableFormulaExecutionResult` | Success/error результат execute |
1261
- | `TableFormulaCompiledExecutor` | Переиспользуемый `(rowData) → result` |
1262
- | `TableFormulaValidationMessage` | `{ code, message }` validation diagnostics |
1263
- | `TableFormulaDependenciesValidationResult` | Errors, warnings и usage dependencies |
1327
+ | `TableFormulaContext` | Методы `key`, `value`, `num` |
1328
+ | `TableFormulaFn` | Синхронная function `context → number` |
1329
+ | `TableFormulaDefinition` | Metadata и function одной formula |
1330
+ | `TableFormulaRegistry` | Readonly `list` + `byId` |
1331
+ | `TableFormulaExecutionResult` | Success/error результат execute |
1332
+ | `TableFormulaCompiledExecutor` | Переиспользуемый `(rowData) → result` |
1333
+ | `TableFormulaResolvedArgument` | Готовое `value` и optional `key` позиции |
1334
+ | `TableFormulaResolvedExecutor` | Переиспользуемый `(resolvedArguments) → result` |
1335
+ | `TableFormulaValidationMessage` | `{ code, message }` validation diagnostics |
1336
+ | `TableFormulaDependenciesValidationResult` | Errors, warnings и usage dependencies |
1264
1337
 
1265
1338
  `ValidationCode`, instrumentation type и compile-result type не экспортируются как именованные публичные типы. Их конкретные значения доступны через публичные function signatures и unions, описанные выше.
1266
1339
 
1267
1340
  ### Причины execution error
1268
1341
 
1269
- | Reason | Значение |
1270
- | ------------------- | --------------------------------------- |
1271
- | `formula_not_found` | Formula отсутствует в активном registry |
1272
- | `invalid_result` | Function вернула не конечный number |
1273
- | `runtime_error` | Function выбросила исключение |
1342
+ | Reason | Значение |
1343
+ | ------------------- | --------------------------------------------------------------------- |
1344
+ | `formula_not_found` | Formula отсутствует в активном registry |
1345
+ | `invalid_result` | Function вернула не конечный number |
1346
+ | `runtime_error` | Некорректные готовые позиции или исключение выполнения/преобразования |
1274
1347
 
1275
1348
  ### Validation codes
1276
1349
 
@@ -1 +0,0 @@
1
- {"version":3,"file":"formulas-Y0HOcFhe.js","names":[],"sources":["../../src/formulas/tableFormulaConstants.ts","../../src/formulas/isTableFormulaDependency.ts","../../src/formulas/registry.ts","../../src/formulas/execute.ts","../../src/formulas/formatTableFormulaExpression.ts","../../src/formulas/validate.ts"],"sourcesContent":["/** Виды аргументов и причины отказа общие для runtime, валидации и их литеральных контрактов. */\nexport const TABLE_FORMULA_DEPENDENCY_KIND_CONSTANT = \"constant\";\nexport const TABLE_FORMULA_NOT_FOUND = \"formula_not_found\";\nexport const TABLE_FORMULA_INVALID_RESULT = \"invalid_result\";\nexport const TABLE_FORMULA_RUNTIME_ERROR = \"runtime_error\";\nexport const TABLE_FORMULA_DEPENDENCY_INDEX_OUT_OF_RANGE = \"dependency_index_out_of_range\";\nexport const TABLE_FORMULA_DEPENDENCY_NOT_AVAILABLE = \"dependency_not_available\";\nexport const TABLE_FORMULA_INVALID_CONSTANT = \"invalid_constant\";\nexport const TABLE_FORMULA_UNUSED_DEPENDENCIES = \"unused_dependencies\";\nexport const TABLE_FORMULA_DOES_NOT_USE_DEPENDENCIES = \"formula_does_not_use_dependencies\";\nexport const TABLE_FORMULA_VALIDATION_RUNTIME_ERROR = \"formula_runtime_error\";\n","import { TABLE_FORMULA_DEPENDENCY_KIND_CONSTANT } from \"./tableFormulaConstants\";\nimport { type TableFormulaDependency } from \"./types\";\n\n/** Проверяет внешний аргумент без приведения пустых строк или нечисловых значений к нулю. */\nexport function isTableFormulaDependency(value: unknown): value is TableFormulaDependency {\n\tif (typeof value === \"string\") return true;\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n\n\treturn (\n\t\t\"kind\" in value &&\n\t\tvalue.kind === TABLE_FORMULA_DEPENDENCY_KIND_CONSTANT &&\n\t\t\"value\" in value &&\n\t\ttypeof value.value === \"number\" &&\n\t\tNumber.isFinite(value.value)\n\t);\n}\n","import type { TableFormulaDefinition } from \"./types\";\n\nexport type TableFormulaRegistry = Readonly<{\n\tlist: readonly TableFormulaDefinition[];\n\tbyId: ReadonlyMap<string, TableFormulaDefinition>;\n}>;\n\nexport function createTableFormulaRegistry(definitions: readonly TableFormulaDefinition[]): TableFormulaRegistry {\n\tconst byId = new Map<string, TableFormulaDefinition>();\n\tconst list: TableFormulaDefinition[] = [];\n\n\tfor (const definition of definitions) {\n\t\tconst normalizedId = definition.id.trim();\n\t\tif (!normalizedId) {\n\t\t\tthrow new Error(\"Formula id не может быть пустым\");\n\t\t}\n\n\t\tif (byId.has(normalizedId)) {\n\t\t\tthrow new Error(`Найден дублирующийся formulaId: ${normalizedId}`);\n\t\t}\n\n\t\tconst normalizedDefinition: TableFormulaDefinition = Object.freeze({\n\t\t\t...definition,\n\t\t\tid: normalizedId,\n\t\t\tname: definition.name.trim(),\n\t\t\tdescription: definition.description.trim(),\n\t\t\tkeywords: definition.keywords ? [...definition.keywords] : undefined\n\t\t});\n\n\t\tbyId.set(normalizedId, normalizedDefinition);\n\t\tlist.push(normalizedDefinition);\n\t}\n\n\treturn Object.freeze({\n\t\tlist: Object.freeze(list),\n\t\tbyId\n\t});\n}\n\nlet tableFormulaRegistry = createTableFormulaRegistry([]);\n\n/**\n * Устанавливает реестр формул host-приложения для всех formula runtime API.\n *\n * Конфигурация выполняется composition root до первого чтения, валидации или\n * компиляции формулы. Библиотека намеренно не содержит прикладной каталог.\n */\nexport function configureTableFormulaRegistry(registry: TableFormulaRegistry): void {\n\ttableFormulaRegistry = registry;\n}\n\nexport function getTableFormulaList(): readonly TableFormulaDefinition[] {\n\treturn tableFormulaRegistry.list;\n}\n\nexport function getTableFormulaById(formulaId: string | undefined): TableFormulaDefinition | undefined {\n\tconst normalizedId = formulaId?.trim();\n\tif (!normalizedId) return undefined;\n\treturn tableFormulaRegistry.byId.get(normalizedId);\n}\n","import { isTableFormulaDependency } from \"./isTableFormulaDependency\";\nimport { getTableFormulaById } from \"./registry\";\nimport {\n\tTABLE_FORMULA_DEPENDENCY_KIND_CONSTANT,\n\tTABLE_FORMULA_NOT_FOUND,\n\tTABLE_FORMULA_INVALID_RESULT,\n\tTABLE_FORMULA_RUNTIME_ERROR\n} from \"./tableFormulaConstants\";\nimport { type TableFormulaContext, type TableFormulaDependency, type TableFormulaRowData } from \"./types\";\n\ntype TableFormulaContextInstrumentation = {\n\tonReadIndex?: (index: number) => void;\n\tonOutOfRangeIndex?: (index: number) => void;\n};\n\nfunction toFiniteNumberOrZero(value: unknown): number {\n\tconst normalized = Number(value);\n\treturn Number.isFinite(normalized) ? normalized : 0;\n}\n\nfunction snapshotDependencies(dependencies: readonly TableFormulaDependency[]): TableFormulaDependency[] {\n\treturn dependencies.map((dependency) => {\n\t\tif (!isTableFormulaDependency(dependency)) {\n\t\t\tthrow new TypeError(\"Аргумент формулы должен быть ID поля или конечной числовой константой.\");\n\t\t}\n\n\t\t// Снимок не должен меняться при последующем редактировании исходной конфигурации.\n\t\treturn typeof dependency === \"string\" ? dependency : { kind: TABLE_FORMULA_DEPENDENCY_KIND_CONSTANT, value: dependency.value };\n\t});\n}\n\nexport function createTableFormulaContext(args: {\n\trowData: TableFormulaRowData;\n\tkeys?: readonly TableFormulaDependency[];\n\tinstrumentation?: TableFormulaContextInstrumentation;\n}): TableFormulaContext {\n\tconst keys = snapshotDependencies(args.keys ?? []);\n\n\tconst readDependency = (index: number): TableFormulaDependency | undefined => {\n\t\tif (!Number.isInteger(index) || index < 0) {\n\t\t\targs.instrumentation?.onOutOfRangeIndex?.(index);\n\t\t\treturn undefined;\n\t\t}\n\n\t\targs.instrumentation?.onReadIndex?.(index);\n\n\t\tif (index >= keys.length) {\n\t\t\targs.instrumentation?.onOutOfRangeIndex?.(index);\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn keys[index];\n\t};\n\n\tconst readValue = (index: number): unknown => {\n\t\tconst dependency = readDependency(index);\n\t\tif (!dependency) return undefined;\n\t\treturn typeof dependency === \"string\" ? args.rowData[dependency] : dependency.value;\n\t};\n\n\treturn {\n\t\tkey: (index) => {\n\t\t\tconst dependency = readDependency(index);\n\t\t\treturn typeof dependency === \"string\" ? dependency : undefined;\n\t\t},\n\t\tvalue: readValue,\n\t\tnum: (index) => toFiniteNumberOrZero(readValue(index))\n\t};\n}\n\nexport type TableFormulaExecutionResult =\n\t| {\n\t\t\tok: true;\n\t\t\tvalue: number;\n\t }\n\t| {\n\t\t\tok: false;\n\t\t\treason: typeof TABLE_FORMULA_NOT_FOUND | typeof TABLE_FORMULA_INVALID_RESULT | typeof TABLE_FORMULA_RUNTIME_ERROR;\n\t };\n\nexport type TableFormulaCompiledExecutor = (rowData: TableFormulaRowData) => TableFormulaExecutionResult;\n\ntype CompileTableFormulaResult =\n\t| {\n\t\t\tok: true;\n\t\t\texecute: TableFormulaCompiledExecutor;\n\t }\n\t| {\n\t\t\tok: false;\n\t\t\treason: typeof TABLE_FORMULA_NOT_FOUND;\n\t };\n\nexport function compileTableFormula(args: {\n\tformulaId: string | undefined;\n\tkeys?: readonly TableFormulaDependency[];\n}): CompileTableFormulaResult {\n\tconst formula = getTableFormulaById(args.formulaId);\n\tif (!formula) {\n\t\treturn { ok: false, reason: TABLE_FORMULA_NOT_FOUND };\n\t}\n\n\tlet keys: TableFormulaDependency[];\n\ttry {\n\t\tkeys = snapshotDependencies(args.keys ?? []);\n\t} catch {\n\t\t// Ошибка новых входов проходит через прежний execution-result, без успешного расчёта с нулём.\n\t\treturn { ok: true, execute: () => ({ ok: false, reason: TABLE_FORMULA_RUNTIME_ERROR }) };\n\t}\n\tlet rowDataRef: TableFormulaRowData = {};\n\tconst context: TableFormulaContext = {\n\t\tkey: (index) => {\n\t\t\tif (!Number.isInteger(index) || index < 0 || index >= keys.length) return undefined;\n\t\t\tconst dependency = keys[index];\n\t\t\treturn typeof dependency === \"string\" ? dependency : undefined;\n\t\t},\n\t\tvalue: (index) => {\n\t\t\tif (!Number.isInteger(index) || index < 0 || index >= keys.length) return undefined;\n\t\t\tconst dependency = keys[index];\n\t\t\tif (!dependency) return undefined;\n\t\t\treturn typeof dependency === \"string\" ? rowDataRef[dependency] : dependency.value;\n\t\t},\n\t\tnum: (index) => {\n\t\t\tif (!Number.isInteger(index) || index < 0 || index >= keys.length) return 0;\n\t\t\tconst dependency = keys[index];\n\t\t\tif (!dependency) return 0;\n\t\t\treturn typeof dependency === \"string\" ? toFiniteNumberOrZero(rowDataRef[dependency]) : dependency.value;\n\t\t}\n\t};\n\n\treturn {\n\t\tok: true,\n\t\texecute: (rowData) => {\n\t\t\trowDataRef = rowData;\n\n\t\t\ttry {\n\t\t\t\tconst value = formula.fn(context);\n\t\t\t\tif (!Number.isFinite(value)) {\n\t\t\t\t\treturn { ok: false, reason: TABLE_FORMULA_INVALID_RESULT };\n\t\t\t\t}\n\n\t\t\t\treturn { ok: true, value };\n\t\t\t} catch {\n\t\t\t\treturn { ok: false, reason: TABLE_FORMULA_RUNTIME_ERROR };\n\t\t\t}\n\t\t}\n\t};\n}\n\nexport function executeTableFormula(args: {\n\tformulaId: string | undefined;\n\trowData: TableFormulaRowData;\n\tkeys?: readonly TableFormulaDependency[];\n}): TableFormulaExecutionResult {\n\tconst compiled = compileTableFormula({\n\t\tformulaId: args.formulaId,\n\t\tkeys: args.keys\n\t});\n\tif (!compiled.ok) {\n\t\treturn { ok: false, reason: compiled.reason };\n\t}\n\n\treturn compiled.execute(args.rowData);\n}\n","import { isTableFormulaDependency } from \"./isTableFormulaDependency\";\nimport { type TableFormulaDependency } from \"./types\";\n\n/**\n * Подставляет ID полей и числовые константы в шаблон превью формулы.\n *\n * Незаданные позиции остаются в виде $n, чтобы редактор мог показывать неполный\n * черновик. Подстановка однопроходная: ID сохраняются буквально, а полученный\n * текст предназначен только для отображения и никогда не исполняется.\n */\nexport function formatTableFormulaExpression(expressionTemplate: string, dependencies: readonly TableFormulaDependency[]): string {\n\treturn expressionTemplate.replace(/\\$([0-9]+)/g, (placeholder: string, index: string) => {\n\t\tconst dependency = dependencies[Number(index)];\n\t\tif (!isTableFormulaDependency(dependency) || dependency === \"\") return placeholder;\n\t\tif (typeof dependency === \"string\") return dependency;\n\n\t\t// Скобки сохраняют смысл при вычитании, делении и возведении отрицательного значения в степень.\n\t\treturn dependency.value < 0 || Object.is(dependency.value, -0) ? `(${dependency.value})` : String(dependency.value);\n\t});\n}\n","import { createTableFormulaContext } from \"./execute\";\nimport { formatTableFormulaExpression } from \"./formatTableFormulaExpression\";\nimport { isTableFormulaDependency } from \"./isTableFormulaDependency\";\nimport { getTableFormulaById } from \"./registry\";\nimport {\n\tTABLE_FORMULA_NOT_FOUND,\n\tTABLE_FORMULA_DEPENDENCY_INDEX_OUT_OF_RANGE,\n\tTABLE_FORMULA_DEPENDENCY_NOT_AVAILABLE,\n\tTABLE_FORMULA_INVALID_CONSTANT,\n\tTABLE_FORMULA_UNUSED_DEPENDENCIES,\n\tTABLE_FORMULA_DOES_NOT_USE_DEPENDENCIES,\n\tTABLE_FORMULA_VALIDATION_RUNTIME_ERROR\n} from \"./tableFormulaConstants\";\nimport { type TableFormulaDependency } from \"./types\";\n\n/** Положительная и отрицательная пробы выявляют обращения к зависимостям в разных ветках формулы. */\nconst FORMULA_VALIDATION_PROBE_VALUE = 100;\n\ntype ValidationCode =\n\t| typeof TABLE_FORMULA_NOT_FOUND\n\t| typeof TABLE_FORMULA_DEPENDENCY_INDEX_OUT_OF_RANGE\n\t| typeof TABLE_FORMULA_DEPENDENCY_NOT_AVAILABLE\n\t| typeof TABLE_FORMULA_INVALID_CONSTANT\n\t| typeof TABLE_FORMULA_UNUSED_DEPENDENCIES\n\t| typeof TABLE_FORMULA_DOES_NOT_USE_DEPENDENCIES\n\t| typeof TABLE_FORMULA_VALIDATION_RUNTIME_ERROR;\n\nexport interface TableFormulaValidationMessage {\n\tcode: ValidationCode;\n\tmessage: string;\n}\nexport interface TableFormulaDependenciesValidationResult {\n\tok: boolean;\n\terrors: TableFormulaValidationMessage[];\n\twarnings: TableFormulaValidationMessage[];\n\tusage: {\n\t\tusedDependencyIndexes: number[];\n\t\tusedDependencyIds: string[];\n\t\trequiredDependencyCount: number;\n\t};\n}\n\nfunction toSortedArray(items: Set<number>): number[] {\n\treturn [...items].sort((left, right) => left - right);\n}\n\nfunction createSampleRowData(dependencies: readonly TableFormulaDependency[], multiplier: number): Record<string, unknown> {\n\treturn dependencies.reduce<Record<string, unknown>>((acc, dependency, index) => {\n\t\t// Константа сохраняет своё значение в каждом проходе и не создаёт виртуального поля строки.\n\t\tif (typeof dependency === \"string\") acc[dependency] = (index + 1) * multiplier;\n\t\treturn acc;\n\t}, {});\n}\n\nexport function validateTableFormulaDependencies(args: {\n\tformulaId: string | undefined;\n\tdependencies?: readonly TableFormulaDependency[];\n\tavailableColumnIds?: readonly string[];\n}): TableFormulaDependenciesValidationResult {\n\tconst errors: TableFormulaValidationMessage[] = [];\n\tconst warnings: TableFormulaValidationMessage[] = [];\n\n\tconst formula = getTableFormulaById(args.formulaId);\n\tconst dependencies = [...(args.dependencies ?? [])];\n\tconst availableColumnIds = args.availableColumnIds ?? [];\n\n\tif (!formula) {\n\t\terrors.push({\n\t\t\tcode: TABLE_FORMULA_NOT_FOUND,\n\t\t\tmessage: \"Формула не найдена в реестре.\"\n\t\t});\n\n\t\treturn {\n\t\t\tok: false,\n\t\t\terrors,\n\t\t\twarnings,\n\t\t\tusage: {\n\t\t\t\tusedDependencyIndexes: [],\n\t\t\t\tusedDependencyIds: [],\n\t\t\t\trequiredDependencyCount: 0\n\t\t\t}\n\t\t};\n\t}\n\n\tconst availableSet = new Set(availableColumnIds);\n\tconst missingDependencies = dependencies.filter((dependency) => typeof dependency === \"string\" && !availableSet.has(dependency));\n\tif (missingDependencies.length > 0) {\n\t\terrors.push({\n\t\t\tcode: TABLE_FORMULA_DEPENDENCY_NOT_AVAILABLE,\n\t\t\tmessage: `Не найдены среди доступных полей: ${missingDependencies.join(\", \")}.`\n\t\t});\n\t}\n\n\tconst invalidConstantIndexes = dependencies.flatMap((dependency, index) => (isTableFormulaDependency(dependency) ? [] : [index]));\n\tif (invalidConstantIndexes.length > 0) {\n\t\terrors.push({\n\t\t\tcode: TABLE_FORMULA_INVALID_CONSTANT,\n\t\t\tmessage: `Ожидаются конечные числовые константы в позициях: ${invalidConstantIndexes.map((index) => `$${index}`).join(\", \")}.`\n\t\t});\n\t}\n\n\tconst usedIndexes = new Set<number>();\n\tconst outOfRangeIndexes = new Set<number>();\n\tlet runtimeErrorCount = 0;\n\n\tconst runValidationPass = (sampleRowData: Record<string, unknown>) => {\n\t\ttry {\n\t\t\tconst context = createTableFormulaContext({\n\t\t\t\trowData: sampleRowData,\n\t\t\t\tkeys: dependencies,\n\t\t\t\tinstrumentation: {\n\t\t\t\t\tonReadIndex: (index) => {\n\t\t\t\t\t\tusedIndexes.add(index);\n\t\t\t\t\t},\n\t\t\t\t\tonOutOfRangeIndex: (index) => {\n\t\t\t\t\t\toutOfRangeIndexes.add(index);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tformula.fn(context);\n\t\t} catch {\n\t\t\truntimeErrorCount += 1;\n\t\t}\n\t};\n\n\t// Несколько прогонов повышают шанс увидеть обращения к индексам в разных ветках формулы.\n\trunValidationPass(createSampleRowData(dependencies, FORMULA_VALIDATION_PROBE_VALUE));\n\trunValidationPass(createSampleRowData(dependencies, -FORMULA_VALIDATION_PROBE_VALUE));\n\n\tconst sortedUsedIndexes = toSortedArray(usedIndexes);\n\tconst requiredDependencyCount = sortedUsedIndexes.length > 0 ? sortedUsedIndexes[sortedUsedIndexes.length - 1] + 1 : 0;\n\n\tif (outOfRangeIndexes.size > 0) {\n\t\terrors.push({\n\t\t\tcode: TABLE_FORMULA_DEPENDENCY_INDEX_OUT_OF_RANGE,\n\t\t\tmessage: `Формула обращается к несуществующим индексам. Минимально требуется зависимостей: ${requiredDependencyCount}, выбрано: ${dependencies.length}.`\n\t\t});\n\t}\n\n\tif (sortedUsedIndexes.length === 0) {\n\t\twarnings.push({\n\t\t\tcode: TABLE_FORMULA_DOES_NOT_USE_DEPENDENCIES,\n\t\t\tmessage: \"Формула не использует dependencies.\"\n\t\t});\n\t}\n\n\tconst unusedDependencies = dependencies.filter((_, index) => !usedIndexes.has(index));\n\tif (unusedDependencies.length > 0) {\n\t\twarnings.push({\n\t\t\tcode: TABLE_FORMULA_UNUSED_DEPENDENCIES,\n\t\t\tmessage: `Выбраны, но не используются формулой: ${unusedDependencies.map((dependency) => formatTableFormulaExpression(\"$0\", [dependency])).join(\", \")}.`\n\t\t});\n\t}\n\n\tif (runtimeErrorCount > 0) {\n\t\twarnings.push({\n\t\t\tcode: TABLE_FORMULA_VALIDATION_RUNTIME_ERROR,\n\t\t\tmessage: \"На тестовых данных формула завершилась с ошибкой.\"\n\t\t});\n\t}\n\n\tconst usedDependencyIds = sortedUsedIndexes\n\t\t.map((index) => dependencies[index])\n\t\t.filter((dependency): dependency is string => typeof dependency === \"string\" && dependency !== \"\");\n\n\treturn {\n\t\tok: errors.length === 0,\n\t\terrors,\n\t\twarnings,\n\t\tusage: {\n\t\t\tusedDependencyIndexes: sortedUsedIndexes,\n\t\t\tusedDependencyIds,\n\t\t\trequiredDependencyCount\n\t\t}\n\t};\n}\n"],"mappings":";AACA,IACa,IAA0B,qBAE1B,IAA8B,iBAC9B,IAA8C,iCAG9C,IAAoC,uBACpC,IAA0C,qCAC1C,IAAyC;;;ACNtD,SAAgB,EAAyB,GAAiD;CAIzF,OAHI,OAAO,KAAU,WAAiB,KAClC,OAAO,KAAU,aAAY,KAAkB,MAAM,QAAQ,CAAK,IAAU,KAG/E,UAAU,KACV,EAAM,SAAA,cACN,WAAW,KACX,OAAO,EAAM,SAAU,YACvB,OAAO,SAAS,EAAM,KAAK;AAE7B;;;ACRA,SAAgB,EAA2B,GAAsE;CAChH,IAAM,oBAAO,IAAI,IAAoC,GAC/C,IAAiC,CAAC;CAExC,KAAK,IAAM,KAAc,GAAa;EACrC,IAAM,IAAe,EAAW,GAAG,KAAK;EACxC,IAAI,CAAC,GACJ,MAAU,MAAM,iCAAiC;EAGlD,IAAI,EAAK,IAAI,CAAY,GACxB,MAAU,MAAM,mCAAmC,GAAc;EAGlE,IAAM,IAA+C,OAAO,OAAO;GAClE,GAAG;GACH,IAAI;GACJ,MAAM,EAAW,KAAK,KAAK;GAC3B,aAAa,EAAW,YAAY,KAAK;GACzC,UAAU,EAAW,WAAW,CAAC,GAAG,EAAW,QAAQ,IAAI,KAAA;EAC5D,CAAC;EAGD,AADA,EAAK,IAAI,GAAc,CAAoB,GAC3C,EAAK,KAAK,CAAoB;CAC/B;CAEA,OAAO,OAAO,OAAO;EACpB,MAAM,OAAO,OAAO,CAAI;EACxB;CACD,CAAC;AACF;AAEA,IAAI,IAAuB,EAA2B,CAAC,CAAC;AAQxD,SAAgB,EAA8B,GAAsC;CACnF,IAAuB;AACxB;AAEA,SAAgB,IAAyD;CACxE,OAAO,EAAqB;AAC7B;AAEA,SAAgB,EAAoB,GAAmE;CACtG,IAAM,IAAe,GAAW,KAAK;CAChC,OACL,OAAO,EAAqB,KAAK,IAAI,CAAY;AAClD;;;AC5CA,SAAS,EAAqB,GAAwB;CACrD,IAAM,IAAa,OAAO,CAAK;CAC/B,OAAO,OAAO,SAAS,CAAU,IAAI,IAAa;AACnD;AAEA,SAAS,EAAqB,GAA2E;CACxG,OAAO,EAAa,KAAK,MAAe;EACvC,IAAI,CAAC,EAAyB,CAAU,GACvC,MAAU,UAAU,wEAAwE;EAI7F,OAAO,OAAO,KAAe,WAAW,IAAa;GAAE,MAAM;GAAwC,OAAO,EAAW;EAAM;CAC9H,CAAC;AACF;AAEA,SAAgB,EAA0B,GAIlB;CACvB,IAAM,IAAO,EAAqB,EAAK,QAAQ,CAAC,CAAC,GAE3C,KAAkB,MAAsD;EAC7E,IAAI,CAAC,OAAO,UAAU,CAAK,KAAK,IAAQ,GAAG;GAC1C,EAAK,iBAAiB,oBAAoB,CAAK;GAC/C;EACD;EAIA,IAFA,EAAK,iBAAiB,cAAc,CAAK,GAErC,KAAS,EAAK,QAAQ;GACzB,EAAK,iBAAiB,oBAAoB,CAAK;GAC/C;EACD;EAEA,OAAO,EAAK;CACb,GAEM,KAAa,MAA2B;EAC7C,IAAM,IAAa,EAAe,CAAK;EAClC,OACL,OAAO,OAAO,KAAe,WAAW,EAAK,QAAQ,KAAc,EAAW;CAC/E;CAEA,OAAO;EACN,MAAM,MAAU;GACf,IAAM,IAAa,EAAe,CAAK;GACvC,OAAO,OAAO,KAAe,WAAW,IAAa,KAAA;EACtD;EACA,OAAO;EACP,MAAM,MAAU,EAAqB,EAAU,CAAK,CAAC;CACtD;AACD;AAwBA,SAAgB,EAAoB,GAGN;CAC7B,IAAM,IAAU,EAAoB,EAAK,SAAS;CAClD,IAAI,CAAC,GACJ,OAAO;EAAE,IAAI;EAAO,QAAQ;CAAwB;CAGrD,IAAI;CACJ,IAAI;EACH,IAAO,EAAqB,EAAK,QAAQ,CAAC,CAAC;CAC5C,QAAQ;EAEP,OAAO;GAAE,IAAI;GAAM,gBAAgB;IAAE,IAAI;IAAO,QAAQ;GAA4B;EAAG;CACxF;CACA,IAAI,IAAkC,CAAC,GACjC,IAA+B;EACpC,MAAM,MAAU;GACf,IAAI,CAAC,OAAO,UAAU,CAAK,KAAK,IAAQ,KAAK,KAAS,EAAK,QAAQ;GACnE,IAAM,IAAa,EAAK;GACxB,OAAO,OAAO,KAAe,WAAW,IAAa,KAAA;EACtD;EACA,QAAQ,MAAU;GACjB,IAAI,CAAC,OAAO,UAAU,CAAK,KAAK,IAAQ,KAAK,KAAS,EAAK,QAAQ;GACnE,IAAM,IAAa,EAAK;GACnB,OACL,OAAO,OAAO,KAAe,WAAW,EAAW,KAAc,EAAW;EAC7E;EACA,MAAM,MAAU;GACf,IAAI,CAAC,OAAO,UAAU,CAAK,KAAK,IAAQ,KAAK,KAAS,EAAK,QAAQ,OAAO;GAC1E,IAAM,IAAa,EAAK;GAExB,OADK,IACE,OAAO,KAAe,WAAW,EAAqB,EAAW,EAAW,IAAI,EAAW,QAD1E;EAEzB;CACD;CAEA,OAAO;EACN,IAAI;EACJ,UAAU,MAAY;GACrB,IAAa;GAEb,IAAI;IACH,IAAM,IAAQ,EAAQ,GAAG,CAAO;IAKhC,OAJK,OAAO,SAAS,CAAK,IAInB;KAAE,IAAI;KAAM;IAAM,IAHjB;KAAE,IAAI;KAAO,QAAQ;IAA6B;GAI3D,QAAQ;IACP,OAAO;KAAE,IAAI;KAAO,QAAQ;IAA4B;GACzD;EACD;CACD;AACD;AAEA,SAAgB,EAAoB,GAIJ;CAC/B,IAAM,IAAW,EAAoB;EACpC,WAAW,EAAK;EAChB,MAAM,EAAK;CACZ,CAAC;CAKD,OAJK,EAAS,KAIP,EAAS,QAAQ,EAAK,OAAO,IAH5B;EAAE,IAAI;EAAO,QAAQ,EAAS;CAAO;AAI9C;;;ACxJA,SAAgB,EAA6B,GAA4B,GAAyD;CACjI,OAAO,EAAmB,QAAQ,gBAAgB,GAAqB,MAAkB;EACxF,IAAM,IAAa,EAAa,OAAO,CAAK;EAK5C,OAJI,CAAC,EAAyB,CAAU,KAAK,MAAe,KAAW,IACnE,OAAO,KAAe,WAAiB,IAGpC,EAAW,QAAQ,KAAK,OAAO,GAAG,EAAW,OAAO,EAAE,IAAI,IAAI,EAAW,MAAM,KAAK,OAAO,EAAW,KAAK;CACnH,CAAC;AACF;;;ACHA,IAAM,IAAiC;AA0BvC,SAAS,EAAc,GAA8B;CACpD,OAAO,CAAC,GAAG,CAAK,CAAC,CAAC,MAAM,GAAM,MAAU,IAAO,CAAK;AACrD;AAEA,SAAS,EAAoB,GAAiD,GAA6C;CAC1H,OAAO,EAAa,QAAiC,GAAK,GAAY,OAEjE,OAAO,KAAe,aAAU,EAAI,MAAe,IAAQ,KAAK,IAC7D,IACL,CAAC,CAAC;AACN;AAEA,SAAgB,EAAiC,GAIJ;CAC5C,IAAM,IAA0C,CAAC,GAC3C,IAA4C,CAAC,GAE7C,IAAU,EAAoB,EAAK,SAAS,GAC5C,IAAe,CAAC,GAAI,EAAK,gBAAgB,CAAC,CAAE,GAC5C,IAAqB,EAAK,sBAAsB,CAAC;CAEvD,IAAI,CAAC,GAMJ,OALA,EAAO,KAAK;EACX,MAAM;EACN,SAAS;CACV,CAAC,GAEM;EACN,IAAI;EACJ;EACA;EACA,OAAO;GACN,uBAAuB,CAAC;GACxB,mBAAmB,CAAC;GACpB,yBAAyB;EAC1B;CACD;CAGD,IAAM,IAAe,IAAI,IAAI,CAAkB,GACzC,IAAsB,EAAa,QAAQ,MAAe,OAAO,KAAe,YAAY,CAAC,EAAa,IAAI,CAAU,CAAC;CAC/H,AAAI,EAAoB,SAAS,KAChC,EAAO,KAAK;EACX,MAAM;EACN,SAAS,qCAAqC,EAAoB,KAAK,IAAI,EAAE;CAC9E,CAAC;CAGF,IAAM,IAAyB,EAAa,SAAS,GAAY,MAAW,EAAyB,CAAU,IAAI,CAAC,IAAI,CAAC,CAAK,CAAE;CAChI,AAAI,EAAuB,SAAS,KACnC,EAAO,KAAK;EACX,MAAM;EACN,SAAS,qDAAqD,EAAuB,KAAK,MAAU,IAAI,GAAO,CAAC,CAAC,KAAK,IAAI,EAAE;CAC7H,CAAC;CAGF,IAAM,oBAAc,IAAI,IAAY,GAC9B,oBAAoB,IAAI,IAAY,GACtC,IAAoB,GAElB,KAAqB,MAA2C;EACrE,IAAI;GACH,IAAM,IAAU,EAA0B;IACzC,SAAS;IACT,MAAM;IACN,iBAAiB;KAChB,cAAc,MAAU;MACvB,EAAY,IAAI,CAAK;KACtB;KACA,oBAAoB,MAAU;MAC7B,EAAkB,IAAI,CAAK;KAC5B;IACD;GACD,CAAC;GACD,EAAQ,GAAG,CAAO;EACnB,QAAQ;GACP,KAAqB;EACtB;CACD;CAIA,AADA,EAAkB,EAAoB,GAAc,CAA8B,CAAC,GACnF,EAAkB,EAAoB,GAAc,IAA+B,CAAC;CAEpF,IAAM,IAAoB,EAAc,CAAW,GAC7C,IAA0B,EAAkB,SAAS,IAAI,EAAkB,EAAkB,SAAS,KAAK,IAAI;CASrH,AAPI,EAAkB,OAAO,KAC5B,EAAO,KAAK;EACX,MAAM;EACN,SAAS,oFAAoF,EAAwB,aAAa,EAAa,OAAO;CACvJ,CAAC,GAGE,EAAkB,WAAW,KAChC,EAAS,KAAK;EACb,MAAM;EACN,SAAS;CACV,CAAC;CAGF,IAAM,IAAqB,EAAa,QAAQ,GAAG,MAAU,CAAC,EAAY,IAAI,CAAK,CAAC;CAQpF,AAPI,EAAmB,SAAS,KAC/B,EAAS,KAAK;EACb,MAAM;EACN,SAAS,yCAAyC,EAAmB,KAAK,MAAe,EAA6B,MAAM,CAAC,CAAU,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE;CACvJ,CAAC,GAGE,IAAoB,KACvB,EAAS,KAAK;EACb,MAAM;EACN,SAAS;CACV,CAAC;CAGF,IAAM,IAAoB,EACxB,KAAK,MAAU,EAAa,EAAM,CAAC,CACnC,QAAQ,MAAqC,OAAO,KAAe,YAAY,MAAe,EAAE;CAElG,OAAO;EACN,IAAI,EAAO,WAAW;EACtB;EACA;EACA,OAAO;GACN,uBAAuB;GACvB;GACA;EACD;CACD;AACD"}