@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.
- package/dist/core/execution/ldp-executor.d.ts.map +1 -1
- package/dist/core/execution/ldp-executor.js +59 -10
- package/dist/core/execution/ldp-executor.js.map +1 -1
- package/dist/core/execution/ldp-strategy.js +1 -1
- package/dist/core/execution/ldp-strategy.js.map +1 -1
- package/dist/core/execution/sparql-strategy.d.ts.map +1 -1
- package/dist/core/execution/sparql-strategy.js +25 -15
- package/dist/core/execution/sparql-strategy.js.map +1 -1
- package/dist/core/federated/executor.d.ts +3 -0
- package/dist/core/federated/executor.d.ts.map +1 -1
- package/dist/core/federated/executor.js +13 -8
- package/dist/core/federated/executor.js.map +1 -1
- package/dist/core/query-builders/select-query-builder.d.ts +7 -0
- package/dist/core/query-builders/select-query-builder.d.ts.map +1 -1
- package/dist/core/query-builders/select-query-builder.js +69 -14
- package/dist/core/query-builders/select-query-builder.js.map +1 -1
- package/dist/core/resource-resolver/base-resolver.d.ts +74 -3
- package/dist/core/resource-resolver/base-resolver.d.ts.map +1 -1
- package/dist/core/resource-resolver/base-resolver.js +221 -0
- package/dist/core/resource-resolver/base-resolver.js.map +1 -1
- package/dist/core/resource-resolver/document-resolver.d.ts +19 -4
- package/dist/core/resource-resolver/document-resolver.d.ts.map +1 -1
- package/dist/core/resource-resolver/document-resolver.js +72 -34
- package/dist/core/resource-resolver/document-resolver.js.map +1 -1
- package/dist/core/resource-resolver/fragment-resolver.d.ts +17 -3
- package/dist/core/resource-resolver/fragment-resolver.d.ts.map +1 -1
- package/dist/core/resource-resolver/fragment-resolver.js +28 -16
- package/dist/core/resource-resolver/fragment-resolver.js.map +1 -1
- package/dist/core/resource-resolver/types.d.ts +1 -1
- package/dist/core/resource-resolver/types.d.ts.map +1 -1
- package/dist/core/schema/pod-table.d.ts +6 -0
- package/dist/core/schema/pod-table.d.ts.map +1 -1
- package/dist/core/schema/pod-table.js +18 -9
- package/dist/core/schema/pod-table.js.map +1 -1
- package/dist/core/sparql/builder/expression-builder.d.ts +1 -0
- package/dist/core/sparql/builder/expression-builder.d.ts.map +1 -1
- package/dist/core/sparql/builder/expression-builder.js +50 -7
- package/dist/core/sparql/builder/expression-builder.js.map +1 -1
- package/dist/core/subject/resolver.d.ts +19 -0
- package/dist/core/subject/resolver.d.ts.map +1 -1
- package/dist/core/subject/resolver.js +75 -19
- package/dist/core/subject/resolver.js.map +1 -1
- package/dist/core/triple/builder.d.ts.map +1 -1
- package/dist/core/triple/builder.js +38 -1
- package/dist/core/triple/builder.js.map +1 -1
- package/dist/core/triple/handlers/inverse.d.ts +6 -2
- package/dist/core/triple/handlers/inverse.d.ts.map +1 -1
- package/dist/core/triple/handlers/inverse.js +37 -16
- package/dist/core/triple/handlers/inverse.js.map +1 -1
- package/dist/core/uri/resolver.d.ts +66 -2
- package/dist/core/uri/resolver.d.ts.map +1 -1
- package/dist/core/uri/resolver.js +218 -80
- package/dist/core/uri/resolver.js.map +1 -1
- package/dist/core/uri/types.d.ts +11 -1
- package/dist/core/uri/types.d.ts.map +1 -1
- package/dist/esm/core/execution/ldp-executor.d.ts.map +1 -1
- package/dist/esm/core/execution/ldp-executor.js +59 -10
- package/dist/esm/core/execution/ldp-executor.js.map +1 -1
- package/dist/esm/core/execution/ldp-strategy.js +1 -1
- package/dist/esm/core/execution/ldp-strategy.js.map +1 -1
- package/dist/esm/core/execution/sparql-strategy.d.ts.map +1 -1
- package/dist/esm/core/execution/sparql-strategy.js +25 -15
- package/dist/esm/core/execution/sparql-strategy.js.map +1 -1
- package/dist/esm/core/federated/executor.d.ts +3 -0
- package/dist/esm/core/federated/executor.d.ts.map +1 -1
- package/dist/esm/core/federated/executor.js +13 -8
- package/dist/esm/core/federated/executor.js.map +1 -1
- package/dist/esm/core/query-builders/select-query-builder.d.ts +7 -0
- package/dist/esm/core/query-builders/select-query-builder.d.ts.map +1 -1
- package/dist/esm/core/query-builders/select-query-builder.js +69 -14
- package/dist/esm/core/query-builders/select-query-builder.js.map +1 -1
- package/dist/esm/core/resource-resolver/base-resolver.d.ts +74 -3
- package/dist/esm/core/resource-resolver/base-resolver.d.ts.map +1 -1
- package/dist/esm/core/resource-resolver/base-resolver.js +221 -0
- package/dist/esm/core/resource-resolver/base-resolver.js.map +1 -1
- package/dist/esm/core/resource-resolver/document-resolver.d.ts +19 -4
- package/dist/esm/core/resource-resolver/document-resolver.d.ts.map +1 -1
- package/dist/esm/core/resource-resolver/document-resolver.js +72 -34
- package/dist/esm/core/resource-resolver/document-resolver.js.map +1 -1
- package/dist/esm/core/resource-resolver/fragment-resolver.d.ts +17 -3
- package/dist/esm/core/resource-resolver/fragment-resolver.d.ts.map +1 -1
- package/dist/esm/core/resource-resolver/fragment-resolver.js +28 -16
- package/dist/esm/core/resource-resolver/fragment-resolver.js.map +1 -1
- package/dist/esm/core/resource-resolver/types.d.ts +1 -1
- package/dist/esm/core/resource-resolver/types.d.ts.map +1 -1
- package/dist/esm/core/schema/pod-table.d.ts +6 -0
- package/dist/esm/core/schema/pod-table.d.ts.map +1 -1
- package/dist/esm/core/schema/pod-table.js +18 -9
- package/dist/esm/core/schema/pod-table.js.map +1 -1
- package/dist/esm/core/sparql/builder/expression-builder.d.ts +1 -0
- package/dist/esm/core/sparql/builder/expression-builder.d.ts.map +1 -1
- package/dist/esm/core/sparql/builder/expression-builder.js +50 -7
- package/dist/esm/core/sparql/builder/expression-builder.js.map +1 -1
- package/dist/esm/core/subject/resolver.d.ts +19 -0
- package/dist/esm/core/subject/resolver.d.ts.map +1 -1
- package/dist/esm/core/subject/resolver.js +75 -19
- package/dist/esm/core/subject/resolver.js.map +1 -1
- package/dist/esm/core/triple/builder.d.ts.map +1 -1
- package/dist/esm/core/triple/builder.js +38 -1
- package/dist/esm/core/triple/builder.js.map +1 -1
- package/dist/esm/core/triple/handlers/inverse.d.ts +6 -2
- package/dist/esm/core/triple/handlers/inverse.d.ts.map +1 -1
- package/dist/esm/core/triple/handlers/inverse.js +37 -16
- package/dist/esm/core/triple/handlers/inverse.js.map +1 -1
- package/dist/esm/core/uri/resolver.d.ts +66 -2
- package/dist/esm/core/uri/resolver.d.ts.map +1 -1
- package/dist/esm/core/uri/resolver.js +218 -80
- package/dist/esm/core/uri/resolver.js.map +1 -1
- package/dist/esm/core/uri/types.d.ts +11 -1
- package/dist/esm/core/uri/types.d.ts.map +1 -1
- package/package.json +5 -1
- 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":";AAAA
|
|
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
|
|
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
|
-
|
|
15
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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,
|
|
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 =>
|
|
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
|
-
//
|
|
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
|
|
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
|
-
|
|
15
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
|
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,
|
|
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"}
|