(cherry picked from commit367fd0d240) (cherry picked from commit068e1e0f1c)
29 lines
1.3 KiB
JavaScript
29 lines
1.3 KiB
JavaScript
// Errors and the R-rule problems of design 1.3. A problem never holds back a commit: it names a
|
|
// path and, where there is one, a line, and the index leaves the file or link out.
|
|
export class LibraryError extends Error {
|
|
constructor(code, message) { super(`${code}: ${message}`); this.code = code; }
|
|
}
|
|
export const raise = (code, message) => { throw new LibraryError(code, message); };
|
|
|
|
export const RULES = Object.freeze({
|
|
R1: 'not a regular blob up to 1 MiB of UTF-8 text',
|
|
R2: 'path is unmapped',
|
|
R3: 'front matter not fully parsed',
|
|
R4: 'link resolves to no file or to more than one',
|
|
R5: 'canon file refers into the playground',
|
|
R6: 'canon file refers into another universe',
|
|
R7: 'paths differ only in case',
|
|
R8: 'pinned value changed',
|
|
});
|
|
|
|
export function problem(code, path, line, message = RULES[code]) {
|
|
if (!Object.hasOwn(RULES, code)) raise('library-problem-code', `unknown problem code ${code}`);
|
|
return Object.freeze({ code, path, ...(Number.isSafeInteger(line) ? { line } : {}), message });
|
|
}
|
|
|
|
// Stable order for status output and tests: path, then line, then code.
|
|
export function sortProblems(list) {
|
|
return [...list].sort((a, b) => a.path < b.path ? -1 : a.path > b.path ? 1
|
|
: (a.line ?? 0) - (b.line ?? 0) || (a.code < b.code ? -1 : a.code > b.code ? 1 : 0));
|
|
}
|