@agentshouse/mdmodel 0.1.0-alpha.16 → 0.1.0-alpha.18
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 +52 -41
- 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/links.d.ts.map +1 -1
- package/dist/links.js +529 -148
- package/dist/links.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 +13 -17
- 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 +53 -46
- 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/shortcut-reference-link/context.json +1 -0
- package/fixtures/cases/shortcut-reference-link/expected.json +6 -0
- package/fixtures/cases/shortcut-reference-link/library/item.md +10 -0
- package/fixtures/cases/shortcut-reference-link/schema.yaml +6 -0
- package/fixtures/cases/structured-section/schema.yaml +7 -0
- package/fixtures/cases/submission-keys/schema.yaml +4 -0
- package/fixtures/cases/text-field-kind/context.json +1 -0
- package/fixtures/cases/text-field-kind/expected.json +7 -0
- package/fixtures/cases/text-field-kind/library/page.md +4 -0
- package/fixtures/cases/text-field-kind/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 +58 -20
- 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/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.18";
|
|
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.18';\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":"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"}
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdmodel/src/yaml.ts"],"sourcesContent":["export class YamlError extends Error {\n constructor(readonly offset: number) {\n super('yaml');\n this.name = 'YamlError';\n }\n}\n\nexport type YamlScalar = {\n readonly kind: 'scalar';\n readonly value: string | number | boolean | null;\n readonly start: number;\n readonly end: number;\n};\n\nexport type YamlSeq = {\n readonly kind: 'seq';\n readonly items: readonly YamlNode[];\n readonly start: number;\n readonly end: number;\n};\n\nexport type YamlEntry = {\n readonly key: string;\n readonly keyStart: number;\n readonly keyEnd: number;\n readonly value: YamlNode;\n};\n\nexport type YamlMap = {\n readonly kind: 'map';\n readonly entries: readonly YamlEntry[];\n readonly start: number;\n readonly end: number;\n};\n\nexport type YamlNode = YamlScalar | YamlSeq | YamlMap;\n\ntype Ctx = { text: string; i: number; end: number };\n\nfunction peek(c: Ctx): string {\n return c.i < c.end ? c.text[c.i]! : '';\n}\n\nfunction skipEol(c: Ctx): void {\n if (peek(c) === '\\r') c.i += 1;\n if (peek(c) === '\\n') c.i += 1;\n}\n\nfunction skipSpaces(c: Ctx): void {\n while (peek(c) === ' ') c.i += 1;\n if (peek(c) === '\\t') throw new YamlError(c.i);\n}\n\nfunction skipToEol(c: Ctx): void {\n while (c.i < c.end && peek(c) !== '\\n' && peek(c) !== '\\r') c.i += 1;\n}\n\nfunction skipBlankAndComments(c: Ctx): void {\n while (c.i < c.end) {\n skipSpaces(c);\n if (peek(c) === '#') skipToEol(c);\n if (peek(c) === '\\r' || peek(c) === '\\n') {\n skipEol(c);\n continue;\n }\n break;\n }\n}\n\nfunction skipFlowSpace(c: Ctx): void {\n while (c.i < c.end) {\n const ch = peek(c);\n if (ch === ' ' || ch === '\\n' || ch === '\\r') {\n c.i += 1;\n continue;\n }\n if (ch === '#') {\n skipToEol(c);\n continue;\n }\n if (ch === '\\t') throw new YamlError(c.i);\n break;\n }\n}\n\nfunction indentAt(c: Ctx): number {\n let j = c.i;\n while (j > 0 && c.text[j - 1] !== '\\n' && c.text[j - 1] !== '\\r') j -= 1;\n let n = 0;\n while (j < c.i) {\n const ch = c.text[j]!;\n if (ch === ' ') n += 1;\n else if (ch === '\\t') throw new YamlError(j);\n else break;\n j += 1;\n }\n return n;\n}\n\nfunction scalar(value: string | number | boolean | null, start: number, end: number): YamlScalar {\n return { kind: 'scalar', value, start, end };\n}\n\nfunction interpretPlain(text: string): string | number | boolean | null {\n if (text === 'true') return true;\n if (text === 'false') return false;\n if (text === 'null' || text === '') return null;\n if (/^-?(0|[1-9][0-9]*)(\\.[0-9]+)?([eE][+-]?[0-9]+)?$/.test(text)) return Number(text);\n return text;\n}\n\nfunction parseQuoted(c: Ctx): YamlScalar {\n const quote = peek(c);\n const start = c.i;\n c.i += 1;\n let out = '';\n while (c.i < c.end) {\n const ch = peek(c);\n if (ch === quote) {\n c.i += 1;\n return scalar(out, start, c.i);\n }\n if (ch === '\\n' || ch === '\\r') throw new YamlError(c.i);\n if (quote === \"'\" && ch === \"'\" && c.text[c.i + 1] === \"'\") {\n out += \"'\";\n c.i += 2;\n continue;\n }\n if (quote === '\"' && ch === '\\\\') {\n c.i += 1;\n const escaped = peek(c);\n if (escaped === 'n') out += '\\n';\n else if (escaped === 't') out += '\\t';\n else if (escaped === '\"') out += '\"';\n else if (escaped === '\\\\') out += '\\\\';\n else throw new YamlError(c.i);\n c.i += 1;\n continue;\n }\n out += ch;\n c.i += 1;\n }\n throw new YamlError(c.i);\n}\n\nfunction parsePlain(c: Ctx, flow: boolean): YamlScalar {\n const start = c.i;\n while (c.i < c.end) {\n const ch = peek(c);\n if (flow && (ch === ',' || ch === ']' || ch === '}')) break;\n if (ch === '\\n' || ch === '\\r') break;\n if (ch === '#' && (c.i === start || c.text[c.i - 1] === ' ' || c.text[c.i - 1] === '\\t')) break;\n c.i += 1;\n }\n if (c.i === start) throw new YamlError(c.i);\n const raw = c.text.slice(start, c.i);\n const trimmed = raw.trimEnd();\n return scalar(interpretPlain(trimmed), start, start + trimmed.length);\n}\n\nfunction parseScalar(c: Ctx, flow: boolean): YamlScalar {\n const ch = peek(c);\n if (ch === '\"' || ch === \"'\") return parseQuoted(c);\n return parsePlain(c, flow);\n}\n\nfunction parseKey(c: Ctx): { name: string; start: number; end: number } {\n const start = c.i;\n if (peek(c) === '\"' || peek(c) === \"'\") {\n const quoted = parseQuoted(c);\n if (typeof quoted.value !== 'string') throw new YamlError(start);\n return { name: quoted.value, start, end: c.i };\n }\n let end = c.i;\n while (c.i < c.end) {\n const ch = peek(c);\n if (\n ch === ':' ||\n ch === '\\n' ||\n ch === '\\r' ||\n ch === ',' ||\n ch === '}' ||\n ch === ']' ||\n ch === '#' ||\n ch === '{' ||\n ch === '['\n ) {\n break;\n }\n c.i += 1;\n if (ch !== ' ' && ch !== '\\t') end = c.i;\n }\n if (end === start) throw new YamlError(c.i);\n c.i = end;\n return { name: c.text.slice(start, end), start, end };\n}\n\nfunction parseFlowValue(c: Ctx): YamlNode {\n skipFlowSpace(c);\n const ch = peek(c);\n if (ch === '{') return parseFlowMap(c);\n if (ch === '[') return parseFlowSeq(c);\n if (ch === '|' || ch === '>') throw new YamlError(c.i);\n return parseScalar(c, true);\n}\n\nfunction parseFlowMap(c: Ctx): YamlMap {\n const start = c.i;\n if (peek(c) !== '{') throw new YamlError(c.i);\n c.i += 1;\n skipFlowSpace(c);\n const entries: YamlEntry[] = [];\n const seen = new Set<string>();\n if (peek(c) === '}') {\n c.i += 1;\n return { kind: 'map', entries, start, end: c.i };\n }\n while (c.i < c.end) {\n skipFlowSpace(c);\n const key = parseKey(c);\n skipFlowSpace(c);\n if (peek(c) !== ':') throw new YamlError(c.i);\n c.i += 1;\n const value = parseFlowValue(c);\n if (seen.has(key.name)) throw new YamlError(key.start);\n seen.add(key.name);\n entries.push({ key: key.name, keyStart: key.start, keyEnd: key.end, value });\n skipFlowSpace(c);\n if (peek(c) === ',') {\n c.i += 1;\n continue;\n }\n if (peek(c) === '}') {\n c.i += 1;\n return { kind: 'map', entries, start, end: c.i };\n }\n throw new YamlError(c.i);\n }\n throw new YamlError(c.i);\n}\n\nfunction parseFlowSeq(c: Ctx): YamlSeq {\n const start = c.i;\n if (peek(c) !== '[') throw new YamlError(c.i);\n c.i += 1;\n skipFlowSpace(c);\n const items: YamlNode[] = [];\n if (peek(c) === ']') {\n c.i += 1;\n return { kind: 'seq', items, start, end: c.i };\n }\n while (c.i < c.end) {\n items.push(parseFlowValue(c));\n skipFlowSpace(c);\n if (peek(c) === ',') {\n c.i += 1;\n skipFlowSpace(c);\n continue;\n }\n if (peek(c) === ']') {\n c.i += 1;\n return { kind: 'seq', items, start, end: c.i };\n }\n throw new YamlError(c.i);\n }\n throw new YamlError(c.i);\n}\n\nfunction parseValue(c: Ctx, parentKeyIndent: number): YamlNode {\n skipSpaces(c);\n if (peek(c) === '#') skipToEol(c);\n const ch = peek(c);\n if (ch === '' || ch === '\\n' || ch === '\\r') {\n skipEol(c);\n skipBlankAndComments(c);\n if (c.i >= c.end) return scalar(null, c.i, c.i);\n const nextIndent = indentAt(c);\n if (nextIndent <= parentKeyIndent) return scalar(null, c.i, c.i);\n if (peek(c) === '-') return parseBlockSeq(c, nextIndent);\n if (peek(c) === '[') return parseFlowSeq(c);\n if (peek(c) === '{') return parseFlowMap(c);\n return parseBlockMap(c, nextIndent);\n }\n if (ch === '{') return parseFlowMap(c);\n if (ch === '[') return parseFlowSeq(c);\n if (ch === '|' || ch === '>') throw new YamlError(c.i);\n return parseScalar(c, false);\n}\n\nfunction parseBlockSeq(c: Ctx, indent: number): YamlSeq {\n const start = c.i;\n const items: YamlNode[] = [];\n let end = start;\n while (c.i < c.end) {\n skipBlankAndComments(c);\n if (c.i >= c.end) break;\n if (indentAt(c) !== indent) break;\n if (peek(c) !== '-') break;\n c.i += 1;\n items.push(parseValue(c, indent));\n end = c.i;\n }\n return { kind: 'seq', items, start, end };\n}\n\nfunction parseBlockMap(c: Ctx, indent: number): YamlMap {\n const start = c.i;\n const entries: YamlEntry[] = [];\n const seen = new Set<string>();\n let end = start;\n while (c.i < c.end) {\n skipBlankAndComments(c);\n if (c.i >= c.end) break;\n if (indentAt(c) < indent) break;\n if (indentAt(c) > indent) throw new YamlError(c.i);\n const key = parseKey(c);\n skipSpaces(c);\n if (peek(c) !== ':') throw new YamlError(c.i);\n c.i += 1;\n const value = parseValue(c, indent);\n if (seen.has(key.name)) throw new YamlError(key.start);\n seen.add(key.name);\n entries.push({ key: key.name, keyStart: key.start, keyEnd: key.end, value });\n end = c.i;\n }\n return { kind: 'map', entries, start, end };\n}\n\nexport function parseYamlMapping(text: string, start: number, end: number): YamlMap {\n const c: Ctx = { text, i: start, end };\n skipBlankAndComments(c);\n if (c.i >= end) return { kind: 'map', entries: [], start, end };\n if (peek(c) === '{') {\n const mapped = parseFlowMap(c);\n skipBlankAndComments(c);\n if (c.i < end) throw new YamlError(c.i);\n return mapped;\n }\n const mapped = parseBlockMap(c, indentAt(c));\n skipBlankAndComments(c);\n if (c.i < end) throw new YamlError(c.i);\n return mapped;\n}\n\nexport function jsValue(node: YamlNode): unknown {\n if (node.kind === 'scalar') return node.value;\n if (node.kind === 'seq') return node.items.map(jsValue);\n const record: Record<string, unknown> = Object.create(null);\n for (const entry of node.entries) record[entry.key] = jsValue(entry.value);\n return record;\n}\n\nexport function mapEntry(map: YamlMap, key: string): YamlEntry | undefined {\n return map.entries.find((entry) => entry.key === key);\n}\n\nexport function isPlainSafe(text: string): boolean {\n if (text === '' || text === 'true' || text === 'false' || text === 'null') return false;\n if (/[\\s#:{}[\\],&*!|>'\"%@`]/.test(text)) return false;\n if (text.startsWith('-') || text.startsWith('?') || text.startsWith(':')) return false;\n if (/^-?(0|[1-9][0-9]*)(\\.[0-9]+)?([eE][+-]?[0-9]+)?$/.test(text)) return false;\n return true;\n}\n\nexport function serializeJs(value: unknown): string {\n if (value === null) return 'null';\n if (value === true) return 'true';\n if (value === false) return 'false';\n if (typeof value === 'number' && Number.isFinite(value)) return JSON.stringify(value);\n if (typeof value === 'string') return isPlainSafe(value) ? value : JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(serializeJs).join(', ')}]`;\n throw new YamlError(0);\n}\n\nexport function serializeKey(name: string): string {\n return isPlainSafe(name) || /^[A-Za-z][A-Za-z0-9_-]*$/.test(name) ? name : JSON.stringify(name);\n}\n\nexport function bodyStartAfterYaml(content: string, yamlEnd: number): number {\n const closeLine = content.indexOf('\\n', yamlEnd);\n return closeLine === -1 ? content.length : closeLine + 1;\n}\n\nexport function bodyStartOf(content: string): number {\n const fence = extractFrontmatter(content);\n return fence.kind === 'ok' ? bodyStartAfterYaml(content, fence.yamlEnd) : 0;\n}\n\nexport function bodyAfterFrontmatter(content: string): string {\n return content.slice(bodyStartOf(content));\n}\n\nexport function extractFrontmatter(\n content: string,\n): { kind: 'none' } | { kind: 'unclosed' } | { kind: 'ok'; yamlStart: number; yamlEnd: number } {\n if (!content.startsWith('---')) return { kind: 'none' };\n const firstNl = content.indexOf('\\n');\n const firstLine =\n firstNl === -1\n ? content\n : content.slice(0, content[firstNl - 1] === '\\r' ? firstNl - 1 : firstNl);\n if (!/^---[ \\t]*$/.test(firstLine)) return { kind: 'none' };\n if (firstNl === -1) return { kind: 'unclosed' };\n const yamlStart = firstNl + 1;\n let i = yamlStart;\n while (i <= content.length) {\n const nl = content.indexOf('\\n', i);\n const lineEnd = nl === -1 ? content.length : nl;\n let line = content.slice(i, lineEnd);\n if (line.endsWith('\\r')) line = line.slice(0, -1);\n if (/^---[ \\t]*$/.test(line)) return { kind: 'ok', yamlStart, yamlEnd: i };\n if (nl === -1) return { kind: 'unclosed' };\n i = nl + 1;\n }\n return { kind: 'unclosed' };\n}\n\nexport function equalValue(left: unknown, right: unknown): boolean {\n if (left === right) return true;\n if (Array.isArray(left) && Array.isArray(right)) {\n return (\n left.length === right.length && left.every((item, index) => equalValue(item, right[index]))\n );\n }\n return false;\n}\n\nexport function lineEnding(content: string): '\\n' | '\\r\\n' {\n return content.includes('\\r\\n') ? '\\r\\n' : '\\n';\n}\n"],"names":["YamlError","Error","offset","name","peek","c","i","end","text","skipEol","skipSpaces","skipToEol","skipBlankAndComments","skipFlowSpace","ch","indentAt","j","n","scalar","value","start","kind","interpretPlain","test","Number","parseQuoted","quote","out","escaped","parsePlain","flow","raw","slice","trimmed","trimEnd","length","parseScalar","parseKey","quoted","parseFlowValue","parseFlowMap","parseFlowSeq","entries","seen","Set","key","has","add","push","keyStart","keyEnd","items","parseValue","parentKeyIndent","nextIndent","parseBlockSeq","parseBlockMap","indent","parseYamlMapping","mapped","jsValue","node","map","record","Object","create","entry","mapEntry","find","isPlainSafe","startsWith","serializeJs","isFinite","JSON","stringify","Array","isArray","join","serializeKey","bodyStartAfterYaml","content","yamlEnd","closeLine","indexOf","bodyStartOf","fence","extractFrontmatter","bodyAfterFrontmatter","firstNl","firstLine","yamlStart","nl","lineEnd","line","endsWith","equalValue","left","right","every","item","index","lineEnding","includes"],"mappings":"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"}
|
package/fixtures/README.md
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
Each directory under `cases/` is one text Library, one validation context,
|
|
4
4
|
and one expected verdict. Consumers load the files under `library/` as
|
|
5
|
-
path-to-content
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
path-to-content, an absent `library/` being the empty Library, and the
|
|
6
|
+
required `context.json` as `ValidationContext`. Cases with a `schema.yaml` call
|
|
7
|
+
`verify` with its text, then compare its refusal or
|
|
8
8
|
`validate(library, context, verified.model)` against `expected.json`. Other
|
|
9
9
|
cases compare `validate(library, context)` directly. Text-only cases carry
|
|
10
10
|
`{ "binaryTargets": [] }`. Binary targets are membership declarations; the
|
|
@@ -23,25 +23,31 @@ fenced headings, newline/source preservation, and a moved-export link rewrite.
|
|
|
23
23
|
## Projection
|
|
24
24
|
|
|
25
25
|
`projection.json` exercises the public `project` seam separately from the
|
|
26
|
-
validation Libraries. It carries `
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
validation Libraries. It carries `schema`, one schema text, and `cases`. Each
|
|
27
|
+
case carries `name`, the `file` the Document sits at, exact `source`, the
|
|
28
|
+
`documentTargets` the collection holds as Markdown documents, the `definition`
|
|
29
|
+
type name or `null`, an optional `move`, an optional `links` inventory, an
|
|
30
|
+
optional `relabel`, and `expected`.
|
|
30
31
|
A case carrying a `move` lists both the Path its target sits at and the Path the
|
|
31
32
|
move takes it to, because the collection holds that target either way.
|
|
32
33
|
|
|
33
|
-
|
|
34
|
-
`
|
|
35
|
-
`<package-version>` token in a refusal the same way `cases/` does.
|
|
34
|
+
Verify the schema, parse the source, call `project(document, file, context)`
|
|
35
|
+
with `documentTargets` and the verified type `definition` names, and compare against `expected`, replacing the
|
|
36
|
+
`<package-version>` token in a refusal the same way `cases/` does. Where
|
|
37
|
+
`links` is present, compare `links(document, file)` against it. Then check
|
|
36
38
|
that the source is unchanged. Where `move` is present, apply
|
|
37
39
|
`{ kind: 'link', href, to }`, confirm the serialized Document changed, and
|
|
38
40
|
confirm the projection of the moved Document is still exactly `expected`: a
|
|
39
|
-
moved Path rewrites destinations and leaves the projection alone.
|
|
41
|
+
moved Path rewrites destinations and leaves the projection alone. Where
|
|
42
|
+
`relabel` is present, split the source at its `from`, which the source carries
|
|
43
|
+
exactly once, join the pieces with its `to`, parse the result, and confirm its
|
|
44
|
+
projection is exactly the relabel's own `expected` and differs from the case's:
|
|
45
|
+
a changed visible label changes the projection.
|
|
40
46
|
|
|
41
47
|
## Division
|
|
42
48
|
|
|
43
49
|
`division.json` exercises the public `divide` seam separately from the
|
|
44
|
-
validation Libraries. It carries `
|
|
50
|
+
validation Libraries. It carries `schema` and `cases` like `projection.json`,
|
|
45
51
|
and each case adds the `budget` the division runs under. Parse the source, call
|
|
46
52
|
`divide(document, file, context)` with `{ documentTargets, definition, budget }`,
|
|
47
53
|
and compare against `expected`: either `{ "ok": true, "spans": [...] }`, where
|
|
@@ -79,50 +85,51 @@ Refusal:
|
|
|
79
85
|
```
|
|
80
86
|
|
|
81
87
|
`location` is omitted when the rule is not about a field or section.
|
|
82
|
-
`referrers` is present only for `referenced-missing-file`.
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
88
|
+
`referrers` is present only for `referenced-missing-file`. A schema refusal
|
|
89
|
+
carries no `file`; its `location`, when present, is the dotted path of the
|
|
90
|
+
schema part it concerns, such as `types.task.fields.title`, or `line <n>` for
|
|
91
|
+
`schema-yaml`.
|
|
86
92
|
The `version` field in these fixtures is the token `<package-version>`;
|
|
87
93
|
replace it with the package's semantic version before comparing.
|
|
88
94
|
|
|
89
95
|
## Rule ids
|
|
90
96
|
|
|
91
|
-
| Rule | When
|
|
92
|
-
| ------------------------- |
|
|
93
|
-
| `binary-target-document` | A path is declared as both a text Document and a binary target
|
|
94
|
-
| `frontmatter-fence` | A present frontmatter fence does not parse as the accepted YAML subset
|
|
95
|
-
| `
|
|
96
|
-
| `
|
|
97
|
-
| `
|
|
98
|
-
| `definition-
|
|
99
|
-
| `definition-
|
|
100
|
-
| `definition-
|
|
101
|
-
| `definition-
|
|
102
|
-
| `definition-
|
|
103
|
-
| `definition-
|
|
104
|
-
| `definition-
|
|
105
|
-
| `definition-
|
|
106
|
-
| `definition-
|
|
107
|
-
| `
|
|
108
|
-
| `
|
|
109
|
-
| `required-
|
|
110
|
-
| `
|
|
111
|
-
| `field-
|
|
112
|
-
| `
|
|
113
|
-
| `
|
|
114
|
-
| `unresolved-
|
|
115
|
-
| `
|
|
116
|
-
| `
|
|
117
|
-
| `
|
|
118
|
-
| `
|
|
97
|
+
| Rule | When |
|
|
98
|
+
| ------------------------- | -------------------------------------------------------------------------------- |
|
|
99
|
+
| `binary-target-document` | A path is declared as both a text Document and a binary target |
|
|
100
|
+
| `frontmatter-fence` | A present frontmatter fence does not parse as the accepted YAML subset |
|
|
101
|
+
| `schema-yaml` | A schema text is not a mapping in the accepted YAML subset |
|
|
102
|
+
| `schema-shape` | A schema is not a mapping of exactly `types` to a mapping of non-empty names |
|
|
103
|
+
| `schema-member-document` | A second type is marked `member_document: true` |
|
|
104
|
+
| `definition-shape` | A type is not a mapping of `fields`, `sections`, and a boolean `member_document` |
|
|
105
|
+
| `definition-fields` | `fields` is not a mapping |
|
|
106
|
+
| `definition-field` | A field spec is not an object of the accepted keys |
|
|
107
|
+
| `definition-field-kind` | A field kind is not text, string, number, date, enum, reference, or list |
|
|
108
|
+
| `definition-enum-values` | An enum field has no non-empty string `values` |
|
|
109
|
+
| `definition-reference-to` | A reference has no `to` naming `any` or a type of the same schema |
|
|
110
|
+
| `definition-list-of` | A list field or list section has no `of` that is one scalar kind |
|
|
111
|
+
| `definition-sections` | `sections` is not a mapping |
|
|
112
|
+
| `definition-section` | A section spec is not an object of the accepted keys |
|
|
113
|
+
| `definition-section-kind` | A section kind is not `text` or `list` |
|
|
114
|
+
| `unknown-type` | A file declares a type absent from the governing schema |
|
|
115
|
+
| `required-field` | A required field is missing |
|
|
116
|
+
| `required-section` | A required section heading is missing |
|
|
117
|
+
| `field-kind` | A field value fails its kind, including date |
|
|
118
|
+
| `field-enum` | A field value is not one of the declared enum values |
|
|
119
|
+
| `undeclared-field` | A typed file carries a frontmatter field its type does not declare |
|
|
120
|
+
| `unresolved-reference` | A reference does not resolve to a current file of the required type |
|
|
121
|
+
| `unresolved-link` | A relative body link does not resolve to a current path |
|
|
122
|
+
| `structured-section` | A declared structured-list section does not parse as a list |
|
|
123
|
+
| `referenced-missing-file` | Remaining files still reference an absent path |
|
|
124
|
+
| `unwritable-link` | No Markdown destination form can carry a new link destination |
|
|
125
|
+
| `division-budget` | A division budget is not a whole number of at least 2 |
|
|
119
126
|
|
|
120
127
|
`unwritable-link` is refused by `apply` and `division-budget` by `divide`, not
|
|
121
128
|
by `validate`, so no case under `cases/` carries either.
|
|
122
129
|
|
|
123
130
|
## YAML subset
|
|
124
131
|
|
|
125
|
-
Frontmatter
|
|
132
|
+
Frontmatter and a schema text are each a mapping in a closed YAML subset: block and flow mappings,
|
|
126
133
|
block and flow sequences, plain and quoted scalars, `true`, `false`, `null`,
|
|
127
134
|
and decimal numbers. It does not take YAML 1.1 boolean or timestamp aliases,
|
|
128
|
-
octal numbers, anchors, tags, or block scalars.
|
|
135
|
+
octal numbers, anchors, tags, or block scalars. A mapping carries each key once.
|