@reformer/renderer-json 8.0.0 → 9.0.0-beta.2
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 +87 -0
- package/dist/converter/json-to-render-schema.test.d.ts +1 -0
- package/dist/index-DrpWfdbU.js +51 -0
- package/dist/index.d.ts +11 -4
- package/dist/index.js +546 -153
- package/dist/locale/i18n.d.ts +21 -0
- package/dist/locale/locale-context.d.ts +36 -0
- package/dist/locale/locale-service.d.ts +76 -0
- package/dist/locale/locale-service.test.d.ts +1 -0
- package/dist/locale/use-signal-value.d.ts +15 -0
- package/dist/locale/use-signal-value.test.d.ts +1 -0
- package/dist/operators.d.ts +37 -3
- package/dist/operators.test.d.ts +1 -0
- package/dist/registry/component-registry.d.ts +2 -0
- package/dist/registry/component-registry.test.d.ts +1 -0
- package/dist/registry/constants.d.ts +17 -0
- package/dist/registry/types.d.ts +24 -3
- package/dist/schema/form-schema.schema.json.d.ts +8 -5
- package/dist/schema/index.d.ts +25 -3
- package/dist/validate.d.ts +5 -1
- package/dist/validate.js +1535 -1517
- package/llms.txt +2580 -0
- package/package.json +3 -2
- package/dist/index-BZLcW0SX.js +0 -42
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { LocaleParams } from './locale-service';
|
|
3
|
+
/** Props {@link I18n}. */
|
|
4
|
+
export interface I18nProps {
|
|
5
|
+
/** Ключ сообщения в сервисе локализации. */
|
|
6
|
+
id: string;
|
|
7
|
+
/**
|
|
8
|
+
* Параметры интерполяции/склонения. Значения могут быть сигналами (`$model(...)`) — тогда текст
|
|
9
|
+
* обновляется при их изменении — или литералами.
|
|
10
|
+
*/
|
|
11
|
+
values?: LocaleParams;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Реактивный локализованный текст. Читает {@link LocaleService} из {@link LocaleProvider} (live-смена
|
|
15
|
+
* языка) и разворачивает `values`-сигналы (live-обновление параметров). Если сервис умеет `render` —
|
|
16
|
+
* рендерит rich-контент (markdown/JSX), иначе строку через `resolve`.
|
|
17
|
+
*
|
|
18
|
+
* @param props - {@link I18nProps} (`id` + опциональные `values`).
|
|
19
|
+
* @returns Локализованный `ReactNode`.
|
|
20
|
+
*/
|
|
21
|
+
export declare function I18n({ id, values }: I18nProps): ReactNode;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { LocaleService } from './locale-service';
|
|
3
|
+
/** Props {@link LocaleProvider}. */
|
|
4
|
+
export interface LocaleProviderProps {
|
|
5
|
+
/** Текущий сервис локализации. Смена ссылки (напр. при переключении языка) перерендеривает все `I18n`. */
|
|
6
|
+
service: LocaleService;
|
|
7
|
+
/** Поддерево, в котором `I18n`/`useLocale` видят этот сервис. */
|
|
8
|
+
children: ReactNode;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Провайдер сервиса локализации для реактивного пути. Оберни форму (или её часть) и передавай
|
|
12
|
+
* новый `service` при смене языка — вложенные `I18n` перерисуются без пересборки схемы.
|
|
13
|
+
*
|
|
14
|
+
* @example Переключение языка
|
|
15
|
+
* ```tsx
|
|
16
|
+
* import { LocaleProvider, createLocaleService, JsonFormRenderer } from '@reformer/renderer-json';
|
|
17
|
+
*
|
|
18
|
+
* const services = { ru: createLocaleService(ruTable), en: createLocaleService(enTable) };
|
|
19
|
+
* function App() {
|
|
20
|
+
* const [lang, setLang] = useState<'ru' | 'en'>('ru');
|
|
21
|
+
* return (
|
|
22
|
+
* <LocaleProvider service={services[lang]}>
|
|
23
|
+
* <JsonFormRenderer schema={schema} />
|
|
24
|
+
* </LocaleProvider>
|
|
25
|
+
* );
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare function LocaleProvider({ service, children }: LocaleProviderProps): ReactNode;
|
|
30
|
+
/**
|
|
31
|
+
* Текущий сервис локализации из {@link LocaleProvider}. Без провайдера — fallback-to-key.
|
|
32
|
+
* Используется внутри {@link I18n}; вызывай напрямую для собственного localized-компонента.
|
|
33
|
+
*
|
|
34
|
+
* @returns Активный {@link LocaleService}.
|
|
35
|
+
*/
|
|
36
|
+
export declare function useLocale(): LocaleService;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
/** Параметры для интерполяции/склонения (ICU-values, i18next-values и т.п.). */
|
|
3
|
+
export type LocaleParams = Record<string, unknown>;
|
|
4
|
+
/** Резолвер ключа (+опциональные параметры) в строку. */
|
|
5
|
+
export type LocaleResolver = (key: string, params?: LocaleParams) => string;
|
|
6
|
+
/**
|
|
7
|
+
* Сервис локализации в реестре / контексте. `resolve` обязателен (строковый путь); `render`
|
|
8
|
+
* опционален (rich/markdown-путь через `Trans`/`RichText`); `keys` (если задан — напр., из каталога)
|
|
9
|
+
* включает проверку опечаток ключей на этапе `validateFormSchema`.
|
|
10
|
+
*/
|
|
11
|
+
export interface LocaleService {
|
|
12
|
+
/** Ключ (+params) → локализованная строка (при промахе — сам ключ). Для label/placeholder и fallback `Trans`. */
|
|
13
|
+
resolve: LocaleResolver;
|
|
14
|
+
/**
|
|
15
|
+
* Ключ (+params) → rich-контент (markdown/JSX). Опционален. Используется `Trans`/`RichText`, когда
|
|
16
|
+
* нужен не голый текст, а разметка. Реализуется потребителем (напр. через `react-markdown`).
|
|
17
|
+
*/
|
|
18
|
+
render?(key: string, params?: LocaleParams): ReactNode;
|
|
19
|
+
/** Множество известных ключей. Есть → `validate` ловит `unknown locale key`; нет → проверка мягко пропускается (как для `$model`). */
|
|
20
|
+
keys?: readonly string[];
|
|
21
|
+
}
|
|
22
|
+
/** Дефолтный резолвер: отдаёт сам ключ (fallback-to-key). Применяется, когда сервис не зарегистрирован. */
|
|
23
|
+
export declare const defaultLocaleResolver: LocaleResolver;
|
|
24
|
+
/**
|
|
25
|
+
* Строит {@link LocaleService} из каталога `ключ → строка`. Промах ключа → сам ключ (fallback-to-key,
|
|
26
|
+
* зеркало `createMessageResolver` из `@reformer/cdk`). `keys` каталога включает validate-time проверку
|
|
27
|
+
* опечаток. Смена языка — пересобрать сервис на другом каталоге и передать новый ref в `reg.locale`.
|
|
28
|
+
*
|
|
29
|
+
* @param catalog - Таблица `ключ → локализованная строка`.
|
|
30
|
+
* @returns {@link LocaleService} для `reg.locale(...)`.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```ts
|
|
34
|
+
* import { defineRegistry } from '@reformer/renderer-json';
|
|
35
|
+
* import { createLocaleResolver } from '@reformer/renderer-json';
|
|
36
|
+
*
|
|
37
|
+
* const registry = defineRegistry((reg) => {
|
|
38
|
+
* reg.locale(createLocaleResolver({
|
|
39
|
+
* 'fields.email.label': 'Email',
|
|
40
|
+
* 'fields.email.placeholder': 'you@example.com',
|
|
41
|
+
* }));
|
|
42
|
+
* });
|
|
43
|
+
* // В схеме: componentProps: { label: '$locale(fields.email.label)' }
|
|
44
|
+
* // '$locale(fields.unknown)' при наличии каталога → ошибка на validateFormSchema.
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare function createLocaleResolver(catalog: Record<string, string>): LocaleService;
|
|
48
|
+
/**
|
|
49
|
+
* Строит {@link LocaleService} из таблицы `ключ → (params) => строка` — 0-dependency вариант для
|
|
50
|
+
* параметров и склонения без ICU (стиль `createMessageResolver` из `@reformer/cdk`). Промах ключа →
|
|
51
|
+
* сам ключ. `keys` таблицы включает validate-time проверку опечаток.
|
|
52
|
+
*
|
|
53
|
+
* Для ICU-склонения по CLDR-правилам подключи `intl-messageformat` в СВОЁМ сервисе:
|
|
54
|
+
* `reg.locale({ resolve: (k, p) => new IntlMessageFormat(catalog[k], lng).format(p) as string, keys })`.
|
|
55
|
+
* Для markdown добавь `render` (напр. через `react-markdown`).
|
|
56
|
+
*
|
|
57
|
+
* @param table - Таблица `ключ → (params) => локализованная строка`.
|
|
58
|
+
* @returns {@link LocaleService} для `reg.locale(...)` / `LocaleProvider`.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```ts
|
|
62
|
+
* import { createLocaleService } from '@reformer/renderer-json';
|
|
63
|
+
*
|
|
64
|
+
* const ru = createLocaleService({
|
|
65
|
+
* 'fields.min': (p) => `Минимум ${p?.count} символов`,
|
|
66
|
+
* 'users.count': (p) => {
|
|
67
|
+
* const n = Number(p?.count);
|
|
68
|
+
* const forms = ['пользователь', 'пользователя', 'пользователей'];
|
|
69
|
+
* const idx = n % 10 === 1 && n % 100 !== 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;
|
|
70
|
+
* return `${n} ${forms[idx]}`;
|
|
71
|
+
* },
|
|
72
|
+
* });
|
|
73
|
+
* ru.resolve('fields.min', { count: 3 }); // 'Минимум 3 символов'
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export declare function createLocaleService(table: Record<string, (params?: LocaleParams) => string>): LocaleService;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { LocaleParams } from './locale-service';
|
|
2
|
+
/**
|
|
3
|
+
* Разворачивает значения-сигналы в обычные (читает `.value`), литералы отдаёт как есть. Если сигналов
|
|
4
|
+
* не было — возвращает исходный объект (стабильная ссылка). Pure — тестируется без DOM.
|
|
5
|
+
*/
|
|
6
|
+
export declare function unwrapSignalValues(values?: LocaleParams): LocaleParams | undefined;
|
|
7
|
+
/**
|
|
8
|
+
* Реактивно разворачивает `values`-сигналы. Перерендер компонента при изменении любого сигнала;
|
|
9
|
+
* литералы проходят как есть. Снапшот кэшируется (стабильная ссылка при неизменных значениях) —
|
|
10
|
+
* иначе `useSyncExternalStore` зациклится.
|
|
11
|
+
*
|
|
12
|
+
* @param values - Параметры сообщения (сигналы и/или литералы).
|
|
13
|
+
* @returns Развёрнутые значения для передачи в `LocaleService.resolve/render`.
|
|
14
|
+
*/
|
|
15
|
+
export declare function useSignalValues(values?: LocaleParams): LocaleParams | undefined;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/operators.d.ts
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
* - `"$model(path)"` — путь к полю/массиву модели: лист → `model.signalAt(path)`, массив → `model.<path>`.
|
|
7
7
|
* - `"$component(Name)"` — имя компонента в реестре (`reg.component`).
|
|
8
8
|
* - `"$dataSource(NAME)"` — имя registry-source (`reg.dataSource`): options/itemLabel/константы/loading-компоненты.
|
|
9
|
+
* - `"$fn(name)"` — имя функции в реестре (`reg.fn`): форматтеры/компараторы/itemLabel/обработчики.
|
|
10
|
+
* - `"$locale(key)"` — ключ строки для сервиса локализации (`reg.locale`): резолвится в строку.
|
|
9
11
|
*
|
|
10
12
|
* Схема остаётся чистым JSON (копируется в `.json`, приходит строкой с сервера). Типобезопасность
|
|
11
13
|
* на этапе компиляции даётся template-literal типами ({@link ModelOp} и т.д.) — литерал
|
|
@@ -19,11 +21,15 @@ export type ModelOp = `$model(${string})`;
|
|
|
19
21
|
export type ComponentOp = `$component(${string})`;
|
|
20
22
|
/** Строка-оператор ссылки на registry-source: `` `$dataSource(${name})` ``. */
|
|
21
23
|
export type DataSourceOp = `$dataSource(${string})`;
|
|
24
|
+
/** Строка-оператор ссылки на функцию реестра: `` `$fn(${name})` ``. */
|
|
25
|
+
export type FnOp = `$fn(${string})`;
|
|
26
|
+
/** Строка-оператор ссылки на ключ локализации: `` `$locale(${key})` ``. */
|
|
27
|
+
export type LocaleOp = `$locale(${string})`;
|
|
22
28
|
/** Любой строковый оператор JSON-схемы. */
|
|
23
|
-
export type JsonOperator = ModelOp | ComponentOp | DataSourceOp;
|
|
24
|
-
/** Разобранный оператор: тип + аргумент (
|
|
29
|
+
export type JsonOperator = ModelOp | ComponentOp | DataSourceOp | FnOp | LocaleOp;
|
|
30
|
+
/** Разобранный оператор: тип + аргумент (путь/имя/ключ). */
|
|
25
31
|
export interface ParsedOperator {
|
|
26
|
-
op: 'model' | 'component' | 'dataSource';
|
|
32
|
+
op: 'model' | 'component' | 'dataSource' | 'fn' | 'locale';
|
|
27
33
|
arg: string;
|
|
28
34
|
}
|
|
29
35
|
/**
|
|
@@ -83,3 +89,31 @@ export declare const isComponentOp: (v: unknown) => v is ComponentOp;
|
|
|
83
89
|
* ```
|
|
84
90
|
*/
|
|
85
91
|
export declare const isDataSourceOp: (v: unknown) => v is DataSourceOp;
|
|
92
|
+
/**
|
|
93
|
+
* Type-guard: строка — оператор `"$fn(...)"` (ссылка на функцию реестра).
|
|
94
|
+
*
|
|
95
|
+
* @param v - Проверяемое значение.
|
|
96
|
+
* @returns `true`, если `v` — {@link FnOp}.
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```ts
|
|
100
|
+
* if (isFnOp(props.itemLabel)) {
|
|
101
|
+
* const name = parseOperator(props.itemLabel)!.arg; // 'propertyItemLabel'
|
|
102
|
+
* }
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
export declare const isFnOp: (v: unknown) => v is FnOp;
|
|
106
|
+
/**
|
|
107
|
+
* Type-guard: строка — оператор `"$locale(...)"` (ключ строки для сервиса локализации).
|
|
108
|
+
*
|
|
109
|
+
* @param v - Проверяемое значение.
|
|
110
|
+
* @returns `true`, если `v` — {@link LocaleOp}.
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* ```ts
|
|
114
|
+
* if (isLocaleOp(props.label)) {
|
|
115
|
+
* const key = parseOperator(props.label)!.arg; // 'fields.email.label'
|
|
116
|
+
* }
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
export declare const isLocaleOp: (v: unknown) => v is LocaleOp;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { ComponentRegistry, ComponentMetadata, RegistryBuilder } from './types';
|
|
2
|
+
import { LocaleService } from '../locale/locale-service';
|
|
2
3
|
export declare class ComponentRegistryImpl implements ComponentRegistry {
|
|
3
4
|
private own;
|
|
4
5
|
private parent;
|
|
5
6
|
get(name: string): ComponentMetadata | undefined;
|
|
6
7
|
getDataSource<T = unknown>(name: string): T | undefined;
|
|
8
|
+
getLocale(): LocaleService | undefined;
|
|
7
9
|
has(name: string): boolean;
|
|
8
10
|
names(): string[];
|
|
9
11
|
_set(name: string, metadata: ComponentMetadata): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -15,3 +15,20 @@
|
|
|
15
15
|
* ```
|
|
16
16
|
*/
|
|
17
17
|
export declare const FIELD_WRAPPER = "$fieldWrapper";
|
|
18
|
+
/**
|
|
19
|
+
* Зарезервированный ключ реестра для единственного сервиса локализации.
|
|
20
|
+
*
|
|
21
|
+
* `reg.locale(...)` кладёт сервис под этот ключ; оператор `"$locale(key)"` резолвится через него
|
|
22
|
+
* (`registry.getLocale()`). Ключ намеренно отличается от имени оператора, чтобы `$dataSource`/`$fn`
|
|
23
|
+
* не могли достать сервис локализации по имени.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* import { defineRegistry, createLocaleResolver } from '@reformer/renderer-json';
|
|
28
|
+
*
|
|
29
|
+
* const registry = defineRegistry((reg) => {
|
|
30
|
+
* reg.locale(createLocaleResolver({ 'fields.email.label': 'Email' }));
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare const LOCALE_SERVICE = "$localeService";
|
package/dist/registry/types.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { ComponentType } from 'react';
|
|
2
|
+
import { LocaleResolver, LocaleService } from '../locale/locale-service';
|
|
2
3
|
/**
|
|
3
|
-
* Запись реестра. Хранит
|
|
4
|
+
* Запись реестра. Хранит значение (компонент / dataSource / функцию / сервис локализации) и его роль.
|
|
4
5
|
*
|
|
5
|
-
* @typeParam P - Пропсы компонента (для `
|
|
6
|
+
* @typeParam P - Пропсы компонента (для `component`).
|
|
6
7
|
*
|
|
7
8
|
* @example
|
|
8
9
|
* ```typescript
|
|
@@ -12,7 +13,7 @@ import { ComponentType } from 'react';
|
|
|
12
13
|
*/
|
|
13
14
|
export interface ComponentMetadata<P = any> {
|
|
14
15
|
component: ComponentType<P> | unknown;
|
|
15
|
-
type: 'component' | 'dataSource';
|
|
16
|
+
type: 'component' | 'dataSource' | 'fn' | 'locale';
|
|
16
17
|
description?: string;
|
|
17
18
|
}
|
|
18
19
|
/**
|
|
@@ -32,6 +33,12 @@ export interface ComponentMetadata<P = any> {
|
|
|
32
33
|
export interface ComponentRegistry {
|
|
33
34
|
get(name: string): ComponentMetadata | undefined;
|
|
34
35
|
getDataSource<T = unknown>(name: string): T | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Единственный сервис локализации (для оператора `$locale(key)`), если зарегистрирован через
|
|
38
|
+
* `reg.locale(...)`. Опционален — сторонние реализации `ComponentRegistry` без него продолжают
|
|
39
|
+
* компилироваться; при его отсутствии `$locale` мягко деградирует до самого ключа.
|
|
40
|
+
*/
|
|
41
|
+
getLocale?(): LocaleService | undefined;
|
|
35
42
|
has(name: string): boolean;
|
|
36
43
|
names(): string[];
|
|
37
44
|
}
|
|
@@ -44,6 +51,8 @@ export interface ComponentRegistry {
|
|
|
44
51
|
* reg.component('Input', Input);
|
|
45
52
|
* reg.component('Box', Box);
|
|
46
53
|
* reg.dataSource('LOAN_TYPES', LOAN_TYPES);
|
|
54
|
+
* reg.fn('formatCurrency', formatCurrency);
|
|
55
|
+
* reg.locale(createLocaleResolver({ 'fields.email.label': 'Email' }));
|
|
47
56
|
* });
|
|
48
57
|
* ```
|
|
49
58
|
*/
|
|
@@ -57,4 +66,16 @@ export interface RegistryBuilder {
|
|
|
57
66
|
*/
|
|
58
67
|
component<P>(name: string, component: ComponentType<P>, description?: string): void;
|
|
59
68
|
dataSource<T>(name: string, value: T, description?: string): void;
|
|
69
|
+
/**
|
|
70
|
+
* Зарегистрировать функцию под именем — доступна в схеме как `$fn(name)` (форматтеры,
|
|
71
|
+
* компараторы, `itemLabel`, обработчики). Отдельный от `dataSource` вид: бросает при регистрации,
|
|
72
|
+
* если передана не функция, и `validateFormSchema` отклоняет перепутанные `$fn`/`$dataSource`.
|
|
73
|
+
*/
|
|
74
|
+
fn<F extends (...args: any[]) => any>(name: string, fn: F, description?: string): void;
|
|
75
|
+
/**
|
|
76
|
+
* Зарегистрировать единственный сервис локализации для оператора `$locale(key)`. Принимает
|
|
77
|
+
* {@link LocaleService} (каталог через `createLocaleResolver` — включает validate-time проверку
|
|
78
|
+
* ключей) либо голый резолвер `(key) => string`. Кладётся под зарезервированный ключ `LOCALE_SERVICE`.
|
|
79
|
+
*/
|
|
80
|
+
locale(service: LocaleService | LocaleResolver, description?: string): void;
|
|
60
81
|
}
|
|
@@ -23,11 +23,14 @@ declare const _default: {
|
|
|
23
23
|
"description": "Registry component: \"$component(Name)\". Name is tightened to a registry enum by buildFormSchemaMetaSchema."
|
|
24
24
|
},
|
|
25
25
|
"node": {
|
|
26
|
-
"
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
"$comment": "Discriminated by which operator key is present (array→value→component), mirroring the isArrayNode/isFieldNode/isContainerNode runtime guards. Using oneOf here made ajv (allErrors) report failures against all three branches for any single mistake, burying the real cause; if/then/else surfaces only the relevant branch's errors.",
|
|
27
|
+
"if": { "type": "object", "required": ["array"] },
|
|
28
|
+
"then": { "$ref": "#/definitions/arrayNode" },
|
|
29
|
+
"else": {
|
|
30
|
+
"if": { "type": "object", "required": ["value"] },
|
|
31
|
+
"then": { "$ref": "#/definitions/fieldNode" },
|
|
32
|
+
"else": { "$ref": "#/definitions/containerNode" }
|
|
33
|
+
}
|
|
31
34
|
},
|
|
32
35
|
"fieldNode": {
|
|
33
36
|
"type": "object",
|
package/dist/schema/index.d.ts
CHANGED
|
@@ -38,9 +38,31 @@ export declare function getComponentNames(registry: ComponentRegistry): string[]
|
|
|
38
38
|
*/
|
|
39
39
|
export declare function getDataSourceNames(registry: ComponentRegistry): string[];
|
|
40
40
|
/**
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
41
|
+
* Имена функций реестра (`reg.fn`) — то, что валидно в `$fn(...)`: форматтеры/компараторы/itemLabel/
|
|
42
|
+
* обработчики. Отдельно от {@link getDataSourceNames}, поэтому `validateFormSchema` ловит перепутанные
|
|
43
|
+
* `$fn`/`$dataSource`.
|
|
44
|
+
*
|
|
45
|
+
* @param registry - Реестр (см. {@link defineRegistry}).
|
|
46
|
+
* @returns Массив имён функций.
|
|
47
|
+
*/
|
|
48
|
+
export declare function getFnNames(registry: ComponentRegistry): string[];
|
|
49
|
+
/**
|
|
50
|
+
* Известные ключи локализации сервиса реестра (`reg.locale` с каталогом) — то, что валидно в
|
|
51
|
+
* `$locale(...)`. `undefined`, если сервис не зарегистрирован или задан голым резолвером без `keys`
|
|
52
|
+
* (тогда `validateFormSchema` мягко пропускает проверку ключей, как для `$model`-путей).
|
|
53
|
+
*
|
|
54
|
+
* @param registry - Реестр (см. {@link defineRegistry}).
|
|
55
|
+
* @returns Массив ключей либо `undefined`.
|
|
56
|
+
*/
|
|
57
|
+
export declare function getLocaleKeys(registry: ComponentRegistry): readonly string[] | undefined;
|
|
58
|
+
/**
|
|
59
|
+
* Конкретная мета-схема: базовая + (если заданы `componentNames`) сужение `$component(...)` до
|
|
60
|
+
* enum допустимых значений (`["$component(Input)", "$component(Select)", …]`). `$dataSource`-имена
|
|
61
|
+
* JSON Schema'й не покрыть (вложены в произвольный componentProps) — их проверяет рекурсивный обход
|
|
62
|
+
* в `validateFormSchema`.
|
|
63
|
+
*
|
|
64
|
+
* enum, а не regex-`pattern`: ajv перечисляет допустимые имена в тексте ошибки, IDE даёт
|
|
65
|
+
* автодополнение по значениям, а имена не нужно экранировать под regex (напр. `$fieldWrapper`).
|
|
44
66
|
*
|
|
45
67
|
* @example
|
|
46
68
|
* ```ts
|
package/dist/validate.d.ts
CHANGED
|
@@ -5,11 +5,15 @@ export interface FormSchemaValidationResult {
|
|
|
5
5
|
/** Человекочитаемые ошибки (путь + сообщение). Пусто, если валидно. */
|
|
6
6
|
errors: string[];
|
|
7
7
|
}
|
|
8
|
-
/** Опции: реестр (имена извлекаются автоматически) либо явные списки
|
|
8
|
+
/** Опции: реестр (имена извлекаются автоматически) либо явные списки имён/ключей. */
|
|
9
9
|
export interface ValidateFormSchemaOptions {
|
|
10
10
|
registry?: ComponentRegistry;
|
|
11
11
|
componentNames?: string[];
|
|
12
12
|
dataSourceNames?: string[];
|
|
13
|
+
/** Имена функций `reg.fn` для проверки `$fn(...)`. Не заданы → проверка `$fn`-имён пропускается. */
|
|
14
|
+
fnNames?: string[];
|
|
15
|
+
/** Ключи каталога локализации для проверки `$locale(...)`. Не заданы → проверка ключей пропускается. */
|
|
16
|
+
localeKeys?: readonly string[];
|
|
13
17
|
}
|
|
14
18
|
/**
|
|
15
19
|
* Валидирует form-DSL JSON-схему. Если передан `registry`, имена компонентов/source берутся из него
|