pretext-pdf 1.1.0 → 1.6.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 +687 -0
  2. package/README.md +83 -8
  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 +32 -9
  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 -1582
  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 +27 -8
  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,165 @@
1
+ import { PretextPdfError } from '../../errors.js';
2
+ import { ALLOWED_PROPS_SUB } from '../../allowed-props.js';
3
+ import { HEX_COLOR_REGEX, STAR_WIDTH_REGEX, assertUnknownProps, withCycleGuard, } from '../helpers.js';
4
+ export function validateTable(el, prefix, depth, ctx) {
5
+ if (!Array.isArray(el.columns) || el.columns.length === 0) {
6
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): 'columns' must be a non-empty array`);
7
+ }
8
+ if (!Array.isArray(el.rows) || el.rows.length === 0) {
9
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): 'rows' must be a non-empty array`);
10
+ }
11
+ const colCount = el.columns.length;
12
+ for (let ci = 0; ci < el.columns.length; ci++) {
13
+ const col = el.columns[ci];
14
+ // Strict: validate column def properties
15
+ if (ctx.strict) {
16
+ assertUnknownProps(col, ALLOWED_PROPS_SUB['column-def'], `${prefix} (table).columns[${ci}]`, ctx.errors);
17
+ }
18
+ if (typeof col.width === 'number') {
19
+ if (col.width <= 0 || !isFinite(col.width)) {
20
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): columns[${ci}].width must be a positive number. Got: ${col.width}`);
21
+ }
22
+ }
23
+ else if (typeof col.width === 'string') {
24
+ if (col.width !== 'auto' && !STAR_WIDTH_REGEX.test(col.width)) {
25
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): columns[${ci}].width must be a positive number, proportional string like '2*' or '*', or 'auto'. Got: '${col.width}'`);
26
+ }
27
+ if (col.width !== 'auto') {
28
+ const multiplier = parseFloat(col.width);
29
+ if (!isNaN(multiplier) && multiplier > 1000) {
30
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): columns[${ci}].width multiplier ${multiplier} exceeds maximum 1000`);
31
+ }
32
+ }
33
+ }
34
+ else {
35
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): columns[${ci}].width must be a number or string like '2*' or 'auto'`);
36
+ }
37
+ if (col.align !== undefined && !['left', 'center', 'right'].includes(col.align)) {
38
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): columns[${ci}].align must be 'left', 'center', or 'right'`);
39
+ }
40
+ }
41
+ // Validate header row count
42
+ const headerRowCount = el.headerRows !== undefined
43
+ ? el.headerRows
44
+ : el.rows.filter(r => r.isHeader).length;
45
+ if (headerRowCount > el.rows.length) {
46
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): headerRows (${headerRowCount}) exceeds total row count (${el.rows.length})`);
47
+ }
48
+ // Build span occupancy grid for colspan validation (rowspan cells occupy future rows)
49
+ const spanOccupied = new Set();
50
+ for (let ri = 0; ri < el.rows.length; ri++) {
51
+ const row = el.rows[ri];
52
+ let ci = 0;
53
+ for (const cell of row.cells) {
54
+ while (spanOccupied.has(`${ri},${ci}`))
55
+ ci++;
56
+ const cs = cell.colspan ?? 1;
57
+ const rs = cell.rowspan ?? 1;
58
+ for (let r2 = ri + 1; r2 < ri + rs; r2++) {
59
+ for (let c2 = ci; c2 < ci + cs; c2++) {
60
+ spanOccupied.add(`${r2},${c2}`);
61
+ }
62
+ }
63
+ ci += cs;
64
+ }
65
+ }
66
+ // Wrap rows/cells walk with cycle guard so a self-referential row or
67
+ // cell array is rejected before the per-cell validators run.
68
+ withCycleGuard(ctx.seen, el, depth + 1, prefix, () => {
69
+ for (let ri = 0; ri < el.rows.length; ri++) {
70
+ const row = el.rows[ri];
71
+ if (!Array.isArray(row.cells)) {
72
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): rows[${ri}].cells must be an array`);
73
+ }
74
+ // Guard each row so a cycle through row.cells → row is also detected
75
+ withCycleGuard(ctx.seen, row, depth + 2, `${prefix}.rows[${ri}]`, () => {
76
+ // Count how many columns in this row are occupied by rowspan cells from above
77
+ let occupiedCols = 0;
78
+ for (let ci = 0; ci < colCount; ci++) {
79
+ if (spanOccupied.has(`${ri},${ci}`))
80
+ occupiedCols++;
81
+ }
82
+ // Validate colspan sum equals colCount minus occupied columns
83
+ let colspanSum = 0;
84
+ for (let cellI = 0; cellI < row.cells.length; cellI++) {
85
+ const cell = row.cells[cellI];
86
+ const cs = cell.colspan ?? 1;
87
+ if (typeof cs !== 'number' || cs < 1 || !Number.isInteger(cs)) {
88
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): rows[${ri}].cells[${cellI}].colspan must be a positive integer`);
89
+ }
90
+ colspanSum += cs;
91
+ const rs = cell.rowspan ?? 1;
92
+ if (typeof rs !== 'number' || rs < 1 || !Number.isInteger(rs)) {
93
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): rows[${ri}].cells[${cellI}].rowspan must be a positive integer`);
94
+ }
95
+ }
96
+ if (colspanSum !== colCount - occupiedCols) {
97
+ throw new PretextPdfError('COLSPAN_OVERFLOW', `${prefix} (table): rows[${ri}] colspan sum is ${colspanSum} but expected ${colCount - occupiedCols} (${colCount} columns minus ${occupiedCols} occupied by rowspan). Sum of explicit cell colspans must cover only unoccupied columns.`);
98
+ }
99
+ // Strict: validate row and column defs
100
+ if (ctx.strict) {
101
+ assertUnknownProps(row, ALLOWED_PROPS_SUB['table-row'], `${prefix}.rows[${ri}]`, ctx.errors);
102
+ }
103
+ for (let cellI = 0; cellI < row.cells.length; cellI++) {
104
+ const cell = row.cells[cellI];
105
+ // Strict: validate cell properties
106
+ if (ctx.strict) {
107
+ assertUnknownProps(cell, ALLOWED_PROPS_SUB['table-cell'], `${prefix}.rows[${ri}].cells[${cellI}]`, ctx.errors);
108
+ }
109
+ if (typeof cell.text !== 'string') {
110
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): rows[${ri}].cells[${cellI}].text must be a string`);
111
+ }
112
+ if (cell.fontFamily !== undefined && (typeof cell.fontFamily !== 'string' || cell.fontFamily.trim() === '')) {
113
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): rows[${ri}].cells[${cellI}].fontFamily must be a non-empty string`);
114
+ }
115
+ if (cell.fontWeight !== undefined && ![400, 700].includes(cell.fontWeight)) {
116
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): rows[${ri}].cells[${cellI}].fontWeight must be 400 or 700`);
117
+ }
118
+ if (cell.fontSize !== undefined && (typeof cell.fontSize !== 'number' || cell.fontSize <= 0 || !isFinite(cell.fontSize))) {
119
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): rows[${ri}].cells[${cellI}].fontSize must be a positive finite number`);
120
+ }
121
+ if (cell.color !== undefined && !HEX_COLOR_REGEX.test(cell.color)) {
122
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): rows[${ri}].cells[${cellI}].color must be a 6-digit hex string`);
123
+ }
124
+ if (cell.bgColor !== undefined && !HEX_COLOR_REGEX.test(cell.bgColor)) {
125
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): rows[${ri}].cells[${cellI}].bgColor must be a 6-digit hex string`);
126
+ }
127
+ if (cell.dir !== undefined && !['ltr', 'rtl', 'auto'].includes(cell.dir)) {
128
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): rows[${ri}].cells[${cellI}].dir must be 'ltr', 'rtl', or 'auto'`);
129
+ }
130
+ if (cell.align !== undefined && !['left', 'center', 'right'].includes(cell.align)) {
131
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): rows[${ri}].cells[${cellI}].align must be 'left', 'center', or 'right'`);
132
+ }
133
+ }
134
+ });
135
+ }
136
+ });
137
+ if (el.dir !== undefined && !['ltr', 'rtl', 'auto'].includes(el.dir)) {
138
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): 'dir' must be 'ltr', 'rtl', or 'auto'`);
139
+ }
140
+ if (el.borderColor !== undefined && !HEX_COLOR_REGEX.test(el.borderColor)) {
141
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): 'borderColor' must be a 6-digit hex string`);
142
+ }
143
+ if (el.headerBgColor !== undefined && !HEX_COLOR_REGEX.test(el.headerBgColor)) {
144
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): 'headerBgColor' must be a 6-digit hex string`);
145
+ }
146
+ if (el.fontSize !== undefined && (typeof el.fontSize !== 'number' || el.fontSize <= 0 || !isFinite(el.fontSize))) {
147
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): 'fontSize' must be a positive finite number`);
148
+ }
149
+ if (el.borderWidth !== undefined && (typeof el.borderWidth !== 'number' || el.borderWidth < 0 || el.borderWidth > 50)) {
150
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): 'borderWidth' must be a non-negative number <= 50`);
151
+ }
152
+ if (el.cellPaddingH !== undefined && (typeof el.cellPaddingH !== 'number' || el.cellPaddingH < 0 || el.cellPaddingH > 200)) {
153
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): 'cellPaddingH' must be a non-negative number <= 200`);
154
+ }
155
+ if (el.cellPaddingV !== undefined && (typeof el.cellPaddingV !== 'number' || el.cellPaddingV < 0 || el.cellPaddingV > 200)) {
156
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): 'cellPaddingV' must be a non-negative number <= 200`);
157
+ }
158
+ if (el.spaceAfter !== undefined && (typeof el.spaceAfter !== 'number' || el.spaceAfter < 0 || !isFinite(el.spaceAfter))) {
159
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): 'spaceAfter' must be a non-negative finite number`);
160
+ }
161
+ if (el.spaceBefore !== undefined && (typeof el.spaceBefore !== 'number' || el.spaceBefore < 0 || !isFinite(el.spaceBefore))) {
162
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (table): 'spaceBefore' must be a non-negative finite number`);
163
+ }
164
+ }
165
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../../src/validate/elements/table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * validate/elements/text.ts — Text-bearing element validators.
3
+ * Covers: paragraph, heading, rich-paragraph, blockquote, callout, code.
4
+ * Extracted from src/validate.ts (#11a).
5
+ */
6
+ import type { ContentElement } from '../../types.js';
7
+ import { type ValidationContext } from '../helpers.js';
8
+ export declare function validateParagraph(el: Extract<ContentElement, {
9
+ type: 'paragraph';
10
+ }>, prefix: string, ctx: ValidationContext): void;
11
+ export declare function validateHeading(el: Extract<ContentElement, {
12
+ type: 'heading';
13
+ }>, prefix: string, _ctx: ValidationContext): void;
14
+ export declare function validateRichParagraph(el: Extract<ContentElement, {
15
+ type: 'rich-paragraph';
16
+ }>, prefix: string, depth: number, ctx: ValidationContext): void;
17
+ export declare function validateBlockquote(el: Extract<ContentElement, {
18
+ type: 'blockquote';
19
+ }>, prefix: string, _ctx: ValidationContext): void;
20
+ export declare function validateCallout(el: Extract<ContentElement, {
21
+ type: 'callout';
22
+ }>, prefix: string, _ctx: ValidationContext): void;
23
+ export declare function validateCode(el: Extract<ContentElement, {
24
+ type: 'code';
25
+ }>, prefix: string, ctx: ValidationContext): void;
26
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/validate/elements/text.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAGpD,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAA;AAEtB,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,EAClD,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,iBAAiB,GACrB,IAAI,CAgEN;AAED,wBAAgB,eAAe,CAC7B,EAAE,EAAE,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,EAChD,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,iBAAiB,GACtB,IAAI,CA6DN;AAED,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC,EACvD,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,iBAAiB,GACrB,IAAI,CA6EN;AAED,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC,EACnD,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,iBAAiB,GACtB,IAAI,CAoDN;AAED,wBAAgB,eAAe,CAC7B,EAAE,EAAE,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,EAChD,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,iBAAiB,GACtB,IAAI,CAoBN;AAED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAC7C,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,iBAAiB,GACrB,IAAI,CAkDN"}
@@ -0,0 +1,331 @@
1
+ import { PretextPdfError } from '../../errors.js';
2
+ import { ALLOWED_PROPS_SUB } from '../../allowed-props.js';
3
+ import { HEX_COLOR_REGEX, assertUnknownProps, validateUrl, withCycleGuard, } from '../helpers.js';
4
+ export function validateParagraph(el, prefix, ctx) {
5
+ if (typeof el.text !== 'string') {
6
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (paragraph): 'text' must be a string`);
7
+ }
8
+ // NEW: Validate dir field
9
+ if (el.dir !== undefined && !['ltr', 'rtl', 'auto'].includes(el.dir)) {
10
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (paragraph): 'dir' must be 'ltr', 'rtl', or 'auto'`);
11
+ }
12
+ if (el.color !== undefined && !HEX_COLOR_REGEX.test(el.color)) {
13
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (paragraph): 'color' must be a 6-digit hex string like '#ff0000'. Got: '${el.color}'`);
14
+ }
15
+ if (el.fontSize !== undefined && (typeof el.fontSize !== 'number' || el.fontSize <= 0 || !isFinite(el.fontSize) || el.fontSize > 500)) {
16
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (paragraph): 'fontSize' must be a positive finite number and <= 500`);
17
+ }
18
+ if (el.lineHeight !== undefined && typeof el.lineHeight === 'number') {
19
+ // Compare against explicit fontSize if set, or default (12pt) if not
20
+ const effectiveFontSize = el.fontSize ?? 12;
21
+ if (el.lineHeight < effectiveFontSize) {
22
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (paragraph): lineHeight (${el.lineHeight}) is less than fontSize (${effectiveFontSize}). Lines would overlap. Set lineHeight >= fontSize.`);
23
+ }
24
+ }
25
+ if (el.bgColor !== undefined && !HEX_COLOR_REGEX.test(el.bgColor)) {
26
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (paragraph): 'bgColor' must be a 6-digit hex string like '#f0f0f0'. Got: '${el.bgColor}'`);
27
+ }
28
+ if (el.spaceAfter !== undefined && (typeof el.spaceAfter !== 'number' || el.spaceAfter < 0 || !isFinite(el.spaceAfter))) {
29
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (paragraph): 'spaceAfter' must be a non-negative finite number`);
30
+ }
31
+ if (el.spaceBefore !== undefined && (typeof el.spaceBefore !== 'number' || el.spaceBefore < 0 || !isFinite(el.spaceBefore))) {
32
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (paragraph): 'spaceBefore' must be a non-negative finite number`);
33
+ }
34
+ if (el.columns !== undefined && (typeof el.columns !== 'number' || el.columns < 1 || !Number.isInteger(el.columns) || el.columns > 6)) {
35
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (paragraph): 'columns' must be a positive integer between 1 and 6`);
36
+ }
37
+ if (el.columnGap !== undefined && (typeof el.columnGap !== 'number' || el.columnGap < 0 || !isFinite(el.columnGap))) {
38
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (paragraph): 'columnGap' must be a non-negative finite number`);
39
+ }
40
+ if (el.align !== undefined && !['left', 'center', 'right', 'justify'].includes(el.align)) {
41
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (paragraph): 'align' must be 'left', 'center', 'right', or 'justify'`);
42
+ }
43
+ if (el.url !== undefined && (typeof el.url !== 'string' || el.url.trim() === '')) {
44
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (paragraph): 'url' must be a non-empty string if provided`);
45
+ }
46
+ if (el.url !== undefined && typeof el.url === 'string')
47
+ validateUrl(el.url, `${prefix} (paragraph) url`);
48
+ if (el.letterSpacing !== undefined && (typeof el.letterSpacing !== 'number' || el.letterSpacing < 0 || !isFinite(el.letterSpacing) || el.letterSpacing > 200)) {
49
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (paragraph): 'letterSpacing' must be a non-negative finite number and <= 200`);
50
+ }
51
+ if (el.annotation) {
52
+ // Strict: validate annotation properties
53
+ if (ctx.strict) {
54
+ assertUnknownProps(el.annotation, ALLOWED_PROPS_SUB['annotation'], `${prefix}.annotation`, ctx.errors);
55
+ }
56
+ if (!el.annotation.contents || el.annotation.contents.trim() === '') {
57
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (paragraph): annotation.contents is required and must be non-empty`);
58
+ }
59
+ if (el.annotation.contents.length > 5000) {
60
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (paragraph): annotation.contents must be 5000 characters or fewer`);
61
+ }
62
+ if (el.annotation.color !== undefined && !/^#[0-9a-fA-F]{6}$/.test(el.annotation.color)) {
63
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (paragraph): annotation.color must be a 6-digit hex color (e.g. "#FFFF00"). Got: "${el.annotation.color}"`);
64
+ }
65
+ if (el.annotation.author !== undefined && el.annotation.author.length > 100) {
66
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (paragraph): annotation.author must be 100 characters or fewer`);
67
+ }
68
+ }
69
+ }
70
+ export function validateHeading(el, prefix, _ctx) {
71
+ if (typeof el.text !== 'string') {
72
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (heading): 'text' must be a string`);
73
+ }
74
+ if (el.text.trim() === '') {
75
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (heading): heading text cannot be empty or whitespace-only`);
76
+ }
77
+ if (![1, 2, 3, 4].includes(el.level)) {
78
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (heading): 'level' must be 1, 2, 3, or 4. Got: ${el.level}`);
79
+ }
80
+ if (el.fontWeight !== undefined && ![400, 700].includes(el.fontWeight)) {
81
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (heading): 'fontWeight' must be 400 or 700`);
82
+ }
83
+ if (el.fontSize !== undefined && (typeof el.fontSize !== 'number' || el.fontSize <= 0 || !isFinite(el.fontSize) || el.fontSize > 500)) {
84
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (heading): 'fontSize' must be a positive finite number and <= 500`);
85
+ }
86
+ if (el.lineHeight !== undefined && typeof el.lineHeight === 'number') {
87
+ const effectiveFontSize = el.fontSize ?? 12;
88
+ if (el.lineHeight < effectiveFontSize) {
89
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (heading): lineHeight (${el.lineHeight}) is less than fontSize (${effectiveFontSize}). Lines would overlap.`);
90
+ }
91
+ }
92
+ if (el.align !== undefined && !['left', 'center', 'right', 'justify'].includes(el.align)) {
93
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (heading): 'align' must be 'left', 'center', 'right', or 'justify'`);
94
+ }
95
+ if (el.color !== undefined && !HEX_COLOR_REGEX.test(el.color)) {
96
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (heading): 'color' must be a 6-digit hex string like '#ff0000'. Got: '${el.color}'`);
97
+ }
98
+ if (el.bgColor !== undefined && !HEX_COLOR_REGEX.test(el.bgColor)) {
99
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (heading): 'bgColor' must be a 6-digit hex string`);
100
+ }
101
+ if (el.spaceBefore !== undefined && (typeof el.spaceBefore !== 'number' || el.spaceBefore < 0 || !isFinite(el.spaceBefore))) {
102
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (heading): 'spaceBefore' must be a non-negative finite number`);
103
+ }
104
+ if (el.spaceAfter !== undefined && (typeof el.spaceAfter !== 'number' || el.spaceAfter < 0 || !isFinite(el.spaceAfter))) {
105
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (heading): 'spaceAfter' must be a non-negative finite number`);
106
+ }
107
+ if (el.url !== undefined && (typeof el.url !== 'string' || el.url.trim() === '')) {
108
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (heading): 'url' must be a non-empty string if provided`);
109
+ }
110
+ if (el.url !== undefined && typeof el.url === 'string')
111
+ validateUrl(el.url, `${prefix} (heading) url`);
112
+ if (el.anchor !== undefined && (typeof el.anchor !== 'string' || !/^[a-zA-Z0-9_-]+$/.test(el.anchor))) {
113
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (heading): 'anchor' must be alphanumeric with hyphens/underscores only. Got: '${el.anchor}'`);
114
+ }
115
+ if (el.letterSpacing !== undefined && (typeof el.letterSpacing !== 'number' || el.letterSpacing < 0 || !isFinite(el.letterSpacing) || el.letterSpacing > 200)) {
116
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (heading): 'letterSpacing' must be a non-negative finite number and <= 200`);
117
+ }
118
+ if (el.annotation) {
119
+ if (!el.annotation.contents || el.annotation.contents.trim() === '') {
120
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (heading): annotation.contents is required and must be non-empty`);
121
+ }
122
+ if (el.annotation.contents.length > 5000) {
123
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (heading): annotation.contents must be 5000 characters or fewer`);
124
+ }
125
+ if (el.annotation.color !== undefined && !/^#[0-9a-fA-F]{6}$/.test(el.annotation.color)) {
126
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (heading): annotation.color must be a 6-digit hex color (e.g. "#FFFF00"). Got: "${el.annotation.color}"`);
127
+ }
128
+ if (el.annotation.author !== undefined && el.annotation.author.length > 100) {
129
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (heading): annotation.author must be 100 characters or fewer`);
130
+ }
131
+ }
132
+ }
133
+ export function validateRichParagraph(el, prefix, depth, ctx) {
134
+ if (!Array.isArray(el.spans) || el.spans.length === 0) {
135
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (rich-paragraph): 'spans' must be a non-empty array`);
136
+ }
137
+ // Wrap spans walk with cycle guard
138
+ withCycleGuard(ctx.seen, el, depth + 1, prefix, () => {
139
+ for (let si = 0; si < el.spans.length; si++) {
140
+ const span = el.spans[si];
141
+ // Strict: validate span properties
142
+ if (ctx.strict) {
143
+ assertUnknownProps(span, ALLOWED_PROPS_SUB['inline-span'], `${prefix}.spans[${si}]`, ctx.errors);
144
+ }
145
+ if (typeof span.text !== 'string') {
146
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (rich-paragraph): spans[${si}].text must be a string`);
147
+ }
148
+ if (span.text === '') {
149
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (rich-paragraph): spans[${si}].text cannot be an empty string. Use ' ' for a space between styled runs.`);
150
+ }
151
+ if (span.color !== undefined && !HEX_COLOR_REGEX.test(span.color)) {
152
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (rich-paragraph): spans[${si}].color must be a 6-digit hex string`);
153
+ }
154
+ if (span.fontWeight !== undefined && ![400, 700].includes(span.fontWeight)) {
155
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (rich-paragraph): spans[${si}].fontWeight must be 400 or 700`);
156
+ }
157
+ if (span.fontStyle !== undefined && !['normal', 'italic'].includes(span.fontStyle)) {
158
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (rich-paragraph): spans[${si}].fontStyle must be 'normal' or 'italic'`);
159
+ }
160
+ if (span.fontSize !== undefined && (typeof span.fontSize !== 'number' || span.fontSize <= 0 || !isFinite(span.fontSize))) {
161
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (rich-paragraph): spans[${si}].fontSize must be a positive finite number if provided`);
162
+ }
163
+ if (span.url !== undefined && (typeof span.url !== 'string' || span.url.trim() === '')) {
164
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (rich-paragraph): spans[${si}].url must be a non-empty string if provided`);
165
+ }
166
+ if (span.url !== undefined && typeof span.url === 'string')
167
+ validateUrl(span.url, `${prefix} (rich-paragraph) spans[${si}].url`);
168
+ if (span.href !== undefined && (typeof span.href !== 'string' || span.href.trim() === '')) {
169
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (rich-paragraph): spans[${si}].href must be a non-empty string if provided`);
170
+ }
171
+ if (span.href !== undefined && typeof span.href === 'string')
172
+ validateUrl(span.href, `${prefix} (rich-paragraph) spans[${si}].href`);
173
+ if (span.url !== undefined && span.href !== undefined) {
174
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (rich-paragraph): spans[${si}] cannot have both 'url' and 'href' — use one or the other`);
175
+ }
176
+ if (span.verticalAlign !== undefined && span.verticalAlign !== 'superscript' && span.verticalAlign !== 'subscript') {
177
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (rich-paragraph): spans[${si}].verticalAlign must be "superscript" or "subscript"`);
178
+ }
179
+ if (span.letterSpacing !== undefined && (typeof span.letterSpacing !== 'number' || span.letterSpacing < 0 || !isFinite(span.letterSpacing) || span.letterSpacing > 200)) {
180
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (rich-paragraph): spans[${si}].letterSpacing must be a non-negative finite number and <= 200`);
181
+ }
182
+ }
183
+ });
184
+ if (el.dir !== undefined && !['ltr', 'rtl', 'auto'].includes(el.dir)) {
185
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (rich-paragraph): 'dir' must be 'ltr', 'rtl', or 'auto'`);
186
+ }
187
+ if (el.letterSpacing !== undefined && (typeof el.letterSpacing !== 'number' || el.letterSpacing < 0 || !isFinite(el.letterSpacing) || el.letterSpacing > 200)) {
188
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (rich-paragraph): 'letterSpacing' must be a non-negative finite number and <= 200`);
189
+ }
190
+ if (el.fontSize !== undefined && (typeof el.fontSize !== 'number' || el.fontSize <= 0 || !isFinite(el.fontSize))) {
191
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (rich-paragraph): 'fontSize' must be a positive finite number`);
192
+ }
193
+ if (el.bgColor !== undefined && !HEX_COLOR_REGEX.test(el.bgColor)) {
194
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (rich-paragraph): 'bgColor' must be a 6-digit hex string`);
195
+ }
196
+ if (el.spaceAfter !== undefined && (typeof el.spaceAfter !== 'number' || el.spaceAfter < 0 || !isFinite(el.spaceAfter))) {
197
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (rich-paragraph): 'spaceAfter' must be a non-negative finite number`);
198
+ }
199
+ if (el.spaceBefore !== undefined && (typeof el.spaceBefore !== 'number' || el.spaceBefore < 0 || !isFinite(el.spaceBefore))) {
200
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (rich-paragraph): 'spaceBefore' must be a non-negative finite number`);
201
+ }
202
+ if (el.columns !== undefined && (typeof el.columns !== 'number' || el.columns < 1 || !Number.isInteger(el.columns) || el.columns > 6)) {
203
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (rich-paragraph): 'columns' must be a positive integer between 1 and 6`);
204
+ }
205
+ if (el.columnGap !== undefined && (typeof el.columnGap !== 'number' || el.columnGap < 0 || !isFinite(el.columnGap))) {
206
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (rich-paragraph): 'columnGap' must be a non-negative finite number`);
207
+ }
208
+ if (el.align !== undefined && !['left', 'center', 'right', 'justify'].includes(el.align)) {
209
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (rich-paragraph): 'align' must be 'left', 'center', 'right', or 'justify'`);
210
+ }
211
+ }
212
+ export function validateBlockquote(el, prefix, _ctx) {
213
+ if (typeof el.text !== 'string') {
214
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (blockquote): 'text' must be a string`);
215
+ }
216
+ if (el.text.trim() === '') {
217
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (blockquote): 'text' must be a non-empty string`);
218
+ }
219
+ if (el.borderColor !== undefined && !HEX_COLOR_REGEX.test(el.borderColor)) {
220
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (blockquote): 'borderColor' must be a 6-digit hex string`);
221
+ }
222
+ if (el.borderWidth !== undefined && (typeof el.borderWidth !== 'number' || el.borderWidth < 0 || !isFinite(el.borderWidth))) {
223
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (blockquote): 'borderWidth' must be a non-negative finite number`);
224
+ }
225
+ if (el.bgColor !== undefined && !HEX_COLOR_REGEX.test(el.bgColor)) {
226
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (blockquote): 'bgColor' must be a 6-digit hex string`);
227
+ }
228
+ if (el.color !== undefined && !HEX_COLOR_REGEX.test(el.color)) {
229
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (blockquote): 'color' must be a 6-digit hex string`);
230
+ }
231
+ if (el.fontWeight !== undefined && ![400, 700].includes(el.fontWeight)) {
232
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (blockquote): 'fontWeight' must be 400 or 700`);
233
+ }
234
+ if (el.fontStyle !== undefined && !['normal', 'italic'].includes(el.fontStyle)) {
235
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (blockquote): 'fontStyle' must be 'normal' or 'italic'`);
236
+ }
237
+ if (el.fontSize !== undefined && (typeof el.fontSize !== 'number' || el.fontSize <= 0 || !isFinite(el.fontSize))) {
238
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (blockquote): 'fontSize' must be a positive finite number`);
239
+ }
240
+ if (el.lineHeight !== undefined && typeof el.lineHeight === 'number') {
241
+ const effectiveFontSize = el.fontSize ?? 12;
242
+ if (el.lineHeight < effectiveFontSize) {
243
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (blockquote): lineHeight (${el.lineHeight}) is less than fontSize (${effectiveFontSize}). Lines would overlap.`);
244
+ }
245
+ }
246
+ if (el.padding !== undefined && (typeof el.padding !== 'number' || el.padding < 0 || !isFinite(el.padding))) {
247
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (blockquote): 'padding' must be a non-negative finite number`);
248
+ }
249
+ if (el.paddingH !== undefined && (typeof el.paddingH !== 'number' || el.paddingH < 0 || !isFinite(el.paddingH))) {
250
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (blockquote): 'paddingH' must be a non-negative finite number`);
251
+ }
252
+ if (el.paddingV !== undefined && (typeof el.paddingV !== 'number' || el.paddingV < 0 || !isFinite(el.paddingV))) {
253
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (blockquote): 'paddingV' must be a non-negative finite number`);
254
+ }
255
+ if (el.align !== undefined && !['left', 'center', 'right', 'justify'].includes(el.align)) {
256
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (blockquote): 'align' must be 'left', 'center', 'right', or 'justify'`);
257
+ }
258
+ if (el.spaceBefore !== undefined && (typeof el.spaceBefore !== 'number' || el.spaceBefore < 0 || !isFinite(el.spaceBefore))) {
259
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (blockquote): 'spaceBefore' must be a non-negative finite number`);
260
+ }
261
+ if (el.spaceAfter !== undefined && (typeof el.spaceAfter !== 'number' || el.spaceAfter < 0 || !isFinite(el.spaceAfter))) {
262
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (blockquote): 'spaceAfter' must be a non-negative finite number`);
263
+ }
264
+ }
265
+ export function validateCallout(el, prefix, _ctx) {
266
+ if (!el.content || typeof el.content !== 'string' || el.content.trim() === '') {
267
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (callout): 'content' is required and must be a non-empty string`);
268
+ }
269
+ const validStyles = ['info', 'warning', 'tip', 'note'];
270
+ if (el.style !== undefined && !validStyles.includes(el.style)) {
271
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (callout): 'style' must be one of: ${validStyles.join(', ')}`);
272
+ }
273
+ if (el.backgroundColor !== undefined && !/^#[0-9A-Fa-f]{6}$/.test(el.backgroundColor)) {
274
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (callout): 'backgroundColor' must be a 6-digit hex color`);
275
+ }
276
+ if (el.borderColor !== undefined && !/^#[0-9A-Fa-f]{6}$/.test(el.borderColor)) {
277
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (callout): 'borderColor' must be a 6-digit hex color`);
278
+ }
279
+ if (el.color !== undefined && !/^#[0-9A-Fa-f]{6}$/.test(el.color)) {
280
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (callout): 'color' must be a 6-digit hex color`);
281
+ }
282
+ if (el.fontSize !== undefined && (typeof el.fontSize !== 'number' || el.fontSize <= 0)) {
283
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (callout): 'fontSize' must be a positive number`);
284
+ }
285
+ }
286
+ export function validateCode(el, prefix, ctx) {
287
+ if (typeof el.text !== 'string') {
288
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (code): 'text' must be a string`);
289
+ }
290
+ if (el.text.trim() === '') {
291
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (code): 'text' must be a non-empty string`);
292
+ }
293
+ if (!el.fontFamily || typeof el.fontFamily !== 'string') {
294
+ throw new PretextPdfError('MONOSPACE_FONT_REQUIRED', `${prefix} (code): 'fontFamily' is required. Provide a monospace TTF font family name that you have loaded in doc.fonts (e.g., 'JetBrains Mono', 'Fira Code', 'Courier Prime').`);
295
+ }
296
+ if (!ctx.loadedFamilies.has(el.fontFamily)) {
297
+ throw new PretextPdfError('MONOSPACE_FONT_REQUIRED', `${prefix} (code): fontFamily '${el.fontFamily}' is not loaded. Add { family: '${el.fontFamily}', src: '/path/to/font.ttf' } to doc.fonts.`);
298
+ }
299
+ if (el.fontSize !== undefined && (typeof el.fontSize !== 'number' || el.fontSize <= 0 || !isFinite(el.fontSize))) {
300
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (code): 'fontSize' must be a positive finite number`);
301
+ }
302
+ if (el.bgColor !== undefined && !HEX_COLOR_REGEX.test(el.bgColor)) {
303
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (code): 'bgColor' must be a 6-digit hex string`);
304
+ }
305
+ if (el.color !== undefined && !HEX_COLOR_REGEX.test(el.color)) {
306
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (code): 'color' must be a 6-digit hex string`);
307
+ }
308
+ if (el.padding !== undefined && (typeof el.padding !== 'number' || el.padding < 0 || !isFinite(el.padding))) {
309
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (code): 'padding' must be a non-negative finite number`);
310
+ }
311
+ if (el.spaceAfter !== undefined && (typeof el.spaceAfter !== 'number' || el.spaceAfter < 0 || !isFinite(el.spaceAfter))) {
312
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (code): 'spaceAfter' must be a non-negative finite number`);
313
+ }
314
+ if (el.spaceBefore !== undefined && (typeof el.spaceBefore !== 'number' || el.spaceBefore < 0 || !isFinite(el.spaceBefore))) {
315
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (code): 'spaceBefore' must be a non-negative finite number`);
316
+ }
317
+ if (el.language !== undefined && typeof el.language !== 'string') {
318
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (code): 'language' must be a string`);
319
+ }
320
+ if (el.highlightTheme !== undefined) {
321
+ if (typeof el.highlightTheme !== 'object' || el.highlightTheme === null) {
322
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (code): 'highlightTheme' must be an object`);
323
+ }
324
+ for (const [k, v] of Object.entries(el.highlightTheme)) {
325
+ if (v !== undefined && !HEX_COLOR_REGEX.test(v)) {
326
+ throw new PretextPdfError('VALIDATION_ERROR', `${prefix} (code): highlightTheme.${k} must be a 6-digit hex string`);
327
+ }
328
+ }
329
+ }
330
+ }
331
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../../src/validate/elements/text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * validate/errors.ts — Structured error parsing for validateDocument().
3
+ * Extracted from src/validate.ts (#11a).
4
+ */
5
+ import type { PdfDocument, ValidationError } from '../types.js';
6
+ export declare function isValidPdfDocumentLike(doc: unknown): doc is PdfDocument;
7
+ /** Parse a PretextPdfError message into structured ValidationError entries */
8
+ export declare function parseValidationErrorsStructured(message: string, code: string): ValidationError[];
9
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/validate/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAG/D,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,WAAW,CAEvE;AAED,8EAA8E;AAC9E,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CAqChG"}