@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/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
- const revision = staged.revisions[from];
87
- if (revision === undefined) return;
88
- delete staged.revisions[from];
89
- staged.revisions[to] = revision;
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 replayRevisions(base, queue) {
151
- const revisions = {
152
- ...base
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
- const revision = revisions[change.path];
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 revisions;
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
- revisions: replayRevisions(base.revisions, queue)
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()
@@ -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 & {
@@ -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;AAGlE,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAErD,MAAM,MAAM,SAAS,GACjB,KAAK,GACL;IAAE,GAAG,EAAE,KAAK,CAAA;CAAE,GACd;IAAE,GAAG,EAAE,KAAK,CAAA;CAAE,GACd;IAAE,GAAG,EAAE,SAAS,KAAK,EAAE,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,SAAS,KAAK,EAAE,CAAA;CAAE,GAC1B;IAAE,GAAG,CAAC,EAAE,KAAK,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IAAC,GAAG,CAAC,EAAE,KAAK,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,SAAS,KAAK,EAAE,CAAA;CAAE,GAC1B;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACjB;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAEzB,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC;IACvB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,KAAK,EAAE,GAAG,SAAS,CAAC;CAC3D,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IAAE,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAExF,MAAM,MAAM,MAAM,GAAG;IACnB,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,OAAO,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAClC,SAAS,CAAC,EAAE,OAAO,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,MAAM,GACd,KAAK,GACL;IACE,MAAM,CAAC,EAAE,KAAK,GAAG,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,EAAE,KAAK,GAAG,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB,CAAC;AAEN,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACnD,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,CAAC;AAEvC,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,SAAS,CAAC;QAAE,EAAE,EAAE,GAAG,CAAC;QAAC,SAAS,CAAC,EAAE,SAAS,CAAA;KAAE,GAAG,YAAY,CAAC,EAAE,CAAC;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG;IAChC,OAAO,EAAE,SAAS,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;IACzC,OAAO,CAAC,EAAE,SAAS;QAAE,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAAC,SAAS,CAAC,EAAE,SAAS,CAAA;KAAE,EAAE,CAAC;IACnF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,UAAU,CAAC;AAEpD,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IAAE,GAAG,EAAE,SAAS,OAAO,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpE,MAAM,MAAM,cAAc,GAAG;IAAE,SAAS,EAAE,SAAS,aAAa,EAAE,CAAA;CAAE,CAAC;AAErE,MAAM,MAAM,WAAW,GAAG;IAAE,MAAM,EAAE,SAAS,UAAU,EAAE,CAAA;CAAE,CAAC;AAE5D,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,WAAW,CAAC;AAEvD,MAAM,MAAM,cAAc,GAAG,eAAe,GAAG,cAAc,GAAG,eAAe,GAAG,YAAY,CAAC;AAE/F,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,IAAI,GACZ;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAA;CAAE,GACtC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAA;CAAE,GACvC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAA;CAAE,GACnF;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAA;CAAE,GACvC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtC,MAAM,MAAM,SAAS,GACjB;IAAE,KAAK,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,GAC9B;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC;AAElC,MAAM,MAAM,KAAK,GAAG;IAClB,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,OAAO,GACf;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GACd;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GACd;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GACd;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnC,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,KAAK,GAAG,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IACzC,QAAQ,EAAE,KAAK,GAAG,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,SAAS;QAAE,GAAG,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,YAAY,GAAG;YAAE,SAAS,EAAE,SAAS,CAAA;SAAE,CAAA;KAAE,EAAE,CAAC;CACxF,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,SAAS,OAAO,EAAE,CAAC;IAC5B,OAAO,EAAE,SAAS;QAAE,EAAE,EAAE,OAAO,GAAG,MAAM,CAAC;QAAC,SAAS,EAAE,SAAS,CAAA;KAAE,EAAE,CAAC;CACpE,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG;IACjB,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,IAAI,EAAE,KAAK,CAAC;IACZ,GAAG,EAAE,CAAC,KAAK,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IACxC,SAAS,EAAE,CAAC,KAAK,GAAG;QAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IACrD,KAAK,EAAE,aAAa,GAAG,UAAU,CAAC;IAClC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF,qBAAa,UAAW,SAAQ,KAAK;IACnC,YAAY,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAE5D;CACF;AAED,KAAK,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAYjD,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAE1D;AAMD,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAOtD;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,QAI3E;AA8WD,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAiB7D;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAMrD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAI/D;AAaD,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAE7C"}
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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"read-side.d.ts","sourceRoot":"","sources":["../src/read-side.ts"],"names":[],"mappings":"AA0BA,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;AAoDpD,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;AAuSF,wBAAgB,cAAc,IAAI,QAAQ,CA4HzC"}
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
  }