@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.
- package/API.md +44 -33
- package/README.md +2 -4
- package/dist/definition.d.ts +7 -3
- package/dist/definition.d.ts.map +1 -1
- package/dist/definition.js +83 -38
- package/dist/definition.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/paths.d.ts +0 -2
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +0 -7
- package/dist/paths.js.map +1 -1
- package/dist/project.d.ts.map +1 -1
- package/dist/project.js +3 -15
- package/dist/project.js.map +1 -1
- package/dist/types.d.ts +6 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/validate.d.ts +2 -3
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +42 -86
- package/dist/validate.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/yaml.js +1 -1
- package/dist/yaml.js.map +1 -1
- package/fixtures/README.md +45 -44
- package/fixtures/cases/binary-any-reference/schema.yaml +4 -0
- package/fixtures/cases/binary-document-collision/schema.yaml +2 -0
- package/fixtures/cases/binary-link-outside-collection/schema.yaml +2 -0
- package/fixtures/cases/binary-prototype-reference/schema.yaml +4 -0
- package/fixtures/cases/binary-typed-reference/schema.yaml +5 -0
- package/fixtures/cases/bracketed-link-definition/schema.yaml +6 -0
- package/fixtures/cases/declared-binary-links/schema.yaml +2 -0
- package/fixtures/cases/duplicate-link-definition/schema.yaml +6 -0
- package/fixtures/cases/fenced-link-definition/schema.yaml +6 -0
- package/fixtures/cases/field-enum/schema.yaml +7 -0
- package/fixtures/cases/frontmatter-schema/expected.json +6 -0
- package/fixtures/cases/frontmatter-schema/schema.yaml +6 -0
- package/fixtures/cases/interrupted-link-definition/schema.yaml +2 -0
- package/fixtures/cases/long-fence-link-definition/schema.yaml +2 -0
- package/fixtures/cases/malformed-definition/expected.json +1 -2
- package/fixtures/cases/malformed-definition/schema.yaml +4 -0
- package/fixtures/cases/member-document/context.json +1 -0
- package/fixtures/cases/member-document/library/people/ana.md +5 -0
- package/fixtures/cases/member-document/schema.yaml +5 -0
- package/fixtures/cases/missing-binary-image/schema.yaml +2 -0
- package/fixtures/cases/missing-binary-link/schema.yaml +2 -0
- package/fixtures/cases/missing-required-field/schema.yaml +7 -0
- package/fixtures/cases/missing-section-item-kind/expected.json +1 -2
- package/fixtures/cases/missing-section-item-kind/schema.yaml +6 -0
- package/fixtures/cases/paragraph-link-definition/schema.yaml +2 -0
- package/fixtures/cases/prototype-field/schema.yaml +6 -0
- package/fixtures/cases/quoted-link-definition/schema.yaml +2 -0
- package/fixtures/cases/referenced-missing-file/schema.yaml +10 -0
- package/fixtures/cases/second-member-document/context.json +1 -0
- package/fixtures/cases/second-member-document/expected.json +6 -0
- package/fixtures/cases/second-member-document/schema.yaml +5 -0
- package/fixtures/cases/structured-section/schema.yaml +7 -0
- package/fixtures/cases/submission-keys/schema.yaml +4 -0
- package/fixtures/cases/truncated-link-definition/schema.yaml +2 -0
- package/fixtures/cases/types-folder-content/schema.yaml +4 -0
- package/fixtures/cases/undeclared-field/schema.yaml +6 -0
- package/fixtures/cases/unknown-type/expected.json +7 -0
- package/fixtures/cases/unknown-type/schema.yaml +4 -0
- package/fixtures/cases/unlisted-reference-type/context.json +1 -0
- package/fixtures/cases/unlisted-reference-type/expected.json +6 -0
- package/fixtures/cases/unlisted-reference-type/schema.yaml +4 -0
- package/fixtures/cases/unresolved-link/schema.yaml +6 -0
- package/fixtures/cases/valid-typed-document/schema.yaml +15 -0
- package/fixtures/cases/wide-item-fence-link/schema.yaml +2 -0
- package/fixtures/division.json +1 -21
- package/fixtures/projection.json +1 -24
- package/package.json +1 -1
- package/fixtures/cases/binary-any-reference/library/types/note.md +0 -5
- package/fixtures/cases/binary-document-collision/library/types/note.md +0 -3
- package/fixtures/cases/binary-link-outside-collection/library/types/note.md +0 -3
- package/fixtures/cases/binary-prototype-reference/library/types/note.md +0 -5
- package/fixtures/cases/binary-typed-reference/library/types/note.md +0 -5
- package/fixtures/cases/binary-typed-reference/library/types/person.md +0 -3
- package/fixtures/cases/bracketed-link-definition/library/types/task.md +0 -7
- package/fixtures/cases/declared-binary-links/library/types/note.md +0 -3
- package/fixtures/cases/duplicate-link-definition/library/types/task.md +0 -7
- package/fixtures/cases/external-invalid-model/definitions/schema/task.md +0 -5
- package/fixtures/cases/external-invalid-model/expected.json +0 -1
- package/fixtures/cases/external-invalid-model/library/note.md +0 -1
- package/fixtures/cases/external-unknown-type/definitions/schema/task.md +0 -5
- package/fixtures/cases/external-unknown-type/expected.json +0 -1
- package/fixtures/cases/external-valid/context.json +0 -1
- package/fixtures/cases/external-valid/definitions/types/task.md +0 -5
- package/fixtures/cases/fenced-link-definition/library/types/task.md +0 -7
- package/fixtures/cases/field-enum/library/types/task.md +0 -8
- package/fixtures/cases/interrupted-link-definition/library/types/note.md +0 -3
- package/fixtures/cases/long-fence-link-definition/library/types/note.md +0 -3
- package/fixtures/cases/malformed-definition/library/types/task.md +0 -5
- package/fixtures/cases/missing-binary-image/library/types/note.md +0 -3
- package/fixtures/cases/missing-binary-link/library/types/note.md +0 -3
- package/fixtures/cases/missing-required-field/library/types/task.md +0 -8
- package/fixtures/cases/missing-section-item-kind/library/types/task.md +0 -7
- package/fixtures/cases/paragraph-link-definition/library/types/note.md +0 -3
- package/fixtures/cases/prd-definition/library/types/task.md +0 -16
- package/fixtures/cases/prototype-field/library/types/task.md +0 -7
- package/fixtures/cases/quoted-link-definition/library/types/note.md +0 -3
- package/fixtures/cases/referenced-missing-file/library/types/person.md +0 -5
- package/fixtures/cases/referenced-missing-file/library/types/task.md +0 -8
- package/fixtures/cases/structured-section/library/types/task.md +0 -8
- package/fixtures/cases/submission-keys/library/types/note.md +0 -5
- package/fixtures/cases/truncated-link-definition/library/types/note.md +0 -3
- package/fixtures/cases/undeclared-field/library/types/task.md +0 -7
- package/fixtures/cases/unresolved-link/library/types/task.md +0 -7
- package/fixtures/cases/valid-typed-document/library/types/person.md +0 -5
- package/fixtures/cases/valid-typed-document/library/types/task.md +0 -13
- package/fixtures/cases/wide-item-fence-link/library/types/note.md +0 -3
- /package/fixtures/cases/{prd-definition → frontmatter-schema}/context.json +0 -0
- /package/fixtures/cases/{prd-definition → member-document}/expected.json +0 -0
- /package/fixtures/cases/{external-invalid-model → types-folder-content}/context.json +0 -0
- /package/fixtures/cases/{external-valid → types-folder-content}/expected.json +0 -0
- /package/fixtures/cases/{external-valid → types-folder-content}/library/types/task.md +0 -0
- /package/fixtures/cases/{external-unknown-type → unknown-type}/context.json +0 -0
- /package/fixtures/cases/{external-unknown-type → unknown-type}/library/item.md +0 -0
package/dist/project.js.map
CHANGED
|
@@ -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
|
|
12
|
-
|
|
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?:
|
|
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;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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
|
|
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 |
|
|
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"}
|
package/dist/validate.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare function verify(
|
|
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
|
package/dist/validate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,
|
|
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 {
|
|
1
|
+
import { readSchema } from './definition.js';
|
|
2
2
|
import { parse } from './document.js';
|
|
3
3
|
import { hrefOccurrences } from './links.js';
|
|
4
|
-
import { classifyHref
|
|
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
|
|
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
|
|
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(
|
|
42
|
-
|
|
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:
|
|
65
|
-
|
|
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
|
|
70
|
-
if (!
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
92
|
-
|
|
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
|
|
89
|
+
const kind = instanceType(parsed.document);
|
|
129
90
|
if (kind === 'any') continue;
|
|
130
|
-
|
|
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
|
|
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
|
|
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) && !
|
|
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
|
|
174
|
-
if (kind ===
|
|
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
|
|
207
|
-
if (kind ===
|
|
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)){
|
package/dist/validate.js.map
CHANGED
|
@@ -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.
|
|
1
|
+
export declare const VERSION = "0.1.0-alpha.17";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
package/dist/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/workspace/packages/mdmodel/src/version.ts"],"sourcesContent":["export const VERSION = '0.1.0-alpha.
|
|
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
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":"AAAA,OAAO,MAAMA,kBAAkBC;;IAC7B,YAAY,AAASC,MAAc,CAAE;QACnC,KAAK,CAAC,cADaA,SAAAA;QAEnB,IAAI,CAACC,IAAI,GAAG;IACd;AACF;AAkCA,SAASC,KAAKC,CAAM;IAClB,OAAOA,EAAEC,CAAC,GAAGD,EAAEE,GAAG,GAAGF,EAAEG,IAAI,CAACH,EAAEC,CAAC,CAAC,GAAI;AACtC;AAEA,SAASG,QAAQJ,CAAM;IACrB,IAAID,KAAKC,OAAO,MAAMA,EAAEC,CAAC,IAAI;IAC7B,IAAIF,KAAKC,OAAO,MAAMA,EAAEC,CAAC,IAAI;AAC/B;AAEA,SAASI,WAAWL,CAAM;IACxB,MAAOD,KAAKC,OAAO,IAAKA,EAAEC,CAAC,IAAI;IAC/B,IAAIF,KAAKC,OAAO,MAAM,MAAM,IAAIL,UAAUK,EAAEC,CAAC;AAC/C;AAEA,SAASK,UAAUN,CAAM;IACvB,MAAOA,EAAEC,CAAC,GAAGD,EAAEE,GAAG,IAAIH,KAAKC,OAAO,QAAQD,KAAKC,OAAO,KAAMA,EAAEC,CAAC,IAAI;AACrE;AAEA,SAASM,qBAAqBP,CAAM;IAClC,MAAOA,EAAEC,CAAC,GAAGD,EAAEE,GAAG,CAAE;QAClBG,WAAWL;QACX,IAAID,KAAKC,OAAO,KAAKM,UAAUN;QAC/B,IAAID,KAAKC,OAAO,QAAQD,KAAKC,OAAO,MAAM;YACxCI,QAAQJ;YACR;QACF;QACA;IACF;AACF;AAEA,SAASQ,cAAcR,CAAM;IAC3B,MAAOA,EAAEC,CAAC,GAAGD,EAAEE,GAAG,CAAE;QAClB,MAAMO,KAAKV,KAAKC;QAChB,IAAIS,OAAO,OAAOA,OAAO,QAAQA,OAAO,MAAM;YAC5CT,EAAEC,CAAC,IAAI;YACP;QACF;QACA,IAAIQ,OAAO,KAAK;YACdH,UAAUN;YACV;QACF;QACA,IAAIS,OAAO,MAAM,MAAM,IAAId,UAAUK,EAAEC,CAAC;QACxC;IACF;AACF;AAEA,SAASS,SAASV,CAAM;IACtB,IAAIW,IAAIX,EAAEC,CAAC;IACX,MAAOU,IAAI,KAAKX,EAAEG,IAAI,CAACQ,IAAI,EAAE,KAAK,KAAMA,KAAK;IAC7C,IAAIC,IAAI;IACR,MAAOD,IAAIX,EAAEC,CAAC,CAAE;QACd,MAAMQ,KAAKT,EAAEG,IAAI,CAACQ,EAAE;QACpB,IAAIF,OAAO,KAAKG,KAAK;aAChB,IAAIH,OAAO,MAAM,MAAM,IAAId,UAAUgB;aACrC;QACLA,KAAK;IACP;IACA,OAAOC;AACT;AAEA,SAASC,OAAOC,KAAuC,EAAEC,KAAa,EAAEb,GAAW;IACjF,OAAO;QAAEc,MAAM;QAAUF;QAAOC;QAAOb;IAAI;AAC7C;AAEA,SAASe,eAAed,IAAY;IAClC,IAAIA,SAAS,QAAQ,OAAO;IAC5B,IAAIA,SAAS,SAAS,OAAO;IAC7B,IAAIA,SAAS,UAAUA,SAAS,IAAI,OAAO;IAC3C,IAAI,mDAAmDe,IAAI,CAACf,OAAO,OAAOgB,OAAOhB;IACjF,OAAOA;AACT;AAEA,SAASiB,YAAYpB,CAAM;IACzB,MAAMqB,QAAQtB,KAAKC;IACnB,MAAMe,QAAQf,EAAEC,CAAC;IACjBD,EAAEC,CAAC,IAAI;IACP,IAAIqB,MAAM;IACV,MAAOtB,EAAEC,CAAC,GAAGD,EAAEE,GAAG,CAAE;QAClB,MAAMO,KAAKV,KAAKC;QAChB,IAAIS,OAAOY,OAAO;YAChBrB,EAAEC,CAAC,IAAI;YACP,OAAOY,OAAOS,KAAKP,OAAOf,EAAEC,CAAC;QAC/B;QACA,IAAIQ,OAAO,QAAQA,OAAO,MAAM,MAAM,IAAId,UAAUK,EAAEC,CAAC;QACvD,IAAIoB,UAAU,OAAOZ,OAAO,OAAOT,EAAEG,IAAI,CAACH,EAAEC,CAAC,GAAG,EAAE,KAAK,KAAK;YAC1DqB,OAAO;YACPtB,EAAEC,CAAC,IAAI;YACP;QACF;QACA,IAAIoB,UAAU,OAAOZ,OAAO,MAAM;YAChCT,EAAEC,CAAC,IAAI;YACP,MAAMsB,UAAUxB,KAAKC;YACrB,IAAIuB,YAAY,KAAKD,OAAO;iBACvB,IAAIC,YAAY,KAAKD,OAAO;iBAC5B,IAAIC,YAAY,KAAKD,OAAO;iBAC5B,IAAIC,YAAY,MAAMD,OAAO;iBAC7B,MAAM,IAAI3B,UAAUK,EAAEC,CAAC;YAC5BD,EAAEC,CAAC,IAAI;YACP;QACF;QACAqB,OAAOb;QACPT,EAAEC,CAAC,IAAI;IACT;IACA,MAAM,IAAIN,UAAUK,EAAEC,CAAC;AACzB;AAEA,SAASuB,WAAWxB,CAAM,EAAEyB,IAAa;IACvC,MAAMV,QAAQf,EAAEC,CAAC;IACjB,MAAOD,EAAEC,CAAC,GAAGD,EAAEE,GAAG,CAAE;QAClB,MAAMO,KAAKV,KAAKC;QAChB,IAAIyB,QAAShB,CAAAA,OAAO,OAAOA,OAAO,OAAOA,OAAO,GAAE,GAAI;QACtD,IAAIA,OAAO,QAAQA,OAAO,MAAM;QAChC,IAAIA,OAAO,OAAQT,CAAAA,EAAEC,CAAC,KAAKc,SAASf,EAAEG,IAAI,CAACH,EAAEC,CAAC,GAAG,EAAE,KAAK,OAAOD,EAAEG,IAAI,CAACH,EAAEC,CAAC,GAAG,EAAE,KAAK,IAAG,GAAI;QAC1FD,EAAEC,CAAC,IAAI;IACT;IACA,IAAID,EAAEC,CAAC,KAAKc,OAAO,MAAM,IAAIpB,UAAUK,EAAEC,CAAC;IAC1C,MAAMyB,MAAM1B,EAAEG,IAAI,CAACwB,KAAK,CAACZ,OAAOf,EAAEC,CAAC;IACnC,MAAM2B,UAAUF,IAAIG,OAAO;IAC3B,OAAOhB,OAAOI,eAAeW,UAAUb,OAAOA,QAAQa,QAAQE,MAAM;AACtE;AAEA,SAASC,YAAY/B,CAAM,EAAEyB,IAAa;IACxC,MAAMhB,KAAKV,KAAKC;IAChB,IAAIS,OAAO,OAAOA,OAAO,KAAK,OAAOW,YAAYpB;IACjD,OAAOwB,WAAWxB,GAAGyB;AACvB;AAEA,SAASO,SAAShC,CAAM;IACtB,MAAMe,QAAQf,EAAEC,CAAC;IACjB,IAAIF,KAAKC,OAAO,OAAOD,KAAKC,OAAO,KAAK;QACtC,MAAMiC,SAASb,YAAYpB;QAC3B,IAAI,OAAOiC,OAAOnB,KAAK,KAAK,UAAU,MAAM,IAAInB,UAAUoB;QAC1D,OAAO;YAAEjB,MAAMmC,OAAOnB,KAAK;YAAEC;YAAOb,KAAKF,EAAEC,CAAC;QAAC;IAC/C;IACA,IAAIC,MAAMF,EAAEC,CAAC;IACb,MAAOD,EAAEC,CAAC,GAAGD,EAAEE,GAAG,CAAE;QAClB,MAAMO,KAAKV,KAAKC;QAChB,IACES,OAAO,OACPA,OAAO,QACPA,OAAO,QACPA,OAAO,OACPA,OAAO,OACPA,OAAO,OACPA,OAAO,OACPA,OAAO,OACPA,OAAO,KACP;YACA;QACF;QACAT,EAAEC,CAAC,IAAI;QACP,IAAIQ,OAAO,OAAOA,OAAO,MAAMP,MAAMF,EAAEC,CAAC;IAC1C;IACA,IAAIC,QAAQa,OAAO,MAAM,IAAIpB,UAAUK,EAAEC,CAAC;IAC1CD,EAAEC,CAAC,GAAGC;IACN,OAAO;QAAEJ,MAAME,EAAEG,IAAI,CAACwB,KAAK,CAACZ,OAAOb;QAAMa;QAAOb;IAAI;AACtD;AAEA,SAASgC,eAAelC,CAAM;IAC5BQ,cAAcR;IACd,MAAMS,KAAKV,KAAKC;IAChB,IAAIS,OAAO,KAAK,OAAO0B,aAAanC;IACpC,IAAIS,OAAO,KAAK,OAAO2B,aAAapC;IACpC,IAAIS,OAAO,OAAOA,OAAO,KAAK,MAAM,IAAId,UAAUK,EAAEC,CAAC;IACrD,OAAO8B,YAAY/B,GAAG;AACxB;AAEA,SAASmC,aAAanC,CAAM;IAC1B,MAAMe,QAAQf,EAAEC,CAAC;IACjB,IAAIF,KAAKC,OAAO,KAAK,MAAM,IAAIL,UAAUK,EAAEC,CAAC;IAC5CD,EAAEC,CAAC,IAAI;IACPO,cAAcR;IACd,MAAMqC,UAAuB,EAAE;IAC/B,MAAMC,OAAO,IAAIC;IACjB,IAAIxC,KAAKC,OAAO,KAAK;QACnBA,EAAEC,CAAC,IAAI;QACP,OAAO;YAAEe,MAAM;YAAOqB;YAAStB;YAAOb,KAAKF,EAAEC,CAAC;QAAC;IACjD;IACA,MAAOD,EAAEC,CAAC,GAAGD,EAAEE,GAAG,CAAE;QAClBM,cAAcR;QACd,MAAMwC,MAAMR,SAAShC;QACrBQ,cAAcR;QACd,IAAID,KAAKC,OAAO,KAAK,MAAM,IAAIL,UAAUK,EAAEC,CAAC;QAC5CD,EAAEC,CAAC,IAAI;QACP,MAAMa,QAAQoB,eAAelC;QAC7B,IAAIsC,KAAKG,GAAG,CAACD,IAAI1C,IAAI,GAAG,MAAM,IAAIH,UAAU6C,IAAIzB,KAAK;QACrDuB,KAAKI,GAAG,CAACF,IAAI1C,IAAI;QACjBuC,QAAQM,IAAI,CAAC;YAAEH,KAAKA,IAAI1C,IAAI;YAAE8C,UAAUJ,IAAIzB,KAAK;YAAE8B,QAAQL,IAAItC,GAAG;YAAEY;QAAM;QAC1EN,cAAcR;QACd,IAAID,KAAKC,OAAO,KAAK;YACnBA,EAAEC,CAAC,IAAI;YACP;QACF;QACA,IAAIF,KAAKC,OAAO,KAAK;YACnBA,EAAEC,CAAC,IAAI;YACP,OAAO;gBAAEe,MAAM;gBAAOqB;gBAAStB;gBAAOb,KAAKF,EAAEC,CAAC;YAAC;QACjD;QACA,MAAM,IAAIN,UAAUK,EAAEC,CAAC;IACzB;IACA,MAAM,IAAIN,UAAUK,EAAEC,CAAC;AACzB;AAEA,SAASmC,aAAapC,CAAM;IAC1B,MAAMe,QAAQf,EAAEC,CAAC;IACjB,IAAIF,KAAKC,OAAO,KAAK,MAAM,IAAIL,UAAUK,EAAEC,CAAC;IAC5CD,EAAEC,CAAC,IAAI;IACPO,cAAcR;IACd,MAAM8C,QAAoB,EAAE;IAC5B,IAAI/C,KAAKC,OAAO,KAAK;QACnBA,EAAEC,CAAC,IAAI;QACP,OAAO;YAAEe,MAAM;YAAO8B;YAAO/B;YAAOb,KAAKF,EAAEC,CAAC;QAAC;IAC/C;IACA,MAAOD,EAAEC,CAAC,GAAGD,EAAEE,GAAG,CAAE;QAClB4C,MAAMH,IAAI,CAACT,eAAelC;QAC1BQ,cAAcR;QACd,IAAID,KAAKC,OAAO,KAAK;YACnBA,EAAEC,CAAC,IAAI;YACPO,cAAcR;YACd;QACF;QACA,IAAID,KAAKC,OAAO,KAAK;YACnBA,EAAEC,CAAC,IAAI;YACP,OAAO;gBAAEe,MAAM;gBAAO8B;gBAAO/B;gBAAOb,KAAKF,EAAEC,CAAC;YAAC;QAC/C;QACA,MAAM,IAAIN,UAAUK,EAAEC,CAAC;IACzB;IACA,MAAM,IAAIN,UAAUK,EAAEC,CAAC;AACzB;AAEA,SAAS8C,WAAW/C,CAAM,EAAEgD,eAAuB;IACjD3C,WAAWL;IACX,IAAID,KAAKC,OAAO,KAAKM,UAAUN;IAC/B,MAAMS,KAAKV,KAAKC;IAChB,IAAIS,OAAO,MAAMA,OAAO,QAAQA,OAAO,MAAM;QAC3CL,QAAQJ;QACRO,qBAAqBP;QACrB,IAAIA,EAAEC,CAAC,IAAID,EAAEE,GAAG,EAAE,OAAOW,OAAO,MAAMb,EAAEC,CAAC,EAAED,EAAEC,CAAC;QAC9C,MAAMgD,aAAavC,SAASV;QAC5B,IAAIiD,cAAcD,iBAAiB,OAAOnC,OAAO,MAAMb,EAAEC,CAAC,EAAED,EAAEC,CAAC;QAC/D,IAAIF,KAAKC,OAAO,KAAK,OAAOkD,cAAclD,GAAGiD;QAC7C,IAAIlD,KAAKC,OAAO,KAAK,OAAOoC,aAAapC;QACzC,IAAID,KAAKC,OAAO,KAAK,OAAOmC,aAAanC;QACzC,OAAOmD,cAAcnD,GAAGiD;IAC1B;IACA,IAAIxC,OAAO,KAAK,OAAO0B,aAAanC;IACpC,IAAIS,OAAO,KAAK,OAAO2B,aAAapC;IACpC,IAAIS,OAAO,OAAOA,OAAO,KAAK,MAAM,IAAId,UAAUK,EAAEC,CAAC;IACrD,OAAO8B,YAAY/B,GAAG;AACxB;AAEA,SAASkD,cAAclD,CAAM,EAAEoD,MAAc;IAC3C,MAAMrC,QAAQf,EAAEC,CAAC;IACjB,MAAM6C,QAAoB,EAAE;IAC5B,IAAI5C,MAAMa;IACV,MAAOf,EAAEC,CAAC,GAAGD,EAAEE,GAAG,CAAE;QAClBK,qBAAqBP;QACrB,IAAIA,EAAEC,CAAC,IAAID,EAAEE,GAAG,EAAE;QAClB,IAAIQ,SAASV,OAAOoD,QAAQ;QAC5B,IAAIrD,KAAKC,OAAO,KAAK;QACrBA,EAAEC,CAAC,IAAI;QACP6C,MAAMH,IAAI,CAACI,WAAW/C,GAAGoD;QACzBlD,MAAMF,EAAEC,CAAC;IACX;IACA,OAAO;QAAEe,MAAM;QAAO8B;QAAO/B;QAAOb;IAAI;AAC1C;AAEA,SAASiD,cAAcnD,CAAM,EAAEoD,MAAc;IAC3C,MAAMrC,QAAQf,EAAEC,CAAC;IACjB,MAAMoC,UAAuB,EAAE;IAC/B,MAAMC,OAAO,IAAIC;IACjB,IAAIrC,MAAMa;IACV,MAAOf,EAAEC,CAAC,GAAGD,EAAEE,GAAG,CAAE;QAClBK,qBAAqBP;QACrB,IAAIA,EAAEC,CAAC,IAAID,EAAEE,GAAG,EAAE;QAClB,IAAIQ,SAASV,KAAKoD,QAAQ;QAC1B,IAAI1C,SAASV,KAAKoD,QAAQ,MAAM,IAAIzD,UAAUK,EAAEC,CAAC;QACjD,MAAMuC,MAAMR,SAAShC;QACrBK,WAAWL;QACX,IAAID,KAAKC,OAAO,KAAK,MAAM,IAAIL,UAAUK,EAAEC,CAAC;QAC5CD,EAAEC,CAAC,IAAI;QACP,MAAMa,QAAQiC,WAAW/C,GAAGoD;QAC5B,IAAId,KAAKG,GAAG,CAACD,IAAI1C,IAAI,GAAG,MAAM,IAAIH,UAAU6C,IAAIzB,KAAK;QACrDuB,KAAKI,GAAG,CAACF,IAAI1C,IAAI;QACjBuC,QAAQM,IAAI,CAAC;YAAEH,KAAKA,IAAI1C,IAAI;YAAE8C,UAAUJ,IAAIzB,KAAK;YAAE8B,QAAQL,IAAItC,GAAG;YAAEY;QAAM;QAC1EZ,MAAMF,EAAEC,CAAC;IACX;IACA,OAAO;QAAEe,MAAM;QAAOqB;QAAStB;QAAOb;IAAI;AAC5C;AAEA,OAAO,SAASmD,iBAAiBlD,IAAY,EAAEY,KAAa,EAAEb,GAAW;IACvE,MAAMF,IAAS;QAAEG;QAAMF,GAAGc;QAAOb;IAAI;IACrCK,qBAAqBP;IACrB,IAAIA,EAAEC,CAAC,IAAIC,KAAK,OAAO;QAAEc,MAAM;QAAOqB,SAAS,EAAE;QAAEtB;QAAOb;IAAI;IAC9D,IAAIH,KAAKC,OAAO,KAAK;QACnB,MAAMsD,SAASnB,aAAanC;QAC5BO,qBAAqBP;QACrB,IAAIA,EAAEC,CAAC,GAAGC,KAAK,MAAM,IAAIP,UAAUK,EAAEC,CAAC;QACtC,OAAOqD;IACT;IACA,MAAMA,SAASH,cAAcnD,GAAGU,SAASV;IACzCO,qBAAqBP;IACrB,IAAIA,EAAEC,CAAC,GAAGC,KAAK,MAAM,IAAIP,UAAUK,EAAEC,CAAC;IACtC,OAAOqD;AACT;AAEA,OAAO,SAASC,QAAQC,IAAc;IACpC,IAAIA,KAAKxC,IAAI,KAAK,UAAU,OAAOwC,KAAK1C,KAAK;IAC7C,IAAI0C,KAAKxC,IAAI,KAAK,OAAO,OAAOwC,KAAKV,KAAK,CAACW,GAAG,CAACF;IAC/C,MAAMG,SAAkCC,OAAOC,MAAM,CAAC;IACtD,KAAK,MAAMC,SAASL,KAAKnB,OAAO,CAAEqB,MAAM,CAACG,MAAMrB,GAAG,CAAC,GAAGe,QAAQM,MAAM/C,KAAK;IACzE,OAAO4C;AACT;AAEA,OAAO,SAASI,SAASL,GAAY,EAAEjB,GAAW;IAChD,OAAOiB,IAAIpB,OAAO,CAAC0B,IAAI,CAAC,CAACF,QAAUA,MAAMrB,GAAG,KAAKA;AACnD;AAEA,OAAO,SAASwB,YAAY7D,IAAY;IACtC,IAAIA,SAAS,MAAMA,SAAS,UAAUA,SAAS,WAAWA,SAAS,QAAQ,OAAO;IAClF,IAAI,yBAAyBe,IAAI,CAACf,OAAO,OAAO;IAChD,IAAIA,KAAK8D,UAAU,CAAC,QAAQ9D,KAAK8D,UAAU,CAAC,QAAQ9D,KAAK8D,UAAU,CAAC,MAAM,OAAO;IACjF,IAAI,mDAAmD/C,IAAI,CAACf,OAAO,OAAO;IAC1E,OAAO;AACT;AAEA,OAAO,SAAS+D,YAAYpD,KAAc;IACxC,IAAIA,UAAU,MAAM,OAAO;IAC3B,IAAIA,UAAU,MAAM,OAAO;IAC3B,IAAIA,UAAU,OAAO,OAAO;IAC5B,IAAI,OAAOA,UAAU,YAAYK,OAAOgD,QAAQ,CAACrD,QAAQ,OAAOsD,KAAKC,SAAS,CAACvD;IAC/E,IAAI,OAAOA,UAAU,UAAU,OAAOkD,YAAYlD,SAASA,QAAQsD,KAAKC,SAAS,CAACvD;IAClF,IAAIwD,MAAMC,OAAO,CAACzD,QAAQ,OAAO,CAAC,CAAC,EAAEA,MAAM2C,GAAG,CAACS,aAAaM,IAAI,CAAC,MAAM,CAAC,CAAC;IACzE,MAAM,IAAI7E,UAAU;AACtB;AAEA,OAAO,SAAS8E,aAAa3E,IAAY;IACvC,OAAOkE,YAAYlE,SAAS,2BAA2BoB,IAAI,CAACpB,QAAQA,OAAOsE,KAAKC,SAAS,CAACvE;AAC5F;AAEA,OAAO,SAAS4E,mBAAmBC,OAAe,EAAEC,OAAe;IACjE,MAAMC,YAAYF,QAAQG,OAAO,CAAC,MAAMF;IACxC,OAAOC,cAAc,CAAC,IAAIF,QAAQ7C,MAAM,GAAG+C,YAAY;AACzD;AAEA,OAAO,SAASE,YAAYJ,OAAe;IACzC,MAAMK,QAAQC,mBAAmBN;IACjC,OAAOK,MAAMhE,IAAI,KAAK,OAAO0D,mBAAmBC,SAASK,MAAMJ,OAAO,IAAI;AAC5E;AAEA,OAAO,SAASM,qBAAqBP,OAAe;IAClD,OAAOA,QAAQhD,KAAK,CAACoD,YAAYJ;AACnC;AAEA,OAAO,SAASM,mBACdN,OAAe;IAEf,IAAI,CAACA,QAAQV,UAAU,CAAC,QAAQ,OAAO;QAAEjD,MAAM;IAAO;IACtD,MAAMmE,UAAUR,QAAQG,OAAO,CAAC;IAChC,MAAMM,YACJD,YAAY,CAAC,IACTR,UACAA,QAAQhD,KAAK,CAAC,GAAGgD,OAAO,CAACQ,UAAU,EAAE,KAAK,OAAOA,UAAU,IAAIA;IACrE,IAAI,CAAC,cAAcjE,IAAI,CAACkE,YAAY,OAAO;QAAEpE,MAAM;IAAO;IAC1D,IAAImE,YAAY,CAAC,GAAG,OAAO;QAAEnE,MAAM;IAAW;IAC9C,MAAMqE,YAAYF,UAAU;IAC5B,IAAIlF,IAAIoF;IACR,MAAOpF,KAAK0E,QAAQ7C,MAAM,CAAE;QAC1B,MAAMwD,KAAKX,QAAQG,OAAO,CAAC,MAAM7E;QACjC,MAAMsF,UAAUD,OAAO,CAAC,IAAIX,QAAQ7C,MAAM,GAAGwD;QAC7C,IAAIE,OAAOb,QAAQhD,KAAK,CAAC1B,GAAGsF;QAC5B,IAAIC,KAAKC,QAAQ,CAAC,OAAOD,OAAOA,KAAK7D,KAAK,CAAC,GAAG,CAAC;QAC/C,IAAI,cAAcT,IAAI,CAACsE,OAAO,OAAO;YAAExE,MAAM;YAAMqE;YAAWT,SAAS3E;QAAE;QACzE,IAAIqF,OAAO,CAAC,GAAG,OAAO;YAAEtE,MAAM;QAAW;QACzCf,IAAIqF,KAAK;IACX;IACA,OAAO;QAAEtE,MAAM;IAAW;AAC5B;AAEA,OAAO,SAAS0E,WAAWC,IAAa,EAAEC,KAAc;IACtD,IAAID,SAASC,OAAO,OAAO;IAC3B,IAAItB,MAAMC,OAAO,CAACoB,SAASrB,MAAMC,OAAO,CAACqB,QAAQ;QAC/C,OACED,KAAK7D,MAAM,KAAK8D,MAAM9D,MAAM,IAAI6D,KAAKE,KAAK,CAAC,CAACC,MAAMC,QAAUL,WAAWI,MAAMF,KAAK,CAACG,MAAM;IAE7F;IACA,OAAO;AACT;AAEA,OAAO,SAASC,WAAWrB,OAAe;IACxC,OAAOA,QAAQsB,QAAQ,CAAC,UAAU,SAAS;AAC7C"}
|
|
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":"AAAA,OAAO,MAAMA,kBAAkBC;;IAC7B,YAAY,AAASC,MAAc,CAAE;QACnC,KAAK,CAAC,cADaA,SAAAA;QAEnB,IAAI,CAACC,IAAI,GAAG;IACd;AACF;AAkCA,SAASC,KAAKC,CAAM;IAClB,OAAOA,EAAEC,CAAC,GAAGD,EAAEE,GAAG,GAAGF,EAAEG,IAAI,CAACH,EAAEC,CAAC,CAAC,GAAI;AACtC;AAEA,SAASG,QAAQJ,CAAM;IACrB,IAAID,KAAKC,OAAO,MAAMA,EAAEC,CAAC,IAAI;IAC7B,IAAIF,KAAKC,OAAO,MAAMA,EAAEC,CAAC,IAAI;AAC/B;AAEA,SAASI,WAAWL,CAAM;IACxB,MAAOD,KAAKC,OAAO,IAAKA,EAAEC,CAAC,IAAI;IAC/B,IAAIF,KAAKC,OAAO,MAAM,MAAM,IAAIL,UAAUK,EAAEC,CAAC;AAC/C;AAEA,SAASK,UAAUN,CAAM;IACvB,MAAOA,EAAEC,CAAC,GAAGD,EAAEE,GAAG,IAAIH,KAAKC,OAAO,QAAQD,KAAKC,OAAO,KAAMA,EAAEC,CAAC,IAAI;AACrE;AAEA,SAASM,qBAAqBP,CAAM;IAClC,MAAOA,EAAEC,CAAC,GAAGD,EAAEE,GAAG,CAAE;QAClBG,WAAWL;QACX,IAAID,KAAKC,OAAO,KAAKM,UAAUN;QAC/B,IAAID,KAAKC,OAAO,QAAQD,KAAKC,OAAO,MAAM;YACxCI,QAAQJ;YACR;QACF;QACA;IACF;AACF;AAEA,SAASQ,cAAcR,CAAM;IAC3B,MAAOA,EAAEC,CAAC,GAAGD,EAAEE,GAAG,CAAE;QAClB,MAAMO,KAAKV,KAAKC;QAChB,IAAIS,OAAO,OAAOA,OAAO,QAAQA,OAAO,MAAM;YAC5CT,EAAEC,CAAC,IAAI;YACP;QACF;QACA,IAAIQ,OAAO,KAAK;YACdH,UAAUN;YACV;QACF;QACA,IAAIS,OAAO,MAAM,MAAM,IAAId,UAAUK,EAAEC,CAAC;QACxC;IACF;AACF;AAEA,SAASS,SAASV,CAAM;IACtB,IAAIW,IAAIX,EAAEC,CAAC;IACX,MAAOU,IAAI,KAAKX,EAAEG,IAAI,CAACQ,IAAI,EAAE,KAAK,QAAQX,EAAEG,IAAI,CAACQ,IAAI,EAAE,KAAK,KAAMA,KAAK;IACvE,IAAIC,IAAI;IACR,MAAOD,IAAIX,EAAEC,CAAC,CAAE;QACd,MAAMQ,KAAKT,EAAEG,IAAI,CAACQ,EAAE;QACpB,IAAIF,OAAO,KAAKG,KAAK;aAChB,IAAIH,OAAO,MAAM,MAAM,IAAId,UAAUgB;aACrC;QACLA,KAAK;IACP;IACA,OAAOC;AACT;AAEA,SAASC,OAAOC,KAAuC,EAAEC,KAAa,EAAEb,GAAW;IACjF,OAAO;QAAEc,MAAM;QAAUF;QAAOC;QAAOb;IAAI;AAC7C;AAEA,SAASe,eAAed,IAAY;IAClC,IAAIA,SAAS,QAAQ,OAAO;IAC5B,IAAIA,SAAS,SAAS,OAAO;IAC7B,IAAIA,SAAS,UAAUA,SAAS,IAAI,OAAO;IAC3C,IAAI,mDAAmDe,IAAI,CAACf,OAAO,OAAOgB,OAAOhB;IACjF,OAAOA;AACT;AAEA,SAASiB,YAAYpB,CAAM;IACzB,MAAMqB,QAAQtB,KAAKC;IACnB,MAAMe,QAAQf,EAAEC,CAAC;IACjBD,EAAEC,CAAC,IAAI;IACP,IAAIqB,MAAM;IACV,MAAOtB,EAAEC,CAAC,GAAGD,EAAEE,GAAG,CAAE;QAClB,MAAMO,KAAKV,KAAKC;QAChB,IAAIS,OAAOY,OAAO;YAChBrB,EAAEC,CAAC,IAAI;YACP,OAAOY,OAAOS,KAAKP,OAAOf,EAAEC,CAAC;QAC/B;QACA,IAAIQ,OAAO,QAAQA,OAAO,MAAM,MAAM,IAAId,UAAUK,EAAEC,CAAC;QACvD,IAAIoB,UAAU,OAAOZ,OAAO,OAAOT,EAAEG,IAAI,CAACH,EAAEC,CAAC,GAAG,EAAE,KAAK,KAAK;YAC1DqB,OAAO;YACPtB,EAAEC,CAAC,IAAI;YACP;QACF;QACA,IAAIoB,UAAU,OAAOZ,OAAO,MAAM;YAChCT,EAAEC,CAAC,IAAI;YACP,MAAMsB,UAAUxB,KAAKC;YACrB,IAAIuB,YAAY,KAAKD,OAAO;iBACvB,IAAIC,YAAY,KAAKD,OAAO;iBAC5B,IAAIC,YAAY,KAAKD,OAAO;iBAC5B,IAAIC,YAAY,MAAMD,OAAO;iBAC7B,MAAM,IAAI3B,UAAUK,EAAEC,CAAC;YAC5BD,EAAEC,CAAC,IAAI;YACP;QACF;QACAqB,OAAOb;QACPT,EAAEC,CAAC,IAAI;IACT;IACA,MAAM,IAAIN,UAAUK,EAAEC,CAAC;AACzB;AAEA,SAASuB,WAAWxB,CAAM,EAAEyB,IAAa;IACvC,MAAMV,QAAQf,EAAEC,CAAC;IACjB,MAAOD,EAAEC,CAAC,GAAGD,EAAEE,GAAG,CAAE;QAClB,MAAMO,KAAKV,KAAKC;QAChB,IAAIyB,QAAShB,CAAAA,OAAO,OAAOA,OAAO,OAAOA,OAAO,GAAE,GAAI;QACtD,IAAIA,OAAO,QAAQA,OAAO,MAAM;QAChC,IAAIA,OAAO,OAAQT,CAAAA,EAAEC,CAAC,KAAKc,SAASf,EAAEG,IAAI,CAACH,EAAEC,CAAC,GAAG,EAAE,KAAK,OAAOD,EAAEG,IAAI,CAACH,EAAEC,CAAC,GAAG,EAAE,KAAK,IAAG,GAAI;QAC1FD,EAAEC,CAAC,IAAI;IACT;IACA,IAAID,EAAEC,CAAC,KAAKc,OAAO,MAAM,IAAIpB,UAAUK,EAAEC,CAAC;IAC1C,MAAMyB,MAAM1B,EAAEG,IAAI,CAACwB,KAAK,CAACZ,OAAOf,EAAEC,CAAC;IACnC,MAAM2B,UAAUF,IAAIG,OAAO;IAC3B,OAAOhB,OAAOI,eAAeW,UAAUb,OAAOA,QAAQa,QAAQE,MAAM;AACtE;AAEA,SAASC,YAAY/B,CAAM,EAAEyB,IAAa;IACxC,MAAMhB,KAAKV,KAAKC;IAChB,IAAIS,OAAO,OAAOA,OAAO,KAAK,OAAOW,YAAYpB;IACjD,OAAOwB,WAAWxB,GAAGyB;AACvB;AAEA,SAASO,SAAShC,CAAM;IACtB,MAAMe,QAAQf,EAAEC,CAAC;IACjB,IAAIF,KAAKC,OAAO,OAAOD,KAAKC,OAAO,KAAK;QACtC,MAAMiC,SAASb,YAAYpB;QAC3B,IAAI,OAAOiC,OAAOnB,KAAK,KAAK,UAAU,MAAM,IAAInB,UAAUoB;QAC1D,OAAO;YAAEjB,MAAMmC,OAAOnB,KAAK;YAAEC;YAAOb,KAAKF,EAAEC,CAAC;QAAC;IAC/C;IACA,IAAIC,MAAMF,EAAEC,CAAC;IACb,MAAOD,EAAEC,CAAC,GAAGD,EAAEE,GAAG,CAAE;QAClB,MAAMO,KAAKV,KAAKC;QAChB,IACES,OAAO,OACPA,OAAO,QACPA,OAAO,QACPA,OAAO,OACPA,OAAO,OACPA,OAAO,OACPA,OAAO,OACPA,OAAO,OACPA,OAAO,KACP;YACA;QACF;QACAT,EAAEC,CAAC,IAAI;QACP,IAAIQ,OAAO,OAAOA,OAAO,MAAMP,MAAMF,EAAEC,CAAC;IAC1C;IACA,IAAIC,QAAQa,OAAO,MAAM,IAAIpB,UAAUK,EAAEC,CAAC;IAC1CD,EAAEC,CAAC,GAAGC;IACN,OAAO;QAAEJ,MAAME,EAAEG,IAAI,CAACwB,KAAK,CAACZ,OAAOb;QAAMa;QAAOb;IAAI;AACtD;AAEA,SAASgC,eAAelC,CAAM;IAC5BQ,cAAcR;IACd,MAAMS,KAAKV,KAAKC;IAChB,IAAIS,OAAO,KAAK,OAAO0B,aAAanC;IACpC,IAAIS,OAAO,KAAK,OAAO2B,aAAapC;IACpC,IAAIS,OAAO,OAAOA,OAAO,KAAK,MAAM,IAAId,UAAUK,EAAEC,CAAC;IACrD,OAAO8B,YAAY/B,GAAG;AACxB;AAEA,SAASmC,aAAanC,CAAM;IAC1B,MAAMe,QAAQf,EAAEC,CAAC;IACjB,IAAIF,KAAKC,OAAO,KAAK,MAAM,IAAIL,UAAUK,EAAEC,CAAC;IAC5CD,EAAEC,CAAC,IAAI;IACPO,cAAcR;IACd,MAAMqC,UAAuB,EAAE;IAC/B,MAAMC,OAAO,IAAIC;IACjB,IAAIxC,KAAKC,OAAO,KAAK;QACnBA,EAAEC,CAAC,IAAI;QACP,OAAO;YAAEe,MAAM;YAAOqB;YAAStB;YAAOb,KAAKF,EAAEC,CAAC;QAAC;IACjD;IACA,MAAOD,EAAEC,CAAC,GAAGD,EAAEE,GAAG,CAAE;QAClBM,cAAcR;QACd,MAAMwC,MAAMR,SAAShC;QACrBQ,cAAcR;QACd,IAAID,KAAKC,OAAO,KAAK,MAAM,IAAIL,UAAUK,EAAEC,CAAC;QAC5CD,EAAEC,CAAC,IAAI;QACP,MAAMa,QAAQoB,eAAelC;QAC7B,IAAIsC,KAAKG,GAAG,CAACD,IAAI1C,IAAI,GAAG,MAAM,IAAIH,UAAU6C,IAAIzB,KAAK;QACrDuB,KAAKI,GAAG,CAACF,IAAI1C,IAAI;QACjBuC,QAAQM,IAAI,CAAC;YAAEH,KAAKA,IAAI1C,IAAI;YAAE8C,UAAUJ,IAAIzB,KAAK;YAAE8B,QAAQL,IAAItC,GAAG;YAAEY;QAAM;QAC1EN,cAAcR;QACd,IAAID,KAAKC,OAAO,KAAK;YACnBA,EAAEC,CAAC,IAAI;YACP;QACF;QACA,IAAIF,KAAKC,OAAO,KAAK;YACnBA,EAAEC,CAAC,IAAI;YACP,OAAO;gBAAEe,MAAM;gBAAOqB;gBAAStB;gBAAOb,KAAKF,EAAEC,CAAC;YAAC;QACjD;QACA,MAAM,IAAIN,UAAUK,EAAEC,CAAC;IACzB;IACA,MAAM,IAAIN,UAAUK,EAAEC,CAAC;AACzB;AAEA,SAASmC,aAAapC,CAAM;IAC1B,MAAMe,QAAQf,EAAEC,CAAC;IACjB,IAAIF,KAAKC,OAAO,KAAK,MAAM,IAAIL,UAAUK,EAAEC,CAAC;IAC5CD,EAAEC,CAAC,IAAI;IACPO,cAAcR;IACd,MAAM8C,QAAoB,EAAE;IAC5B,IAAI/C,KAAKC,OAAO,KAAK;QACnBA,EAAEC,CAAC,IAAI;QACP,OAAO;YAAEe,MAAM;YAAO8B;YAAO/B;YAAOb,KAAKF,EAAEC,CAAC;QAAC;IAC/C;IACA,MAAOD,EAAEC,CAAC,GAAGD,EAAEE,GAAG,CAAE;QAClB4C,MAAMH,IAAI,CAACT,eAAelC;QAC1BQ,cAAcR;QACd,IAAID,KAAKC,OAAO,KAAK;YACnBA,EAAEC,CAAC,IAAI;YACPO,cAAcR;YACd;QACF;QACA,IAAID,KAAKC,OAAO,KAAK;YACnBA,EAAEC,CAAC,IAAI;YACP,OAAO;gBAAEe,MAAM;gBAAO8B;gBAAO/B;gBAAOb,KAAKF,EAAEC,CAAC;YAAC;QAC/C;QACA,MAAM,IAAIN,UAAUK,EAAEC,CAAC;IACzB;IACA,MAAM,IAAIN,UAAUK,EAAEC,CAAC;AACzB;AAEA,SAAS8C,WAAW/C,CAAM,EAAEgD,eAAuB;IACjD3C,WAAWL;IACX,IAAID,KAAKC,OAAO,KAAKM,UAAUN;IAC/B,MAAMS,KAAKV,KAAKC;IAChB,IAAIS,OAAO,MAAMA,OAAO,QAAQA,OAAO,MAAM;QAC3CL,QAAQJ;QACRO,qBAAqBP;QACrB,IAAIA,EAAEC,CAAC,IAAID,EAAEE,GAAG,EAAE,OAAOW,OAAO,MAAMb,EAAEC,CAAC,EAAED,EAAEC,CAAC;QAC9C,MAAMgD,aAAavC,SAASV;QAC5B,IAAIiD,cAAcD,iBAAiB,OAAOnC,OAAO,MAAMb,EAAEC,CAAC,EAAED,EAAEC,CAAC;QAC/D,IAAIF,KAAKC,OAAO,KAAK,OAAOkD,cAAclD,GAAGiD;QAC7C,IAAIlD,KAAKC,OAAO,KAAK,OAAOoC,aAAapC;QACzC,IAAID,KAAKC,OAAO,KAAK,OAAOmC,aAAanC;QACzC,OAAOmD,cAAcnD,GAAGiD;IAC1B;IACA,IAAIxC,OAAO,KAAK,OAAO0B,aAAanC;IACpC,IAAIS,OAAO,KAAK,OAAO2B,aAAapC;IACpC,IAAIS,OAAO,OAAOA,OAAO,KAAK,MAAM,IAAId,UAAUK,EAAEC,CAAC;IACrD,OAAO8B,YAAY/B,GAAG;AACxB;AAEA,SAASkD,cAAclD,CAAM,EAAEoD,MAAc;IAC3C,MAAMrC,QAAQf,EAAEC,CAAC;IACjB,MAAM6C,QAAoB,EAAE;IAC5B,IAAI5C,MAAMa;IACV,MAAOf,EAAEC,CAAC,GAAGD,EAAEE,GAAG,CAAE;QAClBK,qBAAqBP;QACrB,IAAIA,EAAEC,CAAC,IAAID,EAAEE,GAAG,EAAE;QAClB,IAAIQ,SAASV,OAAOoD,QAAQ;QAC5B,IAAIrD,KAAKC,OAAO,KAAK;QACrBA,EAAEC,CAAC,IAAI;QACP6C,MAAMH,IAAI,CAACI,WAAW/C,GAAGoD;QACzBlD,MAAMF,EAAEC,CAAC;IACX;IACA,OAAO;QAAEe,MAAM;QAAO8B;QAAO/B;QAAOb;IAAI;AAC1C;AAEA,SAASiD,cAAcnD,CAAM,EAAEoD,MAAc;IAC3C,MAAMrC,QAAQf,EAAEC,CAAC;IACjB,MAAMoC,UAAuB,EAAE;IAC/B,MAAMC,OAAO,IAAIC;IACjB,IAAIrC,MAAMa;IACV,MAAOf,EAAEC,CAAC,GAAGD,EAAEE,GAAG,CAAE;QAClBK,qBAAqBP;QACrB,IAAIA,EAAEC,CAAC,IAAID,EAAEE,GAAG,EAAE;QAClB,IAAIQ,SAASV,KAAKoD,QAAQ;QAC1B,IAAI1C,SAASV,KAAKoD,QAAQ,MAAM,IAAIzD,UAAUK,EAAEC,CAAC;QACjD,MAAMuC,MAAMR,SAAShC;QACrBK,WAAWL;QACX,IAAID,KAAKC,OAAO,KAAK,MAAM,IAAIL,UAAUK,EAAEC,CAAC;QAC5CD,EAAEC,CAAC,IAAI;QACP,MAAMa,QAAQiC,WAAW/C,GAAGoD;QAC5B,IAAId,KAAKG,GAAG,CAACD,IAAI1C,IAAI,GAAG,MAAM,IAAIH,UAAU6C,IAAIzB,KAAK;QACrDuB,KAAKI,GAAG,CAACF,IAAI1C,IAAI;QACjBuC,QAAQM,IAAI,CAAC;YAAEH,KAAKA,IAAI1C,IAAI;YAAE8C,UAAUJ,IAAIzB,KAAK;YAAE8B,QAAQL,IAAItC,GAAG;YAAEY;QAAM;QAC1EZ,MAAMF,EAAEC,CAAC;IACX;IACA,OAAO;QAAEe,MAAM;QAAOqB;QAAStB;QAAOb;IAAI;AAC5C;AAEA,OAAO,SAASmD,iBAAiBlD,IAAY,EAAEY,KAAa,EAAEb,GAAW;IACvE,MAAMF,IAAS;QAAEG;QAAMF,GAAGc;QAAOb;IAAI;IACrCK,qBAAqBP;IACrB,IAAIA,EAAEC,CAAC,IAAIC,KAAK,OAAO;QAAEc,MAAM;QAAOqB,SAAS,EAAE;QAAEtB;QAAOb;IAAI;IAC9D,IAAIH,KAAKC,OAAO,KAAK;QACnB,MAAMsD,SAASnB,aAAanC;QAC5BO,qBAAqBP;QACrB,IAAIA,EAAEC,CAAC,GAAGC,KAAK,MAAM,IAAIP,UAAUK,EAAEC,CAAC;QACtC,OAAOqD;IACT;IACA,MAAMA,SAASH,cAAcnD,GAAGU,SAASV;IACzCO,qBAAqBP;IACrB,IAAIA,EAAEC,CAAC,GAAGC,KAAK,MAAM,IAAIP,UAAUK,EAAEC,CAAC;IACtC,OAAOqD;AACT;AAEA,OAAO,SAASC,QAAQC,IAAc;IACpC,IAAIA,KAAKxC,IAAI,KAAK,UAAU,OAAOwC,KAAK1C,KAAK;IAC7C,IAAI0C,KAAKxC,IAAI,KAAK,OAAO,OAAOwC,KAAKV,KAAK,CAACW,GAAG,CAACF;IAC/C,MAAMG,SAAkCC,OAAOC,MAAM,CAAC;IACtD,KAAK,MAAMC,SAASL,KAAKnB,OAAO,CAAEqB,MAAM,CAACG,MAAMrB,GAAG,CAAC,GAAGe,QAAQM,MAAM/C,KAAK;IACzE,OAAO4C;AACT;AAEA,OAAO,SAASI,SAASL,GAAY,EAAEjB,GAAW;IAChD,OAAOiB,IAAIpB,OAAO,CAAC0B,IAAI,CAAC,CAACF,QAAUA,MAAMrB,GAAG,KAAKA;AACnD;AAEA,OAAO,SAASwB,YAAY7D,IAAY;IACtC,IAAIA,SAAS,MAAMA,SAAS,UAAUA,SAAS,WAAWA,SAAS,QAAQ,OAAO;IAClF,IAAI,yBAAyBe,IAAI,CAACf,OAAO,OAAO;IAChD,IAAIA,KAAK8D,UAAU,CAAC,QAAQ9D,KAAK8D,UAAU,CAAC,QAAQ9D,KAAK8D,UAAU,CAAC,MAAM,OAAO;IACjF,IAAI,mDAAmD/C,IAAI,CAACf,OAAO,OAAO;IAC1E,OAAO;AACT;AAEA,OAAO,SAAS+D,YAAYpD,KAAc;IACxC,IAAIA,UAAU,MAAM,OAAO;IAC3B,IAAIA,UAAU,MAAM,OAAO;IAC3B,IAAIA,UAAU,OAAO,OAAO;IAC5B,IAAI,OAAOA,UAAU,YAAYK,OAAOgD,QAAQ,CAACrD,QAAQ,OAAOsD,KAAKC,SAAS,CAACvD;IAC/E,IAAI,OAAOA,UAAU,UAAU,OAAOkD,YAAYlD,SAASA,QAAQsD,KAAKC,SAAS,CAACvD;IAClF,IAAIwD,MAAMC,OAAO,CAACzD,QAAQ,OAAO,CAAC,CAAC,EAAEA,MAAM2C,GAAG,CAACS,aAAaM,IAAI,CAAC,MAAM,CAAC,CAAC;IACzE,MAAM,IAAI7E,UAAU;AACtB;AAEA,OAAO,SAAS8E,aAAa3E,IAAY;IACvC,OAAOkE,YAAYlE,SAAS,2BAA2BoB,IAAI,CAACpB,QAAQA,OAAOsE,KAAKC,SAAS,CAACvE;AAC5F;AAEA,OAAO,SAAS4E,mBAAmBC,OAAe,EAAEC,OAAe;IACjE,MAAMC,YAAYF,QAAQG,OAAO,CAAC,MAAMF;IACxC,OAAOC,cAAc,CAAC,IAAIF,QAAQ7C,MAAM,GAAG+C,YAAY;AACzD;AAEA,OAAO,SAASE,YAAYJ,OAAe;IACzC,MAAMK,QAAQC,mBAAmBN;IACjC,OAAOK,MAAMhE,IAAI,KAAK,OAAO0D,mBAAmBC,SAASK,MAAMJ,OAAO,IAAI;AAC5E;AAEA,OAAO,SAASM,qBAAqBP,OAAe;IAClD,OAAOA,QAAQhD,KAAK,CAACoD,YAAYJ;AACnC;AAEA,OAAO,SAASM,mBACdN,OAAe;IAEf,IAAI,CAACA,QAAQV,UAAU,CAAC,QAAQ,OAAO;QAAEjD,MAAM;IAAO;IACtD,MAAMmE,UAAUR,QAAQG,OAAO,CAAC;IAChC,MAAMM,YACJD,YAAY,CAAC,IACTR,UACAA,QAAQhD,KAAK,CAAC,GAAGgD,OAAO,CAACQ,UAAU,EAAE,KAAK,OAAOA,UAAU,IAAIA;IACrE,IAAI,CAAC,cAAcjE,IAAI,CAACkE,YAAY,OAAO;QAAEpE,MAAM;IAAO;IAC1D,IAAImE,YAAY,CAAC,GAAG,OAAO;QAAEnE,MAAM;IAAW;IAC9C,MAAMqE,YAAYF,UAAU;IAC5B,IAAIlF,IAAIoF;IACR,MAAOpF,KAAK0E,QAAQ7C,MAAM,CAAE;QAC1B,MAAMwD,KAAKX,QAAQG,OAAO,CAAC,MAAM7E;QACjC,MAAMsF,UAAUD,OAAO,CAAC,IAAIX,QAAQ7C,MAAM,GAAGwD;QAC7C,IAAIE,OAAOb,QAAQhD,KAAK,CAAC1B,GAAGsF;QAC5B,IAAIC,KAAKC,QAAQ,CAAC,OAAOD,OAAOA,KAAK7D,KAAK,CAAC,GAAG,CAAC;QAC/C,IAAI,cAAcT,IAAI,CAACsE,OAAO,OAAO;YAAExE,MAAM;YAAMqE;YAAWT,SAAS3E;QAAE;QACzE,IAAIqF,OAAO,CAAC,GAAG,OAAO;YAAEtE,MAAM;QAAW;QACzCf,IAAIqF,KAAK;IACX;IACA,OAAO;QAAEtE,MAAM;IAAW;AAC5B;AAEA,OAAO,SAAS0E,WAAWC,IAAa,EAAEC,KAAc;IACtD,IAAID,SAASC,OAAO,OAAO;IAC3B,IAAItB,MAAMC,OAAO,CAACoB,SAASrB,MAAMC,OAAO,CAACqB,QAAQ;QAC/C,OACED,KAAK7D,MAAM,KAAK8D,MAAM9D,MAAM,IAAI6D,KAAKE,KAAK,CAAC,CAACC,MAAMC,QAAUL,WAAWI,MAAMF,KAAK,CAACG,MAAM;IAE7F;IACA,OAAO;AACT;AAEA,OAAO,SAASC,WAAWrB,OAAe;IACxC,OAAOA,QAAQsB,QAAQ,CAAC,UAAU,SAAS;AAC7C"}
|