@dpml/core
Version:
DPML Core: Parsing, validation, and transformation for DPML documents
985 lines (984 loc) • 23.7 kB
TypeScript
/**
* 表示DPML文档中的单个节点
* 使用不可变设计,所有属性只读
*/
interface DPMLNode {
/** 节点标签名 */
readonly tagName: string;
/** 节点属性集合 */
readonly attributes: Map<string, string>;
/** 子节点集合 */
readonly children: DPMLNode[];
/** 节点文本内容 */
readonly content: string;
/** 父节点引用 */
readonly parent: DPMLNode | null;
/** 源代码位置信息 */
readonly sourceLocation?: SourceLocation;
}
/**
* 源码定位信息
*/
interface SourceLocation {
/** 开始行号 */
startLine: number;
/** 开始列号 */
startColumn: number;
/** 结束行号 */
endLine: number;
/** 结束列号 */
endColumn: number;
/** 源文件名 */
fileName?: string;
}
/**
* DPML文档类型
* 表示完整DPML文档的纯数据结构
*/
interface DPMLDocument {
/** 文档根节点 */
readonly rootNode: DPMLNode;
/** 节点ID索引,用于快速访问 */
readonly nodesById?: Map<string, DPMLNode>;
/** 文档元数据 */
readonly metadata: DocumentMetadata;
}
/**
* 文档元数据类型
*/
interface DocumentMetadata {
/** 文档标题 */
title?: string;
/** 文档描述 */
description?: string;
/** 创建时间 */
createdAt?: Date;
/** 最后修改时间 */
modifiedAt?: Date;
/** 来源文件名 */
sourceFileName?: string;
/** 用户自定义元数据 */
custom?: Record<string, unknown>;
}
/**
* 解析选项配置类型
* 支持错误处理和验证行为配置
*/
interface ParseOptions {
/** 是否在错误时立即抛出 */
throwOnError?: boolean;
/** 源文件名,用于错误报告 */
fileName?: string;
/** 底层XML解析器选项 */
xmlParserOptions?: XMLParserOptions;
/** 后处理器选项 */
postProcessorOptions?: Record<string, boolean>;
/** 内存优化选项,用于处理大文件 */
memoryOptimization?: MemoryOptimizationOptions;
}
/**
* XML解析器选项
*/
interface XMLParserOptions {
/** 是否保留空白字符 */
preserveWhitespace?: boolean;
/** 是否解析注释 */
parseComments?: boolean;
/** 是否启用命名空间支持 */
enableNamespaces?: boolean;
/** 最大嵌套层级 */
maxDepth?: number;
/** 是否验证节点引用完整性 */
validateReferences?: boolean;
/** 是否解析CDATA部分 */
parseCDATA?: boolean;
/** 是否使用流式处理(用于大文件) */
useStreaming?: boolean;
}
/**
* 内存优化选项
*/
interface MemoryOptimizationOptions {
/** 是否启用内存优化 */
enabled?: boolean;
/** 大文件阈值(字节数),超过此值将应用优化 */
largeFileThreshold?: number;
/** 是否使用流式处理 */
useStreaming?: boolean;
/** 批处理大小 */
batchSize?: number;
}
/**
* 解析错误代码枚举
*/
declare enum ParseErrorCode {
UNKNOWN_ERROR = "PARSE_UNKNOWN_ERROR",
INVALID_CONTENT = "PARSE_INVALID_CONTENT",
XML_SYNTAX_ERROR = "PARSE_XML_SYNTAX_ERROR",
XML_INVALID_TAG = "PARSE_XML_INVALID_TAG",
XML_MISSING_CLOSING_TAG = "PARSE_XML_MISSING_CLOSING_TAG",
XML_INVALID_ATTRIBUTE = "PARSE_XML_INVALID_ATTRIBUTE",
DPML_INVALID_STRUCTURE = "PARSE_DPML_INVALID_STRUCTURE",
DPML_INVALID_TAG = "PARSE_DPML_INVALID_TAG",
DPML_INVALID_ATTRIBUTE = "PARSE_DPML_INVALID_ATTRIBUTE",
DPML_MISSING_REQUIRED_TAG = "PARSE_DPML_MISSING_REQUIRED_TAG",
DPML_MISSING_REQUIRED_ATTRIBUTE = "PARSE_DPML_MISSING_REQUIRED_ATTRIBUTE"
}
/**
* 基础解析错误类
* 所有解析错误的基类
*/
declare class ParseError extends Error {
/**
* 错误代码
*/
readonly code: ParseErrorCode;
/**
* 错误位置信息
*/
readonly position?: SourceLocation;
/**
* 源代码片段
*/
readonly source?: string;
/**
* 原始错误
*/
readonly cause?: unknown;
/**
* 创建解析错误实例
* @param message 错误消息
* @param code 错误代码
* @param position 位置信息
* @param source 源代码片段
* @param cause 原始错误
*/
constructor(message: string, code?: ParseErrorCode, position?: SourceLocation, source?: string, cause?: unknown);
/**
* 格式化错误信息,包含位置和上下文
* @returns 格式化的错误信息
*/
formatMessage(): string;
/**
* 重写toString方法,提供更详细的错误信息
* @returns 格式化的错误字符串
*/
toString(): string;
}
/**
* XML解析错误类
* 处理XML解析过程中的错误
*/
declare class XMLParseError extends ParseError {
/**
* 错误上下文片段
* 包含错误位置附近的内容
*/
contextFragment?: string;
/**
* 创建XML解析错误实例
* @param message 错误消息
* @param code 错误代码
* @param position 位置信息
* @param source 源代码片段
* @param cause 原始错误
*/
constructor(message: string, code?: ParseErrorCode, position?: SourceLocation, source?: string, cause?: unknown);
/**
* 从原始XML解析错误创建XMLParseError
* @param error 原始错误
* @param content XML内容
* @param fileName 文件名
* @returns XML解析错误
*/
static fromError(error: unknown, content?: string, fileName?: string): XMLParseError;
/**
* 从错误消息中提取位置信息
* @param message 错误消息
* @param fileName 文件名
* @returns 源码位置信息或undefined
*/
private static extractPositionFromMessage;
/**
* 从内容中提取源代码片段
* @param content 完整内容
* @param line 行号
* @param column 列号
* @returns 源代码片段
*/
private static extractSourceSnippet;
/**
* 格式化错误信息,包含位置和上下文
* @returns 格式化的错误信息
*/
formatMessage(): string;
}
/**
* DPML解析错误类
* 处理DPML特定的解析错误
*/
declare class DPMLParseError extends ParseError {
/**
* 创建DPML解析错误实例
* @param message 错误消息
* @param code 错误代码
* @param position 位置信息
* @param source 源代码片段
* @param cause 原始错误
*/
constructor(message: string, code?: ParseErrorCode, position?: SourceLocation, source?: string, cause?: unknown);
/**
* 创建缺少必需标签的错误
* @param tagName 标签名
* @param position 位置信息
* @returns DPML解析错误
*/
static createMissingRequiredTagError(tagName: string, position?: SourceLocation): DPMLParseError;
/**
* 创建缺少必需属性的错误
* @param attributeName 属性名
* @param tagName 标签名
* @param position 位置信息
* @returns DPML解析错误
*/
static createMissingRequiredAttributeError(attributeName: string, tagName: string, position?: SourceLocation): DPMLParseError;
/**
* 创建无效标签错误
* @param tagName 标签名
* @param position 位置信息
* @returns DPML解析错误
*/
static createInvalidTagError(tagName: string, position?: SourceLocation): DPMLParseError;
/**
* 创建无效属性错误
* @param attributeName 属性名
* @param tagName 标签名
* @param position 位置信息
* @returns DPML解析错误
*/
static createInvalidAttributeError(attributeName: string, tagName: string, position?: SourceLocation): DPMLParseError;
}
/**
* 解析结果接口
* 用于非抛出错误模式下的返回结构
*/
interface ParseResult<T> {
/**
* 解析是否成功
*/
success: boolean;
/**
* 解析结果数据
* 仅在success为true时存在
*/
data?: T;
/**
* 解析错误
* 仅在success为false时存在
*/
error?: ParseError;
/**
* 警告信息
* 可能在success为true时也存在
*/
warnings?: ParseError[];
}
/**
* 定义用户友好的Schema接口,不包含内部实现细节。
* 应用开发者使用这些接口定义DPML文档的结构。
*/
/**
* 表示元素的属性定义。
*/
interface AttributeSchema {
/**
* 属性的名称。
*/
name: string;
/**
* 属性值的预期类型 (例如:'string', 'number', 'boolean')。
* 如果未指定,可能表示任何类型或需要根据上下文推断。
*/
type?: string;
/**
* 指示此属性是否为必需。
* @default false
*/
required?: boolean;
/**
* 如果属性值是枚举类型,则定义允许的值列表。
*/
enum?: string[];
/**
* 属性值应匹配的正则表达式模式。
*/
pattern?: string;
/**
* 属性的默认值。
*/
default?: string;
}
/**
* 表示元素内容的定义。
*/
interface ContentSchema {
/**
* 内容的类型,可以是'text'(纯文本)或'mixed'(混合内容)。
*/
type: "text" | "mixed";
/**
* 指示内容是否为必需。
* @default false
*/
required?: boolean;
/**
* 内容应匹配的正则表达式模式。
*/
pattern?: string;
}
/**
* 表示对另一个已定义类型的引用。
*/
interface TypeReference {
/**
* 引用的类型名称。
* 这通常对应于DocumentSchema的types数组中定义的ElementSchema的element属性。
*/
$ref: string;
}
/**
* 表示元素可能包含的子元素集合。
*/
interface ChildrenSchema {
/**
* 允许作为子元素的元素列表。
* 每个元素可以是直接的ElementSchema定义,也可以是对其他类型的引用。
*/
elements: (ElementSchema | TypeReference)[];
/**
* 指示子元素的顺序是否重要。
* @default false
*/
orderImportant?: boolean;
/**
* 子元素的最小数量。
*/
min?: number;
/**
* 子元素的最大数量。
*/
max?: number;
}
/**
* 表示元素(Element)的结构定义。
*/
interface ElementSchema {
/**
* 元素的名称(标签名)。
*/
element: string;
/**
* 定义此元素允许或要求的属性。
*/
attributes?: AttributeSchema[];
/**
* 定义此元素允许的内容模型。
*/
content?: ContentSchema;
/**
* 定义此元素允许的子元素。
*/
children?: ChildrenSchema;
}
/**
* 表示文档(Document)级别的结构定义。
*/
interface DocumentSchema {
/**
* 定义文档的根元素。
* 可以是直接的元素定义、类型引用或表示纯文本根的字符串。
*/
root: ElementSchema | TypeReference | string;
/**
* 定义可在本文档内部复用的类型(通常是ElementSchema)。
* 这些类型可以通过TypeReference($ref)在root或其他ElementSchema的children中引用。
*/
types?: ElementSchema[];
/**
* 定义适用于文档内所有元素的全局属性。
*/
globalAttributes?: AttributeSchema[];
/**
* 定义文档可能使用的命名空间。
*/
namespaces?: string[];
}
/**
* Schema类型的联合类型,用于简化API参数类型定义。
*/
type Schema = DocumentSchema | ElementSchema;
/**
* 表示 Schema 验证过程中遇到的错误。
* @template T 可选的泛型,用于携带额外的错误详情。
*/
interface SchemaError<T = unknown> {
/**
* 错误描述信息,应清晰易懂。
*/
message: string;
/**
* 错误代码,用于程序化识别错误类型。
*/
code: string;
/**
* 错误在 Schema 对象中发生的路径。
* 例如: "elements[0].attributes[1].name"
*/
path: string;
/**
* 可选的额外错误详情。
*/
details?: T;
}
/**
* 表示经过处理(验证)后的 Schema 定义结果。
* @template T 原始 Schema 对象的类型。
*/
interface ProcessedSchema<T extends object> {
/**
* 用户提供的原始 Schema 对象。
*/
schema: T;
/**
* 指示 Schema 定义是否有效(是否通过了所有验证规则)。
*/
isValid: boolean;
/**
* 如果 Schema 无效 (isValid 为 false),则包含一个或多个 SchemaError 对象。
* 如果 Schema 有效,则此属性为 undefined。
*/
errors?: SchemaError[];
}
/**
* 引用映射接口
* 提供文档中ID到节点的映射关系
*/
interface ReferenceMap {
/**
* ID到节点的映射
*/
readonly idMap: ReadonlyMap<string, DPMLNode>;
}
/**
* 处理错误接口
* 表示文档处理过程中的错误信息
*/
interface ProcessingError {
/**
* 错误代码
*/
readonly code: string;
/**
* 错误消息
*/
readonly message: string;
/**
* 文档路径
*/
readonly path: string;
/**
* 源代码位置信息
*/
readonly source: SourceLocation;
/**
* 错误的严重程度
*/
readonly severity: "error";
}
/**
* 处理警告接口
* 表示文档处理过程中的警告信息
*/
interface ProcessingWarning {
/**
* 警告代码
*/
readonly code: string;
/**
* 警告消息
*/
readonly message: string;
/**
* 文档路径
*/
readonly path: string;
/**
* 源代码位置信息
*/
readonly source: SourceLocation;
/**
* 警告的严重程度
*/
readonly severity: "warning";
}
/**
* 验证结果接口
* 包含文档验证结果的详细信息
*/
interface ValidationResult {
/**
* 是否通过验证
*/
readonly isValid: boolean;
/**
* 验证过程中发现的错误
*/
readonly errors: ReadonlyArray<ProcessingError>;
/**
* 验证过程中发现的警告
*/
readonly warnings: ReadonlyArray<ProcessingWarning>;
}
/**
* 处理结果接口,包含解析和处理后的数据
*/
interface ProcessingResult {
/**
* DPML文档对象
*/
document: DPMLDocument;
/**
* 文档有效性标志
*/
isValid: boolean;
/**
* 文档引用关系映射
*/
references?: ReferenceMap;
/**
* 文档schema信息
*/
schema?: unknown;
/**
* 验证结果详情
*/
validation?: ValidationResult;
}
/**
* 处理上下文接口
* 提供处理过程中的核心上下文信息
*/
interface ProcessingContext {
/**
* 正在处理的DPML文档
*/
readonly document: DPMLDocument;
/**
* 用于验证的已处理Schema
*/
readonly schema: ProcessedSchema<any>;
}
/**
* 转换上下文类,负责在转换过程中维护状态
* 提供类型安全的数据访问方法
*/
declare class TransformContext {
/**
* 存储上下文数据的内部Map
*/
private data;
/**
* 原始处理结果引用
*/
private processingResult;
/**
* 创建上下文实例
* @param processingResult 原始处理结果
* @param initialData 可选的初始数据
*/
constructor(processingResult: ProcessingResult, initialData?: Record<string, unknown>);
/**
* 类型安全的数据存储
* @template T 值的类型
* @param key 存储键
* @param value 存储值
*/
set<T>(key: string, value: T): void;
/**
* 类型安全的数据获取
* @template T 期望的返回类型
* @param key 获取键
* @returns 获取的值,若不存在则返回undefined
*/
get<T>(key: string): T | undefined;
/**
* 检查键是否存在
* @param key 检查键
* @returns 是否存在
*/
has(key: string): boolean;
/**
* 获取原始文档
* @returns 文档对象
*/
getDocument(): DPMLDocument;
/**
* 获取引用关系
* @returns 引用映射
*/
getReferences(): ReferenceMap | undefined;
/**
* 获取验证结果
* @returns 验证结果对象
*/
getValidation(): ValidationResult;
/**
* 检查文档有效性
* @returns 是否有效
*/
isDocumentValid(): boolean;
/**
* 获取所有结果
* @returns 所有存储的数据
*/
getAllResults(): Record<string, unknown>;
}
/**
* Transformer接口定义,所有转换器实现此接口
* 支持泛型输入输出类型,确保类型安全
* @template TInput 输入数据类型
* @template TOutput 输出数据类型
*/
interface Transformer<
TInput,
TOutput
> {
/**
* 转换器名称,用于标识
*/
name: string;
/**
* 转换器描述,说明功能(可选)
*/
description?: string;
/**
* 执行转换的核心方法
* @param input 输入数据,类型为TInput
* @param context 转换上下文
* @returns 转换后的输出,类型为TOutput
*/
transform(input: TInput, context: TransformContext): TOutput;
}
/**
* 转换选项接口,配置转换过程
*/
interface TransformOptions {
/**
* 初始上下文数据
* 在转换开始前注入到上下文中
*/
context?: Record<string, unknown>;
/**
* 结果模式选择
* - 'full': 返回完整结果,包括transformers、merged和raw
* - 'merged': 仅返回merged部分
* - 'raw': 仅返回raw部分
*/
resultMode?: "full" | "merged" | "raw";
/**
* 包含的转换器
* 如果提供,只有指定的转换器结果会被包含在最终结果中
*/
include?: string[];
/**
* 排除的转换器
* 如果提供,指定的转换器结果会被排除在最终结果外
*/
exclude?: string[];
}
/**
* 转换结果接口,定义转换输出的标准结构
* 支持泛型指定结果类型
*/
interface TransformResult<T> {
/**
* 各转换器的结果映射
* 键为转换器名称,值为对应转换器的输出
*/
transformers: Record<string, unknown>;
/**
* 合并后的结果
* 类型为用户指定的泛型参数T
*/
merged: T;
/**
* 原始未处理的结果
* 通常是最后一个转换器的直接输出
*/
raw?: unknown;
/**
* 转换过程中的警告
*/
warnings?: TransformWarning[];
/**
* 转换元数据信息
*/
metadata: TransformMetadata;
}
/**
* 转换警告接口
*/
interface TransformWarning {
/**
* 警告代码
*/
code: string;
/**
* 警告消息
*/
message: string;
/**
* 相关转换器
*/
transformer?: string;
/**
* 警告严重程度
*/
severity: "low" | "medium" | "high";
}
/**
* 转换元数据接口
*/
interface TransformMetadata {
/**
* 参与转换的转换器名称列表
*/
transformers: string[];
/**
* 转换选项
*/
options: TransformOptions;
/**
* 转换时间戳
*/
timestamp: number;
/**
* 执行时间(毫秒)
*/
executionTime?: number;
}
/**
* 映射规则接口,用于结构映射
* 支持泛型定义输入值和输出值类型
*/
interface MappingRule<
TValue,
TResult
> {
/**
* CSS选择器,定位元素
*/
selector: string;
/**
* 目标属性路径
* 描述映射结果在目标对象中的位置
* 例如:"parameters.temperature"
*/
targetPath: string;
/**
* 可选值转换函数
* 对提取的值进行转换处理
* @param value 从选择器提取的原始值
* @returns 转换后的值
*/
transform?: (value: TValue) => TResult;
}
/**
* 收集配置接口,用于聚合转换器
*/
interface CollectorConfig {
/**
* CSS选择器,定位要收集的元素
*/
selector: string;
/**
* 分组字段
* 如果提供,结果将按此字段分组
* 通常是属性名或可以从元素提取的值
*/
groupBy?: string;
/**
* 排序字段
* 如果提供,结果将按此字段排序
* 通常是属性名或可以从元素提取的值
*/
sortBy?: string;
}
/**
* 关系配置接口,用于关系处理转换器
*/
interface RelationConfig {
/**
* 源选择器或属性
* 定义关系的源端点
*/
source: string;
/**
* 目标选择器或属性
* 定义关系的目标端点
*/
target: string;
/**
* 关系类型
* 可选的关系类型描述
*/
type?: string;
}
/**
* 语义提取器接口,用于语义提取转换器
* 支持泛型元素处理和结果类型
*/
interface SemanticExtractor<
TElement,
TResult
> {
/**
* 提取器名称,用于标识
*/
name: string;
/**
* CSS选择器,定位要处理的元素
*/
selector: string;
/**
* 处理函数,处理提取的元素
* @param elements 提取的元素数组
* @returns 处理结果
*/
processor: (elements: TElement[]) => TResult;
}
/**
* 转换器定义器接口,提供创建各种类型转换器的能力
*/
interface TransformerDefiner {
/**
* 定义结构映射转换器
* @param name 转换器名称
* @param rules 映射规则数组
* @returns 结构映射转换器实例
*/
defineStructuralMapper<
TInput,
TOutput
>(name: string, rules: Array<MappingRule<unknown, unknown>>): Transformer<TInput, TOutput>;
/**
* 定义聚合转换器
* @param name 转换器名称
* @param config 收集配置
* @returns 聚合转换器实例
*/
defineAggregator<
TInput,
TOutput
>(name: string, config: CollectorConfig): Transformer<TInput, TOutput>;
/**
* 定义模板转换器
* @param name 转换器名称
* @param template 模板字符串或函数
* @param preprocessor 可选的数据预处理函数
* @returns 模板转换器实例
*/
defineTemplateTransformer<TInput>(name: string, template: string | ((data: unknown) => string), preprocessor?: (input: TInput) => unknown): Transformer<TInput, string>;
/**
* 定义关系处理转换器
* @param name 转换器名称
* @param nodeSelector 节点选择器
* @param config 关系配置
* @returns 关系处理转换器实例
*/
defineRelationProcessor<
TInput,
TOutput
>(name: string, nodeSelector: string, config: RelationConfig): Transformer<TInput, TOutput>;
/**
* 定义语义提取转换器
* @param name 转换器名称
* @param extractors 提取器数组
* @returns 语义提取转换器实例
*/
defineSemanticExtractor<
TInput,
TOutput
>(name: string, extractors: Array<SemanticExtractor<unknown, unknown>>): Transformer<TInput, TOutput>;
/**
* 定义结果收集转换器
* @param name 转换器名称
* @param transformerNames 可选的转换器名称数组,用于选择性收集
* @returns 结果收集转换器实例
*/
defineResultCollector<TOutput>(name: string, transformerNames?: string[]): Transformer<unknown, TOutput>;
}
/**
* 解析服务模块
* 解析DPML内容字符串,协调适配器和错误处理
*
* @param content DPML内容字符串
* @param options 解析选项
* @returns 解析后的DPML文档
*/
declare function parse<T = DPMLDocument>(content: string, options?: ParseOptions): T | ParseResult<T>;
/**
* 异步解析DPML内容
*
* @param content DPML内容字符串
* @param options 解析选项
* @returns 解析后的DPML文档Promise
*/
declare function parseAsync<T = DPMLDocument>(content: string, options?: ParseOptions): Promise<T | ParseResult<T>>;
/**
* 处理文档
* 基于提供的Schema验证文档,并提供验证结果和引用信息
*
* @param document - 要处理的DPML文档
* @param schema - 用于验证的已处理Schema
* @returns 处理结果,包含验证信息和引用映射
*
* @example
* const result = processDocument(document, schema);
* if (result.validation.isValid) {
* // 文档有效,可以继续处理
* } else {
* // 处理验证错误
* result.validation.errors.forEach(error => console.error(error.message));
* }
*/
declare function processDocument<T extends ProcessingResult = ProcessingResult>(document: DPMLDocument, schema: ProcessedSchema<any>): T;
/**
* Schema 模块服务层。
* 负责协调 Schema 处理流程,例如创建 Schema 业务类实例并调用其方法。
* @param schema 用户提供的原始 Schema 对象。
* @returns 处理后的 Schema 结果。
* @template T 原始 Schema 对象的类型,默认为UserSchema。
* @template R 处理结果的类型,默认为 ProcessedSchema<T>。
* 注意:这是一个骨架函数,具体逻辑将在后续任务中实现。
*/
declare function processSchema<
T extends object = Schema,
R extends ProcessedSchema<T> = ProcessedSchema<T>
>(schema: T): R;
/**
* 执行转换过程,返回结果
* @param processingResult 处理结果
* @param options 转换选项
* @returns 转换结果,类型由泛型参数T指定
*/
declare function transform<T>(processingResult: ProcessingResult, options?: TransformOptions): TransformResult<T>;
/**
* 注册自定义转换器
* @param transformer 要注册的转换器
*/
declare function registerTransformer<
TInput,
TOutput
>(transformer: Transformer<TInput, TOutput>): void;
export { transform, registerTransformer, processSchema, processDocument, parseAsync, parse, XMLParserOptions, XMLParseError, ValidationResult, TypeReference, TransformerDefiner, Transformer, TransformWarning, TransformResult, TransformOptions, TransformMetadata, TransformContext, SourceLocation, SemanticExtractor, SchemaError, Schema, RelationConfig, ReferenceMap, ProcessingWarning, ProcessingResult, ProcessingError, ProcessingContext, ProcessedSchema, ParseResult, ParseOptions, ParseErrorCode, ParseError, MemoryOptimizationOptions, MappingRule, ElementSchema, DocumentSchema, DocumentMetadata, DPMLParseError, DPMLNode, DPMLDocument, ContentSchema, CollectorConfig, ChildrenSchema, AttributeSchema };