@agentshouse/mdruntime 0.1.0-alpha.42 → 0.1.0-alpha.43
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/AGENTS.md +12 -5
- package/dist/adapter.d.ts +15 -0
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js.map +1 -1
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +6 -1
- package/dist/bootstrap.js.map +1 -1
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +3 -2
- package/dist/change-set.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/memory.d.ts +2 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +17 -5
- package/dist/memory.js.map +1 -1
- package/dist/overlay.d.ts +7 -2
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +48 -15
- package/dist/overlay.js.map +1 -1
- package/dist/query.d.ts +4 -0
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +4 -1
- package/dist/query.js.map +1 -1
- package/dist/read-side.d.ts.map +1 -1
- package/dist/read-side.js +6 -0
- package/dist/read-side.js.map +1 -1
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +12 -2
- package/dist/refresh.js.map +1 -1
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +9 -0
- package/dist/replica.js.map +1 -1
- package/dist/rows.d.ts +3 -1
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +5 -3
- package/dist/rows.js.map +1 -1
- package/dist/store.d.ts +2 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +20 -12
- package/dist/store.js.map +1 -1
- package/package.json +1 -1
package/dist/overlay.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { apply, parse, serialize } from '@agentshouse/mdmodel';
|
|
2
|
+
export function sameChange(left, right) {
|
|
3
|
+
if (left === undefined || right === undefined) return left === right;
|
|
4
|
+
return left.time === right.time && left.author?.kind === right.author?.kind && left.author?.id === right.author?.id && left.author?.name === right.author?.name;
|
|
5
|
+
}
|
|
2
6
|
const EMPTY_FRONTMATTER = '---\n---\n';
|
|
3
7
|
function at(path, name) {
|
|
4
8
|
return `${path} ${name}`;
|
|
@@ -83,14 +87,21 @@ function relocate(staged, from, to) {
|
|
|
83
87
|
} else {
|
|
84
88
|
return;
|
|
85
89
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
+
moveHead(staged, from, to);
|
|
91
|
+
}
|
|
92
|
+
function moveHead(heads, from, to) {
|
|
93
|
+
const revision = heads.revisions[from];
|
|
94
|
+
const change = heads.changes[from];
|
|
95
|
+
delete heads.revisions[from];
|
|
96
|
+
delete heads.changes[from];
|
|
97
|
+
delete heads.changes[to];
|
|
98
|
+
if (revision !== undefined) heads.revisions[to] = revision;
|
|
99
|
+
if (change !== undefined) heads.changes[to] = change;
|
|
90
100
|
}
|
|
91
101
|
function erase(staged, path) {
|
|
92
102
|
delete staged.documents[path];
|
|
93
103
|
delete staged.revisions[path];
|
|
104
|
+
delete staged.changes[path];
|
|
94
105
|
staged.binaryTargets.delete(path);
|
|
95
106
|
}
|
|
96
107
|
function stage(staged, change, priors) {
|
|
@@ -100,6 +111,7 @@ function stage(staged, change, priors) {
|
|
|
100
111
|
}
|
|
101
112
|
if (change.kind === 'create') {
|
|
102
113
|
staged.documents[change.path] = 'content' in change ? change.content : compose(change.fields, change.sections);
|
|
114
|
+
delete staged.changes[change.path];
|
|
103
115
|
return;
|
|
104
116
|
}
|
|
105
117
|
if (change.kind === 'replace') {
|
|
@@ -121,6 +133,9 @@ export function overlay(base, queue) {
|
|
|
121
133
|
binaryTargets: new Set(base.binaryTargets),
|
|
122
134
|
revisions: {
|
|
123
135
|
...base.revisions
|
|
136
|
+
},
|
|
137
|
+
changes: {
|
|
138
|
+
...base.changes
|
|
124
139
|
}
|
|
125
140
|
};
|
|
126
141
|
for (const batch of queue){
|
|
@@ -132,7 +147,8 @@ export function overlay(base, queue) {
|
|
|
132
147
|
binaryTargets: [
|
|
133
148
|
...staged.binaryTargets
|
|
134
149
|
].sort(),
|
|
135
|
-
revisions: staged.revisions
|
|
150
|
+
revisions: staged.revisions,
|
|
151
|
+
changes: staged.changes
|
|
136
152
|
};
|
|
137
153
|
}
|
|
138
154
|
function pathsOf(batch) {
|
|
@@ -147,22 +163,28 @@ export function sameLayerText(left, right) {
|
|
|
147
163
|
const paths = Object.keys(left.documents);
|
|
148
164
|
return paths.length === Object.keys(right.documents).length && paths.every((path)=>left.documents[path] === right.documents[path]) && left.binaryTargets.length === right.binaryTargets.length && left.binaryTargets.every((path)=>right.binaryTargets.includes(path));
|
|
149
165
|
}
|
|
150
|
-
function
|
|
151
|
-
const
|
|
152
|
-
|
|
166
|
+
function replayHeads(base, queue) {
|
|
167
|
+
const heads = {
|
|
168
|
+
revisions: {
|
|
169
|
+
...base.revisions
|
|
170
|
+
},
|
|
171
|
+
changes: {
|
|
172
|
+
...base.changes
|
|
173
|
+
}
|
|
153
174
|
};
|
|
154
175
|
for (const batch of queue){
|
|
155
176
|
for (const change of batch.changes){
|
|
156
177
|
if (change.kind === 'remove') {
|
|
157
|
-
delete revisions[change.path];
|
|
178
|
+
delete heads.revisions[change.path];
|
|
179
|
+
delete heads.changes[change.path];
|
|
180
|
+
} else if (change.kind === 'create') {
|
|
181
|
+
delete heads.changes[change.path];
|
|
158
182
|
} else if (change.kind === 'move') {
|
|
159
|
-
|
|
160
|
-
delete revisions[change.path];
|
|
161
|
-
if (revision !== undefined) revisions[change.to] = revision;
|
|
183
|
+
moveHead(heads, change.path, change.to);
|
|
162
184
|
}
|
|
163
185
|
}
|
|
164
186
|
}
|
|
165
|
-
return
|
|
187
|
+
return heads;
|
|
166
188
|
}
|
|
167
189
|
export function overlayChanged(base, queue, previousBase, previousQueue, previousVisible) {
|
|
168
190
|
const before = previousQueue.map((batch)=>JSON.stringify(batch));
|
|
@@ -171,7 +193,7 @@ export function overlayChanged(base, queue, previousBase, previousQueue, previou
|
|
|
171
193
|
return {
|
|
172
194
|
documents: previousVisible.documents,
|
|
173
195
|
binaryTargets: previousVisible.binaryTargets,
|
|
174
|
-
|
|
196
|
+
...replayHeads(base, queue)
|
|
175
197
|
};
|
|
176
198
|
}
|
|
177
199
|
const affected = new Set();
|
|
@@ -180,11 +202,13 @@ export function overlayChanged(base, queue, previousBase, previousQueue, previou
|
|
|
180
202
|
...Object.keys(previousBase.documents),
|
|
181
203
|
...Object.keys(base.revisions),
|
|
182
204
|
...Object.keys(previousBase.revisions),
|
|
205
|
+
...Object.keys(base.changes),
|
|
206
|
+
...Object.keys(previousBase.changes),
|
|
183
207
|
...base.binaryTargets,
|
|
184
208
|
...previousBase.binaryTargets
|
|
185
209
|
]);
|
|
186
210
|
for (const path of paths){
|
|
187
|
-
if (base.documents[path] !== previousBase.documents[path] || base.revisions[path] !== previousBase.revisions[path] || base.binaryTargets.includes(path) !== previousBase.binaryTargets.includes(path)) affected.add(path);
|
|
211
|
+
if (base.documents[path] !== previousBase.documents[path] || base.revisions[path] !== previousBase.revisions[path] || !sameChange(base.changes[path], previousBase.changes[path]) || base.binaryTargets.includes(path) !== previousBase.binaryTargets.includes(path)) affected.add(path);
|
|
188
212
|
}
|
|
189
213
|
const oldIds = new Set(before);
|
|
190
214
|
const newIds = new Set(after);
|
|
@@ -209,13 +233,16 @@ export function overlayChanged(base, queue, previousBase, previousQueue, previou
|
|
|
209
233
|
}
|
|
210
234
|
const documents = {};
|
|
211
235
|
const revisions = {};
|
|
236
|
+
const changes = {};
|
|
212
237
|
for (const path of affected){
|
|
213
238
|
if (base.documents[path] !== undefined) documents[path] = base.documents[path];
|
|
214
239
|
if (base.revisions[path] !== undefined) revisions[path] = base.revisions[path];
|
|
240
|
+
if (base.changes[path] !== undefined) changes[path] = base.changes[path];
|
|
215
241
|
}
|
|
216
242
|
const staged = overlay({
|
|
217
243
|
documents,
|
|
218
244
|
revisions,
|
|
245
|
+
changes,
|
|
219
246
|
binaryTargets: base.binaryTargets.filter((path)=>affected.has(path))
|
|
220
247
|
}, queue.filter((batch)=>pathsOf(batch).some((path)=>affected.has(path))));
|
|
221
248
|
const mergedDocuments = {
|
|
@@ -224,18 +251,24 @@ export function overlayChanged(base, queue, previousBase, previousQueue, previou
|
|
|
224
251
|
const mergedRevisions = {
|
|
225
252
|
...previousVisible.revisions
|
|
226
253
|
};
|
|
254
|
+
const mergedChanges = {
|
|
255
|
+
...previousVisible.changes
|
|
256
|
+
};
|
|
227
257
|
const mergedTargets = new Set(previousVisible.binaryTargets);
|
|
228
258
|
for (const path of affected){
|
|
229
259
|
delete mergedDocuments[path];
|
|
230
260
|
delete mergedRevisions[path];
|
|
261
|
+
delete mergedChanges[path];
|
|
231
262
|
mergedTargets.delete(path);
|
|
232
263
|
}
|
|
233
264
|
Object.assign(mergedDocuments, staged.documents);
|
|
234
265
|
Object.assign(mergedRevisions, staged.revisions);
|
|
266
|
+
Object.assign(mergedChanges, staged.changes);
|
|
235
267
|
for (const path of staged.binaryTargets)mergedTargets.add(path);
|
|
236
268
|
return {
|
|
237
269
|
documents: mergedDocuments,
|
|
238
270
|
revisions: mergedRevisions,
|
|
271
|
+
changes: mergedChanges,
|
|
239
272
|
binaryTargets: [
|
|
240
273
|
...mergedTargets
|
|
241
274
|
].sort()
|
package/dist/overlay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/workspace/packages/mdruntime/src/overlay.ts"],"sourcesContent":["import { apply, parse, serialize, type Document } from '@agentshouse/mdmodel';\nimport type { Change, ChangeBatch, Precondition } from './change.js';\n\nexport type Layer = {\n documents: Readonly<Record<string, string>>;\n binaryTargets: readonly string[];\n revisions: Readonly<Record<string, string>>;\n};\n\ntype Staged = {\n documents: Record<string, string>;\n binaryTargets: Set<string>;\n revisions: Record<string, string>;\n};\n\ntype Priors = {\n field(path: string, name: string): unknown;\n section(path: string, name: string): string;\n preamble(path: string): string;\n};\n\nconst EMPTY_FRONTMATTER = '---\\n---\\n';\n\nfunction at(path: string, name: string) {\n return `${path} ${name}`;\n}\n\nfunction priorsOf(preconditions: readonly Precondition[]): Priors {\n const fields = new Map<string, unknown>();\n const sections = new Map<string, string>();\n const preambles = new Map<string, string>();\n for (const precondition of preconditions) {\n if (precondition.kind === 'field') {\n fields.set(at(precondition.path, precondition.name), precondition.value);\n }\n if (precondition.kind === 'section') {\n sections.set(at(precondition.path, precondition.name), precondition.value);\n }\n if (precondition.kind === 'preamble') {\n preambles.set(precondition.path, precondition.value);\n }\n }\n return {\n field: (path, name) => fields.get(at(path, name)),\n section: (path, name) => sections.get(at(path, name)) ?? '',\n preamble: (path) => preambles.get(path) ?? '',\n };\n}\n\nfunction compose(\n fields: Readonly<Record<string, unknown>>,\n sections: Readonly<Record<string, string>>,\n): string {\n const body = Object.entries(sections)\n .map(([name, value]) => `\\n## ${name}\\n${value}`)\n .join('');\n const skeleton = `${EMPTY_FRONTMATTER}${body}`;\n const opened = parse(skeleton);\n if (!opened.ok) return skeleton;\n let document: Document = opened.document;\n for (const [name, value] of Object.entries(fields)) {\n const next = apply(document, { kind: 'field', name, value, prior: undefined });\n if (next.outcome === 'applied') document = next.document;\n }\n return serialize(document);\n}\n\nfunction edited(document: Document, change: Change, priors: Priors) {\n if (change.kind === 'field') {\n return apply(document, {\n kind: 'field',\n name: change.name,\n value: change.value,\n prior: priors.field(change.path, change.name),\n });\n }\n if (change.kind === 'preamble') {\n return apply(document, {\n kind: 'preamble',\n value: change.value,\n prior: priors.preamble(change.path),\n });\n }\n if (change.kind !== 'section') return null;\n return apply(document, {\n kind: 'section',\n name: change.name,\n value: change.value,\n prior: priors.section(change.path, change.name),\n });\n}\n\nfunction edit(staged: Staged, change: Change, priors: Priors) {\n const text = staged.documents[change.path];\n if (text === undefined) return;\n const parsed = parse(text, change.path);\n if (!parsed.ok) return;\n const next = edited(parsed.document, change, priors);\n if (next?.outcome === 'applied') staged.documents[change.path] = serialize(next.document);\n}\n\nfunction relocate(staged: Staged, from: string, to: string) {\n const text = staged.documents[from];\n if (text !== undefined) {\n delete staged.documents[from];\n staged.documents[to] = text;\n } else if (staged.binaryTargets.delete(from)) {\n staged.binaryTargets.add(to);\n } else {\n return;\n }\n const revision = staged.revisions[from];\n if (revision === undefined) return;\n delete staged.revisions[from];\n staged.revisions[to] = revision;\n}\n\nfunction erase(staged: Staged, path: string) {\n delete staged.documents[path];\n delete staged.revisions[path];\n staged.binaryTargets.delete(path);\n}\n\nfunction stage(staged: Staged, change: Change, priors: Priors) {\n if (change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble') {\n edit(staged, change, priors);\n return;\n }\n if (change.kind === 'create') {\n staged.documents[change.path] =\n 'content' in change ? change.content : compose(change.fields, change.sections);\n return;\n }\n if (change.kind === 'replace') {\n if (staged.documents[change.path] === undefined) return;\n staged.documents[change.path] = change.content;\n return;\n }\n if (change.kind === 'move') {\n relocate(staged, change.path, change.to);\n return;\n }\n erase(staged, change.path);\n}\n\nexport function overlay(base: Layer, queue: readonly ChangeBatch[]): Layer {\n const staged: Staged = {\n documents: { ...base.documents },\n binaryTargets: new Set(base.binaryTargets),\n revisions: { ...base.revisions },\n };\n for (const batch of queue) {\n const priors = priorsOf(batch.preconditions);\n for (const change of batch.changes) stage(staged, change, priors);\n }\n return {\n documents: staged.documents,\n binaryTargets: [...staged.binaryTargets].sort(),\n revisions: staged.revisions,\n };\n}\n\nfunction pathsOf(batch: ChangeBatch): readonly string[] {\n return batch.changes.flatMap((change) =>\n change.kind === 'move' ? [change.path, change.to] : [change.path],\n );\n}\n\nexport function sameLayerText(left: Layer, right: Layer): boolean {\n const paths = Object.keys(left.documents);\n return (\n paths.length === Object.keys(right.documents).length &&\n paths.every((path) => left.documents[path] === right.documents[path]) &&\n left.binaryTargets.length === right.binaryTargets.length &&\n left.binaryTargets.every((path) => right.binaryTargets.includes(path))\n );\n}\n\nfunction replayRevisions(\n base: Readonly<Record<string, string>>,\n queue: readonly ChangeBatch[],\n): Readonly<Record<string, string>> {\n const revisions = { ...base };\n for (const batch of queue) {\n for (const change of batch.changes) {\n if (change.kind === 'remove') {\n delete revisions[change.path];\n } else if (change.kind === 'move') {\n const revision = revisions[change.path];\n delete revisions[change.path];\n if (revision !== undefined) revisions[change.to] = revision;\n }\n }\n }\n return revisions;\n}\n\nexport function overlayChanged(\n base: Layer,\n queue: readonly ChangeBatch[],\n previousBase: Layer,\n previousQueue: readonly ChangeBatch[],\n previousVisible: Layer,\n): Layer {\n const before = previousQueue.map((batch) => JSON.stringify(batch));\n const after = queue.map((batch) => JSON.stringify(batch));\n if (\n before.length === after.length &&\n before.every((id, index) => id === after[index]) &&\n sameLayerText(base, previousBase)\n ) {\n return {\n documents: previousVisible.documents,\n binaryTargets: previousVisible.binaryTargets,\n revisions: replayRevisions(base.revisions, queue),\n };\n }\n const affected = new Set<string>();\n const paths = new Set([\n ...Object.keys(base.documents),\n ...Object.keys(previousBase.documents),\n ...Object.keys(base.revisions),\n ...Object.keys(previousBase.revisions),\n ...base.binaryTargets,\n ...previousBase.binaryTargets,\n ]);\n for (const path of paths) {\n if (\n base.documents[path] !== previousBase.documents[path] ||\n base.revisions[path] !== previousBase.revisions[path] ||\n base.binaryTargets.includes(path) !== previousBase.binaryTargets.includes(path)\n )\n affected.add(path);\n }\n const oldIds = new Set(before);\n const newIds = new Set(after);\n for (const batch of previousQueue) {\n if (!newIds.has(JSON.stringify(batch))) for (const path of pathsOf(batch)) affected.add(path);\n }\n for (const batch of queue) {\n if (!oldIds.has(JSON.stringify(batch))) for (const path of pathsOf(batch)) affected.add(path);\n }\n let expanded = true;\n while (expanded) {\n expanded = false;\n for (const batch of queue) {\n const touched = pathsOf(batch);\n if (!touched.some((path) => affected.has(path))) continue;\n for (const path of touched) {\n if (affected.has(path)) continue;\n affected.add(path);\n expanded = true;\n }\n }\n }\n const documents: Record<string, string> = {};\n const revisions: Record<string, string> = {};\n for (const path of affected) {\n if (base.documents[path] !== undefined) documents[path] = base.documents[path];\n if (base.revisions[path] !== undefined) revisions[path] = base.revisions[path];\n }\n const staged = overlay(\n {\n documents,\n revisions,\n binaryTargets: base.binaryTargets.filter((path) => affected.has(path)),\n },\n queue.filter((batch) => pathsOf(batch).some((path) => affected.has(path))),\n );\n const mergedDocuments = { ...previousVisible.documents };\n const mergedRevisions = { ...previousVisible.revisions };\n const mergedTargets = new Set(previousVisible.binaryTargets);\n for (const path of affected) {\n delete mergedDocuments[path];\n delete mergedRevisions[path];\n mergedTargets.delete(path);\n }\n Object.assign(mergedDocuments, staged.documents);\n Object.assign(mergedRevisions, staged.revisions);\n for (const path of staged.binaryTargets) mergedTargets.add(path);\n return {\n documents: mergedDocuments,\n revisions: mergedRevisions,\n binaryTargets: [...mergedTargets].sort(),\n };\n}\n"],"names":["apply","parse","serialize","EMPTY_FRONTMATTER","at","path","name","priorsOf","preconditions","fields","Map","sections","preambles","precondition","kind","set","value","field","get","section","preamble","compose","body","Object","entries","map","join","skeleton","opened","ok","document","next","prior","undefined","outcome","edited","change","priors","edit","staged","text","documents","parsed","relocate","from","to","binaryTargets","delete","add","revision","revisions","erase","stage","content","overlay","base","queue","Set","batch","changes","sort","pathsOf","flatMap","sameLayerText","left","right","paths","keys","length","every","includes","replayRevisions","overlayChanged","previousBase","previousQueue","previousVisible","before","JSON","stringify","after","id","index","affected","oldIds","newIds","has","expanded","touched","some","filter","mergedDocuments","mergedRevisions","mergedTargets","assign"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime/src/overlay.ts"],"sourcesContent":["import { apply, parse, serialize, type Document } from '@agentshouse/mdmodel';\nimport type { HeadChange } from './adapter.js';\nimport type { Change, ChangeBatch, Precondition } from './change.js';\n\nexport type Heads = {\n revisions: Readonly<Record<string, string>>;\n changes: Readonly<Record<string, HeadChange>>;\n};\n\nexport type Layer = Heads & {\n documents: Readonly<Record<string, string>>;\n binaryTargets: readonly string[];\n};\n\nexport function sameChange(left: HeadChange | undefined, right: HeadChange | undefined): boolean {\n if (left === undefined || right === undefined) return left === right;\n return (\n left.time === right.time &&\n left.author?.kind === right.author?.kind &&\n left.author?.id === right.author?.id &&\n left.author?.name === right.author?.name\n );\n}\n\ntype HeldHeads = { revisions: Record<string, string>; changes: Record<string, HeadChange> };\n\ntype Staged = HeldHeads & {\n documents: Record<string, string>;\n binaryTargets: Set<string>;\n};\n\ntype Priors = {\n field(path: string, name: string): unknown;\n section(path: string, name: string): string;\n preamble(path: string): string;\n};\n\nconst EMPTY_FRONTMATTER = '---\\n---\\n';\n\nfunction at(path: string, name: string) {\n return `${path} ${name}`;\n}\n\nfunction priorsOf(preconditions: readonly Precondition[]): Priors {\n const fields = new Map<string, unknown>();\n const sections = new Map<string, string>();\n const preambles = new Map<string, string>();\n for (const precondition of preconditions) {\n if (precondition.kind === 'field') {\n fields.set(at(precondition.path, precondition.name), precondition.value);\n }\n if (precondition.kind === 'section') {\n sections.set(at(precondition.path, precondition.name), precondition.value);\n }\n if (precondition.kind === 'preamble') {\n preambles.set(precondition.path, precondition.value);\n }\n }\n return {\n field: (path, name) => fields.get(at(path, name)),\n section: (path, name) => sections.get(at(path, name)) ?? '',\n preamble: (path) => preambles.get(path) ?? '',\n };\n}\n\nfunction compose(\n fields: Readonly<Record<string, unknown>>,\n sections: Readonly<Record<string, string>>,\n): string {\n const body = Object.entries(sections)\n .map(([name, value]) => `\\n## ${name}\\n${value}`)\n .join('');\n const skeleton = `${EMPTY_FRONTMATTER}${body}`;\n const opened = parse(skeleton);\n if (!opened.ok) return skeleton;\n let document: Document = opened.document;\n for (const [name, value] of Object.entries(fields)) {\n const next = apply(document, { kind: 'field', name, value, prior: undefined });\n if (next.outcome === 'applied') document = next.document;\n }\n return serialize(document);\n}\n\nfunction edited(document: Document, change: Change, priors: Priors) {\n if (change.kind === 'field') {\n return apply(document, {\n kind: 'field',\n name: change.name,\n value: change.value,\n prior: priors.field(change.path, change.name),\n });\n }\n if (change.kind === 'preamble') {\n return apply(document, {\n kind: 'preamble',\n value: change.value,\n prior: priors.preamble(change.path),\n });\n }\n if (change.kind !== 'section') return null;\n return apply(document, {\n kind: 'section',\n name: change.name,\n value: change.value,\n prior: priors.section(change.path, change.name),\n });\n}\n\nfunction edit(staged: Staged, change: Change, priors: Priors) {\n const text = staged.documents[change.path];\n if (text === undefined) return;\n const parsed = parse(text, change.path);\n if (!parsed.ok) return;\n const next = edited(parsed.document, change, priors);\n if (next?.outcome === 'applied') staged.documents[change.path] = serialize(next.document);\n}\n\nfunction relocate(staged: Staged, from: string, to: string) {\n const text = staged.documents[from];\n if (text !== undefined) {\n delete staged.documents[from];\n staged.documents[to] = text;\n } else if (staged.binaryTargets.delete(from)) {\n staged.binaryTargets.add(to);\n } else {\n return;\n }\n moveHead(staged, from, to);\n}\n\nfunction moveHead(heads: HeldHeads, from: string, to: string) {\n const revision = heads.revisions[from];\n const change = heads.changes[from];\n delete heads.revisions[from];\n delete heads.changes[from];\n delete heads.changes[to];\n if (revision !== undefined) heads.revisions[to] = revision;\n if (change !== undefined) heads.changes[to] = change;\n}\n\nfunction erase(staged: Staged, path: string) {\n delete staged.documents[path];\n delete staged.revisions[path];\n delete staged.changes[path];\n staged.binaryTargets.delete(path);\n}\n\nfunction stage(staged: Staged, change: Change, priors: Priors) {\n if (change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble') {\n edit(staged, change, priors);\n return;\n }\n if (change.kind === 'create') {\n staged.documents[change.path] =\n 'content' in change ? change.content : compose(change.fields, change.sections);\n delete staged.changes[change.path];\n return;\n }\n if (change.kind === 'replace') {\n if (staged.documents[change.path] === undefined) return;\n staged.documents[change.path] = change.content;\n return;\n }\n if (change.kind === 'move') {\n relocate(staged, change.path, change.to);\n return;\n }\n erase(staged, change.path);\n}\n\nexport function overlay(base: Layer, queue: readonly ChangeBatch[]): Layer {\n const staged: Staged = {\n documents: { ...base.documents },\n binaryTargets: new Set(base.binaryTargets),\n revisions: { ...base.revisions },\n changes: { ...base.changes },\n };\n for (const batch of queue) {\n const priors = priorsOf(batch.preconditions);\n for (const change of batch.changes) stage(staged, change, priors);\n }\n return {\n documents: staged.documents,\n binaryTargets: [...staged.binaryTargets].sort(),\n revisions: staged.revisions,\n changes: staged.changes,\n };\n}\n\nfunction pathsOf(batch: ChangeBatch): readonly string[] {\n return batch.changes.flatMap((change) =>\n change.kind === 'move' ? [change.path, change.to] : [change.path],\n );\n}\n\nexport function sameLayerText(left: Layer, right: Layer): boolean {\n const paths = Object.keys(left.documents);\n return (\n paths.length === Object.keys(right.documents).length &&\n paths.every((path) => left.documents[path] === right.documents[path]) &&\n left.binaryTargets.length === right.binaryTargets.length &&\n left.binaryTargets.every((path) => right.binaryTargets.includes(path))\n );\n}\n\nfunction replayHeads(base: Heads, queue: readonly ChangeBatch[]): Heads {\n const heads: HeldHeads = { revisions: { ...base.revisions }, changes: { ...base.changes } };\n for (const batch of queue) {\n for (const change of batch.changes) {\n if (change.kind === 'remove') {\n delete heads.revisions[change.path];\n delete heads.changes[change.path];\n } else if (change.kind === 'create') {\n delete heads.changes[change.path];\n } else if (change.kind === 'move') {\n moveHead(heads, change.path, change.to);\n }\n }\n }\n return heads;\n}\n\nexport function overlayChanged(\n base: Layer,\n queue: readonly ChangeBatch[],\n previousBase: Layer,\n previousQueue: readonly ChangeBatch[],\n previousVisible: Layer,\n): Layer {\n const before = previousQueue.map((batch) => JSON.stringify(batch));\n const after = queue.map((batch) => JSON.stringify(batch));\n if (\n before.length === after.length &&\n before.every((id, index) => id === after[index]) &&\n sameLayerText(base, previousBase)\n ) {\n return {\n documents: previousVisible.documents,\n binaryTargets: previousVisible.binaryTargets,\n ...replayHeads(base, queue),\n };\n }\n const affected = new Set<string>();\n const paths = new Set([\n ...Object.keys(base.documents),\n ...Object.keys(previousBase.documents),\n ...Object.keys(base.revisions),\n ...Object.keys(previousBase.revisions),\n ...Object.keys(base.changes),\n ...Object.keys(previousBase.changes),\n ...base.binaryTargets,\n ...previousBase.binaryTargets,\n ]);\n for (const path of paths) {\n if (\n base.documents[path] !== previousBase.documents[path] ||\n base.revisions[path] !== previousBase.revisions[path] ||\n !sameChange(base.changes[path], previousBase.changes[path]) ||\n base.binaryTargets.includes(path) !== previousBase.binaryTargets.includes(path)\n )\n affected.add(path);\n }\n const oldIds = new Set(before);\n const newIds = new Set(after);\n for (const batch of previousQueue) {\n if (!newIds.has(JSON.stringify(batch))) for (const path of pathsOf(batch)) affected.add(path);\n }\n for (const batch of queue) {\n if (!oldIds.has(JSON.stringify(batch))) for (const path of pathsOf(batch)) affected.add(path);\n }\n let expanded = true;\n while (expanded) {\n expanded = false;\n for (const batch of queue) {\n const touched = pathsOf(batch);\n if (!touched.some((path) => affected.has(path))) continue;\n for (const path of touched) {\n if (affected.has(path)) continue;\n affected.add(path);\n expanded = true;\n }\n }\n }\n const documents: Record<string, string> = {};\n const revisions: Record<string, string> = {};\n const changes: Record<string, HeadChange> = {};\n for (const path of affected) {\n if (base.documents[path] !== undefined) documents[path] = base.documents[path];\n if (base.revisions[path] !== undefined) revisions[path] = base.revisions[path];\n if (base.changes[path] !== undefined) changes[path] = base.changes[path];\n }\n const staged = overlay(\n {\n documents,\n revisions,\n changes,\n binaryTargets: base.binaryTargets.filter((path) => affected.has(path)),\n },\n queue.filter((batch) => pathsOf(batch).some((path) => affected.has(path))),\n );\n const mergedDocuments = { ...previousVisible.documents };\n const mergedRevisions = { ...previousVisible.revisions };\n const mergedChanges = { ...previousVisible.changes };\n const mergedTargets = new Set(previousVisible.binaryTargets);\n for (const path of affected) {\n delete mergedDocuments[path];\n delete mergedRevisions[path];\n delete mergedChanges[path];\n mergedTargets.delete(path);\n }\n Object.assign(mergedDocuments, staged.documents);\n Object.assign(mergedRevisions, staged.revisions);\n Object.assign(mergedChanges, staged.changes);\n for (const path of staged.binaryTargets) mergedTargets.add(path);\n return {\n documents: mergedDocuments,\n revisions: mergedRevisions,\n changes: mergedChanges,\n binaryTargets: [...mergedTargets].sort(),\n };\n}\n"],"names":["apply","parse","serialize","sameChange","left","right","undefined","time","author","kind","id","name","EMPTY_FRONTMATTER","at","path","priorsOf","preconditions","fields","Map","sections","preambles","precondition","set","value","field","get","section","preamble","compose","body","Object","entries","map","join","skeleton","opened","ok","document","next","prior","outcome","edited","change","priors","edit","staged","text","documents","parsed","relocate","from","to","binaryTargets","delete","add","moveHead","heads","revision","revisions","changes","erase","stage","content","overlay","base","queue","Set","batch","sort","pathsOf","flatMap","sameLayerText","paths","keys","length","every","includes","replayHeads","overlayChanged","previousBase","previousQueue","previousVisible","before","JSON","stringify","after","index","affected","oldIds","newIds","has","expanded","touched","some","filter","mergedDocuments","mergedRevisions","mergedChanges","mergedTargets","assign"],"mappings":"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"}
|
package/dist/query.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Definition } from '@agentshouse/mdmodel';
|
|
2
|
+
import type { HeadChange } from './adapter.js';
|
|
2
3
|
export type Value = string | number | boolean | null;
|
|
3
4
|
export type Predicate = Value | {
|
|
4
5
|
$eq: Value;
|
|
@@ -51,6 +52,7 @@ export type Select = 'all' | {
|
|
|
51
52
|
preamble?: true;
|
|
52
53
|
markdown?: true;
|
|
53
54
|
backlinks?: true;
|
|
55
|
+
change?: true;
|
|
54
56
|
};
|
|
55
57
|
export type OrderOptions = {
|
|
56
58
|
nulls?: 'first' | 'last';
|
|
@@ -90,6 +92,7 @@ export type QueryDocument = {
|
|
|
90
92
|
preamble?: string;
|
|
91
93
|
markdown?: string;
|
|
92
94
|
backlinks?: readonly Backlink[];
|
|
95
|
+
change?: HeadChange | null;
|
|
93
96
|
};
|
|
94
97
|
export type QueryGroup = {
|
|
95
98
|
key: readonly unknown[];
|
|
@@ -167,6 +170,7 @@ export type DocumentShape = {
|
|
|
167
170
|
preamble: boolean;
|
|
168
171
|
markdown: boolean;
|
|
169
172
|
backlinks: boolean;
|
|
173
|
+
change: boolean;
|
|
170
174
|
orderBy: readonly {
|
|
171
175
|
key: KeyPlan;
|
|
172
176
|
options: OrderOptions & {
|
package/dist/query.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
|
package/dist/query.js
CHANGED
|
@@ -38,7 +38,8 @@ const PARTS = [
|
|
|
38
38
|
'sections',
|
|
39
39
|
'preamble',
|
|
40
40
|
'markdown',
|
|
41
|
-
'backlinks'
|
|
41
|
+
'backlinks',
|
|
42
|
+
'change'
|
|
42
43
|
];
|
|
43
44
|
const ORDER = [
|
|
44
45
|
'by',
|
|
@@ -376,6 +377,7 @@ function documentShape(typed, input) {
|
|
|
376
377
|
preamble: true,
|
|
377
378
|
markdown: true,
|
|
378
379
|
backlinks: true,
|
|
380
|
+
change: true,
|
|
379
381
|
orderBy
|
|
380
382
|
};
|
|
381
383
|
}
|
|
@@ -388,6 +390,7 @@ function documentShape(typed, input) {
|
|
|
388
390
|
preamble: flag(select.preamble, 'select.preamble'),
|
|
389
391
|
markdown: flag(select.markdown, 'select.markdown'),
|
|
390
392
|
backlinks: flag(select.backlinks, 'select.backlinks'),
|
|
393
|
+
change: flag(select.change, 'select.change'),
|
|
391
394
|
orderBy
|
|
392
395
|
};
|
|
393
396
|
}
|
package/dist/query.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/workspace/packages/mdruntime/src/query.ts"],"sourcesContent":["import type { Definition, FieldSpec } from '@agentshouse/mdmodel';\nimport { normalize } from './paths.js';\n\nexport type Value = string | number | boolean | null;\n\nexport type Predicate =\n | Value\n | { $eq: Value }\n | { $ne: Value }\n | { $in: readonly Value[] }\n | { $nin: readonly Value[] }\n | { $gt?: Value; $gte?: Value; $lt?: Value; $lte?: Value }\n | { $all: readonly Value[] }\n | { $size: number }\n | { $exists: boolean };\n\nexport type Where = {\n $and?: readonly Where[];\n $or?: readonly Where[];\n [field: string]: Predicate | readonly Where[] | undefined;\n};\n\nexport type Related = { types?: readonly string[]; where?: Where; pathPrefix?: string };\n\nexport type Filter = {\n rooms?: readonly string[];\n types?: readonly string[];\n where?: Where;\n pathPrefix?: string;\n hop?: Related & { field: string };\n backlinks?: Related & { field?: string };\n};\n\nexport type Key = 'room' | 'path' | 'type' | { field: string };\n\nexport type Select =\n | 'all'\n | {\n fields?: 'all' | readonly string[];\n sections?: 'all' | readonly string[];\n preamble?: true;\n markdown?: true;\n backlinks?: true;\n };\n\nexport type OrderOptions = {\n nulls?: 'first' | 'last';\n stringSort?: 'lexical' | 'locale';\n locale?: string;\n localeOptions?: Readonly<Record<string, unknown>>;\n};\n\nexport type Direction = 'asc' | 'desc';\n\nexport type DocumentQuery = Filter & {\n select: Select;\n orderBy?: readonly ({ by: Key; direction?: Direction } & OrderOptions)[];\n limit?: number;\n};\n\nexport type GroupQuery = Filter & {\n groupBy: readonly Exclude<Key, 'path'>[];\n orderBy?: readonly { by: 'count' | Exclude<Key, 'path'>; direction?: Direction }[];\n limit?: number;\n};\n\nexport type LocalQuery = DocumentQuery | GroupQuery;\n\nexport type Backlink = { path: string; type: string; field: string };\n\nexport type QueryDocument = {\n room: string;\n path: string;\n type?: string;\n fields?: Readonly<Record<string, unknown>>;\n sections?: Readonly<Record<string, string>>;\n preamble?: string;\n markdown?: string;\n backlinks?: readonly Backlink[];\n};\n\nexport type QueryGroup = { key: readonly unknown[]; count: number };\n\nexport type DocumentResult = { documents: readonly QueryDocument[] };\n\nexport type GroupResult = { groups: readonly QueryGroup[] };\n\nexport type QueryResult = DocumentResult | GroupResult;\n\nexport type QueryErrorCode = 'invalid-query' | 'unknown-type' | 'unknown-field' | 'wrong-kind';\n\nexport type RoomFacts = {\n locator: string;\n available: boolean;\n types: readonly Definition[];\n};\n\nexport type HeldRooms = {\n listed: boolean;\n rooms: readonly RoomFacts[];\n};\n\nexport type Test =\n | { op: 'eq'; value: Value }\n | { op: 'ne'; value: Value }\n | { op: 'in'; values: readonly Value[] }\n | { op: 'nin'; values: readonly Value[] }\n | { op: 'range'; bounds: readonly (readonly ['gt' | 'gte' | 'lt' | 'lte', Value])[] }\n | { op: 'all'; values: readonly Value[] }\n | { op: 'size'; size: number }\n | { op: 'exists'; exists: boolean };\n\nexport type Condition =\n | { every: readonly Condition[] }\n | { some: readonly Condition[] }\n | { field: string; test: Test };\n\nexport type Scope = {\n types: readonly string[] | null;\n where: Condition | null;\n pathPrefix: string | null;\n};\n\nexport type KeyPlan =\n | { of: 'room' }\n | { of: 'path' }\n | { of: 'type' }\n | { of: 'field'; field: string };\n\nexport type DocumentShape = {\n kind: 'documents';\n fields: 'all' | readonly string[] | null;\n sections: 'all' | readonly string[] | null;\n preamble: boolean;\n markdown: boolean;\n backlinks: boolean;\n orderBy: readonly { key: KeyPlan; options: OrderOptions & { direction: Direction } }[];\n};\n\nexport type GroupShape = {\n kind: 'groups';\n groupBy: readonly KeyPlan[];\n orderBy: readonly { by: 'count' | number; direction: Direction }[];\n};\n\nexport type Plan = {\n rooms: readonly string[] | null;\n root: Scope;\n hop: (Scope & { field: string }) | null;\n backlinks: (Scope & { field: string | null }) | null;\n shape: DocumentShape | GroupShape;\n limit: number | null;\n};\n\nexport class QueryError extends Error {\n constructor(code: QueryErrorCode, at: string, problem: string) {\n super(`${code} at ${at}: ${problem}`);\n }\n}\n\ntype Entries = Readonly<Record<string, unknown>>;\n\ntype Typing = { untyped: boolean; types: readonly Definition[] };\n\nconst RANGE = ['$gt', '$gte', '$lt', '$lte'] as const;\nconst SINGLE = ['$eq', '$ne', '$in', '$nin', '$all', '$size', '$exists'] as const;\nconst FILTER = ['rooms', 'types', 'where', 'pathPrefix', 'hop', 'backlinks'];\nconst RELATED = ['types', 'where', 'pathPrefix', 'field'];\nconst PARTS = ['fields', 'sections', 'preamble', 'markdown', 'backlinks'];\nconst ORDER = ['by', 'direction', 'nulls', 'stringSort', 'locale', 'localeOptions'];\nconst CALENDAR_DATE = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\nexport function invalid(at: string, problem: string): never {\n throw new QueryError('invalid-query', at, problem);\n}\n\nfunction place(at: string, name: string): string {\n return at === '' ? name : `${at}.${name}`;\n}\n\nexport function plain(value: unknown): value is Entries {\n return (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null)\n );\n}\n\nexport function known(value: Entries, allowed: readonly string[], at: string) {\n for (const name of Object.keys(value)) {\n if (!allowed.includes(name)) invalid(place(at, name), 'unknown part');\n }\n}\n\nfunction list(input: unknown, at: string): readonly unknown[] {\n if (!Array.isArray(input)) invalid(at, 'expects a list');\n return input;\n}\n\nfunction value(input: unknown, at: string): Value {\n if (Array.isArray(input)) invalid(at, 'a list is not a value');\n if (\n input !== null &&\n typeof input !== 'string' &&\n typeof input !== 'boolean' &&\n !(typeof input === 'number' && Number.isFinite(input))\n ) {\n invalid(at, 'not a value');\n }\n return input;\n}\n\nfunction values(input: unknown, at: string): readonly Value[] {\n return list(input, at).map((item, index) => value(item, `${at}[${index}]`));\n}\n\nfunction names(input: unknown, at: string): readonly string[] {\n const listed = list(input, at);\n if (listed.some((item) => typeof item !== 'string')) invalid(at, 'expects a list of names');\n return [...new Set(listed as readonly string[])].sort();\n}\n\nfunction directory(input: unknown, at: string): string {\n if (typeof input !== 'string' || normalize(input) !== input) {\n invalid(at, 'expects a normalized directory');\n }\n return input;\n}\n\nfunction calendarDate(value: string): boolean {\n const match = CALENDAR_DATE.exec(value);\n if (match === null) return false;\n const [year, month, day] = match.slice(1).map(Number);\n const date = new Date(Date.UTC(year, month - 1, day));\n return (\n date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day\n );\n}\n\nfunction fits(spec: FieldSpec, value: Value): boolean {\n const item = spec.kind === 'list' ? spec.of : spec;\n if (item.kind === 'number') return typeof value === 'number';\n if (typeof value !== 'string') return false;\n if (item.kind === 'enum') return item.values.includes(value);\n if (item.kind === 'date') return calendarDate(value);\n if (item.kind === 'reference') return value !== '' && normalize(value) === value;\n return true;\n}\n\nfunction reference(spec: FieldSpec): boolean {\n return spec.kind === 'reference' || (spec.kind === 'list' && spec.of.kind === 'reference');\n}\n\nfunction typing(\n facts: HeldRooms,\n rooms: readonly string[] | null,\n types: readonly string[] | null,\n at: string,\n): Typing {\n const read =\n rooms === null ? facts.rooms : facts.rooms.filter((room) => rooms.includes(room.locator));\n const acquiring =\n !facts.listed &&\n (rooms === null ||\n rooms.some((locator) => !facts.rooms.some((room) => room.locator === locator)));\n const available = !acquiring && read.every((room) => room.available);\n const declared = read.flatMap((room) => room.types);\n for (const name of types ?? []) {\n if (name === 'any' || !available || declared.some((type) => type.name === name)) continue;\n throw new QueryError('unknown-type', place(at, 'types'), `no model it reads declares ${name}`);\n }\n return {\n untyped: types === null || types.includes('any') || !available,\n types: types === null ? declared : declared.filter((type) => types.includes(type.name)),\n };\n}\n\nfunction specs(typed: Typing, field: string, at: string): readonly FieldSpec[] {\n const declared = typed.types.flatMap((type) =>\n Object.hasOwn(type.fields, field) ? [type.fields[field]] : [],\n );\n if (declared.length === 0 && !typed.untyped) {\n throw new QueryError('unknown-field', at, `no MD Type it reads declares ${field}`);\n }\n return declared;\n}\n\nfunction kind(declared: readonly FieldSpec[], checked: Value, at: string) {\n if (checked === null || declared.length === 0 || declared.some((spec) => fits(spec, checked))) {\n return;\n }\n throw new QueryError('wrong-kind', at, `${JSON.stringify(checked)} is not of its field's kind`);\n}\n\nfunction listed(declared: readonly FieldSpec[], list: boolean): boolean {\n return declared.length > 0 && declared.every((spec) => (spec.kind === 'list') === list);\n}\n\nfunction test(declared: readonly FieldSpec[], input: unknown, at: string): Test {\n if (!plain(input)) {\n const equal = value(input, at);\n kind(declared, equal, at);\n return { op: 'eq', value: equal };\n }\n const operators = Object.keys(input);\n if (operators.length === 0) invalid(at, 'names no operator');\n if (operators.some((operator) => (RANGE as readonly string[]).includes(operator))) {\n const stray = operators.find((operator) => !(RANGE as readonly string[]).includes(operator));\n if (stray !== undefined) invalid(place(at, stray), 'cannot join a range');\n if (listed(declared, true)) invalid(at, 'a range on a list');\n return {\n op: 'range',\n bounds: RANGE.filter((operator) => operators.includes(operator)).map((operator) => {\n const bound = value(input[operator], place(at, operator));\n if (bound === null) invalid(place(at, operator), 'a range bound is never null');\n kind(declared, bound, place(at, operator));\n return [operator.slice(1) as 'gt' | 'gte' | 'lt' | 'lte', bound] as const;\n }),\n };\n }\n if (operators.length > 1) invalid(place(at, operators[1]), 'names a second operator');\n const [operator] = operators;\n const where = place(at, operator);\n if (!(SINGLE as readonly string[]).includes(operator)) invalid(where, 'unknown operator');\n const operand = input[operator];\n if (operator === '$eq' || operator === '$ne') {\n const compared = value(operand, where);\n kind(declared, compared, where);\n return operator === '$eq' ? { op: 'eq', value: compared } : { op: 'ne', value: compared };\n }\n if (operator === '$in' || operator === '$nin' || operator === '$all') {\n const compared = values(operand, where);\n compared.forEach((item, index) => kind(declared, item, `${where}[${index}]`));\n if (operator === '$in') return { op: 'in', values: compared };\n if (operator === '$nin') return { op: 'nin', values: compared };\n if (compared.includes(null)) invalid(where, 'a list holds no null');\n if (listed(declared, false)) invalid(where, 'the field is not a list');\n return { op: 'all', values: compared };\n }\n if (operator === '$size') {\n if (!Number.isSafeInteger(operand) || (operand as number) < 0) {\n invalid(where, 'expects a nonnegative integer');\n }\n if (listed(declared, false)) invalid(where, 'the field is not a list');\n return { op: 'size', size: operand as number };\n }\n if (typeof operand !== 'boolean') invalid(where, 'expects true or false');\n return { op: 'exists', exists: operand };\n}\n\nfunction condition(typed: Typing, input: unknown, at: string): Condition {\n if (!plain(input)) invalid(at, 'expects an object of field predicates');\n const conditions: Condition[] = [];\n for (const name of Object.keys(input).sort()) {\n const where = place(at, name);\n const entry = input[name];\n if (name === '$and' || name === '$or') {\n const nested = list(entry, where).map((item, index) =>\n condition(typed, item, `${where}[${index}]`),\n );\n if (nested.length === 0) invalid(where, 'expects a nonempty list');\n conditions.push(name === '$and' ? { every: nested } : { some: nested });\n continue;\n }\n if (name.startsWith('$')) invalid(where, 'unknown operator');\n conditions.push({ field: name, test: test(specs(typed, name, where), entry, where) });\n }\n if (conditions.length === 0) invalid(at, 'names no field');\n return conditions.length === 1 ? conditions[0] : { every: conditions };\n}\n\nfunction scope(\n facts: HeldRooms,\n rooms: readonly string[] | null,\n input: Entries,\n at: string,\n): Scope & { typed: Typing } {\n const types = input.types === undefined ? null : names(input.types, place(at, 'types'));\n const typed = typing(facts, rooms, types, at);\n return {\n typed,\n types,\n where:\n input.where === undefined || (plain(input.where) && Object.keys(input.where).length === 0)\n ? null\n : condition(typed, input.where, place(at, 'where')),\n pathPrefix:\n input.pathPrefix === undefined ? null : directory(input.pathPrefix, place(at, 'pathPrefix')),\n };\n}\n\nfunction referenceField(typed: Typing, field: unknown, at: string): string {\n if (typeof field !== 'string') invalid(at, 'expects a field name');\n const declared = specs(typed, field, at);\n if (declared.length > 0 && !declared.some(reference)) invalid(at, 'not a reference field');\n return field;\n}\n\nfunction hopOf(\n facts: HeldRooms,\n rooms: readonly string[] | null,\n root: Typing,\n input: unknown,\n): Plan['hop'] {\n if (!plain(input)) invalid('hop', 'expects an object');\n known(input, RELATED, 'hop');\n const field = referenceField(root, input.field, 'hop.field');\n const { types, where, pathPrefix } = scope(facts, rooms, input, 'hop');\n return { types, where, pathPrefix, field };\n}\n\nfunction backlinksOf(\n facts: HeldRooms,\n rooms: readonly string[] | null,\n input: unknown,\n): Plan['backlinks'] {\n if (!plain(input)) invalid('backlinks', 'expects an object');\n known(input, RELATED, 'backlinks');\n const { typed, types, where, pathPrefix } = scope(facts, rooms, input, 'backlinks');\n const field =\n input.field === undefined ? null : referenceField(typed, input.field, 'backlinks.field');\n return { types, where, pathPrefix, field };\n}\n\nfunction keyPlan(typed: Typing, input: unknown, at: string, path: boolean): KeyPlan {\n if (input === 'room' || input === 'type' || (path && input === 'path')) return { of: input };\n if (plain(input) && typeof input.field === 'string' && Object.keys(input).length === 1) {\n specs(typed, input.field, place(at, 'field'));\n return { of: 'field', field: input.field };\n }\n return invalid(\n at,\n path ? 'expects room, path, type or a field' : 'expects room, type or a field',\n );\n}\n\nfunction direction(input: unknown, at: string): Direction {\n if (input === undefined) return 'asc';\n if (input !== 'asc' && input !== 'desc') invalid(at, 'expects asc or desc');\n return input;\n}\n\nfunction orderOptions(input: Entries, at: string): OrderOptions & { direction: Direction } {\n const options: OrderOptions & { direction: Direction } = {\n direction: direction(input.direction, place(at, 'direction')),\n };\n if (input.nulls !== undefined) {\n if (input.nulls !== 'first' && input.nulls !== 'last') {\n invalid(place(at, 'nulls'), 'expects first or last');\n }\n options.nulls = input.nulls;\n }\n if (input.stringSort !== undefined) {\n if (input.stringSort !== 'lexical' && input.stringSort !== 'locale') {\n invalid(place(at, 'stringSort'), 'expects lexical or locale');\n }\n options.stringSort = input.stringSort;\n }\n if (input.locale !== undefined) {\n if (typeof input.locale !== 'string' || !collates(input.locale, undefined)) {\n invalid(place(at, 'locale'), 'expects a locale name');\n }\n options.locale = input.locale;\n }\n if (input.localeOptions !== undefined) {\n if (!plain(input.localeOptions) || !collates(options.locale, input.localeOptions)) {\n invalid(place(at, 'localeOptions'), 'expects collation options');\n }\n options.localeOptions = input.localeOptions;\n }\n return options;\n}\n\nfunction collates(locale: string | undefined, options: Entries | undefined): boolean {\n try {\n ''.localeCompare('', locale, options);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction parts(typed: Typing, input: unknown, at: string, fields: boolean) {\n if (input === undefined) return null;\n if (input === 'all') return 'all';\n const named = list(input, at);\n named.forEach((name, index) => {\n if (typeof name !== 'string') invalid(`${at}[${index}]`, 'expects a name');\n if (fields) specs(typed, name, `${at}[${index}]`);\n });\n return named as readonly string[];\n}\n\nfunction flag(input: unknown, at: string): boolean {\n if (input === undefined) return false;\n if (input !== true) invalid(at, 'expects true');\n return true;\n}\n\nfunction documentShape(typed: Typing, input: Entries): DocumentShape {\n const orderBy = (input.orderBy === undefined ? [] : list(input.orderBy, 'orderBy')).map(\n (clause, index) => {\n const at = `orderBy[${index}]`;\n if (!plain(clause)) invalid(at, 'expects an order clause');\n known(clause, ORDER, at);\n return {\n key: keyPlan(typed, clause.by, place(at, 'by'), true),\n options: orderOptions(clause, at),\n };\n },\n );\n const select = input.select;\n if (select === 'all') {\n return {\n kind: 'documents',\n fields: 'all',\n sections: 'all',\n preamble: true,\n markdown: true,\n backlinks: true,\n orderBy,\n };\n }\n if (!plain(select)) invalid('select', \"expects 'all' or the parts to return\");\n known(select, PARTS, 'select');\n return {\n kind: 'documents',\n fields: parts(typed, select.fields, 'select.fields', true),\n sections: parts(typed, select.sections, 'select.sections', false),\n preamble: flag(select.preamble, 'select.preamble'),\n markdown: flag(select.markdown, 'select.markdown'),\n backlinks: flag(select.backlinks, 'select.backlinks'),\n orderBy,\n };\n}\n\nfunction groupShape(typed: Typing, input: Entries): GroupShape {\n const groupBy = list(input.groupBy, 'groupBy').map((key, index) =>\n keyPlan(typed, key, `groupBy[${index}]`, false),\n );\n if (groupBy.length === 0) invalid('groupBy', 'names no key');\n const grouped = groupBy.map((key) => JSON.stringify(key));\n const orderBy = (input.orderBy === undefined ? [] : list(input.orderBy, 'orderBy')).map(\n (clause, index) => {\n const at = `orderBy[${index}]`;\n if (!plain(clause)) invalid(at, 'expects an order clause');\n known(clause, ['by', 'direction'], at);\n const by =\n clause.by === 'count'\n ? ('count' as const)\n : grouped.indexOf(JSON.stringify(keyPlan(typed, clause.by, place(at, 'by'), false)));\n if (by === -1) invalid(place(at, 'by'), 'orders by a key the query does not group by');\n return { by, direction: direction(clause.direction, place(at, 'direction')) };\n },\n );\n return { kind: 'groups', groupBy, orderBy };\n}\n\nexport function planOf(input: unknown, facts: HeldRooms): Plan {\n if (!plain(input)) invalid('query', 'expects a query object');\n const grouped = input.groupBy !== undefined;\n if (grouped && input.select !== undefined) invalid('select', 'a grouped query selects nothing');\n if (!grouped && input.select === undefined) invalid('select', 'a Document query must select');\n known(input, [...FILTER, 'orderBy', 'limit', grouped ? 'groupBy' : 'select'], '');\n const limit = limitOf(input.limit);\n const rooms = input.rooms === undefined ? null : names(input.rooms, 'rooms');\n const { typed, ...root } = scope(facts, rooms, input, '');\n return {\n rooms,\n root,\n hop: input.hop === undefined ? null : hopOf(facts, rooms, typed, input.hop),\n backlinks: input.backlinks === undefined ? null : backlinksOf(facts, rooms, input.backlinks),\n shape: grouped ? groupShape(typed, input) : documentShape(typed, input),\n limit,\n };\n}\n\nexport function limitOf(input: unknown): number | null {\n if (input === undefined) return null;\n if (!Number.isSafeInteger(input) || (input as number) < 0) {\n invalid('limit', 'expects a nonnegative integer');\n }\n return input as number;\n}\n\nexport function filterOf(input: unknown, facts: HeldRooms): Plan {\n if (!plain(input)) invalid('documents', 'expects a filter object');\n known(input, FILTER, '');\n return planOf({ ...input, select: {} }, facts);\n}\n\nfunction canonical(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(canonical).join(',')}]`;\n if (typeof value === 'object' && value !== null) {\n return `{${Object.keys(value)\n .sort()\n .map((name) => `${JSON.stringify(name)}:${canonical((value as Entries)[name])}`)\n .join(',')}}`;\n }\n return JSON.stringify(value);\n}\n\nexport function identityOf(plan: Plan): string {\n return canonical(plan);\n}\n"],"names":["normalize","QueryError","Error","code","at","problem","RANGE","SINGLE","FILTER","RELATED","PARTS","ORDER","CALENDAR_DATE","invalid","place","name","plain","value","Array","isArray","Object","getPrototypeOf","prototype","known","allowed","keys","includes","list","input","Number","isFinite","values","map","item","index","names","listed","some","Set","sort","directory","calendarDate","match","exec","year","month","day","slice","date","Date","UTC","getUTCFullYear","getUTCMonth","getUTCDate","fits","spec","kind","of","reference","typing","facts","rooms","types","read","filter","room","locator","acquiring","available","every","declared","flatMap","type","untyped","specs","typed","field","hasOwn","fields","length","checked","JSON","stringify","test","equal","op","operators","operator","stray","find","undefined","bounds","bound","where","operand","compared","forEach","isSafeInteger","size","exists","condition","conditions","entry","nested","push","startsWith","scope","pathPrefix","referenceField","hopOf","root","backlinksOf","keyPlan","path","direction","orderOptions","options","nulls","stringSort","locale","collates","localeOptions","localeCompare","parts","named","flag","documentShape","orderBy","clause","key","by","select","sections","preamble","markdown","backlinks","groupShape","groupBy","grouped","indexOf","planOf","limit","limitOf","hop","shape","filterOf","canonical","join","identityOf","plan"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime/src/query.ts"],"sourcesContent":["import type { Definition, FieldSpec } from '@agentshouse/mdmodel';\nimport type { HeadChange } from './adapter.js';\nimport { normalize } from './paths.js';\n\nexport type Value = string | number | boolean | null;\n\nexport type Predicate =\n | Value\n | { $eq: Value }\n | { $ne: Value }\n | { $in: readonly Value[] }\n | { $nin: readonly Value[] }\n | { $gt?: Value; $gte?: Value; $lt?: Value; $lte?: Value }\n | { $all: readonly Value[] }\n | { $size: number }\n | { $exists: boolean };\n\nexport type Where = {\n $and?: readonly Where[];\n $or?: readonly Where[];\n [field: string]: Predicate | readonly Where[] | undefined;\n};\n\nexport type Related = { types?: readonly string[]; where?: Where; pathPrefix?: string };\n\nexport type Filter = {\n rooms?: readonly string[];\n types?: readonly string[];\n where?: Where;\n pathPrefix?: string;\n hop?: Related & { field: string };\n backlinks?: Related & { field?: string };\n};\n\nexport type Key = 'room' | 'path' | 'type' | { field: string };\n\nexport type Select =\n | 'all'\n | {\n fields?: 'all' | readonly string[];\n sections?: 'all' | readonly string[];\n preamble?: true;\n markdown?: true;\n backlinks?: true;\n change?: true;\n };\n\nexport type OrderOptions = {\n nulls?: 'first' | 'last';\n stringSort?: 'lexical' | 'locale';\n locale?: string;\n localeOptions?: Readonly<Record<string, unknown>>;\n};\n\nexport type Direction = 'asc' | 'desc';\n\nexport type DocumentQuery = Filter & {\n select: Select;\n orderBy?: readonly ({ by: Key; direction?: Direction } & OrderOptions)[];\n limit?: number;\n};\n\nexport type GroupQuery = Filter & {\n groupBy: readonly Exclude<Key, 'path'>[];\n orderBy?: readonly { by: 'count' | Exclude<Key, 'path'>; direction?: Direction }[];\n limit?: number;\n};\n\nexport type LocalQuery = DocumentQuery | GroupQuery;\n\nexport type Backlink = { path: string; type: string; field: string };\n\nexport type QueryDocument = {\n room: string;\n path: string;\n type?: string;\n fields?: Readonly<Record<string, unknown>>;\n sections?: Readonly<Record<string, string>>;\n preamble?: string;\n markdown?: string;\n backlinks?: readonly Backlink[];\n change?: HeadChange | null;\n};\n\nexport type QueryGroup = { key: readonly unknown[]; count: number };\n\nexport type DocumentResult = { documents: readonly QueryDocument[] };\n\nexport type GroupResult = { groups: readonly QueryGroup[] };\n\nexport type QueryResult = DocumentResult | GroupResult;\n\nexport type QueryErrorCode = 'invalid-query' | 'unknown-type' | 'unknown-field' | 'wrong-kind';\n\nexport type RoomFacts = {\n locator: string;\n available: boolean;\n types: readonly Definition[];\n};\n\nexport type HeldRooms = {\n listed: boolean;\n rooms: readonly RoomFacts[];\n};\n\nexport type Test =\n | { op: 'eq'; value: Value }\n | { op: 'ne'; value: Value }\n | { op: 'in'; values: readonly Value[] }\n | { op: 'nin'; values: readonly Value[] }\n | { op: 'range'; bounds: readonly (readonly ['gt' | 'gte' | 'lt' | 'lte', Value])[] }\n | { op: 'all'; values: readonly Value[] }\n | { op: 'size'; size: number }\n | { op: 'exists'; exists: boolean };\n\nexport type Condition =\n | { every: readonly Condition[] }\n | { some: readonly Condition[] }\n | { field: string; test: Test };\n\nexport type Scope = {\n types: readonly string[] | null;\n where: Condition | null;\n pathPrefix: string | null;\n};\n\nexport type KeyPlan =\n | { of: 'room' }\n | { of: 'path' }\n | { of: 'type' }\n | { of: 'field'; field: string };\n\nexport type DocumentShape = {\n kind: 'documents';\n fields: 'all' | readonly string[] | null;\n sections: 'all' | readonly string[] | null;\n preamble: boolean;\n markdown: boolean;\n backlinks: boolean;\n change: boolean;\n orderBy: readonly { key: KeyPlan; options: OrderOptions & { direction: Direction } }[];\n};\n\nexport type GroupShape = {\n kind: 'groups';\n groupBy: readonly KeyPlan[];\n orderBy: readonly { by: 'count' | number; direction: Direction }[];\n};\n\nexport type Plan = {\n rooms: readonly string[] | null;\n root: Scope;\n hop: (Scope & { field: string }) | null;\n backlinks: (Scope & { field: string | null }) | null;\n shape: DocumentShape | GroupShape;\n limit: number | null;\n};\n\nexport class QueryError extends Error {\n constructor(code: QueryErrorCode, at: string, problem: string) {\n super(`${code} at ${at}: ${problem}`);\n }\n}\n\ntype Entries = Readonly<Record<string, unknown>>;\n\ntype Typing = { untyped: boolean; types: readonly Definition[] };\n\nconst RANGE = ['$gt', '$gte', '$lt', '$lte'] as const;\nconst SINGLE = ['$eq', '$ne', '$in', '$nin', '$all', '$size', '$exists'] as const;\nconst FILTER = ['rooms', 'types', 'where', 'pathPrefix', 'hop', 'backlinks'];\nconst RELATED = ['types', 'where', 'pathPrefix', 'field'];\nconst PARTS = ['fields', 'sections', 'preamble', 'markdown', 'backlinks', 'change'];\nconst ORDER = ['by', 'direction', 'nulls', 'stringSort', 'locale', 'localeOptions'];\nconst CALENDAR_DATE = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\nexport function invalid(at: string, problem: string): never {\n throw new QueryError('invalid-query', at, problem);\n}\n\nfunction place(at: string, name: string): string {\n return at === '' ? name : `${at}.${name}`;\n}\n\nexport function plain(value: unknown): value is Entries {\n return (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null)\n );\n}\n\nexport function known(value: Entries, allowed: readonly string[], at: string) {\n for (const name of Object.keys(value)) {\n if (!allowed.includes(name)) invalid(place(at, name), 'unknown part');\n }\n}\n\nfunction list(input: unknown, at: string): readonly unknown[] {\n if (!Array.isArray(input)) invalid(at, 'expects a list');\n return input;\n}\n\nfunction value(input: unknown, at: string): Value {\n if (Array.isArray(input)) invalid(at, 'a list is not a value');\n if (\n input !== null &&\n typeof input !== 'string' &&\n typeof input !== 'boolean' &&\n !(typeof input === 'number' && Number.isFinite(input))\n ) {\n invalid(at, 'not a value');\n }\n return input;\n}\n\nfunction values(input: unknown, at: string): readonly Value[] {\n return list(input, at).map((item, index) => value(item, `${at}[${index}]`));\n}\n\nfunction names(input: unknown, at: string): readonly string[] {\n const listed = list(input, at);\n if (listed.some((item) => typeof item !== 'string')) invalid(at, 'expects a list of names');\n return [...new Set(listed as readonly string[])].sort();\n}\n\nfunction directory(input: unknown, at: string): string {\n if (typeof input !== 'string' || normalize(input) !== input) {\n invalid(at, 'expects a normalized directory');\n }\n return input;\n}\n\nfunction calendarDate(value: string): boolean {\n const match = CALENDAR_DATE.exec(value);\n if (match === null) return false;\n const [year, month, day] = match.slice(1).map(Number);\n const date = new Date(Date.UTC(year, month - 1, day));\n return (\n date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day\n );\n}\n\nfunction fits(spec: FieldSpec, value: Value): boolean {\n const item = spec.kind === 'list' ? spec.of : spec;\n if (item.kind === 'number') return typeof value === 'number';\n if (typeof value !== 'string') return false;\n if (item.kind === 'enum') return item.values.includes(value);\n if (item.kind === 'date') return calendarDate(value);\n if (item.kind === 'reference') return value !== '' && normalize(value) === value;\n return true;\n}\n\nfunction reference(spec: FieldSpec): boolean {\n return spec.kind === 'reference' || (spec.kind === 'list' && spec.of.kind === 'reference');\n}\n\nfunction typing(\n facts: HeldRooms,\n rooms: readonly string[] | null,\n types: readonly string[] | null,\n at: string,\n): Typing {\n const read =\n rooms === null ? facts.rooms : facts.rooms.filter((room) => rooms.includes(room.locator));\n const acquiring =\n !facts.listed &&\n (rooms === null ||\n rooms.some((locator) => !facts.rooms.some((room) => room.locator === locator)));\n const available = !acquiring && read.every((room) => room.available);\n const declared = read.flatMap((room) => room.types);\n for (const name of types ?? []) {\n if (name === 'any' || !available || declared.some((type) => type.name === name)) continue;\n throw new QueryError('unknown-type', place(at, 'types'), `no model it reads declares ${name}`);\n }\n return {\n untyped: types === null || types.includes('any') || !available,\n types: types === null ? declared : declared.filter((type) => types.includes(type.name)),\n };\n}\n\nfunction specs(typed: Typing, field: string, at: string): readonly FieldSpec[] {\n const declared = typed.types.flatMap((type) =>\n Object.hasOwn(type.fields, field) ? [type.fields[field]] : [],\n );\n if (declared.length === 0 && !typed.untyped) {\n throw new QueryError('unknown-field', at, `no MD Type it reads declares ${field}`);\n }\n return declared;\n}\n\nfunction kind(declared: readonly FieldSpec[], checked: Value, at: string) {\n if (checked === null || declared.length === 0 || declared.some((spec) => fits(spec, checked))) {\n return;\n }\n throw new QueryError('wrong-kind', at, `${JSON.stringify(checked)} is not of its field's kind`);\n}\n\nfunction listed(declared: readonly FieldSpec[], list: boolean): boolean {\n return declared.length > 0 && declared.every((spec) => (spec.kind === 'list') === list);\n}\n\nfunction test(declared: readonly FieldSpec[], input: unknown, at: string): Test {\n if (!plain(input)) {\n const equal = value(input, at);\n kind(declared, equal, at);\n return { op: 'eq', value: equal };\n }\n const operators = Object.keys(input);\n if (operators.length === 0) invalid(at, 'names no operator');\n if (operators.some((operator) => (RANGE as readonly string[]).includes(operator))) {\n const stray = operators.find((operator) => !(RANGE as readonly string[]).includes(operator));\n if (stray !== undefined) invalid(place(at, stray), 'cannot join a range');\n if (listed(declared, true)) invalid(at, 'a range on a list');\n return {\n op: 'range',\n bounds: RANGE.filter((operator) => operators.includes(operator)).map((operator) => {\n const bound = value(input[operator], place(at, operator));\n if (bound === null) invalid(place(at, operator), 'a range bound is never null');\n kind(declared, bound, place(at, operator));\n return [operator.slice(1) as 'gt' | 'gte' | 'lt' | 'lte', bound] as const;\n }),\n };\n }\n if (operators.length > 1) invalid(place(at, operators[1]), 'names a second operator');\n const [operator] = operators;\n const where = place(at, operator);\n if (!(SINGLE as readonly string[]).includes(operator)) invalid(where, 'unknown operator');\n const operand = input[operator];\n if (operator === '$eq' || operator === '$ne') {\n const compared = value(operand, where);\n kind(declared, compared, where);\n return operator === '$eq' ? { op: 'eq', value: compared } : { op: 'ne', value: compared };\n }\n if (operator === '$in' || operator === '$nin' || operator === '$all') {\n const compared = values(operand, where);\n compared.forEach((item, index) => kind(declared, item, `${where}[${index}]`));\n if (operator === '$in') return { op: 'in', values: compared };\n if (operator === '$nin') return { op: 'nin', values: compared };\n if (compared.includes(null)) invalid(where, 'a list holds no null');\n if (listed(declared, false)) invalid(where, 'the field is not a list');\n return { op: 'all', values: compared };\n }\n if (operator === '$size') {\n if (!Number.isSafeInteger(operand) || (operand as number) < 0) {\n invalid(where, 'expects a nonnegative integer');\n }\n if (listed(declared, false)) invalid(where, 'the field is not a list');\n return { op: 'size', size: operand as number };\n }\n if (typeof operand !== 'boolean') invalid(where, 'expects true or false');\n return { op: 'exists', exists: operand };\n}\n\nfunction condition(typed: Typing, input: unknown, at: string): Condition {\n if (!plain(input)) invalid(at, 'expects an object of field predicates');\n const conditions: Condition[] = [];\n for (const name of Object.keys(input).sort()) {\n const where = place(at, name);\n const entry = input[name];\n if (name === '$and' || name === '$or') {\n const nested = list(entry, where).map((item, index) =>\n condition(typed, item, `${where}[${index}]`),\n );\n if (nested.length === 0) invalid(where, 'expects a nonempty list');\n conditions.push(name === '$and' ? { every: nested } : { some: nested });\n continue;\n }\n if (name.startsWith('$')) invalid(where, 'unknown operator');\n conditions.push({ field: name, test: test(specs(typed, name, where), entry, where) });\n }\n if (conditions.length === 0) invalid(at, 'names no field');\n return conditions.length === 1 ? conditions[0] : { every: conditions };\n}\n\nfunction scope(\n facts: HeldRooms,\n rooms: readonly string[] | null,\n input: Entries,\n at: string,\n): Scope & { typed: Typing } {\n const types = input.types === undefined ? null : names(input.types, place(at, 'types'));\n const typed = typing(facts, rooms, types, at);\n return {\n typed,\n types,\n where:\n input.where === undefined || (plain(input.where) && Object.keys(input.where).length === 0)\n ? null\n : condition(typed, input.where, place(at, 'where')),\n pathPrefix:\n input.pathPrefix === undefined ? null : directory(input.pathPrefix, place(at, 'pathPrefix')),\n };\n}\n\nfunction referenceField(typed: Typing, field: unknown, at: string): string {\n if (typeof field !== 'string') invalid(at, 'expects a field name');\n const declared = specs(typed, field, at);\n if (declared.length > 0 && !declared.some(reference)) invalid(at, 'not a reference field');\n return field;\n}\n\nfunction hopOf(\n facts: HeldRooms,\n rooms: readonly string[] | null,\n root: Typing,\n input: unknown,\n): Plan['hop'] {\n if (!plain(input)) invalid('hop', 'expects an object');\n known(input, RELATED, 'hop');\n const field = referenceField(root, input.field, 'hop.field');\n const { types, where, pathPrefix } = scope(facts, rooms, input, 'hop');\n return { types, where, pathPrefix, field };\n}\n\nfunction backlinksOf(\n facts: HeldRooms,\n rooms: readonly string[] | null,\n input: unknown,\n): Plan['backlinks'] {\n if (!plain(input)) invalid('backlinks', 'expects an object');\n known(input, RELATED, 'backlinks');\n const { typed, types, where, pathPrefix } = scope(facts, rooms, input, 'backlinks');\n const field =\n input.field === undefined ? null : referenceField(typed, input.field, 'backlinks.field');\n return { types, where, pathPrefix, field };\n}\n\nfunction keyPlan(typed: Typing, input: unknown, at: string, path: boolean): KeyPlan {\n if (input === 'room' || input === 'type' || (path && input === 'path')) return { of: input };\n if (plain(input) && typeof input.field === 'string' && Object.keys(input).length === 1) {\n specs(typed, input.field, place(at, 'field'));\n return { of: 'field', field: input.field };\n }\n return invalid(\n at,\n path ? 'expects room, path, type or a field' : 'expects room, type or a field',\n );\n}\n\nfunction direction(input: unknown, at: string): Direction {\n if (input === undefined) return 'asc';\n if (input !== 'asc' && input !== 'desc') invalid(at, 'expects asc or desc');\n return input;\n}\n\nfunction orderOptions(input: Entries, at: string): OrderOptions & { direction: Direction } {\n const options: OrderOptions & { direction: Direction } = {\n direction: direction(input.direction, place(at, 'direction')),\n };\n if (input.nulls !== undefined) {\n if (input.nulls !== 'first' && input.nulls !== 'last') {\n invalid(place(at, 'nulls'), 'expects first or last');\n }\n options.nulls = input.nulls;\n }\n if (input.stringSort !== undefined) {\n if (input.stringSort !== 'lexical' && input.stringSort !== 'locale') {\n invalid(place(at, 'stringSort'), 'expects lexical or locale');\n }\n options.stringSort = input.stringSort;\n }\n if (input.locale !== undefined) {\n if (typeof input.locale !== 'string' || !collates(input.locale, undefined)) {\n invalid(place(at, 'locale'), 'expects a locale name');\n }\n options.locale = input.locale;\n }\n if (input.localeOptions !== undefined) {\n if (!plain(input.localeOptions) || !collates(options.locale, input.localeOptions)) {\n invalid(place(at, 'localeOptions'), 'expects collation options');\n }\n options.localeOptions = input.localeOptions;\n }\n return options;\n}\n\nfunction collates(locale: string | undefined, options: Entries | undefined): boolean {\n try {\n ''.localeCompare('', locale, options);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction parts(typed: Typing, input: unknown, at: string, fields: boolean) {\n if (input === undefined) return null;\n if (input === 'all') return 'all';\n const named = list(input, at);\n named.forEach((name, index) => {\n if (typeof name !== 'string') invalid(`${at}[${index}]`, 'expects a name');\n if (fields) specs(typed, name, `${at}[${index}]`);\n });\n return named as readonly string[];\n}\n\nfunction flag(input: unknown, at: string): boolean {\n if (input === undefined) return false;\n if (input !== true) invalid(at, 'expects true');\n return true;\n}\n\nfunction documentShape(typed: Typing, input: Entries): DocumentShape {\n const orderBy = (input.orderBy === undefined ? [] : list(input.orderBy, 'orderBy')).map(\n (clause, index) => {\n const at = `orderBy[${index}]`;\n if (!plain(clause)) invalid(at, 'expects an order clause');\n known(clause, ORDER, at);\n return {\n key: keyPlan(typed, clause.by, place(at, 'by'), true),\n options: orderOptions(clause, at),\n };\n },\n );\n const select = input.select;\n if (select === 'all') {\n return {\n kind: 'documents',\n fields: 'all',\n sections: 'all',\n preamble: true,\n markdown: true,\n backlinks: true,\n change: true,\n orderBy,\n };\n }\n if (!plain(select)) invalid('select', \"expects 'all' or the parts to return\");\n known(select, PARTS, 'select');\n return {\n kind: 'documents',\n fields: parts(typed, select.fields, 'select.fields', true),\n sections: parts(typed, select.sections, 'select.sections', false),\n preamble: flag(select.preamble, 'select.preamble'),\n markdown: flag(select.markdown, 'select.markdown'),\n backlinks: flag(select.backlinks, 'select.backlinks'),\n change: flag(select.change, 'select.change'),\n orderBy,\n };\n}\n\nfunction groupShape(typed: Typing, input: Entries): GroupShape {\n const groupBy = list(input.groupBy, 'groupBy').map((key, index) =>\n keyPlan(typed, key, `groupBy[${index}]`, false),\n );\n if (groupBy.length === 0) invalid('groupBy', 'names no key');\n const grouped = groupBy.map((key) => JSON.stringify(key));\n const orderBy = (input.orderBy === undefined ? [] : list(input.orderBy, 'orderBy')).map(\n (clause, index) => {\n const at = `orderBy[${index}]`;\n if (!plain(clause)) invalid(at, 'expects an order clause');\n known(clause, ['by', 'direction'], at);\n const by =\n clause.by === 'count'\n ? ('count' as const)\n : grouped.indexOf(JSON.stringify(keyPlan(typed, clause.by, place(at, 'by'), false)));\n if (by === -1) invalid(place(at, 'by'), 'orders by a key the query does not group by');\n return { by, direction: direction(clause.direction, place(at, 'direction')) };\n },\n );\n return { kind: 'groups', groupBy, orderBy };\n}\n\nexport function planOf(input: unknown, facts: HeldRooms): Plan {\n if (!plain(input)) invalid('query', 'expects a query object');\n const grouped = input.groupBy !== undefined;\n if (grouped && input.select !== undefined) invalid('select', 'a grouped query selects nothing');\n if (!grouped && input.select === undefined) invalid('select', 'a Document query must select');\n known(input, [...FILTER, 'orderBy', 'limit', grouped ? 'groupBy' : 'select'], '');\n const limit = limitOf(input.limit);\n const rooms = input.rooms === undefined ? null : names(input.rooms, 'rooms');\n const { typed, ...root } = scope(facts, rooms, input, '');\n return {\n rooms,\n root,\n hop: input.hop === undefined ? null : hopOf(facts, rooms, typed, input.hop),\n backlinks: input.backlinks === undefined ? null : backlinksOf(facts, rooms, input.backlinks),\n shape: grouped ? groupShape(typed, input) : documentShape(typed, input),\n limit,\n };\n}\n\nexport function limitOf(input: unknown): number | null {\n if (input === undefined) return null;\n if (!Number.isSafeInteger(input) || (input as number) < 0) {\n invalid('limit', 'expects a nonnegative integer');\n }\n return input as number;\n}\n\nexport function filterOf(input: unknown, facts: HeldRooms): Plan {\n if (!plain(input)) invalid('documents', 'expects a filter object');\n known(input, FILTER, '');\n return planOf({ ...input, select: {} }, facts);\n}\n\nfunction canonical(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(canonical).join(',')}]`;\n if (typeof value === 'object' && value !== null) {\n return `{${Object.keys(value)\n .sort()\n .map((name) => `${JSON.stringify(name)}:${canonical((value as Entries)[name])}`)\n .join(',')}}`;\n }\n return JSON.stringify(value);\n}\n\nexport function identityOf(plan: Plan): string {\n return canonical(plan);\n}\n"],"names":["normalize","QueryError","Error","code","at","problem","RANGE","SINGLE","FILTER","RELATED","PARTS","ORDER","CALENDAR_DATE","invalid","place","name","plain","value","Array","isArray","Object","getPrototypeOf","prototype","known","allowed","keys","includes","list","input","Number","isFinite","values","map","item","index","names","listed","some","Set","sort","directory","calendarDate","match","exec","year","month","day","slice","date","Date","UTC","getUTCFullYear","getUTCMonth","getUTCDate","fits","spec","kind","of","reference","typing","facts","rooms","types","read","filter","room","locator","acquiring","available","every","declared","flatMap","type","untyped","specs","typed","field","hasOwn","fields","length","checked","JSON","stringify","test","equal","op","operators","operator","stray","find","undefined","bounds","bound","where","operand","compared","forEach","isSafeInteger","size","exists","condition","conditions","entry","nested","push","startsWith","scope","pathPrefix","referenceField","hopOf","root","backlinksOf","keyPlan","path","direction","orderOptions","options","nulls","stringSort","locale","collates","localeOptions","localeCompare","parts","named","flag","documentShape","orderBy","clause","key","by","select","sections","preamble","markdown","backlinks","change","groupShape","groupBy","grouped","indexOf","planOf","limit","limitOf","hop","shape","filterOf","canonical","join","identityOf","plan"],"mappings":"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"}
|
package/dist/read-side.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-side.d.ts","sourceRoot":"","sources":["../src/read-side.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"read-side.d.ts","sourceRoot":"","sources":["../src/read-side.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAU,KAAK,WAAW,EAAE,KAAK,WAAW,EAAe,MAAM,kBAAkB,CAAC;AAC3F,OAAO,KAAK,EAOV,IAAI,EAGJ,WAAW,EAIZ,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAqDpD,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACxC,KAAK,CACH,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,KAAK,IAAI,GACpD,MAAM,IAAI,CAAC;IACd,SAAS,IAAI,SAAS,gBAAgB,EAAE,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAAC;IAC9D,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAySF,wBAAgB,cAAc,IAAI,QAAQ,CA4HzC"}
|
package/dist/read-side.js
CHANGED
|
@@ -158,6 +158,9 @@ function documents(q, rows, plan, shape) {
|
|
|
158
158
|
} : {},
|
|
159
159
|
...shape.backlinks ? {
|
|
160
160
|
backlinks: toArray(backlinked(q, rows, d))
|
|
161
|
+
} : {},
|
|
162
|
+
...shape.change ? {
|
|
163
|
+
change: d.change
|
|
161
164
|
} : {}
|
|
162
165
|
}));
|
|
163
166
|
}
|
|
@@ -255,6 +258,9 @@ function documentOf(row, shape) {
|
|
|
255
258
|
type,
|
|
256
259
|
field
|
|
257
260
|
}))
|
|
261
|
+
} : {},
|
|
262
|
+
...shape.change ? {
|
|
263
|
+
change: row.change
|
|
258
264
|
} : {}
|
|
259
265
|
};
|
|
260
266
|
}
|