@ryuzaki13/react-foundation-lib 2.28.0 → 2.29.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.
- package/dist/analytical-table/index.js +2 -2
- package/dist/chunks/{formatters-B_NcT2pe.js → formatters-CZnnbdud.js} +3 -3
- package/dist/chunks/{formatters-B_NcT2pe.js.map → formatters-CZnnbdud.js.map} +1 -1
- package/dist/chunks/formulas-BXT_XBWI.js +236 -0
- package/dist/chunks/formulas-BXT_XBWI.js.map +1 -0
- package/dist/chunks/{validate-C8cQm_9m.js → validate-CEQHqevt.js} +2 -2
- package/dist/chunks/{validate-C8cQm_9m.js.map → validate-CEQHqevt.js.map} +1 -1
- package/dist/error-report/index.js +1 -1
- package/dist/excel/index.js +1 -1
- package/dist/formatters/index.js +2 -2
- package/dist/formatters/pipeline/types.d.ts +2 -2
- package/dist/formatters/pipeline/types.d.ts.map +1 -1
- package/dist/formulas/execute.d.ts +4 -4
- package/dist/formulas/execute.d.ts.map +1 -1
- package/dist/formulas/formatTableFormulaExpression.d.ts +3 -2
- package/dist/formulas/formatTableFormulaExpression.d.ts.map +1 -1
- package/dist/formulas/index.js +2 -198
- package/dist/formulas/isTableFormulaDependency.d.ts +4 -0
- package/dist/formulas/isTableFormulaDependency.d.ts.map +1 -0
- package/dist/formulas/types.d.ts +11 -0
- package/dist/formulas/types.d.ts.map +1 -1
- package/dist/formulas/validate.d.ts +3 -2
- package/dist/formulas/validate.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/formulas/README.mdx +24 -14
- package/dist/formulas/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/formatters/pipeline/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/formatters/pipeline/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type TableFormulaContext, type TableFormulaDependency, type TableFormulaRowData } from "./types";
|
|
2
2
|
type TableFormulaContextInstrumentation = {
|
|
3
3
|
onReadIndex?: (index: number) => void;
|
|
4
4
|
onOutOfRangeIndex?: (index: number) => void;
|
|
5
5
|
};
|
|
6
6
|
export declare function createTableFormulaContext(args: {
|
|
7
7
|
rowData: TableFormulaRowData;
|
|
8
|
-
keys?: readonly
|
|
8
|
+
keys?: readonly TableFormulaDependency[];
|
|
9
9
|
instrumentation?: TableFormulaContextInstrumentation;
|
|
10
10
|
}): TableFormulaContext;
|
|
11
11
|
export type TableFormulaExecutionResult = {
|
|
@@ -25,12 +25,12 @@ type CompileTableFormulaResult = {
|
|
|
25
25
|
};
|
|
26
26
|
export declare function compileTableFormula(args: {
|
|
27
27
|
formulaId: string | undefined;
|
|
28
|
-
keys?: readonly
|
|
28
|
+
keys?: readonly TableFormulaDependency[];
|
|
29
29
|
}): CompileTableFormulaResult;
|
|
30
30
|
export declare function executeTableFormula(args: {
|
|
31
31
|
formulaId: string | undefined;
|
|
32
32
|
rowData: TableFormulaRowData;
|
|
33
|
-
keys?: readonly
|
|
33
|
+
keys?: readonly TableFormulaDependency[];
|
|
34
34
|
}): TableFormulaExecutionResult;
|
|
35
35
|
export {};
|
|
36
36
|
//# sourceMappingURL=execute.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/formulas/execute.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/formulas/execute.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,sBAAsB,EAAE,KAAK,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE1G,KAAK,kCAAkC,GAAG;IACzC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C,CAAC;AAkBF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC/C,OAAO,EAAE,mBAAmB,CAAC;IAC7B,IAAI,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACzC,eAAe,CAAC,EAAE,kCAAkC,CAAC;CACrD,GAAG,mBAAmB,CAiCtB;AAED,MAAM,MAAM,2BAA2B,GACpC;IACA,EAAE,EAAE,IAAI,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;CACb,GACD;IACA,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,mBAAmB,GAAG,gBAAgB,GAAG,eAAe,CAAC;CAChE,CAAC;AAEL,MAAM,MAAM,4BAA4B,GAAG,CAAC,OAAO,EAAE,mBAAmB,KAAK,2BAA2B,CAAC;AAEzG,KAAK,yBAAyB,GAC3B;IACA,EAAE,EAAE,IAAI,CAAC;IACT,OAAO,EAAE,4BAA4B,CAAC;CACrC,GACD;IACA,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,mBAAmB,CAAC;CAC3B,CAAC;AAEL,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACzC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,IAAI,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACzC,GAAG,yBAAyB,CAmD5B;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACzC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,IAAI,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACzC,GAAG,2BAA2B,CAU9B"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { type TableFormulaDependency } from "./types";
|
|
1
2
|
/**
|
|
2
|
-
* Подставляет ID
|
|
3
|
+
* Подставляет ID полей и числовые константы в шаблон превью формулы.
|
|
3
4
|
*
|
|
4
5
|
* Незаданные позиции остаются в виде $n, чтобы редактор мог показывать неполный
|
|
5
6
|
* черновик. Подстановка однопроходная: ID сохраняются буквально, а полученный
|
|
6
7
|
* текст предназначен только для отображения и никогда не исполняется.
|
|
7
8
|
*/
|
|
8
|
-
export declare function formatTableFormulaExpression(expressionTemplate: string, dependencies: readonly
|
|
9
|
+
export declare function formatTableFormulaExpression(expressionTemplate: string, dependencies: readonly TableFormulaDependency[]): string;
|
|
9
10
|
//# sourceMappingURL=formatTableFormulaExpression.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatTableFormulaExpression.d.ts","sourceRoot":"","sources":["../../src/formulas/formatTableFormulaExpression.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"formatTableFormulaExpression.d.ts","sourceRoot":"","sources":["../../src/formulas/formatTableFormulaExpression.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEtD;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,kBAAkB,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,sBAAsB,EAAE,GAAG,MAAM,CAShI"}
|
package/dist/formulas/index.js
CHANGED
|
@@ -1,198 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
let t = /* @__PURE__ */ new Map(), n = [];
|
|
4
|
-
for (let r of e) {
|
|
5
|
-
let e = r.id.trim();
|
|
6
|
-
if (!e) throw Error("Formula id не может быть пустым");
|
|
7
|
-
if (t.has(e)) throw Error(`Найден дублирующийся formulaId: ${e}`);
|
|
8
|
-
let i = Object.freeze({
|
|
9
|
-
...r,
|
|
10
|
-
id: e,
|
|
11
|
-
name: r.name.trim(),
|
|
12
|
-
description: r.description.trim(),
|
|
13
|
-
keywords: r.keywords ? [...r.keywords] : void 0
|
|
14
|
-
});
|
|
15
|
-
t.set(e, i), n.push(i);
|
|
16
|
-
}
|
|
17
|
-
return Object.freeze({
|
|
18
|
-
list: Object.freeze(n),
|
|
19
|
-
byId: t
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
var t = e([]);
|
|
23
|
-
function n(e) {
|
|
24
|
-
t = e;
|
|
25
|
-
}
|
|
26
|
-
function r() {
|
|
27
|
-
return t.list;
|
|
28
|
-
}
|
|
29
|
-
function i(e) {
|
|
30
|
-
let n = e?.trim();
|
|
31
|
-
if (n) return t.byId.get(n);
|
|
32
|
-
}
|
|
33
|
-
//#endregion
|
|
34
|
-
//#region src/formulas/execute.ts
|
|
35
|
-
function a(e) {
|
|
36
|
-
let t = Number(e);
|
|
37
|
-
return Number.isFinite(t) ? t : 0;
|
|
38
|
-
}
|
|
39
|
-
function o(e) {
|
|
40
|
-
let t = [...e.keys ?? []], n = (n) => {
|
|
41
|
-
if (!Number.isInteger(n) || n < 0) {
|
|
42
|
-
e.instrumentation?.onOutOfRangeIndex?.(n);
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
if (e.instrumentation?.onReadIndex?.(n), n >= t.length) {
|
|
46
|
-
e.instrumentation?.onOutOfRangeIndex?.(n);
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
return t[n];
|
|
50
|
-
}, r = (t) => {
|
|
51
|
-
let r = n(t);
|
|
52
|
-
if (r) return e.rowData[r];
|
|
53
|
-
};
|
|
54
|
-
return {
|
|
55
|
-
key: n,
|
|
56
|
-
value: r,
|
|
57
|
-
num: (e) => a(r(e))
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
function s(e) {
|
|
61
|
-
let t = i(e.formulaId);
|
|
62
|
-
if (!t) return {
|
|
63
|
-
ok: !1,
|
|
64
|
-
reason: "formula_not_found"
|
|
65
|
-
};
|
|
66
|
-
let n = [...e.keys ?? []], r = {}, o = {
|
|
67
|
-
key: (e) => Number.isInteger(e) && e >= 0 && e < n.length ? n[e] : void 0,
|
|
68
|
-
value: (e) => {
|
|
69
|
-
if (!Number.isInteger(e) || e < 0 || e >= n.length) return;
|
|
70
|
-
let t = n[e];
|
|
71
|
-
if (t) return r[t];
|
|
72
|
-
},
|
|
73
|
-
num: (e) => {
|
|
74
|
-
if (!Number.isInteger(e) || e < 0 || e >= n.length) return 0;
|
|
75
|
-
let t = n[e];
|
|
76
|
-
return t ? a(r[t]) : 0;
|
|
77
|
-
}
|
|
78
|
-
};
|
|
79
|
-
return {
|
|
80
|
-
ok: !0,
|
|
81
|
-
execute: (e) => {
|
|
82
|
-
r = e;
|
|
83
|
-
try {
|
|
84
|
-
let e = t.fn(o);
|
|
85
|
-
return Number.isFinite(e) ? {
|
|
86
|
-
ok: !0,
|
|
87
|
-
value: e
|
|
88
|
-
} : {
|
|
89
|
-
ok: !1,
|
|
90
|
-
reason: "invalid_result"
|
|
91
|
-
};
|
|
92
|
-
} catch {
|
|
93
|
-
return {
|
|
94
|
-
ok: !1,
|
|
95
|
-
reason: "runtime_error"
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
function c(e) {
|
|
102
|
-
let t = s({
|
|
103
|
-
formulaId: e.formulaId,
|
|
104
|
-
keys: e.keys
|
|
105
|
-
});
|
|
106
|
-
return t.ok ? t.execute(e.rowData) : {
|
|
107
|
-
ok: !1,
|
|
108
|
-
reason: t.reason
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
//#endregion
|
|
112
|
-
//#region src/formulas/formatTableFormulaExpression.ts
|
|
113
|
-
function l(e, t) {
|
|
114
|
-
return e.replace(/\$([0-9]+)/g, (e, n) => {
|
|
115
|
-
let r = t[Number(n)];
|
|
116
|
-
return r === void 0 || r === "" ? e : r;
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
//#endregion
|
|
120
|
-
//#region src/formulas/validate.ts
|
|
121
|
-
function u(e) {
|
|
122
|
-
return [...e].sort((e, t) => e - t);
|
|
123
|
-
}
|
|
124
|
-
function d(e, t) {
|
|
125
|
-
return e.reduce((e, n, r) => (e[n] = (r + 1) * t, e), {});
|
|
126
|
-
}
|
|
127
|
-
function f(e) {
|
|
128
|
-
let t = [], n = [], r = i(e.formulaId), a = [...e.dependencies ?? []], s = e.availableColumnIds ?? [];
|
|
129
|
-
if (!r) return t.push({
|
|
130
|
-
code: "formula_not_found",
|
|
131
|
-
message: "Формула не найдена в реестре."
|
|
132
|
-
}), {
|
|
133
|
-
ok: !1,
|
|
134
|
-
errors: t,
|
|
135
|
-
warnings: n,
|
|
136
|
-
usage: {
|
|
137
|
-
usedDependencyIndexes: [],
|
|
138
|
-
usedDependencyIds: [],
|
|
139
|
-
requiredDependencyCount: 0
|
|
140
|
-
}
|
|
141
|
-
};
|
|
142
|
-
let c = new Set(s), l = a.filter((e) => !c.has(e));
|
|
143
|
-
l.length > 0 && t.push({
|
|
144
|
-
code: "dependency_not_available",
|
|
145
|
-
message: `Не найдены среди доступных полей: ${l.join(", ")}.`
|
|
146
|
-
});
|
|
147
|
-
let f = /* @__PURE__ */ new Set(), p = /* @__PURE__ */ new Set(), m = 0, h = (e) => {
|
|
148
|
-
try {
|
|
149
|
-
let t = o({
|
|
150
|
-
rowData: e,
|
|
151
|
-
keys: a,
|
|
152
|
-
instrumentation: {
|
|
153
|
-
onReadIndex: (e) => {
|
|
154
|
-
f.add(e);
|
|
155
|
-
},
|
|
156
|
-
onOutOfRangeIndex: (e) => {
|
|
157
|
-
p.add(e);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
});
|
|
161
|
-
r.fn(t);
|
|
162
|
-
} catch {
|
|
163
|
-
m += 1;
|
|
164
|
-
}
|
|
165
|
-
};
|
|
166
|
-
h(d(a, 100)), h(d(a, -100));
|
|
167
|
-
let g = u(f), _ = g.length > 0 ? g[g.length - 1] + 1 : 0;
|
|
168
|
-
p.size > 0 && t.push({
|
|
169
|
-
code: "dependency_index_out_of_range",
|
|
170
|
-
message: `Формула обращается к несуществующим индексам. Минимально требуется зависимостей: ${_}, выбрано: ${a.length}.`
|
|
171
|
-
}), g.length === 0 && n.push({
|
|
172
|
-
code: "formula_does_not_use_dependencies",
|
|
173
|
-
message: "Формула не использует dependencies."
|
|
174
|
-
});
|
|
175
|
-
let v = a.filter((e, t) => !f.has(t));
|
|
176
|
-
v.length > 0 && n.push({
|
|
177
|
-
code: "unused_dependencies",
|
|
178
|
-
message: `Выбраны, но не используются формулой: ${v.join(", ")}.`
|
|
179
|
-
}), m > 0 && n.push({
|
|
180
|
-
code: "formula_runtime_error",
|
|
181
|
-
message: "На тестовых данных формула завершилась с ошибкой."
|
|
182
|
-
});
|
|
183
|
-
let y = g.map((e) => a[e]).filter(Boolean);
|
|
184
|
-
return {
|
|
185
|
-
ok: t.length === 0,
|
|
186
|
-
errors: t,
|
|
187
|
-
warnings: n,
|
|
188
|
-
usage: {
|
|
189
|
-
usedDependencyIndexes: g,
|
|
190
|
-
usedDependencyIds: y,
|
|
191
|
-
requiredDependencyCount: _
|
|
192
|
-
}
|
|
193
|
-
};
|
|
194
|
-
}
|
|
195
|
-
//#endregion
|
|
196
|
-
export { s as compileTableFormula, n as configureTableFormulaRegistry, o as createTableFormulaContext, e as createTableFormulaRegistry, c as executeTableFormula, l as formatTableFormulaExpression, i as getTableFormulaById, r as getTableFormulaList, f as validateTableFormulaDependencies };
|
|
197
|
-
|
|
198
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
import { a as e, c as t, i as n, l as r, n as i, o as a, r as o, s, t as c } from "../chunks/formulas-BXT_XBWI.js";
|
|
2
|
+
export { o as compileTableFormula, a as configureTableFormulaRegistry, n as createTableFormulaContext, s as createTableFormulaRegistry, e as executeTableFormula, i as formatTableFormulaExpression, t as getTableFormulaById, r as getTableFormulaList, c as validateTableFormulaDependencies };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type TableFormulaDependency } from "./types";
|
|
2
|
+
/** Проверяет внешний аргумент без приведения пустых строк или нечисловых значений к нулю. */
|
|
3
|
+
export declare function isTableFormulaDependency(value: unknown): value is TableFormulaDependency;
|
|
4
|
+
//# sourceMappingURL=isTableFormulaDependency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isTableFormulaDependency.d.ts","sourceRoot":"","sources":["../../src/formulas/isTableFormulaDependency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEtD,6FAA6F;AAC7F,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,sBAAsB,CAOxF"}
|
package/dist/formulas/types.d.ts
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
export type TableFormulaRowData = Record<string, unknown>;
|
|
2
|
+
/**
|
|
3
|
+
* Позиционный аргумент формулы: ID поля строки либо конечная числовая константа.
|
|
4
|
+
*
|
|
5
|
+
* Константа занимает обычную позицию аргумента, но не создаёт зависимости от
|
|
6
|
+
* данных строки. Строковая форма сохраняет контракт существующих consumers.
|
|
7
|
+
*/
|
|
8
|
+
export type TableFormulaDependency = string | {
|
|
9
|
+
readonly kind: "constant";
|
|
10
|
+
readonly value: number;
|
|
11
|
+
};
|
|
2
12
|
export interface TableFormulaContext {
|
|
13
|
+
/** Возвращает ID только для аргумента-поля; у константы ключа строки нет. */
|
|
3
14
|
key: (index: number) => string | undefined;
|
|
4
15
|
value: (index: number) => unknown;
|
|
5
16
|
num: (index: number) => number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/formulas/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1D,MAAM,WAAW,mBAAmB;IACnC,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC3C,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CAC/B;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,mBAAmB,KAAK,MAAM,CAAC;AAElE,MAAM,WAAW,sBAAsB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,qGAAqG;IACrG,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,EAAE,EAAE,cAAc,CAAC;CACnB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/formulas/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpG,MAAM,WAAW,mBAAmB;IACnC,6EAA6E;IAC7E,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC3C,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CAC/B;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,mBAAmB,KAAK,MAAM,CAAC;AAElE,MAAM,WAAW,sBAAsB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,qGAAqG;IACrG,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,EAAE,EAAE,cAAc,CAAC;CACnB"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { type TableFormulaDependency } from "./types";
|
|
2
|
+
type ValidationCode = "formula_not_found" | "dependency_index_out_of_range" | "dependency_not_available" | "invalid_constant" | "unused_dependencies" | "formula_does_not_use_dependencies" | "formula_runtime_error";
|
|
2
3
|
export interface TableFormulaValidationMessage {
|
|
3
4
|
code: ValidationCode;
|
|
4
5
|
message: string;
|
|
@@ -15,7 +16,7 @@ export interface TableFormulaDependenciesValidationResult {
|
|
|
15
16
|
}
|
|
16
17
|
export declare function validateTableFormulaDependencies(args: {
|
|
17
18
|
formulaId: string | undefined;
|
|
18
|
-
dependencies?: readonly
|
|
19
|
+
dependencies?: readonly TableFormulaDependency[];
|
|
19
20
|
availableColumnIds?: readonly string[];
|
|
20
21
|
}): TableFormulaDependenciesValidationResult;
|
|
21
22
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/formulas/validate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/formulas/validate.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEtD,KAAK,cAAc,GAChB,mBAAmB,GACnB,+BAA+B,GAC/B,0BAA0B,GAC1B,kBAAkB,GAClB,qBAAqB,GACrB,mCAAmC,GACnC,uBAAuB,CAAC;AAE3B,MAAM,WAAW,6BAA6B;IAC7C,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CAChB;AACD,MAAM,WAAW,wCAAwC;IACxD,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,6BAA6B,EAAE,CAAC;IACxC,QAAQ,EAAE,6BAA6B,EAAE,CAAC;IAC1C,KAAK,EAAE;QACN,qBAAqB,EAAE,MAAM,EAAE,CAAC;QAChC,iBAAiB,EAAE,MAAM,EAAE,CAAC;QAC5B,uBAAuB,EAAE,MAAM,CAAC;KAChC,CAAC;CACF;AAcD,wBAAgB,gCAAgC,CAAC,IAAI,EAAE;IACtD,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,YAAY,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACjD,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC,GAAG,wCAAwC,CAqH3C"}
|
package/package.json
CHANGED
package/src/formulas/README.mdx
CHANGED
|
@@ -6,7 +6,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
6
6
|
|
|
7
7
|
Модуль `@ryuzaki13/react-foundation-lib/formulas` предоставляет безопасную инфраструктуру для заранее написанных клиентских формул таблицы.
|
|
8
8
|
|
|
9
|
-
Формула получает значения
|
|
9
|
+
Формула получает значения полей текущей строки и числовые константы, выполняет синхронный расчёт и возвращает конечное JavaScript-число. Например, она может вычислить сумму, разницу, отношение или процент для calculated-колонки.
|
|
10
10
|
|
|
11
11
|
```text
|
|
12
12
|
данные строки + упорядоченные зависимости
|
|
@@ -181,12 +181,17 @@ const rowData = {
|
|
|
181
181
|
|
|
182
182
|
### Зависимости и keys
|
|
183
183
|
|
|
184
|
-
Dependencies — упорядоченный массив id
|
|
184
|
+
Dependencies — упорядоченный массив аргументов. Строка обозначает id поля, объект — конечную числовую константу:
|
|
185
185
|
|
|
186
186
|
```ts
|
|
187
|
-
|
|
187
|
+
import { type TableFormulaDependency } from "@ryuzaki13/react-foundation-lib/formulas";
|
|
188
|
+
|
|
189
|
+
const keys: readonly TableFormulaDependency[] = ["planned", "actual"];
|
|
190
|
+
const scaledKeys: readonly TableFormulaDependency[] = ["planned", { kind: "constant", value: 100 }];
|
|
188
191
|
```
|
|
189
192
|
|
|
193
|
+
`keys: ["planned", { kind: "constant", value: 100 }]` передаёт в `$0` значение поля, а в `$1` число `100`. Поля и константы можно смешивать, повторять и переставлять; константа не становится полем строки. Ноль, отрицательные и дробные числа допустимы. Строковый `"100"` обозначает ID поля, а не число. `NaN` и бесконечности отклоняются validator-ом; при исполнении дают `runtime_error`. Редактор отвечает за разбор пользовательского ввода до передачи числового значения в API.
|
|
194
|
+
|
|
190
195
|
Позиция является частью контракта:
|
|
191
196
|
|
|
192
197
|
- `0` означает `planned`;
|
|
@@ -283,16 +288,18 @@ expressionTemplate: "$0 / $1";
|
|
|
283
288
|
|
|
284
289
|
### `formatTableFormulaExpression(expressionTemplate, dependencies)`
|
|
285
290
|
|
|
286
|
-
Чистая функция подставляет ID
|
|
291
|
+
Чистая функция подставляет ID полей и константы в позиции `$n` за один проход:
|
|
287
292
|
|
|
288
293
|
```ts
|
|
289
294
|
import { formatTableFormulaExpression } from "@ryuzaki13/react-foundation-lib/formulas";
|
|
290
295
|
|
|
291
296
|
formatTableFormulaExpression("$0 / $1", ["FIELD_X", "FIELD_Y"]); // "FIELD_X / FIELD_Y"
|
|
292
297
|
formatTableFormulaExpression("$0 / $1", ["FIELD_X"]); // "FIELD_X / $1"
|
|
298
|
+
formatTableFormulaExpression("$0 / $1", ["FIELD_X", { kind: "constant", value: 100 }]); // "FIELD_X / 100"
|
|
299
|
+
formatTableFormulaExpression("$0 - $1", ["FIELD_X", { kind: "constant", value: -2.5 }]); // "FIELD_X - (-2.5)"
|
|
293
300
|
```
|
|
294
301
|
|
|
295
|
-
Повторные вхождения заменяются, `$1` и `$10` различаются.
|
|
302
|
+
Повторные вхождения заменяются, `$1` и `$10` различаются. Незаданный, пустой или некорректный аргумент оставляет исходный маркер; пробелы и специальные символы в ID сохраняются. Отрицательное число отображается в скобках, чтобы сохранить смысл выражения. Подставленные ID не обрабатываются повторно, входной массив не изменяется. Операторы, скобки и остальной текст шаблона не анализируются.
|
|
296
303
|
|
|
297
304
|
Пустая строка возвращается без изменений. Host UI самостоятельно выбирает сообщение для отсутствующего или пустого шаблона и отображает результат как текст.
|
|
298
305
|
|
|
@@ -369,7 +376,7 @@ ctx.key(-1); // undefined
|
|
|
369
376
|
ctx.key(1.5); // undefined
|
|
370
377
|
```
|
|
371
378
|
|
|
372
|
-
Допустим только целый неотрицательный index в пределах массива.
|
|
379
|
+
Допустим только целый неотрицательный index в пределах массива. Для константы `key(index)` возвращает `undefined`: у неё нет ID поля, хотя сама позиция считается прочитанной instrumentation.
|
|
373
380
|
|
|
374
381
|
Пустая строка технически может вернуться из `key`, если она была передана в `keys`, но `value` и `num` считают пустой key отсутствующим. Используйте только непустые dependency ids.
|
|
375
382
|
|
|
@@ -382,7 +389,7 @@ ctx.key(1.5); // undefined
|
|
|
382
389
|
ctx.value(1); // "25"
|
|
383
390
|
```
|
|
384
391
|
|
|
385
|
-
Для неправильного индекса, пустого key или отсутствующего свойства возвращается `undefined`.
|
|
392
|
+
Для константы возвращается непосредственно её числовое значение. Для неправильного индекса, пустого key или отсутствующего свойства возвращается `undefined`.
|
|
386
393
|
|
|
387
394
|
Используйте `value`, когда нужно отличать отсутствующее значение от нуля или применять собственный parser:
|
|
388
395
|
|
|
@@ -426,7 +433,7 @@ context.num(0); // 12.5
|
|
|
426
433
|
context.num(1); // 4
|
|
427
434
|
```
|
|
428
435
|
|
|
429
|
-
`keys
|
|
436
|
+
`keys`, включая значения объектов-констант, копируется при создании context. Изменение исходного массива или объекта константы после вызова не меняет mapping. Некорректная константа приводит к `TypeError` при ручном создании context. `rowData` не копируется: context читает переданный объект.
|
|
430
437
|
|
|
431
438
|
### Instrumentation
|
|
432
439
|
|
|
@@ -766,11 +773,11 @@ type CompileResult = { ok: true; execute: TableFormulaCompiledExecutor } | { ok:
|
|
|
766
773
|
Compiler:
|
|
767
774
|
|
|
768
775
|
- находит formula definition один раз;
|
|
769
|
-
- копирует массив `keys
|
|
776
|
+
- копирует массив `keys` и значения объектов-констант;
|
|
770
777
|
- создаёт один context object;
|
|
771
778
|
- возвращает executor `(rowData) => result`.
|
|
772
779
|
|
|
773
|
-
Изменение исходного массива keys после compile не влияет на executor. Замена активного registry также не меняет уже найденную formula function.
|
|
780
|
+
Изменение исходного массива keys или объекта константы после compile не влияет на executor. Замена активного registry также не меняет уже найденную formula function. При некорректной константе возвращается executor с прежней ошибкой `runtime_error`; форма compile-result не расширяется.
|
|
774
781
|
|
|
775
782
|
### Что происходит при каждом execute
|
|
776
783
|
|
|
@@ -840,7 +847,7 @@ interface TableFormulaDependenciesValidationResult {
|
|
|
840
847
|
Validator:
|
|
841
848
|
|
|
842
849
|
1. ищет formula в активном registry;
|
|
843
|
-
2. проверяет, что каждый dependency id входит в `availableColumnIds
|
|
850
|
+
2. проверяет, что каждый dependency id входит в `availableColumnIds`, а константа содержит конечное число;
|
|
844
851
|
3. запускает formula на положительных synthetic values;
|
|
845
852
|
4. запускает formula на отрицательных synthetic values;
|
|
846
853
|
5. через instrumentation собирает прочитанные indexes;
|
|
@@ -855,6 +862,7 @@ Validator:
|
|
|
855
862
|
| ------------------------------- | ----------------------------------------------------------- |
|
|
856
863
|
| `formula_not_found` | Formula id отсутствует в registry |
|
|
857
864
|
| `dependency_not_available` | Dependency id отсутствует среди доступных колонок |
|
|
865
|
+
| `invalid_constant` | Константа не содержит конечное числовое значение |
|
|
858
866
|
| `dependency_index_out_of_range` | Formula прочитала index, для которого dependency не передан |
|
|
859
867
|
|
|
860
868
|
### Warnings
|
|
@@ -873,7 +881,7 @@ validation.usage.usedDependencyIds; // например ["planned", "actual"]
|
|
|
873
881
|
validation.usage.requiredDependencyCount; // 2
|
|
874
882
|
```
|
|
875
883
|
|
|
876
|
-
`requiredDependencyCount` равен `максимальный использованный index + 1`.
|
|
884
|
+
`requiredDependencyCount` равен `максимальный использованный index + 1`. Константы учитываются в indexes и требуемом количестве аргументов, но отсутствуют в `usedDependencyIds`. Synthetic passes меняют только значения полей; значения констант остаются заданными в конфигурации.
|
|
877
885
|
|
|
878
886
|
Это полезно редактору:
|
|
879
887
|
|
|
@@ -884,7 +892,7 @@ validation.usage.requiredDependencyCount; // 2
|
|
|
884
892
|
|
|
885
893
|
### `availableColumnIds` нужно передавать явно
|
|
886
894
|
|
|
887
|
-
По умолчанию список доступных колонок пуст. Если передать
|
|
895
|
+
По умолчанию список доступных колонок пуст. Если передать аргументы-поля, но не передать `availableColumnIds`, каждое поле будет считаться недоступным. Константы не проверяются на присутствие в этом списке:
|
|
888
896
|
|
|
889
897
|
```ts
|
|
890
898
|
validateTableFormulaDependencies({
|
|
@@ -1217,7 +1225,7 @@ Promise не является конечным number и даст `invalid_resul
|
|
|
1217
1225
|
|
|
1218
1226
|
### Хранить function в JSON
|
|
1219
1227
|
|
|
1220
|
-
Сохраняйте только `formulaId` и dependency ids
|
|
1228
|
+
Сохраняйте только `formulaId` и сериализуемые аргументы: dependency ids и объекты числовых констант. Function определяется доверенным application bundle.
|
|
1221
1229
|
|
|
1222
1230
|
### Путать table formula и row-based formatter
|
|
1223
1231
|
|
|
@@ -1244,6 +1252,7 @@ Promise не является конечным number и даст `invalid_resul
|
|
|
1244
1252
|
| Тип | Назначение |
|
|
1245
1253
|
| ------------------------------------------ | ------------------------------------------ |
|
|
1246
1254
|
| `TableFormulaRowData` | Строка `Record<string, unknown>` |
|
|
1255
|
+
| `TableFormulaDependency` | ID поля либо объект конечной числовой константы |
|
|
1247
1256
|
| `TableFormulaContext` | Методы `key`, `value`, `num` |
|
|
1248
1257
|
| `TableFormulaFn` | Синхронная function `context → number` |
|
|
1249
1258
|
| `TableFormulaDefinition` | Metadata и function одной formula |
|
|
@@ -1270,6 +1279,7 @@ Promise не является конечным number и даст `invalid_resul
|
|
|
1270
1279
|
| `formula_not_found` | error |
|
|
1271
1280
|
| `dependency_index_out_of_range` | error |
|
|
1272
1281
|
| `dependency_not_available` | error |
|
|
1282
|
+
| `invalid_constant` | error |
|
|
1273
1283
|
| `unused_dependencies` | warning |
|
|
1274
1284
|
| `formula_does_not_use_dependencies` | warning |
|
|
1275
1285
|
| `formula_runtime_error` | warning |
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/formulas/registry.ts","../../src/formulas/execute.ts","../../src/formulas/formatTableFormulaExpression.ts","../../src/formulas/validate.ts"],"sourcesContent":["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 { getTableFormulaById } from \"./registry\";\n\nimport type { TableFormulaContext, TableFormulaRowData } from \"./types\";\n\ntype TableFormulaContextInstrumentation = {\n\tonReadIndex?: (index: number) => void;\n\tonOutOfRangeIndex?: (index: number) => void;\n};\n\nfunction toFiniteNumberOrZero(value: unknown): number {\n\tconst normalized = Number(value);\n\treturn Number.isFinite(normalized) ? normalized : 0;\n}\n\nexport function createTableFormulaContext(args: {\n\trowData: TableFormulaRowData;\n\tkeys?: readonly string[];\n\tinstrumentation?: TableFormulaContextInstrumentation;\n}): TableFormulaContext {\n\t// TODO: duplicate createRowBasedFormatterContext src\\shared\\lib\\formatters\\rowBased\\context.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\treturn {\n\t\tkey: readKey,\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: \"formula_not_found\" | \"invalid_result\" | \"runtime_error\";\n\t };\n\nexport type TableFormulaCompiledExecutor = (rowData: TableFormulaRowData) => TableFormulaExecutionResult;\n\ntype CompileTableFormulaResult =\n\t| {\n\t\t\tok: true;\n\t\t\texecute: TableFormulaCompiledExecutor;\n\t }\n\t| {\n\t\t\tok: false;\n\t\t\treason: \"formula_not_found\";\n\t };\n\nexport function compileTableFormula(args: { formulaId: string | undefined; keys?: readonly string[] }): CompileTableFormulaResult {\n\tconst formula = getTableFormulaById(args.formulaId);\n\tif (!formula) {\n\t\treturn { ok: false, reason: \"formula_not_found\" };\n\t}\n\n\tconst keys = [...(args.keys ?? [])];\n\tlet rowDataRef: TableFormulaRowData = {};\n\tconst context: TableFormulaContext = {\n\t\tkey: (index) => (Number.isInteger(index) && index >= 0 && index < keys.length ? keys[index] : undefined),\n\t\tvalue: (index) => {\n\t\t\tif (!Number.isInteger(index) || index < 0 || index >= keys.length) return undefined;\n\t\t\tconst key = keys[index];\n\t\t\tif (!key) return undefined;\n\t\t\treturn rowDataRef[key];\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 key = keys[index];\n\t\t\tif (!key) return 0;\n\t\t\treturn toFiniteNumberOrZero(rowDataRef[key]);\n\t\t}\n\t};\n\n\treturn {\n\t\tok: true,\n\t\texecute: (rowData) => {\n\t\t\trowDataRef = rowData;\n\n\t\t\ttry {\n\t\t\t\tconst value = formula.fn(context);\n\t\t\t\tif (!Number.isFinite(value)) {\n\t\t\t\t\treturn { ok: false, reason: \"invalid_result\" };\n\t\t\t\t}\n\n\t\t\t\treturn { ok: true, value };\n\t\t\t} catch {\n\t\t\t\treturn { ok: false, reason: \"runtime_error\" };\n\t\t\t}\n\t\t}\n\t};\n}\n\nexport function executeTableFormula(args: {\n\tformulaId: string | undefined;\n\trowData: TableFormulaRowData;\n\tkeys?: readonly string[];\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","/**\n * Подставляет ID упорядоченных зависимостей в шаблон превью формулы.\n *\n * Незаданные позиции остаются в виде $n, чтобы редактор мог показывать неполный\n * черновик. Подстановка однопроходная: ID сохраняются буквально, а полученный\n * текст предназначен только для отображения и никогда не исполняется.\n */\nexport function formatTableFormulaExpression(expressionTemplate: string, dependencies: readonly string[]): string {\n\treturn expressionTemplate.replace(/\\$([0-9]+)/g, (placeholder: string, index: string) => {\n\t\tconst dependencyId = dependencies[Number(index)];\n\t\treturn dependencyId === undefined || dependencyId === \"\" ? placeholder : dependencyId;\n\t});\n}\n","import { createTableFormulaContext } from \"./execute\";\nimport { getTableFormulaById } from \"./registry\";\n\ntype ValidationCode =\n\t| \"formula_not_found\"\n\t| \"dependency_index_out_of_range\"\n\t| \"dependency_not_available\"\n\t| \"unused_dependencies\"\n\t| \"formula_does_not_use_dependencies\"\n\t| \"formula_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 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\nexport function validateTableFormulaDependencies(args: {\n\tformulaId: string | undefined;\n\tdependencies?: readonly string[];\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: \"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((dependencyId) => !availableSet.has(dependencyId));\n\tif (missingDependencies.length > 0) {\n\t\terrors.push({\n\t\t\tcode: \"dependency_not_available\",\n\t\t\tmessage: `Не найдены среди доступных полей: ${missingDependencies.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, 100));\n\trunValidationPass(createSampleRowData(dependencies, -100));\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: \"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: \"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: \"unused_dependencies\",\n\t\t\tmessage: `Выбраны, но не используются формулой: ${unusedDependencies.join(\", \")}.`\n\t\t});\n\t}\n\n\tif (runtimeErrorCount > 0) {\n\t\twarnings.push({\n\t\t\tcode: \"formula_runtime_error\",\n\t\t\tmessage: \"На тестовых данных формула завершилась с ошибкой.\"\n\t\t});\n\t}\n\n\tconst usedDependencyIds = sortedUsedIndexes.map((index) => dependencies[index]).filter(Boolean);\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":";AAOA,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;;;AClDA,SAAS,EAAqB,GAAwB;CACrD,IAAM,IAAa,OAAO,CAAK;CAC/B,OAAO,OAAO,SAAS,CAAU,IAAI,IAAa;AACnD;AAEA,SAAgB,EAA0B,GAIlB;CAEvB,IAAM,IAAO,CAAC,GAAI,EAAK,QAAQ,CAAC,CAAE,GAE5B,KAAW,MAAsC;EACtD,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,IAAM,EAAQ,CAAK;EACpB,OACL,OAAO,EAAK,QAAQ;CACrB;CAEA,OAAO;EACN,KAAK;EACL,OAAO;EACP,MAAM,MAAU,EAAqB,EAAU,CAAK,CAAC;CACtD;AACD;AAwBA,SAAgB,EAAoB,GAA8F;CACjI,IAAM,IAAU,EAAoB,EAAK,SAAS;CAClD,IAAI,CAAC,GACJ,OAAO;EAAE,IAAI;EAAO,QAAQ;CAAoB;CAGjD,IAAM,IAAO,CAAC,GAAI,EAAK,QAAQ,CAAC,CAAE,GAC9B,IAAkC,CAAC,GACjC,IAA+B;EACpC,MAAM,MAAW,OAAO,UAAU,CAAK,KAAK,KAAS,KAAK,IAAQ,EAAK,SAAS,EAAK,KAAS,KAAA;EAC9F,QAAQ,MAAU;GACjB,IAAI,CAAC,OAAO,UAAU,CAAK,KAAK,IAAQ,KAAK,KAAS,EAAK,QAAQ;GACnE,IAAM,IAAM,EAAK;GACZ,OACL,OAAO,EAAW;EACnB;EACA,MAAM,MAAU;GACf,IAAI,CAAC,OAAO,UAAU,CAAK,KAAK,IAAQ,KAAK,KAAS,EAAK,QAAQ,OAAO;GAC1E,IAAM,IAAM,EAAK;GAEjB,OADK,IACE,EAAqB,EAAW,EAAI,IAD1B;EAElB;CACD;CAEA,OAAO;EACN,IAAI;EACJ,UAAU,MAAY;GACrB,IAAa;GAEb,IAAI;IACH,IAAM,IAAQ,EAAQ,GAAG,CAAO;IAKhC,OAJK,OAAO,SAAS,CAAK,IAInB;KAAE,IAAI;KAAM;IAAM,IAHjB;KAAE,IAAI;KAAO,QAAQ;IAAiB;GAI/C,QAAQ;IACP,OAAO;KAAE,IAAI;KAAO,QAAQ;IAAgB;GAC7C;EACD;CACD;AACD;AAEA,SAAgB,EAAoB,GAIJ;CAC/B,IAAM,IAAW,EAAoB;EACpC,WAAW,EAAK;EAChB,MAAM,EAAK;CACZ,CAAC;CAKD,OAJK,EAAS,KAIP,EAAS,QAAQ,EAAK,OAAO,IAH5B;EAAE,IAAI;EAAO,QAAQ,EAAS;CAAO;AAI9C;;;AC3HA,SAAgB,EAA6B,GAA4B,GAAyC;CACjH,OAAO,EAAmB,QAAQ,gBAAgB,GAAqB,MAAkB;EACxF,IAAM,IAAe,EAAa,OAAO,CAAK;EAC9C,OAAO,MAAiB,KAAA,KAAa,MAAiB,KAAK,IAAc;CAC1E,CAAC;AACF;;;ACcA,SAAS,EAAc,GAA8B;CACpD,OAAO,CAAC,GAAG,CAAK,CAAC,CAAC,MAAM,GAAM,MAAU,IAAO,CAAK;AACrD;AAEA,SAAS,EAAoB,GAAiC,GAA6C;CAC1G,OAAO,EAAa,QAAiC,GAAK,GAAc,OACvE,EAAI,MAAiB,IAAQ,KAAK,GAC3B,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,MAAiB,CAAC,EAAa,IAAI,CAAY,CAAC;CACjG,AAAI,EAAoB,SAAS,KAChC,EAAO,KAAK;EACX,MAAM;EACN,SAAS,qCAAqC,EAAoB,KAAK,IAAI,EAAE;CAC9E,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,GAAG,CAAC,GACxD,EAAkB,EAAoB,GAAc,IAAI,CAAC;CAEzD,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,IAAI,EAAE;CACjF,CAAC,GAGE,IAAoB,KACvB,EAAS,KAAK;EACb,MAAM;EACN,SAAS;CACV,CAAC;CAGF,IAAM,IAAoB,EAAkB,KAAK,MAAU,EAAa,EAAM,CAAC,CAAC,OAAO,OAAO;CAE9F,OAAO;EACN,IAAI,EAAO,WAAW;EACtB;EACA;EACA,OAAO;GACN,uBAAuB;GACvB;GACA;EACD;CACD;AACD"}
|