paperlint 2.0.1 → 3.0.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.
Files changed (226) hide show
  1. package/CLAUDE.md +6 -1
  2. package/CONTRIBUTING.md +21 -0
  3. package/README.md +231 -180
  4. package/action.yml +4 -6
  5. package/dist/adapters/references/index.d.ts +13 -0
  6. package/dist/adapters/references/index.d.ts.map +1 -0
  7. package/dist/adapters/references/index.js +55 -0
  8. package/dist/adapters/references/index.js.map +1 -0
  9. package/dist/adapters/references/reach.io.d.ts +3 -0
  10. package/dist/adapters/references/reach.io.d.ts.map +1 -0
  11. package/dist/adapters/references/reach.io.js +14 -0
  12. package/dist/adapters/references/reach.io.js.map +1 -0
  13. package/dist/build-engine.d.ts.map +1 -1
  14. package/dist/build-engine.js +5 -2
  15. package/dist/build-engine.js.map +1 -1
  16. package/dist/build.d.ts +16 -1
  17. package/dist/build.d.ts.map +1 -1
  18. package/dist/build.js +40 -5
  19. package/dist/build.js.map +1 -1
  20. package/dist/cli.d.ts +37 -20
  21. package/dist/cli.d.ts.map +1 -1
  22. package/dist/cli.js +377 -251
  23. package/dist/cli.js.map +1 -1
  24. package/dist/doctor.d.ts.map +1 -1
  25. package/dist/doctor.js +37 -52
  26. package/dist/doctor.js.map +1 -1
  27. package/dist/facts-file.d.ts +33 -9
  28. package/dist/facts-file.d.ts.map +1 -1
  29. package/dist/facts-file.js +117 -17
  30. package/dist/facts-file.js.map +1 -1
  31. package/dist/hooks-settings.d.ts +0 -21
  32. package/dist/hooks-settings.d.ts.map +1 -1
  33. package/dist/hooks-settings.js +17 -135
  34. package/dist/hooks-settings.js.map +1 -1
  35. package/dist/init.d.ts +40 -19
  36. package/dist/init.d.ts.map +1 -1
  37. package/dist/init.js +144 -109
  38. package/dist/init.js.map +1 -1
  39. package/dist/link-skills.d.ts +1 -1
  40. package/dist/link-skills.d.ts.map +1 -1
  41. package/dist/link-skills.js +11 -29
  42. package/dist/link-skills.js.map +1 -1
  43. package/dist/new-paper.d.ts +2 -2
  44. package/dist/new-paper.d.ts.map +1 -1
  45. package/dist/new-paper.js +6 -2
  46. package/dist/new-paper.js.map +1 -1
  47. package/dist/paper-files.d.ts +63 -0
  48. package/dist/paper-files.d.ts.map +1 -0
  49. package/dist/paper-files.js +69 -0
  50. package/dist/paper-files.js.map +1 -0
  51. package/dist/paper-settings.d.ts +40 -0
  52. package/dist/paper-settings.d.ts.map +1 -0
  53. package/dist/paper-settings.js +144 -0
  54. package/dist/paper-settings.js.map +1 -0
  55. package/dist/ports/check-references.d.ts +31 -0
  56. package/dist/ports/check-references.d.ts.map +1 -0
  57. package/dist/ports/check-references.js +7 -0
  58. package/dist/ports/check-references.js.map +1 -0
  59. package/dist/presets.d.ts +84 -0
  60. package/dist/presets.d.ts.map +1 -0
  61. package/dist/presets.js +184 -0
  62. package/dist/presets.js.map +1 -0
  63. package/dist/reference-rules.d.ts +47 -0
  64. package/dist/reference-rules.d.ts.map +1 -0
  65. package/dist/reference-rules.js +156 -0
  66. package/dist/reference-rules.js.map +1 -0
  67. package/dist/references.d.ts +36 -0
  68. package/dist/references.d.ts.map +1 -0
  69. package/dist/references.js +91 -0
  70. package/dist/references.js.map +1 -0
  71. package/dist/rules-config.d.ts +11 -2
  72. package/dist/rules-config.d.ts.map +1 -1
  73. package/dist/rules-config.js +25 -11
  74. package/dist/rules-config.js.map +1 -1
  75. package/dist/structure.d.ts.map +1 -1
  76. package/dist/structure.js +3 -2
  77. package/dist/structure.js.map +1 -1
  78. package/dist/tex-requirements.d.ts +63 -7
  79. package/dist/tex-requirements.d.ts.map +1 -1
  80. package/dist/tex-requirements.js +91 -24
  81. package/dist/tex-requirements.js.map +1 -1
  82. package/dist/types.d.ts +20 -18
  83. package/dist/types.d.ts.map +1 -1
  84. package/dist/venue-rules.d.ts +109 -0
  85. package/dist/venue-rules.d.ts.map +1 -0
  86. package/dist/venue-rules.js +389 -0
  87. package/dist/venue-rules.js.map +1 -0
  88. package/docs/configuration.md +152 -77
  89. package/docs/e2e.md +1 -1
  90. package/docs/install.md +25 -40
  91. package/docs/optional-rules.md +26 -24
  92. package/docs/rules.md +181 -15
  93. package/eslint-rules/bib-reachable-entry.mjs +75 -0
  94. package/eslint-rules/latex-language.mjs +29 -1
  95. package/eslint-rules/paper-stages.harness.mjs +1 -117
  96. package/eslint-rules/paper-stages.mjs +0 -120
  97. package/eslint-rules/paper-stages.mutations.mjs +0 -76
  98. package/eslint-rules/paper-typography.mjs +267 -192
  99. package/eslint-rules/paper-typography.test.mjs +297 -0
  100. package/eslint-rules/papers.harness.mjs +8 -12
  101. package/eslint-rules/papers.mjs +17 -27
  102. package/eslint-rules/pdf-last-page-balance.mjs +23 -5
  103. package/eslint-rules/review-frontmatter.mjs +118 -0
  104. package/eslint-rules/review-frontmatter.schema.json +36 -0
  105. package/eslint-rules/review-frontmatter.test.mjs +118 -0
  106. package/eslint-rules/sibling-frontmatter.mjs +19 -0
  107. package/eslint-rules/sibling-frontmatter.schema.json +14 -0
  108. package/eslint.config.mjs +0 -15
  109. package/fixtures/build-e2e/acmart/paperlint.json +1 -0
  110. package/fixtures/real-markdown-paper/baseline.json +6 -7
  111. package/hooks/hooks.harness.mjs +39 -98
  112. package/hooks/hooks.mutations.mjs +6 -6
  113. package/hooks/paper-edit-guard.hook.d.mts +2 -3
  114. package/hooks/paper-edit-guard.hook.mjs +31 -42
  115. package/hooks/paper-skills-nudge.hook.mjs +21 -19
  116. package/hooks/paper-status-gates.hook.mjs +21 -19
  117. package/hooks/paper-status-gates.sh +8 -13
  118. package/lib/paper-config.d.mts +15 -18
  119. package/lib/paper-config.harness.mjs +18 -35
  120. package/lib/paper-config.mjs +90 -81
  121. package/lib/paper-config.mutations.mjs +2 -2
  122. package/lib/skill-checks.mjs +1 -1
  123. package/lib/skill-trigger-cases.harness.mjs +9 -8
  124. package/lib/skill-trigger-cases.mjs +7 -15
  125. package/package.json +1 -1
  126. package/scripts/eslint-report-guard.mjs +1 -1
  127. package/scripts/harness-api.frozen.json +0 -3
  128. package/scripts/mutation-batteries.frozen.json +4 -13
  129. package/skills/analyze-sibling-paper/SKILL.md +16 -12
  130. package/skills/analyze-sibling-paper/SKILL.md.spec.ts +15 -11
  131. package/skills/cold-read-diff/SKILL.md +20 -1
  132. package/skills/cold-read-diff/SKILL.md.spec.ts +19 -0
  133. package/skills/find-venue/SKILL.md +5 -1
  134. package/skills/find-venue/SKILL.md.spec.ts +4 -0
  135. package/skills/grade-paper-writing/SKILL.md +20 -1
  136. package/skills/grade-paper-writing/SKILL.md.spec.ts +19 -0
  137. package/skills/paper-pipeline/PIPELINE-MAP.md +14 -4
  138. package/skills/paper-pipeline/SKILL.md +4 -3
  139. package/skills/paper-pipeline/SKILL.md.spec.ts +3 -2
  140. package/skills/paper-pipeline/scripts/consumer.d.mts +0 -1
  141. package/skills/paper-pipeline/scripts/consumer.harness.mjs +8 -12
  142. package/skills/paper-pipeline/scripts/consumer.mjs +19 -33
  143. package/skills/paper-pipeline/scripts/extract-ref-facts.harness.mjs +6 -4
  144. package/skills/paper-pipeline/scripts/run-mechanical.mjs +2 -11
  145. package/skills/plan-paper-timeline/SKILL.md +2 -2
  146. package/skills/plan-paper-timeline/SKILL.md.spec.ts +1 -1
  147. package/skills/plan-paper-timeline/plan-paper-timeline.effects.harness.mjs +1 -1
  148. package/skills/plan-paper-timeline/plan-paper-timeline.effects.mutations.mjs +2 -2
  149. package/skills/render-paper/check-render.sh +2 -3
  150. package/skills/render-paper/extract-pdf-facts.harness.mjs +5 -5
  151. package/skills/render-paper/extract-pdf-facts.mjs +4 -4
  152. package/skills/render-paper/render-paper.harness.mjs +2 -2
  153. package/skills/study-accepted-papers/SKILL.md +2 -1
  154. package/skills/study-accepted-papers/SKILL.md.spec.ts +1 -0
  155. package/skills/submit-paper/SKILL.md +9 -1
  156. package/skills/submit-paper/SKILL.md.spec.ts +8 -0
  157. package/skills/submit-paper/references/venues/acm-sigconf.jsonc +86 -0
  158. package/skills/submit-paper/references/venues/agenticdev.jsonc +34 -102
  159. package/skills/submit-paper/references/venues/aisec.jsonc +21 -82
  160. package/skills/submit-paper/references/venues/realm.jsonc +45 -43
  161. package/skills/submit-paper/references/venues/tex-base.jsonc +1 -1
  162. package/skills/submit-paper/references/venues/venue-profile.schema.json +119 -29
  163. package/skills/verify-citations/SKILL.md +10 -1
  164. package/skills/verify-citations/SKILL.md.spec.ts +9 -0
  165. package/skills/verify-citations/scripts/bib-authors.mjs +48 -26
  166. package/src/adapters/references/index.ts +102 -0
  167. package/src/adapters/references/reach.io.ts +12 -0
  168. package/src/build-engine.ts +10 -2
  169. package/src/build.harness.mjs +31 -22
  170. package/src/build.ts +65 -8
  171. package/src/cli.harness.mjs +151 -294
  172. package/src/cli.mutations.mjs +35 -44
  173. package/src/cli.ts +457 -288
  174. package/src/doctor.harness.mjs +41 -84
  175. package/src/doctor.mutations.mjs +9 -9
  176. package/src/doctor.ts +41 -61
  177. package/src/facts-file.test.ts +47 -7
  178. package/src/facts-file.ts +145 -24
  179. package/src/hooks-settings.harness.mjs +7 -92
  180. package/src/hooks-settings.mutations.mjs +2 -17
  181. package/src/hooks-settings.ts +18 -162
  182. package/src/init.test.ts +206 -0
  183. package/src/init.ts +193 -159
  184. package/src/link-skills.harness.mjs +1 -38
  185. package/src/link-skills.mutations.mjs +9 -5
  186. package/src/link-skills.ts +10 -34
  187. package/src/lint-fix.test.ts +120 -0
  188. package/src/new-paper.harness.mjs +9 -6
  189. package/src/new-paper.test.ts +133 -0
  190. package/src/new-paper.ts +7 -2
  191. package/src/paper-files.test.ts +290 -0
  192. package/src/paper-files.ts +144 -0
  193. package/src/paper-settings-commands.test.ts +274 -0
  194. package/src/paper-settings.test.ts +249 -0
  195. package/src/paper-settings.ts +208 -0
  196. package/src/ports/check-references.ts +28 -0
  197. package/src/presets.test.ts +236 -0
  198. package/src/presets.ts +297 -0
  199. package/src/reference-rules.ts +229 -0
  200. package/src/references.test.ts +209 -0
  201. package/src/references.ts +138 -0
  202. package/src/rules-config.harness.mjs +24 -8
  203. package/src/rules-config.ts +30 -13
  204. package/src/structure.harness.mjs +6 -4
  205. package/src/structure.ts +3 -2
  206. package/src/tex-requirements.harness.mjs +11 -17
  207. package/src/tex-requirements.ts +179 -29
  208. package/src/types.ts +30 -18
  209. package/src/venue-rules.test.ts +554 -0
  210. package/src/venue-rules.ts +571 -0
  211. package/templates/paper/paperlint.json +4 -0
  212. package/eslint-rules/doc-fields.harness.mjs +0 -336
  213. package/eslint-rules/doc-fields.mjs +0 -186
  214. package/eslint-rules/doc-fields.mutations.mjs +0 -96
  215. package/eslint-rules/paper-typography.harness.mjs +0 -291
  216. package/eslint-rules/paper-typography.mutations.mjs +0 -131
  217. package/eslint-rules/review-findings-cause.harness.mjs +0 -228
  218. package/eslint-rules/review-findings-cause.mjs +0 -135
  219. package/eslint-rules/review-findings-cause.mutations.mjs +0 -72
  220. package/fixtures/build-e2e/acmart/venue.json +0 -1
  221. package/fixtures/paper-stages/authors-ran/PIPELINE-STATUS.md +0 -16
  222. package/fixtures/paper-stages/marker-in-prose/PIPELINE-STATUS.md +0 -17
  223. package/fixtures/review-findings-cause/clean.md +0 -17
  224. package/fixtures/review-findings-cause/defect.md +0 -14
  225. package/fixtures/review-findings-cause/old-debt.md +0 -14
  226. package/fixtures/review-findings-cause/quiet-in-fence.md +0 -16
@@ -1 +1 @@
1
- {"version":3,"file":"new-paper.d.ts","sourceRoot":"","sources":["../src/new-paper.ts"],"names":[],"mappings":"AA4BA,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC;AACvC,eAAO,MAAM,OAAO,EAAE,SAAS,WAAW,EAAkB,CAAC;AAC7D,eAAO,MAAM,cAAc,EAAE,WAAmB,CAAC;AAEjD,8FAA8F;AAC9F,eAAO,MAAM,iBAAiB,QAE7B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,cAAc,CAAC;AAExC,eAAO,MAAM,WAAW,uBAAuB,CAAC;AAChD,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAG7D,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,GAAG,OAAO,KAAG,CAAC,IAAI,WACP,CAAC;AAErC;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMvD;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC;IACpC,uDAAuD;IACvD,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,MAAM,cAAc,GACtB;IACE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;CACxC,GACD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,EAAE,CAKtE;AAGD,wBAAgB,QAAQ,CACtB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,WAAW,EACnB,EAAE,gBAAoC,EAAE,GAAE;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3E,cAAc,CAsChB;AAED,iGAAiG;AACjG,wBAAgB,cAAc,CAC5B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAC1B,MAAM,EAAE,CAYV"}
1
+ {"version":3,"file":"new-paper.d.ts","sourceRoot":"","sources":["../src/new-paper.ts"],"names":[],"mappings":"AA6BA,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC;AACvC,eAAO,MAAM,OAAO,EAAE,SAAS,WAAW,EAAkB,CAAC;AAC7D,eAAO,MAAM,cAAc,EAAE,WAAmB,CAAC;AAEjD,8FAA8F;AAC9F,eAAO,MAAM,iBAAiB,QAE7B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,cAAc,CAAC;AAExC,eAAO,MAAM,WAAW,uBAAuB,CAAC;AAChD,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAG7D,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,GAAG,OAAO,KAAG,CAAC,IAAI,WACP,CAAC;AAErC;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMvD;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC;IACpC,uDAAuD;IACvD,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,MAAM,cAAc,GACtB;IACE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;CACxC,GACD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,EAAE,CAEtE;AAUD,wBAAgB,QAAQ,CACtB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,WAAW,EACnB,EAAE,gBAAoC,EAAE,GAAE;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3E,cAAc,CAsChB;AAED,iGAAiG;AACjG,wBAAgB,cAAc,CAC5B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAC1B,MAAM,EAAE,CAYV"}
package/dist/new-paper.js CHANGED
@@ -19,6 +19,7 @@ import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync, } from "n
19
19
  /* eslint-enable boundaries/dependencies */
20
20
  import { join } from "node:path";
21
21
  import { fileURLToPath } from "node:url";
22
+ import { CONFIG_FILE } from "../lib/paper-config.mjs";
22
23
  export const FORMATS = ["tex", "md"];
23
24
  export const DEFAULT_FORMAT = "tex";
24
25
  /** The package's default templates. Read from disk, so they ship in the tarball (`files`). */
@@ -48,10 +49,13 @@ export function nameProblem(name) {
48
49
  return null;
49
50
  }
50
51
  /**
51
- * The files a paper folder must end up with: the scorecard, plus a source in `format` — unless
52
- * it already has a source in EITHER format, in which case that one stands and nothing is added.
52
+ * The files a paper folder must end up with: the scorecard, a source in `format` — unless it
53
+ * already has a source in EITHER format, in which case that one stands — and `paperlint.json`.
53
54
  */
54
55
  export function wantedFiles(dir, format) {
56
+ return [...scorecardAndSource(dir, format), CONFIG_FILE];
57
+ }
58
+ function scorecardAndSource(dir, format) {
55
59
  const hasSource = Object.values(SOURCE_FILE).some((f) => existsSync(join(dir, f)));
56
60
  return hasSource ? [STATUS_FILE] : [STATUS_FILE, SOURCE_FILE[format]];
57
61
  }
@@ -1 +1 @@
1
- {"version":3,"file":"new-paper.js","sourceRoot":"","sources":["../src/new-paper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"new-paper.js","sourceRoot":"","sources":["../src/new-paper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * THE FILES PAPERLINT OWNS — read off its own config, and made the only thing ESLint may reach.
3
+ *
4
+ * paperlint's blocks name the files they lint (`PIPELINE-STATUS.md`, `paper.md`, `paper.tex`,
5
+ * `reviews/*.md`, …). That list is the whole scope of `paperlint lint`, and this module turns it
6
+ * into two things ESLint understands:
7
+ *
8
+ * 1. **A global ignore of everything else** (`scopeToOwned`). Handing ESLint a directory is not
9
+ * enough: its built-in defaults lint every JavaScript file it finds, whatever our config says.
10
+ * Measured on a consumer project with vendored code under a paper's `repro/` folder: 1,877
11
+ * files, 74 errors ("'return' outside of function", "Definition for rule … was not found"),
12
+ * zero of them on a paper file, exit 1 — and nothing in the settings could turn it off. With
13
+ * the ignore, a stray script under the papers directory is never enumerated at all, and a file
14
+ * named on the command line can be asked about (`ESLint#isPathIgnored`) with ESLint's own
15
+ * matcher instead of a hand-written one.
16
+ *
17
+ * 2. **Each rule scoped to the files it was written for** (`ruleOwners` + `narrowToOwners`).
18
+ * One plugin NAME is bound to different plugin objects in different blocks: `paper` holds
19
+ * `stages`/`source`/`author-list` beside `PIPELINE-STATUS.md` and `research-question`/
20
+ * `typography` beside `paper.md`/`paper.tex`. So a consumer block that named `paper/source`
21
+ * for every file under the papers directory reached `paper.tex`, where `paper` has no `source`
22
+ * — and ESLint threw `Could not find "source" in plugin "paper"` from inside `lintFiles`,
23
+ * after paperlint's own validation had (correctly) accepted the id. A block is therefore split
24
+ * per owner and its `files` ANDed with the owner's (ESLint's nested-array form), so a rule can
25
+ * only land where its plugin is registered.
26
+ *
27
+ * ESLint's semantics that this leans on, each measured against ESLint 10 before writing it:
28
+ * - a global-ignore pattern that matches a DIRECTORY hides everything inside it, so directories
29
+ * must be un-ignored (`!` + a pattern ending in a slash) before owned files can be;
30
+ * - that un-ignores `node_modules/` and `.git/` too — ESLint's own defaults — so they are
31
+ * re-ignored after, or a `paper.md` inside a dependency would be linted;
32
+ * - later global-ignore patterns win, across blocks, in config order;
33
+ * - `files: [["a", "b"]]` matches a file only when BOTH patterns match.
34
+ */
35
+ import type { RuleBlock, RuleEntry } from "./rules-config.ts";
36
+ /** A `files` entry: one glob, or several that must ALL match. */
37
+ export type FilesEntry = string | readonly string[];
38
+ /** A consumer block after narrowing: its `files` may carry ANDed pairs. */
39
+ export interface ScopedBlock {
40
+ readonly basePath: string;
41
+ readonly files?: readonly FilesEntry[];
42
+ readonly ignores?: readonly string[];
43
+ readonly rules: Readonly<Record<string, RuleEntry>>;
44
+ }
45
+ /** Every glob paperlint's own blocks lint, once, in config order. */
46
+ export declare function ownedPatterns(own: readonly unknown[]): string[];
47
+ /** A global-ignore block that leaves ESLint nothing to lint but `owned`. */
48
+ export declare function scopeToOwned(owned: readonly string[]): {
49
+ readonly ignores: string[];
50
+ };
51
+ /**
52
+ * Rule id → the globs of the blocks that register its plugin with that rule. `null`: the plugin
53
+ * is registered for every file (a block without `files`), so the rule resolves anywhere.
54
+ */
55
+ export declare function ruleOwners(own: readonly unknown[]): Map<string, readonly string[] | null>;
56
+ /**
57
+ * One consumer block → one block per owner, each carrying only that owner's rules, its `files`
58
+ * ANDed with the owner's globs. A rule no block of this config registers (the LaTeX block is
59
+ * absent when its parser did not load) gets no block: it has no file to reach in this run, and
60
+ * naming it to ESLint would only crash.
61
+ */
62
+ export declare function narrowToOwners(block: RuleBlock, owners: ReadonlyMap<string, readonly string[] | null>): ScopedBlock[];
63
+ //# sourceMappingURL=paper-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paper-files.d.ts","sourceRoot":"","sources":["../src/paper-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAU9D,iEAAiE;AACjE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;AAEpD,2EAA2E;AAC3E,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;CACrD;AAKD,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,GAAG,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,EAAE,CAE/D;AAKD,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG;IACtD,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;CAC5B,CASA;AAiBD;;;GAGG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,SAAS,OAAO,EAAE,GACtB,GAAG,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC,CAQvC;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC,GACpD,WAAW,EAAE,CAuBf"}
@@ -0,0 +1,69 @@
1
+ const globsOf = (b) => (b.files ?? []).filter((f) => typeof f === "string");
2
+ /** Every glob paperlint's own blocks lint, once, in config order. */
3
+ export function ownedPatterns(own) {
4
+ return [...new Set(own.flatMap((b) => globsOf(b)))];
5
+ }
6
+ /** ESLint's default ignores, re-applied after directories are un-ignored. */
7
+ const ESLINT_DEFAULT_IGNORES = ["**/node_modules/", "**/.git/"];
8
+ /** A global-ignore block that leaves ESLint nothing to lint but `owned`. */
9
+ export function scopeToOwned(owned) {
10
+ return {
11
+ ignores: [
12
+ "**/*",
13
+ "!**/*/",
14
+ ...owned.map((p) => `!${p}`),
15
+ ...ESLINT_DEFAULT_IGNORES,
16
+ ],
17
+ };
18
+ }
19
+ /** Every `<plugin>/<rule>` a block registers. */
20
+ const ruleIdsOf = (b) => Object.entries(b.plugins ?? {}).flatMap(([name, plugin]) => Object.keys(plugin.rules ?? {}).map((rule) => `${name}/${rule}`));
21
+ /** An owner seen so far, widened by one more block's globs; `null` (every file) absorbs all. */
22
+ const widen = (had, files) => had === null || files === null
23
+ ? null
24
+ : [...new Set([...(had ?? []), ...files])];
25
+ /**
26
+ * Rule id → the globs of the blocks that register its plugin with that rule. `null`: the plugin
27
+ * is registered for every file (a block without `files`), so the rule resolves anywhere.
28
+ */
29
+ export function ruleOwners(own) {
30
+ const owners = new Map();
31
+ for (const raw of own) {
32
+ const b = raw;
33
+ const files = b.files ? globsOf(b) : null;
34
+ for (const id of ruleIdsOf(b))
35
+ owners.set(id, widen(owners.get(id), files));
36
+ }
37
+ return owners;
38
+ }
39
+ /**
40
+ * One consumer block → one block per owner, each carrying only that owner's rules, its `files`
41
+ * ANDed with the owner's globs. A rule no block of this config registers (the LaTeX block is
42
+ * absent when its parser did not load) gets no block: it has no file to reach in this run, and
43
+ * naming it to ESLint would only crash.
44
+ */
45
+ export function narrowToOwners(block, owners) {
46
+ const groups = new Map();
47
+ for (const [id, entry] of Object.entries(block.rules)) {
48
+ const owner = owners.get(id);
49
+ if (owner === undefined)
50
+ continue;
51
+ const key = JSON.stringify(owner);
52
+ groups.set(key, { ...groups.get(key), [id]: entry });
53
+ }
54
+ return [...groups].map(([key, rules]) => {
55
+ const owner = JSON.parse(key);
56
+ const files = owner === null
57
+ ? block.files
58
+ : block.files
59
+ ? block.files.flatMap((f) => owner.map((o) => [f, o]))
60
+ : owner;
61
+ return {
62
+ basePath: block.basePath,
63
+ ...(files ? { files } : {}),
64
+ ...(block.ignores ? { ignores: block.ignores } : {}),
65
+ rules,
66
+ };
67
+ });
68
+ }
69
+ //# sourceMappingURL=paper-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paper-files.js","sourceRoot":"","sources":["../src/paper-files.ts"],"names":[],"mappings":"AAuDA,MAAM,OAAO,GAAG,CAAC,CAAQ,EAAY,EAAE,CACrC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;AAEpE,qEAAqE;AACrE,MAAM,UAAU,aAAa,CAAC,GAAuB;IACnD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,6EAA6E;AAC7E,MAAM,sBAAsB,GAAG,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;AAEhE,4EAA4E;AAC5E,MAAM,UAAU,YAAY,CAAC,KAAwB;IAGnD,OAAO;QACL,OAAO,EAAE;YACP,MAAM;YACN,QAAQ;YACR,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,GAAG,sBAAsB;SAC1B;KACF,CAAC;AACJ,CAAC;AAED,iDAAiD;AACjD,MAAM,SAAS,GAAG,CAAC,CAAQ,EAAY,EAAE,CACvC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CACzD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CACjE,CAAC;AAEJ,gGAAgG;AAChG,MAAM,KAAK,GAAG,CACZ,GAAyC,EACzC,KAA+B,EACL,EAAE,CAC5B,GAAG,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI;IAC5B,CAAC,CAAC,IAAI;IACN,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AAE/C;;;GAGG;AACH,MAAM,UAAU,UAAU,CACxB,GAAuB;IAEvB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoC,CAAC;IAC3D,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,GAAY,CAAC;QACvB,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1C,KAAK,MAAM,EAAE,IAAI,SAAS,CAAC,CAAC,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAgB,EAChB,MAAqD;IAErD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAqC,CAAC;IAC5D,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAC;QACjD,MAAM,KAAK,GACT,KAAK,KAAK,IAAI;YACZ,CAAC,CAAC,KAAK,CAAC,KAAK;YACb,CAAC,CAAC,KAAK,CAAC,KAAK;gBACX,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACtD,CAAC,CAAC,KAAK,CAAC;QACd,OAAO;YACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,KAAK;SACN,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { type Result } from "./domain/result.ts";
2
+ import type { Files } from "./ports/files.ts";
3
+ import { type Parsed, type RuleEntry } from "./rules-config.ts";
4
+ /** What one paper declares. Every absent field is null. */
5
+ export interface PaperSettings {
6
+ /** The venue preset the paper is judged against: `paperlint:<name>` or a relative path. */
7
+ readonly extends: string | null;
8
+ /** The kind of paper (`short`, `research`, …), whose page limit applies. */
9
+ readonly kind: string | null;
10
+ /** The built PDF relative to the paper, when it is not `paper.pdf`. */
11
+ readonly pdf: string | null;
12
+ /**
13
+ * Rule overrides for this paper alone — `{ id: severity }` or ESLint blocks — NOT yet checked
14
+ * against the shipped rules.
15
+ */
16
+ readonly rules: Readonly<Record<string, unknown>> | readonly unknown[] | null;
17
+ }
18
+ /** Why a paper's settings cannot be read. */
19
+ export type SettingsProblem = {
20
+ readonly kind: "broken";
21
+ readonly why: string;
22
+ };
23
+ declare const STRING_FIELDS: readonly ["extends", "kind", "pdf"];
24
+ /** `extends`, `kind` and `pdf`, each null when absent. The root file's defaults parse the same way. */
25
+ export declare function stringFields(d: Readonly<Record<string, unknown>>): Result<Pick<PaperSettings, (typeof STRING_FIELDS)[number]>, string>;
26
+ /** The parsed JSON of `paperlint.json` → the settings, or one line saying what is wrong. Pure. */
27
+ export declare function parsePaperSettings(json: unknown): Result<PaperSettings, string>;
28
+ /**
29
+ * A paper's settings, its own `paperlint.json` merged over the root's defaults: null when neither
30
+ * says anything; the problem when a file does not parse. Reads through `files` only; never throws.
31
+ */
32
+ export declare function readPaperSettings(files: Files, paperDir: string): Result<PaperSettings | null, SettingsProblem>;
33
+ /**
34
+ * `rules` → the parsed entries (rule id → severity or `[severity, options]`), or the error naming
35
+ * the file. Null when the paper sets none. Blocks (the list form) are parsed by the caller, which
36
+ * knows the file globs they are relative to (`paperRuleBlocks` in cli.ts).
37
+ */
38
+ export declare function paperRules(paperDir: string, settings: PaperSettings, shipped: ReadonlySet<string>): Parsed<Record<string, RuleEntry> | null>;
39
+ export {};
40
+ //# sourceMappingURL=paper-settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paper-settings.d.ts","sourceRoot":"","sources":["../src/paper-settings.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,SAAS,EACf,MAAM,mBAAmB,CAAC;AAE3B,2DAA2D;AAC3D,MAAM,WAAW,aAAa;IAC5B,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,uEAAuE;IACvE,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,OAAO,EAAE,GAAG,IAAI,CAAC;CAC/E;AAED,6CAA6C;AAC7C,MAAM,MAAM,eAAe,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAGhF,QAAA,MAAM,aAAa,qCAAsC,CAAC;AAkB1D,uGAAuG;AACvG,wBAAgB,YAAY,CAC1B,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACnC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAYrE;AAED,kGAAkG;AAClG,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,OAAO,GACZ,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAqB/B;AAqCD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,MAAM,GACf,MAAM,CAAC,aAAa,GAAG,IAAI,EAAE,eAAe,CAAC,CAS/C;AAyBD;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAC3B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,CAS1C"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * `<paper>/paperlint.json` — ONE PAPER'S SETTINGS, parsed at the boundary, merged over the root's.
3
+ *
4
+ * One file name at two levels, one schema (lib/paper-config.mjs → SETTINGS_KEYS):
5
+ *
6
+ * paperlint.json the project (optional): papersDir, rules, defaults
7
+ * <paper>/paperlint.json this paper: { extends, kind, pdf, rules }
8
+ * a venue preset `paperlint:<name>` (shipped) or `./x.jsonc` (src/presets.ts)
9
+ *
10
+ * The paper's `extends`, `kind` and `pdf` win over the root's; with no own value, the root's is
11
+ * the default. Every reader — the build, the facts writer, the venue rules, `paperlint lint` —
12
+ * goes through `readPaperSettings`, so there is one answer to "what does this paper declare".
13
+ *
14
+ * 🔴 STRICT. An unknown key is an error naming the known ones: `"venu": "aisec"` would otherwise
15
+ * read as "no preset", and every venue check would be silently off. A project-only key
16
+ * (`papersDir`, …) in a paper's file is refused too: it would be read nowhere.
17
+ */
18
+ import { dirname, join } from "node:path";
19
+ import { CONFIG_FILE, ROOT_ONLY_KEYS, SETTINGS_KEYS, findProjectRoot, } from "../lib/paper-config.mjs";
20
+ import { err, ok } from "./domain/result.js";
21
+ import { parseRuleEntries, } from "./rules-config.js";
22
+ const KNOWN = Object.keys(SETTINGS_KEYS);
23
+ const STRING_FIELDS = ["extends", "kind", "pdf"];
24
+ const isObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
25
+ /** A string field: absent is null, anything but a non-empty string is the error. */
26
+ function stringField(d, k) {
27
+ const v = d[k];
28
+ // `"extends": null` is what `paperlint new` writes: no venue chosen yet.
29
+ if (v === undefined || (k === "extends" && v === null))
30
+ return ok(null);
31
+ return typeof v === "string" && v !== ""
32
+ ? ok(v)
33
+ : err(`"${k}" must be a non-empty string, got ${JSON.stringify(v)}`);
34
+ }
35
+ /** `extends`, `kind` and `pdf`, each null when absent. The root file's defaults parse the same way. */
36
+ export function stringFields(d) {
37
+ const out = {};
38
+ for (const k of STRING_FIELDS) {
39
+ const f = stringField(d, k);
40
+ if (!f.ok)
41
+ return f;
42
+ out[k] = f.value;
43
+ }
44
+ return ok({
45
+ extends: out["extends"] ?? null,
46
+ kind: out["kind"] ?? null,
47
+ pdf: out["pdf"] ?? null,
48
+ });
49
+ }
50
+ /** The parsed JSON of `paperlint.json` → the settings, or one line saying what is wrong. Pure. */
51
+ export function parsePaperSettings(json) {
52
+ if (!isObject(json))
53
+ return err("must be a JSON object");
54
+ const unknown = Object.keys(json).filter((k) => !KNOWN.includes(k));
55
+ if (unknown.length > 0)
56
+ return err(`unknown key "${unknown[0]}" — known keys: ${KNOWN.join(", ")}`);
57
+ const project = Object.keys(json).filter((k) => ROOT_ONLY_KEYS.includes(k));
58
+ if (project.length > 0)
59
+ return err(`"${project[0]}" is a project setting — set it in the root ${CONFIG_FILE}, not in a paper's`);
60
+ const fields = stringFields(json);
61
+ if (!fields.ok)
62
+ return fields;
63
+ const rules = json["rules"];
64
+ if (rules !== undefined && !isObject(rules) && !Array.isArray(rules))
65
+ return err(`"rules" must be an object of rule id → severity, or a list of ESLint blocks`);
66
+ return ok({
67
+ ...fields.value,
68
+ rules: rules ?? null,
69
+ });
70
+ }
71
+ const at = (p) => p;
72
+ /** A JSON file through `files`: undefined when absent, the problem when it does not parse. */
73
+ function readJson(files, path) {
74
+ const bytes = files.readBytes(at(path));
75
+ if (bytes === null)
76
+ return ok(undefined);
77
+ try {
78
+ return ok(JSON.parse(new TextDecoder().decode(bytes)));
79
+ }
80
+ catch (e) {
81
+ return err({ kind: "broken", why: `not JSON (${e.message})` });
82
+ }
83
+ }
84
+ /**
85
+ * The root file's defaults for every paper — `extends`, `kind`, `pdf` — found by walking up from
86
+ * the paper's parent. None when there is no root file, or it is not an object; a root file that
87
+ * is wrong in another way is reported by `paperlint lint`, which parses it strictly.
88
+ */
89
+ function rootDefaults(files, paperDir) {
90
+ const root = findProjectRoot(dirname(paperDir), (p) => files.isFile(at(p)));
91
+ const json = readJson(files, join(root, CONFIG_FILE));
92
+ if (!json.ok)
93
+ return json;
94
+ if (!isObject(json.value))
95
+ return ok(null);
96
+ const fields = stringFields(json.value);
97
+ return fields.ok
98
+ ? fields
99
+ : err({ kind: "broken", why: `the root ${CONFIG_FILE}: ${fields.error}` });
100
+ }
101
+ /**
102
+ * A paper's settings, its own `paperlint.json` merged over the root's defaults: null when neither
103
+ * says anything; the problem when a file does not parse. Reads through `files` only; never throws.
104
+ */
105
+ export function readPaperSettings(files, paperDir) {
106
+ const own = readJson(files, join(paperDir, CONFIG_FILE));
107
+ if (!own.ok)
108
+ return own;
109
+ const parsed = own.value === undefined ? ok(null) : parsePaperSettings(own.value);
110
+ if (!parsed.ok)
111
+ return err({ kind: "broken", why: parsed.error });
112
+ const defaults = rootDefaults(files, paperDir);
113
+ if (!defaults.ok)
114
+ return defaults;
115
+ return ok(merge(defaults.value, parsed.value));
116
+ }
117
+ const NO_DEFAULTS = { extends: null, kind: null, pdf: null };
118
+ /** The paper's own values win; each absent one falls back to the root's. */
119
+ function merge(root, paper) {
120
+ const r = root ?? NO_DEFAULTS;
121
+ const p = paper ?? { ...NO_DEFAULTS, rules: null };
122
+ const merged = {
123
+ extends: p.extends ?? r.extends,
124
+ kind: p.kind ?? r.kind,
125
+ pdf: p.pdf ?? r.pdf,
126
+ rules: p.rules,
127
+ };
128
+ return paper === null && Object.values(merged).every((v) => v === null)
129
+ ? null
130
+ : merged;
131
+ }
132
+ // ── the paper's rule overrides ──────────────────────────────────────────────────────────
133
+ /**
134
+ * `rules` → the parsed entries (rule id → severity or `[severity, options]`), or the error naming
135
+ * the file. Null when the paper sets none. Blocks (the list form) are parsed by the caller, which
136
+ * knows the file globs they are relative to (`paperRuleBlocks` in cli.ts).
137
+ */
138
+ export function paperRules(paperDir, settings, shipped) {
139
+ if (settings.rules === null || Array.isArray(settings.rules))
140
+ return { ok: true, value: null };
141
+ const where = `${join(paperDir, CONFIG_FILE)} → "rules"`;
142
+ return parseRuleEntries(settings.rules, where, shipped);
143
+ }
144
+ //# sourceMappingURL=paper-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paper-settings.js","sourceRoot":"","sources":["../src/paper-settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Checking a paper's references online — shaped by what the build records, not by what DBLP or
3
+ * Crossref answer. The adapter (`adapters/references/`) runs the package's two checkers; a test
4
+ * passes a function.
5
+ */
6
+ /** What one bibliography entry came to. */
7
+ export interface EntryVerdict {
8
+ readonly key: string;
9
+ /**
10
+ * Does the cited work exist, and does its title match? `false` only on a positive disproof (an
11
+ * identifier that resolves to nothing or to another work); a work that simply was not found is
12
+ * `unresolvable`, never `false`.
13
+ */
14
+ readonly exists: "true" | "false" | "unresolvable";
15
+ /** Are the authors those of the version cited (not the preprint's)? */
16
+ readonly authors: "match" | "mismatch" | "skipped" | "unchecked";
17
+ /** Why, in one line, when either is not a plain pass. */
18
+ readonly why?: string;
19
+ }
20
+ export type ReferencesCheck = {
21
+ readonly kind: "checked";
22
+ readonly entries: readonly EntryVerdict[];
23
+ }
24
+ /** Nothing could be asked — no network, every service down. Never a pass. */
25
+ | {
26
+ readonly kind: "not-checked";
27
+ readonly why: string;
28
+ };
29
+ /** The bibliography's text (BibTeX) → the verdicts. Never throws: a failure is `not-checked`. */
30
+ export type CheckReferences = (bib: string) => Promise<ReferencesCheck>;
31
+ //# sourceMappingURL=check-references.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-references.d.ts","sourceRoot":"","sources":["../../src/ports/check-references.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,2CAA2C;AAC3C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,cAAc,CAAC;IACnD,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;IACjE,yDAAyD;IACzD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAA;CAAE;AACzE,6EAA6E;GAC3E;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,iGAAiG;AACjG,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Checking a paper's references online — shaped by what the build records, not by what DBLP or
3
+ * Crossref answer. The adapter (`adapters/references/`) runs the package's two checkers; a test
4
+ * passes a function.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=check-references.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-references.js","sourceRoot":"","sources":["../../src/ports/check-references.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,84 @@
1
+ import { type TexRequirements, type VenueFormat } from "./tex-requirements.ts";
2
+ import { type Result } from "./domain/result.ts";
3
+ import type { Files } from "./ports/files.ts";
4
+ import { type PaperSettings, type SettingsProblem } from "./paper-settings.ts";
5
+ /** The prefix of a shipped preset's spec. */
6
+ export declare const SHIPPED_PREFIX = "paperlint:";
7
+ /** The longest chain of presets, the paper's own target included. */
8
+ export declare const MAX_PRESET_DEPTH = 4;
9
+ export interface PresetDeps {
10
+ readonly files: Files;
11
+ /** The package's venues directory: the shipped presets and the schema every preset is checked against. */
12
+ readonly venuesDir: string;
13
+ }
14
+ /** A resolved chain, merged. */
15
+ export interface Preset {
16
+ /** The word for this venue in messages. */
17
+ readonly label: string;
18
+ /** Every file of the chain, root first. */
19
+ readonly chain: readonly string[];
20
+ readonly template: string | null;
21
+ readonly tex: TexRequirements;
22
+ readonly format: VenueFormat;
23
+ readonly rules: Readonly<Record<string, unknown>>;
24
+ }
25
+ /** Why a spec does not resolve. */
26
+ export type PresetProblem = {
27
+ readonly kind: "unsupported";
28
+ readonly spec: string;
29
+ } | {
30
+ readonly kind: "not-found";
31
+ readonly spec: string;
32
+ readonly file: string;
33
+ readonly shipped: readonly string[];
34
+ } | {
35
+ readonly kind: "cycle";
36
+ readonly chain: readonly string[];
37
+ } | {
38
+ readonly kind: "too-deep";
39
+ readonly chain: readonly string[];
40
+ } | {
41
+ readonly kind: "broken";
42
+ readonly file: string;
43
+ readonly why: string;
44
+ };
45
+ /** The display label of a spec: the file name without its extension. Pure. */
46
+ export declare function labelOf(spec: string): string;
47
+ /** A child's format over its parent's: per key the child wins, kinds by name. Pure. */
48
+ export declare function mergeFormat(parent: VenueFormat, child: VenueFormat): VenueFormat;
49
+ /**
50
+ * `spec`, as written in `fromFile` (a paper's `paperlint.json`), → the merged preset, or why it
51
+ * does not resolve. Reads through `deps.files` only; never throws.
52
+ */
53
+ export declare function resolvePreset(spec: string, fromFile: string, deps: PresetDeps): Result<Preset, PresetProblem>;
54
+ /** The shipped presets' names (each is spelled `paperlint:<name>`). */
55
+ export declare function shippedPresets(venuesDir: string): string[];
56
+ /** One line for a problem, naming what to change. Pure. */
57
+ export declare function presetProblemText(p: PresetProblem): string;
58
+ /** What one paper declares and the preset it resolves to — one answer for every reader. */
59
+ export type PaperPreset =
60
+ /** No `paperlint.json`, or one without `extends`: no venue checks, the base TeX set. */
61
+ {
62
+ readonly kind: "none";
63
+ readonly settings: PaperSettings | null;
64
+ } | {
65
+ readonly kind: "resolved";
66
+ readonly settings: PaperSettings;
67
+ readonly preset: Preset;
68
+ }
69
+ /** `paperlint.json` does not parse. */
70
+ | {
71
+ readonly kind: "settings-problem";
72
+ readonly problem: SettingsProblem;
73
+ }
74
+ /** `extends` does not resolve. */
75
+ | {
76
+ readonly kind: "preset-problem";
77
+ readonly settings: PaperSettings;
78
+ readonly problem: PresetProblem;
79
+ };
80
+ /** A paper directory → its settings and its resolved preset. Reads through `deps.files`; never throws. */
81
+ export declare function paperPreset(paperDir: string, deps: PresetDeps): PaperPreset;
82
+ /** The one-line reason a paper's settings or preset cannot be used, or null when they can. */
83
+ export declare function paperPresetProblem(paperDir: string, p: PaperPreset): string | null;
84
+ //# sourceMappingURL=presets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"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"}