@lofcz/tikz 0.2.1 → 0.2.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 (161) hide show
  1. package/NOTICE.md +3 -1
  2. package/README.md +17 -4
  3. package/package.json +1 -1
  4. package/runtime/.build-key +1 -0
  5. package/runtime/dist/bundles/cm-tfm/chunks/0.br +0 -0
  6. package/runtime/dist/bundles/cm-tfm/chunks/1.br +0 -0
  7. package/runtime/dist/bundles/cm-tfm/chunks/2.br +0 -0
  8. package/runtime/dist/bundles/cm-tfm/chunks/3.br +0 -0
  9. package/runtime/dist/bundles/cm-tfm/chunks/4.br +0 -0
  10. package/runtime/dist/bundles/cm-tfm/chunks/5.br +0 -0
  11. package/runtime/dist/bundles/cm-tfm/chunks/6.br +0 -0
  12. package/runtime/dist/bundles/cm-tfm/chunks/7.br +0 -0
  13. package/runtime/dist/bundles/cm-tfm/files.index.json +1 -1
  14. package/runtime/dist/bundles/cm-tfm/manifest.json +1 -1
  15. package/runtime/dist/bundles/cm-type1/chunks/0.br +0 -0
  16. package/runtime/dist/bundles/cm-type1/chunks/1.br +0 -0
  17. package/runtime/dist/bundles/cm-type1/chunks/10.br +0 -0
  18. package/runtime/dist/bundles/cm-type1/chunks/11.br +0 -0
  19. package/runtime/dist/bundles/cm-type1/chunks/2.br +0 -0
  20. package/runtime/dist/bundles/cm-type1/chunks/3.br +0 -0
  21. package/runtime/dist/bundles/cm-type1/chunks/4.br +0 -0
  22. package/runtime/dist/bundles/cm-type1/chunks/5.br +0 -0
  23. package/runtime/dist/bundles/cm-type1/chunks/6.br +0 -0
  24. package/runtime/dist/bundles/cm-type1/chunks/7.br +0 -0
  25. package/runtime/dist/bundles/cm-type1/chunks/8.br +0 -0
  26. package/runtime/dist/bundles/cm-type1/chunks/9.br +0 -0
  27. package/runtime/dist/bundles/cm-type1/files.index.json +1 -1
  28. package/runtime/dist/bundles/cm-type1/manifest.json +1 -1
  29. package/runtime/dist/bundles/core/chunks/0.br +0 -0
  30. package/runtime/dist/bundles/core/chunks/1.br +0 -0
  31. package/runtime/dist/bundles/core/chunks/2.br +0 -0
  32. package/runtime/dist/bundles/core/chunks/3.br +0 -0
  33. package/runtime/dist/bundles/core/files.index.json +1 -1
  34. package/runtime/dist/bundles/core/manifest.json +1 -1
  35. package/runtime/dist/bundles/filesystem.json +1 -0
  36. package/runtime/dist/bundles/latex-core/chunks/0.br +0 -0
  37. package/runtime/dist/bundles/latex-core/chunks/1.br +0 -0
  38. package/runtime/dist/bundles/latex-core/chunks/10.br +0 -0
  39. package/runtime/dist/bundles/latex-core/chunks/2.br +0 -0
  40. package/runtime/dist/bundles/latex-core/chunks/3.br +0 -0
  41. package/runtime/dist/bundles/latex-core/chunks/4.br +0 -0
  42. package/runtime/dist/bundles/latex-core/chunks/5.br +0 -0
  43. package/runtime/dist/bundles/latex-core/chunks/6.br +0 -0
  44. package/runtime/dist/bundles/latex-core/chunks/7.br +0 -0
  45. package/runtime/dist/bundles/latex-core/chunks/8.br +0 -0
  46. package/runtime/dist/bundles/latex-core/chunks/9.br +0 -0
  47. package/runtime/dist/bundles/latex-core/files.index.json +1 -1
  48. package/runtime/dist/bundles/latex-core/manifest.json +1 -1
  49. package/runtime/dist/bundles/latex-extra/chunks/0.br +0 -0
  50. package/runtime/dist/bundles/latex-extra/chunks/1.br +0 -0
  51. package/runtime/dist/bundles/latex-extra/chunks/10.br +0 -0
  52. package/runtime/dist/bundles/latex-extra/chunks/11.br +0 -0
  53. package/runtime/dist/bundles/latex-extra/chunks/12.br +0 -0
  54. package/runtime/dist/bundles/latex-extra/chunks/13.br +0 -0
  55. package/runtime/dist/bundles/latex-extra/chunks/14.br +0 -0
  56. package/runtime/dist/bundles/latex-extra/chunks/15.br +0 -0
  57. package/runtime/dist/bundles/latex-extra/chunks/16.br +0 -0
  58. package/runtime/dist/bundles/latex-extra/chunks/17.br +0 -0
  59. package/runtime/dist/bundles/latex-extra/chunks/18.br +0 -0
  60. package/runtime/dist/bundles/latex-extra/chunks/19.br +0 -0
  61. package/runtime/dist/bundles/latex-extra/chunks/2.br +0 -0
  62. package/runtime/dist/bundles/latex-extra/chunks/20.br +0 -0
  63. package/runtime/dist/bundles/latex-extra/chunks/21.br +0 -0
  64. package/runtime/dist/bundles/latex-extra/chunks/22.br +0 -0
  65. package/runtime/dist/bundles/latex-extra/chunks/23.br +0 -0
  66. package/runtime/dist/bundles/latex-extra/chunks/24.br +0 -0
  67. package/runtime/dist/bundles/latex-extra/chunks/25.br +0 -0
  68. package/runtime/dist/bundles/latex-extra/chunks/26.br +0 -0
  69. package/runtime/dist/bundles/latex-extra/chunks/27.br +0 -0
  70. package/runtime/dist/bundles/latex-extra/chunks/3.br +0 -0
  71. package/runtime/dist/bundles/latex-extra/chunks/4.br +0 -0
  72. package/runtime/dist/bundles/latex-extra/chunks/5.br +0 -0
  73. package/runtime/dist/bundles/latex-extra/chunks/6.br +0 -0
  74. package/runtime/dist/bundles/latex-extra/chunks/7.br +0 -0
  75. package/runtime/dist/bundles/latex-extra/chunks/8.br +0 -0
  76. package/runtime/dist/bundles/latex-extra/chunks/9.br +0 -0
  77. package/runtime/dist/bundles/latex-extra/files.index.json +1 -1
  78. package/runtime/dist/bundles/latex-extra/manifest.json +1 -1
  79. package/runtime/dist/bundles/lm-fonts/chunks/0.br +0 -0
  80. package/runtime/dist/bundles/lm-fonts/chunks/1.br +0 -0
  81. package/runtime/dist/bundles/lm-fonts/chunks/10.br +0 -0
  82. package/runtime/dist/bundles/lm-fonts/chunks/11.br +0 -0
  83. package/runtime/dist/bundles/lm-fonts/chunks/12.br +0 -0
  84. package/runtime/dist/bundles/lm-fonts/chunks/13.br +0 -0
  85. package/runtime/dist/bundles/lm-fonts/chunks/14.br +0 -0
  86. package/runtime/dist/bundles/lm-fonts/chunks/15.br +0 -0
  87. package/runtime/dist/bundles/lm-fonts/chunks/16.br +0 -0
  88. package/runtime/dist/bundles/lm-fonts/chunks/17.br +0 -0
  89. package/runtime/dist/bundles/lm-fonts/chunks/18.br +0 -0
  90. package/runtime/dist/bundles/lm-fonts/chunks/19.br +0 -0
  91. package/runtime/dist/bundles/lm-fonts/chunks/2.br +0 -0
  92. package/runtime/dist/bundles/lm-fonts/chunks/20.br +0 -0
  93. package/runtime/dist/bundles/lm-fonts/chunks/21.br +0 -0
  94. package/runtime/dist/bundles/lm-fonts/chunks/22.br +0 -0
  95. package/runtime/dist/bundles/lm-fonts/chunks/23.br +0 -0
  96. package/runtime/dist/bundles/lm-fonts/chunks/24.br +0 -0
  97. package/runtime/dist/bundles/lm-fonts/chunks/25.br +0 -0
  98. package/runtime/dist/bundles/lm-fonts/chunks/26.br +0 -0
  99. package/runtime/dist/bundles/lm-fonts/chunks/27.br +0 -0
  100. package/runtime/dist/bundles/lm-fonts/chunks/28.br +0 -0
  101. package/runtime/dist/bundles/lm-fonts/chunks/29.br +0 -0
  102. package/runtime/dist/bundles/lm-fonts/chunks/3.br +0 -0
  103. package/runtime/dist/bundles/lm-fonts/chunks/4.br +0 -0
  104. package/runtime/dist/bundles/lm-fonts/chunks/5.br +0 -0
  105. package/runtime/dist/bundles/lm-fonts/chunks/6.br +0 -0
  106. package/runtime/dist/bundles/lm-fonts/chunks/7.br +0 -0
  107. package/runtime/dist/bundles/lm-fonts/chunks/8.br +0 -0
  108. package/runtime/dist/bundles/lm-fonts/chunks/9.br +0 -0
  109. package/runtime/dist/bundles/lm-fonts/files.index.json +1 -1
  110. package/runtime/dist/bundles/lm-fonts/manifest.json +1 -1
  111. package/runtime/dist/bundles/luatex/chunks/0.br +0 -0
  112. package/runtime/dist/bundles/luatex/chunks/1.br +0 -0
  113. package/runtime/dist/bundles/luatex/chunks/2.br +0 -0
  114. package/runtime/dist/bundles/luatex/files.index.json +1 -1
  115. package/runtime/dist/bundles/luatex/manifest.json +1 -1
  116. package/runtime/dist/bundles/ps-fonts/chunks/0.br +0 -0
  117. package/runtime/dist/bundles/ps-fonts/chunks/1.br +0 -0
  118. package/runtime/dist/bundles/ps-fonts/chunks/2.br +0 -0
  119. package/runtime/dist/bundles/ps-fonts/chunks/3.br +0 -0
  120. package/runtime/dist/bundles/ps-fonts/chunks/4.br +0 -0
  121. package/runtime/dist/bundles/ps-fonts/chunks/5.br +0 -0
  122. package/runtime/dist/bundles/ps-fonts/files.index.json +1 -1
  123. package/runtime/dist/bundles/ps-fonts/manifest.json +1 -1
  124. package/runtime/dist/bundles/tex-plain/chunks/0.br +0 -0
  125. package/runtime/dist/bundles/tex-plain/chunks/1.br +0 -0
  126. package/runtime/dist/bundles/tex-plain/chunks/2.br +0 -0
  127. package/runtime/dist/bundles/tex-plain/chunks/3.br +0 -0
  128. package/runtime/dist/bundles/tex-plain/chunks/4.br +0 -0
  129. package/runtime/dist/bundles/tex-plain/chunks/5.br +0 -0
  130. package/runtime/dist/bundles/tex-plain/chunks/6.br +0 -0
  131. package/runtime/dist/bundles/tex-plain/chunks/7.br +0 -0
  132. package/runtime/dist/bundles/tex-plain/files.index.json +1 -1
  133. package/runtime/dist/bundles/tex-plain/manifest.json +1 -1
  134. package/runtime/dist/bundles/tikz-snapshot/chunks/1.br +0 -0
  135. package/runtime/dist/bundles/tikz-snapshot/files.index.json +1 -1
  136. package/runtime/dist/bundles/tikz-snapshot/manifest.json +1 -1
  137. package/runtime/dist/core.js +20 -13
  138. package/runtime/dist/index.js +1 -0
  139. package/runtime/dist/node.js +40 -26
  140. package/runtime/dist/texengine.d.ts +1 -0
  141. package/runtime/dist/types.d.ts +5 -3
  142. package/runtime/dist/vfs/bundle.d.ts +7 -0
  143. package/runtime/dist/vfs/bundle.js +20 -0
  144. package/runtime/dist/vfs/lazyfs.d.ts +6 -1
  145. package/runtime/dist/vfs/lazyfs.js +17 -2
  146. package/runtime/upstream.json +1 -1
  147. package/src/browser-worker.js +1 -1
  148. package/src/deploy.js +14 -3
  149. package/src/index.js +3 -2
  150. package/src/worker.js +1 -1
  151. package/upstream.json +1 -1
  152. package/runtime/dist/bundles/cm-tfm/files.br +0 -0
  153. package/runtime/dist/bundles/cm-type1/files.br +0 -0
  154. package/runtime/dist/bundles/core/files.br +0 -0
  155. package/runtime/dist/bundles/latex-core/files.br +0 -0
  156. package/runtime/dist/bundles/latex-extra/files.br +0 -0
  157. package/runtime/dist/bundles/lm-fonts/files.br +0 -0
  158. package/runtime/dist/bundles/luatex/files.br +0 -0
  159. package/runtime/dist/bundles/ps-fonts/files.br +0 -0
  160. package/runtime/dist/bundles/tex-plain/files.br +0 -0
  161. /package/runtime/dist/bundles/tikz-snapshot/{files.br → chunks/0.br} +0 -0
@@ -1 +1 @@
1
- {"name":"tex-plain","version":"2025.1","texlive":"2025","files":{"tex/generic/atbegshi/atbegshi.sty":{"size":24708,"sha":"a73003b4bb2dc8a8"},"tex/generic/babel/hyphen.cfg":{"size":6445,"sha":"f646844e8fab61d1"},"tex/generic/babel/luababel.def":{"size":75294,"sha":"7d720228e51dc87c"},"tex/generic/bigintcalc/bigintcalc.sty":{"size":40635,"sha":"050f2ad3a3671a1f"},"tex/generic/bitset/bitset.sty":{"size":33961,"sha":"af5c7196c69dc9d2"},"tex/generic/chemfig/chemfig-lewis.tex":{"size":5803,"sha":"d907dab915078c7d"},"tex/generic/chemfig/chemfig.sty":{"size":388,"sha":"0c19604354900a8e"},"tex/generic/chemfig/chemfig.tex":{"size":125167,"sha":"18caf07da06abe7c"},"tex/generic/circuitikz/ctikzstyle-example.tex":{"size":280,"sha":"59f577f0360decc9"},"tex/generic/circuitikz/ctikzstyle-legacy.tex":{"size":3150,"sha":"b1b4fd1866df6d18"},"tex/generic/circuitikz/ctikzstyle-romano.tex":{"size":2240,"sha":"69878376ef7ec6ff"},"tex/generic/circuitikz/pgfcirc.defines.tex":{"size":47046,"sha":"ec30235b60a9f072"},"tex/generic/circuitikz/pgfcircbipoles.tex":{"size":319927,"sha":"2c526e5ac600455a"},"tex/generic/circuitikz/pgfcirccurrent.tex":{"size":9538,"sha":"b4067c61c07792dd"},"tex/generic/circuitikz/pgfcircflow.tex":{"size":9804,"sha":"959e6f05fcda8db2"},"tex/generic/circuitikz/pgfcirclabel.tex":{"size":15442,"sha":"ebf9761a4dbdc156"},"tex/generic/circuitikz/pgfcircmonopoles.tex":{"size":62349,"sha":"7531190c1ad26ad4"},"tex/generic/circuitikz/pgfcircmultipoles.tex":{"size":140232,"sha":"3760ab93dcda29df"},"tex/generic/circuitikz/pgfcircpath.tex":{"size":17175,"sha":"7a83c9af92d8dd1a"},"tex/generic/circuitikz/pgfcircquadpoles.tex":{"size":105987,"sha":"875371bdf94a1a42"},"tex/generic/circuitikz/pgfcircshapes.tex":{"size":33716,"sha":"4a72bd0ea8075199"},"tex/generic/circuitikz/pgfcirctripoles.tex":{"size":400264,"sha":"53cdb3a70e6a821f"},"tex/generic/circuitikz/pgfcircutils.tex":{"size":14587,"sha":"ed68f13d561e9d63"},"tex/generic/circuitikz/pgfcircvoltage.tex":{"size":36286,"sha":"821ac7ac0489c1dd"},"tex/generic/etex/etex.src":{"size":33286,"sha":"7af74a3fde135872"},"tex/generic/etexcmds/etexcmds.sty":{"size":7734,"sha":"a7db2834e02bd11b"},"tex/generic/gettitlestring/gettitlestring.sty":{"size":8371,"sha":"26ab10fd43fd5a90"},"tex/generic/hyphen/dumyhyph.tex":{"size":419,"sha":"99d210320228a242"},"tex/generic/hyphen/grahyph5.tex":{"size":36706,"sha":"eeb7329e7dd94b87"},"tex/generic/hyphen/grmhyph5.tex":{"size":5902,"sha":"becdf19387bc265d"},"tex/generic/hyphen/grphyph5.tex":{"size":13326,"sha":"1bfe51dcff12f444"},"tex/generic/hyphen/hyphen.tex":{"size":27860,"sha":"2c18acdc04c1a066"},"tex/generic/hyphen/hypht1.tex":{"size":9081,"sha":"6a96e10de9b34ad9"},"tex/generic/hyphen/ibyhyph.tex":{"size":28651,"sha":"b12db81b0c101b38"},"tex/generic/hyphen/zerohyph.tex":{"size":402,"sha":"80b6e5b7ff3bcd2f"},"tex/generic/iftex/ifetex.sty":{"size":529,"sha":"6a522456643896e4"},"tex/generic/iftex/ifluatex.sty":{"size":492,"sha":"1f1dd9c7cc37bfc5"},"tex/generic/iftex/ifpdf.sty":{"size":480,"sha":"92b2cd262dc42d52"},"tex/generic/iftex/iftex.sty":{"size":7984,"sha":"0dc0cefe2131f823"},"tex/generic/iftex/ifvtex.sty":{"size":1057,"sha":"1138730b9ad7d9f6"},"tex/generic/iftex/ifxetex.sty":{"size":488,"sha":"b4729967ca572a3f"},"tex/generic/infwarerr/infwarerr.sty":{"size":8356,"sha":"8c3e23b8bb7d940f"},"tex/generic/intcalc/intcalc.sty":{"size":31769,"sha":"1343ba1b10b245bf"},"tex/generic/kvdefinekeys/kvdefinekeys.sty":{"size":5412,"sha":"c42f0c2628dc5fbd"},"tex/generic/ltxcmds/ltxcmds.sty":{"size":17865,"sha":"8fea89995d37ba4c"},"tex/generic/luatex85/luatex85.sty":{"size":5870,"sha":"6d2a0ec7974247ec"},"tex/generic/mp-tikz-wasm/tikzlibrarysvg.attributes.code.tex":{"size":6164,"sha":"a4e73b1206f18bee"},"tex/generic/pdfescape/pdfescape.sty":{"size":19007,"sha":"b3f0e56366c11b85"},"tex/generic/pdftex/glyphtounicode.tex":{"size":216747,"sha":"395e568c1f4db5e8"},"tex/generic/pdftex/pdfcolor.tex":{"size":5687,"sha":"84b30448637fd29e"},"tex/generic/pdftexcmds/pdftexcmds.lua":{"size":9447,"sha":"872a8889c423ec55"},"tex/generic/pdftexcmds/pdftexcmds.sty":{"size":20089,"sha":"2df7e0bd148c99d8"},"tex/generic/simplekv/simplekv.sty":{"size":161,"sha":"3fc1096a8c34760b"},"tex/generic/simplekv/simplekv.tex":{"size":12655,"sha":"d4d089826306a58a"},"tex/generic/stringenc/se-ascii-print.def":{"size":3257,"sha":"77c07ed6267049f3"},"tex/generic/stringenc/se-ascii.def":{"size":2870,"sha":"0c8d40cb65411fee"},"tex/generic/stringenc/se-clean7bit.def":{"size":3765,"sha":"aa70dd7e8990b2cb"},"tex/generic/stringenc/se-cp1250.def":{"size":10277,"sha":"d2068e5fa58864c9"},"tex/generic/stringenc/se-cp1251.def":{"size":10128,"sha":"63704757c1c8d231"},"tex/generic/stringenc/se-cp1252.def":{"size":4858,"sha":"e21b611d03bf8e1f"},"tex/generic/stringenc/se-cp1257.def":{"size":9657,"sha":"4ec2651c335029d2"},"tex/generic/stringenc/se-cp437.def":{"size":10585,"sha":"05e91523dc818207"},"tex/generic/stringenc/se-cp850.def":{"size":10434,"sha":"b15d916580e45d29"},"tex/generic/stringenc/se-cp852.def":{"size":10733,"sha":"3dcbfa0c3487f170"},"tex/generic/stringenc/se-cp855.def":{"size":10349,"sha":"3b185da948e95ed6"},"tex/generic/stringenc/se-cp858.def":{"size":10415,"sha":"1e40d8d74672e14a"},"tex/generic/stringenc/se-cp865.def":{"size":10605,"sha":"24af379d5e7ad707"},"tex/generic/stringenc/se-cp866.def":{"size":10531,"sha":"a45de2d50e0d2733"},"tex/generic/stringenc/se-dec-mcs.def":{"size":7864,"sha":"91dc69b841166064"},"tex/generic/stringenc/se-iso-8859-1.def":{"size":3357,"sha":"74c79c0b12b0d39b"},"tex/generic/stringenc/se-iso-8859-10.def":{"size":9508,"sha":"9bfcbfdd02bf6695"},"tex/generic/stringenc/se-iso-8859-11.def":{"size":8046,"sha":"5158a22308bb0043"},"tex/generic/stringenc/se-iso-8859-13.def":{"size":9190,"sha":"787d127c7ad98a00"},"tex/generic/stringenc/se-iso-8859-14.def":{"size":9571,"sha":"7e25fdaaa78e3120"},"tex/generic/stringenc/se-iso-8859-15.def":{"size":9131,"sha":"266c8fb3f31653cb"},"tex/generic/stringenc/se-iso-8859-16.def":{"size":9476,"sha":"29a72ed727e910c2"},"tex/generic/stringenc/se-iso-8859-2.def":{"size":9224,"sha":"2a7c60979e263e0b"},"tex/generic/stringenc/se-iso-8859-3.def":{"size":8734,"sha":"9a6bdf7bce6b185c"},"tex/generic/stringenc/se-iso-8859-4.def":{"size":9196,"sha":"b0737bf21ae2dc40"},"tex/generic/stringenc/se-iso-8859-5.def":{"size":8835,"sha":"ff7ccc62228088ee"},"tex/generic/stringenc/se-iso-8859-6.def":{"size":5528,"sha":"f9fba42471db4619"},"tex/generic/stringenc/se-iso-8859-7.def":{"size":8589,"sha":"4efcfb39cd3fb844"},"tex/generic/stringenc/se-iso-8859-8.def":{"size":5956,"sha":"455433c65e5975f7"},"tex/generic/stringenc/se-iso-8859-9.def":{"size":8976,"sha":"4c3080873d39ce9c"},"tex/generic/stringenc/se-koi8-r.def":{"size":10600,"sha":"62b74a3118529b10"},"tex/generic/stringenc/se-mac-centeuro.def":{"size":11598,"sha":"9e648981230327d5"},"tex/generic/stringenc/se-mac-cyrillic.def":{"size":10942,"sha":"f77f04a3250c56a6"},"tex/generic/stringenc/se-mac-roman.def":{"size":10575,"sha":"a00115bfe651fc0a"},"tex/generic/stringenc/se-nextstep.def":{"size":10464,"sha":"799ca9c1eef76dd1"},"tex/generic/stringenc/se-pdfdoc.def":{"size":5108,"sha":"f168cc1772edb0e2"},"tex/generic/stringenc/se-utf16le.def":{"size":2764,"sha":"20213ef0fd25b6f9"},"tex/generic/stringenc/se-utf32be.def":{"size":4522,"sha":"aed4597f5fce2d1d"},"tex/generic/stringenc/se-utf32le.def":{"size":4718,"sha":"a00be3fae9ee794c"},"tex/generic/stringenc/se-utf8.def":{"size":11635,"sha":"aeecc3b65c8002f2"},"tex/generic/stringenc/stringenc.sty":{"size":21514,"sha":"b134a7bba648a698"},"tex/generic/tex-ini-files/dviluatex.ini":{"size":82,"sha":"cc7cb46692f7a54b"},"tex/generic/tex-ini-files/luatex.ini":{"size":289,"sha":"bc47cd163289fecb"},"tex/generic/tex-ini-files/luatexconfig.tex":{"size":2036,"sha":"e455906a91a8a040"},"tex/generic/tex-ini-files/luatexiniconfig.tex":{"size":606,"sha":"b3e97563b977e36e"},"tex/generic/tex-ini-files/pdftexconfig.tex":{"size":549,"sha":"87102cd6fa7307af"},"tex/generic/tex-ini-files/pdfxmltex.ini":{"size":243,"sha":"0286c93d313d8034"},"tex/generic/tex-ini-files/xetex.ini":{"size":3428,"sha":"6aa9a56c7947f655"},"tex/generic/tex-ini-files/xmltex.ini":{"size":160,"sha":"e7bb21eb0a3457d9"},"tex/generic/uniquecounter/uniquecounter.sty":{"size":7008,"sha":"9d11c81501953d68"},"tex/generic/xkeyval/keyval.tex":{"size":2725,"sha":"7a8dbfe90926a910"},"tex/generic/xkeyval/pst-xkey.tex":{"size":2369,"sha":"4549723f49707c14"},"tex/generic/xkeyval/xkeyval.tex":{"size":19231,"sha":"29c2b60c6973c374"},"tex/generic/xkeyval/xkvtxhdr.tex":{"size":2856,"sha":"cc6150c71e73d1dd"},"tex/generic/xkeyval/xkvutils.tex":{"size":7677,"sha":"5e82c31b1b4492c8"},"tex/plain/base/fontchart.tex":{"size":3201,"sha":"c92c60b5aa85a634"},"tex/plain/base/gkpmac.tex":{"size":36500,"sha":"52787766e84cf3df"},"tex/plain/base/letterformat.tex":{"size":2892,"sha":"def29743d02d0f43"},"tex/plain/base/list-latin.tex":{"size":2292,"sha":"fa7f1928a6846739"},"tex/plain/base/list.tex":{"size":1581,"sha":"6ce822dc31d6934d"},"tex/plain/base/llist-latin.tex":{"size":2894,"sha":"a73985923307aaa0"},"tex/plain/base/llist.tex":{"size":2177,"sha":"b9184319aa034b63"},"tex/plain/base/mptmac.tex":{"size":3267,"sha":"a15782301c853be7"},"tex/plain/base/picmac.tex":{"size":8240,"sha":"111703092e524997"},"tex/plain/base/plain.tex":{"size":44615,"sha":"7c1223b880fa5135"},"tex/plain/base/wlist.tex":{"size":1698,"sha":"dd0f2a0d9743af6e"},"tex/plain/config/etex.ini":{"size":69,"sha":"a6e65150abae7552"},"tex/plain/config/tex.ini":{"size":66,"sha":"c1ccea43dc1c3d07"},"tex/plain/etex/etex.src":{"size":31690,"sha":"00b9b0017fc2347a"},"tex/plain/etex/etexdefs.lib":{"size":3591,"sha":"0c6a325ce1810cff"},"web2c/etex.fmt":{"size":127343,"sha":"b276d57b2fbf5575"},"web2c/plain.fmt":{"size":113546,"sha":"8bdb51b8e06b0f42"}},"eager":[]}
1
+ {"name":"tex-plain","version":"2025.1","texlive":"2025","files":{"tex/generic/atbegshi/atbegshi.sty":{"size":24708,"sha":"a73003b4bb2dc8a8"},"tex/generic/babel/hyphen.cfg":{"size":6445,"sha":"f646844e8fab61d1"},"tex/generic/babel/luababel.def":{"size":75294,"sha":"7d720228e51dc87c"},"tex/generic/bigintcalc/bigintcalc.sty":{"size":40635,"sha":"050f2ad3a3671a1f"},"tex/generic/bitset/bitset.sty":{"size":33961,"sha":"af5c7196c69dc9d2"},"tex/generic/chemfig/chemfig-lewis.tex":{"size":5803,"sha":"d907dab915078c7d"},"tex/generic/chemfig/chemfig.sty":{"size":388,"sha":"0c19604354900a8e"},"tex/generic/chemfig/chemfig.tex":{"size":125167,"sha":"18caf07da06abe7c"},"tex/generic/circuitikz/ctikzstyle-example.tex":{"size":280,"sha":"59f577f0360decc9"},"tex/generic/circuitikz/ctikzstyle-legacy.tex":{"size":3150,"sha":"b1b4fd1866df6d18"},"tex/generic/circuitikz/ctikzstyle-romano.tex":{"size":2240,"sha":"69878376ef7ec6ff"},"tex/generic/circuitikz/pgfcirc.defines.tex":{"size":47046,"sha":"ec30235b60a9f072"},"tex/generic/circuitikz/pgfcircbipoles.tex":{"size":319927,"sha":"2c526e5ac600455a"},"tex/generic/circuitikz/pgfcirccurrent.tex":{"size":9538,"sha":"b4067c61c07792dd"},"tex/generic/circuitikz/pgfcircflow.tex":{"size":9804,"sha":"959e6f05fcda8db2"},"tex/generic/circuitikz/pgfcirclabel.tex":{"size":15442,"sha":"ebf9761a4dbdc156"},"tex/generic/circuitikz/pgfcircmonopoles.tex":{"size":62349,"sha":"7531190c1ad26ad4"},"tex/generic/circuitikz/pgfcircmultipoles.tex":{"size":140232,"sha":"3760ab93dcda29df"},"tex/generic/circuitikz/pgfcircpath.tex":{"size":17175,"sha":"7a83c9af92d8dd1a"},"tex/generic/circuitikz/pgfcircquadpoles.tex":{"size":105987,"sha":"875371bdf94a1a42"},"tex/generic/circuitikz/pgfcircshapes.tex":{"size":33716,"sha":"4a72bd0ea8075199"},"tex/generic/circuitikz/pgfcirctripoles.tex":{"size":400264,"sha":"53cdb3a70e6a821f"},"tex/generic/circuitikz/pgfcircutils.tex":{"size":14587,"sha":"ed68f13d561e9d63"},"tex/generic/circuitikz/pgfcircvoltage.tex":{"size":36286,"sha":"821ac7ac0489c1dd"},"tex/generic/etex/etex.src":{"size":33286,"sha":"7af74a3fde135872"},"tex/generic/etexcmds/etexcmds.sty":{"size":7734,"sha":"a7db2834e02bd11b"},"tex/generic/gettitlestring/gettitlestring.sty":{"size":8371,"sha":"26ab10fd43fd5a90"},"tex/generic/hyphen/dumyhyph.tex":{"size":419,"sha":"99d210320228a242"},"tex/generic/hyphen/grahyph5.tex":{"size":36706,"sha":"eeb7329e7dd94b87"},"tex/generic/hyphen/grmhyph5.tex":{"size":5902,"sha":"becdf19387bc265d"},"tex/generic/hyphen/grphyph5.tex":{"size":13326,"sha":"1bfe51dcff12f444"},"tex/generic/hyphen/hyphen.tex":{"size":27860,"sha":"2c18acdc04c1a066"},"tex/generic/hyphen/hypht1.tex":{"size":9081,"sha":"6a96e10de9b34ad9"},"tex/generic/hyphen/ibyhyph.tex":{"size":28651,"sha":"b12db81b0c101b38"},"tex/generic/hyphen/zerohyph.tex":{"size":402,"sha":"80b6e5b7ff3bcd2f"},"tex/generic/iftex/ifetex.sty":{"size":529,"sha":"6a522456643896e4"},"tex/generic/iftex/ifluatex.sty":{"size":492,"sha":"1f1dd9c7cc37bfc5"},"tex/generic/iftex/ifpdf.sty":{"size":480,"sha":"92b2cd262dc42d52"},"tex/generic/iftex/iftex.sty":{"size":7984,"sha":"0dc0cefe2131f823"},"tex/generic/iftex/ifvtex.sty":{"size":1057,"sha":"1138730b9ad7d9f6"},"tex/generic/iftex/ifxetex.sty":{"size":488,"sha":"b4729967ca572a3f"},"tex/generic/infwarerr/infwarerr.sty":{"size":8356,"sha":"8c3e23b8bb7d940f"},"tex/generic/intcalc/intcalc.sty":{"size":31769,"sha":"1343ba1b10b245bf"},"tex/generic/kvdefinekeys/kvdefinekeys.sty":{"size":5412,"sha":"c42f0c2628dc5fbd"},"tex/generic/ltxcmds/ltxcmds.sty":{"size":17865,"sha":"8fea89995d37ba4c"},"tex/generic/luatex85/luatex85.sty":{"size":5870,"sha":"6d2a0ec7974247ec"},"tex/generic/mp-tikz-wasm/tikzlibrarysvg.attributes.code.tex":{"size":6164,"sha":"a4e73b1206f18bee"},"tex/generic/pdfescape/pdfescape.sty":{"size":19007,"sha":"b3f0e56366c11b85"},"tex/generic/pdftex/glyphtounicode.tex":{"size":216747,"sha":"395e568c1f4db5e8"},"tex/generic/pdftex/pdfcolor.tex":{"size":5687,"sha":"84b30448637fd29e"},"tex/generic/pdftexcmds/pdftexcmds.lua":{"size":9447,"sha":"872a8889c423ec55"},"tex/generic/pdftexcmds/pdftexcmds.sty":{"size":20089,"sha":"2df7e0bd148c99d8"},"tex/generic/simplekv/simplekv.sty":{"size":161,"sha":"3fc1096a8c34760b"},"tex/generic/simplekv/simplekv.tex":{"size":12655,"sha":"d4d089826306a58a"},"tex/generic/stringenc/se-ascii-print.def":{"size":3257,"sha":"77c07ed6267049f3"},"tex/generic/stringenc/se-ascii.def":{"size":2870,"sha":"0c8d40cb65411fee"},"tex/generic/stringenc/se-clean7bit.def":{"size":3765,"sha":"aa70dd7e8990b2cb"},"tex/generic/stringenc/se-cp1250.def":{"size":10277,"sha":"d2068e5fa58864c9"},"tex/generic/stringenc/se-cp1251.def":{"size":10128,"sha":"63704757c1c8d231"},"tex/generic/stringenc/se-cp1252.def":{"size":4858,"sha":"e21b611d03bf8e1f"},"tex/generic/stringenc/se-cp1257.def":{"size":9657,"sha":"4ec2651c335029d2"},"tex/generic/stringenc/se-cp437.def":{"size":10585,"sha":"05e91523dc818207"},"tex/generic/stringenc/se-cp850.def":{"size":10434,"sha":"b15d916580e45d29"},"tex/generic/stringenc/se-cp852.def":{"size":10733,"sha":"3dcbfa0c3487f170"},"tex/generic/stringenc/se-cp855.def":{"size":10349,"sha":"3b185da948e95ed6"},"tex/generic/stringenc/se-cp858.def":{"size":10415,"sha":"1e40d8d74672e14a"},"tex/generic/stringenc/se-cp865.def":{"size":10605,"sha":"24af379d5e7ad707"},"tex/generic/stringenc/se-cp866.def":{"size":10531,"sha":"a45de2d50e0d2733"},"tex/generic/stringenc/se-dec-mcs.def":{"size":7864,"sha":"91dc69b841166064"},"tex/generic/stringenc/se-iso-8859-1.def":{"size":3357,"sha":"74c79c0b12b0d39b"},"tex/generic/stringenc/se-iso-8859-10.def":{"size":9508,"sha":"9bfcbfdd02bf6695"},"tex/generic/stringenc/se-iso-8859-11.def":{"size":8046,"sha":"5158a22308bb0043"},"tex/generic/stringenc/se-iso-8859-13.def":{"size":9190,"sha":"787d127c7ad98a00"},"tex/generic/stringenc/se-iso-8859-14.def":{"size":9571,"sha":"7e25fdaaa78e3120"},"tex/generic/stringenc/se-iso-8859-15.def":{"size":9131,"sha":"266c8fb3f31653cb"},"tex/generic/stringenc/se-iso-8859-16.def":{"size":9476,"sha":"29a72ed727e910c2"},"tex/generic/stringenc/se-iso-8859-2.def":{"size":9224,"sha":"2a7c60979e263e0b"},"tex/generic/stringenc/se-iso-8859-3.def":{"size":8734,"sha":"9a6bdf7bce6b185c"},"tex/generic/stringenc/se-iso-8859-4.def":{"size":9196,"sha":"b0737bf21ae2dc40"},"tex/generic/stringenc/se-iso-8859-5.def":{"size":8835,"sha":"ff7ccc62228088ee"},"tex/generic/stringenc/se-iso-8859-6.def":{"size":5528,"sha":"f9fba42471db4619"},"tex/generic/stringenc/se-iso-8859-7.def":{"size":8589,"sha":"4efcfb39cd3fb844"},"tex/generic/stringenc/se-iso-8859-8.def":{"size":5956,"sha":"455433c65e5975f7"},"tex/generic/stringenc/se-iso-8859-9.def":{"size":8976,"sha":"4c3080873d39ce9c"},"tex/generic/stringenc/se-koi8-r.def":{"size":10600,"sha":"62b74a3118529b10"},"tex/generic/stringenc/se-mac-centeuro.def":{"size":11598,"sha":"9e648981230327d5"},"tex/generic/stringenc/se-mac-cyrillic.def":{"size":10942,"sha":"f77f04a3250c56a6"},"tex/generic/stringenc/se-mac-roman.def":{"size":10575,"sha":"a00115bfe651fc0a"},"tex/generic/stringenc/se-nextstep.def":{"size":10464,"sha":"799ca9c1eef76dd1"},"tex/generic/stringenc/se-pdfdoc.def":{"size":5108,"sha":"f168cc1772edb0e2"},"tex/generic/stringenc/se-utf16le.def":{"size":2764,"sha":"20213ef0fd25b6f9"},"tex/generic/stringenc/se-utf32be.def":{"size":4522,"sha":"aed4597f5fce2d1d"},"tex/generic/stringenc/se-utf32le.def":{"size":4718,"sha":"a00be3fae9ee794c"},"tex/generic/stringenc/se-utf8.def":{"size":11635,"sha":"aeecc3b65c8002f2"},"tex/generic/stringenc/stringenc.sty":{"size":21514,"sha":"b134a7bba648a698"},"tex/generic/tex-ini-files/dviluatex.ini":{"size":82,"sha":"cc7cb46692f7a54b"},"tex/generic/tex-ini-files/luatex.ini":{"size":289,"sha":"bc47cd163289fecb"},"tex/generic/tex-ini-files/luatexconfig.tex":{"size":2036,"sha":"e455906a91a8a040"},"tex/generic/tex-ini-files/luatexiniconfig.tex":{"size":606,"sha":"b3e97563b977e36e"},"tex/generic/tex-ini-files/pdftexconfig.tex":{"size":549,"sha":"87102cd6fa7307af"},"tex/generic/tex-ini-files/pdfxmltex.ini":{"size":243,"sha":"0286c93d313d8034"},"tex/generic/tex-ini-files/xetex.ini":{"size":3428,"sha":"6aa9a56c7947f655"},"tex/generic/tex-ini-files/xmltex.ini":{"size":160,"sha":"e7bb21eb0a3457d9"},"tex/generic/uniquecounter/uniquecounter.sty":{"size":7008,"sha":"9d11c81501953d68"},"tex/generic/xkeyval/keyval.tex":{"size":2725,"sha":"7a8dbfe90926a910"},"tex/generic/xkeyval/pst-xkey.tex":{"size":2369,"sha":"4549723f49707c14"},"tex/generic/xkeyval/xkeyval.tex":{"size":19231,"sha":"29c2b60c6973c374"},"tex/generic/xkeyval/xkvtxhdr.tex":{"size":2856,"sha":"cc6150c71e73d1dd"},"tex/generic/xkeyval/xkvutils.tex":{"size":7677,"sha":"5e82c31b1b4492c8"},"tex/plain/base/fontchart.tex":{"size":3201,"sha":"c92c60b5aa85a634"},"tex/plain/base/gkpmac.tex":{"size":36500,"sha":"52787766e84cf3df"},"tex/plain/base/letterformat.tex":{"size":2892,"sha":"def29743d02d0f43"},"tex/plain/base/list-latin.tex":{"size":2292,"sha":"fa7f1928a6846739"},"tex/plain/base/list.tex":{"size":1581,"sha":"6ce822dc31d6934d"},"tex/plain/base/llist-latin.tex":{"size":2894,"sha":"a73985923307aaa0"},"tex/plain/base/llist.tex":{"size":2177,"sha":"b9184319aa034b63"},"tex/plain/base/mptmac.tex":{"size":3267,"sha":"a15782301c853be7"},"tex/plain/base/picmac.tex":{"size":8240,"sha":"111703092e524997"},"tex/plain/base/plain.tex":{"size":44615,"sha":"7c1223b880fa5135"},"tex/plain/base/wlist.tex":{"size":1698,"sha":"dd0f2a0d9743af6e"},"tex/plain/config/etex.ini":{"size":69,"sha":"a6e65150abae7552"},"tex/plain/config/tex.ini":{"size":66,"sha":"c1ccea43dc1c3d07"},"tex/plain/etex/etex.src":{"size":31690,"sha":"00b9b0017fc2347a"},"tex/plain/etex/etexdefs.lib":{"size":3591,"sha":"0c6a325ce1810cff"},"web2c/etex.fmt":{"size":127343,"sha":"b276d57b2fbf5575"},"web2c/plain.fmt":{"size":113546,"sha":"8bdb51b8e06b0f42"}},"eager":[],"storage":"brotli-chunks-v1","filesystemKey":"3648a9d774d14fb99f24cd8a6e1ffe24f309789c6a73de067e3bd3f5d8f97916"}
@@ -1 +1 @@
1
- {"web2c/tikz.fmt":[0,5819794]}
1
+ {"web2c/tikz.fmt":["chunks/0.br",0,5819794],"web2c/tikz-basic.fmt":["chunks/1.br",0,3158691]}
@@ -1 +1 @@
1
- {"name":"tikz-snapshot","version":"2025.1","texlive":"2025","files":{"web2c/tikz.fmt":{"size":5819794,"sha":"68f750bb1d12ec43"}},"eager":[]}
1
+ {"name":"tikz-snapshot","version":"2025.1","texlive":"2025","files":{"web2c/tikz.fmt":{"size":5819794,"sha":"68f750bb1d12ec43"},"web2c/tikz-basic.fmt":{"size":3158691,"sha":"99221aef472f1a1594ee5b168950018b57ee711f5ba64de5b650035b21b4202a"}},"eager":[],"storage":"brotli-chunks-v1","filesystemKey":"ea7eafd7f7b78f156ccb47febc070fe313cab1e4c7031a8425125bcd1dede058"}
@@ -8,7 +8,7 @@ import { runTex } from './texengine.js';
8
8
  import { runDvisvgm } from './dvisvgm.js';
9
9
  import { dviSpecials, describeLostPostScript } from './postscript.js';
10
10
  import { TEXMF_ROOT } from './vfs/bundle.js';
11
- import { listFiles, mkdirp, writeFileDeep, isUnloadedLazy, ensureLoaded, trackWrites } from './vfs/lazyfs.js';
11
+ import { listFiles, mkdirp, writeFileDeep, writeDeferredFile, completedFileBytes, isUnloadedLazy, ensureLoaded, trackWrites } from './vfs/lazyfs.js';
12
12
  import { scanTexBlocks, scanInputs } from './tex/scanner.js';
13
13
  import { TexBridge, MemorySnippetCache, resolveEngine } from './tex/bridge.js';
14
14
  import { parseMetaPostLog } from './diagnostics.js';
@@ -200,11 +200,16 @@ export class MetaPostCore {
200
200
  this.logger.trace('host', `font cache: ${plural(kept.size, 'file')}, ${(bytes / 1024).toFixed(0)} KB`);
201
201
  this.texmfVar = kept;
202
202
  }
203
- copyUserFiles(T) {
203
+ copyUserFiles(T, deferred = false) {
204
204
  // TeX may \input files the user supplied next to the job
205
205
  for (const [p, bytes] of this.userFiles) {
206
+ const data = typeof bytes === 'string' ? new TextEncoder().encode(bytes) : bytes;
207
+ const load = () => this.M ? this.M.FS.readFile(p, { encoding: 'binary' }) : data;
206
208
  try {
207
- writeFileDeep(T.FS, p, this.M ? this.M.FS.readFile(p, { encoding: 'binary' }) : bytes);
209
+ if (deferred)
210
+ writeDeferredFile(T.FS, p, this.M ? this.M.FS.stat(p).size : data.length, load);
211
+ else
212
+ writeFileDeep(T.FS, p, load());
208
213
  }
209
214
  catch { /* ignore */ }
210
215
  }
@@ -458,13 +463,15 @@ export class MetaPostCore {
458
463
  // TeX Live's DVI-mode formats dvilualatex / dviluatex.
459
464
  let fmt = engine === 'plain' ? 'etex' : engine === 'lualatex' ? 'dvilualatex' : engine === 'luatex' ? 'dviluatex' : engine;
460
465
  const progname = engine === 'plain' ? 'etex' : lua ? fmt : engine;
461
- // the pre-warmed snapshot: latex.fmt with pgf/pgfplots/tikz-cd preloaded
466
+ // Auto prefers basic TikZ; explicit plotting packages use the full snapshot.
462
467
  const snapshot = lo.snapshot ?? this.env.options.snapshot ?? 'auto';
463
468
  // (not for PDF output: the snapshot has PGF's dvisvgm driver built in)
464
469
  if (engine === 'latex' && snapshot !== 'none' && !pdfOut && this.hasSnapshot()) {
465
470
  const usesTikz = /\\usepackage\s*(\[[^\]]*\])?\s*\{[^}]*\b(tikz|pgfplots|tikz-cd)\b|\\documentclass\s*\[[^\]]*\btikz\b/.test(source);
466
- if (snapshot === 'tikz' || usesTikz)
467
- fmt = 'tikz';
471
+ if (snapshot === 'tikz' || usesTikz) {
472
+ const full = snapshot === 'tikz' || /\\(?:usepackage|RequirePackage)\s*(?:\[[^\]]*\])?\s*\{[^}]*\b(?:pgfplots|pgfplotstable|tikz-cd)\b/.test(source);
473
+ fmt = !full && this.hasSnapshot('tikz-basic') ? 'tikz-basic' : 'tikz';
474
+ }
468
475
  }
469
476
  if (lo.files)
470
477
  this.addFiles(lo.files);
@@ -509,7 +516,7 @@ export class MetaPostCore {
509
516
  this.collectTexmfVar(M.FS);
510
517
  let out;
511
518
  try {
512
- out = M.FS.readFile(`/work/${outName}`, { encoding: 'binary' });
519
+ out = pdfOut ? M.FS.readFile(`/work/${outName}`, { encoding: 'binary' }) : completedFileBytes(M.FS, `/work/${outName}`, M.HEAPU8);
513
520
  }
514
521
  catch {
515
522
  out = null;
@@ -600,12 +607,12 @@ export class MetaPostCore {
600
607
  setup: (M) => {
601
608
  mkdirp(M.FS, '/work');
602
609
  this.installTexmf(M.FS, M.NODEFS);
603
- this.copyUserFiles(M);
610
+ this.copyUserFiles(M, true);
604
611
  // what TeX wrote beside the job (an EPS from filecontents, say), as a native
605
612
  // dvisvgm run in the same directory would see it
606
613
  for (const [name, data] of Object.entries(artifacts))
607
- writeFileDeep(M.FS, `/work/${name}`, data);
608
- writeFileDeep(M.FS, `/work/${job}.dvi`, dviBytes);
614
+ writeDeferredFile(M.FS, `/work/${name}`, data.length, () => data);
615
+ writeFileDeep(M.FS, `/work/${job}.dvi`, dviBytes, true);
609
616
  M.FS.chdir('/work');
610
617
  // Ghostscript runs a document's PostScript without SAFER (dvisvgm asks for
611
618
  // -dDELAYSAFER and never sets it), so it gets only in-memory trees: /work, and
@@ -735,12 +742,12 @@ export class MetaPostCore {
735
742
  this.logger.info('host', `${name} ${what}: ${status}${r.exitCode ? ` (exit ${r.exitCode})` : ''}, ${plural(Object.keys(artifacts).length, 'file')} in ${ms(totalMs)}`);
736
743
  return { status, exitCode: r.exitCode, log: r.log, artifacts, diagnostics, stats: { totalMs } };
737
744
  }
738
- hasSnapshot() {
745
+ hasSnapshot(name = 'tikz') {
739
746
  if (this.env.bundles)
740
- return this.env.bundles.files.has('web2c/tikz.fmt');
747
+ return this.env.bundles.files.has(`web2c/${name}.fmt`);
741
748
  if (this.env.texmfDir) {
742
749
  try {
743
- return this.M.FS.analyzePath(`${TEXMF_ROOT}/web2c/tikz.fmt`).exists;
750
+ return this.M.FS.analyzePath(`${TEXMF_ROOT}/web2c/${name}.fmt`).exists;
744
751
  }
745
752
  catch {
746
753
  return false;
@@ -34,6 +34,7 @@ class InProcessBackend {
34
34
  this.bundles.logger = this.logger;
35
35
  const base = o.bundleBaseUrl ?? new URL('./bundles/', here).href;
36
36
  await this.bundles.addAll(resolveBundleSpecs(o.bundles ?? DEFAULT_BUNDLES, base));
37
+ await this.bundles.loadFilesystemIndex((base.endsWith('/') ? base : base + '/') + 'filesystem.json');
37
38
  if (!o.lazy || !this.bundles.canFetchSync)
38
39
  await this.bundles.prefetchEager();
39
40
  if (!o.lazy)
@@ -5,44 +5,58 @@ export async function nodeIO() {
5
5
  const { brotliDecompressSync } = await import('node:zlib');
6
6
  const strip = (u) => u.startsWith('file://')
7
7
  ? fileURLToPath(new URL(u)) : u.replace(/\?v=[0-9a-f]+$/, '');
8
- const bundles = new Map();
8
+ const layouts = new Map();
9
+ const explicit = new Set();
10
+ function packed(directory, key) {
11
+ let layout = layouts.get(directory);
12
+ if (!layout) {
13
+ layout = { index: JSON.parse(fs.readFileSync(join(directory, 'files.index.json'), 'utf8')), chunks: new Map() };
14
+ layouts.set(directory, layout);
15
+ }
16
+ const entry = Object.hasOwn(layout.index, key) ? layout.index[key] : undefined;
17
+ if (!entry)
18
+ throw Object.assign(new Error(`Missing bundle file: ${key}`), { code: 'ENOENT' });
19
+ const [chunk, offset, size] = entry.length === 2 ? ['files.br', ...entry] : entry;
20
+ if (!/^(files\.br|chunks\/[0-9]+\.br)$/.test(chunk))
21
+ throw new Error('Invalid bundle chunk');
22
+ let bytes = layout.chunks.get(chunk);
23
+ if (!bytes) {
24
+ bytes = brotliDecompressSync(fs.readFileSync(join(directory, chunk)));
25
+ layout.chunks.set(chunk, bytes);
26
+ }
27
+ if (!Number.isSafeInteger(offset) || !Number.isSafeInteger(size) || offset < 0 || size < 0 || offset + size > bytes.length)
28
+ throw new Error(`Invalid bundle offset: ${key}`);
29
+ return bytes.subarray(offset, offset + size);
30
+ }
9
31
  const read = (url) => {
10
32
  const path = strip(url);
33
+ const marker = `${sep}files${sep}`;
34
+ const position = path.lastIndexOf(marker);
35
+ const directory = path.slice(0, position);
36
+ const key = path.slice(position + marker.length).split(sep).join('/');
37
+ // New manifests explicitly select packed storage: no speculative filesystem
38
+ // calls or ENOENT exceptions for each file. Legacy/raw layouts retain overrides.
39
+ if (position >= 0 && explicit.has(directory))
40
+ return packed(directory, key);
11
41
  try {
12
42
  return fs.readFileSync(path);
13
43
  }
14
44
  catch (error) {
15
- if (error.code !== 'ENOENT')
16
- throw error;
17
- // Bundle archives preserve cross-file compression (especially fonts).
18
- // Cache only bundles touched by this engine instance; raw files override.
19
- const marker = `${sep}files${sep}`;
20
- const position = path.lastIndexOf(marker);
21
- if (position < 0)
22
- throw error;
23
- const directory = path.slice(0, position);
24
- let bundle = bundles.get(directory);
25
- if (!bundle) {
26
- bundle = {
27
- bytes: brotliDecompressSync(fs.readFileSync(join(directory, 'files.br'))),
28
- index: JSON.parse(fs.readFileSync(join(directory, 'files.index.json'), 'utf8')),
29
- };
30
- bundles.set(directory, bundle);
31
- }
32
- const key = path.slice(position + marker.length).split(sep).join('/');
33
- const entry = Object.hasOwn(bundle.index, key) ? bundle.index[key] : undefined;
34
- if (!entry)
45
+ if (error.code !== 'ENOENT' || position < 0)
35
46
  throw error;
36
- const [offset, size] = entry;
37
- if (!Number.isSafeInteger(offset) || !Number.isSafeInteger(size) || offset < 0 || size < 0 || offset + size > bundle.bytes.length)
38
- throw new Error(`Invalid bundle offset: ${key}`);
39
- return bundle.bytes.subarray(offset, offset + size);
47
+ return packed(directory, key);
40
48
  }
41
49
  };
42
50
  return {
43
51
  async fetch(url) { return read(url); },
44
52
  fetchSync: read,
45
- async fetchJson(url) { return JSON.parse(fs.readFileSync(strip(url), 'utf8')); },
53
+ async fetchJson(url) {
54
+ const path = strip(url);
55
+ const json = JSON.parse(fs.readFileSync(path, 'utf8'));
56
+ if (path.endsWith(`${sep}manifest.json`) && json.storage === 'brotli-chunks-v1')
57
+ explicit.add(path.slice(0, -'/manifest.json'.length));
58
+ return json;
59
+ },
46
60
  };
47
61
  }
48
62
  export const isNode = typeof process !== 'undefined' && !!process.versions?.node && typeof globalThis.window === 'undefined';
@@ -5,6 +5,7 @@
5
5
  import type { EmscriptenFS } from './vfs/lazyfs.js';
6
6
  export interface TexModule {
7
7
  FS: EmscriptenFS;
8
+ HEAPU8?: Uint8Array;
8
9
  NODEFS?: unknown;
9
10
  ENV: Record<string, string>;
10
11
  callMain(args: string[]): number | undefined;
@@ -101,9 +101,9 @@ export interface MetaPostOptions {
101
101
  /** Defer engine glue and MetaPost WASM until used. MetaPost version fields in creation
102
102
  * metadata remain empty in this mode. No cross-request cache is required. */
103
103
  lazy?: boolean;
104
- /** Default for latex()'s snapshot option. Node: 'auto' (tikz.fmt from local files is free). Browser: 'none',
105
- * because the 5.8 MB format does not compress and costs more to download than the files it replaces
106
- * (2.5 MB gzipped); set 'auto' when many TikZ figures amortise it or the format is already cached. */
104
+ /** Default for latex()'s snapshot option: Node 'auto', browser 'none'. Browser hosts
105
+ * may enable 'auto' when shipping precompiled formats (the @lofcz/tikz browser entry does).
106
+ * Auto uses basic TikZ when available and the full format for explicit plotting packages. */
107
107
  snapshot?: 'auto' | 'none';
108
108
  }
109
109
  export type OutputFormat = 'svg' | 'eps' | 'json' | 'none';
@@ -363,6 +363,8 @@ export interface ToolResult {
363
363
  }
364
364
  /** The bundle manifest format (docs/06 §3). Paths are relative to the texmf root. */
365
365
  export interface BundleManifest {
366
+ storage?: "brotli-chunks-v1";
367
+ filesystemKey?: string;
366
368
  name: string;
367
369
  version: string;
368
370
  texlive?: string;
@@ -51,6 +51,13 @@ export declare class BundleSet {
51
51
  private addLoaded;
52
52
  /** Add several bundles: the manifests are fetched in parallel, then merged in the given order (first bundle wins). */
53
53
  addAll(specs: BundleSpec[]): Promise<void>;
54
+ /** Build-time immutable indexes; dynamic/custom bundle sets use the normal builder. */
55
+ exportFilesystemIndex(): {
56
+ keys: (string | undefined)[];
57
+ dirs: (string | string[])[][];
58
+ lsR: string;
59
+ };
60
+ loadFilesystemIndex(url: string): Promise<void>;
54
61
  /** Load the hot lists; optional, so a missing file is not an error. */
55
62
  loadHot(url: string): Promise<void>;
56
63
  /** Fetch, in parallel, every file the hot lists name for these kinds that is not in memory yet. Returns how many. */
@@ -37,6 +37,8 @@ export class BundleSet {
37
37
  this.addLoaded(spec, base, manifest);
38
38
  }
39
39
  addLoaded(spec, base, manifest) {
40
+ this.indexCache = undefined;
41
+ this.lsRText = undefined;
40
42
  this.manifests.push({ spec, manifest, base });
41
43
  const blobBase = spec.blobBaseUrl ?? joinUrl(base, 'files');
42
44
  for (const [path, info] of Object.entries(manifest.files)) {
@@ -66,6 +68,24 @@ export class BundleSet {
66
68
  for (const m of manifests)
67
69
  this.addLoaded(m.spec, m.base, m.manifest);
68
70
  }
71
+ /** Build-time immutable indexes; dynamic/custom bundle sets use the normal builder. */
72
+ exportFilesystemIndex() {
73
+ return { keys: this.manifests.map(m => m.manifest.filesystemKey),
74
+ dirs: [...this.index().dirs].map(([path, children]) => [path, [...children]]), lsR: this.lsR() };
75
+ }
76
+ async loadFilesystemIndex(url) {
77
+ if (!this.manifests.every(m => m.manifest.filesystemKey))
78
+ return;
79
+ try {
80
+ const data = await this.io.fetchJson(url);
81
+ const keys = this.manifests.map(m => m.manifest.filesystemKey);
82
+ if (JSON.stringify(data.keys) !== JSON.stringify(keys) || !Array.isArray(data.dirs) || typeof data.lsR !== 'string')
83
+ return;
84
+ this.indexCache = { dirs: new Map(data.dirs.map(([path, children]) => [path, new Set(children)])) };
85
+ this.lsRText = data.lsR;
86
+ }
87
+ catch { /* Optional prebuilt index; reconstruct for custom/missing assets. */ }
88
+ }
69
89
  /** Load the hot lists; optional, so a missing file is not an error. */
70
90
  async loadHot(url) {
71
91
  try {
@@ -12,6 +12,7 @@ export interface EmscriptenFS {
12
12
  mkdir(path: string, mode?: number): void;
13
13
  writeFile(path: string, data: Uint8Array | string, opts?: {
14
14
  encoding?: string;
15
+ canOwn?: boolean;
15
16
  }): void;
16
17
  readFile(path: string, opts?: {
17
18
  encoding?: 'binary' | 'utf8';
@@ -50,7 +51,7 @@ export declare function isUnloadedLazy(FS: EmscriptenFS, path: string): boolean;
50
51
  /** Force-load a lazy node (no-op for ordinary files). */
51
52
  export declare function ensureLoaded(FS: EmscriptenFS, path: string): void;
52
53
  /** Write a text or binary file, creating directories as needed. */
53
- export declare function writeFileDeep(FS: EmscriptenFS, path: string, data: Uint8Array | string): void;
54
+ export declare function writeFileDeep(FS: EmscriptenFS, path: string, data: Uint8Array | string, canOwn?: boolean): void;
54
55
  /**
55
56
  * Record every file opened for writing from now on (absolute paths, into the
56
57
  * returned set). The engine's open syscall reaches the filesystem through
@@ -60,3 +61,7 @@ export declare function writeFileDeep(FS: EmscriptenFS, path: string, data: Uint
60
61
  export declare function trackWrites(FS: EmscriptenFS): Set<string>;
61
62
  /** Recursively collect regular files under `dir` (used to harvest artifacts). */
62
63
  export declare function listFiles(FS: EmscriptenFS, dir: string): string[];
64
+ /** Borrow a completed MEMFS file; never retain a view into a module's WASM heap. */
65
+ export declare function completedFileBytes(FS: EmscriptenFS, path: string, heap?: Uint8Array): Uint8Array;
66
+ /** Auxiliary inputs remain available, but are copied only if the consumer opens them. */
67
+ export declare function writeDeferredFile(FS: EmscriptenFS, path: string, size: number, load: () => Uint8Array): void;
@@ -82,7 +82,7 @@ export function ensureLoaded(FS, path) {
82
82
  }
83
83
  }
84
84
  /** Write a text or binary file, creating directories as needed. */
85
- export function writeFileDeep(FS, path, data) {
85
+ export function writeFileDeep(FS, path, data, canOwn = false) {
86
86
  const i = path.lastIndexOf('/');
87
87
  if (i > 0)
88
88
  mkdirp(FS, path.slice(0, i));
@@ -92,7 +92,7 @@ export function writeFileDeep(FS, path, data) {
92
92
  }
93
93
  catch { /* ignore */ }
94
94
  }
95
- FS.writeFile(path, data);
95
+ FS.writeFile(path, data, { canOwn });
96
96
  }
97
97
  /**
98
98
  * Record every file opened for writing from now on (absolute paths, into the
@@ -130,4 +130,19 @@ export function listFiles(FS, dir) {
130
130
  walk(dir);
131
131
  return out;
132
132
  }
133
+ /** Borrow a completed MEMFS file; never retain a view into a module's WASM heap. */
134
+ export function completedFileBytes(FS, path, heap) {
135
+ const node = FS.lookupPath(path).node;
136
+ if (heap && node.contents instanceof Uint8Array && node.contents.buffer !== heap.buffer &&
137
+ Number.isSafeInteger(node.usedBytes) && node.usedBytes >= 0 && node.usedBytes <= node.contents.length)
138
+ return node.contents.subarray(0, node.usedBytes);
139
+ return FS.readFile(path, { encoding: 'binary' });
140
+ }
141
+ /** Auxiliary inputs remain available, but are copied only if the consumer opens them. */
142
+ export function writeDeferredFile(FS, path, size, load) {
143
+ mkdirp(FS, path.slice(0, path.lastIndexOf('/')) || '/');
144
+ if (FS.analyzePath(path).exists)
145
+ FS.unlink(path);
146
+ createLazyFile(FS, path, size, () => load().slice());
147
+ }
133
148
  //# sourceMappingURL=lazyfs.js.map
@@ -23,5 +23,5 @@
23
23
  "archive": "https://github.com/jmckalex/mp-tikz-wasm/releases/download/v0.5.0/mp-tikz-wasm-0.5.0.tar.gz",
24
24
  "sha256": "76b5591a83adfb96e8087b8560fd993c6ebba475ad15a63269a8aa47517dd575"
25
25
  },
26
- "distribution": "brotli-bundle-archives-v1"
26
+ "distribution": "brotli-chunks-v1"
27
27
  }
@@ -1,7 +1,7 @@
1
1
  import { MetaPost } from '../runtime/dist/index.js';
2
2
 
3
3
  try {
4
- const engine = await MetaPost.create({ worker: false, lazy: true, logLevel: 'silent' });
4
+ const engine = await MetaPost.create({ worker: false, lazy: true, snapshot: 'auto', logLevel: 'silent' });
5
5
  self.onmessage = async ({ data: { source: code, maxOutputBytes } }) => {
6
6
  try {
7
7
  const source = /^\s*\\documentclass\b/m.test(code) ? code : String.raw`\documentclass[tikz,border=6pt]{standalone}
package/src/deploy.js CHANGED
@@ -36,13 +36,24 @@ export async function copyTikzBrowserAssets(directory) {
36
36
  for (const name of pin.bundles) {
37
37
  const base = join(destination, 'runtime/dist/bundles', name);
38
38
  const index = JSON.parse(await readFile(join(base, 'files.index.json'), 'utf8'));
39
- const bytes = brotliDecompressSync(await readFile(join(base, 'files.br')));
40
- for (const [path, [offset, size]] of Object.entries(index)) {
39
+ const chunks = new Map();
40
+ for (const [path, entry] of Object.entries(index)) {
41
+ const [chunk, offset, size] = entry.length === 2 ? ['files.br', ...entry] : entry;
42
+ if (!chunks.has(chunk)) chunks.set(chunk, brotliDecompressSync(await readFile(join(base, chunk))));
43
+ const bytes = chunks.get(chunk);
41
44
  const file = join(base, 'files', path);
42
45
  await mkdir(dirname(file), { recursive: true });
43
46
  await writeFile(file, bytes.subarray(offset, offset + size));
44
47
  }
45
- await rm(join(base, 'files.br')); await rm(join(base, 'files.index.json'));
48
+ const manifest = JSON.parse(await readFile(join(base, 'manifest.json'), 'utf8'));
49
+ delete manifest.storage;
50
+ // Browser assets use individual files; avoid an extra index round trip.
51
+ delete manifest.filesystemKey;
52
+ await writeFile(join(base, 'manifest.json'), JSON.stringify(manifest));
53
+ await rm(join(base, 'files.br'), { force: true });
54
+ await rm(join(base, 'chunks'), { recursive: true, force: true });
55
+ await rm(join(base, 'files.index.json'));
46
56
  }
57
+ await rm(join(destination, 'runtime/dist/bundles/filesystem.json'), { force: true });
47
58
  return { directory: destination, version: JSON.parse(await readFile(join(source, 'package.json'), 'utf8')).version };
48
59
  }
package/src/index.js CHANGED
@@ -74,11 +74,12 @@ export function createTikzRenderer(options = {}) {
74
74
  if (failure) { reject(failure); return; }
75
75
  if (code !== 0 || terminationSignal) { reject(new Error(stderr || 'TikZ compilation failed')); return; }
76
76
  try {
77
- const { svg } = JSON.parse(Buffer.concat(chunks).toString('utf8'));
77
+ const bytes = Buffer.concat(chunks);
78
+ const svg = bytes.toString('utf8');
78
79
  const dimensions = typeof svg === 'string' && svg.match(/viewBox=['"]([^'"]+)['"]/)?.[1].trim().split(/[ ,]+/).map(Number);
79
80
  if (!dimensions || dimensions.length !== 4 || !dimensions.every(Number.isFinite) || dimensions[2] <= 0 || dimensions[3] <= 0)
80
81
  throw new Error('TikZ returned an invalid picture size');
81
- resolve({ svg, width: dimensions[2], height: dimensions[3], dataUrl: `data:image/svg+xml;base64,${Buffer.from(svg).toString('base64')}` });
82
+ resolve({ svg, width: dimensions[2], height: dimensions[3], dataUrl: `data:image/svg+xml;base64,${bytes.toString('base64')}` });
82
83
  } catch (error) { reject(error); }
83
84
  });
84
85
  child.stdin.end(JSON.stringify({ source }));
package/src/worker.js CHANGED
@@ -8,7 +8,7 @@ try {
8
8
  const result = await engine.latex(source, { engine: 'auto', fonts: 'paths' });
9
9
  if (result.status === 'error' || result.status === 'fatal' || result.pages?.length !== 1)
10
10
  throw new Error('TikZ requires one valid page. ' + JSON.stringify(result.diagnostics).slice(0, 2000));
11
- process.stdout.write(JSON.stringify({ svg: result.pages[0] }));
11
+ process.stdout.write(result.pages[0]);
12
12
  } catch (error) {
13
13
  process.stderr.write(String(error).slice(0, 3000));
14
14
  process.exitCode = 1;
package/upstream.json CHANGED
@@ -23,5 +23,5 @@
23
23
  "archive": "https://github.com/jmckalex/mp-tikz-wasm/releases/download/v0.5.0/mp-tikz-wasm-0.5.0.tar.gz",
24
24
  "sha256": "76b5591a83adfb96e8087b8560fd993c6ebba475ad15a63269a8aa47517dd575"
25
25
  },
26
- "distribution": "brotli-bundle-archives-v1"
26
+ "distribution": "brotli-chunks-v1"
27
27
  }
Binary file