paperlint 2.0.1 → 2.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.
Files changed (103) hide show
  1. package/CONTRIBUTING.md +21 -0
  2. package/README.md +56 -14
  3. package/dist/build-engine.d.ts.map +1 -1
  4. package/dist/build-engine.js +5 -2
  5. package/dist/build-engine.js.map +1 -1
  6. package/dist/build.d.ts +1 -1
  7. package/dist/build.d.ts.map +1 -1
  8. package/dist/build.js +4 -3
  9. package/dist/build.js.map +1 -1
  10. package/dist/cli.d.ts +15 -1
  11. package/dist/cli.d.ts.map +1 -1
  12. package/dist/cli.js +138 -24
  13. package/dist/cli.js.map +1 -1
  14. package/dist/doctor.d.ts.map +1 -1
  15. package/dist/doctor.js +21 -4
  16. package/dist/doctor.js.map +1 -1
  17. package/dist/facts-file.d.ts +33 -9
  18. package/dist/facts-file.d.ts.map +1 -1
  19. package/dist/facts-file.js +117 -17
  20. package/dist/facts-file.js.map +1 -1
  21. package/dist/init.d.ts +11 -0
  22. package/dist/init.d.ts.map +1 -1
  23. package/dist/init.js +67 -3
  24. package/dist/init.js.map +1 -1
  25. package/dist/new-paper.d.ts +2 -2
  26. package/dist/new-paper.d.ts.map +1 -1
  27. package/dist/new-paper.js +17 -2
  28. package/dist/new-paper.js.map +1 -1
  29. package/dist/paper-settings.d.ts +68 -0
  30. package/dist/paper-settings.d.ts.map +1 -0
  31. package/dist/paper-settings.js +144 -0
  32. package/dist/paper-settings.js.map +1 -0
  33. package/dist/presets.d.ts +84 -0
  34. package/dist/presets.d.ts.map +1 -0
  35. package/dist/presets.js +186 -0
  36. package/dist/presets.js.map +1 -0
  37. package/dist/rules-config.d.ts +7 -0
  38. package/dist/rules-config.d.ts.map +1 -1
  39. package/dist/rules-config.js +11 -6
  40. package/dist/rules-config.js.map +1 -1
  41. package/dist/structure.d.ts.map +1 -1
  42. package/dist/structure.js +2 -1
  43. package/dist/structure.js.map +1 -1
  44. package/dist/tex-requirements.d.ts +63 -7
  45. package/dist/tex-requirements.d.ts.map +1 -1
  46. package/dist/tex-requirements.js +91 -24
  47. package/dist/tex-requirements.js.map +1 -1
  48. package/dist/venue-rules.d.ts +109 -0
  49. package/dist/venue-rules.d.ts.map +1 -0
  50. package/dist/venue-rules.js +387 -0
  51. package/dist/venue-rules.js.map +1 -0
  52. package/docs/configuration.md +67 -7
  53. package/docs/optional-rules.md +25 -24
  54. package/docs/rules.md +131 -2
  55. package/eslint-rules/papers.mjs +6 -2
  56. package/eslint-rules/pdf-last-page-balance.mjs +23 -2
  57. package/fixtures/build-e2e/acmart/paperlint.json +1 -0
  58. package/lib/paper-config.d.mts +7 -0
  59. package/lib/paper-config.mjs +31 -0
  60. package/package.json +1 -1
  61. package/skills/find-venue/SKILL.md +5 -1
  62. package/skills/find-venue/SKILL.md.spec.ts +4 -0
  63. package/skills/paper-pipeline/PIPELINE-MAP.md +14 -4
  64. package/skills/paper-pipeline/SKILL.md +4 -3
  65. package/skills/paper-pipeline/SKILL.md.spec.ts +3 -2
  66. package/skills/render-paper/extract-pdf-facts.harness.mjs +5 -5
  67. package/skills/render-paper/extract-pdf-facts.mjs +4 -4
  68. package/skills/study-accepted-papers/SKILL.md +2 -1
  69. package/skills/study-accepted-papers/SKILL.md.spec.ts +1 -0
  70. package/skills/submit-paper/SKILL.md +9 -1
  71. package/skills/submit-paper/SKILL.md.spec.ts +8 -0
  72. package/skills/submit-paper/references/venues/acm-sigconf.jsonc +86 -0
  73. package/skills/submit-paper/references/venues/agenticdev.jsonc +34 -102
  74. package/skills/submit-paper/references/venues/aisec.jsonc +21 -82
  75. package/skills/submit-paper/references/venues/realm.jsonc +45 -43
  76. package/skills/submit-paper/references/venues/tex-base.jsonc +1 -1
  77. package/skills/submit-paper/references/venues/venue-profile.schema.json +119 -29
  78. package/src/build-engine.ts +10 -2
  79. package/src/build.harness.mjs +23 -18
  80. package/src/build.ts +5 -4
  81. package/src/cli.harness.mjs +4 -2
  82. package/src/cli.ts +158 -29
  83. package/src/doctor.ts +28 -3
  84. package/src/facts-file.test.ts +54 -7
  85. package/src/facts-file.ts +145 -24
  86. package/src/init.ts +81 -3
  87. package/src/new-paper.harness.mjs +9 -6
  88. package/src/new-paper.test.ts +145 -0
  89. package/src/new-paper.ts +22 -2
  90. package/src/paper-settings-commands.test.ts +311 -0
  91. package/src/paper-settings.test.ts +220 -0
  92. package/src/paper-settings.ts +206 -0
  93. package/src/presets.test.ts +236 -0
  94. package/src/presets.ts +307 -0
  95. package/src/rules-config.ts +12 -7
  96. package/src/structure.harness.mjs +3 -3
  97. package/src/structure.ts +2 -1
  98. package/src/tex-requirements.harness.mjs +11 -17
  99. package/src/tex-requirements.ts +179 -29
  100. package/src/venue-rules.test.ts +545 -0
  101. package/src/venue-rules.ts +573 -0
  102. package/templates/paper/paperlint.json +4 -0
  103. package/fixtures/build-e2e/acmart/venue.json +0 -1
@@ -15,14 +15,63 @@ export interface PaperRequirements {
15
15
  export declare const BASE_PROFILE = "tex-base.jsonc";
16
16
  export declare const SCHEMA_FILE = "venue-profile.schema.json";
17
17
  export declare const NO_REQUIREMENTS: TexRequirements;
18
+ /** One kind of paper a venue takes (`short`, `research`, …) and its page limits; null = not limited. */
19
+ export interface KindLimits {
20
+ readonly bodyPagesMax: number | null;
21
+ readonly refPagesMax: number | null;
22
+ }
23
+ /**
24
+ * The format a venue's call for papers sets — what the `pdf/*` venue rules judge a built PDF
25
+ * against. Every field the profile leaves out is null, and a rule that finds null checks nothing:
26
+ * a profile that does not name a number never makes one up.
27
+ */
28
+ export interface VenueFormat {
29
+ readonly pageWidthIn: number | null;
30
+ readonly pageHeightIn: number | null;
31
+ readonly columns: number | null;
32
+ readonly bodyPt: number | null;
33
+ readonly bodyPtTol: number | null;
34
+ readonly refPtMin: number | null;
35
+ readonly refPtMax: number | null;
36
+ /** The prefix a font name of the body text starts with (`LinLibertine`). */
37
+ readonly fontsText: string | null;
38
+ readonly fontsTitle: string | null;
39
+ readonly kinds: ReadonlyMap<string, KindLimits>;
40
+ }
41
+ /** Every format field a preset left out is null; a merge fills it from the parent. */
42
+ export declare const NO_FORMAT: VenueFormat;
43
+ /**
44
+ * One preset FILE, parsed — before its `extends` chain is resolved (`src/presets.ts` does that).
45
+ * A preset is a venue or a template family: `{ extends?, name?, template?, format?, tex?, rules? }`.
46
+ */
47
+ export interface PresetFile {
48
+ /** The preset this one builds on: `paperlint:<name>` or a relative path. */
49
+ readonly extends: string | null;
50
+ /** A display name for messages; the file name otherwise. */
51
+ readonly name: string | null;
52
+ readonly template: string | null;
53
+ /** Null when the file declares no `tex` block (allowed only with `extends`). */
54
+ readonly tex: TexRequirements | null;
55
+ readonly format: VenueFormat;
56
+ /** rule id → ESLint entry, checked against the shipped rules where a config is built. */
57
+ readonly rules: Readonly<Record<string, unknown>>;
58
+ }
18
59
  /**
19
- * The text of one profile → its typed requirements, or an Error naming every problem.
60
+ * The text of one preset file → the typed file, or an Error naming every problem. The ONE parser
61
+ * of a preset: the toolchain reads its `tex`, the venue rules its `format`, the config its `rules`.
20
62
  *
21
63
  * @param text the file's contents
22
64
  * @param file the name to put in messages
23
65
  * @param dir the directory holding the schema (the shipped venues directory by default)
24
66
  */
67
+ export declare function parsePreset(text: string, file: string, dir?: string): PresetFile;
68
+ /** The text of one preset → the TeX requirements it declares itself (none without a `tex` block). */
25
69
  export declare function parseProfile(text: string, file: string, dir?: string): TexRequirements;
70
+ /**
71
+ * The file a venue's profile lives in, or null when the name cannot be a venue (the base set is a
72
+ * profile file but not a venue). Whether the file exists is the caller's question.
73
+ */
74
+ export declare function profileFileOf(venue: string): string | null;
26
75
  /** The venues that have a profile — every `.jsonc` in the directory except the base set. */
27
76
  export declare function venueNames(dir?: string): string[];
28
77
  /** The union of two sets of requirements; a package declared by both keeps every proof of both. */
@@ -30,13 +79,20 @@ export declare function mergeRequirements(a: TexRequirements, b: TexRequirements
30
79
  /** Every package name, packages and tools together, sorted — what tlmgr is asked for. */
31
80
  export declare function packageNames(tex: TexRequirements): string[];
32
81
  /**
33
- * What ONE paper needs: the base set plus its venue's block. A paper with no venue, or a venue this
34
- * package has no profile for, gets the base set — and the source says which, so an ACM paper built
35
- * without `venue.json` is visibly running on the base set rather than silently.
82
+ * What ONE paper needs: the base set plus its venue preset's `tex` (the union over the preset's
83
+ * `extends` chain, resolved by `src/presets.ts`). A paper with no preset gets the base set, and the
84
+ * source says so, so an ACM paper built without a preset is visibly running on the base set.
85
+ */
86
+ export declare function requirementsFor(preset: {
87
+ readonly label: string;
88
+ readonly tex: TexRequirements;
89
+ } | null, dir?: string): PaperRequirements;
90
+ /**
91
+ * Everything any shipped preset declares, plus `extra` — the resolved presets of the project's own
92
+ * papers, which may live outside the package. The set `paperlint toolchain` installs, so one tree
93
+ * builds any paper.
36
94
  */
37
- export declare function requirementsFor(venue: string | null, dir?: string): PaperRequirements;
38
- /** Everything any profile declares — the set `paperlint toolchain` installs, so one tree builds any paper. */
39
- export declare function declaredUnion(dir?: string): {
95
+ export declare function declaredUnion(dir?: string, extra?: readonly TexRequirements[]): {
40
96
  readonly tex: TexRequirements;
41
97
  readonly profiles: number;
42
98
  };
@@ -1 +1 @@
1
- {"version":3,"file":"tex-requirements.d.ts","sourceRoot":"","sources":["../src/tex-requirements.ts"],"names":[],"mappings":"AA6BA,gEAAgE;AAChE,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;AAExE,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,iFAAiF;IACjF,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;CAC/B;AAED,kGAAkG;AAClG,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;CAC/B;AAED,yFAAyF;AACzF,eAAO,MAAM,YAAY,mBAAmB,CAAC;AAC7C,eAAO,MAAM,WAAW,8BAA8B,CAAC;AAGvD,eAAO,MAAM,eAAe,EAAE,eAA6C,CAAC;AA8B5E;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAA2B,GAC/B,eAAe,CAajB;AAMD,4FAA4F;AAC5F,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAA2B,GAAG,MAAM,EAAE,CAKrE;AAED,mGAAmG;AACnG,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,eAAe,EAClB,CAAC,EAAE,eAAe,GACjB,eAAe,CAWjB;AAED,yFAAyF;AACzF,wBAAgB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,EAAE,CAI3D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,GAAG,GAAE,MAA2B,GAC/B,iBAAiB,CAiBnB;AAED,8GAA8G;AAC9G,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAA2B,GAAG;IAC/D,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAOA"}
1
+ {"version":3,"file":"tex-requirements.d.ts","sourceRoot":"","sources":["../src/tex-requirements.ts"],"names":[],"mappings":"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"}
@@ -20,12 +20,13 @@
20
20
  * allowed to know where this package is installed (rule 10).
21
21
  */
22
22
  // eslint-disable-next-line boundaries/dependencies -- legacy I/O, moves behind a port in #76
23
- import { existsSync, readFileSync, readdirSync } from "node:fs";
23
+ import { readFileSync, readdirSync } from "node:fs";
24
24
  import { createRequire } from "node:module";
25
25
  import { join } from "node:path";
26
26
  // eslint-disable-next-line boundaries/dependencies -- legacy layer, moves behind a port in #76
27
27
  import Ajv from "ajv";
28
28
  import { packageVenuesDir } from "../skills/paper-pipeline/scripts/consumer.mjs";
29
+ import { PAPER_SETTINGS_FILE } from "../lib/paper-config.mjs";
29
30
  /** The profile every paper gets, and the only one a paper with an unknown venue gets. */
30
31
  export const BASE_PROFILE = "tex-base.jsonc";
31
32
  export const SCHEMA_FILE = "venue-profile.schema.json";
@@ -51,22 +52,85 @@ function validatorFor(dir) {
51
52
  function violations(file, v) {
52
53
  return (v.errors ?? []).map((e) => `${file}: ${e.dataPath || "(top level)"} ${e.message ?? ""}`);
53
54
  }
55
+ /** Every format field a preset left out is null; a merge fills it from the parent. */
56
+ export const NO_FORMAT = {
57
+ pageWidthIn: null,
58
+ pageHeightIn: null,
59
+ columns: null,
60
+ bodyPt: null,
61
+ bodyPtTol: null,
62
+ refPtMin: null,
63
+ refPtMax: null,
64
+ fontsText: null,
65
+ fontsTitle: null,
66
+ kinds: new Map(),
67
+ };
68
+ /** An optional field as the typed preset holds it: absent is null. */
69
+ const orNull = (v) => (v === undefined ? null : v);
70
+ function kindsOf(k) {
71
+ return new Map(Object.entries(k ?? {}).map(([name, v]) => [
72
+ name,
73
+ {
74
+ bodyPagesMax: orNull(v.body_pages_max),
75
+ refPagesMax: orNull(v.ref_pages_max),
76
+ },
77
+ ]));
78
+ }
79
+ function formatOf(j = {}) {
80
+ return {
81
+ pageWidthIn: orNull(j.page_w_in),
82
+ pageHeightIn: orNull(j.page_h_in),
83
+ columns: orNull(j.columns),
84
+ bodyPt: orNull(j.body_pt),
85
+ bodyPtTol: orNull(j.body_pt_tol),
86
+ refPtMin: orNull(j.ref_pt_min),
87
+ refPtMax: orNull(j.ref_pt_max),
88
+ fontsText: orNull(j.fonts_text),
89
+ fontsTitle: orNull(j.fonts_title),
90
+ kinds: kindsOf(j.kinds),
91
+ };
92
+ }
54
93
  /**
55
- * The text of one profile → its typed requirements, or an Error naming every problem.
94
+ * The text of one preset file → the typed file, or an Error naming every problem. The ONE parser
95
+ * of a preset: the toolchain reads its `tex`, the venue rules its `format`, the config its `rules`.
56
96
  *
57
97
  * @param text the file's contents
58
98
  * @param file the name to put in messages
59
99
  * @param dir the directory holding the schema (the shipped venues directory by default)
60
100
  */
61
- export function parseProfile(text, file, dir = packageVenuesDir()) {
101
+ export function parsePreset(text, file, dir = packageVenuesDir()) {
62
102
  const { config, error } = typescript().parseConfigFileTextToJson(file, text);
63
103
  if (error)
64
104
  throw new Error(`${file}: not valid JSONC — ${typescript().flattenDiagnosticMessageText(error.messageText, " ")}`);
65
105
  const validate = validatorFor(dir);
66
106
  if (!validate(config))
67
107
  throw new Error(`${file} does not match ${SCHEMA_FILE}:\n ${violations(file, validate).join("\n ")}`);
68
- const tex = config.tex;
69
- return { packages: tex.packages ?? {}, tools: tex.tools ?? {} };
108
+ const j = config;
109
+ return {
110
+ extends: orNull(j.extends),
111
+ name: orNull(j.name),
112
+ template: orNull(j.template),
113
+ tex: j.tex
114
+ ? { packages: j.tex.packages ?? {}, tools: j.tex.tools ?? {} }
115
+ : null,
116
+ format: formatOf(j.format),
117
+ rules: j.rules ?? {},
118
+ };
119
+ }
120
+ /** The text of one preset → the TeX requirements it declares itself (none without a `tex` block). */
121
+ export function parseProfile(text, file, dir = packageVenuesDir()) {
122
+ return parsePreset(text, file, dir).tex ?? NO_REQUIREMENTS;
123
+ }
124
+ /**
125
+ * The file a venue's profile lives in, or null when the name cannot be a venue (the base set is a
126
+ * profile file but not a venue). Whether the file exists is the caller's question.
127
+ */
128
+ export function profileFileOf(venue) {
129
+ return venue === BASE_PROFILE.slice(0, -PROFILE_EXT.length) ||
130
+ venue.includes("/") ||
131
+ venue.includes("\\")
132
+ ? null
133
+ : `${venue}${PROFILE_EXT}`;
70
134
  }
71
135
  function readProfile(dir, file) {
72
136
  return parseProfile(readFileSync(join(dir, file), "utf8"), file, dir);
@@ -98,30 +162,33 @@ export function packageNames(tex) {
98
162
  ].sort();
99
163
  }
100
164
  /**
101
- * What ONE paper needs: the base set plus its venue's block. A paper with no venue, or a venue this
102
- * package has no profile for, gets the base set — and the source says which, so an ACM paper built
103
- * without `venue.json` is visibly running on the base set rather than silently.
165
+ * What ONE paper needs: the base set plus its venue preset's `tex` (the union over the preset's
166
+ * `extends` chain, resolved by `src/presets.ts`). A paper with no preset gets the base set, and the
167
+ * source says so, so an ACM paper built without a preset is visibly running on the base set.
104
168
  */
105
- export function requirementsFor(venue, dir = packageVenuesDir()) {
169
+ export function requirementsFor(preset, dir = packageVenuesDir()) {
106
170
  const base = readProfile(dir, BASE_PROFILE);
107
- if (venue === null)
108
- return { source: "the base set (no venue.json)", tex: base };
109
- const file = `${venue}${PROFILE_EXT}`;
110
- if (venue === BASE_PROFILE.slice(0, -PROFILE_EXT.length) ||
111
- !existsSync(join(dir, file)))
112
- return {
113
- source: `the base set (venue ${venue} has no profile in paperlint)`,
171
+ return preset === null
172
+ ? {
173
+ source: `the base set (no venue preset in ${PAPER_SETTINGS_FILE})`,
114
174
  tex: base,
175
+ }
176
+ : {
177
+ source: `venue ${preset.label}`,
178
+ tex: mergeRequirements(base, preset.tex),
115
179
  };
116
- return {
117
- source: `venue ${venue}`,
118
- tex: mergeRequirements(base, readProfile(dir, file)),
119
- };
120
180
  }
121
- /** Everything any profile declares — the set `paperlint toolchain` installs, so one tree builds any paper. */
122
- export function declaredUnion(dir = packageVenuesDir()) {
181
+ /**
182
+ * Everything any shipped preset declares, plus `extra` — the resolved presets of the project's own
183
+ * papers, which may live outside the package. The set `paperlint toolchain` installs, so one tree
184
+ * builds any paper.
185
+ */
186
+ export function declaredUnion(dir = packageVenuesDir(), extra = []) {
123
187
  const venues = venueNames(dir);
124
- const tex = venues.reduce((acc, v) => mergeRequirements(acc, readProfile(dir, `${v}${PROFILE_EXT}`)), readProfile(dir, BASE_PROFILE));
125
- return { tex, profiles: venues.length + 1 };
188
+ const shipped = venues.reduce((acc, v) => mergeRequirements(acc, readProfile(dir, `${v}${PROFILE_EXT}`)), readProfile(dir, BASE_PROFILE));
189
+ return {
190
+ tex: extra.reduce(mergeRequirements, shipped),
191
+ profiles: venues.length + 1,
192
+ };
126
193
  }
127
194
  //# sourceMappingURL=tex-requirements.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tex-requirements.js","sourceRoot":"","sources":["../src/tex-requirements.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tex-requirements.js","sourceRoot":"","sources":["../src/tex-requirements.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ import { type FontEntry, type ReadFacts } from "./facts-file.ts";
2
+ import type { KindLimits, VenueFormat } from "./tex-requirements.ts";
3
+ import type { FlatGeometry } from "./domain/geometry.ts";
4
+ import type { Files } from "./ports/files.ts";
5
+ /** One finding: the message it prints and the values it fills in. */
6
+ export interface Finding {
7
+ readonly messageId: string;
8
+ readonly data: Readonly<Record<string, string | number>>;
9
+ }
10
+ /** A venue that resolved to a profile: its name, its format, and the kind's limits or why not. */
11
+ export interface Resolved {
12
+ readonly venue: string;
13
+ readonly format: VenueFormat;
14
+ readonly kind: {
15
+ readonly name: string;
16
+ readonly limits: KindLimits;
17
+ } | null;
18
+ /** Why the kind did not resolve — `pdf/profile` reports it — or null. */
19
+ readonly kindProblem: Finding | null;
20
+ }
21
+ /** Everything the rules need to know about one paper, decided once. */
22
+ export type Assessment = {
23
+ readonly kind: "no-venue";
24
+ }
25
+ /** A `paperlint.json` that extends no preset yet — `pdf/measured` names the file to set. */
26
+ | {
27
+ readonly kind: "no-preset";
28
+ readonly file: string;
29
+ } | {
30
+ readonly kind: "unresolved";
31
+ readonly finding: Finding;
32
+ } | {
33
+ readonly kind: "unbuilt";
34
+ readonly venue: Resolved;
35
+ } | {
36
+ readonly kind: "stale";
37
+ readonly finding: Finding;
38
+ } | {
39
+ readonly kind: "ready";
40
+ readonly venue: Resolved;
41
+ readonly facts: ReadFacts;
42
+ };
43
+ export interface VenueRuleDeps {
44
+ readonly files: Files;
45
+ /** The package's venues directory (`packageVenuesDir()`): the shipped presets and their schema. */
46
+ readonly venuesDir: string;
47
+ }
48
+ /** One paper, assessed. Reads through `deps.files` only; never throws on a paper's files. */
49
+ export declare function assessPaper(paperDir: string, deps: VenueRuleDeps): Assessment;
50
+ /** Type 3, not embedded, and each family the venue names missing from every font. */
51
+ export declare function judgeFonts(fonts: readonly FontEntry[], format: VenueFormat, venue: string): Finding[];
52
+ /** Page width and height within `dimTol` inches, and the column count, against the preset. */
53
+ export declare function judgeGeometry(g: FlatGeometry, format: VenueFormat, venue: string, dimTol: number): Finding[];
54
+ /**
55
+ * Body and reference pages against the kind's limits, and the reference font size against the
56
+ * profile's range. The range is about the DECLARED size and banal measures the rendered mode, so
57
+ * it is widened by `body_pt_tol` — the drift the preset itself names — or a correct paper fails.
58
+ */
59
+ export declare function judgeLimits(g: FlatGeometry, resolved: Resolved): Finding[];
60
+ /** The body font size against `body_pt ± body_pt_tol`. */
61
+ export declare function judgeBodySize(g: FlatGeometry, format: VenueFormat, venue: string): Finding[];
62
+ /** The slice of ESLint's rule context these rules use. */
63
+ export interface VenueRuleContext {
64
+ readonly filename: string;
65
+ /** ESLint's working directory; file names in messages are shown relative to it. */
66
+ readonly cwd?: string;
67
+ readonly sourceCode: {
68
+ readonly text: string;
69
+ };
70
+ readonly options: readonly unknown[];
71
+ report(d: {
72
+ readonly loc: {
73
+ readonly start: {
74
+ line: number;
75
+ column: number;
76
+ };
77
+ readonly end: {
78
+ line: number;
79
+ column: number;
80
+ };
81
+ };
82
+ readonly messageId: string;
83
+ readonly data?: Readonly<Record<string, string | number>>;
84
+ }): void;
85
+ }
86
+ export interface VenueRuleModule {
87
+ readonly meta: {
88
+ readonly type: "problem" | "suggestion";
89
+ readonly docs: {
90
+ readonly description: string;
91
+ };
92
+ readonly schema: readonly object[];
93
+ readonly messages: Readonly<Record<string, string>>;
94
+ };
95
+ create(context: VenueRuleContext): {
96
+ root?: () => void;
97
+ };
98
+ }
99
+ /** How far, in inches, a measured page dimension may be from the preset's. */
100
+ export declare const DEFAULT_DIM_TOL_IN = 0.05;
101
+ export type VenueRuleName = "fresh" | "profile" | "measured" | "fonts" | "geometry" | "limits" | "body-size";
102
+ /**
103
+ * The level each venue rule is on at in paperlint's own config, for every `paper.tex`. One owner:
104
+ * the config reads it, the docs describe it, a consumer overrides it in `rules`.
105
+ */
106
+ export declare const VENUE_RULE_LEVELS: Readonly<Record<`pdf/${VenueRuleName}`, "error" | "warn">>;
107
+ /** The venue rules, as the rules of the `pdf` plugin (beside `last-page-balance`). */
108
+ export declare function venueRules(deps: VenueRuleDeps): Record<VenueRuleName, VenueRuleModule>;
109
+ //# sourceMappingURL=venue-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"venue-rules.d.ts","sourceRoot":"","sources":["../src/venue-rules.ts"],"names":[],"mappings":"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"}