/** * URI Resolver Implementation * * 统一的 URI 生成和解析 * 整合了 Subject URI 和 Object/Link URI 的解析逻辑 * * 设计原则: * - 无状态,所有需要的上下文都通过参数传入 * - 显式 subjectTemplate 定义 local key 如何映射到 URI * - 省略 subjectTemplate 时进入 exact-id 模式:id 已经是 base-relative resource id */ import type { PodTable, PodColumnBase } from '../schema'; import type { UriResolver, UriContext, ResourceMode, ParsedSubject } from './types'; /** * URI 解析器实现 * * 无状态设计:所有上下文信息通过参数传入 */ export declare class UriResolverImpl implements UriResolver { private podUrl; constructor(podUrl?: string); setPodUrl(podUrl: string): void; /** * 解析 subject URI * @param table 表定义 * @param record 记录数据 * @param index 可选的行索引 * @param options.strict 是否严格模式(默认 true)。false 时允许部分解析,用于查询场景 */ resolveSubject(table: PodTable, record: Record, index?: number, options?: { strict?: boolean; }): string; parseSubject(uri: string, table: PodTable): ParsedSubject | null; getResourceUrl(subjectUri: string): string; /** * 判断资源模式 */ getResourceMode(table: PodTable): ResourceMode; /** * 获取 exact-id 模式下的内部恒等模板。 * 该值不写回 table.config.subjectTemplate,也不代表业务 schema 显式声明了模板。 */ getDefaultPattern(_table: PodTable): string; resolveInlineChild(parentSubject: string, columnName: string, value: Record, index: number): string; isSingleton(table: PodTable): boolean; /** * 解析 link 列的值为完整 URI * * @param value 原始值(可能是 UUID、相对路径或完整 URI) * @param column 列定义(包含 link 配置) * @param context 解析上下文(包含 tableRegistry 等) */ resolveLink(value: string, column: PodColumnBase, context?: UriContext): string; isAbsoluteUri(value: string): boolean; isLinkColumn(column: PodColumnBase | any): boolean; findTargetTable(column: PodColumnBase | any, context?: UriContext): PodTable | undefined; /** * 从链接 URI 中提取 ID * * 用于读取时将完整 URI 转换回简单 ID * * @param uri 完整的 URI (如 http://pod/.data/chat/chat-123/index.ttl#this) * @param column 链接列定义 * @param context URI 上下文(包含表注册表) * @returns 提取的 ID (如 chat-123),如果无法解析则返回原 URI */ extractLinkId(uri: string, column: PodColumnBase | any, context?: UriContext): string; /** * 从表获取基础 URL 和可选 subjectTemplate 信息。 * 没有 subjectTemplate 时,调用方应按 exact-id 直接拼接 base-relative id。 */ private getTableUriInfo; /** * 构建完整 URI */ private buildFullUri; private buildTemplateRecord; private resolveTemplateVariable; private assertNoUnresolvedTemplate; /** * 获取有效的 pattern */ private getEffectivePattern; /** * 获取 Subject base URL * 简化版:统一使用 table.config.base */ private getSubjectBaseUrl; private isBaseRelativeSubjectId; private acceptsFragmentOnlyResourceId; private resolveBaseRelativeSubjectId; /** * 将路径转换为绝对 URL */ private toAbsoluteUrl; /** * 合并 base 和 pattern */ private combineBaseAndPattern; private combineBaseAndResourceId; /** * 将列值归一化为适合模板使用的字符串 * 特别处理:如果是链接列且值为 URI,则尝试提取 ID */ normalizeValue(value: unknown, column?: PodColumnBase, context?: UriContext): string; private parseTemplateVariable; private slugifyValue; private applyTransforms; /** * 应用模板变量 * @param template 模板字符串 * @param record 记录数据 * @param index 可选的行索引 * @param table 可选的表定义 * @param strict 是否严格模式(默认 true)。false 时缺少字段返回 null,不抛出异常 */ private applyTemplate; /** * 创建时间上下文 */ private createTimeContext; /** * 生成回退 URI * 简化版:根据 template 判断模式 */ private generateFallbackUri; /** * 从 URI 提取 ID * * 简化版:统一使用 base + subjectTemplate 反向解析 * * 例如: * - uri = "http://pod/.data/chat/chat-123/index.ttl#this" * - base = "http://pod/.data/chat/" * - relativePath = "chat-123/index.ttl#this" * - template = "{id}/index.ttl#this" * - id = "chat-123" */ private extractRelativeSubjectId; private extractPublicId; private extractTemplateIdFromSubject; /** * 从相对路径反向解析出 id * * 将模板转为正则表达式,提取 {id} 对应的值 * * @param relativePath 相对路径 (如 "chat-123/index.ttl#this") * @param template 模板 (如 "{id}/index.ttl#this") * @returns 提取的 id (如 "chat-123"),解析失败返回 null */ private extractIdFromTemplate; } //# sourceMappingURL=resolver.d.ts.map