@navbook/cli 0.1.2 → 0.2.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/commands/complete.js +124 -0
- package/dist/commands/complete.js.map +1 -0
- package/dist/{cli/commands → commands}/compose.js +5 -3
- package/dist/commands/compose.js.map +1 -0
- package/dist/commands/doctor.js +56 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/entity.js +235 -0
- package/dist/commands/entity.js.map +1 -0
- package/dist/commands/feature.js +202 -0
- package/dist/commands/feature.js.map +1 -0
- package/dist/commands/init.js +23 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/{cli/commands → commands}/install.js +1 -2
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/issue.js +89 -0
- package/dist/commands/issue.js.map +1 -0
- package/dist/commands/policy.js +49 -0
- package/dist/commands/policy.js.map +1 -0
- package/dist/commands/pr.js +262 -0
- package/dist/commands/pr.js.map +1 -0
- package/dist/context.js +21 -0
- package/dist/context.js.map +1 -0
- package/dist/{cli/editor.js → editor.js} +1 -1
- package/dist/editor.js.map +1 -0
- package/dist/errors.js.map +1 -0
- package/dist/install/completions.js.map +1 -0
- package/dist/{cli/install → install}/hook.js +1 -1
- package/dist/install/hook.js.map +1 -0
- package/dist/{cli/main.js → main.js} +10 -0
- package/dist/main.js.map +1 -0
- package/dist/{cli/program.js → program.js} +161 -23
- package/dist/program.js.map +1 -0
- package/dist/{cli/prompt.js → prompt.js} +11 -0
- package/dist/prompt.js.map +1 -0
- package/dist/render/colors.js.map +1 -0
- package/dist/render/detail.js +197 -0
- package/dist/render/detail.js.map +1 -0
- package/dist/render/table.js.map +1 -0
- package/dist/sort.js +77 -0
- package/dist/sort.js.map +1 -0
- package/package.json +15 -21
- package/README.md +0 -165
- package/dist/cli/commands/complete.d.ts +0 -9
- package/dist/cli/commands/complete.js +0 -72
- package/dist/cli/commands/complete.js.map +0 -1
- package/dist/cli/commands/compose.d.ts +0 -27
- package/dist/cli/commands/compose.js.map +0 -1
- package/dist/cli/commands/doctor.d.ts +0 -14
- package/dist/cli/commands/doctor.js +0 -127
- package/dist/cli/commands/doctor.js.map +0 -1
- package/dist/cli/commands/entity.d.ts +0 -55
- package/dist/cli/commands/entity.js +0 -209
- package/dist/cli/commands/entity.js.map +0 -1
- package/dist/cli/commands/init.d.ts +0 -11
- package/dist/cli/commands/init.js +0 -39
- package/dist/cli/commands/init.js.map +0 -1
- package/dist/cli/commands/install.d.ts +0 -17
- package/dist/cli/commands/install.js.map +0 -1
- package/dist/cli/commands/issue.d.ts +0 -12
- package/dist/cli/commands/issue.js +0 -42
- package/dist/cli/commands/issue.js.map +0 -1
- package/dist/cli/commands/pr.d.ts +0 -64
- package/dist/cli/commands/pr.js +0 -466
- package/dist/cli/commands/pr.js.map +0 -1
- package/dist/cli/commit-flow.d.ts +0 -27
- package/dist/cli/commit-flow.js +0 -47
- package/dist/cli/commit-flow.js.map +0 -1
- package/dist/cli/context.d.ts +0 -39
- package/dist/cli/context.js +0 -93
- package/dist/cli/context.js.map +0 -1
- package/dist/cli/editor.d.ts +0 -23
- package/dist/cli/editor.js.map +0 -1
- package/dist/cli/errors.d.ts +0 -17
- package/dist/cli/errors.js.map +0 -1
- package/dist/cli/history-checks.d.ts +0 -21
- package/dist/cli/history-checks.js +0 -134
- package/dist/cli/history-checks.js.map +0 -1
- package/dist/cli/install/completions.d.ts +0 -19
- package/dist/cli/install/completions.js.map +0 -1
- package/dist/cli/install/hook.d.ts +0 -20
- package/dist/cli/install/hook.js.map +0 -1
- package/dist/cli/main.d.ts +0 -14
- package/dist/cli/main.js.map +0 -1
- package/dist/cli/program.d.ts +0 -23
- package/dist/cli/program.js.map +0 -1
- package/dist/cli/prompt.d.ts +0 -22
- package/dist/cli/prompt.js.map +0 -1
- package/dist/cli/render/colors.d.ts +0 -13
- package/dist/cli/render/colors.js.map +0 -1
- package/dist/cli/render/detail.d.ts +0 -10
- package/dist/cli/render/detail.js +0 -105
- package/dist/cli/render/detail.js.map +0 -1
- package/dist/cli/render/table.d.ts +0 -19
- package/dist/cli/render/table.js.map +0 -1
- package/dist/cli/resolve.d.ts +0 -17
- package/dist/cli/resolve.js +0 -68
- package/dist/cli/resolve.js.map +0 -1
- package/dist/cli/workspace.d.ts +0 -52
- package/dist/cli/workspace.js +0 -178
- package/dist/cli/workspace.js.map +0 -1
- package/dist/core/comments.d.ts +0 -31
- package/dist/core/comments.js +0 -80
- package/dist/core/comments.js.map +0 -1
- package/dist/core/files.d.ts +0 -88
- package/dist/core/files.js +0 -441
- package/dist/core/files.js.map +0 -1
- package/dist/core/frontmatter.d.ts +0 -63
- package/dist/core/frontmatter.js +0 -149
- package/dist/core/frontmatter.js.map +0 -1
- package/dist/core/id.d.ts +0 -46
- package/dist/core/id.js +0 -66
- package/dist/core/id.js.map +0 -1
- package/dist/core/index.d.ts +0 -19
- package/dist/core/index.js +0 -20
- package/dist/core/index.js.map +0 -1
- package/dist/core/json.d.ts +0 -18
- package/dist/core/json.js +0 -51
- package/dist/core/json.js.map +0 -1
- package/dist/core/ops.d.ts +0 -92
- package/dist/core/ops.js +0 -173
- package/dist/core/ops.js.map +0 -1
- package/dist/core/person.d.ts +0 -20
- package/dist/core/person.js +0 -50
- package/dist/core/person.js.map +0 -1
- package/dist/core/query.d.ts +0 -30
- package/dist/core/query.js +0 -106
- package/dist/core/query.js.map +0 -1
- package/dist/core/refs.d.ts +0 -12
- package/dist/core/refs.js +0 -36
- package/dist/core/refs.js.map +0 -1
- package/dist/core/slug.d.ts +0 -22
- package/dist/core/slug.js +0 -40
- package/dist/core/slug.js.map +0 -1
- package/dist/core/time.d.ts +0 -14
- package/dist/core/time.js +0 -37
- package/dist/core/time.js.map +0 -1
- package/dist/core/tree.d.ts +0 -94
- package/dist/core/tree.js +0 -237
- package/dist/core/tree.js.map +0 -1
- package/dist/core/validate.d.ts +0 -55
- package/dist/core/validate.js +0 -312
- package/dist/core/validate.js.map +0 -1
- package/dist/git/config.d.ts +0 -12
- package/dist/git/config.js +0 -27
- package/dist/git/config.js.map +0 -1
- package/dist/git/exec.d.ts +0 -35
- package/dist/git/exec.js +0 -58
- package/dist/git/exec.js.map +0 -1
- package/dist/git/history.d.ts +0 -35
- package/dist/git/history.js +0 -82
- package/dist/git/history.js.map +0 -1
- package/dist/git/index-ops.d.ts +0 -20
- package/dist/git/index-ops.js +0 -45
- package/dist/git/index-ops.js.map +0 -1
- package/dist/git/merge.d.ts +0 -27
- package/dist/git/merge.js +0 -57
- package/dist/git/merge.js.map +0 -1
- package/dist/git/refscan.d.ts +0 -32
- package/dist/git/refscan.js +0 -82
- package/dist/git/refscan.js.map +0 -1
- package/dist/git/repo.d.ts +0 -45
- package/dist/git/repo.js +0 -95
- package/dist/git/repo.js.map +0 -1
- /package/dist/{cli/errors.js → errors.js} +0 -0
- /package/dist/{cli/install → install}/completions.js +0 -0
- /package/dist/{cli/render → render}/colors.js +0 -0
- /package/dist/{cli/render → render}/table.js +0 -0
package/dist/core/files.js
DELETED
|
@@ -1,441 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The three Navbook file kinds — spec 02 §2.5 (`issue.md`), §2.6 (comments and
|
|
3
|
-
* reviews) and §2.7 (`pr.md`): parsing, validation, and construction.
|
|
4
|
-
*
|
|
5
|
-
* Parsing never throws on schema problems; it collects them so `nav doctor` can
|
|
6
|
-
* report every fault in a file at once.
|
|
7
|
-
*
|
|
8
|
-
* Frontmatter is normalized once, at parse time: keys whose spec type is a
|
|
9
|
-
* string (or a list/map of strings) are read from the scalar's source text, so
|
|
10
|
-
* a hand-written all-digit commit SHA — which YAML would resolve to a lossy
|
|
11
|
-
* number — still round-trips as the forty characters the author typed.
|
|
12
|
-
*/
|
|
13
|
-
import { emptyDoc, hasKey, keysInOrder, parseDoc, patchDoc, seqLength, serializeDoc, setFlowList, stringAt, toPlain, } from "./frontmatter.js";
|
|
14
|
-
import { isId } from "./id.js";
|
|
15
|
-
import { formatPerson, parsePerson } from "./person.js";
|
|
16
|
-
import { parseIso } from "./time.js";
|
|
17
|
-
export const SHA_PATTERN = /^[0-9a-f]{40}$/;
|
|
18
|
-
export const VERDICTS = ["approve", "request-changes"];
|
|
19
|
-
/** Keys whose spec type is a single string-ish scalar. */
|
|
20
|
-
const STRING_KEYS = [
|
|
21
|
-
"title",
|
|
22
|
-
"author",
|
|
23
|
-
"created",
|
|
24
|
-
"target",
|
|
25
|
-
"source",
|
|
26
|
-
"milestone",
|
|
27
|
-
"resolution",
|
|
28
|
-
"duplicate-of",
|
|
29
|
-
"superseded-by",
|
|
30
|
-
"reply-to",
|
|
31
|
-
"verdict",
|
|
32
|
-
"revision",
|
|
33
|
-
"file",
|
|
34
|
-
"imported-from",
|
|
35
|
-
"imported-at",
|
|
36
|
-
"signature",
|
|
37
|
-
];
|
|
38
|
-
/** Parse any Navbook file; frontmatter faults surface as problems, not throws. */
|
|
39
|
-
export function parseFile(text) {
|
|
40
|
-
const nav = parseDoc(text);
|
|
41
|
-
const problems = nav.errors.map((message) => ({
|
|
42
|
-
message: `invalid YAML: ${message}`,
|
|
43
|
-
}));
|
|
44
|
-
// One conversion out of the YAML document, shared by both views of it.
|
|
45
|
-
const raw = toPlain(nav);
|
|
46
|
-
return { nav, fm: normalizeFrontmatter(nav, raw), raw, body: nav.body, problems };
|
|
47
|
-
}
|
|
48
|
-
/** Coerce spec-typed frontmatter keys; leave unknown keys exactly as parsed. */
|
|
49
|
-
export function normalizeFrontmatter(nav, parsed) {
|
|
50
|
-
const raw = parsed ?? toPlain(nav);
|
|
51
|
-
const out = {};
|
|
52
|
-
for (const key of keysInOrder(nav)) {
|
|
53
|
-
if (key === "")
|
|
54
|
-
continue;
|
|
55
|
-
out[key] = normalizeKey(nav, key, raw[key]);
|
|
56
|
-
}
|
|
57
|
-
return out;
|
|
58
|
-
}
|
|
59
|
-
function normalizeKey(nav, key, rawValue) {
|
|
60
|
-
if (STRING_KEYS.includes(key)) {
|
|
61
|
-
return stringAt(nav, [key]) ?? rawValue;
|
|
62
|
-
}
|
|
63
|
-
if (key === "labels")
|
|
64
|
-
return normalizeStringList(nav, key, rawValue);
|
|
65
|
-
if (key === "assignee") {
|
|
66
|
-
return Array.isArray(rawValue)
|
|
67
|
-
? normalizeStringList(nav, key, rawValue)
|
|
68
|
-
: (stringAt(nav, [key]) ?? rawValue);
|
|
69
|
-
}
|
|
70
|
-
if (key === "revisions")
|
|
71
|
-
return normalizeRevisions(nav, rawValue);
|
|
72
|
-
if (key === "merged")
|
|
73
|
-
return normalizeMerged(nav, rawValue);
|
|
74
|
-
return rawValue;
|
|
75
|
-
}
|
|
76
|
-
function normalizeStringList(nav, key, rawValue) {
|
|
77
|
-
const length = seqLength(nav, [key]);
|
|
78
|
-
if (length === null || !Array.isArray(rawValue))
|
|
79
|
-
return rawValue;
|
|
80
|
-
return rawValue.map((item, index) => stringAt(nav, [key, index]) ?? item);
|
|
81
|
-
}
|
|
82
|
-
function normalizeRevisions(nav, rawValue) {
|
|
83
|
-
if (seqLength(nav, ["revisions"]) === null || !Array.isArray(rawValue))
|
|
84
|
-
return rawValue;
|
|
85
|
-
return rawValue.map((item, index) => {
|
|
86
|
-
if (!isPlainObject(item))
|
|
87
|
-
return item;
|
|
88
|
-
const out = { ...item };
|
|
89
|
-
for (const field of ["head", "base", "date"]) {
|
|
90
|
-
if (out[field] === undefined)
|
|
91
|
-
continue;
|
|
92
|
-
out[field] = stringAt(nav, ["revisions", index, field]) ?? out[field];
|
|
93
|
-
}
|
|
94
|
-
return out;
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
function normalizeMerged(nav, rawValue) {
|
|
98
|
-
if (!isPlainObject(rawValue))
|
|
99
|
-
return rawValue;
|
|
100
|
-
const out = { ...rawValue };
|
|
101
|
-
for (const field of ["date", "by", "commit"]) {
|
|
102
|
-
if (out[field] === undefined)
|
|
103
|
-
continue;
|
|
104
|
-
out[field] = stringAt(nav, ["merged", field]) ?? out[field];
|
|
105
|
-
}
|
|
106
|
-
return out;
|
|
107
|
-
}
|
|
108
|
-
function isPlainObject(value) {
|
|
109
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
110
|
-
}
|
|
111
|
-
/* ------------------------------------------------------------------ helpers */
|
|
112
|
-
function requireString(parsed, key, problems) {
|
|
113
|
-
const value = parsed.fm[key];
|
|
114
|
-
if (value === undefined || value === null) {
|
|
115
|
-
if (hasKey(parsed.nav, key)) {
|
|
116
|
-
problems.push({ key, message: `'${key}' must be a non-empty string` });
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
problems.push({ key, message: `missing required key '${key}'` });
|
|
120
|
-
}
|
|
121
|
-
return null;
|
|
122
|
-
}
|
|
123
|
-
if (typeof value !== "string" || value.trim() === "") {
|
|
124
|
-
problems.push({ key, message: `'${key}' must be a non-empty string` });
|
|
125
|
-
return null;
|
|
126
|
-
}
|
|
127
|
-
return value;
|
|
128
|
-
}
|
|
129
|
-
function checkOptionalString(parsed, key, problems) {
|
|
130
|
-
const value = parsed.fm[key];
|
|
131
|
-
if (value === undefined || value === null)
|
|
132
|
-
return;
|
|
133
|
-
if (typeof value !== "string" || value.trim() === "") {
|
|
134
|
-
problems.push({ key, message: `'${key}' must be a non-empty string` });
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
function checkPerson(parsed, key, problems) {
|
|
138
|
-
const value = requireString(parsed, key, problems);
|
|
139
|
-
if (value === null)
|
|
140
|
-
return;
|
|
141
|
-
if (!parsePerson(value)) {
|
|
142
|
-
problems.push({
|
|
143
|
-
key,
|
|
144
|
-
message: `'${key}' must be an RFC 5322 address, got ${JSON.stringify(value)}`,
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
function checkTimestamp(parsed, key, problems) {
|
|
149
|
-
const value = requireString(parsed, key, problems);
|
|
150
|
-
if (value === null)
|
|
151
|
-
return;
|
|
152
|
-
if (!parseIso(value)) {
|
|
153
|
-
problems.push({
|
|
154
|
-
key,
|
|
155
|
-
message: `'${key}' must be an ISO 8601 timestamp, got ${JSON.stringify(value)}`,
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
function checkLabels(parsed, problems) {
|
|
160
|
-
const value = parsed.fm.labels;
|
|
161
|
-
if (value === undefined || value === null)
|
|
162
|
-
return;
|
|
163
|
-
if (!Array.isArray(value) || value.some((v) => typeof v !== "string" || v.trim() === "")) {
|
|
164
|
-
problems.push({ key: "labels", message: "'labels' must be a list of non-empty strings" });
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
function checkAssignee(parsed, problems) {
|
|
168
|
-
const value = parsed.fm.assignee;
|
|
169
|
-
if (value === undefined || value === null)
|
|
170
|
-
return;
|
|
171
|
-
const entries = Array.isArray(value) ? value : [value];
|
|
172
|
-
if (entries.length === 0) {
|
|
173
|
-
problems.push({ key: "assignee", message: "'assignee' must be a person or list of persons" });
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
for (const entry of entries) {
|
|
177
|
-
if (typeof entry !== "string" || !parsePerson(entry)) {
|
|
178
|
-
problems.push({ key: "assignee", message: "'assignee' must be a person or list of persons" });
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
function checkIdReference(parsed, key, problems) {
|
|
184
|
-
const value = parsed.fm[key];
|
|
185
|
-
if (value === undefined || value === null)
|
|
186
|
-
return;
|
|
187
|
-
if (typeof value !== "string" || !isId(value)) {
|
|
188
|
-
problems.push({ key, message: `'${key}' must be a Navbook ID` });
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
function checkNoStatusKey(parsed, problems) {
|
|
192
|
-
if (hasKey(parsed.nav, "status")) {
|
|
193
|
-
problems.push({
|
|
194
|
-
key: "status",
|
|
195
|
-
message: "entity files must not carry a 'status' key; status is the path (§2.1)",
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
/** Read `labels` defensively, ignoring malformed entries. */
|
|
200
|
-
export function readLabels(fm) {
|
|
201
|
-
const value = fm.labels;
|
|
202
|
-
if (!Array.isArray(value))
|
|
203
|
-
return [];
|
|
204
|
-
return value.filter((v) => typeof v === "string");
|
|
205
|
-
}
|
|
206
|
-
/** Read `assignee` (scalar or list) defensively. */
|
|
207
|
-
export function readAssignees(fm) {
|
|
208
|
-
const value = fm.assignee;
|
|
209
|
-
if (value === undefined || value === null)
|
|
210
|
-
return [];
|
|
211
|
-
const entries = Array.isArray(value) ? value : [value];
|
|
212
|
-
return entries.filter((v) => typeof v === "string");
|
|
213
|
-
}
|
|
214
|
-
/** Read `revisions` defensively, keeping only well-formed entries. */
|
|
215
|
-
export function readRevisions(fm) {
|
|
216
|
-
const value = fm.revisions;
|
|
217
|
-
if (!Array.isArray(value))
|
|
218
|
-
return [];
|
|
219
|
-
const out = [];
|
|
220
|
-
for (const entry of value) {
|
|
221
|
-
if (!isPlainObject(entry))
|
|
222
|
-
continue;
|
|
223
|
-
if (typeof entry.head === "string" &&
|
|
224
|
-
typeof entry.base === "string" &&
|
|
225
|
-
typeof entry.date === "string") {
|
|
226
|
-
out.push({ head: entry.head, base: entry.base, date: entry.date });
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
return out;
|
|
230
|
-
}
|
|
231
|
-
/** Read the `merged:` block defensively. */
|
|
232
|
-
export function readMerged(fm) {
|
|
233
|
-
return isPlainObject(fm.merged) ? fm.merged : null;
|
|
234
|
-
}
|
|
235
|
-
/* --------------------------------------------------------------- validation */
|
|
236
|
-
/** Validate an `issue.md` (§2.5). */
|
|
237
|
-
export function validateIssue(parsed) {
|
|
238
|
-
const problems = [...parsed.problems];
|
|
239
|
-
requireString(parsed, "title", problems);
|
|
240
|
-
checkPerson(parsed, "author", problems);
|
|
241
|
-
checkTimestamp(parsed, "created", problems);
|
|
242
|
-
checkLabels(parsed, problems);
|
|
243
|
-
checkAssignee(parsed, problems);
|
|
244
|
-
checkOptionalString(parsed, "milestone", problems);
|
|
245
|
-
checkOptionalString(parsed, "resolution", problems);
|
|
246
|
-
checkIdReference(parsed, "duplicate-of", problems);
|
|
247
|
-
checkNoStatusKey(parsed, problems);
|
|
248
|
-
if (parsed.body.trim() === "") {
|
|
249
|
-
problems.push({ message: "issue description must not be empty (§2.5)" });
|
|
250
|
-
}
|
|
251
|
-
return problems;
|
|
252
|
-
}
|
|
253
|
-
/** Validate a `pr.md` (§2.7). */
|
|
254
|
-
export function validatePr(parsed) {
|
|
255
|
-
const problems = [...parsed.problems];
|
|
256
|
-
requireString(parsed, "title", problems);
|
|
257
|
-
checkPerson(parsed, "author", problems);
|
|
258
|
-
checkTimestamp(parsed, "created", problems);
|
|
259
|
-
requireString(parsed, "target", problems);
|
|
260
|
-
checkOptionalString(parsed, "source", problems);
|
|
261
|
-
checkLabels(parsed, problems);
|
|
262
|
-
checkAssignee(parsed, problems);
|
|
263
|
-
checkOptionalString(parsed, "milestone", problems);
|
|
264
|
-
checkOptionalString(parsed, "resolution", problems);
|
|
265
|
-
checkIdReference(parsed, "superseded-by", problems);
|
|
266
|
-
checkNoStatusKey(parsed, problems);
|
|
267
|
-
if (parsed.fm.draft !== undefined && typeof parsed.fm.draft !== "boolean") {
|
|
268
|
-
problems.push({ key: "draft", message: "'draft' must be a boolean" });
|
|
269
|
-
}
|
|
270
|
-
validateRevisions(parsed, problems);
|
|
271
|
-
validateMergedBlock(parsed, problems);
|
|
272
|
-
return problems;
|
|
273
|
-
}
|
|
274
|
-
function validateRevisions(parsed, problems) {
|
|
275
|
-
const value = parsed.fm.revisions;
|
|
276
|
-
if (!Array.isArray(value) || value.length === 0) {
|
|
277
|
-
problems.push({
|
|
278
|
-
key: "revisions",
|
|
279
|
-
message: "'revisions' must be a list with at least one entry (§2.7)",
|
|
280
|
-
});
|
|
281
|
-
return;
|
|
282
|
-
}
|
|
283
|
-
value.forEach((entry, index) => {
|
|
284
|
-
const where = `revisions[${index}]`;
|
|
285
|
-
if (!isPlainObject(entry)) {
|
|
286
|
-
problems.push({ key: "revisions", message: `${where} must be a map` });
|
|
287
|
-
return;
|
|
288
|
-
}
|
|
289
|
-
for (const field of ["head", "base"]) {
|
|
290
|
-
const sha = entry[field];
|
|
291
|
-
if (typeof sha !== "string" || !SHA_PATTERN.test(sha)) {
|
|
292
|
-
problems.push({
|
|
293
|
-
key: "revisions",
|
|
294
|
-
message: `${where}.${field} must be a 40-hex commit SHA`,
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
if (typeof entry.date !== "string" || !parseIso(entry.date)) {
|
|
299
|
-
problems.push({ key: "revisions", message: `${where}.date must be an ISO 8601 timestamp` });
|
|
300
|
-
}
|
|
301
|
-
});
|
|
302
|
-
}
|
|
303
|
-
function validateMergedBlock(parsed, problems) {
|
|
304
|
-
const value = parsed.fm.merged;
|
|
305
|
-
if (value === undefined || value === null)
|
|
306
|
-
return;
|
|
307
|
-
if (!isPlainObject(value)) {
|
|
308
|
-
problems.push({ key: "merged", message: "'merged' must be a map of date, by and commit" });
|
|
309
|
-
return;
|
|
310
|
-
}
|
|
311
|
-
if (value.date !== undefined && (typeof value.date !== "string" || !parseIso(value.date))) {
|
|
312
|
-
problems.push({ key: "merged", message: "'merged.date' must be an ISO 8601 timestamp" });
|
|
313
|
-
}
|
|
314
|
-
if (value.by !== undefined && (typeof value.by !== "string" || !parsePerson(value.by))) {
|
|
315
|
-
problems.push({ key: "merged", message: "'merged.by' must be an RFC 5322 address" });
|
|
316
|
-
}
|
|
317
|
-
if (value.commit !== undefined &&
|
|
318
|
-
(typeof value.commit !== "string" || !SHA_PATTERN.test(value.commit))) {
|
|
319
|
-
problems.push({ key: "merged", message: "'merged.commit' must be a 40-hex commit SHA" });
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
/** Validate a comment file (§2.6), including the optional review fields. */
|
|
323
|
-
export function validateComment(parsed, opts) {
|
|
324
|
-
const problems = [...parsed.problems];
|
|
325
|
-
const { fm } = parsed;
|
|
326
|
-
checkPerson(parsed, "author", problems);
|
|
327
|
-
checkIdReference(parsed, "reply-to", problems);
|
|
328
|
-
const hasVerdict = fm.verdict !== undefined && fm.verdict !== null;
|
|
329
|
-
const hasFile = fm.file !== undefined && fm.file !== null;
|
|
330
|
-
if (hasVerdict && !VERDICTS.includes(fm.verdict)) {
|
|
331
|
-
problems.push({ key: "verdict", message: `'verdict' must be one of ${VERDICTS.join(" | ")}` });
|
|
332
|
-
}
|
|
333
|
-
if (hasFile && (typeof fm.file !== "string" || fm.file.trim() === "")) {
|
|
334
|
-
problems.push({ key: "file", message: "'file' must be a repository-relative path" });
|
|
335
|
-
}
|
|
336
|
-
if (fm.line !== undefined && fm.line !== null && !isValidLine(fm.line)) {
|
|
337
|
-
problems.push({ key: "line", message: "'line' must be an integer or a 'start-end' range" });
|
|
338
|
-
}
|
|
339
|
-
if (hasVerdict || hasFile) {
|
|
340
|
-
if (typeof fm.revision !== "string" || !SHA_PATTERN.test(fm.revision)) {
|
|
341
|
-
problems.push({
|
|
342
|
-
key: "revision",
|
|
343
|
-
message: "'revision' (40-hex SHA) is required when 'verdict' or 'file' is present (§2.6)",
|
|
344
|
-
});
|
|
345
|
-
}
|
|
346
|
-
if (!opts.onPr) {
|
|
347
|
-
problems.push({
|
|
348
|
-
message: "review fields are only meaningful on pull-request comments (§2.6)",
|
|
349
|
-
});
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
else if (fm.revision !== undefined && fm.revision !== null) {
|
|
353
|
-
if (typeof fm.revision !== "string" || !SHA_PATTERN.test(fm.revision)) {
|
|
354
|
-
problems.push({ key: "revision", message: "'revision' must be a 40-hex commit SHA" });
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
return problems;
|
|
358
|
-
}
|
|
359
|
-
function isValidLine(value) {
|
|
360
|
-
if (typeof value === "number")
|
|
361
|
-
return Number.isInteger(value) && value > 0;
|
|
362
|
-
if (typeof value !== "string")
|
|
363
|
-
return false;
|
|
364
|
-
const match = /^(\d+)(?:-(\d+))?$/.exec(value.trim());
|
|
365
|
-
if (!match)
|
|
366
|
-
return false;
|
|
367
|
-
const start = Number(match[1]);
|
|
368
|
-
if (start <= 0)
|
|
369
|
-
return false;
|
|
370
|
-
if (match[2] === undefined)
|
|
371
|
-
return true;
|
|
372
|
-
return Number(match[2]) >= start;
|
|
373
|
-
}
|
|
374
|
-
/** Render a new `issue.md`. */
|
|
375
|
-
export function newIssueFile(input) {
|
|
376
|
-
const nav = emptyDoc();
|
|
377
|
-
patchDoc(nav, { title: input.title, author: input.author, created: input.created });
|
|
378
|
-
applyOptionalMeta(nav, input);
|
|
379
|
-
nav.body = `\n${normalizeBody(input.body)}`;
|
|
380
|
-
return serializeDoc(nav);
|
|
381
|
-
}
|
|
382
|
-
/** Render a new `pr.md`. */
|
|
383
|
-
export function newPrFile(input) {
|
|
384
|
-
const nav = emptyDoc();
|
|
385
|
-
patchDoc(nav, {
|
|
386
|
-
title: input.title,
|
|
387
|
-
author: input.author,
|
|
388
|
-
created: input.created,
|
|
389
|
-
target: input.target,
|
|
390
|
-
source: input.source,
|
|
391
|
-
});
|
|
392
|
-
if (input.draft)
|
|
393
|
-
patchDoc(nav, { draft: true });
|
|
394
|
-
applyOptionalMeta(nav, input);
|
|
395
|
-
patchDoc(nav, { revisions: input.revisions });
|
|
396
|
-
nav.body = `\n${normalizeBody(input.body)}`;
|
|
397
|
-
return serializeDoc(nav);
|
|
398
|
-
}
|
|
399
|
-
function applyOptionalMeta(nav, input) {
|
|
400
|
-
if (input.labels?.length)
|
|
401
|
-
setFlowList(nav, "labels", input.labels);
|
|
402
|
-
if (input.assignee?.length) {
|
|
403
|
-
if (input.assignee.length === 1)
|
|
404
|
-
patchDoc(nav, { assignee: input.assignee[0] });
|
|
405
|
-
else
|
|
406
|
-
setFlowList(nav, "assignee", input.assignee);
|
|
407
|
-
}
|
|
408
|
-
if (input.milestone)
|
|
409
|
-
patchDoc(nav, { milestone: input.milestone });
|
|
410
|
-
}
|
|
411
|
-
/** Render a new comment or review file. */
|
|
412
|
-
export function newCommentFile(input) {
|
|
413
|
-
const nav = emptyDoc();
|
|
414
|
-
patchDoc(nav, { author: input.author });
|
|
415
|
-
if (input.replyTo)
|
|
416
|
-
patchDoc(nav, { "reply-to": input.replyTo });
|
|
417
|
-
if (input.verdict)
|
|
418
|
-
patchDoc(nav, { verdict: input.verdict });
|
|
419
|
-
if (input.revision)
|
|
420
|
-
patchDoc(nav, { revision: input.revision });
|
|
421
|
-
if (input.file)
|
|
422
|
-
patchDoc(nav, { file: input.file });
|
|
423
|
-
if (input.line)
|
|
424
|
-
patchDoc(nav, { line: normalizeLine(input.line) });
|
|
425
|
-
nav.body = `\n${normalizeBody(input.body)}`;
|
|
426
|
-
return serializeDoc(nav);
|
|
427
|
-
}
|
|
428
|
-
function normalizeLine(line) {
|
|
429
|
-
const trimmed = line.trim();
|
|
430
|
-
return /^\d+$/.test(trimmed) ? Number(trimmed) : trimmed;
|
|
431
|
-
}
|
|
432
|
-
/** Trim trailing whitespace and guarantee exactly one closing newline. */
|
|
433
|
-
export function normalizeBody(body) {
|
|
434
|
-
const trimmed = body.replace(/\s+$/, "");
|
|
435
|
-
return trimmed === "" ? "" : `${trimmed}\n`;
|
|
436
|
-
}
|
|
437
|
-
/** Format a person for frontmatter, falling back to the bare address. */
|
|
438
|
-
export function formatAuthor(name, email) {
|
|
439
|
-
return formatPerson(name ? { name, email } : { email });
|
|
440
|
-
}
|
|
441
|
-
//# sourceMappingURL=files.js.map
|
package/dist/core/files.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/core/files.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* YAML frontmatter — spec 02 §2.4.
|
|
3
|
-
*
|
|
4
|
-
* Every Navbook file is UTF-8 Markdown that begins, at byte 0, with a `---`
|
|
5
|
-
* delimited YAML block. Unknown keys MUST be preserved when a tool rewrites a
|
|
6
|
-
* file, so this module is built on the `yaml` package's Document API (which
|
|
7
|
-
* keeps key order and comments) and additionally replays the original YAML text
|
|
8
|
-
* verbatim whenever nothing was actually changed.
|
|
9
|
-
*/
|
|
10
|
-
import { Document } from "yaml";
|
|
11
|
-
export interface NavDoc {
|
|
12
|
-
/** Mutable YAML document; only ever written through {@link patchDoc}. */
|
|
13
|
-
doc: Document;
|
|
14
|
-
/** Original YAML source between the delimiters, replayed while `dirty` is false. */
|
|
15
|
-
rawYaml: string;
|
|
16
|
-
/** Everything after the closing delimiter line, byte for byte. */
|
|
17
|
-
body: string;
|
|
18
|
-
dirty: boolean;
|
|
19
|
-
/** Parse errors reported by the YAML parser, if any. */
|
|
20
|
-
errors: string[];
|
|
21
|
-
}
|
|
22
|
-
export declare class FrontmatterError extends Error {
|
|
23
|
-
}
|
|
24
|
-
/** Split a Navbook file into its YAML block and its body. */
|
|
25
|
-
export declare function splitFrontmatter(text: string): {
|
|
26
|
-
yaml: string;
|
|
27
|
-
body: string;
|
|
28
|
-
};
|
|
29
|
-
/** Parse a Navbook file into a {@link NavDoc}. Throws only on a missing block. */
|
|
30
|
-
export declare function parseDoc(text: string): NavDoc;
|
|
31
|
-
/** Build a fresh document with no keys and an empty body. */
|
|
32
|
-
export declare function emptyDoc(): NavDoc;
|
|
33
|
-
/** Serialize a {@link NavDoc} back to file text. */
|
|
34
|
-
export declare function serializeDoc(nav: NavDoc): string;
|
|
35
|
-
/** All frontmatter as plain JavaScript values (unknown keys included). */
|
|
36
|
-
export declare function toPlain(nav: NavDoc): Record<string, unknown>;
|
|
37
|
-
/**
|
|
38
|
-
* Read a scalar as the string the author wrote.
|
|
39
|
-
*
|
|
40
|
-
* YAML resolves some strings to other types — an all-digit commit SHA becomes a
|
|
41
|
-
* (lossy) number, `title: 42` becomes an integer. Recovering the scalar's source
|
|
42
|
-
* text keeps those hand-written files usable instead of merely diagnosable.
|
|
43
|
-
*/
|
|
44
|
-
export declare function stringAt(nav: NavDoc, path: readonly (string | number)[]): string | undefined;
|
|
45
|
-
/** Number of items in a sequence at `path`, or null when it is not a sequence. */
|
|
46
|
-
export declare function seqLength(nav: NavDoc, path: readonly (string | number)[]): number | null;
|
|
47
|
-
/** True when the frontmatter has the key at all (even with a null value). */
|
|
48
|
-
export declare function hasKey(nav: NavDoc, key: string): boolean;
|
|
49
|
-
/** Ordered list of frontmatter keys, as they appear in the file. */
|
|
50
|
-
export declare function keysInOrder(nav: NavDoc): string[];
|
|
51
|
-
/**
|
|
52
|
-
* Set or delete frontmatter keys. A value of `undefined` deletes the key; new
|
|
53
|
-
* keys are appended after the existing ones so hand-authored ordering survives.
|
|
54
|
-
*/
|
|
55
|
-
export declare function patchDoc(nav: NavDoc, changes: Record<string, unknown>): NavDoc;
|
|
56
|
-
/**
|
|
57
|
-
* Set a list of plain scalars in flow style (`labels: [bug, auth]`), matching
|
|
58
|
-
* the spec's own examples. Flow scalar sequences are inside the conservative
|
|
59
|
-
* YAML subset of spec 05 §5.3.
|
|
60
|
-
*/
|
|
61
|
-
export declare function setFlowList(nav: NavDoc, key: string, items: string[]): NavDoc;
|
|
62
|
-
/** Append an item to a block-style list, creating the list if necessary. */
|
|
63
|
-
export declare function appendListItem(nav: NavDoc, key: string, item: unknown): NavDoc;
|