import { BookElements, LevelBookElements, BookElement, BookElementProps, BookElementSchema, BookItem, Primitive, ElementNamespace } from '@bookbox/core'; /** * Метка старта элемента. Нужна только для проставления символа начала области элемента */ export type BookStartMark = { __start: string; props: BookElementProps; }; export type BookStart = >>(elem: T) => BookStartMark; /** * Метка конца элемента. Нужна только для проставления символа конца области элемента */ export type BookEndMark = { __end: string; props: BookElementProps; }; export type BookEnd = >>(elem: T) => BookEndMark; export type BookRawItem = Primitive | BookElementRawSchema | BookStartMark | BookEndMark | BookResult; export type BookElementRawSchema = Omit & { children: BookRawItem[]; }; export type BookRawSchema = (BookRawItem | BookElementApi>)[]; export type BookRawFlatSchema = (BookItem | BookStartMark | BookEndMark | BookResult)[]; export type GetSchema = (...children: BookRawSchema | [TemplateStringsArray, ...BookRawSchema]) => Omit & { children: BookRawItem[]; }; export type BookResult = { schema: S; }; export type BookCreator = (text: TemplateStringsArray, ...elements: BookRawSchema) => BookResult; type AddTemplate = T extends string ? T | TemplateStringsArray | [TemplateStringsArray, ...any[]] : T; export type BookElementApi> = { [K in keyof El['props']]-?: (value?: AddTemplate) => BookElementApi>>; } & GetSchema; export type Api>> = { [Name in keyof ElementsRecord]: BookElementApi; }; export type LevelApi>> = { [Name in keyof ElementsRecord as Name extends `${string}.${infer X}` ? X : Name]: BookElementApi; }; export declare const LevelApiNameList: ElementNamespace[]; export declare const LevelApiNameSet: Set; export type LevelElementsApi = { format: LevelApi>; web: LevelApi>; }; type Rename = S extends `${infer X}.${infer Y}` ? `${X}_${Rename}` : S; type Recover = S extends `${infer X}_${infer Y}` ? `${X}.${Recover}` : S; type PreparingBookElements = { [K in keyof BookElements extends `${infer X}` ? Rename : never]: BookElements[Recover]; }; /** * api for elements */ export type ElementsApi = Api & LevelElementsApi; /** * api helpers */ export interface UtilApi { start: BookStart; end: BookEnd; book: BookCreator & { root: BookCreator; }; } export type BookApi = ElementsApi & UtilApi; export {};