@ryuzaki13/react-foundation-lib 2.27.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 +10 -0
- package/dist/formulas/formatTableFormulaExpression.d.ts.map +1 -0
- package/dist/formulas/index.d.ts +1 -0
- package/dist/formulas/index.d.ts.map +1 -1
- package/dist/formulas/index.js +2 -190
- package/dist/formulas/isTableFormulaDependency.d.ts +4 -0
- package/dist/formulas/isTableFormulaDependency.d.ts.map +1 -0
- package/dist/formulas/types.d.ts +13 -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 +54 -13
- 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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type TableFormulaDependency } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Подставляет ID полей и числовые константы в шаблон превью формулы.
|
|
4
|
+
*
|
|
5
|
+
* Незаданные позиции остаются в виде $n, чтобы редактор мог показывать неполный
|
|
6
|
+
* черновик. Подстановка однопроходная: ID сохраняются буквально, а полученный
|
|
7
|
+
* текст предназначен только для отображения и никогда не исполняется.
|
|
8
|
+
*/
|
|
9
|
+
export declare function formatTableFormulaExpression(expressionTemplate: string, dependencies: readonly TableFormulaDependency[]): string;
|
|
10
|
+
//# sourceMappingURL=formatTableFormulaExpression.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/formulas/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,mBAAmB,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/formulas/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,mBAAmB,SAAS,CAAC"}
|
package/dist/formulas/index.js
CHANGED
|
@@ -1,190 +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/validate.ts
|
|
113
|
-
function l(e) {
|
|
114
|
-
return [...e].sort((e, t) => e - t);
|
|
115
|
-
}
|
|
116
|
-
function u(e, t) {
|
|
117
|
-
return e.reduce((e, n, r) => (e[n] = (r + 1) * t, e), {});
|
|
118
|
-
}
|
|
119
|
-
function d(e) {
|
|
120
|
-
let t = [], n = [], r = i(e.formulaId), a = [...e.dependencies ?? []], s = e.availableColumnIds ?? [];
|
|
121
|
-
if (!r) return t.push({
|
|
122
|
-
code: "formula_not_found",
|
|
123
|
-
message: "Формула не найдена в реестре."
|
|
124
|
-
}), {
|
|
125
|
-
ok: !1,
|
|
126
|
-
errors: t,
|
|
127
|
-
warnings: n,
|
|
128
|
-
usage: {
|
|
129
|
-
usedDependencyIndexes: [],
|
|
130
|
-
usedDependencyIds: [],
|
|
131
|
-
requiredDependencyCount: 0
|
|
132
|
-
}
|
|
133
|
-
};
|
|
134
|
-
let c = new Set(s), d = a.filter((e) => !c.has(e));
|
|
135
|
-
d.length > 0 && t.push({
|
|
136
|
-
code: "dependency_not_available",
|
|
137
|
-
message: `Не найдены среди доступных полей: ${d.join(", ")}.`
|
|
138
|
-
});
|
|
139
|
-
let f = /* @__PURE__ */ new Set(), p = /* @__PURE__ */ new Set(), m = 0, h = (e) => {
|
|
140
|
-
try {
|
|
141
|
-
let t = o({
|
|
142
|
-
rowData: e,
|
|
143
|
-
keys: a,
|
|
144
|
-
instrumentation: {
|
|
145
|
-
onReadIndex: (e) => {
|
|
146
|
-
f.add(e);
|
|
147
|
-
},
|
|
148
|
-
onOutOfRangeIndex: (e) => {
|
|
149
|
-
p.add(e);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
});
|
|
153
|
-
r.fn(t);
|
|
154
|
-
} catch {
|
|
155
|
-
m += 1;
|
|
156
|
-
}
|
|
157
|
-
};
|
|
158
|
-
h(u(a, 100)), h(u(a, -100));
|
|
159
|
-
let g = l(f), _ = g.length > 0 ? g[g.length - 1] + 1 : 0;
|
|
160
|
-
p.size > 0 && t.push({
|
|
161
|
-
code: "dependency_index_out_of_range",
|
|
162
|
-
message: `Формула обращается к несуществующим индексам. Минимально требуется зависимостей: ${_}, выбрано: ${a.length}.`
|
|
163
|
-
}), g.length === 0 && n.push({
|
|
164
|
-
code: "formula_does_not_use_dependencies",
|
|
165
|
-
message: "Формула не использует dependencies."
|
|
166
|
-
});
|
|
167
|
-
let v = a.filter((e, t) => !f.has(t));
|
|
168
|
-
v.length > 0 && n.push({
|
|
169
|
-
code: "unused_dependencies",
|
|
170
|
-
message: `Выбраны, но не используются формулой: ${v.join(", ")}.`
|
|
171
|
-
}), m > 0 && n.push({
|
|
172
|
-
code: "formula_runtime_error",
|
|
173
|
-
message: "На тестовых данных формула завершилась с ошибкой."
|
|
174
|
-
});
|
|
175
|
-
let y = g.map((e) => a[e]).filter(Boolean);
|
|
176
|
-
return {
|
|
177
|
-
ok: t.length === 0,
|
|
178
|
-
errors: t,
|
|
179
|
-
warnings: n,
|
|
180
|
-
usage: {
|
|
181
|
-
usedDependencyIndexes: g,
|
|
182
|
-
usedDependencyIds: y,
|
|
183
|
-
requiredDependencyCount: _
|
|
184
|
-
}
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
//#endregion
|
|
188
|
-
export { s as compileTableFormula, n as configureTableFormulaRegistry, o as createTableFormulaContext, e as createTableFormulaRegistry, c as executeTableFormula, i as getTableFormulaById, r as getTableFormulaList, d as validateTableFormulaDependencies };
|
|
189
|
-
|
|
190
|
-
//# 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;
|
|
@@ -9,6 +20,8 @@ export interface TableFormulaDefinition {
|
|
|
9
20
|
id: string;
|
|
10
21
|
name: string;
|
|
11
22
|
description: string;
|
|
23
|
+
/** Шаблон превью с позициями $n; описывает выражение для человека и не участвует в выполнении fn. */
|
|
24
|
+
expressionTemplate?: string;
|
|
12
25
|
args?: readonly string[];
|
|
13
26
|
keywords?: readonly string[];
|
|
14
27
|
fn: TableFormulaFn;
|
|
@@ -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,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
|
данные строки + упорядоченные зависимости
|
|
@@ -45,6 +45,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
|
|
|
45
45
|
|
|
46
46
|
- описывает типизированный контракт числовой формулы;
|
|
47
47
|
- связывает dependency indexes с полями текущей строки;
|
|
48
|
+
- формирует текстовое превью выражения с ID выбранных зависимостей;
|
|
48
49
|
- создаёт нормализованный реестр формул host-приложения;
|
|
49
50
|
- хранит один активный реестр в текущем экземпляре модуля;
|
|
50
51
|
- выполняет формулы без выбрасывания их runtime-ошибок наружу;
|
|
@@ -81,6 +82,7 @@ import {
|
|
|
81
82
|
executeTableFormula,
|
|
82
83
|
getTableFormulaById,
|
|
83
84
|
getTableFormulaList,
|
|
85
|
+
formatTableFormulaExpression,
|
|
84
86
|
validateTableFormulaDependencies
|
|
85
87
|
} from "@ryuzaki13/react-foundation-lib/formulas";
|
|
86
88
|
|
|
@@ -179,12 +181,17 @@ const rowData = {
|
|
|
179
181
|
|
|
180
182
|
### Зависимости и keys
|
|
181
183
|
|
|
182
|
-
Dependencies — упорядоченный массив id
|
|
184
|
+
Dependencies — упорядоченный массив аргументов. Строка обозначает id поля, объект — конечную числовую константу:
|
|
183
185
|
|
|
184
186
|
```ts
|
|
185
|
-
|
|
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 }];
|
|
186
191
|
```
|
|
187
192
|
|
|
193
|
+
`keys: ["planned", { kind: "constant", value: 100 }]` передаёт в `$0` значение поля, а в `$1` число `100`. Поля и константы можно смешивать, повторять и переставлять; константа не становится полем строки. Ноль, отрицательные и дробные числа допустимы. Строковый `"100"` обозначает ID поля, а не число. `NaN` и бесконечности отклоняются validator-ом; при исполнении дают `runtime_error`. Редактор отвечает за разбор пользовательского ввода до передачи числового значения в API.
|
|
194
|
+
|
|
188
195
|
Позиция является частью контракта:
|
|
189
196
|
|
|
190
197
|
- `0` означает `planned`;
|
|
@@ -222,6 +229,7 @@ interface TableFormulaDefinition {
|
|
|
222
229
|
id: string;
|
|
223
230
|
name: string;
|
|
224
231
|
description: string;
|
|
232
|
+
expressionTemplate?: string;
|
|
225
233
|
args?: readonly string[];
|
|
226
234
|
keywords?: readonly string[];
|
|
227
235
|
fn: TableFormulaFn;
|
|
@@ -266,6 +274,35 @@ description: "100 * $0 / ($0 + $1)";
|
|
|
266
274
|
|
|
267
275
|
Factory trim-ит строку, но не анализирует выражение. `$0`, `$1` — только принятая человеком нотация документации, а не parser syntax.
|
|
268
276
|
|
|
277
|
+
### `expressionTemplate`
|
|
278
|
+
|
|
279
|
+
Необязательный шаблон компактного превью. В отличие от `description`, он содержит только отображаемое выражение:
|
|
280
|
+
|
|
281
|
+
```ts
|
|
282
|
+
expressionTemplate: "$0 / $1";
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
Индекс `$n` соответствует позиции в упорядоченном списке зависимостей. Шаблон сохраняется буквально; registry, execution и validation не требуют его наличия. Ранее объявленные definitions без этого поля сохраняют прежний контракт.
|
|
286
|
+
|
|
287
|
+
Шаблон служит описанием основной операции для человека. Он не заменяет `fn`, не исполняется и не обязан воспроизводить все защитные ветвления функции, например возврат нуля при нулевом делителе. За соответствие шаблона операции отвечает автор definition.
|
|
288
|
+
|
|
289
|
+
### `formatTableFormulaExpression(expressionTemplate, dependencies)`
|
|
290
|
+
|
|
291
|
+
Чистая функция подставляет ID полей и константы в позиции `$n` за один проход:
|
|
292
|
+
|
|
293
|
+
```ts
|
|
294
|
+
import { formatTableFormulaExpression } from "@ryuzaki13/react-foundation-lib/formulas";
|
|
295
|
+
|
|
296
|
+
formatTableFormulaExpression("$0 / $1", ["FIELD_X", "FIELD_Y"]); // "FIELD_X / FIELD_Y"
|
|
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)"
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
Повторные вхождения заменяются, `$1` и `$10` различаются. Незаданный, пустой или некорректный аргумент оставляет исходный маркер; пробелы и специальные символы в ID сохраняются. Отрицательное число отображается в скобках, чтобы сохранить смысл выражения. Подставленные ID не обрабатываются повторно, входной массив не изменяется. Операторы, скобки и остальной текст шаблона не анализируются.
|
|
303
|
+
|
|
304
|
+
Пустая строка возвращается без изменений. Host UI самостоятельно выбирает сообщение для отсутствующего или пустого шаблона и отображает результат как текст.
|
|
305
|
+
|
|
269
306
|
### `args`
|
|
270
307
|
|
|
271
308
|
Необязательные подписи positional arguments:
|
|
@@ -339,7 +376,7 @@ ctx.key(-1); // undefined
|
|
|
339
376
|
ctx.key(1.5); // undefined
|
|
340
377
|
```
|
|
341
378
|
|
|
342
|
-
Допустим только целый неотрицательный index в пределах массива.
|
|
379
|
+
Допустим только целый неотрицательный index в пределах массива. Для константы `key(index)` возвращает `undefined`: у неё нет ID поля, хотя сама позиция считается прочитанной instrumentation.
|
|
343
380
|
|
|
344
381
|
Пустая строка технически может вернуться из `key`, если она была передана в `keys`, но `value` и `num` считают пустой key отсутствующим. Используйте только непустые dependency ids.
|
|
345
382
|
|
|
@@ -352,7 +389,7 @@ ctx.key(1.5); // undefined
|
|
|
352
389
|
ctx.value(1); // "25"
|
|
353
390
|
```
|
|
354
391
|
|
|
355
|
-
Для неправильного индекса, пустого key или отсутствующего свойства возвращается `undefined`.
|
|
392
|
+
Для константы возвращается непосредственно её числовое значение. Для неправильного индекса, пустого key или отсутствующего свойства возвращается `undefined`.
|
|
356
393
|
|
|
357
394
|
Используйте `value`, когда нужно отличать отсутствующее значение от нуля или применять собственный parser:
|
|
358
395
|
|
|
@@ -396,7 +433,7 @@ context.num(0); // 12.5
|
|
|
396
433
|
context.num(1); // 4
|
|
397
434
|
```
|
|
398
435
|
|
|
399
|
-
`keys
|
|
436
|
+
`keys`, включая значения объектов-констант, копируется при создании context. Изменение исходного массива или объекта константы после вызова не меняет mapping. Некорректная константа приводит к `TypeError` при ручном создании context. `rowData` не копируется: context читает переданный объект.
|
|
400
437
|
|
|
401
438
|
### Instrumentation
|
|
402
439
|
|
|
@@ -736,11 +773,11 @@ type CompileResult = { ok: true; execute: TableFormulaCompiledExecutor } | { ok:
|
|
|
736
773
|
Compiler:
|
|
737
774
|
|
|
738
775
|
- находит formula definition один раз;
|
|
739
|
-
- копирует массив `keys
|
|
776
|
+
- копирует массив `keys` и значения объектов-констант;
|
|
740
777
|
- создаёт один context object;
|
|
741
778
|
- возвращает executor `(rowData) => result`.
|
|
742
779
|
|
|
743
|
-
Изменение исходного массива keys после compile не влияет на executor. Замена активного registry также не меняет уже найденную formula function.
|
|
780
|
+
Изменение исходного массива keys или объекта константы после compile не влияет на executor. Замена активного registry также не меняет уже найденную formula function. При некорректной константе возвращается executor с прежней ошибкой `runtime_error`; форма compile-result не расширяется.
|
|
744
781
|
|
|
745
782
|
### Что происходит при каждом execute
|
|
746
783
|
|
|
@@ -810,7 +847,7 @@ interface TableFormulaDependenciesValidationResult {
|
|
|
810
847
|
Validator:
|
|
811
848
|
|
|
812
849
|
1. ищет formula в активном registry;
|
|
813
|
-
2. проверяет, что каждый dependency id входит в `availableColumnIds
|
|
850
|
+
2. проверяет, что каждый dependency id входит в `availableColumnIds`, а константа содержит конечное число;
|
|
814
851
|
3. запускает formula на положительных synthetic values;
|
|
815
852
|
4. запускает formula на отрицательных synthetic values;
|
|
816
853
|
5. через instrumentation собирает прочитанные indexes;
|
|
@@ -825,6 +862,7 @@ Validator:
|
|
|
825
862
|
| ------------------------------- | ----------------------------------------------------------- |
|
|
826
863
|
| `formula_not_found` | Formula id отсутствует в registry |
|
|
827
864
|
| `dependency_not_available` | Dependency id отсутствует среди доступных колонок |
|
|
865
|
+
| `invalid_constant` | Константа не содержит конечное числовое значение |
|
|
828
866
|
| `dependency_index_out_of_range` | Formula прочитала index, для которого dependency не передан |
|
|
829
867
|
|
|
830
868
|
### Warnings
|
|
@@ -843,7 +881,7 @@ validation.usage.usedDependencyIds; // например ["planned", "actual"]
|
|
|
843
881
|
validation.usage.requiredDependencyCount; // 2
|
|
844
882
|
```
|
|
845
883
|
|
|
846
|
-
`requiredDependencyCount` равен `максимальный использованный index + 1`.
|
|
884
|
+
`requiredDependencyCount` равен `максимальный использованный index + 1`. Константы учитываются в indexes и требуемом количестве аргументов, но отсутствуют в `usedDependencyIds`. Synthetic passes меняют только значения полей; значения констант остаются заданными в конфигурации.
|
|
847
885
|
|
|
848
886
|
Это полезно редактору:
|
|
849
887
|
|
|
@@ -854,7 +892,7 @@ validation.usage.requiredDependencyCount; // 2
|
|
|
854
892
|
|
|
855
893
|
### `availableColumnIds` нужно передавать явно
|
|
856
894
|
|
|
857
|
-
По умолчанию список доступных колонок пуст. Если передать
|
|
895
|
+
По умолчанию список доступных колонок пуст. Если передать аргументы-поля, но не передать `availableColumnIds`, каждое поле будет считаться недоступным. Константы не проверяются на присутствие в этом списке:
|
|
858
896
|
|
|
859
897
|
```ts
|
|
860
898
|
validateTableFormulaDependencies({
|
|
@@ -1035,7 +1073,7 @@ app composition / registries
|
|
|
1035
1073
|
- TypeScript проверяет написанные definitions;
|
|
1036
1074
|
- обычные unit-tests видят функцию напрямую.
|
|
1037
1075
|
|
|
1038
|
-
`description`
|
|
1076
|
+
`description` и `expressionTemplate` могут содержать формулу для человека, но runtime выполняет только `fn`, заранее включённую разработчиком в registry.
|
|
1039
1077
|
|
|
1040
1078
|
### Доверенный код всё равно требует дисциплины
|
|
1041
1079
|
|
|
@@ -1187,7 +1225,7 @@ Promise не является конечным number и даст `invalid_resul
|
|
|
1187
1225
|
|
|
1188
1226
|
### Хранить function в JSON
|
|
1189
1227
|
|
|
1190
|
-
Сохраняйте только `formulaId` и dependency ids
|
|
1228
|
+
Сохраняйте только `formulaId` и сериализуемые аргументы: dependency ids и объекты числовых констант. Function определяется доверенным application bundle.
|
|
1191
1229
|
|
|
1192
1230
|
### Путать table formula и row-based formatter
|
|
1193
1231
|
|
|
@@ -1204,6 +1242,7 @@ Promise не является конечным number и даст `invalid_resul
|
|
|
1204
1242
|
| `configureTableFormulaRegistry` | Установить активный registry | Полностью заменяет module-level registry |
|
|
1205
1243
|
| `getTableFormulaList` | Получить ordered catalog | Возвращает тот же readonly list |
|
|
1206
1244
|
| `getTableFormulaById` | Найти definition | Trim id; `undefined` для пустого/неизвестного |
|
|
1245
|
+
| `formatTableFormulaExpression` | Подставить ID в шаблон превью | Сохраняет незаполненные `$n`; не исполняет выражение |
|
|
1207
1246
|
| `compileTableFormula` | Подготовить reusable executor | Фиксирует formula и копирует keys |
|
|
1208
1247
|
| `executeTableFormula` | Compile + один execute | Возвращает controlled result, не бросает formula error |
|
|
1209
1248
|
| `validateTableFormulaDependencies` | Проверить mapping dependencies | Дважды исполняет formula на synthetic data |
|
|
@@ -1213,6 +1252,7 @@ Promise не является конечным number и даст `invalid_resul
|
|
|
1213
1252
|
| Тип | Назначение |
|
|
1214
1253
|
| ------------------------------------------ | ------------------------------------------ |
|
|
1215
1254
|
| `TableFormulaRowData` | Строка `Record<string, unknown>` |
|
|
1255
|
+
| `TableFormulaDependency` | ID поля либо объект конечной числовой константы |
|
|
1216
1256
|
| `TableFormulaContext` | Методы `key`, `value`, `num` |
|
|
1217
1257
|
| `TableFormulaFn` | Синхронная function `context → number` |
|
|
1218
1258
|
| `TableFormulaDefinition` | Metadata и function одной formula |
|
|
@@ -1239,6 +1279,7 @@ Promise не является конечным number и даст `invalid_resul
|
|
|
1239
1279
|
| `formula_not_found` | error |
|
|
1240
1280
|
| `dependency_index_out_of_range` | error |
|
|
1241
1281
|
| `dependency_not_available` | error |
|
|
1282
|
+
| `invalid_constant` | error |
|
|
1242
1283
|
| `unused_dependencies` | warning |
|
|
1243
1284
|
| `formula_does_not_use_dependencies` | warning |
|
|
1244
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/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","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":"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"}
|