pretext-pdf 1.1.1 → 1.7.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 (342) hide show
  1. package/CHANGELOG.md +689 -0
  2. package/README.md +82 -7
  3. package/dist/allowed-props.d.ts +76 -0
  4. package/dist/allowed-props.d.ts.map +1 -1
  5. package/dist/allowed-props.js.map +1 -1
  6. package/dist/assets/generators/barcode.d.ts +9 -0
  7. package/dist/assets/generators/barcode.d.ts.map +1 -0
  8. package/dist/assets/generators/barcode.js +24 -0
  9. package/dist/assets/generators/barcode.js.map +1 -0
  10. package/dist/assets/generators/chart.d.ts +13 -0
  11. package/dist/assets/generators/chart.d.ts.map +1 -0
  12. package/dist/assets/generators/chart.js +32 -0
  13. package/dist/assets/generators/chart.js.map +1 -0
  14. package/dist/assets/generators/qr.d.ts +9 -0
  15. package/dist/assets/generators/qr.d.ts.map +1 -0
  16. package/dist/assets/generators/qr.js +25 -0
  17. package/dist/assets/generators/qr.js.map +1 -0
  18. package/dist/assets/index.d.ts +19 -0
  19. package/dist/assets/index.d.ts.map +1 -0
  20. package/dist/assets/index.js +19 -0
  21. package/dist/assets/index.js.map +1 -0
  22. package/dist/assets/loaders/images.d.ts +20 -0
  23. package/dist/assets/loaders/images.d.ts.map +1 -0
  24. package/dist/assets/loaders/images.js +69 -0
  25. package/dist/assets/loaders/images.js.map +1 -0
  26. package/dist/assets/loaders/orchestrator.d.ts +24 -0
  27. package/dist/assets/loaders/orchestrator.d.ts.map +1 -0
  28. package/dist/assets/loaders/orchestrator.js +109 -0
  29. package/dist/assets/loaders/orchestrator.js.map +1 -0
  30. package/dist/assets/loaders/vectors.d.ts +25 -0
  31. package/dist/assets/loaders/vectors.d.ts.map +1 -0
  32. package/dist/assets/loaders/vectors.js +118 -0
  33. package/dist/assets/loaders/vectors.js.map +1 -0
  34. package/dist/assets/loaders/watermark.d.ts +12 -0
  35. package/dist/assets/loaders/watermark.d.ts.map +1 -0
  36. package/dist/assets/loaders/watermark.js +40 -0
  37. package/dist/assets/loaders/watermark.js.map +1 -0
  38. package/dist/assets/security/fetch.d.ts +14 -0
  39. package/dist/assets/security/fetch.d.ts.map +1 -0
  40. package/dist/assets/security/fetch.js +112 -0
  41. package/dist/assets/security/fetch.js.map +1 -0
  42. package/dist/assets/security/ipv4-normalize.d.ts +28 -0
  43. package/dist/assets/security/ipv4-normalize.d.ts.map +1 -0
  44. package/dist/assets/security/ipv4-normalize.js +116 -0
  45. package/dist/assets/security/ipv4-normalize.js.map +1 -0
  46. package/dist/assets/security/path-allowlist.d.ts +12 -0
  47. package/dist/assets/security/path-allowlist.d.ts.map +1 -0
  48. package/dist/assets/security/path-allowlist.js +26 -0
  49. package/dist/assets/security/path-allowlist.js.map +1 -0
  50. package/dist/assets/security/url-validation.d.ts +22 -0
  51. package/dist/assets/security/url-validation.d.ts.map +1 -0
  52. package/dist/assets/security/url-validation.js +164 -0
  53. package/dist/assets/security/url-validation.js.map +1 -0
  54. package/dist/assets/svg/dimensions.d.ts +19 -0
  55. package/dist/assets/svg/dimensions.d.ts.map +1 -0
  56. package/dist/assets/svg/dimensions.js +43 -0
  57. package/dist/assets/svg/dimensions.js.map +1 -0
  58. package/dist/assets/svg/rasterize.d.ts +6 -0
  59. package/dist/assets/svg/rasterize.d.ts.map +1 -0
  60. package/dist/assets/svg/rasterize.js +38 -0
  61. package/dist/assets/svg/rasterize.js.map +1 -0
  62. package/dist/assets/svg/resolve-content.d.ts +16 -0
  63. package/dist/assets/svg/resolve-content.d.ts.map +1 -0
  64. package/dist/assets/svg/resolve-content.js +38 -0
  65. package/dist/assets/svg/resolve-content.js.map +1 -0
  66. package/dist/assets/svg/sanitize.d.ts +22 -0
  67. package/dist/assets/svg/sanitize.d.ts.map +1 -0
  68. package/dist/assets/svg/sanitize.js +46 -0
  69. package/dist/assets/svg/sanitize.js.map +1 -0
  70. package/dist/assets/util/redact-path.d.ts +14 -0
  71. package/dist/assets/util/redact-path.d.ts.map +1 -0
  72. package/dist/assets/util/redact-path.js +16 -0
  73. package/dist/assets/util/redact-path.js.map +1 -0
  74. package/dist/assets.d.ts +10 -27
  75. package/dist/assets.d.ts.map +1 -1
  76. package/dist/assets.js +10 -549
  77. package/dist/assets.js.map +1 -1
  78. package/dist/builder.d.ts.map +1 -1
  79. package/dist/builder.js +2 -1
  80. package/dist/builder.js.map +1 -1
  81. package/dist/cli.js +11 -1
  82. package/dist/cli.js.map +1 -1
  83. package/dist/compat.d.ts +63 -1
  84. package/dist/compat.d.ts.map +1 -1
  85. package/dist/compat.js +42 -5
  86. package/dist/compat.js.map +1 -1
  87. package/dist/errors.d.ts +2 -2
  88. package/dist/errors.d.ts.map +1 -1
  89. package/dist/errors.js +2 -2
  90. package/dist/errors.js.map +1 -1
  91. package/dist/fonts.d.ts.map +1 -1
  92. package/dist/fonts.js +8 -10
  93. package/dist/fonts.js.map +1 -1
  94. package/dist/index.d.ts +1 -1
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +7 -5
  97. package/dist/index.js.map +1 -1
  98. package/dist/layout-state.d.ts +1 -1
  99. package/dist/layout-state.d.ts.map +1 -1
  100. package/dist/layout-state.js +5 -0
  101. package/dist/layout-state.js.map +1 -1
  102. package/dist/measure-blocks/float-group.d.ts +9 -0
  103. package/dist/measure-blocks/float-group.d.ts.map +1 -0
  104. package/dist/measure-blocks/float-group.js +103 -0
  105. package/dist/measure-blocks/float-group.js.map +1 -0
  106. package/dist/measure-blocks/helpers.d.ts +44 -0
  107. package/dist/measure-blocks/helpers.d.ts.map +1 -0
  108. package/dist/measure-blocks/helpers.js +43 -0
  109. package/dist/measure-blocks/helpers.js.map +1 -0
  110. package/dist/measure-blocks/highlight.d.ts +26 -0
  111. package/dist/measure-blocks/highlight.d.ts.map +1 -0
  112. package/dist/measure-blocks/highlight.js +169 -0
  113. package/dist/measure-blocks/highlight.js.map +1 -0
  114. package/dist/measure-blocks/image.d.ts +9 -0
  115. package/dist/measure-blocks/image.d.ts.map +1 -0
  116. package/dist/measure-blocks/image.js +136 -0
  117. package/dist/measure-blocks/image.js.map +1 -0
  118. package/dist/measure-blocks/index.d.ts +24 -0
  119. package/dist/measure-blocks/index.d.ts.map +1 -0
  120. package/dist/measure-blocks/index.js +179 -0
  121. package/dist/measure-blocks/index.js.map +1 -0
  122. package/dist/measure-blocks/list.d.ts +8 -0
  123. package/dist/measure-blocks/list.d.ts.map +1 -0
  124. package/dist/measure-blocks/list.js +108 -0
  125. package/dist/measure-blocks/list.js.map +1 -0
  126. package/dist/measure-blocks/simple-blocks.d.ts +18 -0
  127. package/dist/measure-blocks/simple-blocks.d.ts.map +1 -0
  128. package/dist/measure-blocks/simple-blocks.js +121 -0
  129. package/dist/measure-blocks/simple-blocks.js.map +1 -0
  130. package/dist/measure-blocks/table/columns.d.ts +17 -0
  131. package/dist/measure-blocks/table/columns.d.ts.map +1 -0
  132. package/dist/measure-blocks/table/columns.js +83 -0
  133. package/dist/measure-blocks/table/columns.js.map +1 -0
  134. package/dist/measure-blocks/table/measure.d.ts +8 -0
  135. package/dist/measure-blocks/table/measure.d.ts.map +1 -0
  136. package/dist/measure-blocks/table/measure.js +231 -0
  137. package/dist/measure-blocks/table/measure.js.map +1 -0
  138. package/dist/measure-blocks/table/spans.d.ts +25 -0
  139. package/dist/measure-blocks/table/spans.d.ts.map +1 -0
  140. package/dist/measure-blocks/table/spans.js +55 -0
  141. package/dist/measure-blocks/table/spans.js.map +1 -0
  142. package/dist/measure-blocks/text-blocks.d.ts +17 -0
  143. package/dist/measure-blocks/text-blocks.d.ts.map +1 -0
  144. package/dist/measure-blocks/text-blocks.js +242 -0
  145. package/dist/measure-blocks/text-blocks.js.map +1 -0
  146. package/dist/measure-text.d.ts +21 -3
  147. package/dist/measure-text.d.ts.map +1 -1
  148. package/dist/measure-text.js +87 -36
  149. package/dist/measure-text.js.map +1 -1
  150. package/dist/measure.d.ts +1 -1
  151. package/dist/measure.d.ts.map +1 -1
  152. package/dist/measure.js +8 -6
  153. package/dist/measure.js.map +1 -1
  154. package/dist/node-polyfill.d.ts.map +1 -1
  155. package/dist/node-polyfill.js +9 -0
  156. package/dist/node-polyfill.js.map +1 -1
  157. package/dist/pipeline-footnotes.d.ts +1 -1
  158. package/dist/pipeline-footnotes.d.ts.map +1 -1
  159. package/dist/pipeline-toc.d.ts +1 -1
  160. package/dist/pipeline-toc.d.ts.map +1 -1
  161. package/dist/pipeline.d.ts +3 -3
  162. package/dist/pipeline.d.ts.map +1 -1
  163. package/dist/pipeline.js +4 -5
  164. package/dist/pipeline.js.map +1 -1
  165. package/dist/plugin-types.d.ts +1 -1
  166. package/dist/plugin-types.d.ts.map +1 -1
  167. package/dist/post-process.d.ts +2 -2
  168. package/dist/post-process.d.ts.map +1 -1
  169. package/dist/post-process.js +47 -10
  170. package/dist/post-process.js.map +1 -1
  171. package/dist/render-blocks/blockquote.d.ts +7 -0
  172. package/dist/render-blocks/blockquote.d.ts.map +1 -0
  173. package/dist/render-blocks/blockquote.js +87 -0
  174. package/dist/render-blocks/blockquote.js.map +1 -0
  175. package/dist/render-blocks/callout.d.ts +7 -0
  176. package/dist/render-blocks/callout.d.ts.map +1 -0
  177. package/dist/render-blocks/callout.js +84 -0
  178. package/dist/render-blocks/callout.js.map +1 -0
  179. package/dist/render-blocks/code.d.ts +7 -0
  180. package/dist/render-blocks/code.d.ts.map +1 -0
  181. package/dist/render-blocks/code.js +84 -0
  182. package/dist/render-blocks/code.js.map +1 -0
  183. package/dist/render-blocks/footnote.d.ts +11 -0
  184. package/dist/render-blocks/footnote.d.ts.map +1 -0
  185. package/dist/render-blocks/footnote.js +45 -0
  186. package/dist/render-blocks/footnote.js.map +1 -0
  187. package/dist/render-blocks/header-footer.d.ts +11 -0
  188. package/dist/render-blocks/header-footer.d.ts.map +1 -0
  189. package/dist/render-blocks/header-footer.js +56 -0
  190. package/dist/render-blocks/header-footer.js.map +1 -0
  191. package/dist/render-blocks/hr.d.ts +7 -0
  192. package/dist/render-blocks/hr.d.ts.map +1 -0
  193. package/dist/render-blocks/hr.js +24 -0
  194. package/dist/render-blocks/hr.js.map +1 -0
  195. package/dist/render-blocks/image.d.ts +9 -0
  196. package/dist/render-blocks/image.d.ts.map +1 -0
  197. package/dist/render-blocks/image.js +135 -0
  198. package/dist/render-blocks/image.js.map +1 -0
  199. package/dist/render-blocks/index.d.ts +17 -0
  200. package/dist/render-blocks/index.d.ts.map +1 -0
  201. package/dist/render-blocks/index.js +17 -0
  202. package/dist/render-blocks/index.js.map +1 -0
  203. package/dist/render-blocks/list-item.d.ts +7 -0
  204. package/dist/render-blocks/list-item.d.ts.map +1 -0
  205. package/dist/render-blocks/list-item.js +80 -0
  206. package/dist/render-blocks/list-item.js.map +1 -0
  207. package/dist/render-blocks/rich.d.ts +7 -0
  208. package/dist/render-blocks/rich.d.ts.map +1 -0
  209. package/dist/render-blocks/rich.js +160 -0
  210. package/dist/render-blocks/rich.js.map +1 -0
  211. package/dist/render-blocks/table.d.ts +7 -0
  212. package/dist/render-blocks/table.d.ts.map +1 -0
  213. package/dist/render-blocks/table.js +139 -0
  214. package/dist/render-blocks/table.js.map +1 -0
  215. package/dist/render-blocks/text.d.ts +7 -0
  216. package/dist/render-blocks/text.d.ts.map +1 -0
  217. package/dist/render-blocks/text.js +183 -0
  218. package/dist/render-blocks/text.js.map +1 -0
  219. package/dist/render-blocks/watermark.d.ts +8 -0
  220. package/dist/render-blocks/watermark.d.ts.map +1 -0
  221. package/dist/render-blocks/watermark.js +52 -0
  222. package/dist/render-blocks/watermark.js.map +1 -0
  223. package/dist/render-extras.d.ts.map +1 -1
  224. package/dist/render-extras.js +1 -2
  225. package/dist/render-extras.js.map +1 -1
  226. package/dist/render-utils.d.ts.map +1 -1
  227. package/dist/render-utils.js +10 -6
  228. package/dist/render-utils.js.map +1 -1
  229. package/dist/render.d.ts.map +1 -1
  230. package/dist/render.js +9 -3
  231. package/dist/render.js.map +1 -1
  232. package/dist/rich-text.d.ts +2 -1
  233. package/dist/rich-text.d.ts.map +1 -1
  234. package/dist/rich-text.js +0 -1
  235. package/dist/rich-text.js.map +1 -1
  236. package/dist/types-internal.d.ts +19 -3
  237. package/dist/types-internal.d.ts.map +1 -1
  238. package/dist/types-public/document.d.ts +261 -0
  239. package/dist/types-public/document.d.ts.map +1 -0
  240. package/dist/types-public/document.js +2 -0
  241. package/dist/types-public/document.js.map +1 -0
  242. package/dist/types-public/elements-block.d.ts +246 -0
  243. package/dist/types-public/elements-block.d.ts.map +1 -0
  244. package/dist/types-public/elements-block.js +8 -0
  245. package/dist/types-public/elements-block.js.map +1 -0
  246. package/dist/types-public/elements-media.d.ts +199 -0
  247. package/dist/types-public/elements-media.d.ts.map +1 -0
  248. package/dist/types-public/elements-media.js +2 -0
  249. package/dist/types-public/elements-media.js.map +1 -0
  250. package/dist/types-public/elements-text.d.ts +327 -0
  251. package/dist/types-public/elements-text.d.ts.map +1 -0
  252. package/dist/types-public/elements-text.js +2 -0
  253. package/dist/types-public/elements-text.js.map +1 -0
  254. package/dist/types-public/index.d.ts +14 -0
  255. package/dist/types-public/index.d.ts.map +1 -0
  256. package/dist/types-public/index.js +2 -0
  257. package/dist/types-public/index.js.map +1 -0
  258. package/dist/types-public/render-options.d.ts +38 -0
  259. package/dist/types-public/render-options.d.ts.map +1 -0
  260. package/dist/types-public/render-options.js +2 -0
  261. package/dist/types-public/render-options.js.map +1 -0
  262. package/dist/types-public/union.d.ts +13 -0
  263. package/dist/types-public/union.d.ts.map +1 -0
  264. package/dist/types-public/union.js +2 -0
  265. package/dist/types-public/union.js.map +1 -0
  266. package/dist/types-public/validation.d.ts +64 -0
  267. package/dist/types-public/validation.d.ts.map +1 -0
  268. package/dist/types-public/validation.js +2 -0
  269. package/dist/types-public/validation.js.map +1 -0
  270. package/dist/types-public.d.ts +5 -1081
  271. package/dist/types-public.d.ts.map +1 -1
  272. package/dist/types.d.ts +1 -1
  273. package/dist/types.d.ts.map +1 -1
  274. package/dist/validate/document.d.ts +28 -0
  275. package/dist/validate/document.d.ts.map +1 -0
  276. package/dist/validate/document.js +295 -0
  277. package/dist/validate/document.js.map +1 -0
  278. package/dist/validate/elements/forms-floats.d.ts +19 -0
  279. package/dist/validate/elements/forms-floats.d.ts.map +1 -0
  280. package/dist/validate/elements/forms-floats.js +96 -0
  281. package/dist/validate/elements/forms-floats.js.map +1 -0
  282. package/dist/validate/elements/list.d.ts +10 -0
  283. package/dist/validate/elements/list.d.ts.map +1 -0
  284. package/dist/validate/elements/list.js +66 -0
  285. package/dist/validate/elements/list.js.map +1 -0
  286. package/dist/validate/elements/media.d.ts +23 -0
  287. package/dist/validate/elements/media.d.ts.map +1 -0
  288. package/dist/validate/elements/media.js +179 -0
  289. package/dist/validate/elements/media.js.map +1 -0
  290. package/dist/validate/elements/structural-simple.d.ts +21 -0
  291. package/dist/validate/elements/structural-simple.d.ts.map +1 -0
  292. package/dist/validate/elements/structural-simple.js +63 -0
  293. package/dist/validate/elements/structural-simple.js.map +1 -0
  294. package/dist/validate/elements/structural.d.ts +12 -0
  295. package/dist/validate/elements/structural.d.ts.map +1 -0
  296. package/dist/validate/elements/structural.js +12 -0
  297. package/dist/validate/elements/structural.js.map +1 -0
  298. package/dist/validate/elements/table.d.ts +10 -0
  299. package/dist/validate/elements/table.d.ts.map +1 -0
  300. package/dist/validate/elements/table.js +165 -0
  301. package/dist/validate/elements/table.js.map +1 -0
  302. package/dist/validate/elements/text.d.ts +26 -0
  303. package/dist/validate/elements/text.d.ts.map +1 -0
  304. package/dist/validate/elements/text.js +331 -0
  305. package/dist/validate/elements/text.js.map +1 -0
  306. package/dist/validate/errors.d.ts +9 -0
  307. package/dist/validate/errors.d.ts.map +1 -0
  308. package/dist/validate/errors.js +43 -0
  309. package/dist/validate/errors.js.map +1 -0
  310. package/dist/validate/fonts.d.ts +11 -0
  311. package/dist/validate/fonts.d.ts.map +1 -0
  312. package/dist/validate/fonts.js +118 -0
  313. package/dist/validate/fonts.js.map +1 -0
  314. package/dist/validate/helpers.d.ts +76 -0
  315. package/dist/validate/helpers.d.ts.map +1 -0
  316. package/dist/validate/helpers.js +169 -0
  317. package/dist/validate/helpers.js.map +1 -0
  318. package/dist/validate/index.d.ts +37 -0
  319. package/dist/validate/index.d.ts.map +1 -0
  320. package/dist/validate/index.js +279 -0
  321. package/dist/validate/index.js.map +1 -0
  322. package/dist/validate.d.ts +6 -18
  323. package/dist/validate.d.ts.map +1 -1
  324. package/dist/validate.js +6 -1585
  325. package/dist/validate.js.map +1 -1
  326. package/dist/vendor/pretext/VERSION.d.ts +3 -0
  327. package/dist/vendor/pretext/VERSION.d.ts.map +1 -0
  328. package/dist/vendor/pretext/VERSION.js +12 -0
  329. package/dist/vendor/pretext/VERSION.js.map +1 -0
  330. package/dist/version-check.d.ts +47 -0
  331. package/dist/version-check.d.ts.map +1 -0
  332. package/dist/version-check.js +75 -0
  333. package/dist/version-check.js.map +1 -0
  334. package/package.json +30 -7
  335. package/dist/measure-blocks.d.ts +0 -26
  336. package/dist/measure-blocks.d.ts.map +0 -1
  337. package/dist/measure-blocks.js +0 -1317
  338. package/dist/measure-blocks.js.map +0 -1
  339. package/dist/render-blocks.d.ts +0 -28
  340. package/dist/render-blocks.d.ts.map +0 -1
  341. package/dist/render-blocks.js +0 -1059
  342. package/dist/render-blocks.js.map +0 -1
@@ -0,0 +1,279 @@
1
+ import { PretextPdfError } from '../errors.js';
2
+ import { ALLOWED_PROPS, ALLOWED_PROPS_SUB } from '../allowed-props.js';
3
+ import { ELEMENT_TYPES } from '../element-types.js';
4
+ import { findPlugin, runPluginValidate } from '../plugin-registry.js';
5
+ import { BUNDLED_FAMILIES, assertDepthOk, assertUnknownProps, formatErrors, } from './helpers.js';
6
+ import { validateDocumentLevel } from './document.js';
7
+ import { validateFontReferences } from './fonts.js';
8
+ import { isValidPdfDocumentLike, parseValidationErrorsStructured } from './errors.js';
9
+ import { validateParagraph, validateHeading, validateRichParagraph, validateBlockquote, validateCallout, validateCode, } from './elements/text.js';
10
+ import { validateTable } from './elements/table.js';
11
+ import { validateList } from './elements/list.js';
12
+ import { validateImage, validateSvg, validateQrCode, validateBarcode, validateChart, } from './elements/media.js';
13
+ import { validateSpacer, validateHr, validateToc, validateComment, } from './elements/structural-simple.js';
14
+ import { validateFormField, validateFootnoteDef, validateFloatGroup, } from './elements/forms-floats.js';
15
+ /**
16
+ * Validate a PdfDocument and throw a {@link PretextPdfError} if any errors are found.
17
+ * @public
18
+ */
19
+ export function validate(doc, options) {
20
+ const strict = options?.strict ?? false;
21
+ const errors = [];
22
+ // Plugin pre-flight: enforce type string safety and no collision with built-ins
23
+ for (const plugin of options?.plugins ?? []) {
24
+ if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(plugin.type)) {
25
+ throw new PretextPdfError('VALIDATION_ERROR', `Plugin type '${plugin.type}' is invalid. Must start with a letter and contain only letters, digits, hyphens, or underscores.`);
26
+ }
27
+ if (ELEMENT_TYPES.includes(plugin.type)) {
28
+ throw new PretextPdfError('VALIDATION_ERROR', `Plugin type '${plugin.type}' collides with a built-in element type. Choose a different type string.`);
29
+ }
30
+ }
31
+ // Strict: check doc-level properties
32
+ if (strict) {
33
+ assertUnknownProps(doc, ALLOWED_PROPS_SUB['document'], 'doc', errors);
34
+ }
35
+ // content must be a non-empty array
36
+ if (!Array.isArray(doc.content) || doc.content.length === 0) {
37
+ throw new PretextPdfError('VALIDATION_ERROR', 'document.content must be a non-empty array');
38
+ }
39
+ // memory guard
40
+ if (doc.content.length > 50_000) {
41
+ throw new PretextPdfError('VALIDATION_ERROR', `document.content has ${doc.content.length} elements (hard limit: 50,000). Split into multiple documents.`);
42
+ }
43
+ if (doc.content.length > 10_000) {
44
+ ;
45
+ (options?.logger?.warn ?? console.warn)(`[pretext-pdf] Performance advisory: document.content has ${doc.content.length} elements (recommended max: 10,000). Large documents may be slow.`);
46
+ }
47
+ // Document-level checks (pageSize, margins, fonts, header/footer,
48
+ // defaultParagraphStyle, sections, watermark, encryption, signature,
49
+ // bookmarks, hyphenation, metadata). Extracted to validate/document.ts in
50
+ // v1.5.0 item A; order, error codes, and messages preserved bit-exact.
51
+ // The ctx is constructed early so doc-level checks share the same errors[]
52
+ // accumulator and strict flag used by element validators below.
53
+ const loadedFamilies = new Set();
54
+ const seen = new WeakSet();
55
+ const ctx = {
56
+ errors,
57
+ strict,
58
+ loadedFamilies,
59
+ seen,
60
+ options,
61
+ };
62
+ validateDocumentLevel(doc, ctx);
63
+ // validate each content element
64
+ // Populate loadedFamilies AFTER document-level checks succeed (validateFontSpec
65
+ // would have thrown above on any invalid font.family). Element validators
66
+ // and validateFontReferences both read from this Set via ctx.
67
+ for (const family of BUNDLED_FAMILIES)
68
+ loadedFamilies.add(family);
69
+ for (const f of doc.fonts ?? [])
70
+ loadedFamilies.add(f.family);
71
+ // Check for duplicate form field names
72
+ const formFieldNames = new Set();
73
+ for (const el of doc.content) {
74
+ if (el.type === 'form-field') {
75
+ if (formFieldNames.has(el.name)) {
76
+ throw new PretextPdfError('FORM_FIELD_NAME_DUPLICATE', `Duplicate form field name: "${el.name}". Each form field must have a unique name.`);
77
+ }
78
+ formFieldNames.add(el.name);
79
+ }
80
+ }
81
+ // ctx (with errors/strict/loadedFamilies/seen/options) was constructed
82
+ // above so document-level checks and element validators share the same
83
+ // ValidationContext. The per-call `seen` WeakSet keeps concurrent
84
+ // validate() calls isolated on multi-document servers (see withCycleGuard
85
+ // docblock for the race-condition rationale).
86
+ for (let i = 0; i < doc.content.length; i++) {
87
+ validateElement(doc.content[i], i, 0, ctx);
88
+ }
89
+ // ── Footnote ref/def cross-validation ─────────────────────────────────────
90
+ const footnoteDefIds = new Map(); // id → content index
91
+ const footnoteRefIds = new Set();
92
+ // Collect all def ids
93
+ for (let i = 0; i < doc.content.length; i++) {
94
+ const el = doc.content[i];
95
+ if (el.type === 'footnote-def') {
96
+ if (footnoteDefIds.has(el.id)) {
97
+ throw new PretextPdfError('FOOTNOTE_DEF_DUPLICATE', `content[${i}] (footnote-def): duplicate id "${el.id}". Each footnote must have a unique id.`);
98
+ }
99
+ footnoteDefIds.set(el.id, i);
100
+ }
101
+ }
102
+ // Collect all ref ids from rich-paragraph spans
103
+ for (const el of doc.content) {
104
+ if (el.type === 'rich-paragraph') {
105
+ for (const span of el.spans) {
106
+ if (span.footnoteRef) {
107
+ footnoteRefIds.add(span.footnoteRef);
108
+ }
109
+ }
110
+ }
111
+ }
112
+ // Orphaned ref: ref id with no matching def
113
+ for (const refId of footnoteRefIds) {
114
+ if (!footnoteDefIds.has(refId)) {
115
+ throw new PretextPdfError('FOOTNOTE_REF_ORPHANED', `A rich-paragraph span references footnote id "${refId}" but no footnote-def with that id exists in doc.content.`);
116
+ }
117
+ }
118
+ // Orphaned def: def id never referenced
119
+ for (const [defId] of footnoteDefIds) {
120
+ if (!footnoteRefIds.has(defId)) {
121
+ throw new PretextPdfError('FOOTNOTE_DEF_ORPHANED', `footnote-def "${defId}" is defined but never referenced by any rich-paragraph span.`);
122
+ }
123
+ }
124
+ // validate all font references are loadable
125
+ validateFontReferences(doc, loadedFamilies);
126
+ // Throw collected strict validation errors
127
+ if (errors.length > 0) {
128
+ const msg = formatErrors(errors);
129
+ throw new PretextPdfError('VALIDATION_ERROR', msg);
130
+ }
131
+ }
132
+ /**
133
+ * Validate a pretext-pdf document and return a structured result instead of throwing.
134
+ *
135
+ * Use this when you want to inspect all validation errors programmatically.
136
+ * The existing {@link validate} function throws on first error and is unchanged.
137
+ *
138
+ * @param doc - The document to validate (typed as `unknown` to accept unverified input)
139
+ * @param options - `{ strict?: boolean; logger?: Logger }` — strict defaults to false (matches render() behavior); logger routes diagnostic warnings away from console.warn
140
+ * @returns {@link ValidationResult} with `valid`, `errors[]`, and `errorCount`
141
+ * @public
142
+ */
143
+ export function validateDocument(doc, options) {
144
+ if (!isValidPdfDocumentLike(doc)) {
145
+ return { valid: false, errors: [{ path: 'document', message: 'Document must be a non-null object', severity: 'error', code: 'VALIDATION_ERROR' }], errorCount: 1, warningCount: 0 };
146
+ }
147
+ try {
148
+ validate(doc, { strict: options?.strict ?? false, ...(options?.logger !== undefined ? { logger: options.logger } : {}) });
149
+ return { valid: true, errors: [], errorCount: 0, warningCount: 0 };
150
+ }
151
+ catch (err) {
152
+ if (err instanceof PretextPdfError) {
153
+ const errors = parseValidationErrorsStructured(err.message, err.code);
154
+ const warnings = errors.filter((e) => e.severity === 'warning');
155
+ const warningCount = warnings.length;
156
+ const headerMatch = err.message.match(/^Strict validation failed \((\d+) issue/);
157
+ const errorCount = headerMatch?.[1] != null ? parseInt(headerMatch[1], 10) : errors.filter((e) => e.severity === 'error').length;
158
+ return { valid: false, errors, errorCount, warningCount };
159
+ }
160
+ const msg = err instanceof Error ? err.message : String(err);
161
+ return { valid: false, errors: [{ path: 'document', message: `Unexpected validation error: ${msg}`, severity: 'error', code: 'VALIDATION_ERROR' }], errorCount: 1, warningCount: 0 };
162
+ }
163
+ }
164
+ /**
165
+ * Element-level dispatch. Order of checks (depth guard → type check → toc-entry
166
+ * rejection → cycle guard → strict-props → switch) is preserved bit-exact from
167
+ * the pre-split implementation.
168
+ */
169
+ function validateElement(el, index, depth, ctx) {
170
+ const prefix = `content[${index}]`;
171
+ // Depth cap: fires before any per-type logic runs, including for plugin
172
+ // elements that do not open their own withCycleGuard scope.
173
+ assertDepthOk(depth, prefix);
174
+ if (!el || typeof el !== 'object' || !('type' in el)) {
175
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix}: each element must have a 'type' field`);
176
+ }
177
+ // Reject the internal TOC entry type before normal element handling.
178
+ // TocEntryElement is synthesized internally during the measurement pass and
179
+ // is not part of the public ContentElement union, so users must not supply it.
180
+ if (el.type === 'toc-entry') {
181
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix}: 'toc-entry' is an internal type and cannot be used in document content`);
182
+ }
183
+ // Cycle guard is owned by the per-type validators (validateList opens its
184
+ // own withCycleGuard scope at the top of list.ts, validateFloatGroup does
185
+ // the same in forms-floats.ts). An outer guard here would run a no-op body
186
+ // and finally-delete the element from `seen` BEFORE the inner guard adds
187
+ // it, so it never actually protected anything. Removed in v1.4.1 (M1).
188
+ // Strict: check element properties match allowed set for type
189
+ if (ctx.strict) {
190
+ const allowed = ALLOWED_PROPS[el.type];
191
+ if (allowed) {
192
+ assertUnknownProps(el, allowed, prefix, ctx.errors);
193
+ }
194
+ }
195
+ switch (el.type) {
196
+ case 'paragraph':
197
+ validateParagraph(el, prefix, ctx);
198
+ break;
199
+ case 'heading':
200
+ validateHeading(el, prefix, ctx);
201
+ break;
202
+ case 'spacer':
203
+ validateSpacer(el, prefix, ctx);
204
+ break;
205
+ case 'table':
206
+ validateTable(el, prefix, depth, ctx);
207
+ break;
208
+ case 'image':
209
+ validateImage(el, prefix, ctx);
210
+ break;
211
+ case 'svg':
212
+ validateSvg(el, prefix, ctx);
213
+ break;
214
+ case 'qr-code':
215
+ validateQrCode(el, prefix, ctx);
216
+ break;
217
+ case 'barcode':
218
+ validateBarcode(el, prefix, ctx);
219
+ break;
220
+ case 'chart':
221
+ validateChart(el, prefix, ctx);
222
+ break;
223
+ case 'list':
224
+ validateList(el, prefix, depth, ctx);
225
+ break;
226
+ case 'hr':
227
+ validateHr(el, prefix, ctx);
228
+ break;
229
+ case 'page-break': /* no fields to validate */ break;
230
+ case 'rich-paragraph':
231
+ validateRichParagraph(el, prefix, depth, ctx);
232
+ break;
233
+ case 'code':
234
+ validateCode(el, prefix, ctx);
235
+ break;
236
+ case 'blockquote':
237
+ validateBlockquote(el, prefix, ctx);
238
+ break;
239
+ case 'callout':
240
+ validateCallout(el, prefix, ctx);
241
+ break;
242
+ case 'toc':
243
+ validateToc(el, prefix, ctx);
244
+ break;
245
+ case 'comment':
246
+ validateComment(el, prefix, ctx);
247
+ break;
248
+ case 'form-field':
249
+ validateFormField(el, prefix, ctx);
250
+ break;
251
+ case 'footnote-def':
252
+ validateFootnoteDef(el, prefix, ctx);
253
+ break;
254
+ case 'float-group':
255
+ validateFloatGroup(el, prefix, depth, ctx);
256
+ break;
257
+ default: {
258
+ const type = el.type;
259
+ const plugins = ctx.options?.plugins ?? [];
260
+ const plugin = findPlugin(plugins, String(type));
261
+ if (plugin) {
262
+ let rejection;
263
+ try {
264
+ rejection = runPluginValidate(plugin, el);
265
+ }
266
+ catch (err) {
267
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (${String(type)}): plugin validate hook threw: ${err instanceof Error ? err.message : String(err)}`);
268
+ }
269
+ if (rejection) {
270
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (${String(type)}): ${rejection}`);
271
+ }
272
+ break;
273
+ }
274
+ const validList = ELEMENT_TYPES.map(t => `'${t}'`).join(', ');
275
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix}: unknown element type '${String(type)}'. Valid types: ${validList}`);
276
+ }
277
+ }
278
+ }
279
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"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"}
@@ -1,22 +1,10 @@
1
- import type { PdfDocument, RenderOptions, ValidationResult, Logger } from './types.js';
2
1
  /**
3
- * Validate a PdfDocument and throw a {@link PretextPdfError} if any errors are found.
4
- * @public
5
- */
6
- export declare function validate(doc: PdfDocument, options?: RenderOptions): void;
7
- /**
8
- * Validate a pretext-pdf document and return a structured result instead of throwing.
9
- *
10
- * Use this when you want to inspect all validation errors programmatically.
11
- * The existing {@link validate} function throws on first error and is unchanged.
2
+ * src/validate.ts legacy shim, re-exports the new validate/ module.
12
3
  *
13
- * @param doc - The document to validate (typed as `unknown` to accept unverified input)
14
- * @param options - `{ strict?: boolean; logger?: Logger }` strict defaults to false (matches render() behavior); logger routes diagnostic warnings away from console.warn
15
- * @returns {@link ValidationResult} with `valid`, `errors[]`, and `errorCount`
16
- * @public
4
+ * Original (1834L) was split into validate/{index,helpers,fonts,errors}.ts +
5
+ * validate/elements/* in v1.4.0 #11a. This shim exists for one release so
6
+ * external callers importing from 'pretext-pdf/dist/validate.js' (or the
7
+ * source path) continue to work; it will be deleted in step 3 of the split.
17
8
  */
18
- export declare function validateDocument(doc: unknown, options?: {
19
- strict?: boolean;
20
- logger?: Logger;
21
- }): ValidationResult;
9
+ export * from './validate/index.js';
22
10
  //# sourceMappingURL=validate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAA4C,aAAa,EAAmB,gBAAgB,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AA6IjJ;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,CAwXxE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,OAAO,EACZ,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9C,gBAAgB,CAgBlB"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,qBAAqB,CAAA"}