@undefineds.co/drizzle-solid 0.2.6 → 0.2.7

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.
Files changed (112) hide show
  1. package/dist/core/execution/ldp-executor.d.ts.map +1 -1
  2. package/dist/core/execution/ldp-executor.js +59 -10
  3. package/dist/core/execution/ldp-executor.js.map +1 -1
  4. package/dist/core/execution/ldp-strategy.js +1 -1
  5. package/dist/core/execution/ldp-strategy.js.map +1 -1
  6. package/dist/core/execution/sparql-strategy.d.ts.map +1 -1
  7. package/dist/core/execution/sparql-strategy.js +25 -15
  8. package/dist/core/execution/sparql-strategy.js.map +1 -1
  9. package/dist/core/federated/executor.d.ts +3 -0
  10. package/dist/core/federated/executor.d.ts.map +1 -1
  11. package/dist/core/federated/executor.js +13 -8
  12. package/dist/core/federated/executor.js.map +1 -1
  13. package/dist/core/query-builders/select-query-builder.d.ts +7 -0
  14. package/dist/core/query-builders/select-query-builder.d.ts.map +1 -1
  15. package/dist/core/query-builders/select-query-builder.js +69 -14
  16. package/dist/core/query-builders/select-query-builder.js.map +1 -1
  17. package/dist/core/resource-resolver/base-resolver.d.ts +74 -3
  18. package/dist/core/resource-resolver/base-resolver.d.ts.map +1 -1
  19. package/dist/core/resource-resolver/base-resolver.js +221 -0
  20. package/dist/core/resource-resolver/base-resolver.js.map +1 -1
  21. package/dist/core/resource-resolver/document-resolver.d.ts +19 -4
  22. package/dist/core/resource-resolver/document-resolver.d.ts.map +1 -1
  23. package/dist/core/resource-resolver/document-resolver.js +72 -34
  24. package/dist/core/resource-resolver/document-resolver.js.map +1 -1
  25. package/dist/core/resource-resolver/fragment-resolver.d.ts +17 -3
  26. package/dist/core/resource-resolver/fragment-resolver.d.ts.map +1 -1
  27. package/dist/core/resource-resolver/fragment-resolver.js +28 -16
  28. package/dist/core/resource-resolver/fragment-resolver.js.map +1 -1
  29. package/dist/core/resource-resolver/types.d.ts +1 -1
  30. package/dist/core/resource-resolver/types.d.ts.map +1 -1
  31. package/dist/core/schema/pod-table.d.ts +6 -0
  32. package/dist/core/schema/pod-table.d.ts.map +1 -1
  33. package/dist/core/schema/pod-table.js +18 -9
  34. package/dist/core/schema/pod-table.js.map +1 -1
  35. package/dist/core/sparql/builder/expression-builder.d.ts +1 -0
  36. package/dist/core/sparql/builder/expression-builder.d.ts.map +1 -1
  37. package/dist/core/sparql/builder/expression-builder.js +50 -7
  38. package/dist/core/sparql/builder/expression-builder.js.map +1 -1
  39. package/dist/core/subject/resolver.d.ts +19 -0
  40. package/dist/core/subject/resolver.d.ts.map +1 -1
  41. package/dist/core/subject/resolver.js +75 -19
  42. package/dist/core/subject/resolver.js.map +1 -1
  43. package/dist/core/triple/builder.d.ts.map +1 -1
  44. package/dist/core/triple/builder.js +38 -1
  45. package/dist/core/triple/builder.js.map +1 -1
  46. package/dist/core/triple/handlers/inverse.d.ts +6 -2
  47. package/dist/core/triple/handlers/inverse.d.ts.map +1 -1
  48. package/dist/core/triple/handlers/inverse.js +37 -16
  49. package/dist/core/triple/handlers/inverse.js.map +1 -1
  50. package/dist/core/uri/resolver.d.ts +66 -2
  51. package/dist/core/uri/resolver.d.ts.map +1 -1
  52. package/dist/core/uri/resolver.js +218 -80
  53. package/dist/core/uri/resolver.js.map +1 -1
  54. package/dist/core/uri/types.d.ts +11 -1
  55. package/dist/core/uri/types.d.ts.map +1 -1
  56. package/dist/esm/core/execution/ldp-executor.d.ts.map +1 -1
  57. package/dist/esm/core/execution/ldp-executor.js +59 -10
  58. package/dist/esm/core/execution/ldp-executor.js.map +1 -1
  59. package/dist/esm/core/execution/ldp-strategy.js +1 -1
  60. package/dist/esm/core/execution/ldp-strategy.js.map +1 -1
  61. package/dist/esm/core/execution/sparql-strategy.d.ts.map +1 -1
  62. package/dist/esm/core/execution/sparql-strategy.js +25 -15
  63. package/dist/esm/core/execution/sparql-strategy.js.map +1 -1
  64. package/dist/esm/core/federated/executor.d.ts +3 -0
  65. package/dist/esm/core/federated/executor.d.ts.map +1 -1
  66. package/dist/esm/core/federated/executor.js +13 -8
  67. package/dist/esm/core/federated/executor.js.map +1 -1
  68. package/dist/esm/core/query-builders/select-query-builder.d.ts +7 -0
  69. package/dist/esm/core/query-builders/select-query-builder.d.ts.map +1 -1
  70. package/dist/esm/core/query-builders/select-query-builder.js +69 -14
  71. package/dist/esm/core/query-builders/select-query-builder.js.map +1 -1
  72. package/dist/esm/core/resource-resolver/base-resolver.d.ts +74 -3
  73. package/dist/esm/core/resource-resolver/base-resolver.d.ts.map +1 -1
  74. package/dist/esm/core/resource-resolver/base-resolver.js +221 -0
  75. package/dist/esm/core/resource-resolver/base-resolver.js.map +1 -1
  76. package/dist/esm/core/resource-resolver/document-resolver.d.ts +19 -4
  77. package/dist/esm/core/resource-resolver/document-resolver.d.ts.map +1 -1
  78. package/dist/esm/core/resource-resolver/document-resolver.js +72 -34
  79. package/dist/esm/core/resource-resolver/document-resolver.js.map +1 -1
  80. package/dist/esm/core/resource-resolver/fragment-resolver.d.ts +17 -3
  81. package/dist/esm/core/resource-resolver/fragment-resolver.d.ts.map +1 -1
  82. package/dist/esm/core/resource-resolver/fragment-resolver.js +28 -16
  83. package/dist/esm/core/resource-resolver/fragment-resolver.js.map +1 -1
  84. package/dist/esm/core/resource-resolver/types.d.ts +1 -1
  85. package/dist/esm/core/resource-resolver/types.d.ts.map +1 -1
  86. package/dist/esm/core/schema/pod-table.d.ts +6 -0
  87. package/dist/esm/core/schema/pod-table.d.ts.map +1 -1
  88. package/dist/esm/core/schema/pod-table.js +18 -9
  89. package/dist/esm/core/schema/pod-table.js.map +1 -1
  90. package/dist/esm/core/sparql/builder/expression-builder.d.ts +1 -0
  91. package/dist/esm/core/sparql/builder/expression-builder.d.ts.map +1 -1
  92. package/dist/esm/core/sparql/builder/expression-builder.js +50 -7
  93. package/dist/esm/core/sparql/builder/expression-builder.js.map +1 -1
  94. package/dist/esm/core/subject/resolver.d.ts +19 -0
  95. package/dist/esm/core/subject/resolver.d.ts.map +1 -1
  96. package/dist/esm/core/subject/resolver.js +75 -19
  97. package/dist/esm/core/subject/resolver.js.map +1 -1
  98. package/dist/esm/core/triple/builder.d.ts.map +1 -1
  99. package/dist/esm/core/triple/builder.js +38 -1
  100. package/dist/esm/core/triple/builder.js.map +1 -1
  101. package/dist/esm/core/triple/handlers/inverse.d.ts +6 -2
  102. package/dist/esm/core/triple/handlers/inverse.d.ts.map +1 -1
  103. package/dist/esm/core/triple/handlers/inverse.js +37 -16
  104. package/dist/esm/core/triple/handlers/inverse.js.map +1 -1
  105. package/dist/esm/core/uri/resolver.d.ts +66 -2
  106. package/dist/esm/core/uri/resolver.d.ts.map +1 -1
  107. package/dist/esm/core/uri/resolver.js +218 -80
  108. package/dist/esm/core/uri/resolver.js.map +1 -1
  109. package/dist/esm/core/uri/types.d.ts +11 -1
  110. package/dist/esm/core/uri/types.d.ts.map +1 -1
  111. package/package.json +5 -1
  112. package/CHANGELOG-DRAFT.md +0 -444
@@ -1,6 +1,12 @@
1
1
  "use strict";
2
2
  /**
3
3
  * Base ResourceResolver with shared logic
4
+ *
5
+ * 核心设计原则:
6
+ * - 用户使用简单 id(如 "alice", "tag-123")
7
+ * - subjectTemplate 定义 id 如何映射到 URI(如 "{id}.ttl#it", "#{id}")
8
+ * - 写入时:id + template → relativePath → baseUrl + relativePath
9
+ * - 读取时:subjectUri - baseUrl → relativePath → template 反向解析 → id
4
10
  */
5
11
  Object.defineProperty(exports, "__esModule", { value: true });
6
12
  exports.BaseResourceResolver = void 0;
@@ -8,6 +14,138 @@ class BaseResourceResolver {
8
14
  constructor(podBaseUrl) {
9
15
  this.podBaseUrl = podBaseUrl;
10
16
  }
17
+ // ================= 统一的 id 解析逻辑 =================
18
+ /**
19
+ * 从 subject URI 解析出 id
20
+ *
21
+ * 两步解析:
22
+ * 1. relativePath = subjectUri - baseUrl
23
+ * 2. 根据 subjectTemplate 反向解析 {id}
24
+ *
25
+ * 例如:
26
+ * - uri = "http://pod/items/alice.ttl#it", template = "{id}.ttl#it" → id = "alice"
27
+ * - uri = "http://pod/tags.ttl#tag-1", template = "#{id}" → id = "tag-1"
28
+ */
29
+ parseId(table, subjectUri) {
30
+ const baseUrl = this.getBaseUrlForTable(table);
31
+ // Step 1: 计算相对路径
32
+ let relativePath;
33
+ if (subjectUri.startsWith(baseUrl)) {
34
+ relativePath = subjectUri.substring(baseUrl.length);
35
+ }
36
+ else {
37
+ relativePath = this.extractIdFallback(subjectUri);
38
+ }
39
+ // Step 2: 根据模板反向解析 {id}
40
+ const template = this.getEffectiveTemplate(table);
41
+ if (template) {
42
+ const extractedId = this.extractIdFromTemplate(relativePath, template);
43
+ if (extractedId !== null) {
44
+ return extractedId;
45
+ }
46
+ }
47
+ // 如果没有模板或解析失败,返回相对路径
48
+ return relativePath;
49
+ }
50
+ /**
51
+ * 从 id 构建完整的 subject URI
52
+ *
53
+ * 两步构建:
54
+ * 1. 根据 subjectTemplate 应用 id → relativePath
55
+ * 2. subjectUri = baseUrl + relativePath
56
+ */
57
+ resolveSubject(table, record, index) {
58
+ const baseUrl = this.getBaseUrlForTable(table);
59
+ // 优先使用显式提供的 id
60
+ let id = record.id ?? record['@id'] ?? record.uri;
61
+ // 如果 id 已经是绝对 URI,直接返回
62
+ if (id && this.isAbsoluteUri(id)) {
63
+ return id;
64
+ }
65
+ // 如果没有 id,生成 UUID
66
+ if (id === undefined || id === null) {
67
+ id = this.generateUuid();
68
+ }
69
+ // 应用模板生成相对路径
70
+ const template = this.getEffectiveTemplate(table);
71
+ const relativePath = this.applyTemplate(id, template);
72
+ return baseUrl + relativePath;
73
+ }
74
+ /**
75
+ * 获取表的 base URL,用于 id 解析
76
+ */
77
+ getBaseUrlForTable(table) {
78
+ return this.resolveBaseUrl(table);
79
+ }
80
+ /**
81
+ * 获取有效的 subjectTemplate
82
+ */
83
+ getEffectiveTemplate(table) {
84
+ // 如果有自定义模板,使用它
85
+ if (table.config?.subjectTemplate) {
86
+ return table.config.subjectTemplate;
87
+ }
88
+ // 否则使用默认模板
89
+ return this.getDefaultTemplate();
90
+ }
91
+ /**
92
+ * 生成 UUID
93
+ */
94
+ generateUuid() {
95
+ // 简单的 UUID v4 生成(可以被子类重写)
96
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
97
+ const r = Math.random() * 16 | 0;
98
+ const v = c === 'x' ? r : (r & 0x3 | 0x8);
99
+ return v.toString(16);
100
+ });
101
+ }
102
+ /**
103
+ * 应用模板生成相对路径
104
+ *
105
+ * @param id 简单 id (如 "alice")
106
+ * @param template 模板 (如 "{id}.ttl#it")
107
+ * @returns 相对路径 (如 "alice.ttl#it")
108
+ */
109
+ applyTemplate(id, template) {
110
+ return template.replace(/\{id\}/g, id);
111
+ }
112
+ /**
113
+ * 从相对路径反向解析出 id
114
+ *
115
+ * @param relativePath 相对路径 (如 "alice.ttl#it")
116
+ * @param template 模板 (如 "{id}.ttl#it")
117
+ * @returns 提取的 id (如 "alice"),解析失败返回 null
118
+ */
119
+ extractIdFromTemplate(relativePath, template) {
120
+ // 将模板转为正则表达式
121
+ // 1. 转义特殊字符
122
+ // 2. 将 {id} 替换为捕获组 (.+?)
123
+ // 3. 将其他 {xxx} 占位符替换为非捕获组 (?:.+?)
124
+ let regexStr = template
125
+ // 转义正则特殊字符(除了 { 和 })
126
+ .replace(/[.+?^$[\]\\()]/g, '\\$&')
127
+ // 将 {id} 替换为命名捕获组
128
+ .replace(/\{id\}/g, '(?<id>.+?)')
129
+ // 将其他 {xxx} 占位符替换为非捕获组
130
+ .replace(/\{[^}]+\}/g, '(?:.+?)');
131
+ // 添加锚点
132
+ regexStr = `^${regexStr}$`;
133
+ try {
134
+ const regex = new RegExp(regexStr);
135
+ const match = relativePath.match(regex);
136
+ if (match && match.groups?.id) {
137
+ return match.groups.id;
138
+ }
139
+ // 兼容不支持命名捕获组的环境
140
+ if (match && match[1]) {
141
+ return match[1];
142
+ }
143
+ }
144
+ catch (e) {
145
+ // 正则解析失败,忽略
146
+ }
147
+ return null;
148
+ }
11
149
  /**
12
150
  * Extract id values from a query condition
13
151
  * Shared logic for both fragment and document mode
@@ -30,6 +168,66 @@ class BaseResourceResolver {
30
168
  this.collectIdValues(condition, ids);
31
169
  return ids;
32
170
  }
171
+ /**
172
+ * Extract values for specific columns from a query condition
173
+ * Used for subjectTemplate variable resolution
174
+ */
175
+ extractTemplateValues(condition, columns) {
176
+ if (!condition || columns.length === 0)
177
+ return {};
178
+ const values = {};
179
+ // Handle simple object: { col: 'value' }
180
+ if (typeof condition === 'object' && !('type' in condition)) {
181
+ for (const col of columns) {
182
+ if (col in condition) {
183
+ const val = condition[col];
184
+ if (val != null && !Array.isArray(val)) {
185
+ values[col] = String(val);
186
+ }
187
+ }
188
+ }
189
+ return values;
190
+ }
191
+ // Handle QueryCondition structure
192
+ for (const col of columns) {
193
+ const found = this.collectColumnValue(condition, col);
194
+ if (found !== undefined) {
195
+ values[col] = found;
196
+ }
197
+ }
198
+ return values;
199
+ }
200
+ collectColumnValue(condition, targetCol) {
201
+ if (!condition)
202
+ return undefined;
203
+ // BinaryExpression: { type: 'binary_expr', left: ..., operator: ..., right: ... }
204
+ if (condition.type === 'binary_expr') {
205
+ let colName;
206
+ const left = condition.left;
207
+ if (typeof left === 'string') {
208
+ colName = left;
209
+ }
210
+ else if (left && typeof left === 'object') {
211
+ colName = left.name;
212
+ }
213
+ if (colName === targetCol) {
214
+ if (condition.operator === '=' && condition.right != null) {
215
+ return String(condition.right);
216
+ }
217
+ }
218
+ }
219
+ // LogicalExpression: { type: 'logical_expr', operator: 'AND', expressions: [...] }
220
+ // Note: We only support AND for deterministic path resolution.
221
+ // OR would require returning multiple paths which is more complex (TODO).
222
+ if (condition.type === 'logical_expr' && condition.operator === 'AND' && Array.isArray(condition.expressions)) {
223
+ for (const expr of condition.expressions) {
224
+ const val = this.collectColumnValue(expr, targetCol);
225
+ if (val !== undefined)
226
+ return val;
227
+ }
228
+ }
229
+ return undefined;
230
+ }
33
231
  collectIdValues(condition, ids) {
34
232
  if (!condition)
35
233
  return;
@@ -77,6 +275,29 @@ class BaseResourceResolver {
77
275
  const normalizedPath = base.startsWith('/') ? base.slice(1) : base;
78
276
  return new URL(normalizedPath, podBase).toString();
79
277
  }
278
+ // ================= 辅助方法 =================
279
+ /**
280
+ * 检查是否为绝对 URI
281
+ */
282
+ isAbsoluteUri(value) {
283
+ return value.startsWith('http://') || value.startsWith('https://') || value.startsWith('urn:');
284
+ }
285
+ /**
286
+ * Fallback id 提取(当 subjectUri 不以 baseUrl 开头时)
287
+ */
288
+ extractIdFallback(subjectUri) {
289
+ // 尝试提取 fragment
290
+ const hashIndex = subjectUri.indexOf('#');
291
+ if (hashIndex !== -1) {
292
+ return subjectUri.substring(hashIndex); // 包含 #
293
+ }
294
+ // 尝试提取文件名
295
+ const lastSlash = subjectUri.lastIndexOf('/');
296
+ if (lastSlash !== -1) {
297
+ return subjectUri.substring(lastSlash + 1);
298
+ }
299
+ return subjectUri;
300
+ }
80
301
  }
81
302
  exports.BaseResourceResolver = BaseResourceResolver;
82
303
  //# sourceMappingURL=base-resolver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-resolver.js","sourceRoot":"","sources":["../../../src/core/resource-resolver/base-resolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base-resolver.js","sourceRoot":"","sources":["../../../src/core/resource-resolver/base-resolver.ts"],"names":[],"mappings":"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"}
@@ -2,19 +2,34 @@
2
2
  * Document Mode ResourceResolver
3
3
  *
4
4
  * In document mode, each record is stored in its own file (e.g., users/alice.ttl)
5
- * The subject URI is the document URL itself
5
+ * The subject URI includes the document URL and possibly a fragment.
6
+ *
7
+ * 设计原则:
8
+ * - base = containerPath (如 http://pod/.data/items/)
9
+ * - 默认模板: {id}.ttl#it
10
+ * - 写入: id = "alice" → relativePath = "alice.ttl#it" → uri = base + relativePath
11
+ * - 读取: uri - base = "alice.ttl#it" → 反向解析模板 → id = "alice"
6
12
  */
7
13
  import type { PodTable } from '../schema';
8
14
  import type { QueryCondition } from '../query-conditions';
9
15
  import { BaseResourceResolver } from './base-resolver';
10
16
  export declare class DocumentResourceResolver extends BaseResourceResolver {
11
17
  readonly mode: "document";
18
+ private uriResolver;
19
+ /**
20
+ * 获取默认模板
21
+ */
22
+ protected getDefaultTemplate(): string;
12
23
  getContainerUrl(table: PodTable): string;
13
24
  getResourceUrl(table: PodTable): string;
14
- resolveSubject(table: PodTable, record: Record<string, any>, _index?: number): string;
15
- parseId(table: PodTable, subjectUri: string): string;
25
+ /**
26
+ * 获取表的 base URL
27
+ *
28
+ * Document 模式下,base 是容器路径(以 / 结尾)
29
+ */
30
+ protected getBaseUrlForTable(table: PodTable): string;
16
31
  getResourceUrlForSubject(subjectUri: string): string;
17
- resolveSelectSources(table: PodTable, containerUrl: string, condition?: QueryCondition, listContainer?: () => Promise<string[]>): Promise<string[]>;
32
+ resolveSelectSources(table: PodTable, containerUrl: string, condition?: QueryCondition, listContainer?: (url?: string) => Promise<string[]>): Promise<string[]>;
18
33
  resolveSubjectsForMutation(table: PodTable, condition: QueryCondition, findSubjects: (resourceUrl: string) => Promise<string[]>, listContainer: () => Promise<string[]>): Promise<string[]>;
19
34
  }
20
35
  //# sourceMappingURL=document-resolver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"document-resolver.d.ts","sourceRoot":"","sources":["../../../src/core/resource-resolver/document-resolver.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAGvD,qBAAa,wBAAyB,SAAQ,oBAAoB;IAChE,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;IAEpC,eAAe,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM;IAkBxC,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM;IAOvC,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IAUrF,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAsBpD,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAK9C,oBAAoB,CACxB,KAAK,EAAE,QAAQ,EACf,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,cAAc,EAC1B,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,GACtC,OAAO,CAAC,MAAM,EAAE,CAAC;IAiBd,0BAA0B,CAC9B,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,cAAc,EACzB,YAAY,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,EACxD,aAAa,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,GACrC,OAAO,CAAC,MAAM,EAAE,CAAC;CAwBrB"}
1
+ {"version":3,"file":"document-resolver.d.ts","sourceRoot":"","sources":["../../../src/core/resource-resolver/document-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAQvD,qBAAa,wBAAyB,SAAQ,oBAAoB;IAChE,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;IACpC,OAAO,CAAC,WAAW,CAAyB;IAE5C;;OAEG;IACH,SAAS,CAAC,kBAAkB,IAAI,MAAM;IAItC,eAAe,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM;IAexC,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM;IAOvC;;;;OAIG;IACH,SAAS,CAAC,kBAAkB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM;IAIrD,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAS9C,oBAAoB,CACxB,KAAK,EAAE,QAAQ,EACf,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,cAAc,EAC1B,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,GAClD,OAAO,CAAC,MAAM,EAAE,CAAC;IA2Dd,0BAA0B,CAC9B,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,cAAc,EACzB,YAAY,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,EACxD,aAAa,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,GACrC,OAAO,CAAC,MAAM,EAAE,CAAC;CAwBrB"}
@@ -3,16 +3,33 @@
3
3
  * Document Mode ResourceResolver
4
4
  *
5
5
  * In document mode, each record is stored in its own file (e.g., users/alice.ttl)
6
- * The subject URI is the document URL itself
6
+ * The subject URI includes the document URL and possibly a fragment.
7
+ *
8
+ * 设计原则:
9
+ * - base = containerPath (如 http://pod/.data/items/)
10
+ * - 默认模板: {id}.ttl#it
11
+ * - 写入: id = "alice" → relativePath = "alice.ttl#it" → uri = base + relativePath
12
+ * - 读取: uri - base = "alice.ttl#it" → 反向解析模板 → id = "alice"
7
13
  */
8
14
  Object.defineProperty(exports, "__esModule", { value: true });
9
15
  exports.DocumentResourceResolver = void 0;
10
16
  const base_resolver_1 = require("./base-resolver");
11
- const uuid_1 = require("uuid");
17
+ const resolver_1 = require("../uri/resolver");
18
+ /**
19
+ * 默认的 document 模板
20
+ */
21
+ const DEFAULT_TEMPLATE = '{id}.ttl#it';
12
22
  class DocumentResourceResolver extends base_resolver_1.BaseResourceResolver {
13
23
  constructor() {
14
24
  super(...arguments);
15
25
  this.mode = 'document';
26
+ this.uriResolver = new resolver_1.UriResolverImpl();
27
+ }
28
+ /**
29
+ * 获取默认模板
30
+ */
31
+ getDefaultTemplate() {
32
+ return DEFAULT_TEMPLATE;
16
33
  }
17
34
  getContainerUrl(table) {
18
35
  // In document mode, use the table's container path
@@ -22,9 +39,6 @@ class DocumentResourceResolver extends base_resolver_1.BaseResourceResolver {
22
39
  return containerPath;
23
40
  }
24
41
  // Resolve relative path against pod base
25
- // Note: paths starting with '/' should be relative to pod base, not origin
26
- // e.g., '/.data/providers/' with pod base 'http://localhost:3000/test/'
27
- // should resolve to 'http://localhost:3000/test/.data/providers/'
28
42
  const base = this.podBaseUrl.endsWith('/') ? this.podBaseUrl : `${this.podBaseUrl}/`;
29
43
  const normalizedPath = containerPath.startsWith('/') ? containerPath.slice(1) : containerPath;
30
44
  return new URL(normalizedPath, base).toString();
@@ -35,43 +49,67 @@ class DocumentResourceResolver extends base_resolver_1.BaseResourceResolver {
35
49
  const containerUrl = this.getContainerUrl(table);
36
50
  return `${containerUrl}${table.config.name}.ttl`;
37
51
  }
38
- resolveSubject(table, record, _index) {
39
- const containerUrl = this.getContainerUrl(table);
40
- // Use provided id or generate UUID
41
- const id = record.id ?? (0, uuid_1.v4)();
42
- // Subject URI is the document URL itself
43
- return `${containerUrl}${id}.ttl`;
44
- }
45
- parseId(table, subjectUri) {
46
- // Extract filename without extension
47
- const containerUrl = this.getContainerUrl(table);
48
- if (subjectUri.startsWith(containerUrl)) {
49
- const filename = subjectUri.substring(containerUrl.length);
50
- // Remove .ttl extension
51
- if (filename.endsWith('.ttl')) {
52
- return filename.slice(0, -4);
53
- }
54
- return filename;
55
- }
56
- // Fallback: extract last path segment without extension
57
- const parts = subjectUri.split('/');
58
- const filename = parts[parts.length - 1];
59
- if (filename.endsWith('.ttl')) {
60
- return filename.slice(0, -4);
61
- }
62
- return filename;
52
+ /**
53
+ * 获取表的 base URL
54
+ *
55
+ * Document 模式下,base 是容器路径(以 / 结尾)
56
+ */
57
+ getBaseUrlForTable(table) {
58
+ return this.getContainerUrl(table);
63
59
  }
64
60
  getResourceUrlForSubject(subjectUri) {
65
- // In document mode, subject URI is the resource URL
61
+ // In document mode, remove fragment to get resource URL
62
+ const hashIndex = subjectUri.indexOf('#');
63
+ if (hashIndex !== -1) {
64
+ return subjectUri.substring(0, hashIndex);
65
+ }
66
66
  return subjectUri;
67
67
  }
68
68
  async resolveSelectSources(table, containerUrl, condition, listContainer) {
69
- // With id condition: query specific files directly
69
+ // 1. With id condition: query specific files directly
70
70
  const idValues = this.extractIdValues(condition);
71
71
  if (idValues.length > 0) {
72
- return idValues.map(id => this.resolveSubject(table, { id }));
72
+ return idValues.map(id => {
73
+ const subjectUri = this.resolveSubject(table, { id });
74
+ return this.getResourceUrlForSubject(subjectUri);
75
+ });
76
+ }
77
+ // 2. Check if subjectTemplate has variables other than {id}
78
+ const template = this.getEffectiveTemplate(table);
79
+ const variables = Array.from(template.matchAll(/\{([^}]+)\}/g)).map(m => m[1]);
80
+ const requiredVars = variables.filter(v => v !== 'id' && v !== 'index');
81
+ if (requiredVars.length > 0) {
82
+ const templateValues = this.extractTemplateValues(condition, requiredVars);
83
+ const allVarsPresent = requiredVars.every(v => v in templateValues);
84
+ if (allVarsPresent) {
85
+ let partialPath = template;
86
+ for (const [key, val] of Object.entries(templateValues)) {
87
+ const column = table.columns?.[key];
88
+ // Use unified normalization logic from UriResolver
89
+ const normalizedVal = this.uriResolver.normalizeValue(val, column);
90
+ partialPath = partialPath.replace(new RegExp(`\\{${key}\\}`, 'g'), normalizedVal);
91
+ }
92
+ const baseUrl = this.getContainerUrl(table);
93
+ const firstbrace = partialPath.indexOf('{');
94
+ let relativeContainer = partialPath;
95
+ if (firstbrace !== -1) {
96
+ const lastSlashBeforeBrace = partialPath.lastIndexOf('/', firstbrace);
97
+ if (lastSlashBeforeBrace !== -1) {
98
+ relativeContainer = partialPath.substring(0, lastSlashBeforeBrace + 1);
99
+ }
100
+ else {
101
+ relativeContainer = '';
102
+ }
103
+ }
104
+ if (relativeContainer && listContainer) {
105
+ const specificContainer = new URL(relativeContainer, baseUrl).toString();
106
+ // List the specific sub-container instead of the base container
107
+ const resources = await listContainer(specificContainer);
108
+ return resources.filter(url => url.endsWith('.ttl') && !url.endsWith('/'));
109
+ }
110
+ }
73
111
  }
74
- // Without id condition: scan container for all .ttl files
112
+ // 3. Fallback: scan base container for all .ttl files
75
113
  if (!listContainer) {
76
114
  return [];
77
115
  }
@@ -1 +1 @@
1
- {"version":3,"file":"document-resolver.js","sourceRoot":"","sources":["../../../src/core/resource-resolver/document-resolver.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAIH,mDAAuD;AACvD,+BAAoC;AAEpC,MAAa,wBAAyB,SAAQ,oCAAoB;IAAlE;;QACW,SAAI,GAAG,UAAmB,CAAC;IAmHtC,CAAC;IAjHC,eAAe,CAAC,KAAe;QAC7B,mDAAmD;QACnD,MAAM,aAAa,GAAG,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAE/C,gCAAgC;QAChC,IAAI,aAAa,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAChF,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,yCAAyC;QACzC,2EAA2E;QAC3E,wEAAwE;QACxE,kEAAkE;QAClE,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC;QACrF,MAAM,cAAc,GAAG,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;QAC9F,OAAO,IAAI,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClD,CAAC;IAED,cAAc,CAAC,KAAe;QAC5B,qEAAqE;QACrE,4CAA4C;QAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACjD,OAAO,GAAG,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;IACnD,CAAC;IAED,cAAc,CAAC,KAAe,EAAE,MAA2B,EAAE,MAAe;QAC1E,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAEjD,mCAAmC;QACnC,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,IAAA,SAAM,GAAE,CAAC;QAEjC,yCAAyC;QACzC,OAAO,GAAG,YAAY,GAAG,EAAE,MAAM,CAAC;IACpC,CAAC;IAED,OAAO,CAAC,KAAe,EAAE,UAAkB;QACzC,qCAAqC;QACrC,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAEjD,IAAI,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACxC,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC3D,wBAAwB;YACxB,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9B,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/B,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,wDAAwD;QACxD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACzC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,wBAAwB,CAAC,UAAkB;QACzC,oDAAoD;QACpD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,KAAe,EACf,YAAoB,EACpB,SAA0B,EAC1B,aAAuC;QAEvC,mDAAmD;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAEjD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC;QAED,0DAA0D;QAC1D,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,aAAa,EAAE,CAAC;QAC3C,OAAO,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,KAAK,CAAC,0BAA0B,CAC9B,KAAe,EACf,SAAyB,EACzB,YAAwD,EACxD,aAAsC;QAEtC,wDAAwD;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC;QAED,kEAAkE;QAClE,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,cAAc,GAAG,MAAM,aAAa,EAAE,CAAC;QAE7C,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;YACrC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvD,IAAI,CAAC;oBACH,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;oBAClD,QAAQ,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;gBAClC,CAAC;gBAAC,MAAM,CAAC;oBACP,mCAAmC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AApHD,4DAoHC"}
1
+ {"version":3,"file":"document-resolver.js","sourceRoot":"","sources":["../../../src/core/resource-resolver/document-resolver.ts"],"names":[],"mappings":"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"}
@@ -3,18 +3,32 @@
3
3
  *
4
4
  * In fragment mode, all records are stored in a single file (e.g., tags.ttl)
5
5
  * Each record has a subject URI with a fragment identifier (e.g., tags.ttl#uuid)
6
+ *
7
+ * 设计原则:
8
+ * - base = resourcePath (如 http://pod/.data/tags.ttl)
9
+ * - 默认模板: #{id}
10
+ * - 写入: id = "tag-1" → relativePath = "#tag-1" → uri = base + relativePath
11
+ * - 读取: uri - base = "#tag-1" → 反向解析模板 → id = "tag-1"
6
12
  */
7
13
  import type { PodTable } from '../schema';
8
14
  import type { QueryCondition } from '../query-conditions';
9
15
  import { BaseResourceResolver } from './base-resolver';
10
16
  export declare class FragmentResourceResolver extends BaseResourceResolver {
11
17
  readonly mode: "fragment";
18
+ /**
19
+ * 获取默认模板
20
+ */
21
+ protected getDefaultTemplate(): string;
12
22
  getContainerUrl(table: PodTable): string;
13
23
  getResourceUrl(table: PodTable): string;
14
- resolveSubject(table: PodTable, record: Record<string, any>, index?: number): string;
15
- parseId(table: PodTable, subjectUri: string): string;
24
+ /**
25
+ * 获取表的 base URL
26
+ *
27
+ * Fragment 模式下,base 是资源文件路径(不含 fragment)
28
+ */
29
+ protected getBaseUrlForTable(table: PodTable): string;
16
30
  getResourceUrlForSubject(subjectUri: string): string;
17
- resolveSelectSources(table: PodTable, containerUrl: string, condition?: QueryCondition, _listContainer?: () => Promise<string[]>): Promise<string[]>;
31
+ resolveSelectSources(table: PodTable, containerUrl: string, condition?: QueryCondition, _listContainer?: (url?: string) => Promise<string[]>): Promise<string[]>;
18
32
  resolveSubjectsForMutation(table: PodTable, condition: QueryCondition, findSubjects: (resourceUrl: string) => Promise<string[]>, _listContainer: () => Promise<string[]>): Promise<string[]>;
19
33
  }
20
34
  //# sourceMappingURL=fragment-resolver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fragment-resolver.d.ts","sourceRoot":"","sources":["../../../src/core/resource-resolver/fragment-resolver.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAGvD,qBAAa,wBAAyB,SAAQ,oBAAoB;IAChE,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;IAEpC,eAAe,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM;IAMxC,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM;IAIvC,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IASpF,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAWpD,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAS9C,oBAAoB,CACxB,KAAK,EAAE,QAAQ,EACf,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,cAAc,EAC1B,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,GACvC,OAAO,CAAC,MAAM,EAAE,CAAC;IAKd,0BAA0B,CAC9B,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,cAAc,EACzB,YAAY,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,EACxD,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,GACtC,OAAO,CAAC,MAAM,EAAE,CAAC;CAKrB"}
1
+ {"version":3,"file":"fragment-resolver.d.ts","sourceRoot":"","sources":["../../../src/core/resource-resolver/fragment-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAOvD,qBAAa,wBAAyB,SAAQ,oBAAoB;IAChE,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;IAEpC;;OAEG;IACH,SAAS,CAAC,kBAAkB,IAAI,MAAM;IAItC,eAAe,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM;IAMxC,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM;IAIvC;;;;OAIG;IACH,SAAS,CAAC,kBAAkB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM;IAIrD,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAS9C,oBAAoB,CACxB,KAAK,EAAE,QAAQ,EACf,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,cAAc,EAC1B,cAAc,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,GACnD,OAAO,CAAC,MAAM,EAAE,CAAC;IAKd,0BAA0B,CAC9B,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,cAAc,EACzB,YAAY,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,EACxD,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,GACtC,OAAO,CAAC,MAAM,EAAE,CAAC;CAWrB"}
@@ -4,16 +4,31 @@
4
4
  *
5
5
  * In fragment mode, all records are stored in a single file (e.g., tags.ttl)
6
6
  * Each record has a subject URI with a fragment identifier (e.g., tags.ttl#uuid)
7
+ *
8
+ * 设计原则:
9
+ * - base = resourcePath (如 http://pod/.data/tags.ttl)
10
+ * - 默认模板: #{id}
11
+ * - 写入: id = "tag-1" → relativePath = "#tag-1" → uri = base + relativePath
12
+ * - 读取: uri - base = "#tag-1" → 反向解析模板 → id = "tag-1"
7
13
  */
8
14
  Object.defineProperty(exports, "__esModule", { value: true });
9
15
  exports.FragmentResourceResolver = void 0;
10
16
  const base_resolver_1 = require("./base-resolver");
11
- const uuid_1 = require("uuid");
17
+ /**
18
+ * 默认的 fragment 模板
19
+ */
20
+ const DEFAULT_TEMPLATE = '#{id}';
12
21
  class FragmentResourceResolver extends base_resolver_1.BaseResourceResolver {
13
22
  constructor() {
14
23
  super(...arguments);
15
24
  this.mode = 'fragment';
16
25
  }
26
+ /**
27
+ * 获取默认模板
28
+ */
29
+ getDefaultTemplate() {
30
+ return DEFAULT_TEMPLATE;
31
+ }
17
32
  getContainerUrl(table) {
18
33
  const resourceUrl = this.getResourceUrl(table);
19
34
  const lastSlash = resourceUrl.lastIndexOf('/');
@@ -22,21 +37,13 @@ class FragmentResourceResolver extends base_resolver_1.BaseResourceResolver {
22
37
  getResourceUrl(table) {
23
38
  return this.resolveBaseUrl(table);
24
39
  }
25
- resolveSubject(table, record, index) {
26
- const resourceUrl = this.getResourceUrl(table);
27
- // Use provided id or generate UUID
28
- const id = record.id ?? `${(0, uuid_1.v4)()}`;
29
- return `${resourceUrl}#${id}`;
30
- }
31
- parseId(table, subjectUri) {
32
- // Extract fragment from URI
33
- const hashIndex = subjectUri.indexOf('#');
34
- if (hashIndex === -1) {
35
- // Fallback: use last path segment
36
- const parts = subjectUri.split('/');
37
- return parts[parts.length - 1];
38
- }
39
- return subjectUri.substring(hashIndex + 1);
40
+ /**
41
+ * 获取表的 base URL
42
+ *
43
+ * Fragment 模式下,base 是资源文件路径(不含 fragment)
44
+ */
45
+ getBaseUrlForTable(table) {
46
+ return this.getResourceUrl(table);
40
47
  }
41
48
  getResourceUrlForSubject(subjectUri) {
42
49
  // Remove fragment to get resource URL
@@ -51,6 +58,11 @@ class FragmentResourceResolver extends base_resolver_1.BaseResourceResolver {
51
58
  return [this.getResourceUrl(table)];
52
59
  }
53
60
  async resolveSubjectsForMutation(table, condition, findSubjects, _listContainer) {
61
+ // With id condition: resolve subjects directly from ids
62
+ const idValues = this.extractIdValues(condition);
63
+ if (idValues.length > 0) {
64
+ return idValues.map(id => this.resolveSubject(table, { id }));
65
+ }
54
66
  // Fragment mode: query the single resource file for matching subjects
55
67
  const resourceUrl = this.getResourceUrl(table);
56
68
  return findSubjects(resourceUrl);
@@ -1 +1 @@
1
- {"version":3,"file":"fragment-resolver.js","sourceRoot":"","sources":["../../../src/core/resource-resolver/fragment-resolver.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAIH,mDAAuD;AACvD,+BAAoC;AAEpC,MAAa,wBAAyB,SAAQ,oCAAoB;IAAlE;;QACW,SAAI,GAAG,UAAmB,CAAC;IA6DtC,CAAC;IA3DC,eAAe,CAAC,KAAe;QAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC/C,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,cAAc,CAAC,KAAe;QAC5B,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,cAAc,CAAC,KAAe,EAAE,MAA2B,EAAE,KAAc;QACzE,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAE/C,mCAAmC;QACnC,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,GAAG,IAAA,SAAM,GAAE,EAAE,CAAC;QAEtC,OAAO,GAAG,WAAW,IAAI,EAAE,EAAE,CAAC;IAChC,CAAC;IAED,OAAO,CAAC,KAAe,EAAE,UAAkB;QACzC,4BAA4B;QAC5B,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;YACrB,kCAAkC;YAClC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACpC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,UAAU,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,wBAAwB,CAAC,UAAkB;QACzC,sCAAsC;QACtC,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;YACrB,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,KAAe,EACf,YAAoB,EACpB,SAA0B,EAC1B,cAAwC;QAExC,uDAAuD;QACvD,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,0BAA0B,CAC9B,KAAe,EACf,SAAyB,EACzB,YAAwD,EACxD,cAAuC;QAEvC,sEAAsE;QACtE,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC/C,OAAO,YAAY,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;CACF;AA9DD,4DA8DC"}
1
+ {"version":3,"file":"fragment-resolver.js","sourceRoot":"","sources":["../../../src/core/resource-resolver/fragment-resolver.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;AAIH,mDAAuD;AAEvD;;GAEG;AACH,MAAM,gBAAgB,GAAG,OAAO,CAAC;AAEjC,MAAa,wBAAyB,SAAQ,oCAAoB;IAAlE;;QACW,SAAI,GAAG,UAAmB,CAAC;IA+DtC,CAAC;IA7DC;;OAEG;IACO,kBAAkB;QAC1B,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,eAAe,CAAC,KAAe;QAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC/C,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,cAAc,CAAC,KAAe;QAC5B,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACO,kBAAkB,CAAC,KAAe;QAC1C,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,wBAAwB,CAAC,UAAkB;QACzC,sCAAsC;QACtC,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;YACrB,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,KAAe,EACf,YAAoB,EACpB,SAA0B,EAC1B,cAAoD;QAEpD,uDAAuD;QACvD,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,0BAA0B,CAC9B,KAAe,EACf,SAAyB,EACzB,YAAwD,EACxD,cAAuC;QAEvC,wDAAwD;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC;QAED,sEAAsE;QACtE,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC/C,OAAO,YAAY,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;CACF;AAhED,4DAgEC"}
@@ -40,7 +40,7 @@ export interface ResourceResolver {
40
40
  * - With id condition: returns specific resource URLs
41
41
  * - Without id condition: returns all resources to scan
42
42
  */
43
- resolveSelectSources(table: PodTable, containerUrl: string, condition?: QueryCondition, listContainer?: () => Promise<string[]>): Promise<string[]>;
43
+ resolveSelectSources(table: PodTable, containerUrl: string, condition?: QueryCondition, listContainer?: (url?: string) => Promise<string[]>): Promise<string[]>;
44
44
  /**
45
45
  * Resolve subjects for UPDATE/DELETE operations
46
46
  * - With id condition: resolves subjects directly from ids
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/resource-resolver/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAAC;IAEvC;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAC;IAEzC;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAC;IAExC;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAErF;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAErD;;OAEG;IACH,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAErD;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,EAAE,CAAC;IAEjE;;;;OAIG;IACH,oBAAoB,CAClB,KAAK,EAAE,QAAQ,EACf,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,cAAc,EAC1B,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,GACtC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAErB;;;;OAIG;IACH,0BAA0B,CACxB,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,cAAc,EACzB,YAAY,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,EACxD,aAAa,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,GACrC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,gBAAgB,CAAC;CAChD"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/resource-resolver/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAAC;IAEvC;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAC;IAEzC;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAC;IAExC;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAErF;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAErD;;OAEG;IACH,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAErD;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,EAAE,CAAC;IAEjE;;;;OAIG;IACH,oBAAoB,CAClB,KAAK,EAAE,QAAQ,EACf,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,cAAc,EAC1B,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,GAClD,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAErB;;;;OAIG;IACH,0BAA0B,CACxB,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,cAAc,EACzB,YAAY,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,EACxD,aAAa,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,GACrC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,gBAAgB,CAAC;CAChD"}