@agentshouse/mdmodel 0.1.0-alpha.16 → 0.1.0-alpha.17

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 (123) hide show
  1. package/API.md +44 -33
  2. package/README.md +2 -4
  3. package/dist/definition.d.ts +7 -3
  4. package/dist/definition.d.ts.map +1 -1
  5. package/dist/definition.js +83 -38
  6. package/dist/definition.js.map +1 -1
  7. package/dist/index.d.ts +1 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +1 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/paths.d.ts +0 -2
  12. package/dist/paths.d.ts.map +1 -1
  13. package/dist/paths.js +0 -7
  14. package/dist/paths.js.map +1 -1
  15. package/dist/project.d.ts.map +1 -1
  16. package/dist/project.js +3 -15
  17. package/dist/project.js.map +1 -1
  18. package/dist/types.d.ts +6 -5
  19. package/dist/types.d.ts.map +1 -1
  20. package/dist/types.js.map +1 -1
  21. package/dist/validate.d.ts +2 -3
  22. package/dist/validate.d.ts.map +1 -1
  23. package/dist/validate.js +42 -86
  24. package/dist/validate.js.map +1 -1
  25. package/dist/version.d.ts +1 -1
  26. package/dist/version.js +1 -1
  27. package/dist/version.js.map +1 -1
  28. package/dist/yaml.js +1 -1
  29. package/dist/yaml.js.map +1 -1
  30. package/fixtures/README.md +45 -44
  31. package/fixtures/cases/binary-any-reference/schema.yaml +4 -0
  32. package/fixtures/cases/binary-document-collision/schema.yaml +2 -0
  33. package/fixtures/cases/binary-link-outside-collection/schema.yaml +2 -0
  34. package/fixtures/cases/binary-prototype-reference/schema.yaml +4 -0
  35. package/fixtures/cases/binary-typed-reference/schema.yaml +5 -0
  36. package/fixtures/cases/bracketed-link-definition/schema.yaml +6 -0
  37. package/fixtures/cases/declared-binary-links/schema.yaml +2 -0
  38. package/fixtures/cases/duplicate-link-definition/schema.yaml +6 -0
  39. package/fixtures/cases/fenced-link-definition/schema.yaml +6 -0
  40. package/fixtures/cases/field-enum/schema.yaml +7 -0
  41. package/fixtures/cases/frontmatter-schema/expected.json +6 -0
  42. package/fixtures/cases/frontmatter-schema/schema.yaml +6 -0
  43. package/fixtures/cases/interrupted-link-definition/schema.yaml +2 -0
  44. package/fixtures/cases/long-fence-link-definition/schema.yaml +2 -0
  45. package/fixtures/cases/malformed-definition/expected.json +1 -2
  46. package/fixtures/cases/malformed-definition/schema.yaml +4 -0
  47. package/fixtures/cases/member-document/context.json +1 -0
  48. package/fixtures/cases/member-document/library/people/ana.md +5 -0
  49. package/fixtures/cases/member-document/schema.yaml +5 -0
  50. package/fixtures/cases/missing-binary-image/schema.yaml +2 -0
  51. package/fixtures/cases/missing-binary-link/schema.yaml +2 -0
  52. package/fixtures/cases/missing-required-field/schema.yaml +7 -0
  53. package/fixtures/cases/missing-section-item-kind/expected.json +1 -2
  54. package/fixtures/cases/missing-section-item-kind/schema.yaml +6 -0
  55. package/fixtures/cases/paragraph-link-definition/schema.yaml +2 -0
  56. package/fixtures/cases/prototype-field/schema.yaml +6 -0
  57. package/fixtures/cases/quoted-link-definition/schema.yaml +2 -0
  58. package/fixtures/cases/referenced-missing-file/schema.yaml +10 -0
  59. package/fixtures/cases/second-member-document/context.json +1 -0
  60. package/fixtures/cases/second-member-document/expected.json +6 -0
  61. package/fixtures/cases/second-member-document/schema.yaml +5 -0
  62. package/fixtures/cases/structured-section/schema.yaml +7 -0
  63. package/fixtures/cases/submission-keys/schema.yaml +4 -0
  64. package/fixtures/cases/truncated-link-definition/schema.yaml +2 -0
  65. package/fixtures/cases/types-folder-content/schema.yaml +4 -0
  66. package/fixtures/cases/undeclared-field/schema.yaml +6 -0
  67. package/fixtures/cases/unknown-type/expected.json +7 -0
  68. package/fixtures/cases/unknown-type/schema.yaml +4 -0
  69. package/fixtures/cases/unlisted-reference-type/context.json +1 -0
  70. package/fixtures/cases/unlisted-reference-type/expected.json +6 -0
  71. package/fixtures/cases/unlisted-reference-type/schema.yaml +4 -0
  72. package/fixtures/cases/unresolved-link/schema.yaml +6 -0
  73. package/fixtures/cases/valid-typed-document/schema.yaml +15 -0
  74. package/fixtures/cases/wide-item-fence-link/schema.yaml +2 -0
  75. package/fixtures/division.json +1 -21
  76. package/fixtures/projection.json +1 -24
  77. package/package.json +1 -1
  78. package/fixtures/cases/binary-any-reference/library/types/note.md +0 -5
  79. package/fixtures/cases/binary-document-collision/library/types/note.md +0 -3
  80. package/fixtures/cases/binary-link-outside-collection/library/types/note.md +0 -3
  81. package/fixtures/cases/binary-prototype-reference/library/types/note.md +0 -5
  82. package/fixtures/cases/binary-typed-reference/library/types/note.md +0 -5
  83. package/fixtures/cases/binary-typed-reference/library/types/person.md +0 -3
  84. package/fixtures/cases/bracketed-link-definition/library/types/task.md +0 -7
  85. package/fixtures/cases/declared-binary-links/library/types/note.md +0 -3
  86. package/fixtures/cases/duplicate-link-definition/library/types/task.md +0 -7
  87. package/fixtures/cases/external-invalid-model/definitions/schema/task.md +0 -5
  88. package/fixtures/cases/external-invalid-model/expected.json +0 -1
  89. package/fixtures/cases/external-invalid-model/library/note.md +0 -1
  90. package/fixtures/cases/external-unknown-type/definitions/schema/task.md +0 -5
  91. package/fixtures/cases/external-unknown-type/expected.json +0 -1
  92. package/fixtures/cases/external-valid/context.json +0 -1
  93. package/fixtures/cases/external-valid/definitions/types/task.md +0 -5
  94. package/fixtures/cases/fenced-link-definition/library/types/task.md +0 -7
  95. package/fixtures/cases/field-enum/library/types/task.md +0 -8
  96. package/fixtures/cases/interrupted-link-definition/library/types/note.md +0 -3
  97. package/fixtures/cases/long-fence-link-definition/library/types/note.md +0 -3
  98. package/fixtures/cases/malformed-definition/library/types/task.md +0 -5
  99. package/fixtures/cases/missing-binary-image/library/types/note.md +0 -3
  100. package/fixtures/cases/missing-binary-link/library/types/note.md +0 -3
  101. package/fixtures/cases/missing-required-field/library/types/task.md +0 -8
  102. package/fixtures/cases/missing-section-item-kind/library/types/task.md +0 -7
  103. package/fixtures/cases/paragraph-link-definition/library/types/note.md +0 -3
  104. package/fixtures/cases/prd-definition/library/types/task.md +0 -16
  105. package/fixtures/cases/prototype-field/library/types/task.md +0 -7
  106. package/fixtures/cases/quoted-link-definition/library/types/note.md +0 -3
  107. package/fixtures/cases/referenced-missing-file/library/types/person.md +0 -5
  108. package/fixtures/cases/referenced-missing-file/library/types/task.md +0 -8
  109. package/fixtures/cases/structured-section/library/types/task.md +0 -8
  110. package/fixtures/cases/submission-keys/library/types/note.md +0 -5
  111. package/fixtures/cases/truncated-link-definition/library/types/note.md +0 -3
  112. package/fixtures/cases/undeclared-field/library/types/task.md +0 -7
  113. package/fixtures/cases/unresolved-link/library/types/task.md +0 -7
  114. package/fixtures/cases/valid-typed-document/library/types/person.md +0 -5
  115. package/fixtures/cases/valid-typed-document/library/types/task.md +0 -13
  116. package/fixtures/cases/wide-item-fence-link/library/types/note.md +0 -3
  117. /package/fixtures/cases/{prd-definition → frontmatter-schema}/context.json +0 -0
  118. /package/fixtures/cases/{prd-definition → member-document}/expected.json +0 -0
  119. /package/fixtures/cases/{external-invalid-model → types-folder-content}/context.json +0 -0
  120. /package/fixtures/cases/{external-valid → types-folder-content}/expected.json +0 -0
  121. /package/fixtures/cases/{external-valid → types-folder-content}/library/types/task.md +0 -0
  122. /package/fixtures/cases/{external-unknown-type → unknown-type}/context.json +0 -0
  123. /package/fixtures/cases/{external-unknown-type → unknown-type}/library/item.md +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdmodel/src/project.ts"],"sourcesContent":["import { readDefinition, type Definition, type SectionSpec } from './definition.js';\nimport { frontmatter, parse } from './document.js';\nimport { linkInventory } from './links.js';\nimport { target } from './paths.js';\nimport { refusal } from './refuse.js';\nimport { headingSpans } from './sections.js';\nimport type { Document, Extent, Projection, ProjectionContext, Refusal } from './types.js';\nimport { bodyStartOf, mapEntry } from './yaml.js';\n\nexport type Piece = Extent & { readonly text: string };\n\nexport type Edit = Piece;\n\nexport type Input = {\n readonly values: readonly Piece[];\n readonly ranges: readonly Extent[];\n readonly edits: readonly Edit[];\n};\n\nexport type InputResult =\n | { readonly ok: true; readonly input: Input }\n | { readonly ok: false; readonly refusal: Refusal };\n\nfunction internalEdits(\n content: string,\n bodyStart: number,\n file: string,\n documentTargets: ReadonlySet<string>,\n): Edit[] {\n const inventory = linkInventory(content.slice(bodyStart));\n const internal = new Set<number>();\n const edits: Edit[] = [];\n for (const use of inventory.uses) {\n const resolved = target(file, use.destination.href);\n if (resolved === null || !documentTargets.has(resolved)) continue;\n internal.add(use.destination.start);\n edits.push({\n start: bodyStart + use.start,\n end: bodyStart + use.end,\n text: content.slice(bodyStart + use.labelStart, bodyStart + use.labelEnd),\n });\n }\n for (const block of inventory.blocks) {\n if (!internal.has(block.destination.start)) continue;\n edits.push({ start: bodyStart + block.start, end: bodyStart + block.end, text: '' });\n }\n return edits.sort((left, right) => left.start - right.start);\n}\n\nexport function rangeText(content: string, range: Extent, edits: readonly Edit[]): string {\n let text = '';\n let cursor = range.start;\n for (const edit of edits) {\n if (edit.start < cursor || edit.end > range.end) continue;\n text += content.slice(cursor, edit.start) + edit.text;\n cursor = edit.end;\n }\n return text + content.slice(cursor, range.end);\n}\n\nfunction structural(spec: SectionSpec): boolean {\n return spec.kind === 'list' && spec.of.kind !== 'text';\n}\n\nfunction freeTextValues(definition: Definition, document: Document): Piece[] {\n const root = frontmatter(document);\n if (root === null) return [];\n const values: Piece[] = [];\n for (const [name, spec] of Object.entries(definition.fields)) {\n const entry = mapEntry(root, name);\n if (entry === undefined) continue;\n const node = entry.value;\n if (spec.kind === 'text') {\n if (node.kind === 'scalar' && typeof node.value === 'string') {\n values.push({ start: node.start, end: node.end, text: `${node.value}\\n\\n` });\n }\n continue;\n }\n if (spec.kind !== 'list' || spec.of.kind !== 'text' || node.kind !== 'seq') continue;\n for (const item of node.items) {\n if (item.kind === 'scalar' && typeof item.value === 'string') {\n values.push({ start: item.start, end: item.end, text: `${item.value}\\n\\n` });\n }\n }\n }\n return values;\n}\n\nexport function projectionInput(\n document: Document,\n file: string,\n context: ProjectionContext,\n): InputResult {\n const content = document.content;\n const bodyStart = bodyStartOf(content);\n const edits = internalEdits(content, bodyStart, file, new Set(context.documentTargets));\n const declared = document.type;\n if (declared === undefined || declared === 'any') {\n return {\n ok: true,\n input: { values: [], ranges: [{ start: bodyStart, end: content.length }], edits },\n };\n }\n const source = context.definition;\n if (source === undefined) {\n return { ok: false, refusal: refusal(file, 'unknown-type', { location: 'type' }) };\n }\n const definitionFile = `types/${declared}.md`;\n const parsed = parse(source, definitionFile);\n if (!parsed.ok) return { ok: false, refusal: parsed.refusal };\n const definition = readDefinition(definitionFile, parsed.document);\n if ('rule' in definition) return { ok: false, refusal: definition };\n const structure = new Set(\n Object.entries(definition.sections).flatMap(([name, spec]) => (structural(spec) ? [name] : [])),\n );\n const headings = headingSpans(content, bodyStart);\n const ranges: Extent[] = [{ start: bodyStart, end: headings[0]?.headingStart ?? content.length }];\n for (const heading of headings) {\n if (structure.has(heading.name)) continue;\n ranges.push({ start: heading.headingStart, end: heading.bodyEnd });\n }\n return { ok: true, input: { values: freeTextValues(definition, document), ranges, edits } };\n}\n\nexport function project(\n document: Document,\n file: string,\n context: ProjectionContext = { documentTargets: [] },\n): Projection {\n const result = projectionInput(document, file, context);\n if (!result.ok) return { ok: false, refusal: result.refusal };\n const { values, ranges, edits } = result.input;\n const prose = ranges.map((range) => rangeText(document.content, range, edits)).join('');\n return { ok: true, text: values.map((value) => value.text).join('') + prose };\n}\n"],"names":["readDefinition","frontmatter","parse","linkInventory","target","refusal","headingSpans","bodyStartOf","mapEntry","internalEdits","content","bodyStart","file","documentTargets","inventory","slice","internal","Set","edits","use","uses","resolved","destination","href","has","add","start","push","end","text","labelStart","labelEnd","block","blocks","sort","left","right","rangeText","range","cursor","edit","structural","spec","kind","of","freeTextValues","definition","document","root","values","name","Object","entries","fields","entry","undefined","node","value","item","items","projectionInput","context","declared","type","ok","input","ranges","length","source","location","definitionFile","parsed","structure","sections","flatMap","headings","headingStart","heading","bodyEnd","project","result","prose","map","join"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdmodel/src/project.ts"],"sourcesContent":["import type { Definition, SectionSpec } from './definition.js';\nimport { frontmatter } from './document.js';\nimport { linkInventory } from './links.js';\nimport { target } from './paths.js';\nimport { refusal } from './refuse.js';\nimport { headingSpans } from './sections.js';\nimport type { Document, Extent, Projection, ProjectionContext, Refusal } from './types.js';\nimport { bodyStartOf, mapEntry } from './yaml.js';\n\nexport type Piece = Extent & { readonly text: string };\n\nexport type Edit = Piece;\n\nexport type Input = {\n readonly values: readonly Piece[];\n readonly ranges: readonly Extent[];\n readonly edits: readonly Edit[];\n};\n\nexport type InputResult =\n | { readonly ok: true; readonly input: Input }\n | { readonly ok: false; readonly refusal: Refusal };\n\nfunction internalEdits(\n content: string,\n bodyStart: number,\n file: string,\n documentTargets: ReadonlySet<string>,\n): Edit[] {\n const inventory = linkInventory(content.slice(bodyStart));\n const internal = new Set<number>();\n const edits: Edit[] = [];\n for (const use of inventory.uses) {\n const resolved = target(file, use.destination.href);\n if (resolved === null || !documentTargets.has(resolved)) continue;\n internal.add(use.destination.start);\n edits.push({\n start: bodyStart + use.start,\n end: bodyStart + use.end,\n text: content.slice(bodyStart + use.labelStart, bodyStart + use.labelEnd),\n });\n }\n for (const block of inventory.blocks) {\n if (!internal.has(block.destination.start)) continue;\n edits.push({ start: bodyStart + block.start, end: bodyStart + block.end, text: '' });\n }\n return edits.sort((left, right) => left.start - right.start);\n}\n\nexport function rangeText(content: string, range: Extent, edits: readonly Edit[]): string {\n let text = '';\n let cursor = range.start;\n for (const edit of edits) {\n if (edit.start < cursor || edit.end > range.end) continue;\n text += content.slice(cursor, edit.start) + edit.text;\n cursor = edit.end;\n }\n return text + content.slice(cursor, range.end);\n}\n\nfunction structural(spec: SectionSpec): boolean {\n return spec.kind === 'list' && spec.of.kind !== 'text';\n}\n\nfunction freeTextValues(definition: Definition, document: Document): Piece[] {\n const root = frontmatter(document);\n if (root === null) return [];\n const values: Piece[] = [];\n for (const [name, spec] of Object.entries(definition.fields)) {\n const entry = mapEntry(root, name);\n if (entry === undefined) continue;\n const node = entry.value;\n if (spec.kind === 'text') {\n if (node.kind === 'scalar' && typeof node.value === 'string') {\n values.push({ start: node.start, end: node.end, text: `${node.value}\\n\\n` });\n }\n continue;\n }\n if (spec.kind !== 'list' || spec.of.kind !== 'text' || node.kind !== 'seq') continue;\n for (const item of node.items) {\n if (item.kind === 'scalar' && typeof item.value === 'string') {\n values.push({ start: item.start, end: item.end, text: `${item.value}\\n\\n` });\n }\n }\n }\n return values;\n}\n\nexport function projectionInput(\n document: Document,\n file: string,\n context: ProjectionContext,\n): InputResult {\n const content = document.content;\n const bodyStart = bodyStartOf(content);\n const edits = internalEdits(content, bodyStart, file, new Set(context.documentTargets));\n const declared = document.type;\n if (declared === undefined || declared === 'any') {\n return {\n ok: true,\n input: { values: [], ranges: [{ start: bodyStart, end: content.length }], edits },\n };\n }\n const definition = context.definition;\n if (definition === undefined) {\n return { ok: false, refusal: refusal(file, 'unknown-type', { location: 'type' }) };\n }\n const structure = new Set(\n Object.entries(definition.sections).flatMap(([name, spec]) => (structural(spec) ? [name] : [])),\n );\n const headings = headingSpans(content, bodyStart);\n const ranges: Extent[] = [{ start: bodyStart, end: headings[0]?.headingStart ?? content.length }];\n for (const heading of headings) {\n if (structure.has(heading.name)) continue;\n ranges.push({ start: heading.headingStart, end: heading.bodyEnd });\n }\n return { ok: true, input: { values: freeTextValues(definition, document), ranges, edits } };\n}\n\nexport function project(\n document: Document,\n file: string,\n context: ProjectionContext = { documentTargets: [] },\n): Projection {\n const result = projectionInput(document, file, context);\n if (!result.ok) return { ok: false, refusal: result.refusal };\n const { values, ranges, edits } = result.input;\n const prose = ranges.map((range) => rangeText(document.content, range, edits)).join('');\n return { ok: true, text: values.map((value) => value.text).join('') + prose };\n}\n"],"names":["frontmatter","linkInventory","target","refusal","headingSpans","bodyStartOf","mapEntry","internalEdits","content","bodyStart","file","documentTargets","inventory","slice","internal","Set","edits","use","uses","resolved","destination","href","has","add","start","push","end","text","labelStart","labelEnd","block","blocks","sort","left","right","rangeText","range","cursor","edit","structural","spec","kind","of","freeTextValues","definition","document","root","values","name","Object","entries","fields","entry","undefined","node","value","item","items","projectionInput","context","declared","type","ok","input","ranges","length","location","structure","sections","flatMap","headings","headingStart","heading","bodyEnd","project","result","prose","map","join"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -6,16 +6,18 @@ export type VerifiedModel = {
6
6
  export type ModelVerification = {
7
7
  readonly verdict: 'accept';
8
8
  readonly model: VerifiedModel;
9
- } | ({
9
+ } | {
10
10
  readonly verdict: 'refuse';
11
- readonly source: 'model';
12
- } & Refusal);
11
+ readonly rule: string;
12
+ readonly version: string;
13
+ readonly location?: string;
14
+ };
13
15
  export type ValidationContext = {
14
16
  readonly binaryTargets: readonly string[];
15
17
  };
16
18
  export type ProjectionContext = {
17
19
  readonly documentTargets: readonly string[];
18
- readonly definition?: string;
20
+ readonly definition?: Definition;
19
21
  };
20
22
  export type DivisionContext = ProjectionContext & {
21
23
  readonly budget: number;
@@ -45,7 +47,6 @@ export type Validation = {
45
47
  readonly verdict: 'accept';
46
48
  } | ({
47
49
  readonly verdict: 'refuse';
48
- readonly source?: 'content';
49
50
  } & Refusal);
50
51
  export type Projection = {
51
52
  readonly ok: true;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEvD,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;CACtD,CAAC;AAEF,MAAM,MAAM,iBAAiB,GACzB;IAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAA;CAAE,GAC7D,CAAC;IAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,CAAC;AAEzE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,iBAAiB,GAAG;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,GAC9B,CAAC;IAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,OAAO,CAAC,CAAC;AAE5E,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtD,MAAM,MAAM,QAAQ,GAChB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtD,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,GAClD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtD,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,MAAM,GACd;IACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB,CAAC;AAEN,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,GAC5D;IAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,GAC1D;IAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdmodel/src/types.ts"],"sourcesContent":["import type { Definition } from './definition.js';\n\nexport type Library = Readonly<Record<string, string>>;\n\nexport type VerifiedModel = {\n readonly types: Readonly<Record<string, Definition>>;\n};\n\nexport type ModelVerification =\n | { readonly verdict: 'accept'; readonly model: VerifiedModel }\n | ({ readonly verdict: 'refuse'; readonly source: 'model' } & Refusal);\n\nexport type ValidationContext = {\n readonly binaryTargets: readonly string[];\n};\n\nexport type ProjectionContext = {\n readonly documentTargets: readonly string[];\n readonly definition?: string;\n};\n\nexport type DivisionContext = ProjectionContext & {\n readonly budget: number;\n};\n\nexport type Extent = {\n readonly start: number;\n readonly end: number;\n};\n\nexport type Span = Extent & {\n readonly text: string;\n};\n\nexport type Document = {\n readonly content: string;\n readonly type: string | undefined;\n readonly fields: Readonly<Record<string, unknown>>;\n readonly preamble: string;\n readonly sections: Readonly<Record<string, string>>;\n};\n\nexport type Refusal = {\n readonly file: string;\n readonly rule: string;\n readonly version: string;\n readonly location?: string;\n readonly referrers?: readonly string[];\n};\n\nexport type Validation =\n | { readonly verdict: 'accept' }\n | ({ readonly verdict: 'refuse'; readonly source?: 'content' } & Refusal);\n\nexport type Projection =\n | { readonly ok: true; readonly text: string }\n | { readonly ok: false; readonly refusal: Refusal };\n\nexport type Division =\n | { readonly ok: true; readonly spans: readonly Span[] }\n | { readonly ok: false; readonly refusal: Refusal };\n\nexport type ParseResult =\n | { readonly ok: true; readonly document: Document }\n | { readonly ok: false; readonly refusal: Refusal };\n\nexport type Link = {\n readonly href: string;\n readonly target: string;\n};\n\nexport type Change =\n | {\n readonly kind: 'field';\n readonly name: string;\n readonly value: unknown;\n readonly prior: unknown;\n }\n | {\n readonly kind: 'section';\n readonly name: string;\n readonly value: string;\n readonly prior: string;\n }\n | {\n readonly kind: 'preamble';\n readonly value: string;\n readonly prior: string;\n }\n | {\n readonly kind: 'link';\n readonly href: string;\n readonly to: string;\n };\n\nexport type ApplyResult =\n | { readonly outcome: 'applied'; readonly document: Document }\n | { readonly outcome: 'stale'; readonly document: Document }\n | { readonly outcome: 'refuse'; readonly refusal: Refusal };\n"],"names":[],"mappings":"AA+FA,WAG8D"}
1
+ {"version":3,"sources":["/workspace/packages/mdmodel/src/types.ts"],"sourcesContent":["import type { Definition } from './definition.js';\n\nexport type Library = Readonly<Record<string, string>>;\n\nexport type VerifiedModel = {\n readonly types: Readonly<Record<string, Definition>>;\n};\n\nexport type ModelVerification =\n | { readonly verdict: 'accept'; readonly model: VerifiedModel }\n | {\n readonly verdict: 'refuse';\n readonly rule: string;\n readonly version: string;\n readonly location?: string;\n };\n\nexport type ValidationContext = {\n readonly binaryTargets: readonly string[];\n};\n\nexport type ProjectionContext = {\n readonly documentTargets: readonly string[];\n readonly definition?: Definition;\n};\n\nexport type DivisionContext = ProjectionContext & {\n readonly budget: number;\n};\n\nexport type Extent = {\n readonly start: number;\n readonly end: number;\n};\n\nexport type Span = Extent & {\n readonly text: string;\n};\n\nexport type Document = {\n readonly content: string;\n readonly type: string | undefined;\n readonly fields: Readonly<Record<string, unknown>>;\n readonly preamble: string;\n readonly sections: Readonly<Record<string, string>>;\n};\n\nexport type Refusal = {\n readonly file: string;\n readonly rule: string;\n readonly version: string;\n readonly location?: string;\n readonly referrers?: readonly string[];\n};\n\nexport type Validation =\n | { readonly verdict: 'accept' }\n | ({ readonly verdict: 'refuse' } & Refusal);\n\nexport type Projection =\n | { readonly ok: true; readonly text: string }\n | { readonly ok: false; readonly refusal: Refusal };\n\nexport type Division =\n | { readonly ok: true; readonly spans: readonly Span[] }\n | { readonly ok: false; readonly refusal: Refusal };\n\nexport type ParseResult =\n | { readonly ok: true; readonly document: Document }\n | { readonly ok: false; readonly refusal: Refusal };\n\nexport type Link = {\n readonly href: string;\n readonly target: string;\n};\n\nexport type Change =\n | {\n readonly kind: 'field';\n readonly name: string;\n readonly value: unknown;\n readonly prior: unknown;\n }\n | {\n readonly kind: 'section';\n readonly name: string;\n readonly value: string;\n readonly prior: string;\n }\n | {\n readonly kind: 'preamble';\n readonly value: string;\n readonly prior: string;\n }\n | {\n readonly kind: 'link';\n readonly href: string;\n readonly to: string;\n };\n\nexport type ApplyResult =\n | { readonly outcome: 'applied'; readonly document: Document }\n | { readonly outcome: 'stale'; readonly document: Document }\n | { readonly outcome: 'refuse'; readonly refusal: Refusal };\n"],"names":[],"mappings":"AAoGA,WAG8D"}
@@ -1,5 +1,4 @@
1
- import type { Document, Library, ModelVerification, Validation, ValidationContext, VerifiedModel } from './types.js';
2
- export declare function verify(definitions: Library): ModelVerification;
3
- export declare function verifyDocuments(definitions: Readonly<Record<string, Document>>): ModelVerification;
1
+ import type { Library, ModelVerification, Validation, ValidationContext, VerifiedModel } from './types.js';
2
+ export declare function verify(schema: string): ModelVerification;
4
3
  export declare function validate(library: Library, context?: ValidationContext, model?: VerifiedModel): Validation;
5
4
  //# sourceMappingURL=validate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,QAAQ,EACR,OAAO,EACP,iBAAiB,EAGjB,UAAU,EACV,iBAAiB,EACjB,aAAa,EACd,MAAM,YAAY,CAAC;AA2CpB,wBAAgB,MAAM,CAAC,WAAW,EAAE,OAAO,GAAG,iBAAiB,CAI9D;AAED,wBAAgB,eAAe,CAC7B,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,GAC9C,iBAAiB,CAKnB;AAwCD,wBAAgB,QAAQ,CACtB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,iBAAyC,EAClD,KAAK,CAAC,EAAE,aAAa,GACpB,UAAU,CAKZ"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAEV,OAAO,EACP,iBAAiB,EACjB,UAAU,EACV,iBAAiB,EACjB,aAAa,EACd,MAAM,YAAY,CAAC;AA2CpB,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CASxD;AAQD,wBAAgB,QAAQ,CACtB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,iBAAyC,EAClD,KAAK,GAAE,aAA6B,GACnC,UAAU,CAyGZ"}
package/dist/validate.js CHANGED
@@ -1,22 +1,27 @@
1
- import { readDefinition } from './definition.js';
1
+ import { readSchema } from './definition.js';
2
2
  import { parse } from './document.js';
3
3
  import { hrefOccurrences } from './links.js';
4
- import { classifyHref, isTypesPath } from './paths.js';
4
+ import { classifyHref } from './paths.js';
5
5
  import { refusal } from './refuse.js';
6
6
  import { parseListSection } from './sections.js';
7
7
  import { validateFields } from './schema.js';
8
+ import { VERSION } from './version.js';
8
9
  import { bodyAfterFrontmatter } from './yaml.js';
10
+ const MEMBER_FIELD = 'member';
11
+ const MEMBER_SPEC = {
12
+ kind: 'string',
13
+ required: false
14
+ };
9
15
  function refuse(file, rule, extra) {
10
16
  return {
11
17
  verdict: 'refuse',
12
18
  ...refusal(file, rule, extra)
13
19
  };
14
20
  }
15
- function instanceType(document, file, model) {
16
- if (model === undefined && isTypesPath(file)) return 'definition';
21
+ function instanceType(document) {
17
22
  const raw = document.fields.type;
18
23
  if (raw === undefined || raw === null) return 'any';
19
- if (typeof raw !== 'string' || raw === '') return 'invalid';
24
+ if (typeof raw !== 'string' || raw === '') return null;
20
25
  return raw;
21
26
  }
22
27
  function referenceTargets(spec, value) {
@@ -38,63 +43,33 @@ function declaredTypeOf(content) {
38
43
  if (!parsed.ok) return undefined;
39
44
  return parsed.document.type ?? 'any';
40
45
  }
41
- export function verify(definitions) {
42
- return verifyEntries(Object.keys(definitions).sort(), (address)=>parse(definitions[address], address));
43
- }
44
- export function verifyDocuments(definitions) {
45
- return verifyEntries(Object.keys(definitions).sort(), (address)=>({
46
- ok: true,
47
- document: definitions[address]
48
- }));
49
- }
50
- function verifyEntries(addresses, read) {
51
- const definitionsByName = new Map();
52
- for (const address of addresses){
53
- const failure = collectDefinition(definitionsByName, address, read(address));
54
- if (failure !== undefined) return {
55
- verdict: 'refuse',
56
- source: 'model',
57
- ...failure
58
- };
59
- }
60
- const types = Object.create(null);
61
- for (const [name, definition] of definitionsByName)types[name] = definition;
62
- return {
46
+ export function verify(schema) {
47
+ const read = readSchema(schema);
48
+ if ('types' in read) return {
63
49
  verdict: 'accept',
64
- model: Object.freeze({
65
- types: Object.freeze(types)
66
- })
50
+ model: read
51
+ };
52
+ return {
53
+ verdict: 'refuse',
54
+ rule: read.rule,
55
+ version: VERSION,
56
+ ...read.location === undefined ? {} : {
57
+ location: read.location
58
+ }
67
59
  };
68
60
  }
69
- function collectDefinition(definitions, address, parsed) {
70
- if (!parsed.ok) return parsed.refusal;
71
- const definition = readDefinition(address, parsed.document);
72
- if ('rule' in definition) return definition;
73
- if (definitions.has(definition.name)) return refusal(address, 'definition-duplicate', {
74
- location: definition.name
75
- });
76
- for (const spec of Object.values(definition.fields))freezeSpec(spec);
77
- for (const spec of Object.values(definition.sections))freezeSpec(spec);
78
- Object.freeze(definition.fields);
79
- Object.freeze(definition.sections);
80
- definitions.set(definition.name, Object.freeze(definition));
81
- return undefined;
82
- }
83
- function freezeSpec(spec) {
84
- if (spec.kind === 'list') freezeSpec(spec.of);
85
- if (spec.kind === 'enum') Object.freeze(spec.values);
86
- Object.freeze(spec);
61
+ function declaredFields(definition) {
62
+ if (!definition.memberDocument || Object.hasOwn(definition.fields, MEMBER_FIELD)) return definition.fields;
63
+ return {
64
+ ...definition.fields,
65
+ [MEMBER_FIELD]: MEMBER_SPEC
66
+ };
87
67
  }
88
68
  export function validate(library, context = {
89
69
  binaryTargets: []
90
- }, model) {
91
- const verdict = validateLibrary(library, context, model);
92
- return model !== undefined && verdict.verdict === 'refuse' ? {
93
- ...verdict,
94
- source: 'content'
95
- } : verdict;
96
- }
97
- function validateLibrary(library, context, model) {
70
+ }, model = {
71
+ types: {}
72
+ }) {
98
73
  const binaryTargets = new Set(context.binaryTargets);
99
74
  const files = Object.keys(library).sort();
100
75
  const documents = new Map();
@@ -107,48 +82,29 @@ function validateLibrary(library, context, model) {
107
82
  ...parsed.refusal
108
83
  };
109
84
  }
110
- const definitions = new Map();
111
- if (model !== undefined) {
112
- for (const [name, definition] of Object.entries(model.types))definitions.set(name, definition);
113
- } else {
114
- for (const file of files){
115
- if (!isTypesPath(file)) continue;
116
- const parsed = documents.get(file);
117
- if (parsed === undefined) continue;
118
- const failure = collectDefinition(definitions, file, parsed);
119
- if (failure !== undefined) return {
120
- verdict: 'refuse',
121
- ...failure
122
- };
123
- }
124
- }
85
+ const definitions = new Map(Object.entries(model.types));
125
86
  for (const file of files){
126
87
  const parsed = documents.get(file);
127
88
  if (parsed === undefined || !parsed.ok) continue;
128
- const kind = instanceType(parsed.document, file, model);
89
+ const kind = instanceType(parsed.document);
129
90
  if (kind === 'any') continue;
130
- if (kind === 'invalid' || kind === 'definition') {
131
- if (kind === 'definition' && model === undefined && isTypesPath(file)) continue;
132
- return refuse(file, 'unknown-type', {
133
- location: 'type'
134
- });
135
- }
136
- const definition = definitions.get(kind);
91
+ const definition = kind === null ? undefined : definitions.get(kind);
137
92
  if (definition === undefined) return refuse(file, 'unknown-type', {
138
93
  location: 'type'
139
94
  });
140
- const fieldFailure = validateFields(definition.fields, parsed.document.fields);
95
+ const fields = declaredFields(definition);
96
+ const fieldFailure = validateFields(fields, parsed.document.fields);
141
97
  if (fieldFailure !== undefined) {
142
98
  return refuse(file, fieldFailure.rule, {
143
99
  location: fieldFailure.field
144
100
  });
145
101
  }
146
- const declaredFields = new Set(Object.keys(definition.fields));
102
+ const declared = new Set(Object.keys(fields));
147
103
  const undeclared = Object.keys(parsed.document.fields).find((name)=>![
148
104
  'type',
149
105
  'site',
150
106
  'received'
151
- ].includes(name) && !declaredFields.has(name));
107
+ ].includes(name) && !declared.has(name));
152
108
  if (undeclared !== undefined) return refuse(file, 'undeclared-field', {
153
109
  location: undeclared
154
110
  });
@@ -170,8 +126,8 @@ function validateLibrary(library, context, model) {
170
126
  for (const file of files){
171
127
  const parsed = documents.get(file);
172
128
  if (parsed === undefined || !parsed.ok) continue;
173
- const kind = instanceType(parsed.document, file, model);
174
- if (kind === 'any' || kind === 'definition' || kind === 'invalid') continue;
129
+ const kind = instanceType(parsed.document);
130
+ if (kind === null || kind === 'any') continue;
175
131
  const definition = definitions.get(kind);
176
132
  if (definition === undefined) continue;
177
133
  for (const [name, spec] of Object.entries(definition.fields)){
@@ -203,8 +159,8 @@ function validateLibrary(library, context, model) {
203
159
  for (const file of files){
204
160
  const parsed = documents.get(file);
205
161
  if (parsed === undefined || !parsed.ok) continue;
206
- const kind = instanceType(parsed.document, file, model);
207
- if (kind === 'any' || kind === 'definition' || kind === 'invalid') continue;
162
+ const kind = instanceType(parsed.document);
163
+ if (kind === null || kind === 'any') continue;
208
164
  const definition = definitions.get(kind);
209
165
  if (definition === undefined) continue;
210
166
  for (const [name, spec] of Object.entries(definition.fields)){
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdmodel/src/validate.ts"],"sourcesContent":["import { readDefinition, type Definition, type FieldSpec } from './definition.js';\nimport { parse } from './document.js';\nimport { hrefOccurrences } from './links.js';\nimport { classifyHref, isTypesPath } from './paths.js';\nimport { refusal } from './refuse.js';\nimport { parseListSection } from './sections.js';\nimport { validateFields } from './schema.js';\nimport type {\n Document,\n Library,\n ModelVerification,\n ParseResult,\n Refusal,\n Validation,\n ValidationContext,\n VerifiedModel,\n} from './types.js';\nimport { bodyAfterFrontmatter } from './yaml.js';\n\nfunction refuse(\n file: string,\n rule: string,\n extra?: { location?: string; referrers?: readonly string[] },\n): Validation {\n return { verdict: 'refuse', ...refusal(file, rule, extra) };\n}\n\nfunction instanceType(\n document: Document,\n file: string,\n model?: VerifiedModel,\n): 'any' | 'definition' | 'invalid' | string {\n if (model === undefined && isTypesPath(file)) return 'definition';\n const raw = document.fields.type;\n if (raw === undefined || raw === null) return 'any';\n if (typeof raw !== 'string' || raw === '') return 'invalid';\n return raw;\n}\n\nfunction referenceTargets(spec: FieldSpec, value: unknown): string[] {\n if (spec.kind === 'reference' && typeof value === 'string') return [value];\n if (spec.kind === 'list' && spec.of.kind === 'reference' && Array.isArray(value)) {\n return value.filter((item): item is string => typeof item === 'string');\n }\n return [];\n}\n\nfunction expectedReferenceType(spec: FieldSpec): string | null {\n if (spec.kind === 'reference') return spec.to;\n if (spec.kind === 'list' && spec.of.kind === 'reference') return spec.of.to;\n return null;\n}\n\nfunction declaredTypeOf(content: string): string | undefined {\n const parsed = parse(content);\n if (!parsed.ok) return undefined;\n return parsed.document.type ?? 'any';\n}\n\nexport function verify(definitions: Library): ModelVerification {\n return verifyEntries(Object.keys(definitions).sort(), (address) =>\n parse(definitions[address]!, address),\n );\n}\n\nexport function verifyDocuments(\n definitions: Readonly<Record<string, Document>>,\n): ModelVerification {\n return verifyEntries(Object.keys(definitions).sort(), (address) => ({\n ok: true,\n document: definitions[address]!,\n }));\n}\n\nfunction verifyEntries(\n addresses: readonly string[],\n read: (address: string) => ParseResult,\n): ModelVerification {\n const definitionsByName = new Map<string, Definition>();\n for (const address of addresses) {\n const failure = collectDefinition(definitionsByName, address, read(address));\n if (failure !== undefined) return { verdict: 'refuse', source: 'model', ...failure };\n }\n const types: Record<string, Definition> = Object.create(null);\n for (const [name, definition] of definitionsByName) types[name] = definition;\n return { verdict: 'accept', model: Object.freeze({ types: Object.freeze(types) }) };\n}\n\nfunction collectDefinition(\n definitions: Map<string, Definition>,\n address: string,\n parsed: ParseResult,\n): Refusal | undefined {\n if (!parsed.ok) return parsed.refusal;\n const definition = readDefinition(address, parsed.document);\n if ('rule' in definition) return definition;\n if (definitions.has(definition.name))\n return refusal(address, 'definition-duplicate', { location: definition.name });\n for (const spec of Object.values(definition.fields)) freezeSpec(spec);\n for (const spec of Object.values(definition.sections)) freezeSpec(spec);\n Object.freeze(definition.fields);\n Object.freeze(definition.sections);\n definitions.set(definition.name, Object.freeze(definition));\n return undefined;\n}\n\nfunction freezeSpec(spec: FieldSpec): void {\n if (spec.kind === 'list') freezeSpec(spec.of);\n if (spec.kind === 'enum') Object.freeze(spec.values);\n Object.freeze(spec);\n}\n\nexport function validate(\n library: Library,\n context: ValidationContext = { binaryTargets: [] },\n model?: VerifiedModel,\n): Validation {\n const verdict = validateLibrary(library, context, model);\n return model !== undefined && verdict.verdict === 'refuse'\n ? { ...verdict, source: 'content' }\n : verdict;\n}\n\nfunction validateLibrary(\n library: Library,\n context: ValidationContext,\n model?: VerifiedModel,\n): Validation {\n const binaryTargets = new Set(context.binaryTargets);\n const files = Object.keys(library).sort();\n const documents = new Map<string, ReturnType<typeof parse>>();\n for (const file of files) {\n if (binaryTargets.has(file)) return refuse(file, 'binary-target-document');\n const parsed = parse(library[file]!, file);\n documents.set(file, parsed);\n if (!parsed.ok) return { verdict: 'refuse', ...parsed.refusal };\n }\n\n const definitions = new Map<string, Definition>();\n if (model !== undefined) {\n for (const [name, definition] of Object.entries(model.types)) definitions.set(name, definition);\n } else {\n for (const file of files) {\n if (!isTypesPath(file)) continue;\n const parsed = documents.get(file);\n if (parsed === undefined) continue;\n const failure = collectDefinition(definitions, file, parsed);\n if (failure !== undefined) return { verdict: 'refuse', ...failure };\n }\n }\n\n for (const file of files) {\n const parsed = documents.get(file);\n if (parsed === undefined || !parsed.ok) continue;\n const kind = instanceType(parsed.document, file, model);\n if (kind === 'any') continue;\n if (kind === 'invalid' || kind === 'definition') {\n if (kind === 'definition' && model === undefined && isTypesPath(file)) continue;\n return refuse(file, 'unknown-type', { location: 'type' });\n }\n const definition = definitions.get(kind);\n if (definition === undefined) return refuse(file, 'unknown-type', { location: 'type' });\n const fieldFailure = validateFields(definition.fields, parsed.document.fields);\n if (fieldFailure !== undefined) {\n return refuse(file, fieldFailure.rule, { location: fieldFailure.field });\n }\n const declaredFields = new Set(Object.keys(definition.fields));\n const undeclared = Object.keys(parsed.document.fields).find(\n (name) => !['type', 'site', 'received'].includes(name) && !declaredFields.has(name),\n );\n if (undeclared !== undefined) return refuse(file, 'undeclared-field', { location: undeclared });\n for (const [name, spec] of Object.entries(definition.sections)) {\n const body = parsed.document.sections[name];\n if (body === undefined) {\n if (spec.required) return refuse(file, 'required-section', { location: name });\n continue;\n }\n if (spec.kind === 'list' && !parseListSection(body)) {\n return refuse(file, 'structured-section', { location: name });\n }\n }\n }\n\n for (const file of files) {\n const parsed = documents.get(file);\n if (parsed === undefined || !parsed.ok) continue;\n const kind = instanceType(parsed.document, file, model);\n if (kind === 'any' || kind === 'definition' || kind === 'invalid') continue;\n const definition = definitions.get(kind);\n if (definition === undefined) continue;\n for (const [name, spec] of Object.entries(definition.fields)) {\n const targets = referenceTargets(spec, parsed.document.fields[name]);\n const expected = expectedReferenceType(spec);\n if (expected === null) continue;\n for (const target of targets) {\n const resolved = classifyHref(file, target);\n if (resolved.kind !== 'path' || binaryTargets.has(resolved.path))\n return refuse(file, 'unresolved-reference', { location: name });\n if (!documents.has(resolved.path)) continue;\n const targetType = declaredTypeOf(library[resolved.path]!);\n if (targetType !== expected)\n return refuse(file, 'unresolved-reference', { location: name });\n }\n }\n const body = bodyAfterFrontmatter(library[file]!);\n for (const occurrence of hrefOccurrences(body)) {\n const resolved = classifyHref(file, occurrence.href);\n if (resolved.kind === 'skip') continue;\n if (\n resolved.kind === 'invalid' ||\n (!documents.has(resolved.path) && !binaryTargets.has(resolved.path))\n ) {\n return refuse(file, 'unresolved-link');\n }\n }\n }\n\n const missing = new Map<string, string[]>();\n for (const file of files) {\n const parsed = documents.get(file);\n if (parsed === undefined || !parsed.ok) continue;\n const kind = instanceType(parsed.document, file, model);\n if (kind === 'any' || kind === 'definition' || kind === 'invalid') continue;\n const definition = definitions.get(kind);\n if (definition === undefined) continue;\n for (const [name, spec] of Object.entries(definition.fields)) {\n const expected = expectedReferenceType(spec);\n if (expected === null) continue;\n for (const target of referenceTargets(spec, parsed.document.fields[name])) {\n const resolved = classifyHref(file, target);\n if (resolved.kind !== 'path') continue;\n if (documents.has(resolved.path)) continue;\n const referrers = missing.get(resolved.path) ?? [];\n referrers.push(file);\n missing.set(resolved.path, referrers);\n }\n }\n }\n const missingPaths = [...missing.keys()].sort();\n if (missingPaths.length > 0) {\n const path = missingPaths[0]!;\n const referrers = [...new Set(missing.get(path) ?? [])].sort();\n return refuse(path, 'referenced-missing-file', { referrers });\n }\n\n return { verdict: 'accept' };\n}\n"],"names":["readDefinition","parse","hrefOccurrences","classifyHref","isTypesPath","refusal","parseListSection","validateFields","bodyAfterFrontmatter","refuse","file","rule","extra","verdict","instanceType","document","model","undefined","raw","fields","type","referenceTargets","spec","value","kind","of","Array","isArray","filter","item","expectedReferenceType","to","declaredTypeOf","content","parsed","ok","verify","definitions","verifyEntries","Object","keys","sort","address","verifyDocuments","addresses","read","definitionsByName","Map","failure","collectDefinition","source","types","create","name","definition","freeze","has","location","values","freezeSpec","sections","set","validate","library","context","binaryTargets","validateLibrary","Set","files","documents","entries","get","fieldFailure","field","declaredFields","undeclared","find","includes","body","required","targets","expected","target","resolved","path","targetType","occurrence","href","missing","referrers","push","missingPaths","length"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdmodel/src/validate.ts"],"sourcesContent":["import { readSchema, type Definition, type FieldSpec } from './definition.js';\nimport { parse } from './document.js';\nimport { hrefOccurrences } from './links.js';\nimport { classifyHref } from './paths.js';\nimport { refusal } from './refuse.js';\nimport { parseListSection } from './sections.js';\nimport { validateFields } from './schema.js';\nimport type {\n Document,\n Library,\n ModelVerification,\n Validation,\n ValidationContext,\n VerifiedModel,\n} from './types.js';\nimport { VERSION } from './version.js';\nimport { bodyAfterFrontmatter } from './yaml.js';\n\nconst MEMBER_FIELD = 'member';\n\nconst MEMBER_SPEC: FieldSpec = { kind: 'string', required: false };\n\nfunction refuse(\n file: string,\n rule: string,\n extra?: { location?: string; referrers?: readonly string[] },\n): Validation {\n return { verdict: 'refuse', ...refusal(file, rule, extra) };\n}\n\nfunction instanceType(document: Document): string | null {\n const raw = document.fields.type;\n if (raw === undefined || raw === null) return 'any';\n if (typeof raw !== 'string' || raw === '') return null;\n return raw;\n}\n\nfunction referenceTargets(spec: FieldSpec, value: unknown): string[] {\n if (spec.kind === 'reference' && typeof value === 'string') return [value];\n if (spec.kind === 'list' && spec.of.kind === 'reference' && Array.isArray(value)) {\n return value.filter((item): item is string => typeof item === 'string');\n }\n return [];\n}\n\nfunction expectedReferenceType(spec: FieldSpec): string | null {\n if (spec.kind === 'reference') return spec.to;\n if (spec.kind === 'list' && spec.of.kind === 'reference') return spec.of.to;\n return null;\n}\n\nfunction declaredTypeOf(content: string): string | undefined {\n const parsed = parse(content);\n if (!parsed.ok) return undefined;\n return parsed.document.type ?? 'any';\n}\n\nexport function verify(schema: string): ModelVerification {\n const read = readSchema(schema);\n if ('types' in read) return { verdict: 'accept', model: read };\n return {\n verdict: 'refuse',\n rule: read.rule,\n version: VERSION,\n ...(read.location === undefined ? {} : { location: read.location }),\n };\n}\n\nfunction declaredFields(definition: Definition): Readonly<Record<string, FieldSpec>> {\n if (!definition.memberDocument || Object.hasOwn(definition.fields, MEMBER_FIELD))\n return definition.fields;\n return { ...definition.fields, [MEMBER_FIELD]: MEMBER_SPEC };\n}\n\nexport function validate(\n library: Library,\n context: ValidationContext = { binaryTargets: [] },\n model: VerifiedModel = { types: {} },\n): Validation {\n const binaryTargets = new Set(context.binaryTargets);\n const files = Object.keys(library).sort();\n const documents = new Map<string, ReturnType<typeof parse>>();\n for (const file of files) {\n if (binaryTargets.has(file)) return refuse(file, 'binary-target-document');\n const parsed = parse(library[file]!, file);\n documents.set(file, parsed);\n if (!parsed.ok) return { verdict: 'refuse', ...parsed.refusal };\n }\n\n const definitions = new Map(Object.entries(model.types));\n\n for (const file of files) {\n const parsed = documents.get(file);\n if (parsed === undefined || !parsed.ok) continue;\n const kind = instanceType(parsed.document);\n if (kind === 'any') continue;\n const definition = kind === null ? undefined : definitions.get(kind);\n if (definition === undefined) return refuse(file, 'unknown-type', { location: 'type' });\n const fields = declaredFields(definition);\n const fieldFailure = validateFields(fields, parsed.document.fields);\n if (fieldFailure !== undefined) {\n return refuse(file, fieldFailure.rule, { location: fieldFailure.field });\n }\n const declared = new Set(Object.keys(fields));\n const undeclared = Object.keys(parsed.document.fields).find(\n (name) => !['type', 'site', 'received'].includes(name) && !declared.has(name),\n );\n if (undeclared !== undefined) return refuse(file, 'undeclared-field', { location: undeclared });\n for (const [name, spec] of Object.entries(definition.sections)) {\n const body = parsed.document.sections[name];\n if (body === undefined) {\n if (spec.required) return refuse(file, 'required-section', { location: name });\n continue;\n }\n if (spec.kind === 'list' && !parseListSection(body)) {\n return refuse(file, 'structured-section', { location: name });\n }\n }\n }\n\n for (const file of files) {\n const parsed = documents.get(file);\n if (parsed === undefined || !parsed.ok) continue;\n const kind = instanceType(parsed.document);\n if (kind === null || kind === 'any') continue;\n const definition = definitions.get(kind);\n if (definition === undefined) continue;\n for (const [name, spec] of Object.entries(definition.fields)) {\n const targets = referenceTargets(spec, parsed.document.fields[name]);\n const expected = expectedReferenceType(spec);\n if (expected === null) continue;\n for (const target of targets) {\n const resolved = classifyHref(file, target);\n if (resolved.kind !== 'path' || binaryTargets.has(resolved.path))\n return refuse(file, 'unresolved-reference', { location: name });\n if (!documents.has(resolved.path)) continue;\n const targetType = declaredTypeOf(library[resolved.path]!);\n if (targetType !== expected)\n return refuse(file, 'unresolved-reference', { location: name });\n }\n }\n const body = bodyAfterFrontmatter(library[file]!);\n for (const occurrence of hrefOccurrences(body)) {\n const resolved = classifyHref(file, occurrence.href);\n if (resolved.kind === 'skip') continue;\n if (\n resolved.kind === 'invalid' ||\n (!documents.has(resolved.path) && !binaryTargets.has(resolved.path))\n ) {\n return refuse(file, 'unresolved-link');\n }\n }\n }\n\n const missing = new Map<string, string[]>();\n for (const file of files) {\n const parsed = documents.get(file);\n if (parsed === undefined || !parsed.ok) continue;\n const kind = instanceType(parsed.document);\n if (kind === null || kind === 'any') continue;\n const definition = definitions.get(kind);\n if (definition === undefined) continue;\n for (const [name, spec] of Object.entries(definition.fields)) {\n const expected = expectedReferenceType(spec);\n if (expected === null) continue;\n for (const target of referenceTargets(spec, parsed.document.fields[name])) {\n const resolved = classifyHref(file, target);\n if (resolved.kind !== 'path') continue;\n if (documents.has(resolved.path)) continue;\n const referrers = missing.get(resolved.path) ?? [];\n referrers.push(file);\n missing.set(resolved.path, referrers);\n }\n }\n }\n const missingPaths = [...missing.keys()].sort();\n if (missingPaths.length > 0) {\n const path = missingPaths[0]!;\n const referrers = [...new Set(missing.get(path) ?? [])].sort();\n return refuse(path, 'referenced-missing-file', { referrers });\n }\n\n return { verdict: 'accept' };\n}\n"],"names":["readSchema","parse","hrefOccurrences","classifyHref","refusal","parseListSection","validateFields","VERSION","bodyAfterFrontmatter","MEMBER_FIELD","MEMBER_SPEC","kind","required","refuse","file","rule","extra","verdict","instanceType","document","raw","fields","type","undefined","referenceTargets","spec","value","of","Array","isArray","filter","item","expectedReferenceType","to","declaredTypeOf","content","parsed","ok","verify","schema","read","model","version","location","declaredFields","definition","memberDocument","Object","hasOwn","validate","library","context","binaryTargets","types","Set","files","keys","sort","documents","Map","has","set","definitions","entries","get","fieldFailure","field","declared","undeclared","find","name","includes","sections","body","targets","expected","target","resolved","path","targetType","occurrence","href","missing","referrers","push","missingPaths","length"],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.1.0-alpha.16";
1
+ export declare const VERSION = "0.1.0-alpha.17";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
- export const VERSION = '0.1.0-alpha.16';
1
+ export const VERSION = '0.1.0-alpha.17';
2
2
 
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdmodel/src/version.ts"],"sourcesContent":["export const VERSION = '0.1.0-alpha.16';\n"],"names":["VERSION"],"mappings":"AAAA,OAAO,MAAMA,UAAU,iBAAiB"}
1
+ {"version":3,"sources":["/workspace/packages/mdmodel/src/version.ts"],"sourcesContent":["export const VERSION = '0.1.0-alpha.17';\n"],"names":["VERSION"],"mappings":"AAAA,OAAO,MAAMA,UAAU,iBAAiB"}
package/dist/yaml.js CHANGED
@@ -47,7 +47,7 @@ function skipFlowSpace(c) {
47
47
  }
48
48
  function indentAt(c) {
49
49
  let j = c.i;
50
- while(j > 0 && c.text[j - 1] !== '\n')j -= 1;
50
+ while(j > 0 && c.text[j - 1] !== '\n' && c.text[j - 1] !== '\r')j -= 1;
51
51
  let n = 0;
52
52
  while(j < c.i){
53
53
  const ch = c.text[j];
package/dist/yaml.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdmodel/src/yaml.ts"],"sourcesContent":["export class YamlError extends Error {\n constructor(readonly offset: number) {\n super('yaml');\n this.name = 'YamlError';\n }\n}\n\nexport type YamlScalar = {\n readonly kind: 'scalar';\n readonly value: string | number | boolean | null;\n readonly start: number;\n readonly end: number;\n};\n\nexport type YamlSeq = {\n readonly kind: 'seq';\n readonly items: readonly YamlNode[];\n readonly start: number;\n readonly end: number;\n};\n\nexport type YamlEntry = {\n readonly key: string;\n readonly keyStart: number;\n readonly keyEnd: number;\n readonly value: YamlNode;\n};\n\nexport type YamlMap = {\n readonly kind: 'map';\n readonly entries: readonly YamlEntry[];\n readonly start: number;\n readonly end: number;\n};\n\nexport type YamlNode = YamlScalar | YamlSeq | YamlMap;\n\ntype Ctx = { text: string; i: number; end: number };\n\nfunction peek(c: Ctx): string {\n return c.i < c.end ? c.text[c.i]! : '';\n}\n\nfunction skipEol(c: Ctx): void {\n if (peek(c) === '\\r') c.i += 1;\n if (peek(c) === '\\n') c.i += 1;\n}\n\nfunction skipSpaces(c: Ctx): void {\n while (peek(c) === ' ') c.i += 1;\n if (peek(c) === '\\t') throw new YamlError(c.i);\n}\n\nfunction skipToEol(c: Ctx): void {\n while (c.i < c.end && peek(c) !== '\\n' && peek(c) !== '\\r') c.i += 1;\n}\n\nfunction skipBlankAndComments(c: Ctx): void {\n while (c.i < c.end) {\n skipSpaces(c);\n if (peek(c) === '#') skipToEol(c);\n if (peek(c) === '\\r' || peek(c) === '\\n') {\n skipEol(c);\n continue;\n }\n break;\n }\n}\n\nfunction skipFlowSpace(c: Ctx): void {\n while (c.i < c.end) {\n const ch = peek(c);\n if (ch === ' ' || ch === '\\n' || ch === '\\r') {\n c.i += 1;\n continue;\n }\n if (ch === '#') {\n skipToEol(c);\n continue;\n }\n if (ch === '\\t') throw new YamlError(c.i);\n break;\n }\n}\n\nfunction indentAt(c: Ctx): number {\n let j = c.i;\n while (j > 0 && c.text[j - 1] !== '\\n') j -= 1;\n let n = 0;\n while (j < c.i) {\n const ch = c.text[j]!;\n if (ch === ' ') n += 1;\n else if (ch === '\\t') throw new YamlError(j);\n else break;\n j += 1;\n }\n return n;\n}\n\nfunction scalar(value: string | number | boolean | null, start: number, end: number): YamlScalar {\n return { kind: 'scalar', value, start, end };\n}\n\nfunction interpretPlain(text: string): string | number | boolean | null {\n if (text === 'true') return true;\n if (text === 'false') return false;\n if (text === 'null' || text === '') return null;\n if (/^-?(0|[1-9][0-9]*)(\\.[0-9]+)?([eE][+-]?[0-9]+)?$/.test(text)) return Number(text);\n return text;\n}\n\nfunction parseQuoted(c: Ctx): YamlScalar {\n const quote = peek(c);\n const start = c.i;\n c.i += 1;\n let out = '';\n while (c.i < c.end) {\n const ch = peek(c);\n if (ch === quote) {\n c.i += 1;\n return scalar(out, start, c.i);\n }\n if (ch === '\\n' || ch === '\\r') throw new YamlError(c.i);\n if (quote === \"'\" && ch === \"'\" && c.text[c.i + 1] === \"'\") {\n out += \"'\";\n c.i += 2;\n continue;\n }\n if (quote === '\"' && ch === '\\\\') {\n c.i += 1;\n const escaped = peek(c);\n if (escaped === 'n') out += '\\n';\n else if (escaped === 't') out += '\\t';\n else if (escaped === '\"') out += '\"';\n else if (escaped === '\\\\') out += '\\\\';\n else throw new YamlError(c.i);\n c.i += 1;\n continue;\n }\n out += ch;\n c.i += 1;\n }\n throw new YamlError(c.i);\n}\n\nfunction parsePlain(c: Ctx, flow: boolean): YamlScalar {\n const start = c.i;\n while (c.i < c.end) {\n const ch = peek(c);\n if (flow && (ch === ',' || ch === ']' || ch === '}')) break;\n if (ch === '\\n' || ch === '\\r') break;\n if (ch === '#' && (c.i === start || c.text[c.i - 1] === ' ' || c.text[c.i - 1] === '\\t')) break;\n c.i += 1;\n }\n if (c.i === start) throw new YamlError(c.i);\n const raw = c.text.slice(start, c.i);\n const trimmed = raw.trimEnd();\n return scalar(interpretPlain(trimmed), start, start + trimmed.length);\n}\n\nfunction parseScalar(c: Ctx, flow: boolean): YamlScalar {\n const ch = peek(c);\n if (ch === '\"' || ch === \"'\") return parseQuoted(c);\n return parsePlain(c, flow);\n}\n\nfunction parseKey(c: Ctx): { name: string; start: number; end: number } {\n const start = c.i;\n if (peek(c) === '\"' || peek(c) === \"'\") {\n const quoted = parseQuoted(c);\n if (typeof quoted.value !== 'string') throw new YamlError(start);\n return { name: quoted.value, start, end: c.i };\n }\n let end = c.i;\n while (c.i < c.end) {\n const ch = peek(c);\n if (\n ch === ':' ||\n ch === '\\n' ||\n ch === '\\r' ||\n ch === ',' ||\n ch === '}' ||\n ch === ']' ||\n ch === '#' ||\n ch === '{' ||\n ch === '['\n ) {\n break;\n }\n c.i += 1;\n if (ch !== ' ' && ch !== '\\t') end = c.i;\n }\n if (end === start) throw new YamlError(c.i);\n c.i = end;\n return { name: c.text.slice(start, end), start, end };\n}\n\nfunction parseFlowValue(c: Ctx): YamlNode {\n skipFlowSpace(c);\n const ch = peek(c);\n if (ch === '{') return parseFlowMap(c);\n if (ch === '[') return parseFlowSeq(c);\n if (ch === '|' || ch === '>') throw new YamlError(c.i);\n return parseScalar(c, true);\n}\n\nfunction parseFlowMap(c: Ctx): YamlMap {\n const start = c.i;\n if (peek(c) !== '{') throw new YamlError(c.i);\n c.i += 1;\n skipFlowSpace(c);\n const entries: YamlEntry[] = [];\n const seen = new Set<string>();\n if (peek(c) === '}') {\n c.i += 1;\n return { kind: 'map', entries, start, end: c.i };\n }\n while (c.i < c.end) {\n skipFlowSpace(c);\n const key = parseKey(c);\n skipFlowSpace(c);\n if (peek(c) !== ':') throw new YamlError(c.i);\n c.i += 1;\n const value = parseFlowValue(c);\n if (seen.has(key.name)) throw new YamlError(key.start);\n seen.add(key.name);\n entries.push({ key: key.name, keyStart: key.start, keyEnd: key.end, value });\n skipFlowSpace(c);\n if (peek(c) === ',') {\n c.i += 1;\n continue;\n }\n if (peek(c) === '}') {\n c.i += 1;\n return { kind: 'map', entries, start, end: c.i };\n }\n throw new YamlError(c.i);\n }\n throw new YamlError(c.i);\n}\n\nfunction parseFlowSeq(c: Ctx): YamlSeq {\n const start = c.i;\n if (peek(c) !== '[') throw new YamlError(c.i);\n c.i += 1;\n skipFlowSpace(c);\n const items: YamlNode[] = [];\n if (peek(c) === ']') {\n c.i += 1;\n return { kind: 'seq', items, start, end: c.i };\n }\n while (c.i < c.end) {\n items.push(parseFlowValue(c));\n skipFlowSpace(c);\n if (peek(c) === ',') {\n c.i += 1;\n skipFlowSpace(c);\n continue;\n }\n if (peek(c) === ']') {\n c.i += 1;\n return { kind: 'seq', items, start, end: c.i };\n }\n throw new YamlError(c.i);\n }\n throw new YamlError(c.i);\n}\n\nfunction parseValue(c: Ctx, parentKeyIndent: number): YamlNode {\n skipSpaces(c);\n if (peek(c) === '#') skipToEol(c);\n const ch = peek(c);\n if (ch === '' || ch === '\\n' || ch === '\\r') {\n skipEol(c);\n skipBlankAndComments(c);\n if (c.i >= c.end) return scalar(null, c.i, c.i);\n const nextIndent = indentAt(c);\n if (nextIndent <= parentKeyIndent) return scalar(null, c.i, c.i);\n if (peek(c) === '-') return parseBlockSeq(c, nextIndent);\n if (peek(c) === '[') return parseFlowSeq(c);\n if (peek(c) === '{') return parseFlowMap(c);\n return parseBlockMap(c, nextIndent);\n }\n if (ch === '{') return parseFlowMap(c);\n if (ch === '[') return parseFlowSeq(c);\n if (ch === '|' || ch === '>') throw new YamlError(c.i);\n return parseScalar(c, false);\n}\n\nfunction parseBlockSeq(c: Ctx, indent: number): YamlSeq {\n const start = c.i;\n const items: YamlNode[] = [];\n let end = start;\n while (c.i < c.end) {\n skipBlankAndComments(c);\n if (c.i >= c.end) break;\n if (indentAt(c) !== indent) break;\n if (peek(c) !== '-') break;\n c.i += 1;\n items.push(parseValue(c, indent));\n end = c.i;\n }\n return { kind: 'seq', items, start, end };\n}\n\nfunction parseBlockMap(c: Ctx, indent: number): YamlMap {\n const start = c.i;\n const entries: YamlEntry[] = [];\n const seen = new Set<string>();\n let end = start;\n while (c.i < c.end) {\n skipBlankAndComments(c);\n if (c.i >= c.end) break;\n if (indentAt(c) < indent) break;\n if (indentAt(c) > indent) throw new YamlError(c.i);\n const key = parseKey(c);\n skipSpaces(c);\n if (peek(c) !== ':') throw new YamlError(c.i);\n c.i += 1;\n const value = parseValue(c, indent);\n if (seen.has(key.name)) throw new YamlError(key.start);\n seen.add(key.name);\n entries.push({ key: key.name, keyStart: key.start, keyEnd: key.end, value });\n end = c.i;\n }\n return { kind: 'map', entries, start, end };\n}\n\nexport function parseYamlMapping(text: string, start: number, end: number): YamlMap {\n const c: Ctx = { text, i: start, end };\n skipBlankAndComments(c);\n if (c.i >= end) return { kind: 'map', entries: [], start, end };\n if (peek(c) === '{') {\n const mapped = parseFlowMap(c);\n skipBlankAndComments(c);\n if (c.i < end) throw new YamlError(c.i);\n return mapped;\n }\n const mapped = parseBlockMap(c, indentAt(c));\n skipBlankAndComments(c);\n if (c.i < end) throw new YamlError(c.i);\n return mapped;\n}\n\nexport function jsValue(node: YamlNode): unknown {\n if (node.kind === 'scalar') return node.value;\n if (node.kind === 'seq') return node.items.map(jsValue);\n const record: Record<string, unknown> = Object.create(null);\n for (const entry of node.entries) record[entry.key] = jsValue(entry.value);\n return record;\n}\n\nexport function mapEntry(map: YamlMap, key: string): YamlEntry | undefined {\n return map.entries.find((entry) => entry.key === key);\n}\n\nexport function isPlainSafe(text: string): boolean {\n if (text === '' || text === 'true' || text === 'false' || text === 'null') return false;\n if (/[\\s#:{}[\\],&*!|>'\"%@`]/.test(text)) return false;\n if (text.startsWith('-') || text.startsWith('?') || text.startsWith(':')) return false;\n if (/^-?(0|[1-9][0-9]*)(\\.[0-9]+)?([eE][+-]?[0-9]+)?$/.test(text)) return false;\n return true;\n}\n\nexport function serializeJs(value: unknown): string {\n if (value === null) return 'null';\n if (value === true) return 'true';\n if (value === false) return 'false';\n if (typeof value === 'number' && Number.isFinite(value)) return JSON.stringify(value);\n if (typeof value === 'string') return isPlainSafe(value) ? value : JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(serializeJs).join(', ')}]`;\n throw new YamlError(0);\n}\n\nexport function serializeKey(name: string): string {\n return isPlainSafe(name) || /^[A-Za-z][A-Za-z0-9_-]*$/.test(name) ? name : JSON.stringify(name);\n}\n\nexport function bodyStartAfterYaml(content: string, yamlEnd: number): number {\n const closeLine = content.indexOf('\\n', yamlEnd);\n return closeLine === -1 ? content.length : closeLine + 1;\n}\n\nexport function bodyStartOf(content: string): number {\n const fence = extractFrontmatter(content);\n return fence.kind === 'ok' ? bodyStartAfterYaml(content, fence.yamlEnd) : 0;\n}\n\nexport function bodyAfterFrontmatter(content: string): string {\n return content.slice(bodyStartOf(content));\n}\n\nexport function extractFrontmatter(\n content: string,\n): { kind: 'none' } | { kind: 'unclosed' } | { kind: 'ok'; yamlStart: number; yamlEnd: number } {\n if (!content.startsWith('---')) return { kind: 'none' };\n const firstNl = content.indexOf('\\n');\n const firstLine =\n firstNl === -1\n ? content\n : content.slice(0, content[firstNl - 1] === '\\r' ? firstNl - 1 : firstNl);\n if (!/^---[ \\t]*$/.test(firstLine)) return { kind: 'none' };\n if (firstNl === -1) return { kind: 'unclosed' };\n const yamlStart = firstNl + 1;\n let i = yamlStart;\n while (i <= content.length) {\n const nl = content.indexOf('\\n', i);\n const lineEnd = nl === -1 ? content.length : nl;\n let line = content.slice(i, lineEnd);\n if (line.endsWith('\\r')) line = line.slice(0, -1);\n if (/^---[ \\t]*$/.test(line)) return { kind: 'ok', yamlStart, yamlEnd: i };\n if (nl === -1) return { kind: 'unclosed' };\n i = nl + 1;\n }\n return { kind: 'unclosed' };\n}\n\nexport function equalValue(left: unknown, right: unknown): boolean {\n if (left === right) return true;\n if (Array.isArray(left) && Array.isArray(right)) {\n return (\n left.length === right.length && left.every((item, index) => equalValue(item, right[index]))\n );\n }\n return false;\n}\n\nexport function lineEnding(content: string): '\\n' | '\\r\\n' {\n return content.includes('\\r\\n') ? '\\r\\n' : '\\n';\n}\n"],"names":["YamlError","Error","offset","name","peek","c","i","end","text","skipEol","skipSpaces","skipToEol","skipBlankAndComments","skipFlowSpace","ch","indentAt","j","n","scalar","value","start","kind","interpretPlain","test","Number","parseQuoted","quote","out","escaped","parsePlain","flow","raw","slice","trimmed","trimEnd","length","parseScalar","parseKey","quoted","parseFlowValue","parseFlowMap","parseFlowSeq","entries","seen","Set","key","has","add","push","keyStart","keyEnd","items","parseValue","parentKeyIndent","nextIndent","parseBlockSeq","parseBlockMap","indent","parseYamlMapping","mapped","jsValue","node","map","record","Object","create","entry","mapEntry","find","isPlainSafe","startsWith","serializeJs","isFinite","JSON","stringify","Array","isArray","join","serializeKey","bodyStartAfterYaml","content","yamlEnd","closeLine","indexOf","bodyStartOf","fence","extractFrontmatter","bodyAfterFrontmatter","firstNl","firstLine","yamlStart","nl","lineEnd","line","endsWith","equalValue","left","right","every","item","index","lineEnding","includes"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdmodel/src/yaml.ts"],"sourcesContent":["export class YamlError extends Error {\n constructor(readonly offset: number) {\n super('yaml');\n this.name = 'YamlError';\n }\n}\n\nexport type YamlScalar = {\n readonly kind: 'scalar';\n readonly value: string | number | boolean | null;\n readonly start: number;\n readonly end: number;\n};\n\nexport type YamlSeq = {\n readonly kind: 'seq';\n readonly items: readonly YamlNode[];\n readonly start: number;\n readonly end: number;\n};\n\nexport type YamlEntry = {\n readonly key: string;\n readonly keyStart: number;\n readonly keyEnd: number;\n readonly value: YamlNode;\n};\n\nexport type YamlMap = {\n readonly kind: 'map';\n readonly entries: readonly YamlEntry[];\n readonly start: number;\n readonly end: number;\n};\n\nexport type YamlNode = YamlScalar | YamlSeq | YamlMap;\n\ntype Ctx = { text: string; i: number; end: number };\n\nfunction peek(c: Ctx): string {\n return c.i < c.end ? c.text[c.i]! : '';\n}\n\nfunction skipEol(c: Ctx): void {\n if (peek(c) === '\\r') c.i += 1;\n if (peek(c) === '\\n') c.i += 1;\n}\n\nfunction skipSpaces(c: Ctx): void {\n while (peek(c) === ' ') c.i += 1;\n if (peek(c) === '\\t') throw new YamlError(c.i);\n}\n\nfunction skipToEol(c: Ctx): void {\n while (c.i < c.end && peek(c) !== '\\n' && peek(c) !== '\\r') c.i += 1;\n}\n\nfunction skipBlankAndComments(c: Ctx): void {\n while (c.i < c.end) {\n skipSpaces(c);\n if (peek(c) === '#') skipToEol(c);\n if (peek(c) === '\\r' || peek(c) === '\\n') {\n skipEol(c);\n continue;\n }\n break;\n }\n}\n\nfunction skipFlowSpace(c: Ctx): void {\n while (c.i < c.end) {\n const ch = peek(c);\n if (ch === ' ' || ch === '\\n' || ch === '\\r') {\n c.i += 1;\n continue;\n }\n if (ch === '#') {\n skipToEol(c);\n continue;\n }\n if (ch === '\\t') throw new YamlError(c.i);\n break;\n }\n}\n\nfunction indentAt(c: Ctx): number {\n let j = c.i;\n while (j > 0 && c.text[j - 1] !== '\\n' && c.text[j - 1] !== '\\r') j -= 1;\n let n = 0;\n while (j < c.i) {\n const ch = c.text[j]!;\n if (ch === ' ') n += 1;\n else if (ch === '\\t') throw new YamlError(j);\n else break;\n j += 1;\n }\n return n;\n}\n\nfunction scalar(value: string | number | boolean | null, start: number, end: number): YamlScalar {\n return { kind: 'scalar', value, start, end };\n}\n\nfunction interpretPlain(text: string): string | number | boolean | null {\n if (text === 'true') return true;\n if (text === 'false') return false;\n if (text === 'null' || text === '') return null;\n if (/^-?(0|[1-9][0-9]*)(\\.[0-9]+)?([eE][+-]?[0-9]+)?$/.test(text)) return Number(text);\n return text;\n}\n\nfunction parseQuoted(c: Ctx): YamlScalar {\n const quote = peek(c);\n const start = c.i;\n c.i += 1;\n let out = '';\n while (c.i < c.end) {\n const ch = peek(c);\n if (ch === quote) {\n c.i += 1;\n return scalar(out, start, c.i);\n }\n if (ch === '\\n' || ch === '\\r') throw new YamlError(c.i);\n if (quote === \"'\" && ch === \"'\" && c.text[c.i + 1] === \"'\") {\n out += \"'\";\n c.i += 2;\n continue;\n }\n if (quote === '\"' && ch === '\\\\') {\n c.i += 1;\n const escaped = peek(c);\n if (escaped === 'n') out += '\\n';\n else if (escaped === 't') out += '\\t';\n else if (escaped === '\"') out += '\"';\n else if (escaped === '\\\\') out += '\\\\';\n else throw new YamlError(c.i);\n c.i += 1;\n continue;\n }\n out += ch;\n c.i += 1;\n }\n throw new YamlError(c.i);\n}\n\nfunction parsePlain(c: Ctx, flow: boolean): YamlScalar {\n const start = c.i;\n while (c.i < c.end) {\n const ch = peek(c);\n if (flow && (ch === ',' || ch === ']' || ch === '}')) break;\n if (ch === '\\n' || ch === '\\r') break;\n if (ch === '#' && (c.i === start || c.text[c.i - 1] === ' ' || c.text[c.i - 1] === '\\t')) break;\n c.i += 1;\n }\n if (c.i === start) throw new YamlError(c.i);\n const raw = c.text.slice(start, c.i);\n const trimmed = raw.trimEnd();\n return scalar(interpretPlain(trimmed), start, start + trimmed.length);\n}\n\nfunction parseScalar(c: Ctx, flow: boolean): YamlScalar {\n const ch = peek(c);\n if (ch === '\"' || ch === \"'\") return parseQuoted(c);\n return parsePlain(c, flow);\n}\n\nfunction parseKey(c: Ctx): { name: string; start: number; end: number } {\n const start = c.i;\n if (peek(c) === '\"' || peek(c) === \"'\") {\n const quoted = parseQuoted(c);\n if (typeof quoted.value !== 'string') throw new YamlError(start);\n return { name: quoted.value, start, end: c.i };\n }\n let end = c.i;\n while (c.i < c.end) {\n const ch = peek(c);\n if (\n ch === ':' ||\n ch === '\\n' ||\n ch === '\\r' ||\n ch === ',' ||\n ch === '}' ||\n ch === ']' ||\n ch === '#' ||\n ch === '{' ||\n ch === '['\n ) {\n break;\n }\n c.i += 1;\n if (ch !== ' ' && ch !== '\\t') end = c.i;\n }\n if (end === start) throw new YamlError(c.i);\n c.i = end;\n return { name: c.text.slice(start, end), start, end };\n}\n\nfunction parseFlowValue(c: Ctx): YamlNode {\n skipFlowSpace(c);\n const ch = peek(c);\n if (ch === '{') return parseFlowMap(c);\n if (ch === '[') return parseFlowSeq(c);\n if (ch === '|' || ch === '>') throw new YamlError(c.i);\n return parseScalar(c, true);\n}\n\nfunction parseFlowMap(c: Ctx): YamlMap {\n const start = c.i;\n if (peek(c) !== '{') throw new YamlError(c.i);\n c.i += 1;\n skipFlowSpace(c);\n const entries: YamlEntry[] = [];\n const seen = new Set<string>();\n if (peek(c) === '}') {\n c.i += 1;\n return { kind: 'map', entries, start, end: c.i };\n }\n while (c.i < c.end) {\n skipFlowSpace(c);\n const key = parseKey(c);\n skipFlowSpace(c);\n if (peek(c) !== ':') throw new YamlError(c.i);\n c.i += 1;\n const value = parseFlowValue(c);\n if (seen.has(key.name)) throw new YamlError(key.start);\n seen.add(key.name);\n entries.push({ key: key.name, keyStart: key.start, keyEnd: key.end, value });\n skipFlowSpace(c);\n if (peek(c) === ',') {\n c.i += 1;\n continue;\n }\n if (peek(c) === '}') {\n c.i += 1;\n return { kind: 'map', entries, start, end: c.i };\n }\n throw new YamlError(c.i);\n }\n throw new YamlError(c.i);\n}\n\nfunction parseFlowSeq(c: Ctx): YamlSeq {\n const start = c.i;\n if (peek(c) !== '[') throw new YamlError(c.i);\n c.i += 1;\n skipFlowSpace(c);\n const items: YamlNode[] = [];\n if (peek(c) === ']') {\n c.i += 1;\n return { kind: 'seq', items, start, end: c.i };\n }\n while (c.i < c.end) {\n items.push(parseFlowValue(c));\n skipFlowSpace(c);\n if (peek(c) === ',') {\n c.i += 1;\n skipFlowSpace(c);\n continue;\n }\n if (peek(c) === ']') {\n c.i += 1;\n return { kind: 'seq', items, start, end: c.i };\n }\n throw new YamlError(c.i);\n }\n throw new YamlError(c.i);\n}\n\nfunction parseValue(c: Ctx, parentKeyIndent: number): YamlNode {\n skipSpaces(c);\n if (peek(c) === '#') skipToEol(c);\n const ch = peek(c);\n if (ch === '' || ch === '\\n' || ch === '\\r') {\n skipEol(c);\n skipBlankAndComments(c);\n if (c.i >= c.end) return scalar(null, c.i, c.i);\n const nextIndent = indentAt(c);\n if (nextIndent <= parentKeyIndent) return scalar(null, c.i, c.i);\n if (peek(c) === '-') return parseBlockSeq(c, nextIndent);\n if (peek(c) === '[') return parseFlowSeq(c);\n if (peek(c) === '{') return parseFlowMap(c);\n return parseBlockMap(c, nextIndent);\n }\n if (ch === '{') return parseFlowMap(c);\n if (ch === '[') return parseFlowSeq(c);\n if (ch === '|' || ch === '>') throw new YamlError(c.i);\n return parseScalar(c, false);\n}\n\nfunction parseBlockSeq(c: Ctx, indent: number): YamlSeq {\n const start = c.i;\n const items: YamlNode[] = [];\n let end = start;\n while (c.i < c.end) {\n skipBlankAndComments(c);\n if (c.i >= c.end) break;\n if (indentAt(c) !== indent) break;\n if (peek(c) !== '-') break;\n c.i += 1;\n items.push(parseValue(c, indent));\n end = c.i;\n }\n return { kind: 'seq', items, start, end };\n}\n\nfunction parseBlockMap(c: Ctx, indent: number): YamlMap {\n const start = c.i;\n const entries: YamlEntry[] = [];\n const seen = new Set<string>();\n let end = start;\n while (c.i < c.end) {\n skipBlankAndComments(c);\n if (c.i >= c.end) break;\n if (indentAt(c) < indent) break;\n if (indentAt(c) > indent) throw new YamlError(c.i);\n const key = parseKey(c);\n skipSpaces(c);\n if (peek(c) !== ':') throw new YamlError(c.i);\n c.i += 1;\n const value = parseValue(c, indent);\n if (seen.has(key.name)) throw new YamlError(key.start);\n seen.add(key.name);\n entries.push({ key: key.name, keyStart: key.start, keyEnd: key.end, value });\n end = c.i;\n }\n return { kind: 'map', entries, start, end };\n}\n\nexport function parseYamlMapping(text: string, start: number, end: number): YamlMap {\n const c: Ctx = { text, i: start, end };\n skipBlankAndComments(c);\n if (c.i >= end) return { kind: 'map', entries: [], start, end };\n if (peek(c) === '{') {\n const mapped = parseFlowMap(c);\n skipBlankAndComments(c);\n if (c.i < end) throw new YamlError(c.i);\n return mapped;\n }\n const mapped = parseBlockMap(c, indentAt(c));\n skipBlankAndComments(c);\n if (c.i < end) throw new YamlError(c.i);\n return mapped;\n}\n\nexport function jsValue(node: YamlNode): unknown {\n if (node.kind === 'scalar') return node.value;\n if (node.kind === 'seq') return node.items.map(jsValue);\n const record: Record<string, unknown> = Object.create(null);\n for (const entry of node.entries) record[entry.key] = jsValue(entry.value);\n return record;\n}\n\nexport function mapEntry(map: YamlMap, key: string): YamlEntry | undefined {\n return map.entries.find((entry) => entry.key === key);\n}\n\nexport function isPlainSafe(text: string): boolean {\n if (text === '' || text === 'true' || text === 'false' || text === 'null') return false;\n if (/[\\s#:{}[\\],&*!|>'\"%@`]/.test(text)) return false;\n if (text.startsWith('-') || text.startsWith('?') || text.startsWith(':')) return false;\n if (/^-?(0|[1-9][0-9]*)(\\.[0-9]+)?([eE][+-]?[0-9]+)?$/.test(text)) return false;\n return true;\n}\n\nexport function serializeJs(value: unknown): string {\n if (value === null) return 'null';\n if (value === true) return 'true';\n if (value === false) return 'false';\n if (typeof value === 'number' && Number.isFinite(value)) return JSON.stringify(value);\n if (typeof value === 'string') return isPlainSafe(value) ? value : JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(serializeJs).join(', ')}]`;\n throw new YamlError(0);\n}\n\nexport function serializeKey(name: string): string {\n return isPlainSafe(name) || /^[A-Za-z][A-Za-z0-9_-]*$/.test(name) ? name : JSON.stringify(name);\n}\n\nexport function bodyStartAfterYaml(content: string, yamlEnd: number): number {\n const closeLine = content.indexOf('\\n', yamlEnd);\n return closeLine === -1 ? content.length : closeLine + 1;\n}\n\nexport function bodyStartOf(content: string): number {\n const fence = extractFrontmatter(content);\n return fence.kind === 'ok' ? bodyStartAfterYaml(content, fence.yamlEnd) : 0;\n}\n\nexport function bodyAfterFrontmatter(content: string): string {\n return content.slice(bodyStartOf(content));\n}\n\nexport function extractFrontmatter(\n content: string,\n): { kind: 'none' } | { kind: 'unclosed' } | { kind: 'ok'; yamlStart: number; yamlEnd: number } {\n if (!content.startsWith('---')) return { kind: 'none' };\n const firstNl = content.indexOf('\\n');\n const firstLine =\n firstNl === -1\n ? content\n : content.slice(0, content[firstNl - 1] === '\\r' ? firstNl - 1 : firstNl);\n if (!/^---[ \\t]*$/.test(firstLine)) return { kind: 'none' };\n if (firstNl === -1) return { kind: 'unclosed' };\n const yamlStart = firstNl + 1;\n let i = yamlStart;\n while (i <= content.length) {\n const nl = content.indexOf('\\n', i);\n const lineEnd = nl === -1 ? content.length : nl;\n let line = content.slice(i, lineEnd);\n if (line.endsWith('\\r')) line = line.slice(0, -1);\n if (/^---[ \\t]*$/.test(line)) return { kind: 'ok', yamlStart, yamlEnd: i };\n if (nl === -1) return { kind: 'unclosed' };\n i = nl + 1;\n }\n return { kind: 'unclosed' };\n}\n\nexport function equalValue(left: unknown, right: unknown): boolean {\n if (left === right) return true;\n if (Array.isArray(left) && Array.isArray(right)) {\n return (\n left.length === right.length && left.every((item, index) => equalValue(item, right[index]))\n );\n }\n return false;\n}\n\nexport function lineEnding(content: string): '\\n' | '\\r\\n' {\n return content.includes('\\r\\n') ? '\\r\\n' : '\\n';\n}\n"],"names":["YamlError","Error","offset","name","peek","c","i","end","text","skipEol","skipSpaces","skipToEol","skipBlankAndComments","skipFlowSpace","ch","indentAt","j","n","scalar","value","start","kind","interpretPlain","test","Number","parseQuoted","quote","out","escaped","parsePlain","flow","raw","slice","trimmed","trimEnd","length","parseScalar","parseKey","quoted","parseFlowValue","parseFlowMap","parseFlowSeq","entries","seen","Set","key","has","add","push","keyStart","keyEnd","items","parseValue","parentKeyIndent","nextIndent","parseBlockSeq","parseBlockMap","indent","parseYamlMapping","mapped","jsValue","node","map","record","Object","create","entry","mapEntry","find","isPlainSafe","startsWith","serializeJs","isFinite","JSON","stringify","Array","isArray","join","serializeKey","bodyStartAfterYaml","content","yamlEnd","closeLine","indexOf","bodyStartOf","fence","extractFrontmatter","bodyAfterFrontmatter","firstNl","firstLine","yamlStart","nl","lineEnd","line","endsWith","equalValue","left","right","every","item","index","lineEnding","includes"],"mappings":"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"}