@laminapdf/sdk 0.0.0-stage → 0.2.0-alpha.3

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 (478) hide show
  1. package/README.md +243 -2
  2. package/dist/api.d.ts +26 -0
  3. package/dist/api.d.ts.map +1 -0
  4. package/dist/api.js +12 -0
  5. package/dist/api.js.map +1 -0
  6. package/dist/builder.d.ts +335 -0
  7. package/dist/builder.d.ts.map +1 -0
  8. package/dist/builder.js +574 -0
  9. package/dist/builder.js.map +1 -0
  10. package/dist/defined.d.ts +5 -0
  11. package/dist/defined.d.ts.map +1 -0
  12. package/dist/defined.js +7 -0
  13. package/dist/defined.js.map +1 -0
  14. package/dist/document.d.ts +267 -0
  15. package/dist/document.d.ts.map +1 -0
  16. package/dist/document.js +472 -0
  17. package/dist/document.js.map +1 -0
  18. package/dist/entry/node.d.ts +30 -0
  19. package/dist/entry/node.d.ts.map +1 -0
  20. package/dist/entry/node.js +37 -0
  21. package/dist/entry/node.js.map +1 -0
  22. package/dist/entry/workerd.d.ts +30 -0
  23. package/dist/entry/workerd.d.ts.map +1 -0
  24. package/dist/entry/workerd.js +37 -0
  25. package/dist/entry/workerd.js.map +1 -0
  26. package/dist/errors.d.ts +102 -0
  27. package/dist/errors.d.ts.map +1 -0
  28. package/dist/errors.js +131 -0
  29. package/dist/errors.js.map +1 -0
  30. package/dist/explain.d.ts +20 -0
  31. package/dist/explain.d.ts.map +1 -0
  32. package/dist/explain.js +14 -0
  33. package/dist/explain.js.map +1 -0
  34. package/dist/extract.d.ts +57 -0
  35. package/dist/extract.d.ts.map +1 -0
  36. package/dist/extract.js +5 -0
  37. package/dist/extract.js.map +1 -0
  38. package/dist/font.d.ts +73 -0
  39. package/dist/font.d.ts.map +1 -0
  40. package/dist/font.js +133 -0
  41. package/dist/font.js.map +1 -0
  42. package/dist/generated/builder-enums.d.ts +29 -0
  43. package/dist/generated/builder-enums.d.ts.map +1 -0
  44. package/dist/generated/builder-enums.js +80 -0
  45. package/dist/generated/builder-enums.js.map +1 -0
  46. package/dist/generated/codes.d.ts +109 -0
  47. package/dist/generated/codes.d.ts.map +1 -0
  48. package/dist/generated/codes.js +508 -0
  49. package/dist/generated/codes.js.map +1 -0
  50. package/dist/generated/explain.d.ts +6 -0
  51. package/dist/generated/explain.d.ts.map +1 -0
  52. package/dist/generated/explain.js +155 -0
  53. package/dist/generated/explain.js.map +1 -0
  54. package/dist/generated/extract.d.ts +235 -0
  55. package/dist/generated/extract.d.ts.map +1 -0
  56. package/dist/generated/extract.js +4 -0
  57. package/dist/generated/extract.js.map +1 -0
  58. package/dist/index.d.ts +30 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +37 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/init.d.ts +88 -0
  63. package/dist/init.d.ts.map +1 -0
  64. package/dist/init.js +139 -0
  65. package/dist/init.js.map +1 -0
  66. package/dist/internal/handle.d.ts +58 -0
  67. package/dist/internal/handle.d.ts.map +1 -0
  68. package/dist/internal/handle.js +113 -0
  69. package/dist/internal/handle.js.map +1 -0
  70. package/dist/internal/instance.d.ts +56 -0
  71. package/dist/internal/instance.d.ts.map +1 -0
  72. package/dist/internal/instance.js +125 -0
  73. package/dist/internal/instance.js.map +1 -0
  74. package/dist/loader/fetch.d.ts +3 -0
  75. package/dist/loader/fetch.d.ts.map +1 -0
  76. package/dist/loader/fetch.js +2 -0
  77. package/dist/loader/fetch.js.map +1 -0
  78. package/dist/loader/node.d.ts +3 -0
  79. package/dist/loader/node.d.ts.map +1 -0
  80. package/dist/loader/node.js +9 -0
  81. package/dist/loader/node.js.map +1 -0
  82. package/dist/loader/workerd.d.ts +3 -0
  83. package/dist/loader/workerd.d.ts.map +1 -0
  84. package/dist/loader/workerd.js +15 -0
  85. package/dist/loader/workerd.js.map +1 -0
  86. package/dist/matrix.d.ts +16 -0
  87. package/dist/matrix.d.ts.map +1 -0
  88. package/dist/matrix.js +36 -0
  89. package/dist/matrix.js.map +1 -0
  90. package/dist/path.d.ts +34 -0
  91. package/dist/path.d.ts.map +1 -0
  92. package/dist/path.js +49 -0
  93. package/dist/path.js.map +1 -0
  94. package/dist/source/http.d.ts +36 -0
  95. package/dist/source/http.d.ts.map +1 -0
  96. package/dist/source/http.js +211 -0
  97. package/dist/source/http.js.map +1 -0
  98. package/dist/source/range.d.ts +75 -0
  99. package/dist/source/range.d.ts.map +1 -0
  100. package/dist/source/range.js +100 -0
  101. package/dist/source/range.js.map +1 -0
  102. package/dist/text.d.ts +90 -0
  103. package/dist/text.d.ts.map +1 -0
  104. package/dist/text.js +127 -0
  105. package/dist/text.js.map +1 -0
  106. package/dist/transaction.d.ts +36 -0
  107. package/dist/transaction.d.ts.map +1 -0
  108. package/dist/transaction.js +47 -0
  109. package/dist/transaction.js.map +1 -0
  110. package/dist/types.d.ts +79 -0
  111. package/dist/types.d.ts.map +1 -0
  112. package/dist/types.js +2 -0
  113. package/dist/types.js.map +1 -0
  114. package/dist/version.d.ts +3 -0
  115. package/dist/version.d.ts.map +1 -0
  116. package/dist/version.js +6 -0
  117. package/dist/version.js.map +1 -0
  118. package/dist/worker/client.d.ts +88 -0
  119. package/dist/worker/client.d.ts.map +1 -0
  120. package/dist/worker/client.js +407 -0
  121. package/dist/worker/client.js.map +1 -0
  122. package/dist/worker/emitter.d.ts +12 -0
  123. package/dist/worker/emitter.d.ts.map +1 -0
  124. package/dist/worker/emitter.js +34 -0
  125. package/dist/worker/emitter.js.map +1 -0
  126. package/dist/worker/entry.d.ts +2 -0
  127. package/dist/worker/entry.d.ts.map +1 -0
  128. package/dist/worker/entry.js +4 -0
  129. package/dist/worker/entry.js.map +1 -0
  130. package/dist/worker/index.d.ts +7 -0
  131. package/dist/worker/index.d.ts.map +1 -0
  132. package/dist/worker/index.js +4 -0
  133. package/dist/worker/index.js.map +1 -0
  134. package/dist/worker/protocol.d.ts +82 -0
  135. package/dist/worker/protocol.d.ts.map +1 -0
  136. package/dist/worker/protocol.js +11 -0
  137. package/dist/worker/protocol.js.map +1 -0
  138. package/dist/worker/server.d.ts +51 -0
  139. package/dist/worker/server.d.ts.map +1 -0
  140. package/dist/worker/server.js +493 -0
  141. package/dist/worker/server.js.map +1 -0
  142. package/dist/worker/support.d.ts +43 -0
  143. package/dist/worker/support.d.ts.map +1 -0
  144. package/dist/worker/support.js +26 -0
  145. package/dist/worker/support.js.map +1 -0
  146. package/dist/worker/transfer.d.ts +3 -0
  147. package/dist/worker/transfer.d.ts.map +1 -0
  148. package/dist/worker/transfer.js +13 -0
  149. package/dist/worker/transfer.js.map +1 -0
  150. package/dist/worker/types.d.ts +50 -0
  151. package/dist/worker/types.d.ts.map +1 -0
  152. package/dist/worker/types.js +2 -0
  153. package/dist/worker/types.js.map +1 -0
  154. package/docs/AGENTS.md +14 -0
  155. package/docs/api/README.md +147 -0
  156. package/docs/api/classes/Builder.md +467 -0
  157. package/docs/api/classes/Document.md +742 -0
  158. package/docs/api/classes/Font.md +74 -0
  159. package/docs/api/classes/Image.md +140 -0
  160. package/docs/api/classes/LaminaPdfError.md +189 -0
  161. package/docs/api/classes/Page.md +178 -0
  162. package/docs/api/classes/PageRef.md +253 -0
  163. package/docs/api/classes/PageText.md +129 -0
  164. package/docs/api/classes/PageTextRun.md +167 -0
  165. package/docs/api/classes/PendingPath.md +97 -0
  166. package/docs/api/classes/SaveJob.md +205 -0
  167. package/docs/api/classes/Surface.md +326 -0
  168. package/docs/api/classes/Transaction.md +111 -0
  169. package/docs/api/functions/callbackSource.md +33 -0
  170. package/docs/api/functions/httpRangeSource.md +48 -0
  171. package/docs/api/functions/init.md +36 -0
  172. package/docs/api/functions/isExtractLoaded.md +21 -0
  173. package/docs/api/functions/isInitialized.md +19 -0
  174. package/docs/api/functions/isLaminaPdfError.md +41 -0
  175. package/docs/api/functions/isTextLoaded.md +19 -0
  176. package/docs/api/functions/loadExtract.md +28 -0
  177. package/docs/api/functions/loadText.md +28 -0
  178. package/docs/api/functions/onLeak.md +29 -0
  179. package/docs/api/functions/reset.md +22 -0
  180. package/docs/api/functions/wasmMemory.md +22 -0
  181. package/docs/api/interfaces/BuilderOptions.md +108 -0
  182. package/docs/api/interfaces/ByteRange.md +29 -0
  183. package/docs/api/interfaces/ChunkOptions.md +37 -0
  184. package/docs/api/interfaces/Diagnostic.md +67 -0
  185. package/docs/api/interfaces/ExtractOptions.md +92 -0
  186. package/docs/api/interfaces/ExtractResult.md +37 -0
  187. package/docs/api/interfaces/FontInfo.md +37 -0
  188. package/docs/api/interfaces/HttpRangeOptions.md +78 -0
  189. package/docs/api/interfaces/InitOptions.md +40 -0
  190. package/docs/api/interfaces/Leak.md +21 -0
  191. package/docs/api/interfaces/Location.md +53 -0
  192. package/docs/api/interfaces/OpLog.md +25 -0
  193. package/docs/api/interfaces/OpenOptions.md +37 -0
  194. package/docs/api/interfaces/PageTextOptions.md +21 -0
  195. package/docs/api/interfaces/PathBuilder.md +195 -0
  196. package/docs/api/interfaces/QuadPoint.md +25 -0
  197. package/docs/api/interfaces/RangeOptions.md +54 -0
  198. package/docs/api/interfaces/RangeSource.md +59 -0
  199. package/docs/api/interfaces/StrokeStyle.md +61 -0
  200. package/docs/api/interfaces/TagSpec.md +69 -0
  201. package/docs/api/interfaces/TextBoxOptions.md +93 -0
  202. package/docs/api/interfaces/TextGlyph.md +29 -0
  203. package/docs/api/interfaces/TextOptions.md +101 -0
  204. package/docs/api/interfaces/WasmMemory.md +37 -0
  205. package/docs/api/type-aliases/AfRelationship.md +15 -0
  206. package/docs/api/type-aliases/Align.md +15 -0
  207. package/docs/api/type-aliases/ArtifactKind.md +15 -0
  208. package/docs/api/type-aliases/AttachmentOptions.md +15 -0
  209. package/docs/api/type-aliases/BlendMode.md +15 -0
  210. package/docs/api/type-aliases/BoxRect.md +15 -0
  211. package/docs/api/type-aliases/BuildOptions.md +15 -0
  212. package/docs/api/type-aliases/Cell.md +71 -0
  213. package/docs/api/type-aliases/Chunk.md +79 -0
  214. package/docs/api/type-aliases/Color.md +16 -0
  215. package/docs/api/type-aliases/Coordinates.md +55 -0
  216. package/docs/api/type-aliases/Direction.md +15 -0
  217. package/docs/api/type-aliases/DocumentInfo.md +15 -0
  218. package/docs/api/type-aliases/DropReason.md +15 -0
  219. package/docs/api/type-aliases/Dropped.md +59 -0
  220. package/docs/api/type-aliases/Edited.md +15 -0
  221. package/docs/api/type-aliases/ErrorCode.md +15 -0
  222. package/docs/api/type-aliases/ErrorKind.md +15 -0
  223. package/docs/api/type-aliases/ExtractFormat.md +15 -0
  224. package/docs/api/type-aliases/ExtractedBlock.md +82 -0
  225. package/docs/api/type-aliases/ExtractedPage.md +65 -0
  226. package/docs/api/type-aliases/ExtractedSource.md +48 -0
  227. package/docs/api/type-aliases/Extraction.md +22 -0
  228. package/docs/api/type-aliases/FillRule.md +15 -0
  229. package/docs/api/type-aliases/Fit.md +15 -0
  230. package/docs/api/type-aliases/Flags.md +15 -0
  231. package/docs/api/type-aliases/Generator.md +41 -0
  232. package/docs/api/type-aliases/GlyphQuad.md +15 -0
  233. package/docs/api/type-aliases/InfoPatch.md +15 -0
  234. package/docs/api/type-aliases/LaminaPdfWarning.md +16 -0
  235. package/docs/api/type-aliases/LimitName.md +15 -0
  236. package/docs/api/type-aliases/Limits.md +15 -0
  237. package/docs/api/type-aliases/LineBox.md +15 -0
  238. package/docs/api/type-aliases/LineCap.md +15 -0
  239. package/docs/api/type-aliases/LineJoin.md +15 -0
  240. package/docs/api/type-aliases/LinkTarget.md +15 -0
  241. package/docs/api/type-aliases/Metadata.md +15 -0
  242. package/docs/api/type-aliases/Op.md +15 -0
  243. package/docs/api/type-aliases/OutlineEntry.md +15 -0
  244. package/docs/api/type-aliases/Overflow.md +15 -0
  245. package/docs/api/type-aliases/PageInfo.md +15 -0
  246. package/docs/api/type-aliases/PageLabel.md +15 -0
  247. package/docs/api/type-aliases/PageSizeName.md +15 -0
  248. package/docs/api/type-aliases/Point.md +15 -0
  249. package/docs/api/type-aliases/Profile.md +15 -0
  250. package/docs/api/type-aliases/Progress.md +15 -0
  251. package/docs/api/type-aliases/ReadingOrder.md +15 -0
  252. package/docs/api/type-aliases/Rect.md +15 -0
  253. package/docs/api/type-aliases/Region.md +31 -0
  254. package/docs/api/type-aliases/RenderMode.md +15 -0
  255. package/docs/api/type-aliases/Rotation.md +15 -0
  256. package/docs/api/type-aliases/SaveOptions.md +15 -0
  257. package/docs/api/type-aliases/SaveReport.md +15 -0
  258. package/docs/api/type-aliases/Span.md +63 -0
  259. package/docs/api/type-aliases/SplitOn.md +15 -0
  260. package/docs/api/type-aliases/Standard14.md +15 -0
  261. package/docs/api/type-aliases/StructRef.md +41 -0
  262. package/docs/api/type-aliases/StructSource.md +17 -0
  263. package/docs/api/type-aliases/TableDetector.md +15 -0
  264. package/docs/api/type-aliases/TableMode.md +15 -0
  265. package/docs/api/type-aliases/TableScope.md +15 -0
  266. package/docs/api/type-aliases/Tag.md +15 -0
  267. package/docs/api/type-aliases/TagName.md +15 -0
  268. package/docs/api/type-aliases/TextLayout.md +15 -0
  269. package/docs/api/type-aliases/TextRange.md +33 -0
  270. package/docs/api/type-aliases/TextRunInfo.md +15 -0
  271. package/docs/api/type-aliases/Transform.md +15 -0
  272. package/docs/api/type-aliases/UndoOutcome.md +15 -0
  273. package/docs/api/type-aliases/ViewerPreferences.md +15 -0
  274. package/docs/api/type-aliases/WarningCode.md +15 -0
  275. package/docs/api/type-aliases/WasmSource.md +16 -0
  276. package/docs/api/variables/Matrix.md +99 -0
  277. package/docs/api/variables/PAGE_SIZES.md +15 -0
  278. package/docs/api/variables/TAG_NAMES.md +15 -0
  279. package/docs/errors/README.md +156 -0
  280. package/docs/errors/aes-padding-invalid.md +34 -0
  281. package/docs/errors/already-initialized.md +34 -0
  282. package/docs/errors/binary-output-to-terminal.md +35 -0
  283. package/docs/errors/builder-finished.md +35 -0
  284. package/docs/errors/cancelled.md +35 -0
  285. package/docs/errors/cmap-invalid.md +42 -0
  286. package/docs/errors/collection-index.md +33 -0
  287. package/docs/errors/color-components.md +33 -0
  288. package/docs/errors/content-bad-operands.md +36 -0
  289. package/docs/errors/content-path-unpainted.md +36 -0
  290. package/docs/errors/content-resource-missing.md +37 -0
  291. package/docs/errors/content-syntax.md +36 -0
  292. package/docs/errors/content-unbalanced-bt.md +36 -0
  293. package/docs/errors/content-unbalanced-marked.md +36 -0
  294. package/docs/errors/content-unbalanced-q.md +36 -0
  295. package/docs/errors/content-unknown-operator.md +37 -0
  296. package/docs/errors/data-pending.md +34 -0
  297. package/docs/errors/decompress.md +34 -0
  298. package/docs/errors/device-color-without-output-intent.md +33 -0
  299. package/docs/errors/direct-page.md +34 -0
  300. package/docs/errors/disposed.md +34 -0
  301. package/docs/errors/document-changed.md +34 -0
  302. package/docs/errors/embedded-file-forbidden.md +35 -0
  303. package/docs/errors/embedded-file-without-mime-type.md +36 -0
  304. package/docs/errors/encoding-full.md +34 -0
  305. package/docs/errors/encrypted-base.md +33 -0
  306. package/docs/errors/extract-limit-blocks.md +35 -0
  307. package/docs/errors/extract-module-not-loaded.md +37 -0
  308. package/docs/errors/extract-reading-order-ambiguous.md +32 -0
  309. package/docs/errors/extract-struct-tree-ignored.md +32 -0
  310. package/docs/errors/extract-table-ambiguous.md +32 -0
  311. package/docs/errors/extract-table-limit.md +35 -0
  312. package/docs/errors/extract-untagged-content.md +32 -0
  313. package/docs/errors/fetch-failed.md +34 -0
  314. package/docs/errors/flate-truncated.md +34 -0
  315. package/docs/errors/font-invalid.md +36 -0
  316. package/docs/errors/font-mismatch.md +34 -0
  317. package/docs/errors/font-not-embeddable.md +34 -0
  318. package/docs/errors/font-not-embedded.md +35 -0
  319. package/docs/errors/font-not-shapable.md +33 -0
  320. package/docs/errors/glyph-out-of-range.md +34 -0
  321. package/docs/errors/glyph-without-unicode.md +35 -0
  322. package/docs/errors/heading-level-skipped.md +36 -0
  323. package/docs/errors/image-data-length.md +33 -0
  324. package/docs/errors/image-too-large.md +32 -0
  325. package/docs/errors/inline-image-unterminated.md +36 -0
  326. package/docs/errors/input-unreadable.md +37 -0
  327. package/docs/errors/instance-reset.md +34 -0
  328. package/docs/errors/invalid-argument.md +33 -0
  329. package/docs/errors/invalid-axis-value.md +32 -0
  330. package/docs/errors/invalid-box.md +34 -0
  331. package/docs/errors/invalid-color.md +32 -0
  332. package/docs/errors/invalid-command-line.md +44 -0
  333. package/docs/errors/invalid-date.md +34 -0
  334. package/docs/errors/invalid-entry.md +34 -0
  335. package/docs/errors/invalid-feature.md +32 -0
  336. package/docs/errors/invalid-font.md +32 -0
  337. package/docs/errors/invalid-geometry.md +32 -0
  338. package/docs/errors/invalid-icc-profile.md +32 -0
  339. package/docs/errors/invalid-image.md +33 -0
  340. package/docs/errors/invalid-op-log.md +33 -0
  341. package/docs/errors/invalid-page-label.md +34 -0
  342. package/docs/errors/invalid-page-labels.md +32 -0
  343. package/docs/errors/invalid-page-range.md +37 -0
  344. package/docs/errors/invalid-rotate.md +34 -0
  345. package/docs/errors/invalid-structure-nesting.md +38 -0
  346. package/docs/errors/invalid-structure.md +34 -0
  347. package/docs/errors/invalid-text-range.md +33 -0
  348. package/docs/errors/job-finished.md +34 -0
  349. package/docs/errors/limit-exceeded.md +38 -0
  350. package/docs/errors/link-without-contents.md +33 -0
  351. package/docs/errors/link-without-structure.md +37 -0
  352. package/docs/errors/missing-alt-text.md +33 -0
  353. package/docs/errors/missing-glyph.md +33 -0
  354. package/docs/errors/missing-header.md +37 -0
  355. package/docs/errors/missing-lang.md +32 -0
  356. package/docs/errors/missing-root.md +34 -0
  357. package/docs/errors/missing-title.md +32 -0
  358. package/docs/errors/name-tree-node-skipped.md +34 -0
  359. package/docs/errors/nested-transaction.md +34 -0
  360. package/docs/errors/no-pending-save.md +32 -0
  361. package/docs/errors/no-transaction.md +33 -0
  362. package/docs/errors/not-initialized.md +35 -0
  363. package/docs/errors/not-pdf.md +33 -0
  364. package/docs/errors/not-rebased.md +35 -0
  365. package/docs/errors/object-number-out-of-range.md +38 -0
  366. package/docs/errors/objstm-index-mismatch.md +36 -0
  367. package/docs/errors/out-of-memory.md +38 -0
  368. package/docs/errors/outline-cycle.md +34 -0
  369. package/docs/errors/outline-item-skipped.md +34 -0
  370. package/docs/errors/output-unwritable.md +37 -0
  371. package/docs/errors/overwrite-refused.md +36 -0
  372. package/docs/errors/page-count-mismatch.md +34 -0
  373. package/docs/errors/page-index-out-of-range.md +34 -0
  374. package/docs/errors/page-tree-node-skipped.md +35 -0
  375. package/docs/errors/password-required.md +36 -0
  376. package/docs/errors/path-outside-roots.md +32 -0
  377. package/docs/errors/perms-mismatch.md +34 -0
  378. package/docs/errors/profile-version-conflict.md +35 -0
  379. package/docs/errors/reference-cycle.md +35 -0
  380. package/docs/errors/render-backend-unavailable.md +32 -0
  381. package/docs/errors/render-failed.md +33 -0
  382. package/docs/errors/render-too-large.md +36 -0
  383. package/docs/errors/repaired-base.md +34 -0
  384. package/docs/errors/requires-rewrite.md +38 -0
  385. package/docs/errors/saved-not-rebased.md +34 -0
  386. package/docs/errors/sink-not-empty.md +33 -0
  387. package/docs/errors/sink.md +31 -0
  388. package/docs/errors/source-budget-exceeded.md +34 -0
  389. package/docs/errors/source-changed.md +33 -0
  390. package/docs/errors/source.md +30 -0
  391. package/docs/errors/stale-generation.md +34 -0
  392. package/docs/errors/stream-length-recovered.md +37 -0
  393. package/docs/errors/strict.md +34 -0
  394. package/docs/errors/subset-failed.md +31 -0
  395. package/docs/errors/syntax.md +34 -0
  396. package/docs/errors/text-module-not-loaded.md +36 -0
  397. package/docs/errors/text-overflow.md +34 -0
  398. package/docs/errors/tounicode-conflict.md +32 -0
  399. package/docs/errors/type.md +34 -0
  400. package/docs/errors/unexpected-eof.md +34 -0
  401. package/docs/errors/unknown-axis.md +33 -0
  402. package/docs/errors/unknown-code.md +36 -0
  403. package/docs/errors/unknown-destination.md +33 -0
  404. package/docs/errors/unknown-font.md +33 -0
  405. package/docs/errors/unknown-option.md +33 -0
  406. package/docs/errors/unknown-page.md +34 -0
  407. package/docs/errors/unmapped-glyph.md +36 -0
  408. package/docs/errors/unnumbered-heading-misused.md +34 -0
  409. package/docs/errors/unset-object.md +30 -0
  410. package/docs/errors/unsupported-filter.md +34 -0
  411. package/docs/errors/unsupported-image.md +33 -0
  412. package/docs/errors/unsupported-layout-option.md +33 -0
  413. package/docs/errors/unsupported-security-handler.md +34 -0
  414. package/docs/errors/unsupported-version.md +32 -0
  415. package/docs/errors/untagged-content.md +35 -0
  416. package/docs/errors/warnings-truncated.md +35 -0
  417. package/docs/errors/wasm-trap.md +37 -0
  418. package/docs/errors/whole-font-rebuilt.md +30 -0
  419. package/docs/errors/worker-crashed.md +33 -0
  420. package/docs/errors/worker-failed.md +32 -0
  421. package/docs/errors/worker-version-mismatch.md +34 -0
  422. package/docs/errors/would-invalidate-signatures.md +38 -0
  423. package/docs/errors/wrong-document.md +33 -0
  424. package/docs/errors/wrong-password.md +34 -0
  425. package/docs/errors/xobject-cycle.md +36 -0
  426. package/docs/errors/xref-repaired.md +36 -0
  427. package/docs/errors/xrefstm-ignored.md +34 -0
  428. package/docs/llms.txt +88 -0
  429. package/docs/pages/concepts/dependencies.md +44 -0
  430. package/docs/pages/concepts/errors-and-warnings.md +64 -0
  431. package/docs/pages/concepts/how-lamina-thinks.md +86 -0
  432. package/docs/pages/concepts/pages-and-coordinates.md +67 -0
  433. package/docs/pages/guides/accessible-pdfs.md +260 -0
  434. package/docs/pages/guides/archival-pdfs.md +429 -0
  435. package/docs/pages/guides/edit-a-pdf.md +137 -0
  436. package/docs/pages/guides/fonts-and-text.md +202 -0
  437. package/docs/pages/guides/images-and-vectors.md +219 -0
  438. package/docs/pages/guides/keep-the-page-responsive.md +81 -0
  439. package/docs/pages/guides/links-outlines-and-metadata.md +222 -0
  440. package/docs/pages/guides/password-protected-files.md +70 -0
  441. package/docs/pages/guides/save-a-pdf.md +144 -0
  442. package/docs/pages/guides/untrusted-files.md +80 -0
  443. package/docs/pages/index.md +33 -0
  444. package/docs/pages/install.md +75 -0
  445. package/docs/pages/quick-start/browser.md +67 -0
  446. package/docs/pages/quick-start/bun.md +60 -0
  447. package/docs/pages/quick-start/deno.md +58 -0
  448. package/docs/pages/quick-start/node.md +61 -0
  449. package/docs/pages/quick-start/rust.md +58 -0
  450. package/docs/pages/quick-start/workers.md +139 -0
  451. package/docs/pages/recipes/cloudflare-worker.md +115 -0
  452. package/docs/pages/recipes/extract-markdown.md +114 -0
  453. package/docs/pages/recipes/generate-then-edit.md +135 -0
  454. package/docs/pages/recipes/hello.md +94 -0
  455. package/docs/pages/recipes/images-and-vectors.md +209 -0
  456. package/docs/pages/recipes/invoice.md +226 -0
  457. package/docs/pages/recipes/links-and-outlines.md +215 -0
  458. package/docs/pages/recipes/multilingual.md +189 -0
  459. package/docs/pages/recipes/open-untrusted.md +65 -0
  460. package/docs/pages/recipes/pdf-a-archive.md +205 -0
  461. package/docs/pages/recipes/pdf-a3-invoice-with-xml.md +222 -0
  462. package/docs/pages/recipes/pdf-ua-report.md +237 -0
  463. package/docs/pages/recipes/report.md +125 -0
  464. package/docs/pages/recipes/web-worker-client.md +64 -0
  465. package/docs/pages/recipes.md +47 -0
  466. package/docs/pages/reference/changelog.md +86 -0
  467. package/docs/pages/reference/codes.md +14 -0
  468. package/docs/pages/reference/glossary.md +108 -0
  469. package/docs/pages/reference/rust.md +36 -0
  470. package/docs/pages/reference/stability.md +59 -0
  471. package/docs/pages/start/coding-agents.md +45 -0
  472. package/docs/pages/start/first-pdf.md +77 -0
  473. package/docs/pages/troubleshooting.md +74 -0
  474. package/docs/renames.json +86 -0
  475. package/docs/schemas/error.schema.json +305 -0
  476. package/docs/schemas/renames.schema.json +29 -0
  477. package/package.json +93 -3
  478. package/schemas/error.schema.json +305 -0
@@ -0,0 +1,102 @@
1
+ import { type ErrorCode, type ErrorKind, RAISED_BY_PACKAGE, type WarningCode } from "./generated/codes.js";
2
+ export type { ErrorKind };
3
+ /** Where a problem is (ADR 0026 §1.1); each field has one meaning, all lamina-made values. */
4
+ export interface Location {
5
+ /** Byte offset in the input file. */
6
+ readonly offset?: number;
7
+ /** Object number of the indirect object the problem is in or at. */
8
+ readonly object?: number;
9
+ /** Byte offset in the decoded data of `object`. */
10
+ readonly streamOffset?: number;
11
+ /** 0-based page index (ADR 0027 §6). */
12
+ readonly pageIndex?: number;
13
+ /** A LaminaPdfId (`p12.0`). */
14
+ readonly id?: string;
15
+ }
16
+ /** The ADR 0026 §1 object: what `LaminaPdfError.toJSON()` returns and the WASM throws. */
17
+ export interface Diagnostic<C extends string = ErrorCode> {
18
+ readonly code: C;
19
+ readonly kind: ErrorKind;
20
+ readonly message: string;
21
+ readonly hint?: string;
22
+ readonly didYouMean?: readonly string[];
23
+ readonly location?: Location;
24
+ readonly data?: Readonly<Record<string, unknown>>;
25
+ readonly docsUrl: string;
26
+ }
27
+ /**
28
+ * A warning: something Lamina PDF repaired or skipped (ADR 0003, ADR 0026 §1). The §1 object without
29
+ * `didYouMean`; document text appears only in `data`.
30
+ */
31
+ export type LaminaPdfWarning = Omit<Diagnostic<WarningCode>, "didYouMean">;
32
+ /**
33
+ * The one error class of `@laminapdf/sdk` (ADR 0026 §7). `message`, `hint` and `didYouMean` never
34
+ * hold document text (ADR 0026 §4); that goes in `data`, marked untrusted on the code's page at
35
+ * `docsUrl`.
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * try {
40
+ * Document.open(bytes, { password: "secret" });
41
+ * } catch (e) {
42
+ * if (isLaminaPdfError(e, "wrong-password")) askAgain();
43
+ * else throw e;
44
+ * }
45
+ * ```
46
+ */
47
+ export declare class LaminaPdfError<C extends ErrorCode = ErrorCode> extends Error {
48
+ readonly name = "LaminaPdfError";
49
+ /** The stable code (`fixtures/codes.json`). */
50
+ readonly code: C;
51
+ /** What the caller can do about it. */
52
+ readonly kind: ErrorKind;
53
+ /** One actionable sentence for this code. */
54
+ readonly hint?: string;
55
+ /** For `usage` errors: the closest known names (Lamina PDF's own vocabulary). */
56
+ readonly didYouMean?: readonly string[];
57
+ /** Where in the input or the document. */
58
+ readonly location?: Location;
59
+ /** Code-specific fields, documented on the code's page (the only place document text appears). */
60
+ readonly data?: Readonly<Record<string, unknown>>;
61
+ /** The code's page. */
62
+ readonly docsUrl: string;
63
+ /**
64
+ * @param diagnostic - the ADR 0026 §1 object.
65
+ * @param options - `cause`, when wrapping another error.
66
+ */
67
+ constructor(diagnostic: Diagnostic<C>, options?: {
68
+ readonly cause?: unknown;
69
+ });
70
+ /**
71
+ * For `data-pending`: the byte ranges a range document needs fetched before the call can
72
+ * succeed (`data.ranges`); `undefined` for other codes. {@link Document.ensure} fetches them.
73
+ */
74
+ get ranges(): readonly {
75
+ readonly offset: number;
76
+ readonly length: number;
77
+ }[] | undefined;
78
+ /** The ADR 0026 §1 object (for logs, workers and `--json` output); optional fields omitted. */
79
+ toJSON(): Diagnostic<C>;
80
+ }
81
+ /**
82
+ * Whether `e` is a {@link LaminaPdfError}, with `code` when given.
83
+ *
84
+ * @param e - anything caught.
85
+ * @param code - the code to match.
86
+ * @returns true for a LaminaPdfError (with that code).
87
+ */
88
+ export declare function isLaminaPdfError<C extends ErrorCode>(e: unknown, code?: C): e is LaminaPdfError<C>;
89
+ /** Whether `value` is the §1 object the WASM throws. */
90
+ export declare function isDiagnostic(value: unknown): value is Diagnostic<ErrorCode>;
91
+ /** A LaminaPdfError for a code `@laminapdf/sdk` raises itself (kind and hint from codes.json). */
92
+ export declare function packageError<C extends keyof typeof RAISED_BY_PACKAGE>(code: C, message: string, extra?: Pick<Diagnostic<C>, "didYouMean" | "data"> & {
93
+ readonly cause?: unknown;
94
+ }): LaminaPdfError<C>;
95
+ /**
96
+ * The names in `known` within two edits of `given`, closest first; names at the same distance in
97
+ * code-point order. Edits count code points, after lowercasing ASCII letters only.
98
+ * laminapdf-wasm follows the same rule, and fixtures/did-you-mean.json pins both. `<` compares
99
+ * UTF-16 code units, which is code-point order for the library's names (all ASCII).
100
+ */
101
+ export declare function didYouMean(given: string, known: readonly string[]): string[];
102
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
package/dist/errors.js ADDED
@@ -0,0 +1,131 @@
1
+ // LaminaPdfError and LaminaPdfWarning (ADR 0026 §1, §7): every error @laminapdf/sdk throws is a
2
+ // LaminaPdfError built from the §1 object the WASM throws, or raised here with the kind and hint
3
+ // codes.json gives the code.
4
+ import { docsUrl, RAISED_BY_PACKAGE } from "./generated/codes.js";
5
+ /**
6
+ * The one error class of `@laminapdf/sdk` (ADR 0026 §7). `message`, `hint` and `didYouMean` never
7
+ * hold document text (ADR 0026 §4); that goes in `data`, marked untrusted on the code's page at
8
+ * `docsUrl`.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * try {
13
+ * Document.open(bytes, { password: "secret" });
14
+ * } catch (e) {
15
+ * if (isLaminaPdfError(e, "wrong-password")) askAgain();
16
+ * else throw e;
17
+ * }
18
+ * ```
19
+ */
20
+ export class LaminaPdfError extends Error {
21
+ name = "LaminaPdfError";
22
+ /** The stable code (`fixtures/codes.json`). */
23
+ code;
24
+ /** What the caller can do about it. */
25
+ kind;
26
+ /** One actionable sentence for this code. */
27
+ hint;
28
+ /** For `usage` errors: the closest known names (Lamina PDF's own vocabulary). */
29
+ didYouMean;
30
+ /** Where in the input or the document. */
31
+ location;
32
+ /** Code-specific fields, documented on the code's page (the only place document text appears). */
33
+ data;
34
+ /** The code's page. */
35
+ docsUrl;
36
+ /**
37
+ * @param diagnostic - the ADR 0026 §1 object.
38
+ * @param options - `cause`, when wrapping another error.
39
+ */
40
+ constructor(diagnostic, options) {
41
+ super(diagnostic.message, options);
42
+ this.code = diagnostic.code;
43
+ this.kind = diagnostic.kind;
44
+ this.docsUrl = diagnostic.docsUrl;
45
+ if (diagnostic.hint !== undefined)
46
+ this.hint = diagnostic.hint;
47
+ // ADR 0026 §1: optional keys are omitted, and an empty list is no candidates at all.
48
+ if (diagnostic.didYouMean !== undefined && diagnostic.didYouMean.length > 0)
49
+ this.didYouMean = diagnostic.didYouMean;
50
+ if (diagnostic.location !== undefined)
51
+ this.location = diagnostic.location;
52
+ if (diagnostic.data !== undefined)
53
+ this.data = diagnostic.data;
54
+ }
55
+ /**
56
+ * For `data-pending`: the byte ranges a range document needs fetched before the call can
57
+ * succeed (`data.ranges`); `undefined` for other codes. {@link Document.ensure} fetches them.
58
+ */
59
+ get ranges() {
60
+ if (this.code !== "data-pending")
61
+ return undefined;
62
+ const raw = this.data?.ranges;
63
+ if (!Array.isArray(raw))
64
+ return [];
65
+ return raw.flatMap((r) => Array.isArray(r) && typeof r[0] === "number" && typeof r[1] === "number" ? [{ offset: r[0], length: r[1] }] : []);
66
+ }
67
+ /** The ADR 0026 §1 object (for logs, workers and `--json` output); optional fields omitted. */
68
+ toJSON() {
69
+ return {
70
+ code: this.code,
71
+ kind: this.kind,
72
+ message: this.message,
73
+ ...(this.hint === undefined ? {} : { hint: this.hint }),
74
+ ...(this.didYouMean === undefined ? {} : { didYouMean: this.didYouMean }),
75
+ ...(this.location === undefined ? {} : { location: this.location }),
76
+ ...(this.data === undefined ? {} : { data: this.data }),
77
+ docsUrl: this.docsUrl,
78
+ };
79
+ }
80
+ }
81
+ /**
82
+ * Whether `e` is a {@link LaminaPdfError}, with `code` when given.
83
+ *
84
+ * @param e - anything caught.
85
+ * @param code - the code to match.
86
+ * @returns true for a LaminaPdfError (with that code).
87
+ */
88
+ export function isLaminaPdfError(e, code) {
89
+ return e instanceof LaminaPdfError && (code === undefined || e.code === code);
90
+ }
91
+ /** Whether `value` is the §1 object the WASM throws. */
92
+ export function isDiagnostic(value) {
93
+ if (typeof value !== "object" || value === null || value instanceof Error)
94
+ return false;
95
+ const v = value;
96
+ return typeof v.code === "string" && typeof v.kind === "string" && typeof v.docsUrl === "string";
97
+ }
98
+ /** A LaminaPdfError for a code `@laminapdf/sdk` raises itself (kind and hint from codes.json). */
99
+ export function packageError(code, message, extra = {}) {
100
+ const { kind, hint } = RAISED_BY_PACKAGE[code];
101
+ const { cause, ...fields } = extra;
102
+ return new LaminaPdfError({ code, kind, message, hint, ...fields, docsUrl: docsUrl(code) }, cause === undefined ? undefined : { cause });
103
+ }
104
+ /**
105
+ * The names in `known` within two edits of `given`, closest first; names at the same distance in
106
+ * code-point order. Edits count code points, after lowercasing ASCII letters only.
107
+ * laminapdf-wasm follows the same rule, and fixtures/did-you-mean.json pins both. `<` compares
108
+ * UTF-16 code units, which is code-point order for the library's names (all ASCII).
109
+ */
110
+ export function didYouMean(given, known) {
111
+ const chars = (s) => Array.from(s.replace(/[A-Z]/g, (c) => c.toLowerCase()));
112
+ const distance = (a, b) => {
113
+ let row = Array.from({ length: b.length + 1 }, (_, i) => i);
114
+ for (let i = 0; i < a.length; i++) {
115
+ const next = [i + 1];
116
+ for (let j = 0; j < b.length; j++) {
117
+ const cost = (row[j] ?? 0) + (a[i] === b[j] ? 0 : 1);
118
+ next.push(Math.min(cost, (row[j + 1] ?? 0) + 1, (next[j] ?? 0) + 1));
119
+ }
120
+ row = next;
121
+ }
122
+ return row[b.length] ?? 0;
123
+ };
124
+ const target = chars(given);
125
+ return known
126
+ .map((k) => [distance(target, chars(k)), k])
127
+ .filter(([d]) => d <= 2)
128
+ .sort(([dx, x], [dy, y]) => dx - dy || (x < y ? -1 : Number(x > y)))
129
+ .map(([, k]) => k);
130
+ }
131
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type ErrorCode, type WarningCode } from "./generated/codes.js";
2
+ export type { ErrorCode, ErrorKind, WarningCode } from "./generated/codes.js";
3
+ export { DOCS_URL, docsUrl, ERROR_CODES, HINTS, KINDS, WARNING_CODES } from "./generated/codes.js";
4
+ /** Whether `code` is one of Lamina PDF's error or warning codes. */
5
+ export declare function isCode(code: string): code is ErrorCode | WarningCode;
6
+ /**
7
+ * The explain page of `code` as Markdown (`docs/errors/<code>.md`: what happened, why, how to fix,
8
+ * an example and the `data` fields), or `undefined` for a string that is not a code. The same
9
+ * text as `docsUrl` and `laminapdf::explain` in Rust.
10
+ *
11
+ * @param code - an error or warning code, such as `LaminaPdfError.code`.
12
+ * @example
13
+ * ```ts
14
+ * import { explain } from "@laminapdf/sdk/explain";
15
+ * console.log(explain("wrong-password"));
16
+ * ```
17
+ */
18
+ export declare function explain(code: ErrorCode | WarningCode): string;
19
+ export declare function explain(code: string): string | undefined;
20
+ //# sourceMappingURL=explain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain.d.ts","sourceRoot":"","sources":["../src/explain.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAS,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAG/E,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEnG,oEAAoE;AACpE,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,SAAS,GAAG,WAAW,CAEpE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,WAAW,GAAG,MAAM,CAAC;AAC/D,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC"}
@@ -0,0 +1,14 @@
1
+ // `@laminapdf/sdk/explain` (ADR 0026 §6): every code's explain page, kind and hint, for tools and
2
+ // agents that want to tell a user what a code means and what to do. A separate subpath, so the
3
+ // ~80 KB of page text and the tables stay out of the main bundle (and out of the WebAssembly).
4
+ import { HINTS } from "./generated/codes.js";
5
+ import { PAGES } from "./generated/explain.js";
6
+ export { DOCS_URL, docsUrl, ERROR_CODES, HINTS, KINDS, WARNING_CODES } from "./generated/codes.js";
7
+ /** Whether `code` is one of Lamina PDF's error or warning codes. */
8
+ export function isCode(code) {
9
+ return Object.hasOwn(HINTS, code);
10
+ }
11
+ export function explain(code) {
12
+ return isCode(code) ? PAGES[code] : undefined;
13
+ }
14
+ //# sourceMappingURL=explain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain.js","sourceRoot":"","sources":["../src/explain.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,+FAA+F;AAC/F,+FAA+F;AAC/F,OAAO,EAAkB,KAAK,EAAoB,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAG/C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEnG,oEAAoE;AACpE,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACpC,CAAC;AAgBD,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAChD,CAAC"}
@@ -0,0 +1,57 @@
1
+ import type { ExtractFormat, ReadingOrderName as ReadingOrder, SplitOnName as SplitOn, TableModeName as TableMode } from "@laminapdf/wasm/extract";
2
+ import type { LaminaPdfWarning } from "./errors.js";
3
+ import type { Chunk, Extraction as ExtractionJson } from "./generated/extract.js";
4
+ export type { Cell, Coordinates, Dropped, DropReason, ExtractedPage, ExtractedSource, Flags, Generator, JsonBlock as ExtractedBlock, Region, Span, StructRef, StructSource, TableDetector, TextRange, } from "./generated/extract.js";
5
+ /**
6
+ * The `laminapdf.extract/1` document: the schema's type, with the file's warnings as the
7
+ * {@link LaminaPdfWarning}s they are (the schema leaves their shape to ADR 0026's).
8
+ */
9
+ export type Extraction = Omit<ExtractionJson, "warnings"> & {
10
+ warnings: LaminaPdfWarning[];
11
+ };
12
+ export type { ExtractFormat, ReadingOrder, SplitOn, TableMode };
13
+ /** How the Markdown is cut into chunks. */
14
+ export interface ChunkOptions {
15
+ /** A chunk's budget in approximate tokens (characters / 4); 512 by default. Blocks are never cut. */
16
+ readonly maxTokens?: number;
17
+ /** Approximate tokens of whole blocks a chunk repeats from the one before it; 0 by default. */
18
+ readonly overlap?: number;
19
+ /** Where chunks may start. */
20
+ readonly splitOn?: SplitOn;
21
+ }
22
+ /** Options for {@link Document.extract}. */
23
+ export interface ExtractOptions<F extends ExtractFormat = ExtractFormat> {
24
+ /** What to return: Markdown or plain text as a string, the JSON as an {@link Extraction}, or {@link Chunk}s. */
25
+ readonly format: F;
26
+ /** The 0-based page indices to extract, in this order; every page by default. */
27
+ readonly pages?: readonly number[];
28
+ /** Where the reading order comes from; `"auto"` by default. */
29
+ readonly readingOrder?: ReadingOrder;
30
+ /**
31
+ * `keepSpans` keeps each dropped run's text in its `dropped` entry (JSON), for auditing a file.
32
+ * `furniture` (on by default) drops running headers, footers, page numbers and artifact-marked text too.
33
+ */
34
+ readonly drop?: {
35
+ readonly keepSpans?: boolean;
36
+ readonly furniture?: boolean;
37
+ };
38
+ /** Which table detectors run; `"lattice"` by default. */
39
+ readonly tables?: TableMode;
40
+ /** Join words hyphenated across lines; on by default. */
41
+ readonly dehyphenate?: boolean;
42
+ /** Write `<!-- page N -->` before each page's first block (Markdown, chunks and the JSON's text ranges). */
43
+ readonly pageMarkers?: boolean;
44
+ /** How chunks are cut (`"chunks"`, and `"json"` to include them). */
45
+ readonly chunk?: ChunkOptions;
46
+ }
47
+ /** The result of {@link Document.extract} for each format. */
48
+ export interface ExtractResult {
49
+ readonly markdown: string;
50
+ readonly text: string;
51
+ readonly json: Extraction;
52
+ readonly chunks: Chunk[];
53
+ }
54
+ /** The WASM's string as the type `format` promises. */
55
+ export declare function parseExtract<F extends ExtractFormat>(format: F, out: string): ExtractResult[F];
56
+ export type { Chunk };
57
+ //# sourceMappingURL=extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,IAAI,YAAY,EAChC,WAAW,IAAI,OAAO,EACtB,aAAa,IAAI,SAAS,EAC3B,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAElF,YAAY,EACV,IAAI,EACJ,WAAW,EACX,OAAO,EACP,UAAU,EACV,aAAa,EACb,eAAe,EACf,KAAK,EACL,SAAS,EACT,SAAS,IAAI,cAAc,EAC3B,MAAM,EACN,IAAI,EACJ,SAAS,EACT,YAAY,EACZ,aAAa,EACb,SAAS,GACV,MAAM,wBAAwB,CAAC;AAEhC;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,GAAG;IAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAA;CAAE,CAAC;AAI7F,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAEhE,2CAA2C;AAC3C,MAAM,WAAW,YAAY;IAC3B,qGAAqG;IACrG,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,+FAA+F;IAC/F,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,8BAA8B;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,4CAA4C;AAC5C,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa;IACrE,gHAAgH;IAChH,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,iFAAiF;IACjF,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,+DAA+D;IAC/D,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;IACrC;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC/E,yDAAyD;IACzD,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAC5B,yDAAyD;IACzD,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,4GAA4G;IAC5G,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,qEAAqE;IACrE,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC;CAC/B;AAED,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;CAC1B;AAED,uDAAuD;AACvD,wBAAgB,YAAY,CAAC,CAAC,SAAS,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAE9F;AAED,YAAY,EAAE,KAAK,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** The WASM's string as the type `format` promises. */
2
+ export function parseExtract(format, out) {
3
+ return (format === "json" || format === "chunks" ? JSON.parse(out) : out);
4
+ }
5
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"AAkFA,uDAAuD;AACvD,MAAM,UAAU,YAAY,CAA0B,MAAS,EAAE,GAAW;IAC1E,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAqB,CAAC;AAChG,CAAC"}
package/dist/font.d.ts ADDED
@@ -0,0 +1,73 @@
1
+ import type { WasmImage } from "@laminapdf/wasm/base";
2
+ import { type BaseGlue } from "./init.js";
3
+ import type { Instance } from "./internal/instance.js";
4
+ /** The standard 14 fonts, by PostScript name: no bytes needed, not embedded, Latin only, unshaped. */
5
+ export type Standard14 = "Times-Roman" | "Times-Bold" | "Times-Italic" | "Times-BoldItalic" | "Helvetica" | "Helvetica-Bold" | "Helvetica-Oblique" | "Helvetica-BoldOblique" | "Courier" | "Courier-Bold" | "Courier-Oblique" | "Courier-BoldOblique" | "Symbol" | "ZapfDingbats";
6
+ /** What a builder knows of a font once registered. */
7
+ export interface FontInfo {
8
+ /** The family name. */
9
+ readonly family: string;
10
+ /** The PostScript name. */
11
+ readonly postscriptName: string;
12
+ /** Whether it is one of the standard 14 (not embedded). */
13
+ readonly isStandard: boolean;
14
+ }
15
+ /**
16
+ * A font to draw text with: TrueType or OpenType bytes (subset to the glyphs drawn and embedded)
17
+ * or one of the standard 14. Needs the text module (`init({ text: true })`).
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * const inter = Font.fromBytes(await (await fetch("/Inter.ttf")).arrayBuffer());
22
+ * surface.text("Hello", { font: inter, size: 12, at: [72, 72] });
23
+ * ```
24
+ */
25
+ export declare class Font {
26
+ /** The font program, for a font loaded from bytes. */
27
+ readonly bytes: Uint8Array | undefined;
28
+ /** The PostScript name, for a standard 14 font. */
29
+ readonly standard: Standard14 | undefined;
30
+ private constructor();
31
+ /**
32
+ * A font from its bytes (TrueType or OpenType/CFF). The bytes are checked when a builder first
33
+ * uses the font (`invalid-font`, `font-not-embeddable`).
34
+ */
35
+ static fromBytes(bytes: Uint8Array | ArrayBuffer): Font;
36
+ /** One of the standard 14 fonts. */
37
+ static standard(name: Standard14): Font;
38
+ }
39
+ /**
40
+ * An image to draw: a JPEG (passed through), a PNG (alpha as a soft mask) or raw RGBA pixels.
41
+ * The bytes are copied when the image is created. It is decoded once per WASM module, the first
42
+ * time a builder of that module draws it (or `width`/`height` is read), so problems with the
43
+ * data (`invalid-image`, `unsupported-image`, …) surface there. Written once per document however
44
+ * often it is drawn. It keeps its bytes, so it outlives `reset()` and decodes again.
45
+ */
46
+ export declare class Image {
47
+ #private;
48
+ private constructor();
49
+ /** A JPEG. */
50
+ static jpeg(bytes: Uint8Array): Image;
51
+ /** A PNG. */
52
+ static png(bytes: Uint8Array): Image;
53
+ /** 8-bit RGBA pixels, row by row (`image-data-length` at first use for a wrong length). */
54
+ static rgba(width: number, height: number, pixels: Uint8Array): Image;
55
+ /** Width in pixels (decodes the image if no module has yet). @throws {@link LaminaPdfError} as `in`. */
56
+ get width(): number;
57
+ /** Height in pixels (decodes the image if no module has yet). @throws {@link LaminaPdfError} as `in`. */
58
+ get height(): number;
59
+ /**
60
+ * Frees the image's WASM memory now; without it, the garbage collector frees it later. A second
61
+ * call does nothing, and any other call afterwards throws `disposed`. Prefer `using`.
62
+ */
63
+ free(): void;
64
+ /** Frees the image at the end of a `using` block (an alias of `free()`). */
65
+ [Symbol.dispose](): void;
66
+ /**
67
+ * @internal The image in `instance`, decoded there at first use (and again after a reset).
68
+ * @throws {@link LaminaPdfError} `disposed`; `invalid-image`, `unsupported-image`,
69
+ * `image-too-large`, `image-data-length`.
70
+ */
71
+ in(instance: Instance<BaseGlue>): WasmImage;
72
+ }
73
+ //# sourceMappingURL=font.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"font.d.ts","sourceRoot":"","sources":["../src/font.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,KAAK,QAAQ,EAAc,MAAM,WAAW,CAAC;AAEtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEvD,sGAAsG;AACtG,MAAM,MAAM,UAAU,GAClB,aAAa,GACb,YAAY,GACZ,cAAc,GACd,kBAAkB,GAClB,WAAW,GACX,gBAAgB,GAChB,mBAAmB,GACnB,uBAAuB,GACvB,SAAS,GACT,cAAc,GACd,iBAAiB,GACjB,qBAAqB,GACrB,QAAQ,GACR,cAAc,CAAC;AAEnB,sDAAsD;AACtD,MAAM,WAAW,QAAQ;IACvB,uBAAuB;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,2BAA2B;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,2DAA2D;IAC3D,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;GASG;AACH,qBAAa,IAAI;IACf,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,CAAC;IACvC,mDAAmD;IACnD,QAAQ,CAAC,QAAQ,EAAE,UAAU,GAAG,SAAS,CAAC;IAE1C,OAAO,eAGN;IAED;;;OAGG;IACH,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,GAAG,IAAI,CAEtD;IAED,oCAAoC;IACpC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAEtC;CACF;AAoBD;;;;;;GAMG;AACH,qBAAa,KAAK;;IAMhB,OAAO,eAEN;IAED,cAAc;IACd,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CAEpC;IAED,aAAa;IACb,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CAEnC;IAED,2FAA2F;IAC3F,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,KAAK,CAEpE;IAED,wGAAwG;IACxG,IAAI,KAAK,IAAI,MAAM,CAGlB;IAED,yGAAyG;IACzG,IAAI,MAAM,IAAI,MAAM,CAGnB;IAYD;;;OAGG;IACH,IAAI,IAAI,IAAI,CAQX;IAED,4EAA4E;IAC5E,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAEvB;IAED;;;;OAIG;IACH,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,SAAS,CAS1C;CACF"}
package/dist/font.js ADDED
@@ -0,0 +1,133 @@
1
+ import { packageError } from "./errors.js";
2
+ import { baseModule } from "./init.js";
3
+ import { disposable, forget, watch } from "./internal/handle.js";
4
+ /**
5
+ * A font to draw text with: TrueType or OpenType bytes (subset to the glyphs drawn and embedded)
6
+ * or one of the standard 14. Needs the text module (`init({ text: true })`).
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const inter = Font.fromBytes(await (await fetch("/Inter.ttf")).arrayBuffer());
11
+ * surface.text("Hello", { font: inter, size: 12, at: [72, 72] });
12
+ * ```
13
+ */
14
+ export class Font {
15
+ /** The font program, for a font loaded from bytes. */
16
+ bytes;
17
+ /** The PostScript name, for a standard 14 font. */
18
+ standard;
19
+ constructor(bytes, standard) {
20
+ this.bytes = bytes;
21
+ this.standard = standard;
22
+ }
23
+ /**
24
+ * A font from its bytes (TrueType or OpenType/CFF). The bytes are checked when a builder first
25
+ * uses the font (`invalid-font`, `font-not-embeddable`).
26
+ */
27
+ static fromBytes(bytes) {
28
+ return new Font(bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes), undefined);
29
+ }
30
+ /** One of the standard 14 fonts. */
31
+ static standard(name) {
32
+ return new Font(undefined, name);
33
+ }
34
+ }
35
+ function decode(instance, source) {
36
+ return instance.call((glue) => {
37
+ switch (source.kind) {
38
+ case "jpeg":
39
+ return glue.WasmImage.jpeg(source.bytes);
40
+ case "png":
41
+ return glue.WasmImage.png(source.bytes);
42
+ case "rgba":
43
+ return glue.WasmImage.rgba(source.width, source.height, source.bytes);
44
+ }
45
+ });
46
+ }
47
+ /**
48
+ * An image to draw: a JPEG (passed through), a PNG (alpha as a soft mask) or raw RGBA pixels.
49
+ * The bytes are copied when the image is created. It is decoded once per WASM module, the first
50
+ * time a builder of that module draws it (or `width`/`height` is read), so problems with the
51
+ * data (`invalid-image`, `unsupported-image`, …) surface there. Written once per document however
52
+ * often it is drawn. It keeps its bytes, so it outlives `reset()` and decodes again.
53
+ */
54
+ export class Image {
55
+ #source;
56
+ /** The decoded copy in each module, with the generation of the instance it lives in. */
57
+ #decoded = new Map();
58
+ #freed = false;
59
+ constructor(source) {
60
+ this.#source = source;
61
+ }
62
+ /** A JPEG. */
63
+ static jpeg(bytes) {
64
+ return new Image({ kind: "jpeg", bytes: bytes.slice() });
65
+ }
66
+ /** A PNG. */
67
+ static png(bytes) {
68
+ return new Image({ kind: "png", bytes: bytes.slice() });
69
+ }
70
+ /** 8-bit RGBA pixels, row by row (`image-data-length` at first use for a wrong length). */
71
+ static rgba(width, height, pixels) {
72
+ return new Image({ kind: "rgba", width, height, bytes: pixels.slice() });
73
+ }
74
+ /** Width in pixels (decodes the image if no module has yet). @throws {@link LaminaPdfError} as `in`. */
75
+ get width() {
76
+ const [instance, image] = this.#any();
77
+ return instance.call(() => image.width);
78
+ }
79
+ /** Height in pixels (decodes the image if no module has yet). @throws {@link LaminaPdfError} as `in`. */
80
+ get height() {
81
+ const [instance, image] = this.#any();
82
+ return instance.call(() => image.height);
83
+ }
84
+ /** A decoded copy, in any module (the base module when none has one). */
85
+ #any() {
86
+ for (const [instance, held] of this.#decoded) {
87
+ instance.live();
88
+ if (held.generation === instance.generation)
89
+ return [instance, held.image];
90
+ }
91
+ const base = baseModule();
92
+ return [base, this.in(base)];
93
+ }
94
+ /**
95
+ * Frees the image's WASM memory now; without it, the garbage collector frees it later. A second
96
+ * call does nothing, and any other call afterwards throws `disposed`. Prefer `using`.
97
+ */
98
+ free() {
99
+ if (this.#freed)
100
+ return;
101
+ this.#freed = true;
102
+ forget(this);
103
+ for (const [instance, held] of this.#decoded) {
104
+ if (instance.owns(held.generation))
105
+ held.image.free();
106
+ }
107
+ this.#decoded.clear();
108
+ }
109
+ /** Frees the image at the end of a `using` block (an alias of `free()`). */
110
+ [Symbol.dispose]() {
111
+ this.free();
112
+ }
113
+ /**
114
+ * @internal The image in `instance`, decoded there at first use (and again after a reset).
115
+ * @throws {@link LaminaPdfError} `disposed`; `invalid-image`, `unsupported-image`,
116
+ * `image-too-large`, `image-data-length`.
117
+ */
118
+ in(instance) {
119
+ if (this.#freed)
120
+ throw packageError("disposed", "the Image was used after free() or its using block");
121
+ instance.live();
122
+ const held = this.#decoded.get(instance);
123
+ if (held !== undefined && held.generation === instance.generation)
124
+ return held.image;
125
+ const image = decode(instance, this.#source);
126
+ if (this.#decoded.size === 0)
127
+ watch(this, "Image");
128
+ this.#decoded.set(instance, { generation: instance.generation, image });
129
+ return image;
130
+ }
131
+ }
132
+ disposable(Image);
133
+ //# sourceMappingURL=font.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"font.js","sourceRoot":"","sources":["../src/font.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /** Every FillRule, as the WASM module names it. */
2
+ export declare const FILL_RULES: readonly ["nonZero", "evenOdd"];
3
+ /** How a filled or clipped path decides what is inside. */
4
+ export type FillRule = (typeof FILL_RULES)[number];
5
+ /** Every LineCap, as the WASM module names it. */
6
+ export declare const LINE_CAPS: readonly ["butt", "round", "square"];
7
+ /** How open line ends are drawn. */
8
+ export type LineCap = (typeof LINE_CAPS)[number];
9
+ /** Every LineJoin, as the WASM module names it. */
10
+ export declare const LINE_JOINS: readonly ["miter", "round", "bevel"];
11
+ /** How corners are drawn. */
12
+ export type LineJoin = (typeof LINE_JOINS)[number];
13
+ /** Every BlendMode, as the WASM module names it. */
14
+ export declare const BLEND_MODES: readonly ["normal", "multiply", "screen", "overlay", "darken", "lighten", "colorDodge", "colorBurn", "hardLight", "softLight", "difference", "exclusion", "hue", "saturation", "color", "luminosity"];
15
+ /** Blend modes (`/BM`), camelCase. */
16
+ export type BlendMode = (typeof BLEND_MODES)[number];
17
+ /** Every ArtifactKind, as the WASM module names it. */
18
+ export declare const ARTIFACT_KINDS: readonly ["layout", "page", "pagination", "background"];
19
+ /** What kind of artifact (content outside the logical structure). */
20
+ export type ArtifactKind = (typeof ARTIFACT_KINDS)[number];
21
+ /** Every TableScope, as the WASM module names it. */
22
+ export declare const TABLE_SCOPES: readonly ["row", "column", "both"];
23
+ /** Which header cells a `TH` heads (`/Scope`). */
24
+ export type TableScope = (typeof TABLE_SCOPES)[number];
25
+ /** Every TagName, as the WASM module names it. */
26
+ export declare const TAG_NAMES: readonly ["Document", "Part", "Sect", "H1", "H2", "H3", "H4", "H5", "H6", "P", "L", "LI", "Lbl", "LBody", "Table", "TR", "TH", "TD", "Figure", "Caption", "Link", "Span", "Quote", "Note", "Code"];
27
+ /** A standard structure type (ISO 32000-1 §14.8.4). */
28
+ export type TagName = (typeof TAG_NAMES)[number];
29
+ //# sourceMappingURL=builder-enums.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder-enums.d.ts","sourceRoot":"","sources":["../../src/generated/builder-enums.ts"],"names":[],"mappings":"AAGA,mDAAmD;AACnD,eAAO,MAAM,UAAU,YACrB,SAAS,EACT,SAAS,CACD,CAAC;AAEX,2DAA2D;AAC3D,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD,kDAAkD;AAClD,eAAO,MAAM,SAAS,YACpB,MAAM,EACN,OAAO,EACP,QAAQ,CACA,CAAC;AAEX,oCAAoC;AACpC,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjD,mDAAmD;AACnD,eAAO,MAAM,UAAU,YACrB,OAAO,EACP,OAAO,EACP,OAAO,CACC,CAAC;AAEX,6BAA6B;AAC7B,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD,oDAAoD;AACpD,eAAO,MAAM,WAAW,YACtB,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,EACX,KAAK,EACL,YAAY,EACZ,OAAO,EACP,YAAY,CACJ,CAAC;AAEX,sCAAsC;AACtC,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,uDAAuD;AACvD,eAAO,MAAM,cAAc,YACzB,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,YAAY,CACJ,CAAC;AAEX,qEAAqE;AACrE,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,qDAAqD;AACrD,eAAO,MAAM,YAAY,YACvB,KAAK,EACL,QAAQ,EACR,MAAM,CACE,CAAC;AAEX,kDAAkD;AAClD,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,kDAAkD;AAClD,eAAO,MAAM,SAAS,YACpB,UAAU,EACV,MAAM,EACN,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,GAAG,EACH,GAAG,EACH,IAAI,EACJ,KAAK,EACL,OAAO,EACP,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,MAAM,EACN,MAAM,EACN,OAAO,EACP,MAAM,EACN,MAAM,CACE,CAAC;AAEX,uDAAuD;AACvD,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC"}