@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.
@@ -77,7 +77,56 @@ function m(e) {
77
77
  num: (e) => f(r(e))
78
78
  };
79
79
  }
80
- function h(n) {
80
+ function h(e, n) {
81
+ try {
82
+ let t = e.fn(n());
83
+ return Number.isFinite(t) ? {
84
+ ok: !0,
85
+ value: t
86
+ } : {
87
+ ok: !1,
88
+ reason: "invalid_result"
89
+ };
90
+ } catch {
91
+ return {
92
+ ok: !1,
93
+ reason: t
94
+ };
95
+ }
96
+ }
97
+ function g(e) {
98
+ if (!Array.isArray(e)) throw TypeError("Разрешённые аргументы формулы должны быть массивом записей со значением value.");
99
+ for (let t = 0; t < e.length; t++) {
100
+ let n = e[t];
101
+ if (!Object.hasOwn(e, t) || typeof n != "object" || !n || !Object.hasOwn(n, "value") || n.key !== void 0 && typeof n.key != "string") throw TypeError("Каждый разрешённый аргумент формулы должен содержать собственное value и необязательный строковый key.");
102
+ }
103
+ let t = (t) => {
104
+ if (!(!Number.isInteger(t) || t < 0 || t >= e.length)) return e[t];
105
+ };
106
+ return {
107
+ key: (e) => t(e)?.key,
108
+ value: (e) => t(e)?.value,
109
+ num: (e) => f(t(e)?.value)
110
+ };
111
+ }
112
+ function _(t) {
113
+ let n = d(t.formulaId);
114
+ return n ? {
115
+ ok: !0,
116
+ execute: (e) => h(n, () => g(e))
117
+ } : {
118
+ ok: !1,
119
+ reason: e
120
+ };
121
+ }
122
+ function v(e) {
123
+ let t = _({ formulaId: e.formulaId });
124
+ return t.ok ? t.execute(e.arguments) : {
125
+ ok: !1,
126
+ reason: t.reason
127
+ };
128
+ }
129
+ function y(n) {
81
130
  let r = d(n.formulaId);
82
131
  if (!r) return {
83
132
  ok: !1,
@@ -111,31 +160,14 @@ function h(n) {
111
160
  let t = i[e];
112
161
  return t ? typeof t == "string" ? f(a[t]) : t.value : 0;
113
162
  }
114
- };
163
+ }, s = () => o;
115
164
  return {
116
165
  ok: !0,
117
- execute: (e) => {
118
- a = e;
119
- try {
120
- let e = r.fn(o);
121
- return Number.isFinite(e) ? {
122
- ok: !0,
123
- value: e
124
- } : {
125
- ok: !1,
126
- reason: "invalid_result"
127
- };
128
- } catch {
129
- return {
130
- ok: !1,
131
- reason: t
132
- };
133
- }
134
- }
166
+ execute: (e) => (a = e, h(r, s))
135
167
  };
136
168
  }
137
- function g(e) {
138
- let t = h({
169
+ function b(e) {
170
+ let t = y({
139
171
  formulaId: e.formulaId,
140
172
  keys: e.keys
141
173
  });
@@ -146,7 +178,7 @@ function g(e) {
146
178
  }
147
179
  //#endregion
148
180
  //#region src/formulas/formatTableFormulaExpression.ts
149
- function _(e, t) {
181
+ function x(e, t) {
150
182
  return e.replace(/\$([0-9]+)/g, (e, n) => {
151
183
  let r = t[Number(n)];
152
184
  return !o(r) || r === "" ? e : typeof r == "string" ? r : r.value < 0 || Object.is(r.value, -0) ? `(${r.value})` : String(r.value);
@@ -154,14 +186,14 @@ function _(e, t) {
154
186
  }
155
187
  //#endregion
156
188
  //#region src/formulas/validate.ts
157
- var v = 100;
158
- function y(e) {
189
+ var S = 100;
190
+ function C(e) {
159
191
  return [...e].sort((e, t) => e - t);
160
192
  }
161
- function b(e, t) {
193
+ function w(e, t) {
162
194
  return e.reduce((e, n, r) => (typeof n == "string" && (e[n] = (r + 1) * t), e), {});
163
195
  }
164
- function x(t) {
196
+ function T(t) {
165
197
  let s = [], c = [], l = d(t.formulaId), u = [...t.dependencies ?? []], f = t.availableColumnIds ?? [];
166
198
  if (!l) return s.push({
167
199
  code: e,
@@ -186,39 +218,39 @@ function x(t) {
186
218
  code: "invalid_constant",
187
219
  message: `Ожидаются конечные числовые константы в позициях: ${g.map((e) => `$${e}`).join(", ")}.`
188
220
  });
189
- let x = /* @__PURE__ */ new Set(), S = /* @__PURE__ */ new Set(), C = 0, w = (e) => {
221
+ let _ = /* @__PURE__ */ new Set(), v = /* @__PURE__ */ new Set(), y = 0, b = (e) => {
190
222
  try {
191
223
  let t = m({
192
224
  rowData: e,
193
225
  keys: u,
194
226
  instrumentation: {
195
227
  onReadIndex: (e) => {
196
- x.add(e);
228
+ _.add(e);
197
229
  },
198
230
  onOutOfRangeIndex: (e) => {
199
- S.add(e);
231
+ v.add(e);
200
232
  }
201
233
  }
202
234
  });
203
235
  l.fn(t);
204
236
  } catch {
205
- C += 1;
237
+ y += 1;
206
238
  }
207
239
  };
208
- w(b(u, v)), w(b(u, -100));
209
- let T = y(x), E = T.length > 0 ? T[T.length - 1] + 1 : 0;
210
- S.size > 0 && s.push({
240
+ b(w(u, S)), b(w(u, -100));
241
+ let T = C(_), E = T.length > 0 ? T[T.length - 1] + 1 : 0;
242
+ v.size > 0 && s.push({
211
243
  code: n,
212
244
  message: `Формула обращается к несуществующим индексам. Минимально требуется зависимостей: ${E}, выбрано: ${u.length}.`
213
245
  }), T.length === 0 && c.push({
214
246
  code: i,
215
247
  message: "Формула не использует dependencies."
216
248
  });
217
- let D = u.filter((e, t) => !x.has(t));
249
+ let D = u.filter((e, t) => !_.has(t));
218
250
  D.length > 0 && c.push({
219
251
  code: r,
220
- message: `Выбраны, но не используются формулой: ${D.map((e) => _("$0", [e])).join(", ")}.`
221
- }), C > 0 && c.push({
252
+ message: `Выбраны, но не используются формулой: ${D.map((e) => x("$0", [e])).join(", ")}.`
253
+ }), y > 0 && c.push({
222
254
  code: a,
223
255
  message: "На тестовых данных формула завершилась с ошибкой."
224
256
  });
@@ -235,6 +267,6 @@ function x(t) {
235
267
  };
236
268
  }
237
269
  //#endregion
238
- export { g as a, d as c, i as d, e as f, m as i, u as l, a as m, _ as n, l as o, r as p, h as r, s, x as t, n as u };
270
+ export { m as a, l as c, u as d, n as f, a as g, r as h, _ as i, s as l, e as m, x as n, b as o, i as p, y as r, v as s, T as t, d as u };
239
271
 
240
- //# sourceMappingURL=formulas-Y0HOcFhe.js.map
272
+ //# sourceMappingURL=formulas-BZtCqzBj.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formulas-BZtCqzBj.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 {\n\ttype TableFormulaContext,\n\ttype TableFormulaDefinition,\n\ttype TableFormulaDependency,\n\ttype TableFormulaResolvedArgument,\n\ttype TableFormulaRowData\n} 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\n/** Каждый вызов получает свой набор готовых значений, не удерживаемый compiled executor. */\nexport type TableFormulaResolvedExecutor = (resolvedArguments: readonly TableFormulaResolvedArgument[]) => TableFormulaExecutionResult;\n\n/** Общая граница ошибок охватывает подготовку контекста, чтение аргументов и саму формулу. */\nfunction executeWithContext(formula: TableFormulaDefinition, createContext: () => TableFormulaContext): TableFormulaExecutionResult {\n\ttry {\n\t\tconst value = formula.fn(createContext());\n\t\tif (!Number.isFinite(value)) {\n\t\t\treturn { ok: false, reason: TABLE_FORMULA_INVALID_RESULT };\n\t\t}\n\n\t\treturn { ok: true, value };\n\t} catch {\n\t\treturn { ok: false, reason: TABLE_FORMULA_RUNTIME_ERROR };\n\t}\n}\n\nfunction createResolvedArgumentsContext(resolvedArguments: readonly TableFormulaResolvedArgument[]): TableFormulaContext {\n\tif (!Array.isArray(resolvedArguments)) {\n\t\tthrow new TypeError(\"Разрешённые аргументы формулы должны быть массивом записей со значением value.\");\n\t}\n\n\t// Отсутствующая запись означает ошибку host-подготовки, а собственный value: undefined допустим.\n\t// Проверяем весь массив, чтобы неиспользуемая позиция также не скрыла неполный набор входов.\n\tfor (let index = 0; index < resolvedArguments.length; index++) {\n\t\tconst argument: TableFormulaResolvedArgument | undefined = resolvedArguments[index];\n\t\tif (\n\t\t\t!Object.hasOwn(resolvedArguments, index) ||\n\t\t\ttypeof argument !== \"object\" ||\n\t\t\targument === null ||\n\t\t\t!Object.hasOwn(argument, \"value\") ||\n\t\t\t(argument.key !== undefined && typeof argument.key !== \"string\")\n\t\t) {\n\t\t\tthrow new TypeError(\"Каждый разрешённый аргумент формулы должен содержать собственное value и необязательный строковый key.\");\n\t\t}\n\t}\n\n\tconst readArgument = (index: number): TableFormulaResolvedArgument | undefined => {\n\t\tif (!Number.isInteger(index) || index < 0 || index >= resolvedArguments.length) return undefined;\n\t\treturn resolvedArguments[index];\n\t};\n\n\treturn {\n\t\tkey: (index) => readArgument(index)?.key,\n\t\tvalue: (index) => readArgument(index)?.value,\n\t\tnum: (index) => toFiniteNumberOrZero(readArgument(index)?.value)\n\t};\n}\n\ntype CompileTableFormulaWithResolvedArgumentsResult =\n\t{ ok: true; execute: TableFormulaResolvedExecutor } | { ok: false; reason: typeof TABLE_FORMULA_NOT_FOUND };\n\n/**\n * Компилирует зарегистрированную формулу независимо от строк и источников её аргументов.\n * Host разрешает позиции перед каждым execute; отдельный контекст сохраняет корректность\n * вложенного вызова того же executor без общего изменяемого указателя на массив.\n */\nexport function compileTableFormulaWithResolvedArguments(args: {\n\tformulaId: string | undefined;\n}): CompileTableFormulaWithResolvedArgumentsResult {\n\tconst formula = getTableFormulaById(args.formulaId);\n\tif (!formula) {\n\t\treturn { ok: false, reason: TABLE_FORMULA_NOT_FOUND };\n\t}\n\n\treturn {\n\t\tok: true,\n\t\texecute: (resolvedArguments) => executeWithContext(formula, () => createResolvedArgumentsContext(resolvedArguments))\n\t};\n}\n\n/** Разовое выполнение готовых позиций; загрузка источников и их диагностика принадлежат host. */\nexport function executeTableFormulaWithResolvedArguments(args: {\n\tformulaId: string | undefined;\n\targuments: readonly TableFormulaResolvedArgument[];\n}): TableFormulaExecutionResult {\n\tconst compiled = compileTableFormulaWithResolvedArguments({ formulaId: args.formulaId });\n\tif (!compiled.ok) {\n\t\treturn { ok: false, reason: compiled.reason };\n\t}\n\n\treturn compiled.execute(args.arguments);\n}\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\tconst createContext = () => context;\n\n\treturn {\n\t\tok: true,\n\t\texecute: (rowData) => {\n\t\t\trowDataRef = rowData;\n\n\t\t\treturn executeWithContext(formula, createContext);\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;;;ACtCA,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;AAkBA,SAAS,EAAmB,GAAiC,GAAuE;CACnI,IAAI;EACH,IAAM,IAAQ,EAAQ,GAAG,EAAc,CAAC;EAKxC,OAJK,OAAO,SAAS,CAAK,IAInB;GAAE,IAAI;GAAM;EAAM,IAHjB;GAAE,IAAI;GAAO,QAAQ;EAA6B;CAI3D,QAAQ;EACP,OAAO;GAAE,IAAI;GAAO,QAAQ;EAA4B;CACzD;AACD;AAEA,SAAS,EAA+B,GAAiF;CACxH,IAAI,CAAC,MAAM,QAAQ,CAAiB,GACnC,MAAU,UAAU,gFAAgF;CAKrG,KAAK,IAAI,IAAQ,GAAG,IAAQ,EAAkB,QAAQ,KAAS;EAC9D,IAAM,IAAqD,EAAkB;EAC7E,IACC,CAAC,OAAO,OAAO,GAAmB,CAAK,KACvC,OAAO,KAAa,aACpB,KACA,CAAC,OAAO,OAAO,GAAU,OAAO,KAC/B,EAAS,QAAQ,KAAA,KAAa,OAAO,EAAS,OAAQ,UAEvD,MAAU,UAAU,wGAAwG;CAE9H;CAEA,IAAM,KAAgB,MAA4D;EAC7E,OAAC,OAAO,UAAU,CAAK,KAAK,IAAQ,KAAK,KAAS,EAAkB,SACxE,OAAO,EAAkB;CAC1B;CAEA,OAAO;EACN,MAAM,MAAU,EAAa,CAAK,CAAC,EAAE;EACrC,QAAQ,MAAU,EAAa,CAAK,CAAC,EAAE;EACvC,MAAM,MAAU,EAAqB,EAAa,CAAK,CAAC,EAAE,KAAK;CAChE;AACD;AAUA,SAAgB,EAAyC,GAEN;CAClD,IAAM,IAAU,EAAoB,EAAK,SAAS;CAKlD,OAJK,IAIE;EACN,IAAI;EACJ,UAAU,MAAsB,EAAmB,SAAe,EAA+B,CAAiB,CAAC;CACpH,IANQ;EAAE,IAAI;EAAO,QAAQ;CAAwB;AAOtD;AAGA,SAAgB,EAAyC,GAGzB;CAC/B,IAAM,IAAW,EAAyC,EAAE,WAAW,EAAK,UAAU,CAAC;CAKvF,OAJK,EAAS,KAIP,EAAS,QAAQ,EAAK,SAAS,IAH9B;EAAE,IAAI;EAAO,QAAQ,EAAS;CAAO;AAI9C;AAYA,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,GACM,UAAsB;CAE5B,OAAO;EACN,IAAI;EACJ,UAAU,OACT,IAAa,GAEN,EAAmB,GAAS,CAAa;CAElD;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;;;AC1OA,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"}
@@ -1,5 +1,5 @@
1
1
  import { at as e } from "./scalarTypeClassification-D4YcGxtQ.js";
2
- import { d as t, m as n, p as r, t as i } from "./formulas-Y0HOcFhe.js";
2
+ import { g as t, h as n, p as r, t as i } from "./formulas-BZtCqzBj.js";
3
3
  //#region src/formatters/number/numberFormatConstants.ts
4
4
  var a = "round", o = "floor", s = "ceil", c = "trunc", l = "ru-RU", u = "group", d = "decimal", f = "integer", p = "decimal", m = "decimal-2", h = "decimal-3", g = "currency", _ = "price", v = "percent", y = "tonnage", b = "compact-currency", x = "compact-currency-round", S = "compact-percent", C = "compact-percent-round", w = "compact-tonnage", T = "compact-tonnage-round", E = {
5
5
  decimals: 1,
@@ -362,13 +362,13 @@ function ct(e, a) {
362
362
  });
363
363
  for (let e of o.errors) e.code === "formula_not_found" ? Q(a, Je, "Формула источника состояния не найдена в реестре.") : e.code === "dependency_index_out_of_range" && Q(a, Xe, e.message);
364
364
  for (let e of o.warnings) switch (e.code) {
365
- case r:
365
+ case n:
366
366
  $(a, Ze, e.message);
367
367
  break;
368
- case t:
368
+ case r:
369
369
  $(a, Qe, e.message);
370
370
  break;
371
- case n: $(a, $e, e.message);
371
+ case t: $(a, $e, e.message);
372
372
  }
373
373
  }
374
374
  function lt(e, t) {
@@ -610,4 +610,4 @@ function pt(e) {
610
610
  //#endregion
611
611
  export { s as $, _e as A, k as B, pe as C, ue as D, le as E, ce as F, g as G, re as H, A as I, h as J, p as K, oe as L, ve as M, de as N, ge as O, se as P, y as Q, ee as R, fe as S, F as T, ie as U, ne as V, ae as W, v as X, f as Y, _ as Z, L as _, Je as a, l as at, M as b, K as c, V as d, o as et, H as f, z as g, B as h, He as i, u as it, he as j, me as k, we as l, R as m, ft as n, c as nt, Ce as o, Se as p, m as q, ut as r, d as rt, W as s, pt as t, a as tt, U as u, j as v, I as w, P as x, N as y, E as z };
612
612
 
613
- //# sourceMappingURL=validate-8URYKKly.js.map
613
+ //# sourceMappingURL=validate-rivmPJyV.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate-8URYKKly.js","names":[],"sources":["../../src/formatters/number/numberFormatConstants.ts","../../src/formatters/number/numberPresetNameConstants.ts","../../src/formatters/number/presets.ts","../../src/formatters/valueState/valueStateResolverConstants.ts","../../src/formatters/pipeline/formattersPipelineConstants.ts","../../src/formatters/pipeline/clone.ts","../../src/formatters/rowBased/context.ts","../../src/formatters/rowBased/registry.ts","../../src/formatters/pipeline/pipelineValidationConstants.ts","../../src/formatters/pipeline/validate.ts"],"sourcesContent":["/** Режимы compact и поля Intl имеют один источник значений для форматтеров, пресетов и типов. */\nexport const COMPACT_ROUNDING_MODE_ROUND = \"round\";\nexport const COMPACT_ROUNDING_MODE_FLOOR = \"floor\";\nexport const COMPACT_ROUNDING_MODE_CEIL = \"ceil\";\nexport const COMPACT_ROUNDING_MODE_TRUNC = \"trunc\";\nexport const NUMBER_FORMAT_LOCALE = \"ru-RU\";\nexport const INTL_NUMBER_PART_GROUP = \"group\";\nexport const INTL_NUMBER_PART_DECIMAL = \"decimal\";\nexport const STANDARD_NUMBER_GROUP_SIZE = 3;\nexport const FORMATTED_NUMBER_ZERO = \"0\";\n","/** Имена встроенных пресетов разделяют внутренние обращения и сохраняемый публичный объект имён. */\nexport const NUMBER_PRESET_NAME_INTEGER = \"integer\";\nexport const NUMBER_PRESET_NAME_DECIMAL = \"decimal\";\nexport const NUMBER_PRESET_NAME_DECIMAL2 = \"decimal-2\";\nexport const NUMBER_PRESET_NAME_DECIMAL3 = \"decimal-3\";\nexport const NUMBER_PRESET_NAME_CURRENCY = \"currency\";\nexport const NUMBER_PRESET_NAME_PRICE = \"price\";\nexport const NUMBER_PRESET_NAME_PERCENT = \"percent\";\nexport const NUMBER_PRESET_NAME_TONNAGE = \"tonnage\";\nexport const NUMBER_PRESET_NAME_COMPACT_CURRENCY = \"compact-currency\";\nexport const NUMBER_PRESET_NAME_COMPACT_CURRENCY_ROUND = \"compact-currency-round\";\nexport const NUMBER_PRESET_NAME_COMPACT_PERCENT = \"compact-percent\";\nexport const NUMBER_PRESET_NAME_COMPACT_PERCENT_ROUND = \"compact-percent-round\";\nexport const NUMBER_PRESET_NAME_COMPACT_TONNAGE = \"compact-tonnage\";\nexport const NUMBER_PRESET_NAME_COMPACT_TONNAGE_ROUND = \"compact-tonnage-round\";\n","import {\n\tSTANDARD_NUMBER_GROUP_SIZE,\n\tNUMBER_FORMAT_LOCALE,\n\tINTL_NUMBER_PART_GROUP,\n\tCOMPACT_ROUNDING_MODE_ROUND\n} from \"./numberFormatConstants\";\nimport {\n\tNUMBER_PRESET_NAME_INTEGER,\n\tNUMBER_PRESET_NAME_DECIMAL,\n\tNUMBER_PRESET_NAME_DECIMAL2,\n\tNUMBER_PRESET_NAME_DECIMAL3,\n\tNUMBER_PRESET_NAME_CURRENCY,\n\tNUMBER_PRESET_NAME_PRICE,\n\tNUMBER_PRESET_NAME_PERCENT,\n\tNUMBER_PRESET_NAME_TONNAGE,\n\tNUMBER_PRESET_NAME_COMPACT_CURRENCY,\n\tNUMBER_PRESET_NAME_COMPACT_CURRENCY_ROUND,\n\tNUMBER_PRESET_NAME_COMPACT_PERCENT,\n\tNUMBER_PRESET_NAME_COMPACT_PERCENT_ROUND,\n\tNUMBER_PRESET_NAME_COMPACT_TONNAGE,\n\tNUMBER_PRESET_NAME_COMPACT_TONNAGE_ROUND\n} from \"./numberPresetNameConstants\";\n\nimport type { NumberFormatPreset, NumberFormatPresetConfig } from \"./types\";\n\n/** Четырёхзначная проба извлекает групповой разделитель выбранной локали. */\nconst GROUP_SEPARATOR_PROBE_VALUE = 1_000;\n\n/** Символ группировки из ru-RU (U+00A0 или U+202F в зависимости от среды) */\nconst ruGroupChar =\n\tnew Intl.NumberFormat(NUMBER_FORMAT_LOCALE).formatToParts(GROUP_SEPARATOR_PROBE_VALUE).find((p) => p.type === INTL_NUMBER_PART_GROUP)\n\t\t?.value ?? \"\\u00A0\";\n\n/** Значения по умолчанию — совпадают с ru-RU форматированием */\nexport const NUMBER_FORMAT_DEFAULTS: Omit<NumberFormatPreset, \"name\"> = {\n\tdecimals: 1,\n\tdecimalSeparator: \",\",\n\tgrouping: true,\n\tgroupingSeparator: ruGroupChar,\n\tgroupingSize: STANDARD_NUMBER_GROUP_SIZE\n};\n\nexport const DEFAULT_NUMBER_PRESET_NAMES = Object.freeze({\n\tinteger: NUMBER_PRESET_NAME_INTEGER,\n\tdecimal: NUMBER_PRESET_NAME_DECIMAL,\n\tdecimal2: NUMBER_PRESET_NAME_DECIMAL2,\n\tdecimal3: NUMBER_PRESET_NAME_DECIMAL3,\n\tcurrency: NUMBER_PRESET_NAME_CURRENCY,\n\tprice: NUMBER_PRESET_NAME_PRICE,\n\tpercent: NUMBER_PRESET_NAME_PERCENT,\n\ttonnage: NUMBER_PRESET_NAME_TONNAGE,\n\tcompactCurrency: NUMBER_PRESET_NAME_COMPACT_CURRENCY,\n\tcompactCurrencyRound: NUMBER_PRESET_NAME_COMPACT_CURRENCY_ROUND,\n\tcompactPercent: NUMBER_PRESET_NAME_COMPACT_PERCENT,\n\tcompactPercentRound: NUMBER_PRESET_NAME_COMPACT_PERCENT_ROUND,\n\tcompactTonnage: NUMBER_PRESET_NAME_COMPACT_TONNAGE,\n\tcompactTonnageRound: NUMBER_PRESET_NAME_COMPACT_TONNAGE_ROUND\n});\n\n/**\n * Типовые предустановки числового форматирования.\n *\n * Compact-пресеты без суффикса сохраняют консервативное усечение, а парные\n * `*-round` дают явный математический режим без runtime-переопределения пресета.\n * Недостающие поля каждой предустановки заполняются из `NUMBER_FORMAT_DEFAULTS`.\n */\nconst BUILTIN: NumberFormatPresetConfig[] = [\n\t{ name: NUMBER_PRESET_NAME_INTEGER, decimals: 0, decimalSeparator: \"\" },\n\t{ name: NUMBER_PRESET_NAME_DECIMAL },\n\t{ name: NUMBER_PRESET_NAME_DECIMAL2, decimals: 2 },\n\t{ name: NUMBER_PRESET_NAME_DECIMAL3, decimals: 3 },\n\t{ name: NUMBER_PRESET_NAME_CURRENCY, decimals: 0, decimalSeparator: \"\" },\n\t{ name: NUMBER_PRESET_NAME_PRICE, decimals: 0, decimalSeparator: \"\" },\n\t{ name: NUMBER_PRESET_NAME_PERCENT, decimals: 2 },\n\t{ name: NUMBER_PRESET_NAME_TONNAGE },\n\t{ name: NUMBER_PRESET_NAME_COMPACT_CURRENCY, decimals: 0, decimalSeparator: \"\", compact: {} },\n\t{\n\t\tname: NUMBER_PRESET_NAME_COMPACT_CURRENCY_ROUND,\n\t\tdecimals: 0,\n\t\tdecimalSeparator: \"\",\n\t\tcompact: { roundingMode: COMPACT_ROUNDING_MODE_ROUND }\n\t},\n\t{ name: NUMBER_PRESET_NAME_COMPACT_PERCENT, decimals: 2, compact: { maxDecimals: 2 } },\n\t{\n\t\tname: NUMBER_PRESET_NAME_COMPACT_PERCENT_ROUND,\n\t\tdecimals: 2,\n\t\tcompact: { maxDecimals: 2, roundingMode: COMPACT_ROUNDING_MODE_ROUND }\n\t},\n\t{ name: NUMBER_PRESET_NAME_COMPACT_TONNAGE, compact: { maxDecimals: 1 } },\n\t{ name: NUMBER_PRESET_NAME_COMPACT_TONNAGE_ROUND, compact: { maxDecimals: 1, roundingMode: COMPACT_ROUNDING_MODE_ROUND } }\n];\n\nconst registry = new Map<string, NumberFormatPreset>();\n\nfunction init(): void {\n\tfor (const cfg of BUILTIN) {\n\t\tregistry.set(cfg.name, { ...NUMBER_FORMAT_DEFAULTS, ...cfg });\n\t}\n}\n\ninit();\n\nexport function getNumberPreset(name: string): NumberFormatPreset | undefined {\n\treturn registry.get(name);\n}\n\nexport function getNumberPresetNames(): string[] {\n\treturn Array.from(registry.keys());\n}\n\n/** Зарегистрировать или перезаписать предустановку. Недостающие поля берутся из FORMAT_DEFAULTS. */\nexport function registerNumberPreset(config: NumberFormatPresetConfig): NumberFormatPreset {\n\tconst preset: NumberFormatPreset = { ...NUMBER_FORMAT_DEFAULTS, ...config };\n\tregistry.set(preset.name, preset);\n\treturn preset;\n}\n\n/** Сбросить реестр к начальному состоянию (только типовые предустановки) */\nexport function resetNumberPresets(): void {\n\tregistry.clear();\n\tinit();\n}\n\nexport function resolveNumberPreset(presetOrName: string | NumberFormatPreset): NumberFormatPreset {\n\tif (typeof presetOrName !== \"string\") return presetOrName;\n\n\tconst found = getNumberPreset(presetOrName);\n\tif (!found) throw new Error(`Предустановка \"${presetOrName}\" не найдена`);\n\n\treturn found;\n}\n","/** Виды резолверов и правила включения порога связывают runtime-конфигурацию с её литеральными типами. */\nexport const VALUE_STATE_RESOLVER_KIND_FIXED = \"fixed\";\nexport const VALUE_STATE_RESOLVER_KIND_THRESHOLD = \"threshold\";\nexport const THRESHOLD_BOUNDARY_LOWER = \"lower\";\nexport const THRESHOLD_BOUNDARY_UPPER = \"upper\";\n","/** Устойчивые значения сериализуемого pipeline общие для проверки, графа, плана и runtime. */\nexport const PIPELINE_FORMATTER_NORMALIZE_LEADING_ZEROS = \"normalizeLeadingZeros\";\nexport const PIPELINE_FORMATTER_ROW_BASED_OVERRIDE = \"rowBasedOverride\";\nexport const PIPELINE_FORMATTER_RESOLVE_VALUE_STATE = \"resolveValueState\";\nexport const PIPELINE_FORMATTER_TYPED_VALUE_FORMAT = \"typedValueFormat\";\nexport const PIPELINE_NODE_SOURCE = \"source\";\nexport const PIPELINE_NODE_SINK = \"sink\";\nexport const PIPELINE_OVERRIDE_MODE_FIELD = \"field\";\nexport const PIPELINE_OVERRIDE_MODE_FORMULA = \"formula\";\nexport const PIPELINE_STATE_SOURCE_VALUE = \"value\";\nexport const PIPELINE_ICON_POSITION_LEFT = \"left\";\nexport const PIPELINE_ICON_POSITION_RIGHT = \"right\";\nexport const PIPELINE_ROW_KIND_PLAIN = \"plain\";\nexport const PIPELINE_ROW_KIND_TREE = \"tree\";\nexport const PIPELINE_ROW_KIND_GROUP = \"group\";\nexport const PIPELINE_ROW_KIND_TOTALS = \"totals\";\nexport const PIPELINE_STATE_SOURCE_FORMULA = \"formula\";\nexport const FORMATTERS_PIPELINE_VERSION = 1;\n","import { VALUE_STATE_RESOLVER_KIND_FIXED, VALUE_STATE_RESOLVER_KIND_THRESHOLD } from \"../valueState/valueStateResolverConstants\";\n\nimport {\n\tPIPELINE_OVERRIDE_MODE_FORMULA,\n\tPIPELINE_FORMATTER_TYPED_VALUE_FORMAT,\n\tPIPELINE_FORMATTER_NORMALIZE_LEADING_ZEROS,\n\tPIPELINE_FORMATTER_ROW_BASED_OVERRIDE,\n\tPIPELINE_FORMATTER_RESOLVE_VALUE_STATE,\n\tPIPELINE_NODE_SOURCE,\n\tPIPELINE_NODE_SINK,\n\tPIPELINE_STATE_SOURCE_FORMULA\n} from \"./formattersPipelineConstants\";\n\nimport type {\n\tFormattersPipelineConfig,\n\tFormattersPipelineGraph,\n\tFormattersPipelineNode,\n\tFormattersPipelineNormalizeLeadingZerosConfig,\n\tFormattersPipelinePlan,\n\tFormattersPipelineResolveValueStateConfig,\n\tFormattersPipelineRowBasedOverrideConfig,\n\tFormattersPipelineStep,\n\tFormattersPipelineTypedValueFormatConfig\n} from \"./types\";\n\nexport function cloneTypedValueFormatConfig(\n\tconfig: FormattersPipelineTypedValueFormatConfig | undefined\n): FormattersPipelineTypedValueFormatConfig | undefined {\n\treturn config ? { ...config } : undefined;\n}\n\nexport function cloneNormalizeLeadingZerosConfig(\n\tconfig: FormattersPipelineNormalizeLeadingZerosConfig | undefined\n): FormattersPipelineNormalizeLeadingZerosConfig | undefined {\n\treturn config ? { ...config } : undefined;\n}\n\nexport function cloneRowBasedOverrideConfig(config: FormattersPipelineRowBasedOverrideConfig): FormattersPipelineRowBasedOverrideConfig {\n\treturn config.mode === PIPELINE_OVERRIDE_MODE_FORMULA\n\t\t? { ...config, dependencyIds: config.dependencyIds ? [...config.dependencyIds] : undefined }\n\t\t: { ...config };\n}\n\nexport function cloneResolveValueStateConfig(config: FormattersPipelineResolveValueStateConfig): FormattersPipelineResolveValueStateConfig {\n\treturn {\n\t\tresolver:\n\t\t\tconfig.resolver.kind === VALUE_STATE_RESOLVER_KIND_FIXED\n\t\t\t\t? {\n\t\t\t\t\t\tkind: VALUE_STATE_RESOLVER_KIND_FIXED,\n\t\t\t\t\t\tentries: { ...config.resolver.entries },\n\t\t\t\t\t\tfallbackState: config.resolver.fallbackState\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tkind: VALUE_STATE_RESOLVER_KIND_THRESHOLD,\n\t\t\t\t\t\tthresholds: config.resolver.thresholds.map((item) => (typeof item === \"number\" ? item : { ...item })),\n\t\t\t\t\t\tstates: [...config.resolver.states],\n\t\t\t\t\t\tinvalidState: config.resolver.invalidState\n\t\t\t\t\t},\n\t\tvalueSource:\n\t\t\tconfig.valueSource?.kind === PIPELINE_STATE_SOURCE_FORMULA\n\t\t\t\t? { ...config.valueSource, dependencyIds: [...config.valueSource.dependencyIds] }\n\t\t\t\t: config.valueSource\n\t\t\t\t\t? { ...config.valueSource }\n\t\t\t\t\t: undefined,\n\t\ticon: config.icon ? { ...config.icon } : undefined\n\t};\n}\n\nexport function cloneFormatterPipelinePlanStep(step: FormattersPipelineStep): FormattersPipelineStep {\n\tswitch (step.type) {\n\t\tcase PIPELINE_FORMATTER_TYPED_VALUE_FORMAT:\n\t\t\treturn {\n\t\t\t\t...step,\n\t\t\t\tconfig: cloneTypedValueFormatConfig(step.config)\n\t\t\t};\n\t\tcase PIPELINE_FORMATTER_NORMALIZE_LEADING_ZEROS:\n\t\t\treturn {\n\t\t\t\t...step,\n\t\t\t\tconfig: cloneNormalizeLeadingZerosConfig(step.config)\n\t\t\t};\n\t\tcase PIPELINE_FORMATTER_ROW_BASED_OVERRIDE:\n\t\t\treturn {\n\t\t\t\t...step,\n\t\t\t\tconfig: cloneRowBasedOverrideConfig(step.config)\n\t\t\t};\n\t\tcase PIPELINE_FORMATTER_RESOLVE_VALUE_STATE:\n\t\t\treturn {\n\t\t\t\t...step,\n\t\t\t\tconfig: cloneResolveValueStateConfig(step.config)\n\t\t\t};\n\t\tdefault: {\n\t\t\tconst checker: never = step;\n\t\t\tvoid checker;\n\t\t}\n\t}\n\n\tthrow new Error(`Недопустимый тип '${(step as Record<string, unknown>)?.type}' для шага FormatterPipeline`);\n}\n\nexport function cloneFormatterPipelinePlanStepToNode(\n\tstep: FormattersPipelineStep,\n\tposition: { x: number; y: number }\n): FormattersPipelineNode {\n\tswitch (step.type) {\n\t\tcase PIPELINE_FORMATTER_TYPED_VALUE_FORMAT:\n\t\t\treturn {\n\t\t\t\t...step,\n\t\t\t\tposition: { ...position },\n\t\t\t\tconfig: cloneTypedValueFormatConfig(step.config)\n\t\t\t};\n\t\tcase PIPELINE_FORMATTER_NORMALIZE_LEADING_ZEROS:\n\t\t\treturn {\n\t\t\t\t...step,\n\t\t\t\tposition: { ...position },\n\t\t\t\tconfig: cloneNormalizeLeadingZerosConfig(step.config)\n\t\t\t};\n\t\tcase PIPELINE_FORMATTER_ROW_BASED_OVERRIDE:\n\t\t\treturn {\n\t\t\t\t...step,\n\t\t\t\tposition: { ...position },\n\t\t\t\tconfig: cloneRowBasedOverrideConfig(step.config)\n\t\t\t};\n\t\tcase PIPELINE_FORMATTER_RESOLVE_VALUE_STATE:\n\t\t\treturn {\n\t\t\t\t...step,\n\t\t\t\tposition: { ...position },\n\t\t\t\tconfig: cloneResolveValueStateConfig(step.config)\n\t\t\t};\n\t\tdefault: {\n\t\t\tconst checker: never = step;\n\t\t\tvoid checker;\n\t\t}\n\t}\n\n\tthrow new Error(`Недопустимый тип '${(step as Record<string, unknown>)?.type}' для шага FormatterPipeline`);\n}\n\nfunction cloneNode(node: FormattersPipelineNode): FormattersPipelineNode {\n\tswitch (node.type) {\n\t\tcase PIPELINE_NODE_SOURCE:\n\t\tcase PIPELINE_NODE_SINK:\n\t\t\treturn {\n\t\t\t\t...node,\n\t\t\t\tposition: { ...node.position }\n\t\t\t};\n\t\tdefault:\n\t\t\treturn cloneFormatterPipelinePlanStepToNode(node, node.position);\n\t}\n}\n\nfunction cloneGraph(graph: FormattersPipelineGraph): FormattersPipelineGraph {\n\treturn {\n\t\tnodes: graph.nodes.map(cloneNode),\n\t\tedges: graph.edges.map((edge) => ({ ...edge })),\n\t\tviewport: graph.viewport ? { ...graph.viewport } : undefined\n\t};\n}\n\nfunction clonePlan(plan: FormattersPipelinePlan): FormattersPipelinePlan {\n\treturn {\n\t\tsteps: plan.steps.map(cloneFormatterPipelinePlanStep)\n\t};\n}\n\n/**\n * Возвращает полную копию конфигурации pipeline для безопасного хранения в сторе.\n */\nexport function cloneFormattersPipelineConfig(config: FormattersPipelineConfig | undefined): FormattersPipelineConfig | undefined {\n\tif (!config) return undefined;\n\n\tconst version = config.version;\n\tconst graph = config.graph ? cloneGraph(config.graph) : undefined;\n\tconst plan = config.plan ? clonePlan(config.plan) : undefined;\n\n\treturn { version, graph, plan };\n}\n","import { parseNumber } from \"../number\";\n\nimport type { RowBasedFormatterContext, RowBasedFormatterContextInstrumentation } from \"./types\";\n\nexport function createRowBasedFormatterContext(args: {\n\trowData: Record<string, unknown>;\n\trawValue: unknown;\n\tcolumnId: string;\n\tkeys?: readonly string[];\n\tinstrumentation?: RowBasedFormatterContextInstrumentation;\n}): RowBasedFormatterContext {\n\t// TODO: duplicate createTableFormulaContext src\\shared\\lib\\formulas\\execute.ts\n\tconst keys = [...(args.keys ?? [])];\n\n\tconst readKey = (index: number): string | 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 key = readKey(index);\n\t\tif (!key) return undefined;\n\t\treturn args.rowData[key];\n\t};\n\n\tconst readNum = (index: number): number => {\n\t\tconst key = readKey(index);\n\t\tif (!key) return 0;\n\t\treturn parseNumber(args.rowData[key]);\n\t};\n\n\treturn {\n\t\trowData: args.rowData,\n\t\trawValue: args.rawValue,\n\t\tcolumnId: args.columnId,\n\t\tkey: readKey,\n\t\tvalue: readValue,\n\t\tnum: readNum\n\t};\n}\n","import type { RowBasedFormatterDefinition } from \"./types\";\n\nexport type RowBasedFormatterRegistry = Readonly<{\n\tlist: readonly RowBasedFormatterDefinition[];\n\tbyId: ReadonlyMap<string, RowBasedFormatterDefinition>;\n}>;\n\n/**\n * Создаёт реестр формул для подмены значения в групповой строке.\n */\nexport function createRowBasedFormatterRegistry(definitions: readonly RowBasedFormatterDefinition[]): RowBasedFormatterRegistry {\n\tconst byId = new Map<string, RowBasedFormatterDefinition>();\n\tconst list: RowBasedFormatterDefinition[] = [];\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 для RowBasedFormatter не может быть пустым\");\n\t\t}\n\n\t\tif (byId.has(normalizedId)) {\n\t\t\tthrow new Error(`Найден дублирующийся formulaId в RowBasedFormatter: ${normalizedId}`);\n\t\t}\n\n\t\tconst normalizedDefinition: RowBasedFormatterDefinition = 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});\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 rowBasedFormatterRegistry = createRowBasedFormatterRegistry([]);\n\n/**\n * Устанавливает реестр row-based форматтеров host-приложения.\n *\n * Pipeline использует этот реестр при валидации и компиляции formula-режима,\n * поэтому конфигурация должна завершиться до первого построения runtime.\n */\nexport function configureRowBasedFormatterRegistry(registry: RowBasedFormatterRegistry): void {\n\trowBasedFormatterRegistry = registry;\n}\n\n/**\n * Возвращает список доступных формул для групповой подмены.\n */\nexport function getRowBasedFormatterList(): readonly RowBasedFormatterDefinition[] {\n\treturn rowBasedFormatterRegistry.list;\n}\n\n/**\n * Возвращает формулу по id.\n */\nexport function getRowBasedFormatterById(formulaId: string | undefined): RowBasedFormatterDefinition | undefined {\n\tconst normalizedId = formulaId?.trim();\n\tif (!normalizedId) return undefined;\n\treturn rowBasedFormatterRegistry.byId.get(normalizedId);\n}\n","/** Коды диагностики сохраняют единый источник для сообщений валидации и их runtime-потребителей. */\nexport const PIPELINE_VALIDATION_CONFIG_NOT_DEFINED = \"config_not_defined\";\nexport const PIPELINE_VALIDATION_UNSUPPORTED_VERSION = \"unsupported_version\";\nexport const PIPELINE_VALIDATION_GRAPH_OR_PLAN_REQUIRED = \"graph_or_plan_required\";\nexport const PIPELINE_VALIDATION_NODE_ID_DUPLICATE = \"node_id_duplicate\";\nexport const PIPELINE_VALIDATION_EDGE_ID_DUPLICATE = \"edge_id_duplicate\";\nexport const PIPELINE_VALIDATION_EDGE_NODE_NOT_FOUND = \"edge_node_not_found\";\nexport const PIPELINE_VALIDATION_SOURCE_COUNT_INVALID = \"source_count_invalid\";\nexport const PIPELINE_VALIDATION_SINK_COUNT_INVALID = \"sink_count_invalid\";\nexport const PIPELINE_VALIDATION_SOURCE_INCOMING_INVALID = \"source_incoming_invalid\";\nexport const PIPELINE_VALIDATION_SINK_OUTGOING_INVALID = \"sink_outgoing_invalid\";\nexport const PIPELINE_VALIDATION_NODE_DEGREE_INVALID = \"node_degree_invalid\";\nexport const PIPELINE_VALIDATION_PATH_BROKEN = \"path_broken\";\nexport const PIPELINE_VALIDATION_PATH_CYCLE_DETECTED = \"path_cycle_detected\";\nexport const PIPELINE_VALIDATION_PATH_DISCONNECTED_NODES = \"path_disconnected_nodes\";\nexport const PIPELINE_VALIDATION_STEP_ID_DUPLICATE = \"step_id_duplicate\";\nexport const PIPELINE_VALIDATION_STEP_RESOLVE_VALUE_STATE_MULTIPLE = \"step_resolve_value_state_multiple\";\nexport const PIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_MULTIPLE = \"step_typed_value_format_multiple\";\nexport const PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_MULTIPLE = \"step_row_based_override_multiple\";\nexport const PIPELINE_VALIDATION_STEP_NORMALIZE_LEADING_ZEROS_MULTIPLE = \"step_normalize_leading_zeros_multiple\";\nexport const PIPELINE_VALIDATION_STEP_TYPED_BEFORE_VALUE_STATE = \"step_typed_before_value_state\";\nexport const PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FIELD_KEY_EMPTY = \"step_row_based_override_field_key_empty\";\nexport const PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_ID_EMPTY = \"step_row_based_override_formula_id_empty\";\nexport const PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_NOT_FOUND = \"step_row_based_override_formula_not_found\";\nexport const PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_DEPENDENCY_INDEX_OUT_OF_RANGE =\n\t\"step_row_based_override_dependency_index_out_of_range\";\nexport const PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_UNUSED_DEPENDENCIES = \"step_row_based_override_unused_dependencies\";\nexport const PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_DOES_NOT_USE_DEPENDENCIES =\n\t\"step_row_based_override_formula_does_not_use_dependencies\";\nexport const PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_RUNTIME_ERROR = \"step_row_based_override_formula_runtime_error\";\nexport const PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_ID_EMPTY = \"step_value_state_formula_id_empty\";\nexport const PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_NOT_FOUND = \"step_value_state_formula_not_found\";\nexport const PIPELINE_VALIDATION_STEP_VALUE_STATE_DEPENDENCY_ID_EMPTY = \"step_value_state_dependency_id_empty\";\nexport const PIPELINE_VALIDATION_STEP_VALUE_STATE_DEPENDENCY_INDEX_OUT_OF_RANGE = \"step_value_state_dependency_index_out_of_range\";\nexport const PIPELINE_VALIDATION_STEP_VALUE_STATE_UNUSED_DEPENDENCIES = \"step_value_state_unused_dependencies\";\nexport const PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_DOES_NOT_USE_DEPENDENCIES = \"step_value_state_formula_does_not_use_dependencies\";\nexport const PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_RUNTIME_ERROR = \"step_value_state_formula_runtime_error\";\nexport const PIPELINE_VALIDATION_STEP_THRESHOLD_STATES_COUNT_INVALID = \"step_threshold_states_count_invalid\";\nexport const PIPELINE_VALIDATION_STEP_VALUE_HIDDEN_WITHOUT_ICON = \"step_value_hidden_without_icon\";\nexport const PIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_PRESET_EMPTY = \"step_typed_value_format_preset_empty\";\nexport const PIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_PRESET_NOT_FOUND = \"step_typed_value_format_preset_not_found\";\n","import { validateTableFormulaDependencies } from \"../../formulas\";\nimport {\n\tTABLE_FORMULA_NOT_FOUND,\n\tTABLE_FORMULA_DEPENDENCY_INDEX_OUT_OF_RANGE,\n\tTABLE_FORMULA_UNUSED_DEPENDENCIES,\n\tTABLE_FORMULA_DOES_NOT_USE_DEPENDENCIES,\n\tTABLE_FORMULA_VALIDATION_RUNTIME_ERROR\n} from \"../../formulas/tableFormulaConstants\";\nimport { getNumberPreset } from \"../number\";\nimport { createRowBasedFormatterContext, getRowBasedFormatterById } from \"../rowBased\";\nimport { VALUE_STATE_RESOLVER_KIND_THRESHOLD } from \"../valueState/valueStateResolverConstants\";\n\nimport { cloneResolveValueStateConfig } from \"./clone\";\nimport {\n\tPIPELINE_FORMATTER_NORMALIZE_LEADING_ZEROS,\n\tPIPELINE_FORMATTER_ROW_BASED_OVERRIDE,\n\tPIPELINE_OVERRIDE_MODE_FIELD,\n\tPIPELINE_OVERRIDE_MODE_FORMULA,\n\tPIPELINE_FORMATTER_RESOLVE_VALUE_STATE,\n\tPIPELINE_FORMATTER_TYPED_VALUE_FORMAT,\n\tPIPELINE_NODE_SOURCE,\n\tPIPELINE_NODE_SINK,\n\tPIPELINE_STATE_SOURCE_FORMULA,\n\tFORMATTERS_PIPELINE_VERSION\n} from \"./formattersPipelineConstants\";\nimport {\n\tPIPELINE_VALIDATION_CONFIG_NOT_DEFINED,\n\tPIPELINE_VALIDATION_UNSUPPORTED_VERSION,\n\tPIPELINE_VALIDATION_GRAPH_OR_PLAN_REQUIRED,\n\tPIPELINE_VALIDATION_NODE_ID_DUPLICATE,\n\tPIPELINE_VALIDATION_EDGE_ID_DUPLICATE,\n\tPIPELINE_VALIDATION_EDGE_NODE_NOT_FOUND,\n\tPIPELINE_VALIDATION_SOURCE_COUNT_INVALID,\n\tPIPELINE_VALIDATION_SINK_COUNT_INVALID,\n\tPIPELINE_VALIDATION_SOURCE_INCOMING_INVALID,\n\tPIPELINE_VALIDATION_SINK_OUTGOING_INVALID,\n\tPIPELINE_VALIDATION_NODE_DEGREE_INVALID,\n\tPIPELINE_VALIDATION_PATH_BROKEN,\n\tPIPELINE_VALIDATION_PATH_CYCLE_DETECTED,\n\tPIPELINE_VALIDATION_PATH_DISCONNECTED_NODES,\n\tPIPELINE_VALIDATION_STEP_ID_DUPLICATE,\n\tPIPELINE_VALIDATION_STEP_RESOLVE_VALUE_STATE_MULTIPLE,\n\tPIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_MULTIPLE,\n\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_MULTIPLE,\n\tPIPELINE_VALIDATION_STEP_NORMALIZE_LEADING_ZEROS_MULTIPLE,\n\tPIPELINE_VALIDATION_STEP_TYPED_BEFORE_VALUE_STATE,\n\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FIELD_KEY_EMPTY,\n\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_ID_EMPTY,\n\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_NOT_FOUND,\n\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_DEPENDENCY_INDEX_OUT_OF_RANGE,\n\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_UNUSED_DEPENDENCIES,\n\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_DOES_NOT_USE_DEPENDENCIES,\n\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_RUNTIME_ERROR,\n\tPIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_ID_EMPTY,\n\tPIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_NOT_FOUND,\n\tPIPELINE_VALIDATION_STEP_VALUE_STATE_DEPENDENCY_ID_EMPTY,\n\tPIPELINE_VALIDATION_STEP_VALUE_STATE_DEPENDENCY_INDEX_OUT_OF_RANGE,\n\tPIPELINE_VALIDATION_STEP_VALUE_STATE_UNUSED_DEPENDENCIES,\n\tPIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_DOES_NOT_USE_DEPENDENCIES,\n\tPIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_RUNTIME_ERROR,\n\tPIPELINE_VALIDATION_STEP_THRESHOLD_STATES_COUNT_INVALID,\n\tPIPELINE_VALIDATION_STEP_VALUE_HIDDEN_WITHOUT_ICON,\n\tPIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_PRESET_EMPTY,\n\tPIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_PRESET_NOT_FOUND\n} from \"./pipelineValidationConstants\";\n\nimport type {\n\tFormattersPipelineConfig,\n\tFormattersPipelineEdge,\n\tFormattersPipelineGraph,\n\tFormattersPipelineNode,\n\tFormattersPipelinePlan,\n\tFormattersPipelineRowBasedOverrideFormulaConfig,\n\tFormattersPipelineStep,\n\tFormattersPipelineValueStateFormulaSource\n} from \"./types\";\n\n/** Положительная и отрицательная пробы выявляют обращения к зависимостям в разных ветках формулы. */\nconst FORMULA_VALIDATION_PROBE_VALUE = 100;\n\nexport type FormattersPipelineValidationCode =\n\t| typeof PIPELINE_VALIDATION_CONFIG_NOT_DEFINED\n\t| typeof PIPELINE_VALIDATION_UNSUPPORTED_VERSION\n\t| typeof PIPELINE_VALIDATION_GRAPH_OR_PLAN_REQUIRED\n\t| typeof PIPELINE_VALIDATION_NODE_ID_DUPLICATE\n\t| typeof PIPELINE_VALIDATION_EDGE_ID_DUPLICATE\n\t| typeof PIPELINE_VALIDATION_EDGE_NODE_NOT_FOUND\n\t| typeof PIPELINE_VALIDATION_SOURCE_COUNT_INVALID\n\t| typeof PIPELINE_VALIDATION_SINK_COUNT_INVALID\n\t| typeof PIPELINE_VALIDATION_SOURCE_INCOMING_INVALID\n\t| typeof PIPELINE_VALIDATION_SINK_OUTGOING_INVALID\n\t| typeof PIPELINE_VALIDATION_NODE_DEGREE_INVALID\n\t| typeof PIPELINE_VALIDATION_PATH_BROKEN\n\t| typeof PIPELINE_VALIDATION_PATH_CYCLE_DETECTED\n\t| typeof PIPELINE_VALIDATION_PATH_DISCONNECTED_NODES\n\t| typeof PIPELINE_VALIDATION_STEP_ID_DUPLICATE\n\t| typeof PIPELINE_VALIDATION_STEP_RESOLVE_VALUE_STATE_MULTIPLE\n\t| typeof PIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_MULTIPLE\n\t| typeof PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_MULTIPLE\n\t| typeof PIPELINE_VALIDATION_STEP_NORMALIZE_LEADING_ZEROS_MULTIPLE\n\t| typeof PIPELINE_VALIDATION_STEP_TYPED_BEFORE_VALUE_STATE\n\t| typeof PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FIELD_KEY_EMPTY\n\t| typeof PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_ID_EMPTY\n\t| typeof PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_NOT_FOUND\n\t| typeof PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_DEPENDENCY_INDEX_OUT_OF_RANGE\n\t| typeof PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_UNUSED_DEPENDENCIES\n\t| typeof PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_DOES_NOT_USE_DEPENDENCIES\n\t| typeof PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_RUNTIME_ERROR\n\t| typeof PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_ID_EMPTY\n\t| typeof PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_NOT_FOUND\n\t| typeof PIPELINE_VALIDATION_STEP_VALUE_STATE_DEPENDENCY_ID_EMPTY\n\t| typeof PIPELINE_VALIDATION_STEP_VALUE_STATE_DEPENDENCY_INDEX_OUT_OF_RANGE\n\t| typeof PIPELINE_VALIDATION_STEP_VALUE_STATE_UNUSED_DEPENDENCIES\n\t| typeof PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_DOES_NOT_USE_DEPENDENCIES\n\t| typeof PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_RUNTIME_ERROR\n\t| typeof PIPELINE_VALIDATION_STEP_THRESHOLD_STATES_COUNT_INVALID\n\t| typeof PIPELINE_VALIDATION_STEP_VALUE_HIDDEN_WITHOUT_ICON\n\t| typeof PIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_PRESET_EMPTY\n\t| typeof PIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_PRESET_NOT_FOUND;\n\nexport type FormattersPipelineValidationMessage = {\n\tcode: FormattersPipelineValidationCode;\n\tmessage: string;\n};\n\nexport type FormattersPipelineValidationResult = {\n\tok: boolean;\n\terrors: FormattersPipelineValidationMessage[];\n\twarnings: FormattersPipelineValidationMessage[];\n\tplan?: FormattersPipelinePlan;\n};\n\ntype MutableValidationState = {\n\terrors: FormattersPipelineValidationMessage[];\n\twarnings: FormattersPipelineValidationMessage[];\n};\n\nfunction pushError(state: MutableValidationState, code: FormattersPipelineValidationCode, message: string) {\n\tstate.errors.push({ code, message });\n}\n\nfunction pushWarning(state: MutableValidationState, code: FormattersPipelineValidationCode, message: string) {\n\tstate.warnings.push({ code, message });\n}\n\nfunction toSortedArray(items: Set<number>): number[] {\n\treturn [...items].sort((left, right) => left - right);\n}\n\nfunction createSampleRowData(dependencies: readonly string[], multiplier: number): Record<string, unknown> {\n\treturn dependencies.reduce<Record<string, unknown>>((acc, dependencyId, index) => {\n\t\tacc[dependencyId] = (index + 1) * multiplier;\n\t\treturn acc;\n\t}, {});\n}\n\nfunction validateRowBasedOverrideFormulaConfig(config: FormattersPipelineRowBasedOverrideFormulaConfig, state: MutableValidationState) {\n\tif (!config.formulaId.trim()) {\n\t\tpushError(\n\t\t\tstate,\n\t\t\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_ID_EMPTY,\n\t\t\t\"Для rowBasedOverride (formula) необходимо заполнить formulaId.\"\n\t\t);\n\t\treturn;\n\t}\n\n\tconst formula = getRowBasedFormatterById(config.formulaId);\n\tconst dependencies = [...(config.dependencyIds ?? [])];\n\n\tif (!formula) {\n\t\tpushError(state, PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_NOT_FOUND, \"Формула rowBasedOverride не найдена в реестре.\");\n\t\treturn;\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 = createRowBasedFormatterContext({\n\t\t\t\trowData: sampleRowData,\n\t\t\t\trawValue: FORMULA_VALIDATION_PROBE_VALUE,\n\t\t\t\tcolumnId: \"__validation__\",\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\tpushError(\n\t\t\tstate,\n\t\t\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_DEPENDENCY_INDEX_OUT_OF_RANGE,\n\t\t\t`Формула rowBasedOverride обращается к несуществующим индексам. Минимально требуется зависимостей: ${requiredDependencyCount}, выбрано: ${dependencies.length}.`\n\t\t);\n\t}\n\n\tif (sortedUsedIndexes.length === 0) {\n\t\tpushWarning(\n\t\t\tstate,\n\t\t\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_DOES_NOT_USE_DEPENDENCIES,\n\t\t\t\"Формула rowBasedOverride не использует dependencyIds.\"\n\t\t);\n\t}\n\n\tconst unusedDependencies = dependencies.filter((_, index) => !usedIndexes.has(index));\n\tif (unusedDependencies.length > 0) {\n\t\tpushWarning(\n\t\t\tstate,\n\t\t\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_UNUSED_DEPENDENCIES,\n\t\t\t`Выбраны, но не используются формулой rowBasedOverride: ${unusedDependencies.join(\", \")}.`\n\t\t);\n\t}\n\n\tif (runtimeErrorCount > 0) {\n\t\tpushWarning(\n\t\t\tstate,\n\t\t\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_RUNTIME_ERROR,\n\t\t\t\"На тестовых данных формула rowBasedOverride завершилась с ошибкой.\"\n\t\t);\n\t}\n}\n\n/**\n * Pipeline проверяет контракт формулы и индексы, а наличие полей в конкретном\n * источнике данных проверяет потребитель через collectRuntimeFieldDependencyIds.\n */\nfunction validateValueStateFormulaSource(source: FormattersPipelineValueStateFormulaSource, state: MutableValidationState) {\n\tif (!source.formulaId.trim()) {\n\t\tpushError(state, PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_ID_EMPTY, \"Для источника состояния необходимо выбрать формулу.\");\n\t\treturn;\n\t}\n\n\tif (source.dependencyIds.some((dependencyId) => !dependencyId.trim())) {\n\t\tpushError(\n\t\t\tstate,\n\t\t\tPIPELINE_VALIDATION_STEP_VALUE_STATE_DEPENDENCY_ID_EMPTY,\n\t\t\t\"Зависимость формулы состояния не может иметь пустой id.\"\n\t\t);\n\t\treturn;\n\t}\n\n\tconst validation = validateTableFormulaDependencies({\n\t\tformulaId: source.formulaId,\n\t\tdependencies: source.dependencyIds,\n\t\tavailableColumnIds: source.dependencyIds\n\t});\n\tfor (const error of validation.errors) {\n\t\tif (error.code === TABLE_FORMULA_NOT_FOUND) {\n\t\t\tpushError(state, PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_NOT_FOUND, \"Формула источника состояния не найдена в реестре.\");\n\t\t} else if (error.code === TABLE_FORMULA_DEPENDENCY_INDEX_OUT_OF_RANGE) {\n\t\t\tpushError(state, PIPELINE_VALIDATION_STEP_VALUE_STATE_DEPENDENCY_INDEX_OUT_OF_RANGE, error.message);\n\t\t}\n\t}\n\tfor (const warning of validation.warnings) {\n\t\tswitch (warning.code) {\n\t\t\tcase TABLE_FORMULA_UNUSED_DEPENDENCIES:\n\t\t\t\tpushWarning(state, PIPELINE_VALIDATION_STEP_VALUE_STATE_UNUSED_DEPENDENCIES, warning.message);\n\t\t\t\tbreak;\n\t\t\tcase TABLE_FORMULA_DOES_NOT_USE_DEPENDENCIES:\n\t\t\t\tpushWarning(state, PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_DOES_NOT_USE_DEPENDENCIES, warning.message);\n\t\t\t\tbreak;\n\t\t\tcase TABLE_FORMULA_VALIDATION_RUNTIME_ERROR:\n\t\t\t\tpushWarning(state, PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_RUNTIME_ERROR, warning.message);\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\nfunction validateStepDefinitions(steps: readonly FormattersPipelineStep[], state: MutableValidationState) {\n\tconst stepIdSet = new Set<string>();\n\tconst counters = {\n\t\tnormalizeLeadingZeros: 0,\n\t\trowBasedOverride: 0,\n\t\tresolveValueState: 0,\n\t\ttypedValueFormat: 0\n\t};\n\n\tfor (const step of steps) {\n\t\tconst normalizedId = step.id.trim();\n\t\tif (!normalizedId) {\n\t\t\tpushError(state, PIPELINE_VALIDATION_STEP_ID_DUPLICATE, \"Шаг pipeline не может иметь пустой id.\");\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (stepIdSet.has(normalizedId)) {\n\t\t\tpushError(state, PIPELINE_VALIDATION_STEP_ID_DUPLICATE, `Найден дублирующийся id шага pipeline: ${normalizedId}.`);\n\t\t}\n\t\tstepIdSet.add(normalizedId);\n\n\t\tswitch (step.type) {\n\t\t\tcase PIPELINE_FORMATTER_NORMALIZE_LEADING_ZEROS:\n\t\t\t\tcounters.normalizeLeadingZeros += 1;\n\t\t\t\tbreak;\n\t\t\tcase PIPELINE_FORMATTER_ROW_BASED_OVERRIDE:\n\t\t\t\tcounters.rowBasedOverride += 1;\n\n\t\t\t\tif (step.config.mode === PIPELINE_OVERRIDE_MODE_FIELD && !step.config.fieldKey.trim()) {\n\t\t\t\t\tpushError(\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FIELD_KEY_EMPTY,\n\t\t\t\t\t\t\"Для rowBasedOverride (field) необходимо заполнить fieldKey.\"\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (step.config.mode === PIPELINE_OVERRIDE_MODE_FORMULA) {\n\t\t\t\t\tvalidateRowBasedOverrideFormulaConfig(step.config, state);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase PIPELINE_FORMATTER_RESOLVE_VALUE_STATE:\n\t\t\t\tcounters.resolveValueState += 1;\n\t\t\t\tif (step.config.valueSource?.kind === PIPELINE_STATE_SOURCE_FORMULA) {\n\t\t\t\t\tvalidateValueStateFormulaSource(step.config.valueSource, state);\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tstep.config.resolver.kind === VALUE_STATE_RESOLVER_KIND_THRESHOLD &&\n\t\t\t\t\tstep.config.resolver.states.length !== step.config.resolver.thresholds.length + 1\n\t\t\t\t) {\n\t\t\t\t\tpushError(\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\tPIPELINE_VALIDATION_STEP_THRESHOLD_STATES_COUNT_INVALID,\n\t\t\t\t\t\t\"Для threshold-резолвера количество states должно быть равно thresholds + 1.\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase PIPELINE_FORMATTER_TYPED_VALUE_FORMAT:\n\t\t\t\tcounters.typedValueFormat += 1;\n\t\t\t\tif (step.config?.numberPresetName !== undefined) {\n\t\t\t\t\tconst normalizedPresetName = step.config.numberPresetName.trim();\n\t\t\t\t\tif (!normalizedPresetName) {\n\t\t\t\t\t\tpushError(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tPIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_PRESET_EMPTY,\n\t\t\t\t\t\t\t\"Для typedValueFormat указан пустой numberPresetName.\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!getNumberPreset(normalizedPresetName)) {\n\t\t\t\t\t\tpushError(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tPIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_PRESET_NOT_FOUND,\n\t\t\t\t\t\t\t`Для typedValueFormat указан неизвестный пресет: ${normalizedPresetName}.`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (counters.normalizeLeadingZeros > 1) {\n\t\tpushError(\n\t\t\tstate,\n\t\t\tPIPELINE_VALIDATION_STEP_NORMALIZE_LEADING_ZEROS_MULTIPLE,\n\t\t\t\"В pipeline может быть только один шаг normalizeLeadingZeros.\"\n\t\t);\n\t}\n\n\tif (counters.rowBasedOverride > 1) {\n\t\tpushError(state, PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_MULTIPLE, \"В pipeline может быть только один шаг rowBasedOverride.\");\n\t}\n\n\tif (counters.resolveValueState > 1) {\n\t\tpushError(state, PIPELINE_VALIDATION_STEP_RESOLVE_VALUE_STATE_MULTIPLE, \"В pipeline может быть только один шаг resolveValueState.\");\n\t}\n\n\tif (counters.typedValueFormat > 1) {\n\t\tpushError(state, PIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_MULTIPLE, \"В pipeline может быть только один шаг typedValueFormat.\");\n\t}\n\n\tconst resolveIndex = steps.findIndex((step) => step.type === PIPELINE_FORMATTER_RESOLVE_VALUE_STATE);\n\tconst typedIndex = steps.findIndex((step) => step.type === PIPELINE_FORMATTER_TYPED_VALUE_FORMAT);\n\tif (resolveIndex !== -1 && typedIndex !== -1 && typedIndex < resolveIndex) {\n\t\tpushError(\n\t\t\tstate,\n\t\t\tPIPELINE_VALIDATION_STEP_TYPED_BEFORE_VALUE_STATE,\n\t\t\t\"Шаг typedValueFormat не может выполняться до шага resolveValueState.\"\n\t\t);\n\t}\n\n\tfor (const step of steps) {\n\t\tif (step.type !== PIPELINE_FORMATTER_RESOLVE_VALUE_STATE) continue;\n\t\tif (!step.config.icon?.enabled && step.config.icon?.showValue === false) {\n\t\t\tpushWarning(\n\t\t\t\tstate,\n\t\t\t\tPIPELINE_VALIDATION_STEP_VALUE_HIDDEN_WITHOUT_ICON,\n\t\t\t\t\"Для resolveValueState установлено showValue=false при выключенной иконке: значение не будет отображаться.\"\n\t\t\t);\n\t\t}\n\t}\n}\n\n/**\n * Валидация облегчённого плана pipeline.\n */\nexport function validateFormattersPipelinePlan(plan: FormattersPipelinePlan): FormattersPipelineValidationResult {\n\tconst state: MutableValidationState = { errors: [], warnings: [] };\n\n\tvalidateStepDefinitions(plan.steps, state);\n\n\treturn {\n\t\tok: state.errors.length === 0,\n\t\terrors: state.errors,\n\t\twarnings: state.warnings,\n\t\tplan: state.errors.length === 0 ? { steps: [...plan.steps] } : undefined\n\t};\n}\n\nfunction buildLinearPathFromGraph(\n\tnodes: readonly FormattersPipelineNode[],\n\tedges: readonly FormattersPipelineEdge[],\n\tstate: MutableValidationState\n): string[] | undefined {\n\tconst nodeById = new Map(nodes.map((node) => [node.id, node]));\n\tconst outgoing = new Map<string, string[]>();\n\tconst incoming = new Map<string, string[]>();\n\n\tfor (const node of nodes) {\n\t\toutgoing.set(node.id, []);\n\t\tincoming.set(node.id, []);\n\t}\n\n\tfor (const edge of edges) {\n\t\tconst source = edge.source.trim();\n\t\tconst target = edge.target.trim();\n\t\tif (!nodeById.has(source) || !nodeById.has(target)) {\n\t\t\tpushError(\n\t\t\t\tstate,\n\t\t\t\tPIPELINE_VALIDATION_EDGE_NODE_NOT_FOUND,\n\t\t\t\t`Ребро ${edge.id} ссылается на несуществующий узел: ${source} -> ${target}.`\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\n\t\toutgoing.get(source)?.push(target);\n\t\tincoming.get(target)?.push(source);\n\t}\n\n\tconst sources = nodes.filter((node) => node.type === PIPELINE_NODE_SOURCE);\n\tconst sinks = nodes.filter((node) => node.type === PIPELINE_NODE_SINK);\n\n\tif (sources.length !== 1) {\n\t\tpushError(state, PIPELINE_VALIDATION_SOURCE_COUNT_INVALID, \"В графе должен быть ровно один узел source.\");\n\t}\n\tif (sinks.length !== 1) {\n\t\tpushError(state, PIPELINE_VALIDATION_SINK_COUNT_INVALID, \"В графе должен быть ровно один узел sink.\");\n\t}\n\tif (state.errors.length > 0) return undefined;\n\n\tconst sourceNodeId = sources[0]!.id;\n\tconst sinkNodeId = sinks[0]!.id;\n\n\tfor (const node of nodes) {\n\t\tconst inDegree = incoming.get(node.id)?.length ?? 0;\n\t\tconst outDegree = outgoing.get(node.id)?.length ?? 0;\n\n\t\tif (node.type === PIPELINE_NODE_SOURCE) {\n\t\t\tif (inDegree !== 0) {\n\t\t\t\tpushError(state, PIPELINE_VALIDATION_SOURCE_INCOMING_INVALID, \"Узел source не должен иметь входящих рёбер.\");\n\t\t\t}\n\t\t\tif (outDegree !== 1) {\n\t\t\t\tpushError(state, PIPELINE_VALIDATION_NODE_DEGREE_INVALID, \"Узел source должен иметь ровно одно исходящее ребро.\");\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (node.type === PIPELINE_NODE_SINK) {\n\t\t\tif (outDegree !== 0) {\n\t\t\t\tpushError(state, PIPELINE_VALIDATION_SINK_OUTGOING_INVALID, \"Узел sink не должен иметь исходящих рёбер.\");\n\t\t\t}\n\t\t\tif (inDegree !== 1) {\n\t\t\t\tpushError(state, PIPELINE_VALIDATION_NODE_DEGREE_INVALID, \"Узел sink должен иметь ровно одно входящее ребро.\");\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (inDegree !== 1 || outDegree !== 1) {\n\t\t\tpushError(\n\t\t\t\tstate,\n\t\t\t\tPIPELINE_VALIDATION_NODE_DEGREE_INVALID,\n\t\t\t\t`Узел ${node.id} должен иметь ровно одно входящее и одно исходящее ребро для линейного pipeline.`\n\t\t\t);\n\t\t}\n\t}\n\n\tif (state.errors.length > 0) return undefined;\n\n\tconst visited = new Set<string>();\n\tconst path: string[] = [];\n\tlet cursor = sourceNodeId;\n\n\twhile (true) {\n\t\tif (visited.has(cursor)) {\n\t\t\tpushError(state, PIPELINE_VALIDATION_PATH_CYCLE_DETECTED, \"В графе pipeline обнаружен цикл.\");\n\t\t\treturn undefined;\n\t\t}\n\t\tvisited.add(cursor);\n\t\tpath.push(cursor);\n\n\t\tif (cursor === sinkNodeId) {\n\t\t\tbreak;\n\t\t}\n\n\t\tconst nextCandidates = outgoing.get(cursor) ?? [];\n\t\tif (nextCandidates.length !== 1) {\n\t\t\tpushError(state, PIPELINE_VALIDATION_PATH_BROKEN, \"Не удалось построить линейный путь от source к sink.\");\n\t\t\treturn undefined;\n\t\t}\n\n\t\tcursor = nextCandidates[0]!;\n\t}\n\n\tif (visited.size !== nodes.length) {\n\t\tpushError(\n\t\t\tstate,\n\t\t\tPIPELINE_VALIDATION_PATH_DISCONNECTED_NODES,\n\t\t\t\"Граф содержит узлы, которые не входят в линейный путь source -> sink.\"\n\t\t);\n\t\treturn undefined;\n\t}\n\n\treturn path;\n}\n\n/**\n * Валидация графа pipeline и построение линейного плана исполнения.\n */\nexport function validateFormattersPipelineGraph(graph: FormattersPipelineGraph): FormattersPipelineValidationResult {\n\tconst state: MutableValidationState = { errors: [], warnings: [] };\n\n\tif (!graph.nodes.length) {\n\t\tpushError(state, PIPELINE_VALIDATION_PATH_BROKEN, \"Граф pipeline не содержит узлов.\");\n\t\treturn { ok: false, errors: state.errors, warnings: state.warnings };\n\t}\n\n\tconst nodeById = new Map<string, FormattersPipelineNode>();\n\tfor (const node of graph.nodes) {\n\t\tconst normalizedId = node.id.trim();\n\t\tif (!normalizedId) {\n\t\t\tpushError(state, PIPELINE_VALIDATION_NODE_ID_DUPLICATE, \"Узел pipeline не может иметь пустой id.\");\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (nodeById.has(normalizedId)) {\n\t\t\tpushError(state, PIPELINE_VALIDATION_NODE_ID_DUPLICATE, `Найден дублирующийся id узла pipeline: ${normalizedId}.`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tnodeById.set(normalizedId, node);\n\t}\n\n\tconst edgeIdSet = new Set<string>();\n\tfor (const edge of graph.edges) {\n\t\tconst normalizedEdgeId = edge.id.trim();\n\t\tif (!normalizedEdgeId) {\n\t\t\tpushError(state, PIPELINE_VALIDATION_EDGE_ID_DUPLICATE, \"Ребро pipeline не может иметь пустой id.\");\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (edgeIdSet.has(normalizedEdgeId)) {\n\t\t\tpushError(state, PIPELINE_VALIDATION_EDGE_ID_DUPLICATE, `Найден дублирующийся id ребра pipeline: ${normalizedEdgeId}.`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tedgeIdSet.add(normalizedEdgeId);\n\t}\n\n\tif (state.errors.length > 0) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\terrors: state.errors,\n\t\t\twarnings: state.warnings\n\t\t};\n\t}\n\n\tconst path = buildLinearPathFromGraph(graph.nodes, graph.edges, state);\n\tif (!path) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\terrors: state.errors,\n\t\t\twarnings: state.warnings\n\t\t};\n\t}\n\n\tconst steps: FormattersPipelineStep[] = [];\n\tfor (const nodeId of path) {\n\t\tconst node = nodeById.get(nodeId);\n\t\tif (!node || node.type === PIPELINE_NODE_SOURCE || node.type === PIPELINE_NODE_SINK) continue;\n\n\t\tswitch (node.type) {\n\t\t\tcase PIPELINE_FORMATTER_NORMALIZE_LEADING_ZEROS:\n\t\t\t\tsteps.push({\n\t\t\t\t\tid: node.id,\n\t\t\t\t\ttype: PIPELINE_FORMATTER_NORMALIZE_LEADING_ZEROS,\n\t\t\t\t\tconfig: node.config ? { ...node.config } : undefined\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase PIPELINE_FORMATTER_ROW_BASED_OVERRIDE:\n\t\t\t\tsteps.push({\n\t\t\t\t\tid: node.id,\n\t\t\t\t\ttype: PIPELINE_FORMATTER_ROW_BASED_OVERRIDE,\n\t\t\t\t\tconfig:\n\t\t\t\t\t\tnode.config.mode === PIPELINE_OVERRIDE_MODE_FORMULA\n\t\t\t\t\t\t\t? { ...node.config, dependencyIds: node.config.dependencyIds ? [...node.config.dependencyIds] : undefined }\n\t\t\t\t\t\t\t: { ...node.config }\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase PIPELINE_FORMATTER_RESOLVE_VALUE_STATE:\n\t\t\t\tsteps.push({\n\t\t\t\t\tid: node.id,\n\t\t\t\t\ttype: PIPELINE_FORMATTER_RESOLVE_VALUE_STATE,\n\t\t\t\t\tconfig: cloneResolveValueStateConfig(node.config)\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase PIPELINE_FORMATTER_TYPED_VALUE_FORMAT:\n\t\t\t\tsteps.push({\n\t\t\t\t\tid: node.id,\n\t\t\t\t\ttype: PIPELINE_FORMATTER_TYPED_VALUE_FORMAT,\n\t\t\t\t\tconfig: node.config ? { ...node.config } : undefined\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tvalidateStepDefinitions(steps, state);\n\n\treturn {\n\t\tok: state.errors.length === 0,\n\t\terrors: state.errors,\n\t\twarnings: state.warnings,\n\t\tplan: state.errors.length === 0 ? { steps } : undefined\n\t};\n}\n\n/**\n * Валидация конфигурации pipeline c выбором рабочего плана исполнения.\n *\n * Приоритет источника плана:\n * 1) `plan` из конфигурации;\n * 2) построение плана из `graph`.\n */\nexport function validateFormattersPipelineConfig(config: FormattersPipelineConfig | undefined): FormattersPipelineValidationResult {\n\tconst state: MutableValidationState = { errors: [], warnings: [] };\n\n\tif (!config) {\n\t\tpushError(state, PIPELINE_VALIDATION_CONFIG_NOT_DEFINED, \"Конфигурация pipeline не задана.\");\n\t\treturn {\n\t\t\tok: false,\n\t\t\terrors: state.errors,\n\t\t\twarnings: state.warnings\n\t\t};\n\t}\n\n\tif (config.version !== FORMATTERS_PIPELINE_VERSION) {\n\t\tpushError(state, PIPELINE_VALIDATION_UNSUPPORTED_VERSION, `Неподдерживаемая версия pipeline: ${String(config.version)}.`);\n\t\treturn {\n\t\t\tok: false,\n\t\t\terrors: state.errors,\n\t\t\twarnings: state.warnings\n\t\t};\n\t}\n\n\tif (!config.plan && !config.graph) {\n\t\tpushError(\n\t\t\tstate,\n\t\t\tPIPELINE_VALIDATION_GRAPH_OR_PLAN_REQUIRED,\n\t\t\t\"Для pipeline должен быть задан хотя бы один источник: graph или plan.\"\n\t\t);\n\t\treturn {\n\t\t\tok: false,\n\t\t\terrors: state.errors,\n\t\t\twarnings: state.warnings\n\t\t};\n\t}\n\n\tif (config.plan) {\n\t\tconst planResult = validateFormattersPipelinePlan(config.plan);\n\t\tstate.errors.push(...planResult.errors);\n\t\tstate.warnings.push(...planResult.warnings);\n\n\t\tif (planResult.ok && planResult.plan) {\n\t\t\treturn {\n\t\t\t\tok: true,\n\t\t\t\terrors: state.errors,\n\t\t\t\twarnings: state.warnings,\n\t\t\t\tplan: planResult.plan\n\t\t\t};\n\t\t}\n\n\t\tif (config.graph) {\n\t\t\tpushWarning(state, PIPELINE_VALIDATION_PATH_BROKEN, \"Линейный plan невалиден. Выполнена попытка построить план из graph.\");\n\t\t\tstate.errors.length = 0;\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terrors: state.errors,\n\t\t\t\twarnings: state.warnings\n\t\t\t};\n\t\t}\n\t}\n\n\tif (config.graph) {\n\t\tconst graphResult = validateFormattersPipelineGraph(config.graph);\n\t\treturn {\n\t\t\tok: graphResult.ok,\n\t\t\terrors: [...state.errors, ...graphResult.errors],\n\t\t\twarnings: [...state.warnings, ...graphResult.warnings],\n\t\t\tplan: graphResult.plan\n\t\t};\n\t}\n\n\treturn {\n\t\tok: false,\n\t\terrors: state.errors,\n\t\twarnings: state.warnings\n\t};\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"validate-rivmPJyV.js","names":[],"sources":["../../src/formatters/number/numberFormatConstants.ts","../../src/formatters/number/numberPresetNameConstants.ts","../../src/formatters/number/presets.ts","../../src/formatters/valueState/valueStateResolverConstants.ts","../../src/formatters/pipeline/formattersPipelineConstants.ts","../../src/formatters/pipeline/clone.ts","../../src/formatters/rowBased/context.ts","../../src/formatters/rowBased/registry.ts","../../src/formatters/pipeline/pipelineValidationConstants.ts","../../src/formatters/pipeline/validate.ts"],"sourcesContent":["/** Режимы compact и поля Intl имеют один источник значений для форматтеров, пресетов и типов. */\nexport const COMPACT_ROUNDING_MODE_ROUND = \"round\";\nexport const COMPACT_ROUNDING_MODE_FLOOR = \"floor\";\nexport const COMPACT_ROUNDING_MODE_CEIL = \"ceil\";\nexport const COMPACT_ROUNDING_MODE_TRUNC = \"trunc\";\nexport const NUMBER_FORMAT_LOCALE = \"ru-RU\";\nexport const INTL_NUMBER_PART_GROUP = \"group\";\nexport const INTL_NUMBER_PART_DECIMAL = \"decimal\";\nexport const STANDARD_NUMBER_GROUP_SIZE = 3;\nexport const FORMATTED_NUMBER_ZERO = \"0\";\n","/** Имена встроенных пресетов разделяют внутренние обращения и сохраняемый публичный объект имён. */\nexport const NUMBER_PRESET_NAME_INTEGER = \"integer\";\nexport const NUMBER_PRESET_NAME_DECIMAL = \"decimal\";\nexport const NUMBER_PRESET_NAME_DECIMAL2 = \"decimal-2\";\nexport const NUMBER_PRESET_NAME_DECIMAL3 = \"decimal-3\";\nexport const NUMBER_PRESET_NAME_CURRENCY = \"currency\";\nexport const NUMBER_PRESET_NAME_PRICE = \"price\";\nexport const NUMBER_PRESET_NAME_PERCENT = \"percent\";\nexport const NUMBER_PRESET_NAME_TONNAGE = \"tonnage\";\nexport const NUMBER_PRESET_NAME_COMPACT_CURRENCY = \"compact-currency\";\nexport const NUMBER_PRESET_NAME_COMPACT_CURRENCY_ROUND = \"compact-currency-round\";\nexport const NUMBER_PRESET_NAME_COMPACT_PERCENT = \"compact-percent\";\nexport const NUMBER_PRESET_NAME_COMPACT_PERCENT_ROUND = \"compact-percent-round\";\nexport const NUMBER_PRESET_NAME_COMPACT_TONNAGE = \"compact-tonnage\";\nexport const NUMBER_PRESET_NAME_COMPACT_TONNAGE_ROUND = \"compact-tonnage-round\";\n","import {\n\tSTANDARD_NUMBER_GROUP_SIZE,\n\tNUMBER_FORMAT_LOCALE,\n\tINTL_NUMBER_PART_GROUP,\n\tCOMPACT_ROUNDING_MODE_ROUND\n} from \"./numberFormatConstants\";\nimport {\n\tNUMBER_PRESET_NAME_INTEGER,\n\tNUMBER_PRESET_NAME_DECIMAL,\n\tNUMBER_PRESET_NAME_DECIMAL2,\n\tNUMBER_PRESET_NAME_DECIMAL3,\n\tNUMBER_PRESET_NAME_CURRENCY,\n\tNUMBER_PRESET_NAME_PRICE,\n\tNUMBER_PRESET_NAME_PERCENT,\n\tNUMBER_PRESET_NAME_TONNAGE,\n\tNUMBER_PRESET_NAME_COMPACT_CURRENCY,\n\tNUMBER_PRESET_NAME_COMPACT_CURRENCY_ROUND,\n\tNUMBER_PRESET_NAME_COMPACT_PERCENT,\n\tNUMBER_PRESET_NAME_COMPACT_PERCENT_ROUND,\n\tNUMBER_PRESET_NAME_COMPACT_TONNAGE,\n\tNUMBER_PRESET_NAME_COMPACT_TONNAGE_ROUND\n} from \"./numberPresetNameConstants\";\n\nimport type { NumberFormatPreset, NumberFormatPresetConfig } from \"./types\";\n\n/** Четырёхзначная проба извлекает групповой разделитель выбранной локали. */\nconst GROUP_SEPARATOR_PROBE_VALUE = 1_000;\n\n/** Символ группировки из ru-RU (U+00A0 или U+202F в зависимости от среды) */\nconst ruGroupChar =\n\tnew Intl.NumberFormat(NUMBER_FORMAT_LOCALE).formatToParts(GROUP_SEPARATOR_PROBE_VALUE).find((p) => p.type === INTL_NUMBER_PART_GROUP)\n\t\t?.value ?? \"\\u00A0\";\n\n/** Значения по умолчанию — совпадают с ru-RU форматированием */\nexport const NUMBER_FORMAT_DEFAULTS: Omit<NumberFormatPreset, \"name\"> = {\n\tdecimals: 1,\n\tdecimalSeparator: \",\",\n\tgrouping: true,\n\tgroupingSeparator: ruGroupChar,\n\tgroupingSize: STANDARD_NUMBER_GROUP_SIZE\n};\n\nexport const DEFAULT_NUMBER_PRESET_NAMES = Object.freeze({\n\tinteger: NUMBER_PRESET_NAME_INTEGER,\n\tdecimal: NUMBER_PRESET_NAME_DECIMAL,\n\tdecimal2: NUMBER_PRESET_NAME_DECIMAL2,\n\tdecimal3: NUMBER_PRESET_NAME_DECIMAL3,\n\tcurrency: NUMBER_PRESET_NAME_CURRENCY,\n\tprice: NUMBER_PRESET_NAME_PRICE,\n\tpercent: NUMBER_PRESET_NAME_PERCENT,\n\ttonnage: NUMBER_PRESET_NAME_TONNAGE,\n\tcompactCurrency: NUMBER_PRESET_NAME_COMPACT_CURRENCY,\n\tcompactCurrencyRound: NUMBER_PRESET_NAME_COMPACT_CURRENCY_ROUND,\n\tcompactPercent: NUMBER_PRESET_NAME_COMPACT_PERCENT,\n\tcompactPercentRound: NUMBER_PRESET_NAME_COMPACT_PERCENT_ROUND,\n\tcompactTonnage: NUMBER_PRESET_NAME_COMPACT_TONNAGE,\n\tcompactTonnageRound: NUMBER_PRESET_NAME_COMPACT_TONNAGE_ROUND\n});\n\n/**\n * Типовые предустановки числового форматирования.\n *\n * Compact-пресеты без суффикса сохраняют консервативное усечение, а парные\n * `*-round` дают явный математический режим без runtime-переопределения пресета.\n * Недостающие поля каждой предустановки заполняются из `NUMBER_FORMAT_DEFAULTS`.\n */\nconst BUILTIN: NumberFormatPresetConfig[] = [\n\t{ name: NUMBER_PRESET_NAME_INTEGER, decimals: 0, decimalSeparator: \"\" },\n\t{ name: NUMBER_PRESET_NAME_DECIMAL },\n\t{ name: NUMBER_PRESET_NAME_DECIMAL2, decimals: 2 },\n\t{ name: NUMBER_PRESET_NAME_DECIMAL3, decimals: 3 },\n\t{ name: NUMBER_PRESET_NAME_CURRENCY, decimals: 0, decimalSeparator: \"\" },\n\t{ name: NUMBER_PRESET_NAME_PRICE, decimals: 0, decimalSeparator: \"\" },\n\t{ name: NUMBER_PRESET_NAME_PERCENT, decimals: 2 },\n\t{ name: NUMBER_PRESET_NAME_TONNAGE },\n\t{ name: NUMBER_PRESET_NAME_COMPACT_CURRENCY, decimals: 0, decimalSeparator: \"\", compact: {} },\n\t{\n\t\tname: NUMBER_PRESET_NAME_COMPACT_CURRENCY_ROUND,\n\t\tdecimals: 0,\n\t\tdecimalSeparator: \"\",\n\t\tcompact: { roundingMode: COMPACT_ROUNDING_MODE_ROUND }\n\t},\n\t{ name: NUMBER_PRESET_NAME_COMPACT_PERCENT, decimals: 2, compact: { maxDecimals: 2 } },\n\t{\n\t\tname: NUMBER_PRESET_NAME_COMPACT_PERCENT_ROUND,\n\t\tdecimals: 2,\n\t\tcompact: { maxDecimals: 2, roundingMode: COMPACT_ROUNDING_MODE_ROUND }\n\t},\n\t{ name: NUMBER_PRESET_NAME_COMPACT_TONNAGE, compact: { maxDecimals: 1 } },\n\t{ name: NUMBER_PRESET_NAME_COMPACT_TONNAGE_ROUND, compact: { maxDecimals: 1, roundingMode: COMPACT_ROUNDING_MODE_ROUND } }\n];\n\nconst registry = new Map<string, NumberFormatPreset>();\n\nfunction init(): void {\n\tfor (const cfg of BUILTIN) {\n\t\tregistry.set(cfg.name, { ...NUMBER_FORMAT_DEFAULTS, ...cfg });\n\t}\n}\n\ninit();\n\nexport function getNumberPreset(name: string): NumberFormatPreset | undefined {\n\treturn registry.get(name);\n}\n\nexport function getNumberPresetNames(): string[] {\n\treturn Array.from(registry.keys());\n}\n\n/** Зарегистрировать или перезаписать предустановку. Недостающие поля берутся из FORMAT_DEFAULTS. */\nexport function registerNumberPreset(config: NumberFormatPresetConfig): NumberFormatPreset {\n\tconst preset: NumberFormatPreset = { ...NUMBER_FORMAT_DEFAULTS, ...config };\n\tregistry.set(preset.name, preset);\n\treturn preset;\n}\n\n/** Сбросить реестр к начальному состоянию (только типовые предустановки) */\nexport function resetNumberPresets(): void {\n\tregistry.clear();\n\tinit();\n}\n\nexport function resolveNumberPreset(presetOrName: string | NumberFormatPreset): NumberFormatPreset {\n\tif (typeof presetOrName !== \"string\") return presetOrName;\n\n\tconst found = getNumberPreset(presetOrName);\n\tif (!found) throw new Error(`Предустановка \"${presetOrName}\" не найдена`);\n\n\treturn found;\n}\n","/** Виды резолверов и правила включения порога связывают runtime-конфигурацию с её литеральными типами. */\nexport const VALUE_STATE_RESOLVER_KIND_FIXED = \"fixed\";\nexport const VALUE_STATE_RESOLVER_KIND_THRESHOLD = \"threshold\";\nexport const THRESHOLD_BOUNDARY_LOWER = \"lower\";\nexport const THRESHOLD_BOUNDARY_UPPER = \"upper\";\n","/** Устойчивые значения сериализуемого pipeline общие для проверки, графа, плана и runtime. */\nexport const PIPELINE_FORMATTER_NORMALIZE_LEADING_ZEROS = \"normalizeLeadingZeros\";\nexport const PIPELINE_FORMATTER_ROW_BASED_OVERRIDE = \"rowBasedOverride\";\nexport const PIPELINE_FORMATTER_RESOLVE_VALUE_STATE = \"resolveValueState\";\nexport const PIPELINE_FORMATTER_TYPED_VALUE_FORMAT = \"typedValueFormat\";\nexport const PIPELINE_NODE_SOURCE = \"source\";\nexport const PIPELINE_NODE_SINK = \"sink\";\nexport const PIPELINE_OVERRIDE_MODE_FIELD = \"field\";\nexport const PIPELINE_OVERRIDE_MODE_FORMULA = \"formula\";\nexport const PIPELINE_STATE_SOURCE_VALUE = \"value\";\nexport const PIPELINE_ICON_POSITION_LEFT = \"left\";\nexport const PIPELINE_ICON_POSITION_RIGHT = \"right\";\nexport const PIPELINE_ROW_KIND_PLAIN = \"plain\";\nexport const PIPELINE_ROW_KIND_TREE = \"tree\";\nexport const PIPELINE_ROW_KIND_GROUP = \"group\";\nexport const PIPELINE_ROW_KIND_TOTALS = \"totals\";\nexport const PIPELINE_STATE_SOURCE_FORMULA = \"formula\";\nexport const FORMATTERS_PIPELINE_VERSION = 1;\n","import { VALUE_STATE_RESOLVER_KIND_FIXED, VALUE_STATE_RESOLVER_KIND_THRESHOLD } from \"../valueState/valueStateResolverConstants\";\n\nimport {\n\tPIPELINE_OVERRIDE_MODE_FORMULA,\n\tPIPELINE_FORMATTER_TYPED_VALUE_FORMAT,\n\tPIPELINE_FORMATTER_NORMALIZE_LEADING_ZEROS,\n\tPIPELINE_FORMATTER_ROW_BASED_OVERRIDE,\n\tPIPELINE_FORMATTER_RESOLVE_VALUE_STATE,\n\tPIPELINE_NODE_SOURCE,\n\tPIPELINE_NODE_SINK,\n\tPIPELINE_STATE_SOURCE_FORMULA\n} from \"./formattersPipelineConstants\";\n\nimport type {\n\tFormattersPipelineConfig,\n\tFormattersPipelineGraph,\n\tFormattersPipelineNode,\n\tFormattersPipelineNormalizeLeadingZerosConfig,\n\tFormattersPipelinePlan,\n\tFormattersPipelineResolveValueStateConfig,\n\tFormattersPipelineRowBasedOverrideConfig,\n\tFormattersPipelineStep,\n\tFormattersPipelineTypedValueFormatConfig\n} from \"./types\";\n\nexport function cloneTypedValueFormatConfig(\n\tconfig: FormattersPipelineTypedValueFormatConfig | undefined\n): FormattersPipelineTypedValueFormatConfig | undefined {\n\treturn config ? { ...config } : undefined;\n}\n\nexport function cloneNormalizeLeadingZerosConfig(\n\tconfig: FormattersPipelineNormalizeLeadingZerosConfig | undefined\n): FormattersPipelineNormalizeLeadingZerosConfig | undefined {\n\treturn config ? { ...config } : undefined;\n}\n\nexport function cloneRowBasedOverrideConfig(config: FormattersPipelineRowBasedOverrideConfig): FormattersPipelineRowBasedOverrideConfig {\n\treturn config.mode === PIPELINE_OVERRIDE_MODE_FORMULA\n\t\t? { ...config, dependencyIds: config.dependencyIds ? [...config.dependencyIds] : undefined }\n\t\t: { ...config };\n}\n\nexport function cloneResolveValueStateConfig(config: FormattersPipelineResolveValueStateConfig): FormattersPipelineResolveValueStateConfig {\n\treturn {\n\t\tresolver:\n\t\t\tconfig.resolver.kind === VALUE_STATE_RESOLVER_KIND_FIXED\n\t\t\t\t? {\n\t\t\t\t\t\tkind: VALUE_STATE_RESOLVER_KIND_FIXED,\n\t\t\t\t\t\tentries: { ...config.resolver.entries },\n\t\t\t\t\t\tfallbackState: config.resolver.fallbackState\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tkind: VALUE_STATE_RESOLVER_KIND_THRESHOLD,\n\t\t\t\t\t\tthresholds: config.resolver.thresholds.map((item) => (typeof item === \"number\" ? item : { ...item })),\n\t\t\t\t\t\tstates: [...config.resolver.states],\n\t\t\t\t\t\tinvalidState: config.resolver.invalidState\n\t\t\t\t\t},\n\t\tvalueSource:\n\t\t\tconfig.valueSource?.kind === PIPELINE_STATE_SOURCE_FORMULA\n\t\t\t\t? { ...config.valueSource, dependencyIds: [...config.valueSource.dependencyIds] }\n\t\t\t\t: config.valueSource\n\t\t\t\t\t? { ...config.valueSource }\n\t\t\t\t\t: undefined,\n\t\ticon: config.icon ? { ...config.icon } : undefined\n\t};\n}\n\nexport function cloneFormatterPipelinePlanStep(step: FormattersPipelineStep): FormattersPipelineStep {\n\tswitch (step.type) {\n\t\tcase PIPELINE_FORMATTER_TYPED_VALUE_FORMAT:\n\t\t\treturn {\n\t\t\t\t...step,\n\t\t\t\tconfig: cloneTypedValueFormatConfig(step.config)\n\t\t\t};\n\t\tcase PIPELINE_FORMATTER_NORMALIZE_LEADING_ZEROS:\n\t\t\treturn {\n\t\t\t\t...step,\n\t\t\t\tconfig: cloneNormalizeLeadingZerosConfig(step.config)\n\t\t\t};\n\t\tcase PIPELINE_FORMATTER_ROW_BASED_OVERRIDE:\n\t\t\treturn {\n\t\t\t\t...step,\n\t\t\t\tconfig: cloneRowBasedOverrideConfig(step.config)\n\t\t\t};\n\t\tcase PIPELINE_FORMATTER_RESOLVE_VALUE_STATE:\n\t\t\treturn {\n\t\t\t\t...step,\n\t\t\t\tconfig: cloneResolveValueStateConfig(step.config)\n\t\t\t};\n\t\tdefault: {\n\t\t\tconst checker: never = step;\n\t\t\tvoid checker;\n\t\t}\n\t}\n\n\tthrow new Error(`Недопустимый тип '${(step as Record<string, unknown>)?.type}' для шага FormatterPipeline`);\n}\n\nexport function cloneFormatterPipelinePlanStepToNode(\n\tstep: FormattersPipelineStep,\n\tposition: { x: number; y: number }\n): FormattersPipelineNode {\n\tswitch (step.type) {\n\t\tcase PIPELINE_FORMATTER_TYPED_VALUE_FORMAT:\n\t\t\treturn {\n\t\t\t\t...step,\n\t\t\t\tposition: { ...position },\n\t\t\t\tconfig: cloneTypedValueFormatConfig(step.config)\n\t\t\t};\n\t\tcase PIPELINE_FORMATTER_NORMALIZE_LEADING_ZEROS:\n\t\t\treturn {\n\t\t\t\t...step,\n\t\t\t\tposition: { ...position },\n\t\t\t\tconfig: cloneNormalizeLeadingZerosConfig(step.config)\n\t\t\t};\n\t\tcase PIPELINE_FORMATTER_ROW_BASED_OVERRIDE:\n\t\t\treturn {\n\t\t\t\t...step,\n\t\t\t\tposition: { ...position },\n\t\t\t\tconfig: cloneRowBasedOverrideConfig(step.config)\n\t\t\t};\n\t\tcase PIPELINE_FORMATTER_RESOLVE_VALUE_STATE:\n\t\t\treturn {\n\t\t\t\t...step,\n\t\t\t\tposition: { ...position },\n\t\t\t\tconfig: cloneResolveValueStateConfig(step.config)\n\t\t\t};\n\t\tdefault: {\n\t\t\tconst checker: never = step;\n\t\t\tvoid checker;\n\t\t}\n\t}\n\n\tthrow new Error(`Недопустимый тип '${(step as Record<string, unknown>)?.type}' для шага FormatterPipeline`);\n}\n\nfunction cloneNode(node: FormattersPipelineNode): FormattersPipelineNode {\n\tswitch (node.type) {\n\t\tcase PIPELINE_NODE_SOURCE:\n\t\tcase PIPELINE_NODE_SINK:\n\t\t\treturn {\n\t\t\t\t...node,\n\t\t\t\tposition: { ...node.position }\n\t\t\t};\n\t\tdefault:\n\t\t\treturn cloneFormatterPipelinePlanStepToNode(node, node.position);\n\t}\n}\n\nfunction cloneGraph(graph: FormattersPipelineGraph): FormattersPipelineGraph {\n\treturn {\n\t\tnodes: graph.nodes.map(cloneNode),\n\t\tedges: graph.edges.map((edge) => ({ ...edge })),\n\t\tviewport: graph.viewport ? { ...graph.viewport } : undefined\n\t};\n}\n\nfunction clonePlan(plan: FormattersPipelinePlan): FormattersPipelinePlan {\n\treturn {\n\t\tsteps: plan.steps.map(cloneFormatterPipelinePlanStep)\n\t};\n}\n\n/**\n * Возвращает полную копию конфигурации pipeline для безопасного хранения в сторе.\n */\nexport function cloneFormattersPipelineConfig(config: FormattersPipelineConfig | undefined): FormattersPipelineConfig | undefined {\n\tif (!config) return undefined;\n\n\tconst version = config.version;\n\tconst graph = config.graph ? cloneGraph(config.graph) : undefined;\n\tconst plan = config.plan ? clonePlan(config.plan) : undefined;\n\n\treturn { version, graph, plan };\n}\n","import { parseNumber } from \"../number\";\n\nimport type { RowBasedFormatterContext, RowBasedFormatterContextInstrumentation } from \"./types\";\n\nexport function createRowBasedFormatterContext(args: {\n\trowData: Record<string, unknown>;\n\trawValue: unknown;\n\tcolumnId: string;\n\tkeys?: readonly string[];\n\tinstrumentation?: RowBasedFormatterContextInstrumentation;\n}): RowBasedFormatterContext {\n\t// TODO: duplicate createTableFormulaContext src\\shared\\lib\\formulas\\execute.ts\n\tconst keys = [...(args.keys ?? [])];\n\n\tconst readKey = (index: number): string | 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 key = readKey(index);\n\t\tif (!key) return undefined;\n\t\treturn args.rowData[key];\n\t};\n\n\tconst readNum = (index: number): number => {\n\t\tconst key = readKey(index);\n\t\tif (!key) return 0;\n\t\treturn parseNumber(args.rowData[key]);\n\t};\n\n\treturn {\n\t\trowData: args.rowData,\n\t\trawValue: args.rawValue,\n\t\tcolumnId: args.columnId,\n\t\tkey: readKey,\n\t\tvalue: readValue,\n\t\tnum: readNum\n\t};\n}\n","import type { RowBasedFormatterDefinition } from \"./types\";\n\nexport type RowBasedFormatterRegistry = Readonly<{\n\tlist: readonly RowBasedFormatterDefinition[];\n\tbyId: ReadonlyMap<string, RowBasedFormatterDefinition>;\n}>;\n\n/**\n * Создаёт реестр формул для подмены значения в групповой строке.\n */\nexport function createRowBasedFormatterRegistry(definitions: readonly RowBasedFormatterDefinition[]): RowBasedFormatterRegistry {\n\tconst byId = new Map<string, RowBasedFormatterDefinition>();\n\tconst list: RowBasedFormatterDefinition[] = [];\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 для RowBasedFormatter не может быть пустым\");\n\t\t}\n\n\t\tif (byId.has(normalizedId)) {\n\t\t\tthrow new Error(`Найден дублирующийся formulaId в RowBasedFormatter: ${normalizedId}`);\n\t\t}\n\n\t\tconst normalizedDefinition: RowBasedFormatterDefinition = 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});\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 rowBasedFormatterRegistry = createRowBasedFormatterRegistry([]);\n\n/**\n * Устанавливает реестр row-based форматтеров host-приложения.\n *\n * Pipeline использует этот реестр при валидации и компиляции formula-режима,\n * поэтому конфигурация должна завершиться до первого построения runtime.\n */\nexport function configureRowBasedFormatterRegistry(registry: RowBasedFormatterRegistry): void {\n\trowBasedFormatterRegistry = registry;\n}\n\n/**\n * Возвращает список доступных формул для групповой подмены.\n */\nexport function getRowBasedFormatterList(): readonly RowBasedFormatterDefinition[] {\n\treturn rowBasedFormatterRegistry.list;\n}\n\n/**\n * Возвращает формулу по id.\n */\nexport function getRowBasedFormatterById(formulaId: string | undefined): RowBasedFormatterDefinition | undefined {\n\tconst normalizedId = formulaId?.trim();\n\tif (!normalizedId) return undefined;\n\treturn rowBasedFormatterRegistry.byId.get(normalizedId);\n}\n","/** Коды диагностики сохраняют единый источник для сообщений валидации и их runtime-потребителей. */\nexport const PIPELINE_VALIDATION_CONFIG_NOT_DEFINED = \"config_not_defined\";\nexport const PIPELINE_VALIDATION_UNSUPPORTED_VERSION = \"unsupported_version\";\nexport const PIPELINE_VALIDATION_GRAPH_OR_PLAN_REQUIRED = \"graph_or_plan_required\";\nexport const PIPELINE_VALIDATION_NODE_ID_DUPLICATE = \"node_id_duplicate\";\nexport const PIPELINE_VALIDATION_EDGE_ID_DUPLICATE = \"edge_id_duplicate\";\nexport const PIPELINE_VALIDATION_EDGE_NODE_NOT_FOUND = \"edge_node_not_found\";\nexport const PIPELINE_VALIDATION_SOURCE_COUNT_INVALID = \"source_count_invalid\";\nexport const PIPELINE_VALIDATION_SINK_COUNT_INVALID = \"sink_count_invalid\";\nexport const PIPELINE_VALIDATION_SOURCE_INCOMING_INVALID = \"source_incoming_invalid\";\nexport const PIPELINE_VALIDATION_SINK_OUTGOING_INVALID = \"sink_outgoing_invalid\";\nexport const PIPELINE_VALIDATION_NODE_DEGREE_INVALID = \"node_degree_invalid\";\nexport const PIPELINE_VALIDATION_PATH_BROKEN = \"path_broken\";\nexport const PIPELINE_VALIDATION_PATH_CYCLE_DETECTED = \"path_cycle_detected\";\nexport const PIPELINE_VALIDATION_PATH_DISCONNECTED_NODES = \"path_disconnected_nodes\";\nexport const PIPELINE_VALIDATION_STEP_ID_DUPLICATE = \"step_id_duplicate\";\nexport const PIPELINE_VALIDATION_STEP_RESOLVE_VALUE_STATE_MULTIPLE = \"step_resolve_value_state_multiple\";\nexport const PIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_MULTIPLE = \"step_typed_value_format_multiple\";\nexport const PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_MULTIPLE = \"step_row_based_override_multiple\";\nexport const PIPELINE_VALIDATION_STEP_NORMALIZE_LEADING_ZEROS_MULTIPLE = \"step_normalize_leading_zeros_multiple\";\nexport const PIPELINE_VALIDATION_STEP_TYPED_BEFORE_VALUE_STATE = \"step_typed_before_value_state\";\nexport const PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FIELD_KEY_EMPTY = \"step_row_based_override_field_key_empty\";\nexport const PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_ID_EMPTY = \"step_row_based_override_formula_id_empty\";\nexport const PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_NOT_FOUND = \"step_row_based_override_formula_not_found\";\nexport const PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_DEPENDENCY_INDEX_OUT_OF_RANGE =\n\t\"step_row_based_override_dependency_index_out_of_range\";\nexport const PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_UNUSED_DEPENDENCIES = \"step_row_based_override_unused_dependencies\";\nexport const PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_DOES_NOT_USE_DEPENDENCIES =\n\t\"step_row_based_override_formula_does_not_use_dependencies\";\nexport const PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_RUNTIME_ERROR = \"step_row_based_override_formula_runtime_error\";\nexport const PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_ID_EMPTY = \"step_value_state_formula_id_empty\";\nexport const PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_NOT_FOUND = \"step_value_state_formula_not_found\";\nexport const PIPELINE_VALIDATION_STEP_VALUE_STATE_DEPENDENCY_ID_EMPTY = \"step_value_state_dependency_id_empty\";\nexport const PIPELINE_VALIDATION_STEP_VALUE_STATE_DEPENDENCY_INDEX_OUT_OF_RANGE = \"step_value_state_dependency_index_out_of_range\";\nexport const PIPELINE_VALIDATION_STEP_VALUE_STATE_UNUSED_DEPENDENCIES = \"step_value_state_unused_dependencies\";\nexport const PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_DOES_NOT_USE_DEPENDENCIES = \"step_value_state_formula_does_not_use_dependencies\";\nexport const PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_RUNTIME_ERROR = \"step_value_state_formula_runtime_error\";\nexport const PIPELINE_VALIDATION_STEP_THRESHOLD_STATES_COUNT_INVALID = \"step_threshold_states_count_invalid\";\nexport const PIPELINE_VALIDATION_STEP_VALUE_HIDDEN_WITHOUT_ICON = \"step_value_hidden_without_icon\";\nexport const PIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_PRESET_EMPTY = \"step_typed_value_format_preset_empty\";\nexport const PIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_PRESET_NOT_FOUND = \"step_typed_value_format_preset_not_found\";\n","import { validateTableFormulaDependencies } from \"../../formulas\";\nimport {\n\tTABLE_FORMULA_NOT_FOUND,\n\tTABLE_FORMULA_DEPENDENCY_INDEX_OUT_OF_RANGE,\n\tTABLE_FORMULA_UNUSED_DEPENDENCIES,\n\tTABLE_FORMULA_DOES_NOT_USE_DEPENDENCIES,\n\tTABLE_FORMULA_VALIDATION_RUNTIME_ERROR\n} from \"../../formulas/tableFormulaConstants\";\nimport { getNumberPreset } from \"../number\";\nimport { createRowBasedFormatterContext, getRowBasedFormatterById } from \"../rowBased\";\nimport { VALUE_STATE_RESOLVER_KIND_THRESHOLD } from \"../valueState/valueStateResolverConstants\";\n\nimport { cloneResolveValueStateConfig } from \"./clone\";\nimport {\n\tPIPELINE_FORMATTER_NORMALIZE_LEADING_ZEROS,\n\tPIPELINE_FORMATTER_ROW_BASED_OVERRIDE,\n\tPIPELINE_OVERRIDE_MODE_FIELD,\n\tPIPELINE_OVERRIDE_MODE_FORMULA,\n\tPIPELINE_FORMATTER_RESOLVE_VALUE_STATE,\n\tPIPELINE_FORMATTER_TYPED_VALUE_FORMAT,\n\tPIPELINE_NODE_SOURCE,\n\tPIPELINE_NODE_SINK,\n\tPIPELINE_STATE_SOURCE_FORMULA,\n\tFORMATTERS_PIPELINE_VERSION\n} from \"./formattersPipelineConstants\";\nimport {\n\tPIPELINE_VALIDATION_CONFIG_NOT_DEFINED,\n\tPIPELINE_VALIDATION_UNSUPPORTED_VERSION,\n\tPIPELINE_VALIDATION_GRAPH_OR_PLAN_REQUIRED,\n\tPIPELINE_VALIDATION_NODE_ID_DUPLICATE,\n\tPIPELINE_VALIDATION_EDGE_ID_DUPLICATE,\n\tPIPELINE_VALIDATION_EDGE_NODE_NOT_FOUND,\n\tPIPELINE_VALIDATION_SOURCE_COUNT_INVALID,\n\tPIPELINE_VALIDATION_SINK_COUNT_INVALID,\n\tPIPELINE_VALIDATION_SOURCE_INCOMING_INVALID,\n\tPIPELINE_VALIDATION_SINK_OUTGOING_INVALID,\n\tPIPELINE_VALIDATION_NODE_DEGREE_INVALID,\n\tPIPELINE_VALIDATION_PATH_BROKEN,\n\tPIPELINE_VALIDATION_PATH_CYCLE_DETECTED,\n\tPIPELINE_VALIDATION_PATH_DISCONNECTED_NODES,\n\tPIPELINE_VALIDATION_STEP_ID_DUPLICATE,\n\tPIPELINE_VALIDATION_STEP_RESOLVE_VALUE_STATE_MULTIPLE,\n\tPIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_MULTIPLE,\n\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_MULTIPLE,\n\tPIPELINE_VALIDATION_STEP_NORMALIZE_LEADING_ZEROS_MULTIPLE,\n\tPIPELINE_VALIDATION_STEP_TYPED_BEFORE_VALUE_STATE,\n\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FIELD_KEY_EMPTY,\n\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_ID_EMPTY,\n\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_NOT_FOUND,\n\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_DEPENDENCY_INDEX_OUT_OF_RANGE,\n\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_UNUSED_DEPENDENCIES,\n\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_DOES_NOT_USE_DEPENDENCIES,\n\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_RUNTIME_ERROR,\n\tPIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_ID_EMPTY,\n\tPIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_NOT_FOUND,\n\tPIPELINE_VALIDATION_STEP_VALUE_STATE_DEPENDENCY_ID_EMPTY,\n\tPIPELINE_VALIDATION_STEP_VALUE_STATE_DEPENDENCY_INDEX_OUT_OF_RANGE,\n\tPIPELINE_VALIDATION_STEP_VALUE_STATE_UNUSED_DEPENDENCIES,\n\tPIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_DOES_NOT_USE_DEPENDENCIES,\n\tPIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_RUNTIME_ERROR,\n\tPIPELINE_VALIDATION_STEP_THRESHOLD_STATES_COUNT_INVALID,\n\tPIPELINE_VALIDATION_STEP_VALUE_HIDDEN_WITHOUT_ICON,\n\tPIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_PRESET_EMPTY,\n\tPIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_PRESET_NOT_FOUND\n} from \"./pipelineValidationConstants\";\n\nimport type {\n\tFormattersPipelineConfig,\n\tFormattersPipelineEdge,\n\tFormattersPipelineGraph,\n\tFormattersPipelineNode,\n\tFormattersPipelinePlan,\n\tFormattersPipelineRowBasedOverrideFormulaConfig,\n\tFormattersPipelineStep,\n\tFormattersPipelineValueStateFormulaSource\n} from \"./types\";\n\n/** Положительная и отрицательная пробы выявляют обращения к зависимостям в разных ветках формулы. */\nconst FORMULA_VALIDATION_PROBE_VALUE = 100;\n\nexport type FormattersPipelineValidationCode =\n\t| typeof PIPELINE_VALIDATION_CONFIG_NOT_DEFINED\n\t| typeof PIPELINE_VALIDATION_UNSUPPORTED_VERSION\n\t| typeof PIPELINE_VALIDATION_GRAPH_OR_PLAN_REQUIRED\n\t| typeof PIPELINE_VALIDATION_NODE_ID_DUPLICATE\n\t| typeof PIPELINE_VALIDATION_EDGE_ID_DUPLICATE\n\t| typeof PIPELINE_VALIDATION_EDGE_NODE_NOT_FOUND\n\t| typeof PIPELINE_VALIDATION_SOURCE_COUNT_INVALID\n\t| typeof PIPELINE_VALIDATION_SINK_COUNT_INVALID\n\t| typeof PIPELINE_VALIDATION_SOURCE_INCOMING_INVALID\n\t| typeof PIPELINE_VALIDATION_SINK_OUTGOING_INVALID\n\t| typeof PIPELINE_VALIDATION_NODE_DEGREE_INVALID\n\t| typeof PIPELINE_VALIDATION_PATH_BROKEN\n\t| typeof PIPELINE_VALIDATION_PATH_CYCLE_DETECTED\n\t| typeof PIPELINE_VALIDATION_PATH_DISCONNECTED_NODES\n\t| typeof PIPELINE_VALIDATION_STEP_ID_DUPLICATE\n\t| typeof PIPELINE_VALIDATION_STEP_RESOLVE_VALUE_STATE_MULTIPLE\n\t| typeof PIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_MULTIPLE\n\t| typeof PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_MULTIPLE\n\t| typeof PIPELINE_VALIDATION_STEP_NORMALIZE_LEADING_ZEROS_MULTIPLE\n\t| typeof PIPELINE_VALIDATION_STEP_TYPED_BEFORE_VALUE_STATE\n\t| typeof PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FIELD_KEY_EMPTY\n\t| typeof PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_ID_EMPTY\n\t| typeof PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_NOT_FOUND\n\t| typeof PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_DEPENDENCY_INDEX_OUT_OF_RANGE\n\t| typeof PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_UNUSED_DEPENDENCIES\n\t| typeof PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_DOES_NOT_USE_DEPENDENCIES\n\t| typeof PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_RUNTIME_ERROR\n\t| typeof PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_ID_EMPTY\n\t| typeof PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_NOT_FOUND\n\t| typeof PIPELINE_VALIDATION_STEP_VALUE_STATE_DEPENDENCY_ID_EMPTY\n\t| typeof PIPELINE_VALIDATION_STEP_VALUE_STATE_DEPENDENCY_INDEX_OUT_OF_RANGE\n\t| typeof PIPELINE_VALIDATION_STEP_VALUE_STATE_UNUSED_DEPENDENCIES\n\t| typeof PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_DOES_NOT_USE_DEPENDENCIES\n\t| typeof PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_RUNTIME_ERROR\n\t| typeof PIPELINE_VALIDATION_STEP_THRESHOLD_STATES_COUNT_INVALID\n\t| typeof PIPELINE_VALIDATION_STEP_VALUE_HIDDEN_WITHOUT_ICON\n\t| typeof PIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_PRESET_EMPTY\n\t| typeof PIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_PRESET_NOT_FOUND;\n\nexport type FormattersPipelineValidationMessage = {\n\tcode: FormattersPipelineValidationCode;\n\tmessage: string;\n};\n\nexport type FormattersPipelineValidationResult = {\n\tok: boolean;\n\terrors: FormattersPipelineValidationMessage[];\n\twarnings: FormattersPipelineValidationMessage[];\n\tplan?: FormattersPipelinePlan;\n};\n\ntype MutableValidationState = {\n\terrors: FormattersPipelineValidationMessage[];\n\twarnings: FormattersPipelineValidationMessage[];\n};\n\nfunction pushError(state: MutableValidationState, code: FormattersPipelineValidationCode, message: string) {\n\tstate.errors.push({ code, message });\n}\n\nfunction pushWarning(state: MutableValidationState, code: FormattersPipelineValidationCode, message: string) {\n\tstate.warnings.push({ code, message });\n}\n\nfunction toSortedArray(items: Set<number>): number[] {\n\treturn [...items].sort((left, right) => left - right);\n}\n\nfunction createSampleRowData(dependencies: readonly string[], multiplier: number): Record<string, unknown> {\n\treturn dependencies.reduce<Record<string, unknown>>((acc, dependencyId, index) => {\n\t\tacc[dependencyId] = (index + 1) * multiplier;\n\t\treturn acc;\n\t}, {});\n}\n\nfunction validateRowBasedOverrideFormulaConfig(config: FormattersPipelineRowBasedOverrideFormulaConfig, state: MutableValidationState) {\n\tif (!config.formulaId.trim()) {\n\t\tpushError(\n\t\t\tstate,\n\t\t\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_ID_EMPTY,\n\t\t\t\"Для rowBasedOverride (formula) необходимо заполнить formulaId.\"\n\t\t);\n\t\treturn;\n\t}\n\n\tconst formula = getRowBasedFormatterById(config.formulaId);\n\tconst dependencies = [...(config.dependencyIds ?? [])];\n\n\tif (!formula) {\n\t\tpushError(state, PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_NOT_FOUND, \"Формула rowBasedOverride не найдена в реестре.\");\n\t\treturn;\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 = createRowBasedFormatterContext({\n\t\t\t\trowData: sampleRowData,\n\t\t\t\trawValue: FORMULA_VALIDATION_PROBE_VALUE,\n\t\t\t\tcolumnId: \"__validation__\",\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\tpushError(\n\t\t\tstate,\n\t\t\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_DEPENDENCY_INDEX_OUT_OF_RANGE,\n\t\t\t`Формула rowBasedOverride обращается к несуществующим индексам. Минимально требуется зависимостей: ${requiredDependencyCount}, выбрано: ${dependencies.length}.`\n\t\t);\n\t}\n\n\tif (sortedUsedIndexes.length === 0) {\n\t\tpushWarning(\n\t\t\tstate,\n\t\t\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_DOES_NOT_USE_DEPENDENCIES,\n\t\t\t\"Формула rowBasedOverride не использует dependencyIds.\"\n\t\t);\n\t}\n\n\tconst unusedDependencies = dependencies.filter((_, index) => !usedIndexes.has(index));\n\tif (unusedDependencies.length > 0) {\n\t\tpushWarning(\n\t\t\tstate,\n\t\t\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_UNUSED_DEPENDENCIES,\n\t\t\t`Выбраны, но не используются формулой rowBasedOverride: ${unusedDependencies.join(\", \")}.`\n\t\t);\n\t}\n\n\tif (runtimeErrorCount > 0) {\n\t\tpushWarning(\n\t\t\tstate,\n\t\t\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FORMULA_RUNTIME_ERROR,\n\t\t\t\"На тестовых данных формула rowBasedOverride завершилась с ошибкой.\"\n\t\t);\n\t}\n}\n\n/**\n * Pipeline проверяет контракт формулы и индексы, а наличие полей в конкретном\n * источнике данных проверяет потребитель через collectRuntimeFieldDependencyIds.\n */\nfunction validateValueStateFormulaSource(source: FormattersPipelineValueStateFormulaSource, state: MutableValidationState) {\n\tif (!source.formulaId.trim()) {\n\t\tpushError(state, PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_ID_EMPTY, \"Для источника состояния необходимо выбрать формулу.\");\n\t\treturn;\n\t}\n\n\tif (source.dependencyIds.some((dependencyId) => !dependencyId.trim())) {\n\t\tpushError(\n\t\t\tstate,\n\t\t\tPIPELINE_VALIDATION_STEP_VALUE_STATE_DEPENDENCY_ID_EMPTY,\n\t\t\t\"Зависимость формулы состояния не может иметь пустой id.\"\n\t\t);\n\t\treturn;\n\t}\n\n\tconst validation = validateTableFormulaDependencies({\n\t\tformulaId: source.formulaId,\n\t\tdependencies: source.dependencyIds,\n\t\tavailableColumnIds: source.dependencyIds\n\t});\n\tfor (const error of validation.errors) {\n\t\tif (error.code === TABLE_FORMULA_NOT_FOUND) {\n\t\t\tpushError(state, PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_NOT_FOUND, \"Формула источника состояния не найдена в реестре.\");\n\t\t} else if (error.code === TABLE_FORMULA_DEPENDENCY_INDEX_OUT_OF_RANGE) {\n\t\t\tpushError(state, PIPELINE_VALIDATION_STEP_VALUE_STATE_DEPENDENCY_INDEX_OUT_OF_RANGE, error.message);\n\t\t}\n\t}\n\tfor (const warning of validation.warnings) {\n\t\tswitch (warning.code) {\n\t\t\tcase TABLE_FORMULA_UNUSED_DEPENDENCIES:\n\t\t\t\tpushWarning(state, PIPELINE_VALIDATION_STEP_VALUE_STATE_UNUSED_DEPENDENCIES, warning.message);\n\t\t\t\tbreak;\n\t\t\tcase TABLE_FORMULA_DOES_NOT_USE_DEPENDENCIES:\n\t\t\t\tpushWarning(state, PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_DOES_NOT_USE_DEPENDENCIES, warning.message);\n\t\t\t\tbreak;\n\t\t\tcase TABLE_FORMULA_VALIDATION_RUNTIME_ERROR:\n\t\t\t\tpushWarning(state, PIPELINE_VALIDATION_STEP_VALUE_STATE_FORMULA_RUNTIME_ERROR, warning.message);\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\nfunction validateStepDefinitions(steps: readonly FormattersPipelineStep[], state: MutableValidationState) {\n\tconst stepIdSet = new Set<string>();\n\tconst counters = {\n\t\tnormalizeLeadingZeros: 0,\n\t\trowBasedOverride: 0,\n\t\tresolveValueState: 0,\n\t\ttypedValueFormat: 0\n\t};\n\n\tfor (const step of steps) {\n\t\tconst normalizedId = step.id.trim();\n\t\tif (!normalizedId) {\n\t\t\tpushError(state, PIPELINE_VALIDATION_STEP_ID_DUPLICATE, \"Шаг pipeline не может иметь пустой id.\");\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (stepIdSet.has(normalizedId)) {\n\t\t\tpushError(state, PIPELINE_VALIDATION_STEP_ID_DUPLICATE, `Найден дублирующийся id шага pipeline: ${normalizedId}.`);\n\t\t}\n\t\tstepIdSet.add(normalizedId);\n\n\t\tswitch (step.type) {\n\t\t\tcase PIPELINE_FORMATTER_NORMALIZE_LEADING_ZEROS:\n\t\t\t\tcounters.normalizeLeadingZeros += 1;\n\t\t\t\tbreak;\n\t\t\tcase PIPELINE_FORMATTER_ROW_BASED_OVERRIDE:\n\t\t\t\tcounters.rowBasedOverride += 1;\n\n\t\t\t\tif (step.config.mode === PIPELINE_OVERRIDE_MODE_FIELD && !step.config.fieldKey.trim()) {\n\t\t\t\t\tpushError(\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\tPIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_FIELD_KEY_EMPTY,\n\t\t\t\t\t\t\"Для rowBasedOverride (field) необходимо заполнить fieldKey.\"\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (step.config.mode === PIPELINE_OVERRIDE_MODE_FORMULA) {\n\t\t\t\t\tvalidateRowBasedOverrideFormulaConfig(step.config, state);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase PIPELINE_FORMATTER_RESOLVE_VALUE_STATE:\n\t\t\t\tcounters.resolveValueState += 1;\n\t\t\t\tif (step.config.valueSource?.kind === PIPELINE_STATE_SOURCE_FORMULA) {\n\t\t\t\t\tvalidateValueStateFormulaSource(step.config.valueSource, state);\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tstep.config.resolver.kind === VALUE_STATE_RESOLVER_KIND_THRESHOLD &&\n\t\t\t\t\tstep.config.resolver.states.length !== step.config.resolver.thresholds.length + 1\n\t\t\t\t) {\n\t\t\t\t\tpushError(\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\tPIPELINE_VALIDATION_STEP_THRESHOLD_STATES_COUNT_INVALID,\n\t\t\t\t\t\t\"Для threshold-резолвера количество states должно быть равно thresholds + 1.\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase PIPELINE_FORMATTER_TYPED_VALUE_FORMAT:\n\t\t\t\tcounters.typedValueFormat += 1;\n\t\t\t\tif (step.config?.numberPresetName !== undefined) {\n\t\t\t\t\tconst normalizedPresetName = step.config.numberPresetName.trim();\n\t\t\t\t\tif (!normalizedPresetName) {\n\t\t\t\t\t\tpushError(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tPIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_PRESET_EMPTY,\n\t\t\t\t\t\t\t\"Для typedValueFormat указан пустой numberPresetName.\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!getNumberPreset(normalizedPresetName)) {\n\t\t\t\t\t\tpushError(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tPIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_PRESET_NOT_FOUND,\n\t\t\t\t\t\t\t`Для typedValueFormat указан неизвестный пресет: ${normalizedPresetName}.`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (counters.normalizeLeadingZeros > 1) {\n\t\tpushError(\n\t\t\tstate,\n\t\t\tPIPELINE_VALIDATION_STEP_NORMALIZE_LEADING_ZEROS_MULTIPLE,\n\t\t\t\"В pipeline может быть только один шаг normalizeLeadingZeros.\"\n\t\t);\n\t}\n\n\tif (counters.rowBasedOverride > 1) {\n\t\tpushError(state, PIPELINE_VALIDATION_STEP_ROW_BASED_OVERRIDE_MULTIPLE, \"В pipeline может быть только один шаг rowBasedOverride.\");\n\t}\n\n\tif (counters.resolveValueState > 1) {\n\t\tpushError(state, PIPELINE_VALIDATION_STEP_RESOLVE_VALUE_STATE_MULTIPLE, \"В pipeline может быть только один шаг resolveValueState.\");\n\t}\n\n\tif (counters.typedValueFormat > 1) {\n\t\tpushError(state, PIPELINE_VALIDATION_STEP_TYPED_VALUE_FORMAT_MULTIPLE, \"В pipeline может быть только один шаг typedValueFormat.\");\n\t}\n\n\tconst resolveIndex = steps.findIndex((step) => step.type === PIPELINE_FORMATTER_RESOLVE_VALUE_STATE);\n\tconst typedIndex = steps.findIndex((step) => step.type === PIPELINE_FORMATTER_TYPED_VALUE_FORMAT);\n\tif (resolveIndex !== -1 && typedIndex !== -1 && typedIndex < resolveIndex) {\n\t\tpushError(\n\t\t\tstate,\n\t\t\tPIPELINE_VALIDATION_STEP_TYPED_BEFORE_VALUE_STATE,\n\t\t\t\"Шаг typedValueFormat не может выполняться до шага resolveValueState.\"\n\t\t);\n\t}\n\n\tfor (const step of steps) {\n\t\tif (step.type !== PIPELINE_FORMATTER_RESOLVE_VALUE_STATE) continue;\n\t\tif (!step.config.icon?.enabled && step.config.icon?.showValue === false) {\n\t\t\tpushWarning(\n\t\t\t\tstate,\n\t\t\t\tPIPELINE_VALIDATION_STEP_VALUE_HIDDEN_WITHOUT_ICON,\n\t\t\t\t\"Для resolveValueState установлено showValue=false при выключенной иконке: значение не будет отображаться.\"\n\t\t\t);\n\t\t}\n\t}\n}\n\n/**\n * Валидация облегчённого плана pipeline.\n */\nexport function validateFormattersPipelinePlan(plan: FormattersPipelinePlan): FormattersPipelineValidationResult {\n\tconst state: MutableValidationState = { errors: [], warnings: [] };\n\n\tvalidateStepDefinitions(plan.steps, state);\n\n\treturn {\n\t\tok: state.errors.length === 0,\n\t\terrors: state.errors,\n\t\twarnings: state.warnings,\n\t\tplan: state.errors.length === 0 ? { steps: [...plan.steps] } : undefined\n\t};\n}\n\nfunction buildLinearPathFromGraph(\n\tnodes: readonly FormattersPipelineNode[],\n\tedges: readonly FormattersPipelineEdge[],\n\tstate: MutableValidationState\n): string[] | undefined {\n\tconst nodeById = new Map(nodes.map((node) => [node.id, node]));\n\tconst outgoing = new Map<string, string[]>();\n\tconst incoming = new Map<string, string[]>();\n\n\tfor (const node of nodes) {\n\t\toutgoing.set(node.id, []);\n\t\tincoming.set(node.id, []);\n\t}\n\n\tfor (const edge of edges) {\n\t\tconst source = edge.source.trim();\n\t\tconst target = edge.target.trim();\n\t\tif (!nodeById.has(source) || !nodeById.has(target)) {\n\t\t\tpushError(\n\t\t\t\tstate,\n\t\t\t\tPIPELINE_VALIDATION_EDGE_NODE_NOT_FOUND,\n\t\t\t\t`Ребро ${edge.id} ссылается на несуществующий узел: ${source} -> ${target}.`\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\n\t\toutgoing.get(source)?.push(target);\n\t\tincoming.get(target)?.push(source);\n\t}\n\n\tconst sources = nodes.filter((node) => node.type === PIPELINE_NODE_SOURCE);\n\tconst sinks = nodes.filter((node) => node.type === PIPELINE_NODE_SINK);\n\n\tif (sources.length !== 1) {\n\t\tpushError(state, PIPELINE_VALIDATION_SOURCE_COUNT_INVALID, \"В графе должен быть ровно один узел source.\");\n\t}\n\tif (sinks.length !== 1) {\n\t\tpushError(state, PIPELINE_VALIDATION_SINK_COUNT_INVALID, \"В графе должен быть ровно один узел sink.\");\n\t}\n\tif (state.errors.length > 0) return undefined;\n\n\tconst sourceNodeId = sources[0]!.id;\n\tconst sinkNodeId = sinks[0]!.id;\n\n\tfor (const node of nodes) {\n\t\tconst inDegree = incoming.get(node.id)?.length ?? 0;\n\t\tconst outDegree = outgoing.get(node.id)?.length ?? 0;\n\n\t\tif (node.type === PIPELINE_NODE_SOURCE) {\n\t\t\tif (inDegree !== 0) {\n\t\t\t\tpushError(state, PIPELINE_VALIDATION_SOURCE_INCOMING_INVALID, \"Узел source не должен иметь входящих рёбер.\");\n\t\t\t}\n\t\t\tif (outDegree !== 1) {\n\t\t\t\tpushError(state, PIPELINE_VALIDATION_NODE_DEGREE_INVALID, \"Узел source должен иметь ровно одно исходящее ребро.\");\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (node.type === PIPELINE_NODE_SINK) {\n\t\t\tif (outDegree !== 0) {\n\t\t\t\tpushError(state, PIPELINE_VALIDATION_SINK_OUTGOING_INVALID, \"Узел sink не должен иметь исходящих рёбер.\");\n\t\t\t}\n\t\t\tif (inDegree !== 1) {\n\t\t\t\tpushError(state, PIPELINE_VALIDATION_NODE_DEGREE_INVALID, \"Узел sink должен иметь ровно одно входящее ребро.\");\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (inDegree !== 1 || outDegree !== 1) {\n\t\t\tpushError(\n\t\t\t\tstate,\n\t\t\t\tPIPELINE_VALIDATION_NODE_DEGREE_INVALID,\n\t\t\t\t`Узел ${node.id} должен иметь ровно одно входящее и одно исходящее ребро для линейного pipeline.`\n\t\t\t);\n\t\t}\n\t}\n\n\tif (state.errors.length > 0) return undefined;\n\n\tconst visited = new Set<string>();\n\tconst path: string[] = [];\n\tlet cursor = sourceNodeId;\n\n\twhile (true) {\n\t\tif (visited.has(cursor)) {\n\t\t\tpushError(state, PIPELINE_VALIDATION_PATH_CYCLE_DETECTED, \"В графе pipeline обнаружен цикл.\");\n\t\t\treturn undefined;\n\t\t}\n\t\tvisited.add(cursor);\n\t\tpath.push(cursor);\n\n\t\tif (cursor === sinkNodeId) {\n\t\t\tbreak;\n\t\t}\n\n\t\tconst nextCandidates = outgoing.get(cursor) ?? [];\n\t\tif (nextCandidates.length !== 1) {\n\t\t\tpushError(state, PIPELINE_VALIDATION_PATH_BROKEN, \"Не удалось построить линейный путь от source к sink.\");\n\t\t\treturn undefined;\n\t\t}\n\n\t\tcursor = nextCandidates[0]!;\n\t}\n\n\tif (visited.size !== nodes.length) {\n\t\tpushError(\n\t\t\tstate,\n\t\t\tPIPELINE_VALIDATION_PATH_DISCONNECTED_NODES,\n\t\t\t\"Граф содержит узлы, которые не входят в линейный путь source -> sink.\"\n\t\t);\n\t\treturn undefined;\n\t}\n\n\treturn path;\n}\n\n/**\n * Валидация графа pipeline и построение линейного плана исполнения.\n */\nexport function validateFormattersPipelineGraph(graph: FormattersPipelineGraph): FormattersPipelineValidationResult {\n\tconst state: MutableValidationState = { errors: [], warnings: [] };\n\n\tif (!graph.nodes.length) {\n\t\tpushError(state, PIPELINE_VALIDATION_PATH_BROKEN, \"Граф pipeline не содержит узлов.\");\n\t\treturn { ok: false, errors: state.errors, warnings: state.warnings };\n\t}\n\n\tconst nodeById = new Map<string, FormattersPipelineNode>();\n\tfor (const node of graph.nodes) {\n\t\tconst normalizedId = node.id.trim();\n\t\tif (!normalizedId) {\n\t\t\tpushError(state, PIPELINE_VALIDATION_NODE_ID_DUPLICATE, \"Узел pipeline не может иметь пустой id.\");\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (nodeById.has(normalizedId)) {\n\t\t\tpushError(state, PIPELINE_VALIDATION_NODE_ID_DUPLICATE, `Найден дублирующийся id узла pipeline: ${normalizedId}.`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tnodeById.set(normalizedId, node);\n\t}\n\n\tconst edgeIdSet = new Set<string>();\n\tfor (const edge of graph.edges) {\n\t\tconst normalizedEdgeId = edge.id.trim();\n\t\tif (!normalizedEdgeId) {\n\t\t\tpushError(state, PIPELINE_VALIDATION_EDGE_ID_DUPLICATE, \"Ребро pipeline не может иметь пустой id.\");\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (edgeIdSet.has(normalizedEdgeId)) {\n\t\t\tpushError(state, PIPELINE_VALIDATION_EDGE_ID_DUPLICATE, `Найден дублирующийся id ребра pipeline: ${normalizedEdgeId}.`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tedgeIdSet.add(normalizedEdgeId);\n\t}\n\n\tif (state.errors.length > 0) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\terrors: state.errors,\n\t\t\twarnings: state.warnings\n\t\t};\n\t}\n\n\tconst path = buildLinearPathFromGraph(graph.nodes, graph.edges, state);\n\tif (!path) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\terrors: state.errors,\n\t\t\twarnings: state.warnings\n\t\t};\n\t}\n\n\tconst steps: FormattersPipelineStep[] = [];\n\tfor (const nodeId of path) {\n\t\tconst node = nodeById.get(nodeId);\n\t\tif (!node || node.type === PIPELINE_NODE_SOURCE || node.type === PIPELINE_NODE_SINK) continue;\n\n\t\tswitch (node.type) {\n\t\t\tcase PIPELINE_FORMATTER_NORMALIZE_LEADING_ZEROS:\n\t\t\t\tsteps.push({\n\t\t\t\t\tid: node.id,\n\t\t\t\t\ttype: PIPELINE_FORMATTER_NORMALIZE_LEADING_ZEROS,\n\t\t\t\t\tconfig: node.config ? { ...node.config } : undefined\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase PIPELINE_FORMATTER_ROW_BASED_OVERRIDE:\n\t\t\t\tsteps.push({\n\t\t\t\t\tid: node.id,\n\t\t\t\t\ttype: PIPELINE_FORMATTER_ROW_BASED_OVERRIDE,\n\t\t\t\t\tconfig:\n\t\t\t\t\t\tnode.config.mode === PIPELINE_OVERRIDE_MODE_FORMULA\n\t\t\t\t\t\t\t? { ...node.config, dependencyIds: node.config.dependencyIds ? [...node.config.dependencyIds] : undefined }\n\t\t\t\t\t\t\t: { ...node.config }\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase PIPELINE_FORMATTER_RESOLVE_VALUE_STATE:\n\t\t\t\tsteps.push({\n\t\t\t\t\tid: node.id,\n\t\t\t\t\ttype: PIPELINE_FORMATTER_RESOLVE_VALUE_STATE,\n\t\t\t\t\tconfig: cloneResolveValueStateConfig(node.config)\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase PIPELINE_FORMATTER_TYPED_VALUE_FORMAT:\n\t\t\t\tsteps.push({\n\t\t\t\t\tid: node.id,\n\t\t\t\t\ttype: PIPELINE_FORMATTER_TYPED_VALUE_FORMAT,\n\t\t\t\t\tconfig: node.config ? { ...node.config } : undefined\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tvalidateStepDefinitions(steps, state);\n\n\treturn {\n\t\tok: state.errors.length === 0,\n\t\terrors: state.errors,\n\t\twarnings: state.warnings,\n\t\tplan: state.errors.length === 0 ? { steps } : undefined\n\t};\n}\n\n/**\n * Валидация конфигурации pipeline c выбором рабочего плана исполнения.\n *\n * Приоритет источника плана:\n * 1) `plan` из конфигурации;\n * 2) построение плана из `graph`.\n */\nexport function validateFormattersPipelineConfig(config: FormattersPipelineConfig | undefined): FormattersPipelineValidationResult {\n\tconst state: MutableValidationState = { errors: [], warnings: [] };\n\n\tif (!config) {\n\t\tpushError(state, PIPELINE_VALIDATION_CONFIG_NOT_DEFINED, \"Конфигурация pipeline не задана.\");\n\t\treturn {\n\t\t\tok: false,\n\t\t\terrors: state.errors,\n\t\t\twarnings: state.warnings\n\t\t};\n\t}\n\n\tif (config.version !== FORMATTERS_PIPELINE_VERSION) {\n\t\tpushError(state, PIPELINE_VALIDATION_UNSUPPORTED_VERSION, `Неподдерживаемая версия pipeline: ${String(config.version)}.`);\n\t\treturn {\n\t\t\tok: false,\n\t\t\terrors: state.errors,\n\t\t\twarnings: state.warnings\n\t\t};\n\t}\n\n\tif (!config.plan && !config.graph) {\n\t\tpushError(\n\t\t\tstate,\n\t\t\tPIPELINE_VALIDATION_GRAPH_OR_PLAN_REQUIRED,\n\t\t\t\"Для pipeline должен быть задан хотя бы один источник: graph или plan.\"\n\t\t);\n\t\treturn {\n\t\t\tok: false,\n\t\t\terrors: state.errors,\n\t\t\twarnings: state.warnings\n\t\t};\n\t}\n\n\tif (config.plan) {\n\t\tconst planResult = validateFormattersPipelinePlan(config.plan);\n\t\tstate.errors.push(...planResult.errors);\n\t\tstate.warnings.push(...planResult.warnings);\n\n\t\tif (planResult.ok && planResult.plan) {\n\t\t\treturn {\n\t\t\t\tok: true,\n\t\t\t\terrors: state.errors,\n\t\t\t\twarnings: state.warnings,\n\t\t\t\tplan: planResult.plan\n\t\t\t};\n\t\t}\n\n\t\tif (config.graph) {\n\t\t\tpushWarning(state, PIPELINE_VALIDATION_PATH_BROKEN, \"Линейный plan невалиден. Выполнена попытка построить план из graph.\");\n\t\t\tstate.errors.length = 0;\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terrors: state.errors,\n\t\t\t\twarnings: state.warnings\n\t\t\t};\n\t\t}\n\t}\n\n\tif (config.graph) {\n\t\tconst graphResult = validateFormattersPipelineGraph(config.graph);\n\t\treturn {\n\t\t\tok: graphResult.ok,\n\t\t\terrors: [...state.errors, ...graphResult.errors],\n\t\t\twarnings: [...state.warnings, ...graphResult.warnings],\n\t\t\tplan: graphResult.plan\n\t\t};\n\t}\n\n\treturn {\n\t\tok: false,\n\t\terrors: state.errors,\n\t\twarnings: state.warnings\n\t};\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Ut as e } from "../chunks/formatters-CO40zvVB.js";
1
+ import { Ut as e } from "../chunks/formatters-CMfD97RB.js";
2
2
  import { _ as t } from "../chunks/array-bd7LYFto.js";
3
3
  import { a as n } from "../chunks/utils-DW0Yso1Q.js";
4
4
  import { b as r } from "../chunks/formatDate-CNPcfNte.js";
@@ -1,5 +1,5 @@
1
1
  import { _ as e, a as t, i as n, m as r, n as i, o as a, r as o } from "../chunks/scalarTypeClassification-D4YcGxtQ.js";
2
- import { B as s, K as c, Y as l, t as ee, x as u } from "../chunks/validate-8URYKKly.js";
2
+ import { B as s, K as c, Y as l, t as ee, x as u } from "../chunks/validate-rivmPJyV.js";
3
3
  import "../chunks/scalarTypeConstants-CnSsjpGO.js";
4
4
  import { m as d } from "../chunks/dom-ZSeWZ0Gg.js";
5
5
  import { escapeXmlValue as f } from "../xml/index.js";