@hawkeyexl/manni 2.3.7 → 2.3.9

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/cli.js CHANGED
@@ -7,15 +7,19 @@ import {
7
7
  readStdin,
8
8
  reportConfig,
9
9
  splitList
10
- } from "./chunk-4YJ4TCKM.js";
10
+ } from "./chunk-HOLRWVCO.js";
11
11
  import {
12
12
  CiteError,
13
13
  KeyError,
14
+ RULE_ID_PREFIX,
14
15
  SEVERITIES,
15
16
  SEVERITY_LIST,
16
17
  asCiteError,
17
18
  codeEndAt,
18
19
  codeRegions,
20
+ errorSite,
21
+ findingMessage,
22
+ isCiteRule,
19
23
  isSeverity,
20
24
  meetsSeverity,
21
25
  renderCheckGithub,
@@ -32,7 +36,7 @@ import {
32
36
  shortPin,
33
37
  shortSrc,
34
38
  spellSource
35
- } from "./chunk-Y2XNDEM6.js";
39
+ } from "./chunk-YSI2VNKE.js";
36
40
  import {
37
41
  COMMON_FORMAT_LIST,
38
42
  OMITTED_WHEN_CLEAN,
@@ -59,7 +63,6 @@ import {
59
63
  palette,
60
64
  programName,
61
65
  readConfigFile,
62
- render,
63
66
  renderJunit,
64
67
  renderSarif,
65
68
  resolveBaselineRequest,
@@ -71,7 +74,7 @@ import {
71
74
  splitPageArgument,
72
75
  terminalConfirm,
73
76
  valeConfigPath
74
- } from "./chunk-D5FTEP3H.js";
77
+ } from "./chunk-LC4H35XX.js";
75
78
 
76
79
  // src/cli.ts
77
80
  import { Command as Command5 } from "commander";
@@ -762,7 +765,7 @@ var A11Y_FORMAT_LIST = A11Y_FORMATS.join(" | ");
762
765
  function isA11yFormat(value) {
763
766
  return A11Y_FORMATS.includes(value);
764
767
  }
765
- function render2(format, run, opts) {
768
+ function render(format, run, opts) {
766
769
  switch (format) {
767
770
  case "pretty":
768
771
  return renderPretty(run, opts);
@@ -971,7 +974,7 @@ function buildProgram2() {
971
974
  { analyzer: createPlaywrightAnalyzer(), onProgress: progress.listener }
972
975
  );
973
976
  const color = resolveColor(parent, process.stdout);
974
- const text2 = render2(format, run, { color, quiet: Boolean(options.quiet) });
977
+ const text2 = render(format, run, { color, quiet: Boolean(options.quiet) });
975
978
  if (text2.length > 0 || format !== "github") {
976
979
  process.stdout.write(`${text2}
977
980
  `);
@@ -987,7 +990,71 @@ function buildProgram2() {
987
990
 
988
991
  // src/cite/cli.ts
989
992
  import { Command as Command2, Option } from "commander";
993
+
994
+ // src/cite/reporters/sarif.ts
995
+ var INFORMATION_URI = "https://hawkeyexl.github.io/manni/cite/";
996
+ var RULES_URI = "https://hawkeyexl.github.io/manni/cite/reference/citations/";
997
+ var RULE_DESCRIPTIONS = {
998
+ "source-moved": "The cited source lines moved to one other place in the file.",
999
+ "source-moved-ambiguous": "The cited source lines now match at several places in the file.",
1000
+ "source-changed": "The cited source lines changed since the citation pinned them.",
1001
+ "source-never-true": "The pin never matched the source at the recorded commit.",
1002
+ "source-missing": "The cited source file is not tracked under the root, or cannot be decrypted.",
1003
+ "claim-moved": "The cited sentence moved to other lines of the page.",
1004
+ "claim-moved-ambiguous": "The cited sentence now appears at several places on the page.",
1005
+ "claim-changed": "The cited sentence was edited since the citation pinned it.",
1006
+ "marker-orphan": "A marker names an id no citation has.",
1007
+ "marker-invalid": "A marker is malformed, or the page has too many markers.",
1008
+ "marker-repeated": "Two markers name the same citation id.",
1009
+ "anchor-invalid": "A citation's anchor cannot work.",
1010
+ "entry-invalid": "A citation entry is malformed.",
1011
+ "quote-drift": "A quoted block no longer reproduces its source."
1012
+ };
1013
+ var ENTRY_LABEL = /^(?:\(root\)|\/citations\/\d+) /;
1014
+ function withFindingMessages(run) {
1015
+ return run.results.map((result) => {
1016
+ const page = run.pages.find((p) => p.file === result.file);
1017
+ if (page === void 0) return result;
1018
+ const errors = result.errors.map((error) => {
1019
+ const finding = page.findings.find(
1020
+ (f) => f.rule === error.keyword && (f.index === void 0 ? "" : `/citations/${String(f.index)}`) === error.instancePath && f.message === error.message && (errorSite(f).line ?? null) === (error.line ?? null)
1021
+ );
1022
+ return finding === void 0 ? error : { ...error, message: findingMessage(finding) };
1023
+ });
1024
+ return { ...result, errors };
1025
+ });
1026
+ }
1027
+ function describe(rule) {
1028
+ const name = rule.id.slice(RULE_ID_PREFIX.length + 1);
1029
+ if (!isCiteRule(name)) return rule;
1030
+ return { id: rule.id, shortDescription: { text: RULE_DESCRIPTIONS[name] }, helpUri: `${RULES_URI}#${name}` };
1031
+ }
1032
+ function renderCheckSarif(run, opts = {}) {
1033
+ const log = JSON.parse(
1034
+ renderSarif(withFindingMessages(run), {
1035
+ frame: run.frame,
1036
+ ...opts.onNotice === void 0 ? {} : { onNotice: opts.onNotice }
1037
+ })
1038
+ );
1039
+ for (const sarifRun of log.runs) {
1040
+ sarifRun.tool.driver.informationUri = INFORMATION_URI;
1041
+ sarifRun.tool.driver.rules = sarifRun.tool.driver.rules.map(describe);
1042
+ for (const result of sarifRun.results) result.message.text = result.message.text.replace(ENTRY_LABEL, "");
1043
+ }
1044
+ return JSON.stringify(log, null, 2);
1045
+ }
1046
+
1047
+ // src/cite/reporters/junit.ts
990
1048
  var JUNIT_CLASSNAME = "manni.cite";
1049
+ var MESSAGE_LABEL = new RegExp(`message="${ENTRY_LABEL.source.replace(/^\^/, "")}`, "g");
1050
+ function renderCheckJunit(run) {
1051
+ return renderJunit(withFindingMessages(run), { frame: run.frame, classname: JUNIT_CLASSNAME }).replace(
1052
+ MESSAGE_LABEL,
1053
+ 'message="'
1054
+ );
1055
+ }
1056
+
1057
+ // src/cite/cli.ts
991
1058
  var UPDATE_FORMATS = ["pretty", "json"];
992
1059
  function colorFor(command, isTTY, env) {
993
1060
  const noColor = colorOwner(command).opts().color === false;
@@ -1122,12 +1189,12 @@ function buildProgram3() {
1122
1189
  case "github":
1123
1190
  text2 = renderCheckGithub(run);
1124
1191
  break;
1125
- default:
1126
- text2 = render(format, run.results, run.summary, {
1127
- frame: run.frame,
1128
- classname: JUNIT_CLASSNAME,
1129
- onNotice: notice
1130
- });
1192
+ case "sarif":
1193
+ text2 = renderCheckSarif(run, { onNotice: notice });
1194
+ break;
1195
+ case "junit":
1196
+ text2 = renderCheckJunit(run);
1197
+ break;
1131
1198
  }
1132
1199
  if (text2.length > 0 || !OMITTED_WHEN_CLEAN.has(format)) {
1133
1200
  process.stdout.write(`${text2}
@@ -1694,7 +1761,7 @@ async function resolveTermRun(opts) {
1694
1761
  }
1695
1762
 
1696
1763
  // src/term/core/severity.ts
1697
- var RULE_ID_PREFIX = "manni:term";
1764
+ var RULE_ID_PREFIX2 = "manni:term";
1698
1765
  var DEFAULT_SEVERITY = {
1699
1766
  "undefined-term": "error",
1700
1767
  "duplicate-id": "error",
@@ -1708,10 +1775,10 @@ var DEFAULT_SEVERITY = {
1708
1775
  "unused-term": "notice"
1709
1776
  };
1710
1777
  function ruleId(rule) {
1711
- return `${RULE_ID_PREFIX}/${rule}`;
1778
+ return `${RULE_ID_PREFIX2}/${rule}`;
1712
1779
  }
1713
1780
  function proseRuleId(check) {
1714
- return `${RULE_ID_PREFIX}/prose/${check}`;
1781
+ return `${RULE_ID_PREFIX2}/prose/${check}`;
1715
1782
  }
1716
1783
  function isTermRule2(value) {
1717
1784
  return TERM_RULES.includes(value);
@@ -1928,11 +1995,11 @@ var FINDING_FORMATS = ["pretty", "json", "github", "sarif", "junit"];
1928
1995
  var JUNIT_CLASSNAME2 = "manni.term";
1929
1996
  var LINE_REFERENCE = /:\d+\b/g;
1930
1997
  function toFieldError(finding) {
1931
- const keyword = finding.ruleId.startsWith(`${RULE_ID_PREFIX}/`) ? finding.ruleId.slice(RULE_ID_PREFIX.length + 1) : finding.ruleId;
1998
+ const keyword = finding.ruleId.startsWith(`${RULE_ID_PREFIX2}/`) ? finding.ruleId.slice(RULE_ID_PREFIX2.length + 1) : finding.ruleId;
1932
1999
  const { field } = finding;
1933
2000
  const subject = [finding.id ?? "", field ?? "", finding.message.replace(LINE_REFERENCE, "")].join("\0");
1934
2001
  const error = {
1935
- schema: RULE_ID_PREFIX,
2002
+ schema: RULE_ID_PREFIX2,
1936
2003
  instancePath: field === void 0 ? "" : `/${field}`,
1937
2004
  message: finding.message,
1938
2005
  keyword,
@@ -1957,7 +2024,7 @@ function toResults(set, findings) {
1957
2024
  }
1958
2025
  const results = [...byFile.keys()].sort().map((file) => {
1959
2026
  const errors = byFile.get(file) ?? [];
1960
- return { file, format: "term", ok: !errors.some(isErrorSeverity), schemas: [RULE_ID_PREFIX], errors };
2027
+ return { file, format: "term", ok: !errors.some(isErrorSeverity), schemas: [RULE_ID_PREFIX2], errors };
1961
2028
  });
1962
2029
  return { results, origin };
1963
2030
  }
@@ -4429,9 +4496,9 @@ var INTERCHANGE_LABELS = {
4429
4496
  };
4430
4497
  function rendered(writers, format, construct) {
4431
4498
  return writers.some((writer) => {
4432
- const render3 = DOCUMENT_RENDERS[writer.format];
4433
- if (render3?.input !== format) return false;
4434
- return writer.shapes.some((shape) => render3.shapes[shape] === construct);
4499
+ const render2 = DOCUMENT_RENDERS[writer.format];
4500
+ if (render2?.input !== format) return false;
4501
+ return writer.shapes.some((shape) => render2.shapes[shape] === construct);
4435
4502
  });
4436
4503
  }
4437
4504
  function listFormats(opts = {}) {
@@ -4868,14 +4935,14 @@ async function runWrite(opts) {
4868
4935
  const shape = format === "vale" || /[\\/]$/.test(opts.out ?? "") || isDirectory(targetPath) ? "directory" : "file";
4869
4936
  const target = { path: targetPath, shape };
4870
4937
  const existing = await existingFor(target);
4871
- let render3;
4938
+ let render2;
4872
4939
  try {
4873
- render3 = writer.render(set.terms, target, { existing });
4940
+ render2 = writer.render(set.terms, target, { existing });
4874
4941
  } catch (error) {
4875
4942
  if (error instanceof TermError) throw relativized(error, [...existing.keys(), targetPath], cwd);
4876
4943
  throw error;
4877
4944
  }
4878
- const changes = await applyChanges(render3.files, render3.removals, existing, cwd, !check && !dryRun);
4945
+ const changes = await applyChanges(render2.files, render2.removals, existing, cwd, !check && !dryRun);
4879
4946
  const shown = format === "vale" ? displayPath(join4(targetPath, STYLE2), cwd) : opts.out ?? displayPath(targetPath, cwd);
4880
4947
  return {
4881
4948
  mode: "render",
@@ -4884,11 +4951,11 @@ async function runWrite(opts) {
4884
4951
  target: shown,
4885
4952
  terms: set.terms.length,
4886
4953
  changes,
4887
- files: render3.files.map((file) => ({ path: displayPath(file.path, cwd), content: file.content })),
4954
+ files: render2.files.map((file) => ({ path: displayPath(file.path, cwd), content: file.content })),
4888
4955
  // A Vale style holds designations only, by design; its dropped definitions are not news.
4889
- dropped: format === "vale" ? [] : render3.dropped,
4956
+ dropped: format === "vale" ? [] : render2.dropped,
4890
4957
  droppedFrom: droppedFrom(format, shape, readers),
4891
- skipped: render3.skipped,
4958
+ skipped: render2.skipped,
4892
4959
  check,
4893
4960
  dryRun,
4894
4961
  ...wiring === void 0 ? {} : { wiring }
@@ -5034,9 +5101,9 @@ function renderFormatsJson(rows) {
5034
5101
  }
5035
5102
 
5036
5103
  // src/term/reporters/sarif.ts
5037
- var INFORMATION_URI = "https://hawkeyexl.github.io/manni/term/";
5038
- var RULES_URI = "https://hawkeyexl.github.io/manni/term/reference/rules/";
5039
- var RULE_DESCRIPTIONS = {
5104
+ var INFORMATION_URI2 = "https://hawkeyexl.github.io/manni/term/";
5105
+ var RULES_URI2 = "https://hawkeyexl.github.io/manni/term/reference/rules/";
5106
+ var RULE_DESCRIPTIONS2 = {
5040
5107
  "undefined-term": "A page's concepts: names a label no entry claims as its preferred label.",
5041
5108
  "duplicate-id": "Two entries share an id.",
5042
5109
  "label-collision": "Two entries claim the same preferred label, ignoring case.",
@@ -5048,16 +5115,16 @@ var RULE_DESCRIPTIONS = {
5048
5115
  "abstract-too-long": "An abstract is longer than term.abstractMaxLength.",
5049
5116
  "unused-term": "No page's concepts: names the entry's preferred label."
5050
5117
  };
5051
- var PROSE_PREFIX = `${RULE_ID_PREFIX}/prose/`;
5118
+ var PROSE_PREFIX = `${RULE_ID_PREFIX2}/prose/`;
5052
5119
  var FIELD_LABEL = new RegExp(`^(?:\\(root\\)|/(?:${TERM_FIELDS.join("|")})) `);
5053
- function describe(rule) {
5120
+ function describe2(rule) {
5054
5121
  if (rule.id.startsWith(PROSE_PREFIX)) {
5055
5122
  const check = rule.id.slice(PROSE_PREFIX.length);
5056
5123
  return { id: rule.id, shortDescription: { text: `Vale's ${check} rule flagged the prose of an entry's field.` } };
5057
5124
  }
5058
- const name = rule.id.slice(RULE_ID_PREFIX.length + 1);
5125
+ const name = rule.id.slice(RULE_ID_PREFIX2.length + 1);
5059
5126
  if (!isTermRule2(name)) return rule;
5060
- return { id: rule.id, shortDescription: { text: RULE_DESCRIPTIONS[name] }, helpUri: `${RULES_URI}#${name}` };
5127
+ return { id: rule.id, shortDescription: { text: RULE_DESCRIPTIONS2[name] }, helpUri: `${RULES_URI2}#${name}` };
5061
5128
  }
5062
5129
  function renderFindingsSarif(report, opts = {}) {
5063
5130
  const log = JSON.parse(
@@ -5067,18 +5134,18 @@ function renderFindingsSarif(report, opts = {}) {
5067
5134
  })
5068
5135
  );
5069
5136
  for (const run of log.runs) {
5070
- run.tool.driver.informationUri = INFORMATION_URI;
5071
- run.tool.driver.rules = run.tool.driver.rules.map(describe);
5137
+ run.tool.driver.informationUri = INFORMATION_URI2;
5138
+ run.tool.driver.rules = run.tool.driver.rules.map(describe2);
5072
5139
  for (const result of run.results) result.message.text = result.message.text.replace(FIELD_LABEL, "");
5073
5140
  }
5074
5141
  return JSON.stringify(log, null, 2);
5075
5142
  }
5076
5143
 
5077
5144
  // src/term/reporters/junit.ts
5078
- var MESSAGE_LABEL = new RegExp(`message="${FIELD_LABEL.source.slice(1)}`, "g");
5145
+ var MESSAGE_LABEL2 = new RegExp(`message="${FIELD_LABEL.source.slice(1)}`, "g");
5079
5146
  function renderFindingsJunit(report) {
5080
5147
  return renderJunit(report.results, { frame: report.frame, classname: JUNIT_CLASSNAME2 }).replace(
5081
- MESSAGE_LABEL,
5148
+ MESSAGE_LABEL2,
5082
5149
  'message="'
5083
5150
  );
5084
5151
  }