@agentshouse/mdmodel 0.1.0-cabd61587647f → 0.1.0-caefdbe3e3d42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/API.md +161 -116
  2. package/README.md +6 -4
  3. package/dist/blocks.d.ts.map +1 -1
  4. package/dist/blocks.js +29 -7
  5. package/dist/condition.d.ts +43 -13
  6. package/dist/condition.d.ts.map +1 -1
  7. package/dist/condition.js +225 -127
  8. package/dist/definition.d.ts +3 -1
  9. package/dist/definition.d.ts.map +1 -1
  10. package/dist/definition.js +105 -21
  11. package/dist/divide.js +9 -9
  12. package/dist/document.d.ts +4 -4
  13. package/dist/document.d.ts.map +1 -1
  14. package/dist/document.js +41 -41
  15. package/dist/index.d.ts +20 -8
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +12 -6
  18. package/dist/kinds.d.ts +18 -0
  19. package/dist/kinds.d.ts.map +1 -0
  20. package/dist/kinds.js +141 -0
  21. package/dist/links.d.ts +1 -0
  22. package/dist/links.d.ts.map +1 -1
  23. package/dist/links.js +85 -39
  24. package/dist/paths.d.ts +9 -1
  25. package/dist/paths.d.ts.map +1 -1
  26. package/dist/paths.js +28 -2
  27. package/dist/pattern.d.ts +10 -0
  28. package/dist/pattern.d.ts.map +1 -0
  29. package/dist/pattern.js +355 -0
  30. package/dist/project.d.ts.map +1 -1
  31. package/dist/project.js +7 -7
  32. package/dist/query/language.d.ts +218 -0
  33. package/dist/query/language.d.ts.map +1 -0
  34. package/dist/query/language.js +526 -0
  35. package/dist/query/match.d.ts +12 -0
  36. package/dist/query/match.d.ts.map +1 -0
  37. package/dist/query/match.js +118 -0
  38. package/dist/query/rows.d.ts +32 -0
  39. package/dist/query/rows.d.ts.map +1 -0
  40. package/dist/query/rows.js +161 -0
  41. package/dist/query/sql.d.ts +39 -0
  42. package/dist/query/sql.d.ts.map +1 -0
  43. package/dist/query/sql.js +279 -0
  44. package/dist/references.d.ts.map +1 -1
  45. package/dist/references.js +6 -1
  46. package/dist/reserved.d.ts +5 -0
  47. package/dist/reserved.d.ts.map +1 -0
  48. package/dist/reserved.js +20 -0
  49. package/dist/schema.d.ts +1 -0
  50. package/dist/schema.d.ts.map +1 -1
  51. package/dist/schema.js +55 -4
  52. package/dist/types.d.ts +34 -4
  53. package/dist/types.d.ts.map +1 -1
  54. package/dist/validate.d.ts +28 -4
  55. package/dist/validate.d.ts.map +1 -1
  56. package/dist/validate.js +302 -75
  57. package/dist/yaml.d.ts.map +1 -1
  58. package/dist/yaml.js +36 -3
  59. package/fixtures/README.md +26 -6
  60. package/fixtures/cases/conditional-section/context.json +1 -0
  61. package/fixtures/cases/conditional-section/expected.json +6 -0
  62. package/fixtures/cases/conditional-section/library/questions/hosting.md +9 -0
  63. package/fixtures/cases/conditional-section/library/questions/payments.md +12 -0
  64. package/fixtures/cases/conditional-section/schema.yaml +14 -0
  65. package/fixtures/cases/cross-room-link/context.json +1 -0
  66. package/fixtures/cases/cross-room-link/expected.json +1 -0
  67. package/fixtures/cases/cross-room-link/library/clients/acme.md +6 -0
  68. package/fixtures/cases/cross-room-link/schema.yaml +3 -0
  69. package/fixtures/cases/cross-room-reference/context.json +1 -0
  70. package/fixtures/cases/cross-room-reference/expected.json +1 -0
  71. package/fixtures/cases/cross-room-reference/library/clients/acme.md +9 -0
  72. package/fixtures/cases/cross-room-reference/schema.yaml +9 -0
  73. package/fixtures/cases/link-into-a-reserved-name/context.json +1 -0
  74. package/fixtures/cases/link-into-a-reserved-name/expected.json +5 -0
  75. package/fixtures/cases/link-into-a-reserved-name/library/notes/a.md +6 -0
  76. package/fixtures/cases/link-into-a-reserved-name/schema.yaml +3 -0
  77. package/fixtures/cases/link-into-a-reserved-name-from-an-untyped-document/context.json +1 -0
  78. package/fixtures/cases/link-into-a-reserved-name-from-an-untyped-document/expected.json +5 -0
  79. package/fixtures/cases/link-into-a-reserved-name-from-an-untyped-document/library/notes/b.md +5 -0
  80. package/fixtures/cases/member-on-an-untyped-document/context.json +1 -0
  81. package/fixtures/cases/member-on-an-untyped-document/expected.json +6 -0
  82. package/fixtures/cases/member-on-an-untyped-document/library/note.md +4 -0
  83. package/fixtures/cases/member-on-another-type/context.json +1 -0
  84. package/fixtures/cases/member-on-another-type/expected.json +6 -0
  85. package/fixtures/cases/member-on-another-type/library/note.md +4 -0
  86. package/fixtures/cases/member-on-another-type/schema.yaml +7 -0
  87. package/fixtures/cases/reference-into-a-reserved-name/context.json +1 -0
  88. package/fixtures/cases/reference-into-a-reserved-name/expected.json +6 -0
  89. package/fixtures/cases/reference-into-a-reserved-name/library/notes/a.md +4 -0
  90. package/fixtures/cases/reference-into-a-reserved-name/library/settings/brief.md +1 -0
  91. package/fixtures/cases/reference-into-a-reserved-name/schema.yaml +3 -0
  92. package/fixtures/cases/room-md-declares-a-type/context.json +1 -0
  93. package/fixtures/cases/room-md-declares-a-type/expected.json +6 -0
  94. package/fixtures/cases/room-md-declares-a-type/library/ROOM.md +5 -0
  95. package/fixtures/cases/typed-path-names-another-type/context.json +11 -0
  96. package/fixtures/cases/typed-path-names-another-type/expected.json +6 -0
  97. package/fixtures/cases/typed-path-names-another-type/library/settings/prefs/one.md +3 -0
  98. package/fixtures/cases/typed-path-names-another-type/schema.yaml +6 -0
  99. package/fixtures/cases/typed-path-names-its-type/context.json +11 -0
  100. package/fixtures/cases/typed-path-names-its-type/expected.json +3 -0
  101. package/fixtures/cases/typed-path-names-its-type/library/settings/prefs/deeper/two.md +1 -0
  102. package/fixtures/cases/typed-path-names-its-type/library/settings/prefs/one.md +4 -0
  103. package/fixtures/cases/typed-path-names-its-type/schema.yaml +6 -0
  104. package/fixtures/cases/typed-path-names-no-type/context.json +11 -0
  105. package/fixtures/cases/typed-path-names-no-type/expected.json +6 -0
  106. package/fixtures/cases/typed-path-names-no-type/library/settings/prefs/one.md +1 -0
  107. package/fixtures/cases/typed-path-names-no-type/schema.yaml +6 -0
  108. package/fixtures/cases/unnamed-typed-path-checks-its-fields/context.json +11 -0
  109. package/fixtures/cases/unnamed-typed-path-checks-its-fields/expected.json +6 -0
  110. package/fixtures/cases/unnamed-typed-path-checks-its-fields/library/rooms/team/tasks/plan.md +4 -0
  111. package/fixtures/cases/unnamed-typed-path-checks-its-fields/schema.yaml +5 -0
  112. package/fixtures/cases/unnamed-typed-path-names-a-type/context.json +11 -0
  113. package/fixtures/cases/unnamed-typed-path-names-a-type/expected.json +6 -0
  114. package/fixtures/cases/unnamed-typed-path-names-a-type/library/rooms/team/tasks/plan.md +6 -0
  115. package/fixtures/cases/unnamed-typed-path-names-a-type/schema.yaml +5 -0
  116. package/fixtures/cases/unnamed-typed-path-reads-its-type/context.json +11 -0
  117. package/fixtures/cases/unnamed-typed-path-reads-its-type/expected.json +3 -0
  118. package/fixtures/cases/unnamed-typed-path-reads-its-type/library/rooms/team/plan.md +1 -0
  119. package/fixtures/cases/unnamed-typed-path-reads-its-type/library/rooms/team/tasks/plan.md +5 -0
  120. package/fixtures/cases/unnamed-typed-path-reads-its-type/schema.yaml +5 -0
  121. package/fixtures/cases/unnamed-typed-path-without-a-body/context.json +11 -0
  122. package/fixtures/cases/unnamed-typed-path-without-a-body/expected.json +5 -0
  123. package/fixtures/cases/unnamed-typed-path-without-a-body/library/rooms/team/tasks/plan.md +5 -0
  124. package/fixtures/cases/unnamed-typed-path-without-a-body/schema.yaml +5 -0
  125. package/fixtures/division.json +26 -26
  126. package/fixtures/queries.json +913 -0
  127. package/package.json +7 -2
package/dist/types.d.ts CHANGED
@@ -2,6 +2,7 @@ import type { Definition } from './definition.js';
2
2
  export type Library = Readonly<Record<string, string>>;
3
3
  export type VerifiedModel = {
4
4
  readonly types: Readonly<Record<string, Definition>>;
5
+ readonly nameable?: readonly string[];
5
6
  };
6
7
  export type ModelVerification = {
7
8
  readonly verdict: 'accept';
@@ -11,15 +12,23 @@ export type ModelVerification = {
11
12
  readonly rule: string;
12
13
  readonly location?: string;
13
14
  };
15
+ export type TypedPath = {
16
+ readonly path: string;
17
+ readonly type: string;
18
+ readonly named: boolean;
19
+ readonly body: boolean;
20
+ };
14
21
  export type ValidationContext = {
15
22
  readonly binaryTargets: readonly string[];
23
+ readonly anyRoom?: true;
24
+ readonly typedPaths?: readonly TypedPath[];
16
25
  };
17
26
  export type ProjectionContext = {
18
27
  readonly documentTargets: readonly string[];
19
28
  readonly definition?: Definition;
20
29
  };
21
30
  export type DivisionContext = ProjectionContext & {
22
- readonly budget: number;
31
+ readonly bound: number;
23
32
  };
24
33
  export type Extent = {
25
34
  readonly start: number;
@@ -60,6 +69,10 @@ export type Validation = {
60
69
  } | ({
61
70
  readonly verdict: 'refuse';
62
71
  } & Refusal);
72
+ export type ValidationStep = {
73
+ readonly path: string;
74
+ readonly resolved: number;
75
+ };
63
76
  export type Projection = {
64
77
  readonly ok: true;
65
78
  readonly text: string;
@@ -92,14 +105,31 @@ export type Link = {
92
105
  readonly href: string;
93
106
  readonly target: string;
94
107
  };
95
- export type LinkOccurrence = Link & {
96
- readonly start: number;
97
- };
98
108
  export type Reference = {
99
109
  readonly pointer: string;
100
110
  readonly value: string;
101
111
  readonly to: readonly string[];
112
+ readonly crossRoom?: true;
102
113
  };
114
+ export type RoomReference = {
115
+ readonly handle: string;
116
+ readonly path: string;
117
+ } & ({
118
+ readonly kind: 'link';
119
+ readonly href: string;
120
+ } | {
121
+ readonly kind: 'field';
122
+ readonly pointer: string;
123
+ readonly value: string;
124
+ readonly to: readonly string[];
125
+ readonly crossRoom?: true;
126
+ } | {
127
+ readonly kind: 'item';
128
+ readonly section: string;
129
+ readonly href: string;
130
+ readonly to: readonly string[];
131
+ readonly crossRoom?: true;
132
+ });
103
133
  export type Change = {
104
134
  readonly kind: 'field';
105
135
  readonly name: string;
@@ -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,9 +1,33 @@
1
1
  import { type Definition } from './definition.js';
2
- import type { DocumentCheck, Library, ModelVerification, Reached, Validation, ValidationContext, VerifiedModel } from './types.js';
2
+ import type { DocumentCheck, Library, ModelVerification, Reached, RoomReference, Validation, ValidationContext, ValidationStep, VerifiedModel } from './types.js';
3
3
  export declare function resolves(reference: Reached, typeOf: (path: string) => string | undefined, binary: (path: string) => boolean): boolean;
4
- export declare function verify(schema: string): ModelVerification;
5
- export declare function checkDocument(file: string, content: string, model: VerifiedModel): DocumentCheck;
4
+ export declare function verify(schema: string, provided?: VerifiedModel): ModelVerification;
5
+ type Placing = Pick<ValidationContext, 'anyRoom' | 'typedPaths'>;
6
+ export declare function checkDocument(file: string, content: string, model: VerifiedModel, context?: Placing): DocumentCheck;
6
7
  export declare function sectionReferences(file: string, content: string, definition: Definition): readonly Reached[];
7
- export declare function validating(library: Library, context?: ValidationContext, model?: VerifiedModel): Generator<string, Validation, void>;
8
+ export declare function bodyRoomLinks(body: string): RoomReference[];
9
+ export declare function roomReferences(file: string, content: string, definition?: Definition): readonly RoomReference[];
10
+ type Placed = {
11
+ readonly reference: Reached;
12
+ readonly location: string;
13
+ };
14
+ export type Assessment = {
15
+ readonly file: string;
16
+ readonly type: string | undefined;
17
+ readonly targets: readonly string[];
18
+ readonly read: Validation | null;
19
+ readonly structured: Validation | null;
20
+ readonly fields: readonly Placed[];
21
+ readonly linked: boolean;
22
+ readonly sections: readonly Placed[];
23
+ };
24
+ export declare function assess(file: string, content: string, binary: boolean, model?: VerifiedModel, context?: Placing): Assessment;
25
+ export type Verdicts = {
26
+ add(assessment: Assessment, typeOf: (path: string) => string | undefined, binary: (path: string) => boolean): number;
27
+ verdict(): Validation;
28
+ };
29
+ export declare function verdicts(): Verdicts;
30
+ export declare function validating(library: ReadonlyMap<string, string>, context?: ValidationContext, model?: VerifiedModel): Generator<ValidationStep, Validation, void>;
8
31
  export declare function validate(library: Library, context?: ValidationContext, model?: VerifiedModel): Validation;
32
+ export {};
9
33
  //# sourceMappingURL=validate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyC,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAQzF,OAAO,KAAK,EAEV,aAAa,EAEb,OAAO,EACP,iBAAiB,EACjB,OAAO,EACP,UAAU,EACV,iBAAiB,EACjB,aAAa,EACd,MAAM,YAAY,CAAC;AA6CpB,wBAAgB,QAAQ,CACtB,SAAS,EAAE,OAAO,EAClB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,EAC5C,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAChC,OAAO,CAET;AA8BD,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAQxD;AA2DD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,aAAa,CAmBhG;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,UAAU,GACrB,SAAS,OAAO,EAAE,CAgBpB;AAED,wBAAiB,UAAU,CACzB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,iBAAyC,EAClD,KAAK,GAAE,aAA6B,GACnC,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,CAyDrC;AAED,wBAAgB,QAAQ,CACtB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,iBAAyC,EAClD,KAAK,GAAE,aAA6B,GACnC,UAAU,CAKZ"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
package/dist/validate.js CHANGED
@@ -1,15 +1,62 @@
1
1
  import { ATTACHMENT, BUILT_IN_TYPE, readSchema } from './definition.js';
2
- import { parse } from './document.js';
2
+ import { links, parse } from './document.js';
3
+ import { MEMBER_FIELD } from './fields.js';
3
4
  import { hrefOccurrences, linkInventory } from './links.js';
4
- import { classifyHref } from './paths.js';
5
+ import { classifyHref, roomTarget } from './paths.js';
5
6
  import { references } from './references.js';
7
+ import { isDocumentPath, ROOM_DESCRIPTION } from './reserved.js';
6
8
  import { refusal } from './refuse.js';
7
- import { fitsItem, frontmatterRefusal } from './schema.js';
9
+ import { conditionedSections, fitsItem, frontmatterRefusal } from './schema.js';
10
+ import { openPatternBudget, PatternTooCostly } from './pattern.js';
8
11
  import { headingSpans, listItems } from './sections.js';
9
12
  import { bodyAfterFrontmatter, bodyStartOf } from './yaml.js';
10
13
  function refuse(file, rule, extra) {
11
14
  return { verdict: 'refuse', ...refusal(file, rule, extra) };
12
15
  }
16
+ function unmarkedMember(file, document, definition) {
17
+ return Object.hasOwn(document.fields, MEMBER_FIELD) && definition?.memberDocument !== true
18
+ ? refuse(file, 'undeclared-field', { location: `/${MEMBER_FIELD}` })
19
+ : null;
20
+ }
21
+ function reservedLink(file, document) {
22
+ return (document.type !== undefined &&
23
+ isDocumentPath(file) &&
24
+ links(document, file).some((link) => !isDocumentPath(link.target)));
25
+ }
26
+ function describedRoom(file, document) {
27
+ return file === ROOM_DESCRIPTION && document.type !== undefined
28
+ ? refuse(file, 'room-md-type', { location: '/type' })
29
+ : null;
30
+ }
31
+ function nameFits(pattern, name) {
32
+ const at = pattern.indexOf('*');
33
+ if (at === -1)
34
+ return pattern === name;
35
+ const head = pattern.slice(0, at);
36
+ const tail = pattern.slice(at + 1);
37
+ return name.length > head.length + tail.length && name.startsWith(head) && name.endsWith(tail);
38
+ }
39
+ function typedPathOf(file, typedPaths = []) {
40
+ const names = file.split('/');
41
+ return typedPaths.find(({ path }) => {
42
+ const patterns = path.split('/');
43
+ return (patterns.length === names.length &&
44
+ patterns.every((pattern, at) => nameFits(pattern, names[at])));
45
+ });
46
+ }
47
+ const HELD_TEXT = /\S/u;
48
+ function typedPathRefusal(file, content, document, typedPath) {
49
+ if (typedPath === undefined)
50
+ return null;
51
+ if (document.type !== (typedPath.named ? typedPath.type : undefined))
52
+ return refuse(file, 'unknown-type', { location: '/type' });
53
+ return typedPath.body && !HELD_TEXT.test(bodyAfterFrontmatter(content))
54
+ ? refuse(file, 'required-body')
55
+ : null;
56
+ }
57
+ function kindOf(document, typedPath) {
58
+ return typedPath !== undefined && !typedPath.named ? typedPath.type : instanceType(document);
59
+ }
13
60
  function instanceType(document) {
14
61
  const raw = document.fields.type;
15
62
  if (raw === undefined || raw === null)
@@ -60,8 +107,8 @@ function itemHrefs(content, items, uses) {
60
107
  }
61
108
  return hrefs;
62
109
  }
63
- export function verify(schema) {
64
- const read = readSchema(schema);
110
+ export function verify(schema, provided) {
111
+ const read = readSchema(schema, provided);
65
112
  if ('types' in read)
66
113
  return { verdict: 'accept', model: read };
67
114
  return {
@@ -80,10 +127,14 @@ function structure(file, content, document, definition) {
80
127
  const spans = headingSpans(content, bodyStartOf(content));
81
128
  const uses = usesIn(content);
82
129
  const sections = [];
130
+ const conditioned = conditionedSections(definition, document.fields);
83
131
  for (const [name, spec] of Object.entries(definition.sections)) {
84
132
  const occurrences = spans.filter((one) => one.name === name);
85
133
  if (occurrences.length === 0 && spec.required)
86
134
  return { refusal: refuse(file, 'required-section', { location: name }) };
135
+ if (conditioned.includes(name) &&
136
+ occurrences.every((span) => content.slice(span.bodyStart, span.bodyEnd).trim() === ''))
137
+ return { refusal: refuse(file, 'conditional-section', { location: name }) };
87
138
  if (spec.kind !== 'list')
88
139
  continue;
89
140
  for (const span of occurrences) {
@@ -96,10 +147,16 @@ function structure(file, content, document, definition) {
96
147
  const hrefs = itemHrefs(content, items, uses);
97
148
  if (hrefs === null)
98
149
  return { refusal: refuse(file, 'structured-section', { location: name }) };
99
- sections.push({ section: name, to: spec.items.reference, hrefs });
150
+ sections.push({
151
+ section: name,
152
+ to: spec.items.reference,
153
+ crossRoom: spec.items.crossRoom === true,
154
+ hrefs,
155
+ });
100
156
  }
101
157
  }
102
- return { sections };
158
+ const member = unmarkedMember(file, document, definition);
159
+ return member === null ? { sections } : { refusal: member };
103
160
  }
104
161
  function linked(file, content) {
105
162
  return hrefOccurrences(bodyAfterFrontmatter(content)).every((occurrence) => classifyHref(file, occurrence.href).kind !== 'invalid');
@@ -108,19 +165,39 @@ function reached(file, href, to) {
108
165
  const resolved = classifyHref(file, href);
109
166
  return { target: resolved.kind === 'path' ? resolved.path : null, to };
110
167
  }
111
- function definitionOf(document, model) {
112
- const kind = instanceType(document);
168
+ function referred(file, href, to) {
169
+ const reference = reached(file, href, to);
170
+ return reference.target !== null &&
171
+ isDocumentPath(file) &&
172
+ !isDocumentPath(reference.target) &&
173
+ !to.includes(ATTACHMENT)
174
+ ? { target: null, to }
175
+ : reference;
176
+ }
177
+ function crossing(file, href, crossRoom) {
178
+ return crossRoom === true && classifyHref(file, href).kind === 'room';
179
+ }
180
+ function definitionOf(kind, model) {
113
181
  return kind === null || !Object.hasOwn(model.types, kind) ? undefined : model.types[kind];
114
182
  }
115
- export function checkDocument(file, content, model) {
183
+ export function checkDocument(file, content, model, context = {}) {
184
+ const anyRoom = context.anyRoom === true;
116
185
  const parsed = parse(content, file);
117
186
  if (!parsed.ok)
118
187
  return { ok: false };
119
188
  const document = parsed.document;
120
189
  const type = document.type ?? BUILT_IN_TYPE;
121
- if (instanceType(document) === BUILT_IN_TYPE)
122
- return { ok: true, type, typed: false, references: [] };
123
- const definition = definitionOf(document, model);
190
+ const typedPath = typedPathOf(file, context.typedPaths);
191
+ if (describedRoom(file, document) !== null ||
192
+ typedPathRefusal(file, content, document, typedPath) !== null ||
193
+ reservedLink(file, document))
194
+ return { ok: false };
195
+ const kind = kindOf(document, typedPath);
196
+ if (kind === BUILT_IN_TYPE)
197
+ return unmarkedMember(file, document, undefined) === null
198
+ ? { ok: true, type, typed: false, references: [] }
199
+ : { ok: false };
200
+ const definition = definitionOf(kind, model);
124
201
  const read = structure(file, content, document, definition);
125
202
  if ('refusal' in read || definition === undefined || !linked(file, content))
126
203
  return { ok: false };
@@ -129,94 +206,244 @@ export function checkDocument(file, content, model) {
129
206
  type,
130
207
  typed: true,
131
208
  references: [
132
- ...references(document, definition).map(({ value, to }) => reached(file, value, to)),
133
- ...read.sections.flatMap(({ to, hrefs }) => hrefs.map((href) => reached(file, href, to))),
209
+ ...references(document, definition).flatMap(({ value, to, crossRoom }) => crossing(file, value, anyRoom || crossRoom) ? [] : [referred(file, value, to)]),
210
+ ...read.sections.flatMap(({ to, crossRoom, hrefs }) => hrefs.flatMap((href) => crossing(file, href, anyRoom || crossRoom) ? [] : [referred(file, href, to)])),
134
211
  ],
135
212
  };
136
213
  }
137
214
  export function sectionReferences(file, content, definition) {
138
215
  const referring = (name) => {
139
216
  const spec = Object.hasOwn(definition.sections, name) ? definition.sections[name] : undefined;
140
- return spec?.kind === 'list' ? spec.items.reference : undefined;
217
+ return spec?.kind === 'list' && spec.items.reference !== undefined ? spec.items : undefined;
141
218
  };
142
219
  if (!Object.keys(definition.sections).some((name) => referring(name) !== undefined))
143
220
  return [];
144
221
  const uses = usesIn(content);
145
222
  const found = [];
146
223
  for (const span of headingSpans(content, bodyStartOf(content))) {
147
- const to = referring(span.name);
148
- if (to === undefined)
224
+ const items = referring(span.name);
225
+ if (items === undefined)
149
226
  continue;
150
- const items = listItems(content, span.bodyStart, span.bodyEnd);
151
- const hrefs = items === null ? null : itemHrefs(content, items, uses);
227
+ const listed = listItems(content, span.bodyStart, span.bodyEnd);
228
+ const hrefs = listed === null ? null : itemHrefs(content, listed, uses);
152
229
  for (const href of hrefs ?? [])
153
- found.push(reached(file, href, to));
230
+ if (!crossing(file, href, items.crossRoom))
231
+ found.push(reached(file, href, items.reference));
232
+ }
233
+ return found;
234
+ }
235
+ export function bodyRoomLinks(body) {
236
+ const found = [];
237
+ for (const href of new Set(hrefOccurrences(body).map((occurrence) => occurrence.href))) {
238
+ const room = roomTarget(href);
239
+ if (room !== null)
240
+ found.push({ kind: 'link', href, ...room });
241
+ }
242
+ return found;
243
+ }
244
+ export function roomReferences(file, content, definition) {
245
+ const found = bodyRoomLinks(bodyAfterFrontmatter(content));
246
+ if (definition === undefined)
247
+ return found;
248
+ const parsed = parse(content, file);
249
+ if (!parsed.ok)
250
+ return found;
251
+ for (const { pointer, value, to, crossRoom } of references(parsed.document, definition)) {
252
+ const room = roomTarget(value);
253
+ if (room !== null)
254
+ found.push({
255
+ kind: 'field',
256
+ pointer,
257
+ value,
258
+ to,
259
+ ...room,
260
+ ...(crossRoom ? { crossRoom } : {}),
261
+ });
262
+ }
263
+ const uses = usesIn(content);
264
+ for (const span of headingSpans(content, bodyStartOf(content))) {
265
+ const spec = Object.hasOwn(definition.sections, span.name)
266
+ ? definition.sections[span.name]
267
+ : undefined;
268
+ if (spec?.kind !== 'list' || spec.items.reference === undefined)
269
+ continue;
270
+ const listed = listItems(content, span.bodyStart, span.bodyEnd);
271
+ for (const href of (listed === null ? null : itemHrefs(content, listed, uses)) ?? []) {
272
+ const room = roomTarget(href);
273
+ if (room !== null)
274
+ found.push({
275
+ kind: 'item',
276
+ section: span.name,
277
+ href,
278
+ to: spec.items.reference,
279
+ ...room,
280
+ ...(spec.items.crossRoom === true ? { crossRoom: true } : {}),
281
+ });
282
+ }
154
283
  }
155
284
  return found;
156
285
  }
286
+ function least(refused, file, verdict) {
287
+ return refused === undefined || file < refused.file ? { file, verdict } : refused;
288
+ }
289
+ export function assess(file, content, binary, model = { types: {} }, context = {}) {
290
+ const unread = { file, type: undefined, targets: [], structured: null, fields: [], sections: [] };
291
+ if (binary)
292
+ return { ...unread, read: refuse(file, 'binary-target-document'), linked: true };
293
+ const parsed = parse(content, file);
294
+ if (!parsed.ok)
295
+ return { ...unread, read: { verdict: 'refuse', ...parsed.refusal }, linked: true };
296
+ const document = parsed.document;
297
+ const type = document.type ?? BUILT_IN_TYPE;
298
+ const typed = { file, type, read: null, structured: null };
299
+ const typedPath = typedPathOf(file, context.typedPaths);
300
+ const described = describedRoom(file, document) ?? typedPathRefusal(file, content, document, typedPath);
301
+ if (described !== null)
302
+ return { ...typed, targets: [], structured: described, fields: [], linked: true, sections: [] };
303
+ const kind = kindOf(document, typedPath);
304
+ if (kind === BUILT_IN_TYPE) {
305
+ const structured = unmarkedMember(file, document, undefined);
306
+ return {
307
+ ...typed,
308
+ targets: [],
309
+ structured,
310
+ fields: [],
311
+ linked: !reservedLink(file, document),
312
+ sections: [],
313
+ };
314
+ }
315
+ const definition = definitionOf(kind, model);
316
+ try {
317
+ return structured(file, content, typed, document, definition, context);
318
+ }
319
+ catch (error) {
320
+ if (!(error instanceof PatternTooCostly))
321
+ throw error;
322
+ return {
323
+ ...typed,
324
+ targets: [],
325
+ structured: refuse(file, 'pattern', { location: '' }),
326
+ fields: [],
327
+ linked: true,
328
+ sections: [],
329
+ };
330
+ }
331
+ }
332
+ function structured(file, content, typed, document, definition, context) {
333
+ const read = structure(file, content, document, definition);
334
+ if ('refusal' in read || definition === undefined) {
335
+ return {
336
+ ...typed,
337
+ targets: [],
338
+ structured: 'refusal' in read ? read.refusal : null,
339
+ fields: [],
340
+ linked: true,
341
+ sections: [],
342
+ };
343
+ }
344
+ const anyRoom = context.anyRoom === true;
345
+ const fields = references(document, definition).flatMap(({ pointer, value, to, crossRoom }) => crossing(file, value, anyRoom || crossRoom)
346
+ ? []
347
+ : [{ reference: referred(file, value, to), location: pointer }]);
348
+ const sections = read.sections.flatMap(({ section, to, crossRoom, hrefs }) => hrefs.flatMap((href) => crossing(file, href, anyRoom || crossRoom)
349
+ ? []
350
+ : [{ reference: referred(file, href, to), location: section }]));
351
+ const targets = new Set();
352
+ for (const { reference } of [...fields, ...sections]) {
353
+ if (reference.target !== null)
354
+ targets.add(reference.target);
355
+ }
356
+ return {
357
+ ...typed,
358
+ targets: [...targets],
359
+ fields,
360
+ linked: linked(file, content) && !reservedLink(file, document),
361
+ sections,
362
+ };
363
+ }
364
+ export function verdicts() {
365
+ let read;
366
+ let structured;
367
+ let referred;
368
+ let missed;
369
+ const unreached = (placed, typeOf, binary) => placed.find(({ reference }) => !reaches(reference, typeOf, binary));
370
+ return {
371
+ add(assessment, typeOf, binary) {
372
+ const { file } = assessment;
373
+ if (assessment.read !== null) {
374
+ read = least(read, file, assessment.read);
375
+ return 0;
376
+ }
377
+ if (assessment.structured !== null) {
378
+ structured = least(structured, file, assessment.structured);
379
+ return 0;
380
+ }
381
+ const field = unreached(assessment.fields, typeOf, binary);
382
+ if (field !== undefined) {
383
+ referred = least(referred, file, refuse(file, 'unresolved-reference', { location: field.location }));
384
+ return 0;
385
+ }
386
+ if (!assessment.linked) {
387
+ referred = least(referred, file, refuse(file, 'unresolved-link'));
388
+ return 0;
389
+ }
390
+ const section = unreached(assessment.sections, typeOf, binary);
391
+ if (section !== undefined) {
392
+ referred = least(referred, file, refuse(file, 'unresolved-reference', { location: section.location }));
393
+ return 0;
394
+ }
395
+ const all = [...assessment.fields, ...assessment.sections];
396
+ for (const { reference } of all) {
397
+ if (!missing(reference, typeOf, binary))
398
+ continue;
399
+ const path = reference.target;
400
+ if (missed === undefined || path < missed.path)
401
+ missed = { path, referrers: [] };
402
+ if (path === missed.path && missed.referrers.at(-1) !== file)
403
+ missed.referrers.push(file);
404
+ }
405
+ return all.length;
406
+ },
407
+ verdict() {
408
+ const refused = read ?? structured ?? referred;
409
+ if (refused !== undefined)
410
+ return refused.verdict;
411
+ if (missed !== undefined) {
412
+ return refuse(missed.path, 'referenced-missing-file', {
413
+ referrers: [...missed.referrers].sort(),
414
+ });
415
+ }
416
+ return { verdict: 'accept' };
417
+ },
418
+ };
419
+ }
157
420
  export function* validating(library, context = { binaryTargets: [] }, model = { types: {} }) {
158
421
  const binaryTargets = new Set(context.binaryTargets);
159
422
  const binary = (path) => binaryTargets.has(path);
160
- const files = Object.keys(library).sort();
161
423
  const types = new Map();
162
- const typeOf = (path) => types.get(path);
163
- const documents = new Map();
164
- for (const file of files) {
165
- if (binaryTargets.has(file))
166
- return refuse(file, 'binary-target-document');
167
- const parsed = parse(library[file], file);
168
- if (!parsed.ok)
169
- return { verdict: 'refuse', ...parsed.refusal };
170
- types.set(file, parsed.document.type ?? BUILT_IN_TYPE);
171
- if (instanceType(parsed.document) !== BUILT_IN_TYPE)
172
- documents.set(file, parsed.document);
173
- yield file;
174
- }
175
- const sectionReferences = new Map();
176
- for (const [file, document] of documents) {
177
- const read = structure(file, library[file], document, definitionOf(document, model));
178
- if ('refusal' in read)
179
- return read.refusal;
180
- sectionReferences.set(file, read.sections);
181
- yield file;
182
- }
183
- let least;
184
- for (const [file, document] of documents) {
185
- const definition = definitionOf(document, model);
186
- const fields = references(document, definition).map(({ pointer, value, to }) => ({
187
- reference: reached(file, value, to),
188
- location: pointer,
189
- }));
190
- for (const { reference, location } of fields) {
191
- if (!reaches(reference, typeOf, binary))
192
- return refuse(file, 'unresolved-reference', { location });
424
+ const assessments = [];
425
+ const closeBudget = openPatternBudget();
426
+ try {
427
+ for (const [file, content] of library) {
428
+ const assessment = assess(file, content, binary(file), model, context);
429
+ if (assessment.type !== undefined)
430
+ types.set(file, assessment.type);
431
+ assessments.push(assessment);
432
+ yield { path: file, resolved: 0 };
193
433
  }
194
- if (!linked(file, library[file]))
195
- return refuse(file, 'unresolved-link');
196
- const sections = sectionReferences
197
- .get(file)
198
- .flatMap(({ section, to, hrefs }) => hrefs.map((href) => ({ reference: reached(file, href, to), location: section })));
199
- for (const { reference, location } of sections) {
200
- if (!reaches(reference, typeOf, binary))
201
- return refuse(file, 'unresolved-reference', { location });
434
+ const judged = verdicts();
435
+ for (const assessment of assessments) {
436
+ const resolved = judged.add(assessment, (path) => types.get(path), binary);
437
+ yield { path: assessment.file, resolved };
202
438
  }
203
- for (const { reference } of [...fields, ...sections]) {
204
- if (!missing(reference, typeOf, binary))
205
- continue;
206
- const path = reference.target;
207
- if (least === undefined || path < least.path)
208
- least = { path, referrers: [] };
209
- if (path === least.path && least.referrers.at(-1) !== file)
210
- least.referrers.push(file);
211
- }
212
- yield file;
439
+ return judged.verdict();
440
+ }
441
+ finally {
442
+ closeBudget();
213
443
  }
214
- if (least !== undefined)
215
- return refuse(least.path, 'referenced-missing-file', { referrers: least.referrers });
216
- return { verdict: 'accept' };
217
444
  }
218
445
  export function validate(library, context = { binaryTargets: [] }, model = { types: {} }) {
219
- const steps = validating(library, context, model);
446
+ const steps = validating(new Map(Object.entries(library)), context, model);
220
447
  let step = steps.next();
221
448
  while (step.done !== true)
222
449
  step = steps.next();
@@ -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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"}