@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.
- package/NOTICE.md +3 -1
- package/README.md +17 -4
- package/package.json +1 -1
- package/runtime/.build-key +1 -0
- package/runtime/dist/bundles/cm-tfm/chunks/0.br +0 -0
- package/runtime/dist/bundles/cm-tfm/chunks/1.br +0 -0
- package/runtime/dist/bundles/cm-tfm/chunks/2.br +0 -0
- package/runtime/dist/bundles/cm-tfm/chunks/3.br +0 -0
- package/runtime/dist/bundles/cm-tfm/chunks/4.br +0 -0
- package/runtime/dist/bundles/cm-tfm/chunks/5.br +0 -0
- package/runtime/dist/bundles/cm-tfm/chunks/6.br +0 -0
- package/runtime/dist/bundles/cm-tfm/chunks/7.br +0 -0
- package/runtime/dist/bundles/cm-tfm/files.index.json +1 -1
- package/runtime/dist/bundles/cm-tfm/manifest.json +1 -1
- package/runtime/dist/bundles/cm-type1/chunks/0.br +0 -0
- package/runtime/dist/bundles/cm-type1/chunks/1.br +0 -0
- package/runtime/dist/bundles/cm-type1/chunks/10.br +0 -0
- package/runtime/dist/bundles/cm-type1/chunks/11.br +0 -0
- package/runtime/dist/bundles/cm-type1/chunks/2.br +0 -0
- package/runtime/dist/bundles/cm-type1/chunks/3.br +0 -0
- package/runtime/dist/bundles/cm-type1/chunks/4.br +0 -0
- package/runtime/dist/bundles/cm-type1/chunks/5.br +0 -0
- package/runtime/dist/bundles/cm-type1/chunks/6.br +0 -0
- package/runtime/dist/bundles/cm-type1/chunks/7.br +0 -0
- package/runtime/dist/bundles/cm-type1/chunks/8.br +0 -0
- package/runtime/dist/bundles/cm-type1/chunks/9.br +0 -0
- package/runtime/dist/bundles/cm-type1/files.index.json +1 -1
- package/runtime/dist/bundles/cm-type1/manifest.json +1 -1
- package/runtime/dist/bundles/core/chunks/0.br +0 -0
- package/runtime/dist/bundles/core/chunks/1.br +0 -0
- package/runtime/dist/bundles/core/chunks/2.br +0 -0
- package/runtime/dist/bundles/core/chunks/3.br +0 -0
- package/runtime/dist/bundles/core/files.index.json +1 -1
- package/runtime/dist/bundles/core/manifest.json +1 -1
- package/runtime/dist/bundles/filesystem.json +1 -0
- package/runtime/dist/bundles/latex-core/chunks/0.br +0 -0
- package/runtime/dist/bundles/latex-core/chunks/1.br +0 -0
- package/runtime/dist/bundles/latex-core/chunks/10.br +0 -0
- package/runtime/dist/bundles/latex-core/chunks/2.br +0 -0
- package/runtime/dist/bundles/latex-core/chunks/3.br +0 -0
- package/runtime/dist/bundles/latex-core/chunks/4.br +0 -0
- package/runtime/dist/bundles/latex-core/chunks/5.br +0 -0
- package/runtime/dist/bundles/latex-core/chunks/6.br +0 -0
- package/runtime/dist/bundles/latex-core/chunks/7.br +0 -0
- package/runtime/dist/bundles/latex-core/chunks/8.br +0 -0
- package/runtime/dist/bundles/latex-core/chunks/9.br +0 -0
- package/runtime/dist/bundles/latex-core/files.index.json +1 -1
- package/runtime/dist/bundles/latex-core/manifest.json +1 -1
- package/runtime/dist/bundles/latex-extra/chunks/0.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/1.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/10.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/11.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/12.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/13.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/14.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/15.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/16.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/17.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/18.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/19.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/2.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/20.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/21.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/22.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/23.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/24.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/25.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/26.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/27.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/3.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/4.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/5.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/6.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/7.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/8.br +0 -0
- package/runtime/dist/bundles/latex-extra/chunks/9.br +0 -0
- package/runtime/dist/bundles/latex-extra/files.index.json +1 -1
- package/runtime/dist/bundles/latex-extra/manifest.json +1 -1
- package/runtime/dist/bundles/lm-fonts/chunks/0.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/1.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/10.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/11.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/12.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/13.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/14.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/15.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/16.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/17.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/18.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/19.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/2.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/20.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/21.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/22.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/23.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/24.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/25.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/26.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/27.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/28.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/29.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/3.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/4.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/5.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/6.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/7.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/8.br +0 -0
- package/runtime/dist/bundles/lm-fonts/chunks/9.br +0 -0
- package/runtime/dist/bundles/lm-fonts/files.index.json +1 -1
- package/runtime/dist/bundles/lm-fonts/manifest.json +1 -1
- package/runtime/dist/bundles/luatex/chunks/0.br +0 -0
- package/runtime/dist/bundles/luatex/chunks/1.br +0 -0
- package/runtime/dist/bundles/luatex/chunks/2.br +0 -0
- package/runtime/dist/bundles/luatex/files.index.json +1 -1
- package/runtime/dist/bundles/luatex/manifest.json +1 -1
- package/runtime/dist/bundles/ps-fonts/chunks/0.br +0 -0
- package/runtime/dist/bundles/ps-fonts/chunks/1.br +0 -0
- package/runtime/dist/bundles/ps-fonts/chunks/2.br +0 -0
- package/runtime/dist/bundles/ps-fonts/chunks/3.br +0 -0
- package/runtime/dist/bundles/ps-fonts/chunks/4.br +0 -0
- package/runtime/dist/bundles/ps-fonts/chunks/5.br +0 -0
- package/runtime/dist/bundles/ps-fonts/files.index.json +1 -1
- package/runtime/dist/bundles/ps-fonts/manifest.json +1 -1
- package/runtime/dist/bundles/tex-plain/chunks/0.br +0 -0
- package/runtime/dist/bundles/tex-plain/chunks/1.br +0 -0
- package/runtime/dist/bundles/tex-plain/chunks/2.br +0 -0
- package/runtime/dist/bundles/tex-plain/chunks/3.br +0 -0
- package/runtime/dist/bundles/tex-plain/chunks/4.br +0 -0
- package/runtime/dist/bundles/tex-plain/chunks/5.br +0 -0
- package/runtime/dist/bundles/tex-plain/chunks/6.br +0 -0
- package/runtime/dist/bundles/tex-plain/chunks/7.br +0 -0
- package/runtime/dist/bundles/tex-plain/files.index.json +1 -1
- package/runtime/dist/bundles/tex-plain/manifest.json +1 -1
- package/runtime/dist/bundles/tikz-snapshot/chunks/1.br +0 -0
- package/runtime/dist/bundles/tikz-snapshot/files.index.json +1 -1
- package/runtime/dist/bundles/tikz-snapshot/manifest.json +1 -1
- package/runtime/dist/core.js +20 -13
- package/runtime/dist/index.js +1 -0
- package/runtime/dist/node.js +40 -26
- package/runtime/dist/texengine.d.ts +1 -0
- package/runtime/dist/types.d.ts +5 -3
- package/runtime/dist/vfs/bundle.d.ts +7 -0
- package/runtime/dist/vfs/bundle.js +20 -0
- package/runtime/dist/vfs/lazyfs.d.ts +6 -1
- package/runtime/dist/vfs/lazyfs.js +17 -2
- package/runtime/upstream.json +1 -1
- package/src/browser-worker.js +1 -1
- package/src/deploy.js +14 -3
- package/src/index.js +3 -2
- package/src/worker.js +1 -1
- package/upstream.json +1 -1
- package/runtime/dist/bundles/cm-tfm/files.br +0 -0
- package/runtime/dist/bundles/cm-type1/files.br +0 -0
- package/runtime/dist/bundles/core/files.br +0 -0
- package/runtime/dist/bundles/latex-core/files.br +0 -0
- package/runtime/dist/bundles/latex-extra/files.br +0 -0
- package/runtime/dist/bundles/lm-fonts/files.br +0 -0
- package/runtime/dist/bundles/luatex/files.br +0 -0
- package/runtime/dist/bundles/ps-fonts/files.br +0 -0
- package/runtime/dist/bundles/tex-plain/files.br +0 -0
- /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"}
|
|
Binary file
|
|
@@ -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"}
|
package/runtime/dist/core.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
|
750
|
+
return this.M.FS.analyzePath(`${TEXMF_ROOT}/web2c/${name}.fmt`).exists;
|
|
744
751
|
}
|
|
745
752
|
catch {
|
|
746
753
|
return false;
|
package/runtime/dist/index.js
CHANGED
|
@@ -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)
|
package/runtime/dist/node.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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) {
|
|
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';
|
package/runtime/dist/types.d.ts
CHANGED
|
@@ -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
|
|
105
|
-
*
|
|
106
|
-
*
|
|
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
|
package/runtime/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-
|
|
26
|
+
"distribution": "brotli-chunks-v1"
|
|
27
27
|
}
|
package/src/browser-worker.js
CHANGED
|
@@ -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
|
|
40
|
-
for (const [path,
|
|
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
|
|
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
|
|
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,${
|
|
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(
|
|
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-
|
|
26
|
+
"distribution": "brotli-chunks-v1"
|
|
27
27
|
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
File without changes
|