frontmatter-kit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,203 @@
1
+ import { FrontmatterParseError } from "./errors.js";
2
+ import { parseMatter, stringifyMatter } from "./languages.js";
3
+ import { createLineIndex, rangeAt } from "./position.js";
4
+ export { FrontmatterParseError } from "./errors.js";
5
+ const DEFAULT_EXCERPT_SEPARATOR = "<!-- more -->";
6
+ export function parseFrontmatter(source, options = {}) {
7
+ const lineStarts = createLineIndex(source);
8
+ const diagnostics = [];
9
+ const opening = readOpening(source);
10
+ if (!opening) {
11
+ return {
12
+ hasFrontmatter: false,
13
+ attributes: {},
14
+ body: source,
15
+ matter: "",
16
+ ranges: {
17
+ body: rangeAt(0, source.length, lineStarts)
18
+ },
19
+ diagnostics
20
+ };
21
+ }
22
+ const closing = findClosing(source, opening.contentStart, opening.delimiter);
23
+ const openingRange = rangeAt(opening.start, opening.contentStart, lineStarts);
24
+ if (opening.rawLanguageHint && !opening.languageHint) {
25
+ diagnostics.push({
26
+ code: "UNKNOWN_LANGUAGE_HINT",
27
+ severity: "warning",
28
+ message: `Unknown front matter language "${opening.rawLanguageHint}"; YAML-like parsing was used.`,
29
+ range: openingRange
30
+ });
31
+ }
32
+ if (!closing) {
33
+ diagnostics.push({
34
+ code: "MISSING_CLOSING_DELIMITER",
35
+ severity: "error",
36
+ message: `Missing closing front matter delimiter "${opening.delimiter}".`,
37
+ range: openingRange
38
+ });
39
+ return {
40
+ hasFrontmatter: false,
41
+ attributes: {},
42
+ body: source.slice(opening.contentStart),
43
+ matter: source.slice(opening.contentStart),
44
+ language: inferLanguage(opening, source.slice(opening.contentStart), options.language),
45
+ delimiters: {
46
+ opening: opening.delimiter,
47
+ closing: opening.delimiter
48
+ },
49
+ ranges: {
50
+ opening: openingRange,
51
+ matter: rangeAt(opening.contentStart, source.length, lineStarts),
52
+ body: rangeAt(opening.contentStart, source.length, lineStarts)
53
+ },
54
+ diagnostics
55
+ };
56
+ }
57
+ const matter = source.slice(opening.contentStart, closing.start);
58
+ const body = source.slice(closing.end);
59
+ const language = inferLanguage(opening, matter, options.language);
60
+ const matterRange = rangeAt(opening.contentStart, closing.start, lineStarts);
61
+ const attributes = parseMatter(matter, language, diagnostics, matterRange);
62
+ const excerpt = readExcerpt(body, closing.end, source, lineStarts, options.excerptSeparator ?? DEFAULT_EXCERPT_SEPARATOR);
63
+ return {
64
+ hasFrontmatter: true,
65
+ attributes,
66
+ body,
67
+ matter,
68
+ language,
69
+ delimiters: {
70
+ opening: opening.delimiter,
71
+ closing: opening.delimiter
72
+ },
73
+ ...(excerpt ? { excerpt: excerpt.text } : {}),
74
+ ranges: {
75
+ opening: openingRange,
76
+ matter: matterRange,
77
+ closing: rangeAt(closing.start, closing.end, lineStarts),
78
+ body: rangeAt(closing.end, source.length, lineStarts),
79
+ ...(excerpt ? { excerpt: excerpt.range } : {})
80
+ },
81
+ diagnostics
82
+ };
83
+ }
84
+ export function tryParseFrontmatter(source, options) {
85
+ try {
86
+ return {
87
+ ok: true,
88
+ result: parseFrontmatter(source, options)
89
+ };
90
+ }
91
+ catch (error) {
92
+ return {
93
+ ok: false,
94
+ error: error instanceof Error ? error : new Error("Unknown front matter parsing error.")
95
+ };
96
+ }
97
+ }
98
+ export function parseFrontmatterOrThrow(source, options) {
99
+ const result = parseFrontmatter(source, options);
100
+ const error = result.diagnostics.find((diagnostic) => diagnostic.severity === "error");
101
+ if (error) {
102
+ throw new FrontmatterParseError(error);
103
+ }
104
+ return result;
105
+ }
106
+ export function stringifyFrontmatter(attributes, body = "", options = {}) {
107
+ const language = options.language ?? "yaml";
108
+ const delimiter = options.delimiter ?? (language === "toml" ? "+++" : "---");
109
+ const suffix = language === "yaml" ? "" : language;
110
+ const opening = `${delimiter}${suffix}`;
111
+ return `${opening}\n${stringifyMatter(attributes, language)}\n${delimiter}\n${body}`;
112
+ }
113
+ export function hasFrontmatter(source) {
114
+ return Boolean(readOpening(source));
115
+ }
116
+ function readOpening(source) {
117
+ const match = /^\uFEFF?(---|\+\+\+)([A-Za-z0-9_-]+)?[ \t]*(?:\r?\n|$)/.exec(source);
118
+ if (!match) {
119
+ return undefined;
120
+ }
121
+ const delimiter = match[1];
122
+ const hint = normalizeLanguage(match[2]);
123
+ const rawHint = match[2]?.trim();
124
+ return {
125
+ start: 0,
126
+ contentStart: match[0].length,
127
+ delimiter,
128
+ ...(hint ? { languageHint: hint } : {}),
129
+ ...(rawHint ? { rawLanguageHint: rawHint } : {})
130
+ };
131
+ }
132
+ function findClosing(source, offset, delimiter) {
133
+ let lineStart = offset;
134
+ while (lineStart <= source.length) {
135
+ const lineEnd = findLineEnd(source, lineStart);
136
+ const line = source.slice(lineStart, lineEnd).trim();
137
+ if (line === delimiter) {
138
+ return {
139
+ start: lineStart,
140
+ end: consumeLineBreak(source, lineEnd)
141
+ };
142
+ }
143
+ if (lineEnd >= source.length) {
144
+ break;
145
+ }
146
+ lineStart = consumeLineBreak(source, lineEnd);
147
+ }
148
+ return undefined;
149
+ }
150
+ function inferLanguage(opening, matter, forced) {
151
+ if (forced) {
152
+ return forced;
153
+ }
154
+ if (opening.languageHint) {
155
+ return opening.languageHint;
156
+ }
157
+ if (opening.delimiter === "+++") {
158
+ return "toml";
159
+ }
160
+ return matter.trimStart().startsWith("{") ? "json" : "yaml";
161
+ }
162
+ function normalizeLanguage(value) {
163
+ const normalized = value?.toLowerCase();
164
+ if (normalized === "yaml" || normalized === "yml") {
165
+ return "yaml";
166
+ }
167
+ if (normalized === "json") {
168
+ return "json";
169
+ }
170
+ if (normalized === "toml") {
171
+ return "toml";
172
+ }
173
+ return undefined;
174
+ }
175
+ function readExcerpt(body, bodyOffset, source, lineStarts, separator) {
176
+ if (separator === false || separator === "") {
177
+ return undefined;
178
+ }
179
+ const index = body.indexOf(separator);
180
+ if (index === -1) {
181
+ return undefined;
182
+ }
183
+ const start = bodyOffset;
184
+ const end = bodyOffset + index;
185
+ return {
186
+ text: source.slice(start, end).trimEnd(),
187
+ range: rangeAt(start, end, lineStarts)
188
+ };
189
+ }
190
+ function findLineEnd(source, offset) {
191
+ const next = source.indexOf("\n", offset);
192
+ return next === -1 ? source.length : source[next - 1] === "\r" ? next - 1 : next;
193
+ }
194
+ function consumeLineBreak(source, offset) {
195
+ if (source[offset] === "\r" && source[offset + 1] === "\n") {
196
+ return offset + 2;
197
+ }
198
+ if (source[offset] === "\n") {
199
+ return offset + 1;
200
+ }
201
+ return offset;
202
+ }
203
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { FrontmatterAttributes, FrontmatterDiagnostic, FrontmatterLanguage, FrontmatterRange } from "./types.js";
2
+ export declare function parseMatter(matter: string, language: FrontmatterLanguage, diagnostics: FrontmatterDiagnostic[], range?: FrontmatterRange): FrontmatterAttributes;
3
+ export declare function stringifyMatter(attributes: FrontmatterAttributes, language: FrontmatterLanguage): string;
4
+ //# sourceMappingURL=languages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"languages.d.ts","sourceRoot":"","sources":["../src/languages.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,gBAAgB,EAAoB,MAAM,YAAY,CAAC;AAExI,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,mBAAmB,EAC7B,WAAW,EAAE,qBAAqB,EAAE,EACpC,KAAK,CAAC,EAAE,gBAAgB,GACvB,qBAAqB,CAUvB;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,qBAAqB,EAAE,QAAQ,EAAE,mBAAmB,GAAG,MAAM,CAUxG"}
@@ -0,0 +1,215 @@
1
+ import { parseScalar, stringifyScalar } from "./scalars.js";
2
+ export function parseMatter(matter, language, diagnostics, range) {
3
+ if (language === "json") {
4
+ return parseJsonMatter(matter, diagnostics, range);
5
+ }
6
+ if (language === "toml") {
7
+ return parseTomlMatter(matter, diagnostics, range);
8
+ }
9
+ return parseYamlMatter(matter, diagnostics, range);
10
+ }
11
+ export function stringifyMatter(attributes, language) {
12
+ if (language === "json") {
13
+ return JSON.stringify(attributes, null, 2);
14
+ }
15
+ if (language === "toml") {
16
+ return stringifyToml(attributes);
17
+ }
18
+ return stringifyYaml(attributes);
19
+ }
20
+ function parseJsonMatter(matter, diagnostics, range) {
21
+ try {
22
+ const value = JSON.parse(matter);
23
+ if (!isPlainObject(value)) {
24
+ diagnostics.push({
25
+ code: "JSON_FRONTMATTER_NOT_OBJECT",
26
+ severity: "error",
27
+ message: "JSON front matter must parse to an object.",
28
+ range
29
+ });
30
+ return {};
31
+ }
32
+ return value;
33
+ }
34
+ catch (error) {
35
+ diagnostics.push({
36
+ code: "INVALID_JSON_FRONTMATTER",
37
+ severity: "error",
38
+ message: error instanceof Error ? error.message : "Invalid JSON front matter.",
39
+ range
40
+ });
41
+ return {};
42
+ }
43
+ }
44
+ function parseYamlMatter(matter, diagnostics, range) {
45
+ const attributes = {};
46
+ const lines = matter.replace(/\r\n?/g, "\n").split("\n");
47
+ for (let index = 0; index < lines.length; index += 1) {
48
+ const line = lines[index] ?? "";
49
+ if (isIgnorable(line)) {
50
+ continue;
51
+ }
52
+ if (/^\s/.test(line)) {
53
+ diagnostics.push({
54
+ code: "UNEXPECTED_INDENT",
55
+ severity: "warning",
56
+ message: "Indented YAML line was ignored because it is not attached to a top-level key.",
57
+ range
58
+ });
59
+ continue;
60
+ }
61
+ const separator = line.indexOf(":");
62
+ if (separator <= 0) {
63
+ diagnostics.push({
64
+ code: "INVALID_YAML_LINE",
65
+ severity: "warning",
66
+ message: `YAML line ${index + 1} does not look like a key/value pair.`,
67
+ range
68
+ });
69
+ continue;
70
+ }
71
+ const key = line.slice(0, separator).trim();
72
+ const rawValue = line.slice(separator + 1).trim();
73
+ if (!key) {
74
+ continue;
75
+ }
76
+ if (rawValue !== "") {
77
+ setPathValue(attributes, key, parseScalar(rawValue, diagnostics, range));
78
+ continue;
79
+ }
80
+ const block = collectIndentedBlock(lines, index + 1);
81
+ index = block.nextIndex - 1;
82
+ setPathValue(attributes, key, parseYamlBlock(block.lines, diagnostics, range));
83
+ }
84
+ return attributes;
85
+ }
86
+ function parseYamlBlock(lines, diagnostics, range) {
87
+ const meaningful = lines.filter((line) => !isIgnorable(line));
88
+ if (meaningful.length === 0) {
89
+ return "";
90
+ }
91
+ if (meaningful.every((line) => line.trimStart().startsWith("- "))) {
92
+ return meaningful.map((line) => parseScalar(line.trimStart().slice(2), diagnostics, range));
93
+ }
94
+ const object = {};
95
+ for (const line of meaningful) {
96
+ const trimmed = line.trim();
97
+ const separator = trimmed.indexOf(":");
98
+ if (separator <= 0) {
99
+ diagnostics.push({
100
+ code: "INVALID_YAML_BLOCK_LINE",
101
+ severity: "warning",
102
+ message: "Nested YAML line was ignored because it is not a key/value pair.",
103
+ range
104
+ });
105
+ continue;
106
+ }
107
+ object[trimmed.slice(0, separator).trim()] = parseScalar(trimmed.slice(separator + 1), diagnostics, range);
108
+ }
109
+ return object;
110
+ }
111
+ function collectIndentedBlock(lines, startIndex) {
112
+ const block = [];
113
+ let index = startIndex;
114
+ while (index < lines.length) {
115
+ const line = lines[index] ?? "";
116
+ if (line.trim() !== "" && !/^\s/.test(line)) {
117
+ break;
118
+ }
119
+ block.push(line);
120
+ index += 1;
121
+ }
122
+ return { lines: block, nextIndex: index };
123
+ }
124
+ function parseTomlMatter(matter, diagnostics, range) {
125
+ const attributes = {};
126
+ let section = [];
127
+ matter.replace(/\r\n?/g, "\n").split("\n").forEach((line, index) => {
128
+ const trimmed = line.trim();
129
+ if (trimmed === "" || trimmed.startsWith("#")) {
130
+ return;
131
+ }
132
+ const sectionMatch = /^\[([A-Za-z0-9_.-]+)\]$/.exec(trimmed);
133
+ if (sectionMatch) {
134
+ section = (sectionMatch[1] ?? "").split(".");
135
+ return;
136
+ }
137
+ const separator = trimmed.indexOf("=");
138
+ if (separator <= 0) {
139
+ diagnostics.push({
140
+ code: "INVALID_TOML_LINE",
141
+ severity: "warning",
142
+ message: `TOML line ${index + 1} does not look like a key/value pair.`,
143
+ range
144
+ });
145
+ return;
146
+ }
147
+ setSegmentsValue(attributes, [...section, trimmed.slice(0, separator).trim()], parseScalar(trimmed.slice(separator + 1), diagnostics, range));
148
+ });
149
+ return attributes;
150
+ }
151
+ function stringifyYaml(attributes) {
152
+ return Object.entries(attributes)
153
+ .map(([key, value]) => stringifyYamlEntry(key, value))
154
+ .join("\n");
155
+ }
156
+ function stringifyYamlEntry(key, value) {
157
+ if (Array.isArray(value)) {
158
+ return `${key}:\n${value.map((item) => ` - ${stringifyScalar(item)}`).join("\n")}`;
159
+ }
160
+ if (value && typeof value === "object") {
161
+ return `${key}:\n${Object.entries(value)
162
+ .map(([childKey, childValue]) => ` ${childKey}: ${stringifyScalar(childValue)}`)
163
+ .join("\n")}`;
164
+ }
165
+ return `${key}: ${stringifyScalar(value)}`;
166
+ }
167
+ function stringifyToml(attributes) {
168
+ const lines = [];
169
+ for (const [key, value] of Object.entries(attributes)) {
170
+ if (value && typeof value === "object" && !Array.isArray(value)) {
171
+ lines.push(`[${key}]`);
172
+ for (const [childKey, childValue] of Object.entries(value)) {
173
+ lines.push(`${childKey} = ${stringifyTomlScalar(childValue)}`);
174
+ }
175
+ }
176
+ else {
177
+ lines.push(`${key} = ${stringifyTomlScalar(value)}`);
178
+ }
179
+ }
180
+ return lines.join("\n");
181
+ }
182
+ function stringifyTomlScalar(value) {
183
+ if (typeof value === "string") {
184
+ return JSON.stringify(value);
185
+ }
186
+ if (Array.isArray(value)) {
187
+ return `[${value.map(stringifyTomlScalar).join(", ")}]`;
188
+ }
189
+ return stringifyScalar(value);
190
+ }
191
+ function setPathValue(target, path, value) {
192
+ setSegmentsValue(target, path.split("."), value);
193
+ }
194
+ function setSegmentsValue(target, segments, value) {
195
+ let current = target;
196
+ segments.forEach((segment, index) => {
197
+ if (index === segments.length - 1) {
198
+ current[segment] = value;
199
+ return;
200
+ }
201
+ const next = current[segment];
202
+ if (!isPlainObject(next)) {
203
+ current[segment] = {};
204
+ }
205
+ current = current[segment];
206
+ });
207
+ }
208
+ function isIgnorable(line) {
209
+ const trimmed = line.trim();
210
+ return trimmed === "" || trimmed.startsWith("#");
211
+ }
212
+ function isPlainObject(value) {
213
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
214
+ }
215
+ //# sourceMappingURL=languages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"languages.js","sourceRoot":"","sources":["../src/languages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { FrontmatterPosition, FrontmatterRange } from "./types.js";
2
+ export declare function createLineIndex(source: string): number[];
3
+ export declare function positionAt(offset: number, lineStarts: readonly number[]): FrontmatterPosition;
4
+ export declare function rangeAt(start: number, end: number, lineStarts: readonly number[]): FrontmatterRange;
5
+ //# sourceMappingURL=position.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"position.d.ts","sourceRoot":"","sources":["../src/position.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAExE,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAUxD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,mBAAmB,CA2B7F;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,gBAAgB,CAKnG"}
@@ -0,0 +1,43 @@
1
+ export function createLineIndex(source) {
2
+ const starts = [0];
3
+ for (let index = 0; index < source.length; index += 1) {
4
+ if (source[index] === "\n") {
5
+ starts.push(index + 1);
6
+ }
7
+ }
8
+ return starts;
9
+ }
10
+ export function positionAt(offset, lineStarts) {
11
+ let low = 0;
12
+ let high = lineStarts.length - 1;
13
+ while (low <= high) {
14
+ const middle = Math.floor((low + high) / 2);
15
+ const start = lineStarts[middle] ?? 0;
16
+ const next = lineStarts[middle + 1] ?? Number.POSITIVE_INFINITY;
17
+ if (offset < start) {
18
+ high = middle - 1;
19
+ }
20
+ else if (offset >= next) {
21
+ low = middle + 1;
22
+ }
23
+ else {
24
+ return {
25
+ offset,
26
+ line: middle + 1,
27
+ column: offset - start + 1
28
+ };
29
+ }
30
+ }
31
+ return {
32
+ offset,
33
+ line: lineStarts.length,
34
+ column: Math.max(1, offset - (lineStarts.at(-1) ?? 0) + 1)
35
+ };
36
+ }
37
+ export function rangeAt(start, end, lineStarts) {
38
+ return {
39
+ start: positionAt(start, lineStarts),
40
+ end: positionAt(end, lineStarts)
41
+ };
42
+ }
43
+ //# sourceMappingURL=position.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"position.js","sourceRoot":"","sources":["../src/position.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAEnB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACtD,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,UAA6B;IACtE,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,IAAI,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IAEjC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,iBAAiB,CAAC;QAEhE,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC;YACnB,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC;QACpB,CAAC;aAAM,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YAC1B,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,MAAM;gBACN,IAAI,EAAE,MAAM,GAAG,CAAC;gBAChB,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,CAAC;aAC3B,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM;QACN,IAAI,EAAE,UAAU,CAAC,MAAM;QACvB,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;KAC3D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa,EAAE,GAAW,EAAE,UAA6B;IAC/E,OAAO;QACL,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC;QACpC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC;KACjC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { FrontmatterDiagnostic, FrontmatterRange, FrontmatterValue } from "./types.js";
2
+ export declare function parseScalar(value: string, diagnostics: FrontmatterDiagnostic[], range?: FrontmatterRange): FrontmatterValue;
3
+ export declare function stringifyScalar(value: FrontmatterValue): string;
4
+ //# sourceMappingURL=scalars.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scalars.d.ts","sourceRoot":"","sources":["../src/scalars.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE5F,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,qBAAqB,EAAE,EAAE,KAAK,CAAC,EAAE,gBAAgB,GAAG,gBAAgB,CAiC3H;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAc/D"}
@@ -0,0 +1,90 @@
1
+ export function parseScalar(value, diagnostics, range) {
2
+ const trimmed = value.trim();
3
+ const lower = trimmed.toLowerCase();
4
+ if (trimmed === "") {
5
+ return "";
6
+ }
7
+ if (lower === "true") {
8
+ return true;
9
+ }
10
+ if (lower === "false") {
11
+ return false;
12
+ }
13
+ if (lower === "null" || trimmed === "~") {
14
+ return null;
15
+ }
16
+ if (isQuoted(trimmed)) {
17
+ return unquote(trimmed, diagnostics, range);
18
+ }
19
+ if (trimmed.startsWith("[") && trimmed.endsWith("]")) {
20
+ return parseInlineArray(trimmed, diagnostics, range);
21
+ }
22
+ if (/^-?(?:0|[1-9]\d*)(?:\.\d+)?$/.test(trimmed)) {
23
+ return Number(trimmed);
24
+ }
25
+ return trimmed;
26
+ }
27
+ export function stringifyScalar(value) {
28
+ if (typeof value === "string") {
29
+ return /^[A-Za-z0-9_./:@-]+(?: [A-Za-z0-9_./:@-]+)*$/.test(value) ? value : JSON.stringify(value);
30
+ }
31
+ if (Array.isArray(value)) {
32
+ return `[${value.map(stringifyScalar).join(", ")}]`;
33
+ }
34
+ if (value && typeof value === "object") {
35
+ return JSON.stringify(value);
36
+ }
37
+ return String(value);
38
+ }
39
+ function parseInlineArray(value, diagnostics, range) {
40
+ const content = value.slice(1, -1).trim();
41
+ if (!content) {
42
+ return [];
43
+ }
44
+ return splitCommaSeparated(content).map((item) => parseScalar(item, diagnostics, range));
45
+ }
46
+ function splitCommaSeparated(value) {
47
+ const items = [];
48
+ let current = "";
49
+ let quote;
50
+ for (let index = 0; index < value.length; index += 1) {
51
+ const char = value[index] ?? "";
52
+ const previous = value[index - 1];
53
+ if ((char === '"' || char === "'") && previous !== "\\") {
54
+ quote = quote === char ? undefined : quote ?? char;
55
+ current += char;
56
+ continue;
57
+ }
58
+ if (char === "," && !quote) {
59
+ items.push(current.trim());
60
+ current = "";
61
+ continue;
62
+ }
63
+ current += char;
64
+ }
65
+ if (current.trim() !== "") {
66
+ items.push(current.trim());
67
+ }
68
+ return items;
69
+ }
70
+ function isQuoted(value) {
71
+ return (value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"));
72
+ }
73
+ function unquote(value, diagnostics, range) {
74
+ if (value.startsWith("'")) {
75
+ return value.slice(1, -1);
76
+ }
77
+ try {
78
+ return JSON.parse(value);
79
+ }
80
+ catch {
81
+ diagnostics.push({
82
+ code: "INVALID_QUOTED_STRING",
83
+ severity: "warning",
84
+ message: "Quoted string could not be decoded; raw content was kept.",
85
+ range
86
+ });
87
+ return value.slice(1, -1);
88
+ }
89
+ }
90
+ //# sourceMappingURL=scalars.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scalars.js","sourceRoot":"","sources":["../src/scalars.ts"],"names":[],"mappings":"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"}