@agentshouse/mdmodel 0.1.0-c0bdbbc92d020 → 0.1.0-c2224db91aaa3

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/document.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import { ARRAY_INDEX, pointerSegments } from './definition.js';
2
2
  import { hrefOccurrences } from './links.js';
3
- import { relative, retarget, SHELL_ROOMS, shellTarget, target } from './paths.js';
3
+ import { destinationPath, relative, retarget, SHELL_ROOMS, shellTarget, target } from './paths.js';
4
4
  import { references } from './references.js';
5
5
  import { headingSpans, sectionsRecord } from './sections.js';
6
6
  import { refusal } from './refuse.js';
7
- import { bodyStartAfterYaml, bodyStartOf, equalValue, extractFrontmatter, jsValue, lineEnding, mapEntry, parseYamlMapping, serializeJs, serializeKey, YamlError, } from './yaml.js';
7
+ import { bodyStartAfterYaml, bodyStartOf, equalValue, extractFrontmatter, frontmatterValue, jsValue, lineEnding, mapEntry, parseYamlMapping, serializeJs, serializeKey, YamlError, } from './yaml.js';
8
8
  const internals = new WeakMap();
9
9
  function refuse(file, rule, location) {
10
10
  return location === undefined ? refusal(file, rule) : refusal(file, rule, { location });
@@ -78,10 +78,18 @@ function applyField(document, name, value, prior) {
78
78
  if (!equalValue(document.fields[name], prior)) {
79
79
  return { outcome: 'stale', document };
80
80
  }
81
+ if (!frontmatterValue(value)) {
82
+ return { outcome: 'refuse', refusal: refuse('', 'frontmatter-fence', name) };
83
+ }
81
84
  let nextContent;
82
85
  const existing = mapEntry(internal.root, name);
83
86
  if (existing !== undefined) {
84
- nextContent = splice(document.content, existing.value.start, existing.value.end, serializeJs(value));
87
+ const held = existing.value;
88
+ const inline = held.start > existing.after &&
89
+ !/[\r\n]/.test(document.content.slice(existing.after, held.start));
90
+ nextContent = inline
91
+ ? splice(document.content, held.start, held.end, serializeJs(value))
92
+ : splice(document.content, existing.after, held.end, ` ${serializeJs(value)}`);
85
93
  }
86
94
  else if (document.content[internal.root.start] === '{') {
87
95
  nextContent = splice(document.content, internal.root.end - 1, internal.root.end - 1, `${internal.root.entries.length === 0 ? '' : ', '}${serializeKey(name)}: ${serializeJs(value)}`);
@@ -111,16 +119,30 @@ function applySection(document, name, value, prior) {
111
119
  const current = document.content.slice(span.bodyStart, span.bodyEnd);
112
120
  if (current !== prior)
113
121
  return { outcome: 'stale', document };
114
- const parsed = parse(splice(document.content, span.bodyStart, span.bodyEnd, value));
115
- if (!parsed.ok)
116
- return { outcome: 'refuse', refusal: parsed.refusal };
117
- return { outcome: 'applied', document: parsed.document };
122
+ return replaced(document, internal.bodyStart, span.bodyStart, span.bodyEnd, value);
118
123
  }
119
124
  function applyPreamble(document, value, prior) {
120
125
  if (document.preamble !== prior)
121
126
  return { outcome: 'stale', document };
122
127
  const start = bodyStartOf(document.content);
123
- const parsed = parse(splice(document.content, start, start + document.preamble.length, value));
128
+ return replaced(document, start, start, start + document.preamble.length, value);
129
+ }
130
+ function firstHeadings(content, bodyStart) {
131
+ const first = new Map();
132
+ for (const span of headingSpans(content, bodyStart)) {
133
+ if (!first.has(span.name))
134
+ first.set(span.name, span.headingStart);
135
+ }
136
+ return first;
137
+ }
138
+ function replaced(document, bodyStart, start, end, value) {
139
+ const content = splice(document.content, start, end, value);
140
+ const after = firstHeadings(content, bodyStartOf(content));
141
+ for (const [name, at] of firstHeadings(document.content, bodyStart)) {
142
+ if (after.get(name) !== (at < start ? at : at + value.length - (end - start)))
143
+ return { outcome: 'refuse', refusal: refuse('', 'overlapping-section', name) };
144
+ }
145
+ const parsed = parse(content);
124
146
  if (!parsed.ok)
125
147
  return { outcome: 'refuse', refusal: parsed.refusal };
126
148
  return { outcome: 'applied', document: parsed.document };
@@ -248,25 +270,58 @@ export function relativizeBody(body, file, handle) {
248
270
  const relinkedBody = shellRelinked(body, 0, file, handle);
249
271
  if (typeof relinkedBody !== 'string')
250
272
  return { outcome: 'refuse', refusal: relinkedBody };
251
- const elsewhere = hrefOccurrences(relinkedBody).find(({ href }) => href.startsWith(SHELL_ROOMS));
273
+ const elsewhere = hrefOccurrences(relinkedBody).find(({ href }) => destinationPath(href)?.startsWith(SHELL_ROOMS) === true);
252
274
  if (elsewhere !== undefined)
253
275
  return { outcome: 'refuse', refusal: refuse(file, 'unresolved-link', elsewhere.href) };
254
276
  return { outcome: 'applied', body: relinkedBody };
255
277
  }
256
- export function links(document, file) {
278
+ export function relinkBody(body, file, moves) {
279
+ let rewritten = '';
280
+ let cursor = 0;
281
+ for (const match of hrefOccurrences(body)) {
282
+ const from = target(file, match.href);
283
+ const to = from === null ? undefined : moves.get(from);
284
+ if (to === undefined)
285
+ continue;
286
+ const written = retarget(match.href, relative(file, to));
287
+ const text = destinationText(written, match.bracketed);
288
+ if (text === null)
289
+ return { outcome: 'refuse', refusal: refuse(file, 'unwritable-link', written) };
290
+ rewritten += body.slice(cursor, match.start) + text;
291
+ cursor = match.end;
292
+ }
293
+ return { outcome: 'applied', body: rewritten + body.slice(cursor) };
294
+ }
295
+ function occurrencesIn(text, file, offset) {
296
+ const found = [];
297
+ for (const occurrence of hrefOccurrences(text)) {
298
+ const resolved = target(file, occurrence.href);
299
+ if (resolved !== null)
300
+ found.push({ href: occurrence.href, target: resolved, start: offset + occurrence.start });
301
+ }
302
+ return found;
303
+ }
304
+ function linksIn(text, file) {
257
305
  const found = [];
258
306
  const seen = new Set();
259
- for (const occurrence of hrefOccurrences(document.content.slice(bodyStartOf(document.content)))) {
307
+ for (const occurrence of occurrencesIn(text, file, 0)) {
260
308
  if (seen.has(occurrence.href))
261
309
  continue;
262
- const resolved = target(file, occurrence.href);
263
- if (resolved === null)
264
- continue;
265
310
  seen.add(occurrence.href);
266
- found.push({ href: occurrence.href, target: resolved });
311
+ found.push({ href: occurrence.href, target: occurrence.target });
267
312
  }
268
313
  return found;
269
314
  }
315
+ export function links(document, file) {
316
+ return linksIn(document.content.slice(bodyStartOf(document.content)), file);
317
+ }
318
+ export function linkOccurrences(document, file) {
319
+ const bodyStart = bodyStartOf(document.content);
320
+ return occurrencesIn(document.content.slice(bodyStart), file, bodyStart);
321
+ }
322
+ export function bodyLinks(body, file) {
323
+ return linksIn(body, file);
324
+ }
270
325
  export function apply(document, change) {
271
326
  if (change.kind === 'link')
272
327
  return applyLink(document, change.href, change.to);
@@ -274,21 +329,17 @@ export function apply(document, change) {
274
329
  return applyReference(document, change.pointer, change.value, change.prior);
275
330
  if (change.kind === 'preamble')
276
331
  return applyPreamble(document, change.value, change.prior);
277
- try {
278
- if (change.kind === 'field')
279
- return applyField(document, change.name, change.value, change.prior);
280
- return applySection(document, change.name, change.value, change.prior);
281
- }
282
- catch (error) {
283
- if (error instanceof YamlError) {
284
- return { outcome: 'refuse', refusal: refuse('', 'frontmatter-fence', change.name) };
285
- }
286
- throw error;
287
- }
332
+ if (change.kind === 'field')
333
+ return applyField(document, change.name, change.value, change.prior);
334
+ return applySection(document, change.name, change.value, change.prior);
288
335
  }
289
336
  export function serialize(document) {
290
337
  return document.content;
291
338
  }
339
+ export function fieldStart(document, pointer) {
340
+ const root = internals.get(document)?.root;
341
+ return root === null || root === undefined ? undefined : nodeAt(root, pointer)?.start;
342
+ }
292
343
  export function frontmatter(document) {
293
344
  return internals.get(document)?.root ?? null;
294
345
  }
package/dist/fields.d.ts CHANGED
@@ -1,4 +1,6 @@
1
+ export declare const TYPE_FIELD = "type";
1
2
  export declare const MEMBER_FIELD = "member";
2
3
  export declare const SITE_FIELD = "site";
3
4
  export declare const RECEIVED_FIELD = "received";
5
+ export declare const HOUSE_FIELDS: readonly string[];
4
6
  //# sourceMappingURL=fields.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../src/fields.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,WAAW,CAAC;AAErC,eAAO,MAAM,UAAU,SAAS,CAAC;AAEjC,eAAO,MAAM,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../src/fields.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,SAAS,CAAC;AAEjC,eAAO,MAAM,YAAY,WAAW,CAAC;AAErC,eAAO,MAAM,UAAU,SAAS,CAAC;AAEjC,eAAO,MAAM,cAAc,aAAa,CAAC;AAEzC,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EAKzC,CAAC"}
package/dist/fields.js CHANGED
@@ -1,3 +1,10 @@
1
+ export const TYPE_FIELD = 'type';
1
2
  export const MEMBER_FIELD = 'member';
2
3
  export const SITE_FIELD = 'site';
3
4
  export const RECEIVED_FIELD = 'received';
5
+ export const HOUSE_FIELDS = [
6
+ TYPE_FIELD,
7
+ SITE_FIELD,
8
+ RECEIVED_FIELD,
9
+ MEMBER_FIELD,
10
+ ];
package/dist/index.d.ts CHANGED
@@ -1,15 +1,17 @@
1
- export { dated, factKind, facts, fires, holds, instant, itemFires, pointed, WRITE_DOORS, } from './condition.js';
1
+ export { dated, datePointers, factKind, facts, fires, holds, instant, itemFires, pointed, prosePaths, WRITE_DOORS, } from './condition.js';
2
2
  export type { Actor, Condition, ConditionScope, ConditionTest, ConditionValue, CronCondition, DateCondition, DocumentCondition, DocumentEvent, DocumentFacts, Fact, FactKind, ItemCondition, ItemFacts, Resolved, WriteDoor, } from './condition.js';
3
3
  export { divide } from './divide.js';
4
- export { apply, links, parse, relativize, relativizeBody, serialize } from './document.js';
5
- export { MEMBER_FIELD, RECEIVED_FIELD, SITE_FIELD } from './fields.js';
4
+ export { apply, bodyLinks, fieldStart, linkOccurrences, links, parse, relativize, relativizeBody, relinkBody, serialize, } from './document.js';
5
+ export { HOUSE_FIELDS, MEMBER_FIELD, RECEIVED_FIELD, SITE_FIELD, TYPE_FIELD } from './fields.js';
6
6
  export { relative, retarget, target } from './paths.js';
7
7
  export { MARKDOWN_SYNTAX_PROFILE } from './profile.js';
8
8
  export { project } from './project.js';
9
9
  export { references } from './references.js';
10
- export { ARRAY_INDEX, ATTACHMENT, escapePointer, itemFacts, memberFacts, pointerSegments, } from './definition.js';
11
- export type { Definition, JsonType, PatternFacts, SectionSpec, Shape, ValueFacts, } from './definition.js';
12
- export type { ApplyResult, Change, Division, DivisionContext, Document, Library, ModelVerification, Link, ParseResult, Projection, ProjectionContext, Reference, Refusal, Span, Validation, ValidationContext, VerifiedModel, } from './types.js';
10
+ export { ARRAY_INDEX, ATTACHMENT, crossedFacts, escapePointer, itemFacts, memberFacts, pointerFacts, pointerSegments, } from './definition.js';
11
+ export type { Definition, JsonType, PatternFacts, PointerFacts, SectionSpec, Shape, ValueFacts, } from './definition.js';
12
+ export type { ApplyResult, BodyResult, Change, Division, DivisionContext, Document, Library, ModelVerification, Link, LinkOccurrence, ParseResult, Projection, ProjectionContext, Reference, Refusal, Span, Validation, ValidationContext, VerifiedModel, } from './types.js';
13
13
  export { validate, verify } from './validate.js';
14
14
  export { VERSION } from './version.js';
15
+ export { equalValue, frontmatterValue } from './yaml.js';
16
+ export type { FrontmatterValue } from './yaml.js';
15
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,QAAQ,EACR,KAAK,EACL,KAAK,EACL,KAAK,EACL,OAAO,EACP,SAAS,EACT,OAAO,EACP,WAAW,GACZ,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,KAAK,EACL,SAAS,EACT,cAAc,EACd,aAAa,EACb,cAAc,EACd,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,SAAS,EACT,QAAQ,EACR,SAAS,GACV,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACL,WAAW,EACX,UAAU,EACV,aAAa,EACb,SAAS,EACT,WAAW,EACX,eAAe,GAChB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,KAAK,EACL,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,WAAW,EACX,MAAM,EACN,QAAQ,EACR,eAAe,EACf,QAAQ,EACR,OAAO,EACP,iBAAiB,EACjB,IAAI,EACJ,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,SAAS,EACT,OAAO,EACP,IAAI,EACJ,UAAU,EACV,iBAAiB,EACjB,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,YAAY,EACZ,QAAQ,EACR,KAAK,EACL,KAAK,EACL,KAAK,EACL,OAAO,EACP,SAAS,EACT,OAAO,EACP,UAAU,EACV,WAAW,GACZ,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,KAAK,EACL,SAAS,EACT,cAAc,EACd,aAAa,EACb,cAAc,EACd,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,SAAS,EACT,QAAQ,EACR,SAAS,GACV,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EACL,KAAK,EACL,SAAS,EACT,UAAU,EACV,eAAe,EACf,KAAK,EACL,KAAK,EACL,UAAU,EACV,cAAc,EACd,UAAU,EACV,SAAS,GACV,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACjG,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACL,WAAW,EACX,UAAU,EACV,YAAY,EACZ,aAAa,EACb,SAAS,EACT,WAAW,EACX,YAAY,EACZ,eAAe,GAChB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,KAAK,EACL,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,WAAW,EACX,UAAU,EACV,MAAM,EACN,QAAQ,EACR,eAAe,EACf,QAAQ,EACR,OAAO,EACP,iBAAiB,EACjB,IAAI,EACJ,cAAc,EACd,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,SAAS,EACT,OAAO,EACP,IAAI,EACJ,UAAU,EACV,iBAAiB,EACjB,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACzD,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC"}
package/dist/index.js CHANGED
@@ -1,11 +1,12 @@
1
- export { dated, factKind, facts, fires, holds, instant, itemFires, pointed, WRITE_DOORS, } from './condition.js';
1
+ export { dated, datePointers, factKind, facts, fires, holds, instant, itemFires, pointed, prosePaths, WRITE_DOORS, } from './condition.js';
2
2
  export { divide } from './divide.js';
3
- export { apply, links, parse, relativize, relativizeBody, serialize } from './document.js';
4
- export { MEMBER_FIELD, RECEIVED_FIELD, SITE_FIELD } from './fields.js';
3
+ export { apply, bodyLinks, fieldStart, linkOccurrences, links, parse, relativize, relativizeBody, relinkBody, serialize, } from './document.js';
4
+ export { HOUSE_FIELDS, MEMBER_FIELD, RECEIVED_FIELD, SITE_FIELD, TYPE_FIELD } from './fields.js';
5
5
  export { relative, retarget, target } from './paths.js';
6
6
  export { MARKDOWN_SYNTAX_PROFILE } from './profile.js';
7
7
  export { project } from './project.js';
8
8
  export { references } from './references.js';
9
- export { ARRAY_INDEX, ATTACHMENT, escapePointer, itemFacts, memberFacts, pointerSegments, } from './definition.js';
9
+ export { ARRAY_INDEX, ATTACHMENT, crossedFacts, escapePointer, itemFacts, memberFacts, pointerFacts, pointerSegments, } from './definition.js';
10
10
  export { validate, verify } from './validate.js';
11
11
  export { VERSION } from './version.js';
12
+ export { equalValue, frontmatterValue } from './yaml.js';
package/dist/links.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export declare function escapes(text: string, index: number): boolean;
1
2
  export type HrefOccurrence = {
2
3
  readonly href: string;
3
4
  readonly start: number;
@@ -1 +1 @@
1
- {"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../src/links.ts"],"names":[],"mappings":"AA0sBA,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;CAC7C,CAAC;AAEF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAe/E;AAYD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CA2DzD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,cAAc,EAAE,CAIvE"}
1
+ {"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../src/links.ts"],"names":[],"mappings":"AAsgBA,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAE5D;AAkMD,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;CAC7C,CAAC;AAEF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAe/E;AAYD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CA2DzD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,cAAc,EAAE,CAIvE"}
package/dist/links.js CHANGED
@@ -504,7 +504,7 @@ function structure(text) {
504
504
  }
505
505
  return { joins, raw };
506
506
  }
507
- function escapes(text, index) {
507
+ export function escapes(text, index) {
508
508
  return text[index] === '\\' && PUNCTUATION.test(text[index + 1] ?? '');
509
509
  }
510
510
  function referenceEnd(text, start, joins) {
package/dist/paths.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export declare function dirname(path: string): string;
2
2
  export declare function join(base: string, relative: string): string;
3
3
  export declare function normalize(path: string): string | null;
4
+ export declare function destinationPath(href: string): string | null;
4
5
  export declare function classifyHref(from: string, href: string): {
5
6
  kind: 'skip';
6
7
  } | {
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG5C;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYrD;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAUzE;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGhE;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAIzD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAW7D;AAED,eAAO,MAAM,WAAW,YAAY,CAAC;AAErC,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKvE"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAIA,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG5C;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYrD;AAoDD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAW3D;AAgBD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CASzE;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGhE;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAGzD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAW7D;AAED,eAAO,MAAM,WAAW,YAAY,CAAC;AAErC,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMvE"}
package/dist/paths.js CHANGED
@@ -1,3 +1,6 @@
1
+ import { decodeNamedCharacterReference } from 'decode-named-character-reference';
2
+ import { decodeNumericCharacterReference } from 'micromark-util-decode-numeric-character-reference';
3
+ import { escapes } from './links.js';
1
4
  export function dirname(path) {
2
5
  const index = path.lastIndexOf('/');
3
6
  return index === -1 ? '' : path.slice(0, index);
@@ -22,18 +25,95 @@ export function normalize(path) {
22
25
  }
23
26
  return parts.join('/');
24
27
  }
28
+ const REFERENCE = /&(?:#[xX]([0-9a-fA-F]{1,6})|#([0-9]{1,7})|([A-Za-z][A-Za-z0-9]{0,31}));/y;
29
+ const PERCENT = /^%[0-9a-fA-F]{2}/;
30
+ function referenceAt(text, at) {
31
+ REFERENCE.lastIndex = at;
32
+ const match = REFERENCE.exec(text);
33
+ if (match === null)
34
+ return null;
35
+ const [whole, hex, decimal, name] = match;
36
+ const end = at + whole.length;
37
+ if (name !== undefined) {
38
+ const decoded = decodeNamedCharacterReference(name);
39
+ return decoded === false ? null : { text: decoded, end };
40
+ }
41
+ return {
42
+ text: decodeNumericCharacterReference(hex ?? decimal, hex === undefined ? 10 : 16),
43
+ end,
44
+ };
45
+ }
46
+ function unescaped(written) {
47
+ let base = '';
48
+ let i = 0;
49
+ while (i < written.length) {
50
+ const escaped = escapes(written, i);
51
+ const reference = escaped || written[i] !== '&' ? null : referenceAt(written, i);
52
+ const text = escaped ? written[i + 1] : (reference?.text ?? written[i]);
53
+ if (text.startsWith('?') || text.startsWith('#'))
54
+ return { base, suffix: i };
55
+ base += text;
56
+ i = escaped ? i + 2 : (reference?.end ?? i + 1);
57
+ }
58
+ return { base, suffix: written.length };
59
+ }
60
+ function located(href) {
61
+ const written = href.trim();
62
+ const { base, suffix } = unescaped(written);
63
+ const url = base.replace(/[\t\n\r]/g, '').replace(/^[\u0000-\u0020]+/, '');
64
+ return { base: suffix === written.length ? url.replace(/[\u0000-\u0020]+$/, '') : url, suffix };
65
+ }
66
+ const ENCODED = /(?:%[0-9a-fA-F]{2})+/g;
67
+ function decodedRun(run) {
68
+ try {
69
+ return decodeURIComponent(run);
70
+ }
71
+ catch {
72
+ return null;
73
+ }
74
+ }
75
+ export function destinationPath(href) {
76
+ const base = located(href).base;
77
+ let path = '';
78
+ let cursor = 0;
79
+ for (const match of base.matchAll(ENCODED)) {
80
+ const decoded = decodedRun(match[0]);
81
+ if (decoded === null)
82
+ return null;
83
+ path += base.slice(cursor, match.index) + decoded;
84
+ cursor = match.index + match[0].length;
85
+ }
86
+ return path + base.slice(cursor);
87
+ }
88
+ function written(path) {
89
+ let text = '';
90
+ for (let i = 0; i < path.length; i += 1) {
91
+ const char = path[i];
92
+ if (char === '?' || char === '#' || char < ' ')
93
+ text += encodeURIComponent(char);
94
+ else if (char === ' ' && (i === 0 || i === path.length - 1))
95
+ text += '%20';
96
+ else if (char === '%' && PERCENT.test(path.slice(i)))
97
+ text += '%25';
98
+ else if (escapes(path, i))
99
+ text += '%5C';
100
+ else if (char === '&' && referenceAt(path, i) !== null)
101
+ text += '%26';
102
+ else
103
+ text += char;
104
+ }
105
+ return text;
106
+ }
25
107
  export function classifyHref(from, href) {
26
- const trimmed = href.trim();
27
- if (trimmed === '' || trimmed.startsWith('#'))
108
+ const base = located(href).base;
109
+ if (base === '')
28
110
  return { kind: 'skip' };
29
- if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(trimmed))
111
+ if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(base))
30
112
  return { kind: 'skip' };
31
- if (trimmed.startsWith('/'))
113
+ const path = destinationPath(href);
114
+ if (path === null || path.startsWith('/'))
32
115
  return { kind: 'invalid' };
33
- const bare = trimmed.replace(/[?#].*$/, '');
34
- if (bare === '')
35
- return { kind: 'skip' };
36
- const resolved = normalize(join(dirname(from), bare));
116
+ const resolved = normalize(join(dirname(from), path));
37
117
  if (resolved === null || resolved === '')
38
118
  return { kind: 'invalid' };
39
119
  return { kind: 'path', path: resolved };
@@ -44,8 +124,7 @@ export function target(from, href) {
44
124
  }
45
125
  export function retarget(href, to) {
46
126
  const trimmed = href.trim();
47
- const match = /[?#]/.exec(trimmed);
48
- return match === null ? to : to + trimmed.slice(match.index);
127
+ return written(to) + trimmed.slice(unescaped(trimmed).suffix);
49
128
  }
50
129
  export function relative(from, target) {
51
130
  const base = dirname(from)
@@ -62,8 +141,9 @@ export function relative(from, target) {
62
141
  export const SHELL_ROOMS = '/rooms/';
63
142
  export function shellTarget(href, handle) {
64
143
  const prefix = `${SHELL_ROOMS}${handle}/`;
65
- if (!href.startsWith(prefix))
144
+ const decoded = destinationPath(href);
145
+ if (decoded === null || !decoded.startsWith(prefix))
66
146
  return null;
67
- const path = normalize(href.slice(prefix.length).replace(/[?#].*$/s, ''));
147
+ const path = normalize(decoded.slice(prefix.length));
68
148
  return path === null || path === '' ? null : path;
69
149
  }
package/dist/schema.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Validator } from '@cfworker/json-schema';
2
2
  import { escapePointer, refTarget } from './definition.js';
3
- import { MEMBER_FIELD, RECEIVED_FIELD, SITE_FIELD } from './fields.js';
3
+ import { MEMBER_FIELD, RECEIVED_FIELD, SITE_FIELD, TYPE_FIELD } from './fields.js';
4
4
  import { interpretPlain, isRecord } from './yaml.js';
5
5
  const STANDING_MAPS = ['properties', 'patternProperties'];
6
6
  const STANDING = [
@@ -101,7 +101,7 @@ function compile(definition) {
101
101
  const closedDefs = mapped(defs, (held) => closed(held, true, defs));
102
102
  const declared = isRecord(root.properties) ? root.properties : {};
103
103
  const properties = {
104
- type: true,
104
+ [TYPE_FIELD]: true,
105
105
  [SITE_FIELD]: true,
106
106
  [RECEIVED_FIELD]: true,
107
107
  ...(definition.memberDocument ? { [MEMBER_FIELD]: { type: 'string' } } : {}),
package/dist/types.d.ts CHANGED
@@ -71,6 +71,9 @@ export type Link = {
71
71
  readonly href: string;
72
72
  readonly target: string;
73
73
  };
74
+ export type LinkOccurrence = Link & {
75
+ readonly start: number;
76
+ };
74
77
  export type Reference = {
75
78
  readonly pointer: string;
76
79
  readonly value: string;
@@ -110,4 +113,11 @@ export type ApplyResult = {
110
113
  readonly outcome: 'refuse';
111
114
  readonly refusal: Refusal;
112
115
  };
116
+ export type BodyResult = {
117
+ readonly outcome: 'applied';
118
+ readonly body: string;
119
+ } | {
120
+ readonly outcome: 'refuse';
121
+ readonly refusal: Refusal;
122
+ };
113
123
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAGV,OAAO,EACP,iBAAiB,EAEjB,UAAU,EACV,iBAAiB,EACjB,aAAa,EACd,MAAM,YAAY,CAAC;AAwDpB,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAQxD;AAED,wBAAgB,QAAQ,CACtB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,iBAAyC,EAClD,KAAK,GAAE,aAA6B,GACnC,UAAU,CAyGZ"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAGV,OAAO,EACP,iBAAiB,EACjB,UAAU,EACV,iBAAiB,EACjB,aAAa,EACd,MAAM,YAAY,CAAC;AAwDpB,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAQxD;AAED,wBAAgB,QAAQ,CACtB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,iBAAyC,EAClD,KAAK,GAAE,aAA6B,GACnC,UAAU,CAqGZ"}
package/dist/validate.js CHANGED
@@ -18,7 +18,7 @@ function instanceType(document) {
18
18
  return null;
19
19
  return raw;
20
20
  }
21
- function reaches(file, href, to, documents, binaryTargets) {
21
+ function reaches(file, href, to, types, binaryTargets) {
22
22
  const resolved = classifyHref(file, href);
23
23
  if (resolved.kind !== 'path')
24
24
  return false;
@@ -26,8 +26,8 @@ function reaches(file, href, to, documents, binaryTargets) {
26
26
  return true;
27
27
  if (binaryTargets.has(resolved.path))
28
28
  return false;
29
- const held = documents.get(resolved.path);
30
- return held === undefined || (held.ok && to.includes(held.document.type ?? BUILT_IN_TYPE));
29
+ const held = types.get(resolved.path);
30
+ return held === undefined || to.includes(held);
31
31
  }
32
32
  function itemHrefs(content, items) {
33
33
  const bodyStart = bodyStartOf(content);
@@ -56,28 +56,28 @@ export function verify(schema) {
56
56
  export function validate(library, context = { binaryTargets: [] }, model = { types: {} }) {
57
57
  const binaryTargets = new Set(context.binaryTargets);
58
58
  const files = Object.keys(library).sort();
59
+ const types = new Map();
59
60
  const documents = new Map();
60
61
  for (const file of files) {
61
62
  if (binaryTargets.has(file))
62
63
  return refuse(file, 'binary-target-document');
63
64
  const parsed = parse(library[file], file);
64
- documents.set(file, parsed);
65
65
  if (!parsed.ok)
66
66
  return { verdict: 'refuse', ...parsed.refusal };
67
+ types.set(file, parsed.document.type ?? BUILT_IN_TYPE);
68
+ if (instanceType(parsed.document) !== BUILT_IN_TYPE)
69
+ documents.set(file, parsed.document);
67
70
  }
68
71
  const definitions = new Map(Object.entries(model.types));
69
72
  const sectionReferences = new Map();
70
- for (const file of files) {
71
- const parsed = documents.get(file);
72
- if (parsed === undefined || !parsed.ok)
73
- continue;
74
- const kind = instanceType(parsed.document);
73
+ for (const [file, document] of documents) {
74
+ const kind = instanceType(document);
75
75
  if (kind === BUILT_IN_TYPE)
76
76
  continue;
77
77
  const definition = kind === null ? undefined : definitions.get(kind);
78
78
  if (definition === undefined)
79
79
  return refuse(file, 'unknown-type', { location: '/type' });
80
- const fieldFailure = frontmatterRefusal(definition, parsed.document.fields);
80
+ const fieldFailure = frontmatterRefusal(definition, document.fields);
81
81
  if (fieldFailure !== undefined) {
82
82
  return refuse(file, fieldFailure.rule, { location: fieldFailure.location });
83
83
  }
@@ -105,18 +105,15 @@ export function validate(library, context = { binaryTargets: [] }, model = { typ
105
105
  }
106
106
  sectionReferences.set(file, references);
107
107
  }
108
- for (const file of files) {
109
- const parsed = documents.get(file);
110
- if (parsed === undefined || !parsed.ok)
111
- continue;
112
- const kind = instanceType(parsed.document);
108
+ for (const [file, document] of documents) {
109
+ const kind = instanceType(document);
113
110
  if (kind === null || kind === BUILT_IN_TYPE)
114
111
  continue;
115
112
  const definition = definitions.get(kind);
116
113
  if (definition === undefined)
117
114
  continue;
118
- for (const { pointer, to, value } of references(parsed.document, definition)) {
119
- if (!reaches(file, value, to, documents, binaryTargets))
115
+ for (const { pointer, to, value } of references(document, definition)) {
116
+ if (!reaches(file, value, to, types, binaryTargets))
120
117
  return refuse(file, 'unresolved-reference', { location: pointer });
121
118
  }
122
119
  const body = bodyAfterFrontmatter(library[file]);
@@ -127,24 +124,21 @@ export function validate(library, context = { binaryTargets: [] }, model = { typ
127
124
  }
128
125
  for (const { section, to, hrefs } of sectionReferences.get(file)) {
129
126
  for (const href of hrefs) {
130
- if (!reaches(file, href, to, documents, binaryTargets))
127
+ if (!reaches(file, href, to, types, binaryTargets))
131
128
  return refuse(file, 'unresolved-reference', { location: section });
132
129
  }
133
130
  }
134
131
  }
135
132
  const missing = new Map();
136
- for (const file of files) {
137
- const parsed = documents.get(file);
138
- if (parsed === undefined || !parsed.ok)
139
- continue;
140
- const kind = instanceType(parsed.document);
133
+ for (const [file, document] of documents) {
134
+ const kind = instanceType(document);
141
135
  if (kind === null || kind === BUILT_IN_TYPE)
142
136
  continue;
143
137
  const definition = definitions.get(kind);
144
138
  if (definition === undefined)
145
139
  continue;
146
140
  const named = [
147
- ...references(parsed.document, definition),
141
+ ...references(document, definition),
148
142
  ...sectionReferences
149
143
  .get(file)
150
144
  .flatMap(({ to, hrefs }) => hrefs.map((value) => ({ value, to }))),
@@ -155,7 +149,7 @@ export function validate(library, context = { binaryTargets: [] }, model = { typ
155
149
  const resolved = classifyHref(file, value);
156
150
  if (resolved.kind !== 'path')
157
151
  continue;
158
- if (documents.has(resolved.path) || binaryTargets.has(resolved.path))
152
+ if (types.has(resolved.path) || binaryTargets.has(resolved.path))
159
153
  continue;
160
154
  const referrers = missing.get(resolved.path) ?? [];
161
155
  referrers.push(file);
package/dist/yaml.d.ts CHANGED
@@ -16,8 +16,7 @@ export type YamlSeq = {
16
16
  };
17
17
  export type YamlEntry = {
18
18
  readonly key: string;
19
- readonly keyStart: number;
20
- readonly keyEnd: number;
19
+ readonly after: number;
21
20
  readonly value: YamlNode;
22
21
  };
23
22
  export type YamlMap = {
@@ -32,7 +31,12 @@ export declare function parseYamlMapping(text: string, start: number, end: numbe
32
31
  export declare function jsValue(node: YamlNode): unknown;
33
32
  export declare function mapEntry(map: YamlMap, key: string): YamlEntry | undefined;
34
33
  export declare function isPlainSafe(text: string): boolean;
35
- export declare function serializeJs(value: unknown): string;
34
+ export type FrontmatterValue = string | number | boolean | null | readonly FrontmatterValue[] | {
35
+ readonly [name: string]: FrontmatterValue;
36
+ };
37
+ export declare function plain(value: unknown): value is Record<string, unknown>;
38
+ export declare function frontmatterValue(value: unknown): value is FrontmatterValue;
39
+ export declare function serializeJs(value: FrontmatterValue): string;
36
40
  export declare function isRecord(value: unknown): value is Record<string, unknown>;
37
41
  export declare function serializeKey(name: string): string;
38
42
  export declare function bodyStartAfterYaml(content: string, yamlEnd: number): number;
@@ -1 +1 @@
1
- {"version":3,"file":"yaml.d.ts","sourceRoot":"","sources":["../src/yaml.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"yaml.d.ts","sourceRoot":"","sources":["../src/yaml.ts"],"names":[],"mappings":"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"}