@lofcz/tikz 0.2.0 → 0.2.2

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 (143) hide show
  1. package/NOTICE.md +2 -1
  2. package/README.md +13 -2
  3. package/package.json +3 -2
  4. package/runtime/dist/bundles/cm-tfm/chunks/0.br +0 -0
  5. package/runtime/dist/bundles/cm-tfm/chunks/1.br +0 -0
  6. package/runtime/dist/bundles/cm-tfm/chunks/2.br +0 -0
  7. package/runtime/dist/bundles/cm-tfm/chunks/3.br +0 -0
  8. package/runtime/dist/bundles/cm-tfm/files.index.json +1 -1
  9. package/runtime/dist/bundles/cm-tfm/manifest.json +1 -1
  10. package/runtime/dist/bundles/cm-type1/chunks/0.br +0 -0
  11. package/runtime/dist/bundles/cm-type1/chunks/1.br +0 -0
  12. package/runtime/dist/bundles/cm-type1/chunks/2.br +0 -0
  13. package/runtime/dist/bundles/cm-type1/chunks/3.br +0 -0
  14. package/runtime/dist/bundles/cm-type1/chunks/4.br +0 -0
  15. package/runtime/dist/bundles/cm-type1/chunks/5.br +0 -0
  16. package/runtime/dist/bundles/cm-type1/chunks/6.br +0 -0
  17. package/runtime/dist/bundles/cm-type1/chunks/7.br +0 -0
  18. package/runtime/dist/bundles/cm-type1/files.index.json +1 -1
  19. package/runtime/dist/bundles/cm-type1/manifest.json +1 -1
  20. package/runtime/dist/bundles/core/chunks/0.br +0 -0
  21. package/runtime/dist/bundles/core/chunks/1.br +0 -0
  22. package/runtime/dist/bundles/core/chunks/2.br +0 -0
  23. package/runtime/dist/bundles/core/files.index.json +1 -1
  24. package/runtime/dist/bundles/core/manifest.json +1 -1
  25. package/runtime/dist/bundles/filesystem.json +1 -0
  26. package/runtime/dist/bundles/latex-core/chunks/0.br +0 -0
  27. package/runtime/dist/bundles/latex-core/chunks/1.br +0 -0
  28. package/runtime/dist/bundles/latex-core/chunks/2.br +0 -0
  29. package/runtime/dist/bundles/latex-core/chunks/3.br +0 -0
  30. package/runtime/dist/bundles/latex-core/chunks/4.br +0 -0
  31. package/runtime/dist/bundles/latex-core/chunks/5.br +0 -0
  32. package/runtime/dist/bundles/latex-core/chunks/6.br +0 -0
  33. package/runtime/dist/bundles/latex-core/chunks/7.br +0 -0
  34. package/runtime/dist/bundles/latex-core/chunks/8.br +0 -0
  35. package/runtime/dist/bundles/latex-core/files.index.json +1 -1
  36. package/runtime/dist/bundles/latex-core/manifest.json +1 -1
  37. package/runtime/dist/bundles/latex-extra/chunks/0.br +0 -0
  38. package/runtime/dist/bundles/latex-extra/chunks/1.br +0 -0
  39. package/runtime/dist/bundles/latex-extra/chunks/10.br +0 -0
  40. package/runtime/dist/bundles/latex-extra/chunks/11.br +0 -0
  41. package/runtime/dist/bundles/latex-extra/chunks/12.br +0 -0
  42. package/runtime/dist/bundles/latex-extra/chunks/13.br +0 -0
  43. package/runtime/dist/bundles/latex-extra/chunks/14.br +0 -0
  44. package/runtime/dist/bundles/latex-extra/chunks/15.br +0 -0
  45. package/runtime/dist/bundles/latex-extra/chunks/16.br +0 -0
  46. package/runtime/dist/bundles/latex-extra/chunks/17.br +0 -0
  47. package/runtime/dist/bundles/latex-extra/chunks/18.br +0 -0
  48. package/runtime/dist/bundles/latex-extra/chunks/19.br +0 -0
  49. package/runtime/dist/bundles/latex-extra/chunks/2.br +0 -0
  50. package/runtime/dist/bundles/latex-extra/chunks/20.br +0 -0
  51. package/runtime/dist/bundles/latex-extra/chunks/21.br +0 -0
  52. package/runtime/dist/bundles/latex-extra/chunks/22.br +0 -0
  53. package/runtime/dist/bundles/latex-extra/chunks/23.br +0 -0
  54. package/runtime/dist/bundles/latex-extra/chunks/24.br +0 -0
  55. package/runtime/dist/bundles/latex-extra/chunks/25.br +0 -0
  56. package/runtime/dist/bundles/latex-extra/chunks/3.br +0 -0
  57. package/runtime/dist/bundles/latex-extra/chunks/4.br +0 -0
  58. package/runtime/dist/bundles/latex-extra/chunks/5.br +0 -0
  59. package/runtime/dist/bundles/latex-extra/chunks/6.br +0 -0
  60. package/runtime/dist/bundles/latex-extra/chunks/7.br +0 -0
  61. package/runtime/dist/bundles/latex-extra/chunks/8.br +0 -0
  62. package/runtime/dist/bundles/latex-extra/chunks/9.br +0 -0
  63. package/runtime/dist/bundles/latex-extra/files.index.json +1 -1
  64. package/runtime/dist/bundles/latex-extra/manifest.json +1 -1
  65. package/runtime/dist/bundles/lm-fonts/chunks/0.br +0 -0
  66. package/runtime/dist/bundles/lm-fonts/chunks/1.br +0 -0
  67. package/runtime/dist/bundles/lm-fonts/chunks/10.br +0 -0
  68. package/runtime/dist/bundles/lm-fonts/chunks/11.br +0 -0
  69. package/runtime/dist/bundles/lm-fonts/chunks/12.br +0 -0
  70. package/runtime/dist/bundles/lm-fonts/chunks/13.br +0 -0
  71. package/runtime/dist/bundles/lm-fonts/chunks/14.br +0 -0
  72. package/runtime/dist/bundles/lm-fonts/chunks/15.br +0 -0
  73. package/runtime/dist/bundles/lm-fonts/chunks/16.br +0 -0
  74. package/runtime/dist/bundles/lm-fonts/chunks/17.br +0 -0
  75. package/runtime/dist/bundles/lm-fonts/chunks/18.br +0 -0
  76. package/runtime/dist/bundles/lm-fonts/chunks/19.br +0 -0
  77. package/runtime/dist/bundles/lm-fonts/chunks/2.br +0 -0
  78. package/runtime/dist/bundles/lm-fonts/chunks/20.br +0 -0
  79. package/runtime/dist/bundles/lm-fonts/chunks/21.br +0 -0
  80. package/runtime/dist/bundles/lm-fonts/chunks/22.br +0 -0
  81. package/runtime/dist/bundles/lm-fonts/chunks/23.br +0 -0
  82. package/runtime/dist/bundles/lm-fonts/chunks/24.br +0 -0
  83. package/runtime/dist/bundles/lm-fonts/chunks/25.br +0 -0
  84. package/runtime/dist/bundles/lm-fonts/chunks/26.br +0 -0
  85. package/runtime/dist/bundles/lm-fonts/chunks/27.br +0 -0
  86. package/runtime/dist/bundles/lm-fonts/chunks/28.br +0 -0
  87. package/runtime/dist/bundles/lm-fonts/chunks/29.br +0 -0
  88. package/runtime/dist/bundles/lm-fonts/chunks/3.br +0 -0
  89. package/runtime/dist/bundles/lm-fonts/chunks/4.br +0 -0
  90. package/runtime/dist/bundles/lm-fonts/chunks/5.br +0 -0
  91. package/runtime/dist/bundles/lm-fonts/chunks/6.br +0 -0
  92. package/runtime/dist/bundles/lm-fonts/chunks/7.br +0 -0
  93. package/runtime/dist/bundles/lm-fonts/chunks/8.br +0 -0
  94. package/runtime/dist/bundles/lm-fonts/chunks/9.br +0 -0
  95. package/runtime/dist/bundles/lm-fonts/files.index.json +1 -1
  96. package/runtime/dist/bundles/lm-fonts/manifest.json +1 -1
  97. package/runtime/dist/bundles/luatex/chunks/0.br +0 -0
  98. package/runtime/dist/bundles/luatex/chunks/1.br +0 -0
  99. package/runtime/dist/bundles/luatex/chunks/2.br +0 -0
  100. package/runtime/dist/bundles/luatex/files.index.json +1 -1
  101. package/runtime/dist/bundles/luatex/manifest.json +1 -1
  102. package/runtime/dist/bundles/ps-fonts/chunks/0.br +0 -0
  103. package/runtime/dist/bundles/ps-fonts/chunks/1.br +0 -0
  104. package/runtime/dist/bundles/ps-fonts/chunks/2.br +0 -0
  105. package/runtime/dist/bundles/ps-fonts/chunks/3.br +0 -0
  106. package/runtime/dist/bundles/ps-fonts/chunks/4.br +0 -0
  107. package/runtime/dist/bundles/ps-fonts/chunks/5.br +0 -0
  108. package/runtime/dist/bundles/ps-fonts/files.index.json +1 -1
  109. package/runtime/dist/bundles/ps-fonts/manifest.json +1 -1
  110. package/runtime/dist/bundles/tex-plain/chunks/0.br +0 -0
  111. package/runtime/dist/bundles/tex-plain/chunks/1.br +0 -0
  112. package/runtime/dist/bundles/tex-plain/chunks/2.br +0 -0
  113. package/runtime/dist/bundles/tex-plain/chunks/3.br +0 -0
  114. package/runtime/dist/bundles/tex-plain/chunks/4.br +0 -0
  115. package/runtime/dist/bundles/tex-plain/chunks/5.br +0 -0
  116. package/runtime/dist/bundles/tex-plain/chunks/6.br +0 -0
  117. package/runtime/dist/bundles/tex-plain/files.index.json +1 -1
  118. package/runtime/dist/bundles/tex-plain/manifest.json +1 -1
  119. package/runtime/dist/bundles/tikz-snapshot/files.index.json +1 -1
  120. package/runtime/dist/bundles/tikz-snapshot/manifest.json +1 -1
  121. package/runtime/dist/core.d.ts +3 -1
  122. package/runtime/dist/core.js +18 -7
  123. package/runtime/dist/index.js +22 -7
  124. package/runtime/dist/node.js +40 -26
  125. package/runtime/dist/types.d.ts +5 -0
  126. package/runtime/dist/vfs/bundle.d.ts +7 -0
  127. package/runtime/dist/vfs/bundle.js +20 -0
  128. package/runtime/upstream.json +1 -1
  129. package/src/browser-worker.js +2 -2
  130. package/src/deploy.js +14 -3
  131. package/src/index.js +3 -2
  132. package/src/worker.js +3 -3
  133. package/upstream.json +1 -1
  134. package/runtime/dist/bundles/cm-tfm/files.br +0 -0
  135. package/runtime/dist/bundles/cm-type1/files.br +0 -0
  136. package/runtime/dist/bundles/core/files.br +0 -0
  137. package/runtime/dist/bundles/latex-core/files.br +0 -0
  138. package/runtime/dist/bundles/latex-extra/files.br +0 -0
  139. package/runtime/dist/bundles/lm-fonts/files.br +0 -0
  140. package/runtime/dist/bundles/luatex/files.br +0 -0
  141. package/runtime/dist/bundles/ps-fonts/files.br +0 -0
  142. package/runtime/dist/bundles/tex-plain/files.br +0 -0
  143. /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]}
@@ -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"}},"eager":[],"storage":"brotli-chunks-v1","filesystemKey":"2bd36fa3b9d5e22c06f4ce4d19ed7e3274023f132268ebfdef9c398b55382969"}
@@ -45,6 +45,7 @@ export declare class MetaPostCore {
45
45
  build: string;
46
46
  };
47
47
  private userFiles;
48
+ private mplibReady?;
48
49
  /**
49
50
  * luaotfload's font cache (TEXMF_VAR), carried from one LuaTeX run to the
50
51
  * next. Parsing an OpenType face costs about a second, and every TeX run
@@ -53,7 +54,8 @@ export declare class MetaPostCore {
53
54
  private texmfVar;
54
55
  private get logger();
55
56
  constructor(env: CoreEnv);
56
- init(): Promise<void>;
57
+ init(eager?: boolean): Promise<void>;
58
+ private initMetaPost;
57
59
  private progress;
58
60
  /** The errors and warnings of a finished run, one record each; a MetaPost help paragraph is indented under its error. */
59
61
  private report;
@@ -69,7 +69,8 @@ export class MetaPostCore {
69
69
  cache = new MemorySnippetCache();
70
70
  bridge;
71
71
  version = { metapost: '', tex: 'pdfTeX 1.40.27 (DVI)', build: '' };
72
- userFiles = new Set();
72
+ userFiles = new Map();
73
+ mplibReady;
73
74
  /**
74
75
  * luaotfload's font cache (TEXMF_VAR), carried from one LuaTeX run to the
75
76
  * next. Parsing an OpenType face costs about a second, and every TeX run
@@ -80,7 +81,13 @@ export class MetaPostCore {
80
81
  constructor(env) {
81
82
  this.env = env;
82
83
  }
83
- async init() {
84
+ async init(eager = !this.env.options.lazy) {
85
+ if (!eager)
86
+ return;
87
+ this.mplibReady ??= this.initMetaPost();
88
+ await this.mplibReady;
89
+ }
90
+ async initMetaPost() {
84
91
  const o = this.env.options;
85
92
  this.progress({ phase: 'loading', detail: 'mplib.wasm' });
86
93
  // mplib's own stdout/stderr (dvitomp, the runtime) and, through the termLine hook, MetaPost's terminal
@@ -96,6 +103,8 @@ export class MetaPostCore {
96
103
  mkdirp(FS, '/work');
97
104
  this.installTexmf(FS, this.M.NODEFS);
98
105
  FS.chdir('/work');
106
+ for (const [path, bytes] of this.userFiles)
107
+ writeFileDeep(FS, path, bytes);
99
108
  mpxAddPath(this.M, `${TEXMF_ROOT}/fonts/tfm`);
100
109
  mpxAddPath(this.M, `${TEXMF_ROOT}/fonts/vf`);
101
110
  this.M.mpwasmHooks = {
@@ -193,9 +202,9 @@ export class MetaPostCore {
193
202
  }
194
203
  copyUserFiles(T) {
195
204
  // TeX may \input files the user supplied next to the job
196
- for (const p of this.userFiles) {
205
+ for (const [p, bytes] of this.userFiles) {
197
206
  try {
198
- writeFileDeep(T.FS, p, this.M.FS.readFile(p, { encoding: 'binary' }));
207
+ writeFileDeep(T.FS, p, this.M ? this.M.FS.readFile(p, { encoding: 'binary' }) : bytes);
199
208
  }
200
209
  catch { /* ignore */ }
201
210
  }
@@ -288,8 +297,9 @@ export class MetaPostCore {
288
297
  addFiles(files) {
289
298
  for (const [name, data] of Object.entries(files)) {
290
299
  const p = name.startsWith('/') ? name : `/work/${name}`;
291
- writeFileDeep(this.M.FS, p, data);
292
- this.userFiles.add(p);
300
+ if (this.M)
301
+ writeFileDeep(this.M.FS, p, data);
302
+ this.userFiles.set(p, typeof data === 'string' ? data : data.slice());
293
303
  }
294
304
  }
295
305
  /**
@@ -298,7 +308,7 @@ export class MetaPostCore {
298
308
  * typesetting one document after another would hand the first one's .aux to the next.
299
309
  */
300
310
  removeFiles(names) {
301
- const paths = names ? names.map((n) => (n.startsWith('/') ? n : `/work/${n}`)) : [...this.userFiles];
311
+ const paths = names ? names.map((n) => (n.startsWith('/') ? n : `/work/${n}`)) : [...this.userFiles.keys()];
302
312
  for (const p of paths) {
303
313
  if (!this.userFiles.delete(p))
304
314
  continue;
@@ -310,6 +320,7 @@ export class MetaPostCore {
310
320
  }
311
321
  clearCache() { this.cache.clear(); }
312
322
  async run(source, ro = {}) {
323
+ await this.init(true);
313
324
  const o = this.env.options;
314
325
  const t0 = now();
315
326
  this.stats = { totalMs: 0, metapostMs: 0, texMs: 0, texRuns: 0, metapostRuns: 0, snippetCacheHits: 0, snippetCacheMisses: 0 };
@@ -34,16 +34,23 @@ 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.prefetchEager();
38
- await this.bundles.loadHot((base.endsWith('/') ? base : base + '/') + 'hot.json');
37
+ await this.bundles.loadFilesystemIndex((base.endsWith('/') ? base : base + '/') + 'filesystem.json');
38
+ if (!o.lazy || !this.bundles.canFetchSync)
39
+ await this.bundles.prefetchEager();
40
+ if (!o.lazy)
41
+ await this.bundles.loadHot((base.endsWith('/') ? base : base + '/') + 'hot.json');
39
42
  if (!this.bundles.canFetchSync)
40
43
  await this.bundles.prefetchAll();
41
44
  }
42
- const mplibFactory = o.modules?.mplib ?? (await import(/* @vite-ignore */ new URL('./mplib.mjs', here).href)).default;
45
+ const lazyFactory = (name) => async (opts) => {
46
+ const module = await import(/* @vite-ignore */ new URL(`./${name}.mjs`, here).href);
47
+ return module.default(opts);
48
+ };
49
+ const mplibFactory = o.modules?.mplib ?? (o.lazy ? lazyFactory('mplib') : (await import(/* @vite-ignore */ new URL('./mplib.mjs', here).href)).default);
43
50
  let texFactory = o.modules?.tex;
44
51
  if (!texFactory && (o.tex ?? 'auto') !== 'none') {
45
52
  try {
46
- texFactory = (await import(/* @vite-ignore */ new URL('./tex.mjs', here).href)).default;
53
+ texFactory = o.lazy ? lazyFactory('tex') : (await import(/* @vite-ignore */ new URL('./tex.mjs', here).href)).default;
47
54
  }
48
55
  catch {
49
56
  texFactory = undefined;
@@ -52,7 +59,7 @@ class InProcessBackend {
52
59
  let dvisvgmFactory = o.modules?.dvisvgm;
53
60
  if (!dvisvgmFactory && texFactory) {
54
61
  try {
55
- dvisvgmFactory = (await import(/* @vite-ignore */ new URL('./dvisvgm.mjs', here).href)).default;
62
+ dvisvgmFactory = o.lazy ? lazyFactory('dvisvgm') : (await import(/* @vite-ignore */ new URL('./dvisvgm.mjs', here).href)).default;
56
63
  }
57
64
  catch {
58
65
  dvisvgmFactory = undefined;
@@ -62,7 +69,7 @@ class InProcessBackend {
62
69
  let luatexFactory = o.modules?.luatex;
63
70
  if (!luatexFactory && texFactory) {
64
71
  try {
65
- luatexFactory = (await import(/* @vite-ignore */ new URL('./luatex.mjs', here).href)).default;
72
+ luatexFactory = o.lazy ? lazyFactory('luatex') : (await import(/* @vite-ignore */ new URL('./luatex.mjs', here).href)).default;
66
73
  }
67
74
  catch {
68
75
  luatexFactory = undefined;
@@ -104,7 +111,15 @@ class InProcessBackend {
104
111
  await this.bundles.add(spec);
105
112
  await this.bundles.prefetchAll((f) => bundles.includes(f.bundle));
106
113
  }
107
- async prefetch(kinds) { return this.bundles ? this.bundles.prefetchHot(kinds) : 0; }
114
+ async prefetch(kinds) {
115
+ if (!this.bundles)
116
+ return 0;
117
+ if (!Object.keys(this.bundles.hot).length) {
118
+ const base = this.options.bundleBaseUrl ?? new URL('./bundles/', import.meta.url).href;
119
+ await this.bundles.loadHot((base.endsWith('/') ? base : base + '/') + 'hot.json');
120
+ }
121
+ return this.bundles.prefetchHot(kinds);
122
+ }
108
123
  setLogLevel(level) { this.logger.level = level; }
109
124
  dispose() { }
110
125
  }
@@ -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';
@@ -98,6 +98,9 @@ export interface MetaPostOptions {
98
98
  };
99
99
  /** Run in-process instead of in a Web Worker (default: worker in browsers, in-process in Node). */
100
100
  worker?: boolean;
101
+ /** Defer engine glue and MetaPost WASM until used. MetaPost version fields in creation
102
+ * metadata remain empty in this mode. No cross-request cache is required. */
103
+ lazy?: boolean;
101
104
  /** Default for latex()'s snapshot option. Node: 'auto' (tikz.fmt from local files is free). Browser: 'none',
102
105
  * because the 5.8 MB format does not compress and costs more to download than the files it replaces
103
106
  * (2.5 MB gzipped); set 'auto' when many TikZ figures amortise it or the format is already cached. */
@@ -360,6 +363,8 @@ export interface ToolResult {
360
363
  }
361
364
  /** The bundle manifest format (docs/06 §3). Paths are relative to the texmf root. */
362
365
  export interface BundleManifest {
366
+ storage?: "brotli-chunks-v1";
367
+ filesystemKey?: string;
363
368
  name: string;
364
369
  version: string;
365
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 {
@@ -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, logLevel: 'silent' });
4
+ const engine = await MetaPost.create({ worker: false, lazy: true, 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}
@@ -9,7 +9,7 @@ try {
9
9
  \begin{document}
10
10
  ${code}
11
11
  \end{document}`;
12
- const result = await engine.latex(source, { fonts: 'paths' });
12
+ const result = await engine.latex(source, { engine: 'auto', fonts: 'paths' });
13
13
  if (result.status === 'error' || result.status === 'fatal' || result.pages?.length !== 1)
14
14
  throw new Error('TikZ requires one valid page. ' + JSON.stringify(result.diagnostics).slice(0, 2000));
15
15
  const svg = result.pages[0], bytes = new TextEncoder().encode(svg);
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
@@ -3,12 +3,12 @@
3
3
  import { readFileSync } from 'node:fs';
4
4
  import { MetaPost } from '../runtime/dist/index.js';
5
5
  const { source } = JSON.parse(readFileSync(0, 'utf8'));
6
- const engine = await MetaPost.create({ worker: false, logLevel: 'silent' });
6
+ const engine = await MetaPost.create({ worker: false, lazy: true, logLevel: 'silent' });
7
7
  try {
8
- const result = await engine.latex(source, { fonts: 'paths' });
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