@ryuzaki13/react-foundation-lib 2.29.0 → 2.30.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/README.md +1 -0
- package/dist/value-transformers/execute.d.ts +16 -0
- package/dist/value-transformers/execute.d.ts.map +1 -0
- package/dist/value-transformers/index.d.ts +4 -0
- package/dist/value-transformers/index.d.ts.map +1 -0
- package/dist/value-transformers/index.js +69 -0
- package/dist/value-transformers/index.js.map +1 -0
- package/dist/value-transformers/registry.d.ts +15 -0
- package/dist/value-transformers/registry.d.ts.map +1 -0
- package/dist/value-transformers/types.d.ts +32 -0
- package/dist/value-transformers/types.d.ts.map +1 -0
- package/package.json +5 -1
- package/src/value-transformers/README.md +56 -0
package/README.md
CHANGED
|
@@ -125,6 +125,7 @@ npm run pack:dry-run
|
|
|
125
125
|
| `/form` | [`form/README.mdx`](./src/form/README.mdx) |
|
|
126
126
|
| `/formatters` | [`formatters/README.mdx`](./src/formatters/README.mdx) и его предметные README |
|
|
127
127
|
| `/formulas` | [`formulas/README.mdx`](./src/formulas/README.mdx) |
|
|
128
|
+
| `/value-transformers` | [Преобразования числовых значений](./src/value-transformers/README.md) |
|
|
128
129
|
| `/hooks` | [`hooks/README.mdx`](./src/hooks/README.mdx) |
|
|
129
130
|
| `/http` | [`http/README.mdx`](./src/http/README.mdx) |
|
|
130
131
|
| `/media` | [`media/README.mdx`](./src/media/README.mdx) |
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type ValueTransformerCompileResult, type ValueTransformerExecutionResult } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Фиксирует доверенную функцию один раз для многократной обработки значений.
|
|
4
|
+
*
|
|
5
|
+
* Вход и результат не приводятся к числу и не заменяются значением по умолчанию:
|
|
6
|
+
* parsing и правила пустых данных принадлежат самой функции преобразования.
|
|
7
|
+
*/
|
|
8
|
+
export declare function compileValueTransformer(args: {
|
|
9
|
+
transformerId: string | undefined;
|
|
10
|
+
}): ValueTransformerCompileResult;
|
|
11
|
+
/** Разовый запуск через активный реестр; для строк таблицы предпочтительна предварительная компиляция. */
|
|
12
|
+
export declare function executeValueTransformer(args: {
|
|
13
|
+
transformerId: string | undefined;
|
|
14
|
+
value: unknown;
|
|
15
|
+
}): ValueTransformerExecutionResult;
|
|
16
|
+
//# sourceMappingURL=execute.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/value-transformers/execute.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,6BAA6B,EAAE,KAAK,+BAA+B,EAAE,MAAM,SAAS,CAAC;AAEnG;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAAE,aAAa,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,6BAA6B,CAelH;AAED,0GAA0G;AAC1G,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAAE,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,+BAA+B,CAGpI"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { compileValueTransformer, executeValueTransformer } from "./execute";
|
|
2
|
+
export { configureValueTransformerRegistry, createValueTransformerRegistry, getValueTransformerById, getValueTransformerList, type ValueTransformerRegistry } from "./registry";
|
|
3
|
+
export { type ValueTransformerCompiledExecutor, type ValueTransformerCompileResult, type ValueTransformerDefinition, type ValueTransformerExecutionResult, type ValueTransformerFn } from "./types";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/value-transformers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EACN,iCAAiC,EACjC,8BAA8B,EAC9B,uBAAuB,EACvB,uBAAuB,EACvB,KAAK,wBAAwB,EAC7B,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,KAAK,gCAAgC,EACrC,KAAK,6BAA6B,EAClC,KAAK,0BAA0B,EAC/B,KAAK,+BAA+B,EACpC,KAAK,kBAAkB,EACvB,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
//#region src/value-transformers/registry.ts
|
|
2
|
+
function e(e) {
|
|
3
|
+
let t = /* @__PURE__ */ new Map(), n = [];
|
|
4
|
+
for (let r of e) {
|
|
5
|
+
let e = r.id.trim();
|
|
6
|
+
if (!e) throw Error("ID преобразования значения не может быть пустым.");
|
|
7
|
+
if (t.has(e)) throw Error(`Найден дублирующийся transformerId: ${e}.`);
|
|
8
|
+
let i = Object.freeze({
|
|
9
|
+
...r,
|
|
10
|
+
id: e,
|
|
11
|
+
name: r.name.trim(),
|
|
12
|
+
description: r.description.trim(),
|
|
13
|
+
...r.keywords === void 0 ? {} : { keywords: Object.freeze([...r.keywords]) }
|
|
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
|
+
return n ? t.byId.get(n) : void 0;
|
|
32
|
+
}
|
|
33
|
+
//#endregion
|
|
34
|
+
//#region src/value-transformers/execute.ts
|
|
35
|
+
function a(e) {
|
|
36
|
+
let t = i(e.transformerId);
|
|
37
|
+
if (!t) return {
|
|
38
|
+
ok: !1,
|
|
39
|
+
reason: "transformer_not_found"
|
|
40
|
+
};
|
|
41
|
+
let n = t.fn;
|
|
42
|
+
return {
|
|
43
|
+
ok: !0,
|
|
44
|
+
execute: (e) => {
|
|
45
|
+
try {
|
|
46
|
+
return {
|
|
47
|
+
ok: !0,
|
|
48
|
+
value: n(e)
|
|
49
|
+
};
|
|
50
|
+
} catch {
|
|
51
|
+
return {
|
|
52
|
+
ok: !1,
|
|
53
|
+
reason: "runtime_error"
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function o(e) {
|
|
60
|
+
let t = a(e);
|
|
61
|
+
return t.ok ? t.execute(e.value) : {
|
|
62
|
+
ok: !1,
|
|
63
|
+
reason: t.reason
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//#endregion
|
|
67
|
+
export { a as compileValueTransformer, n as configureValueTransformerRegistry, e as createValueTransformerRegistry, o as executeValueTransformer, i as getValueTransformerById, r as getValueTransformerList };
|
|
68
|
+
|
|
69
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/value-transformers/registry.ts","../../src/value-transformers/execute.ts"],"sourcesContent":["import { type ValueTransformerDefinition } from \"./types\";\n\nexport type ValueTransformerRegistry = Readonly<{\n\tlist: readonly ValueTransformerDefinition[];\n\tbyId: ReadonlyMap<string, ValueTransformerDefinition>;\n}>;\n\n/** Создаёт независимый каталог с устойчивыми ID и неизменяемыми метаданными. */\nexport function createValueTransformerRegistry(definitions: readonly ValueTransformerDefinition[]): ValueTransformerRegistry {\n\tconst byId = new Map<string, ValueTransformerDefinition>();\n\tconst list: ValueTransformerDefinition[] = [];\n\n\tfor (const definition of definitions) {\n\t\tconst id = definition.id.trim();\n\t\tif (!id) throw new Error(\"ID преобразования значения не может быть пустым.\");\n\t\tif (byId.has(id)) throw new Error(`Найден дублирующийся transformerId: ${id}.`);\n\n\t\tconst normalizedDefinition: ValueTransformerDefinition = Object.freeze({\n\t\t\t...definition,\n\t\t\tid,\n\t\t\tname: definition.name.trim(),\n\t\t\tdescription: definition.description.trim(),\n\t\t\t...(definition.keywords === undefined ? {} : { keywords: Object.freeze([...definition.keywords]) })\n\t\t});\n\t\tbyId.set(id, normalizedDefinition);\n\t\tlist.push(normalizedDefinition);\n\t}\n\n\treturn Object.freeze({ list: Object.freeze(list), byId });\n}\n\nlet valueTransformerRegistry = createValueTransformerRegistry([]);\n\n/**\n * Устанавливает каталог host-приложения до первого чтения или компиляции.\n * Библиотека предоставляет механизм и не регистрирует прикладные преобразования.\n */\nexport function configureValueTransformerRegistry(registry: ValueTransformerRegistry): void {\n\tvalueTransformerRegistry = registry;\n}\n\nexport function getValueTransformerList(): readonly ValueTransformerDefinition[] {\n\treturn valueTransformerRegistry.list;\n}\n\nexport function getValueTransformerById(transformerId: string | undefined): ValueTransformerDefinition | undefined {\n\tconst id = transformerId?.trim();\n\treturn id ? valueTransformerRegistry.byId.get(id) : undefined;\n}\n","import { getValueTransformerById } from \"./registry\";\nimport { type ValueTransformerCompileResult, type ValueTransformerExecutionResult } from \"./types\";\n\n/**\n * Фиксирует доверенную функцию один раз для многократной обработки значений.\n *\n * Вход и результат не приводятся к числу и не заменяются значением по умолчанию:\n * parsing и правила пустых данных принадлежат самой функции преобразования.\n */\nexport function compileValueTransformer(args: { transformerId: string | undefined }): ValueTransformerCompileResult {\n\tconst definition = getValueTransformerById(args.transformerId);\n\tif (!definition) return { ok: false, reason: \"transformer_not_found\" };\n\tconst fn = definition.fn;\n\n\treturn {\n\t\tok: true,\n\t\texecute: (value) => {\n\t\t\ttry {\n\t\t\t\treturn { ok: true, value: fn(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\n/** Разовый запуск через активный реестр; для строк таблицы предпочтительна предварительная компиляция. */\nexport function executeValueTransformer(args: { transformerId: string | undefined; value: unknown }): ValueTransformerExecutionResult {\n\tconst compiled = compileValueTransformer(args);\n\treturn compiled.ok ? compiled.execute(args.value) : { ok: false, reason: compiled.reason };\n}\n"],"mappings":";AAQA,SAAgB,EAA+B,GAA8E;CAC5H,IAAM,oBAAO,IAAI,IAAwC,GACnD,IAAqC,CAAC;CAE5C,KAAK,IAAM,KAAc,GAAa;EACrC,IAAM,IAAK,EAAW,GAAG,KAAK;EAC9B,IAAI,CAAC,GAAI,MAAU,MAAM,kDAAkD;EAC3E,IAAI,EAAK,IAAI,CAAE,GAAG,MAAU,MAAM,uCAAuC,EAAG,EAAE;EAE9E,IAAM,IAAmD,OAAO,OAAO;GACtE,GAAG;GACH;GACA,MAAM,EAAW,KAAK,KAAK;GAC3B,aAAa,EAAW,YAAY,KAAK;GACzC,GAAI,EAAW,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU,OAAO,OAAO,CAAC,GAAG,EAAW,QAAQ,CAAC,EAAE;EAClG,CAAC;EAED,AADA,EAAK,IAAI,GAAI,CAAoB,GACjC,EAAK,KAAK,CAAoB;CAC/B;CAEA,OAAO,OAAO,OAAO;EAAE,MAAM,OAAO,OAAO,CAAI;EAAG;CAAK,CAAC;AACzD;AAEA,IAAI,IAA2B,EAA+B,CAAC,CAAC;AAMhE,SAAgB,EAAkC,GAA0C;CAC3F,IAA2B;AAC5B;AAEA,SAAgB,IAAiE;CAChF,OAAO,EAAyB;AACjC;AAEA,SAAgB,EAAwB,GAA2E;CAClH,IAAM,IAAK,GAAe,KAAK;CAC/B,OAAO,IAAK,EAAyB,KAAK,IAAI,CAAE,IAAI,KAAA;AACrD;;;ACvCA,SAAgB,EAAwB,GAA4E;CACnH,IAAM,IAAa,EAAwB,EAAK,aAAa;CAC7D,IAAI,CAAC,GAAY,OAAO;EAAE,IAAI;EAAO,QAAQ;CAAwB;CACrE,IAAM,IAAK,EAAW;CAEtB,OAAO;EACN,IAAI;EACJ,UAAU,MAAU;GACnB,IAAI;IACH,OAAO;KAAE,IAAI;KAAM,OAAO,EAAG,CAAK;IAAE;GACrC,QAAQ;IACP,OAAO;KAAE,IAAI;KAAO,QAAQ;IAAgB;GAC7C;EACD;CACD;AACD;AAGA,SAAgB,EAAwB,GAA8F;CACrI,IAAM,IAAW,EAAwB,CAAI;CAC7C,OAAO,EAAS,KAAK,EAAS,QAAQ,EAAK,KAAK,IAAI;EAAE,IAAI;EAAO,QAAQ,EAAS;CAAO;AAC1F"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ValueTransformerDefinition } from "./types";
|
|
2
|
+
export type ValueTransformerRegistry = Readonly<{
|
|
3
|
+
list: readonly ValueTransformerDefinition[];
|
|
4
|
+
byId: ReadonlyMap<string, ValueTransformerDefinition>;
|
|
5
|
+
}>;
|
|
6
|
+
/** Создаёт независимый каталог с устойчивыми ID и неизменяемыми метаданными. */
|
|
7
|
+
export declare function createValueTransformerRegistry(definitions: readonly ValueTransformerDefinition[]): ValueTransformerRegistry;
|
|
8
|
+
/**
|
|
9
|
+
* Устанавливает каталог host-приложения до первого чтения или компиляции.
|
|
10
|
+
* Библиотека предоставляет механизм и не регистрирует прикладные преобразования.
|
|
11
|
+
*/
|
|
12
|
+
export declare function configureValueTransformerRegistry(registry: ValueTransformerRegistry): void;
|
|
13
|
+
export declare function getValueTransformerList(): readonly ValueTransformerDefinition[];
|
|
14
|
+
export declare function getValueTransformerById(transformerId: string | undefined): ValueTransformerDefinition | undefined;
|
|
15
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/value-transformers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAE1D,MAAM,MAAM,wBAAwB,GAAG,QAAQ,CAAC;IAC/C,IAAI,EAAE,SAAS,0BAA0B,EAAE,CAAC;IAC5C,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;CACtD,CAAC,CAAC;AAEH,gFAAgF;AAChF,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,SAAS,0BAA0B,EAAE,GAAG,wBAAwB,CAqB3H;AAID;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI,CAE1F;AAED,wBAAgB,uBAAuB,IAAI,SAAS,0BAA0B,EAAE,CAE/E;AAED,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,0BAA0B,GAAG,SAAS,CAGjH"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Синхронное преобразование одного исходного значения в числовое значение.
|
|
3
|
+
*
|
|
4
|
+
* Функция владеет разбором входа и решением для пустых или ошибочных данных.
|
|
5
|
+
* Runtime сохраняет её результат буквально, включая null и undefined.
|
|
6
|
+
*/
|
|
7
|
+
export type ValueTransformerFn = (value: unknown) => number | null | undefined;
|
|
8
|
+
/** Метаданные доверенной функции; прикладной каталог определяет host-приложение. */
|
|
9
|
+
export type ValueTransformerDefinition = Readonly<{
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
description: string;
|
|
13
|
+
keywords?: readonly string[];
|
|
14
|
+
fn: ValueTransformerFn;
|
|
15
|
+
}>;
|
|
16
|
+
/** Ошибка механизма отделена от значения, которое решила вернуть сама функция. */
|
|
17
|
+
export type ValueTransformerExecutionResult = {
|
|
18
|
+
ok: true;
|
|
19
|
+
value: number | null | undefined;
|
|
20
|
+
} | {
|
|
21
|
+
ok: false;
|
|
22
|
+
reason: "transformer_not_found" | "runtime_error";
|
|
23
|
+
};
|
|
24
|
+
export type ValueTransformerCompiledExecutor = (value: unknown) => ValueTransformerExecutionResult;
|
|
25
|
+
export type ValueTransformerCompileResult = {
|
|
26
|
+
ok: true;
|
|
27
|
+
execute: ValueTransformerCompiledExecutor;
|
|
28
|
+
} | {
|
|
29
|
+
ok: false;
|
|
30
|
+
reason: "transformer_not_found";
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/value-transformers/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;AAE/E,oFAAoF;AACpF,MAAM,MAAM,0BAA0B,GAAG,QAAQ,CAAC;IACjD,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,EAAE,EAAE,kBAAkB,CAAC;CACvB,CAAC,CAAC;AAEH,kFAAkF;AAClF,MAAM,MAAM,+BAA+B,GAC1C;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,uBAAuB,GAAG,eAAe,CAAA;CAAE,CAAC;AAEnH,MAAM,MAAM,gCAAgC,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,+BAA+B,CAAC;AAEnG,MAAM,MAAM,6BAA6B,GACxC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,gCAAgC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,uBAAuB,CAAA;CAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ryuzaki13/react-foundation-lib",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.30.0",
|
|
4
4
|
"description": "Reusable React and TypeScript foundation utilities, hooks, and primitives.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Ryuzaki13",
|
|
@@ -217,6 +217,10 @@
|
|
|
217
217
|
"types": "./dist/validators/index.d.ts",
|
|
218
218
|
"import": "./dist/validators/index.js"
|
|
219
219
|
},
|
|
220
|
+
"./value-transformers": {
|
|
221
|
+
"types": "./dist/value-transformers/index.d.ts",
|
|
222
|
+
"import": "./dist/value-transformers/index.js"
|
|
223
|
+
},
|
|
220
224
|
"./virtualizer": {
|
|
221
225
|
"types": "./dist/virtualizer/index.d.ts",
|
|
222
226
|
"import": "./dist/virtualizer/index.js"
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Преобразования числовых значений
|
|
2
|
+
|
|
3
|
+
Публичный subpath `@ryuzaki13/react-foundation-lib/value-transformers` предоставляет реестр и синхронное исполнение доверенных функций одного аргумента. Прикладные определения принадлежат host-приложению; встроенного каталога операций или единиц измерения нет.
|
|
4
|
+
|
|
5
|
+
## Контракт функции
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import { type ValueTransformerDefinition } from "@ryuzaki13/react-foundation-lib/value-transformers";
|
|
9
|
+
|
|
10
|
+
const definition: ValueTransformerDefinition = {
|
|
11
|
+
id: "double",
|
|
12
|
+
name: "Удвоение",
|
|
13
|
+
description: "Удваивает числовое значение; остальные входы оставляет без результата.",
|
|
14
|
+
fn: (value) => (typeof value === "number" ? value * 2 : undefined)
|
|
15
|
+
};
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
`ValueTransformerFn` принимает `unknown` и возвращает `number | null | undefined`. Функция сама определяет разбор строк, допустимые типы, конечность числа и поведение при пустых или ошибочных данных. Механизм не вызывает `Number`, не подставляет `0` и не меняет результат функции, включая `null`, `undefined`, `NaN` или `Infinity`. Эти правила не наследуются от табличных формул или display-форматтеров.
|
|
19
|
+
|
|
20
|
+
Функция должна работать синхронно. Вход передаётся буквально и не копируется: определение не должно изменять объекты строки, Query cache или внешнее состояние. Асинхронные функции и строковые результаты не входят в TypeScript-контракт.
|
|
21
|
+
|
|
22
|
+
## Реестр
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
import { configureValueTransformerRegistry, createValueTransformerRegistry } from "@ryuzaki13/react-foundation-lib/value-transformers";
|
|
26
|
+
|
|
27
|
+
const registry = createValueTransformerRegistry([definition]);
|
|
28
|
+
configureValueTransformerRegistry(registry);
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Host устанавливает каталог в composition root до чтения или компиляции. `createValueTransformerRegistry` сохраняет порядок определений, удаляет внешние пробелы в `id`, `name` и `description`, отклоняет пустой и повторный ID. Registry object, список, определения и независимые копии `keywords` заморожены; индекс представлен `ReadonlyMap`.
|
|
32
|
+
|
|
33
|
+
`getValueTransformerList()` возвращает текущий readonly-список. `getValueTransformerById(id)` удаляет внешние пробелы в ID и возвращает `undefined` для пустого или неизвестного ID. Создание каталога не устанавливает его автоматически; `configureValueTransformerRegistry` полностью заменяет активный каталог данного экземпляра модуля.
|
|
34
|
+
|
|
35
|
+
## Исполнение
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
import { compileValueTransformer, executeValueTransformer } from "@ryuzaki13/react-foundation-lib/value-transformers";
|
|
39
|
+
|
|
40
|
+
executeValueTransformer({ transformerId: "double", value: 3 });
|
|
41
|
+
// { ok: true, value: 6 }
|
|
42
|
+
|
|
43
|
+
const compiled = compileValueTransformer({ transformerId: "double" });
|
|
44
|
+
if (compiled.ok) {
|
|
45
|
+
compiled.execute(3); // { ok: true, value: 6 }
|
|
46
|
+
compiled.execute(null); // { ok: true, value: undefined } — решение fn из примера
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Разовый `executeValueTransformer` использует активный каталог. Для повторной обработки строк `compileValueTransformer` фиксирует функцию один раз: замена исходного определения или активного registry не меняет уже созданный executor.
|
|
51
|
+
|
|
52
|
+
Compile-result: `{ ok: true, execute } | { ok: false, reason: "transformer_not_found" }`.
|
|
53
|
+
|
|
54
|
+
Execution-result: `{ ok: true, value: number | null | undefined } | { ok: false, reason: "transformer_not_found" | "runtime_error" }`. Неизвестный ID даёт `transformer_not_found`; исключение функции — `runtime_error`. Ошибка не содержит исходное значение и не превращается в успешный результат по умолчанию. Потребитель отвечает за контекст диагностики и отображение ошибки.
|
|
55
|
+
|
|
56
|
+
Модуль не читает поля строки, не строит граф зависимостей и не материализует колонки. Потребитель выбирает исходное поле, передаёт его значение и записывает успешный результат в принадлежащую ему модель до исполнения зависимых формул. Сериализуемая конфигурация хранит стабильный ID преобразования, а функция остаётся доверенным кодом приложения.
|