nuxt-og-image 3.0.0-rc.3 → 3.0.0-rc.31
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/README.md +4 -4
- package/dist/client/200.html +228 -15
- package/dist/client/404.html +228 -15
- package/dist/client/_nuxt/IconCSS.V7-3N1ew.js +1 -0
- package/dist/client/_nuxt/IconCSS.avVk0m4D.css +1 -0
- package/dist/client/_nuxt/abap.bJqzlTLD.js +816 -0
- package/dist/client/_nuxt/actionscript-3.NUzLYz6e.js +1 -0
- package/dist/client/_nuxt/ada.HSb8VHJ5.js +1 -0
- package/dist/client/_nuxt/andromeeda.TE0Toi4a.js +1 -0
- package/dist/client/_nuxt/angular-html.ulaXK71i.js +16 -0
- package/dist/client/_nuxt/angular-ts.CpB8xVpe.js +666 -0
- package/dist/client/_nuxt/apache.TpqIaH_y.js +1 -0
- package/dist/client/_nuxt/apex.rLr5RF8N.js +274 -0
- package/dist/client/_nuxt/apl.XB4V8Q_3.js +87 -0
- package/dist/client/_nuxt/applescript.uEUaUzem.js +38 -0
- package/dist/client/_nuxt/ara.yxVemEif.js +21 -0
- package/dist/client/_nuxt/asm.N3zWSyW8.js +1 -0
- package/dist/client/_nuxt/astro.5Up4Y-tq.js +1 -0
- package/dist/client/_nuxt/aurora-x.23vffHpO.js +1 -0
- package/dist/client/_nuxt/awk.tQAliBPt.js +1 -0
- package/dist/client/_nuxt/ayu-dark.09-XTo9D.js +1 -0
- package/dist/client/_nuxt/ballerina.j08zL6tL.js +62 -0
- package/dist/client/_nuxt/bat.4hprCtpO.js +1 -0
- package/dist/client/_nuxt/beancount.B4bgLeBI.js +1 -0
- package/dist/client/_nuxt/berry.99Qqo7Pl.js +1 -0
- package/dist/client/_nuxt/bibtex.PUS4KD1G.js +1 -0
- package/dist/client/_nuxt/bicep.U1vZFTkg.js +1 -0
- package/dist/client/_nuxt/blade.dLd1FX1V.js +831 -0
- package/dist/client/_nuxt/builds/latest.json +1 -1
- package/dist/client/_nuxt/builds/meta/e8c2abb1-c2da-455e-a7e8-26f4f28b10f9.json +1 -0
- package/dist/client/_nuxt/c.1HqcaTLZ.js +81 -0
- package/dist/client/_nuxt/cadence.wPBjDAPG.js +1 -0
- package/dist/client/_nuxt/catppuccin-frappe.3zzElYQH.js +1 -0
- package/dist/client/_nuxt/catppuccin-latte.7_seQpm6.js +1 -0
- package/dist/client/_nuxt/catppuccin-macchiato.xyLZ1Mzm.js +1 -0
- package/dist/client/_nuxt/catppuccin-mocha.sKQhYBeR.js +1 -0
- package/dist/client/_nuxt/clarity.9V3ikNUm.js +1 -0
- package/dist/client/_nuxt/clojure.m464_LIc.js +1 -0
- package/dist/client/_nuxt/cmake.YiKLaZ9A.js +1 -0
- package/dist/client/_nuxt/cobol.yHzQax91.js +1 -0
- package/dist/client/_nuxt/codeql.i7fhVOvX.js +1 -0
- package/dist/client/_nuxt/coffee.UjKhX0iS.js +100 -0
- package/dist/client/_nuxt/cpp.UIU91NPT.js +186 -0
- package/dist/client/_nuxt/crystal.ePodXjZr.js +25 -0
- package/dist/client/_nuxt/csharp.xHVQI8QI.js +756 -0
- package/dist/client/_nuxt/css.tuEqSfZX.js +505 -0
- package/dist/client/_nuxt/csv.REIP-dDb.js +1 -0
- package/dist/client/_nuxt/cue.ts9p4IYJ.js +1 -0
- package/dist/client/_nuxt/cypher.y2dXjvht.js +1 -0
- package/dist/client/_nuxt/d.91KOtcJM.js +1 -0
- package/dist/client/_nuxt/dark-plus.kgh98KCl.js +1 -0
- package/dist/client/_nuxt/dart.ATU8nP6d.js +1 -0
- package/dist/client/_nuxt/dax.M4oDHFBw.js +29 -0
- package/dist/client/_nuxt/diff.-l9-nN5b.js +1 -0
- package/dist/client/_nuxt/docker.FKXxym4E.js +1 -0
- package/dist/client/_nuxt/dracula-soft.E92bUq8i.js +1 -0
- package/dist/client/_nuxt/dracula.mNVTF5-9.js +1 -0
- package/dist/client/_nuxt/dream-maker.5lPMrnJr.js +52 -0
- package/dist/client/_nuxt/elixir.dYoE9A9d.js +17 -0
- package/dist/client/_nuxt/elm.AR6G1sGv.js +1 -0
- package/dist/client/_nuxt/entry.DjkITzvC.css +1 -0
- package/dist/client/_nuxt/entry.LuO6Nylf.js +134 -0
- package/dist/client/_nuxt/erb.vCu37omy.js +1 -0
- package/dist/client/_nuxt/erlang._Br9gip-.js +1 -0
- package/dist/client/_nuxt/{error-404.b7c0506a.js → error-404.DE_aZn4X.js} +1 -1
- package/dist/client/_nuxt/error-404.DkXpI38i.css +1 -0
- package/dist/client/_nuxt/{error-500.c45b2f29.js → error-500.4nIEY5y_.js} +1 -1
- package/dist/client/_nuxt/fish.k6NZEVUm.js +5 -0
- package/dist/client/_nuxt/fortran-fixed-form.5oVt_150.js +1 -0
- package/dist/client/_nuxt/fortran-free-form.l6j6vfmD.js +1 -0
- package/dist/client/_nuxt/fsharp.5TASvPJ1.js +1 -0
- package/dist/client/_nuxt/gdresource.7GKJFf55.js +1 -0
- package/dist/client/_nuxt/gdscript.E1_SGClP.js +44 -0
- package/dist/client/_nuxt/gdshader.6pjKCTQy.js +1 -0
- package/dist/client/_nuxt/gherkin.hgsyILVZ.js +1 -0
- package/dist/client/_nuxt/git-commit.RtAxFnK2.js +1 -0
- package/dist/client/_nuxt/git-rebase.-_3Z3F37.js +1 -0
- package/dist/client/_nuxt/github-dark-dimmed.yDYFqRVv.js +1 -0
- package/dist/client/_nuxt/github-dark.WrpzPehD.js +1 -0
- package/dist/client/_nuxt/github-light.QjB713Ax.js +1 -0
- package/dist/client/_nuxt/glimmer-js.8faD3vw8.js +13 -0
- package/dist/client/_nuxt/glimmer-ts.I8Eofu1P.js +13 -0
- package/dist/client/_nuxt/glsl.yLv_V-GM.js +1 -0
- package/dist/client/_nuxt/gnuplot.fIlAWhXw.js +266 -0
- package/dist/client/_nuxt/go.U2NlzxIl.js +1 -0
- package/dist/client/_nuxt/graphql.aYTh5yPU.js +4 -0
- package/dist/client/_nuxt/groovy.Z1Lrhk2B.js +37 -0
- package/dist/client/_nuxt/hack.9pFjhnG2.js +86 -0
- package/dist/client/_nuxt/haml.DYCf5dhF.js +1 -0
- package/dist/client/_nuxt/handlebars.Z9TIkDUw.js +1 -0
- package/dist/client/_nuxt/haskell.HW0BBkRd.js +559 -0
- package/dist/client/_nuxt/hcl.M9siRbiv.js +1 -0
- package/dist/client/_nuxt/hjson.fLk7JbZa.js +50 -0
- package/dist/client/_nuxt/hlsl.Do_j-o-7.js +1 -0
- package/dist/client/_nuxt/html.ZVb9jHrO.js +74 -0
- package/dist/client/_nuxt/http.McgS7Vpm.js +1 -0
- package/dist/client/_nuxt/imba.guICF3zN.js +223 -0
- package/dist/client/_nuxt/ini.T6bxBy5-.js +1 -0
- package/dist/client/_nuxt/java.tY-NU26U.js +68 -0
- package/dist/client/_nuxt/javascript.JMZ6uy5M.js +699 -0
- package/dist/client/_nuxt/jinja.H2a5aKFq.js +1 -0
- package/dist/client/_nuxt/jison.hEN1Pilr.js +1 -0
- package/dist/client/_nuxt/json.xL80yL3n.js +25 -0
- package/dist/client/_nuxt/json5.NRuQoh_0.js +17 -0
- package/dist/client/_nuxt/jsonc.Bb1R3obU.js +25 -0
- package/dist/client/_nuxt/jsonl.Yjg0VwMG.js +25 -0
- package/dist/client/_nuxt/jsonnet.WK26vH-O.js +1 -0
- package/dist/client/_nuxt/jssm.eioTUq4-.js +1 -0
- package/dist/client/_nuxt/jsx.3LZ_BoLB.js +699 -0
- package/dist/client/_nuxt/julia.zN5MNt1V.js +9 -0
- package/dist/client/_nuxt/kotlin.1iwCeGA4.js +1 -0
- package/dist/client/_nuxt/kusto.UpRCclYC.js +1 -0
- package/dist/client/_nuxt/latex.Pwsy_OsJ.js +3 -0
- package/dist/client/_nuxt/less.Mq8TrjER.js +159 -0
- package/dist/client/_nuxt/light-plus.TzXGjDsL.js +1 -0
- package/dist/client/_nuxt/liquid.UuwAmqmc.js +14 -0
- package/dist/client/_nuxt/lisp.iIZdsWzX.js +1 -0
- package/dist/client/_nuxt/logo.WuHqTpFy.js +1 -0
- package/dist/client/_nuxt/lua.OGbZEs3U.js +1 -0
- package/dist/client/_nuxt/make.8zIAVqFD.js +1 -0
- package/dist/client/_nuxt/markdown.Y8p9X7h3.js +129 -0
- package/dist/client/_nuxt/marko.gbQhFTQa.js +8 -0
- package/dist/client/_nuxt/material-theme-darker.e1lAwchJ.js +1 -0
- package/dist/client/_nuxt/material-theme-lighter.y77yPuAI.js +1 -0
- package/dist/client/_nuxt/material-theme-ocean.oIMAIpse.js +1 -0
- package/dist/client/_nuxt/material-theme-palenight.Z44VU5rQ.js +1 -0
- package/dist/client/_nuxt/material-theme.49YjOoAR.js +1 -0
- package/dist/client/_nuxt/matlab.LaB98_jd.js +70 -0
- package/dist/client/_nuxt/mdc.NowVT77H.js +76 -0
- package/dist/client/_nuxt/mdx.VhCSg2DJ.js +1 -0
- package/dist/client/_nuxt/mermaid.WuNnVULj.js +1 -0
- package/dist/client/_nuxt/min-dark._Ja8ZF5C.js +1 -0
- package/dist/client/_nuxt/min-light.N1m_6E3S.js +1 -0
- package/dist/client/_nuxt/mojo.zLNDSfD9.js +519 -0
- package/dist/client/_nuxt/monokai.WLw4Glvg.js +1 -0
- package/dist/client/_nuxt/narrat.KYi2rZr0.js +7 -0
- package/dist/client/_nuxt/nextflow.lYJjOZ_l.js +1 -0
- package/dist/client/_nuxt/nginx.CrBM8z2W.js +1 -0
- package/dist/client/_nuxt/night-owl.GWZK5Ce7.js +1 -0
- package/dist/client/_nuxt/nim.16czfBCm.js +1 -0
- package/dist/client/_nuxt/nix.z3u_V08Q.js +1 -0
- package/dist/client/_nuxt/nord.1NrVtx79.js +1 -0
- package/dist/client/_nuxt/nushell.GDk9yul-.js +1 -0
- package/dist/client/_nuxt/objective-c.Eci2Q5FN.js +109 -0
- package/dist/client/_nuxt/objective-cpp.nGsV46Zk.js +239 -0
- package/dist/client/_nuxt/ocaml.oQRvlYTD.js +1 -0
- package/dist/client/_nuxt/one-dark-pro.qlkgvdEn.js +1 -0
- package/dist/client/_nuxt/onig.mBJmD8D5.js +1 -0
- package/dist/client/_nuxt/pascal.aIRIFbih.js +1 -0
- package/dist/client/_nuxt/perl._x09KDDb.js +1 -0
- package/dist/client/_nuxt/php.2PDLwZAX.js +771 -0
- package/dist/client/_nuxt/plsql.vhhXsReo.js +1 -0
- package/dist/client/_nuxt/poimandres.oZrO-I17.js +1 -0
- package/dist/client/_nuxt/postcss.57yKeRpx.js +1 -0
- package/dist/client/_nuxt/powerquery.wBQvr9E-.js +1 -0
- package/dist/client/_nuxt/powershell.6Y_bsqLY.js +1 -0
- package/dist/client/_nuxt/prisma.fG9Ut-9i.js +1 -0
- package/dist/client/_nuxt/prolog.vggnm0Hd.js +1 -0
- package/dist/client/_nuxt/proto.yigfBmiL.js +1 -0
- package/dist/client/_nuxt/pug.ieZS468c.js +1 -0
- package/dist/client/_nuxt/puppet.NqXa_cO1.js +1 -0
- package/dist/client/_nuxt/purescript.NA5qsvV2.js +7 -0
- package/dist/client/_nuxt/python.V9Nu427R.js +518 -0
- package/dist/client/_nuxt/r.xMXDrvl2.js +1 -0
- package/dist/client/_nuxt/raku.NSWyGF40.js +1 -0
- package/dist/client/_nuxt/razor.wPI2afgP.js +40 -0
- package/dist/client/_nuxt/red.sV5NnIRC.js +1 -0
- package/dist/client/_nuxt/reg.Dr-lXfN9.js +1 -0
- package/dist/client/_nuxt/rel.vATIbX_E.js +1 -0
- package/dist/client/_nuxt/riscv.L73dAZEB.js +13 -0
- package/dist/client/_nuxt/rose-pine-dawn.qPi4euik.js +1 -0
- package/dist/client/_nuxt/rose-pine-moon.Im6VgKOx.js +1 -0
- package/dist/client/_nuxt/rose-pine._tQyNI4L.js +1 -0
- package/dist/client/_nuxt/rst.Nzb5IGfi.js +1 -0
- package/dist/client/_nuxt/ruby.oOCDDplm.js +80 -0
- package/dist/client/_nuxt/rust.yNm59Dur.js +1 -0
- package/dist/client/_nuxt/sas.fTu4QUYF.js +1 -0
- package/dist/client/_nuxt/sass.URKSWxt9.js +2 -0
- package/dist/client/_nuxt/scala.7DKpDMtV.js +5 -0
- package/dist/client/_nuxt/scheme.S0VUhbaV.js +136 -0
- package/dist/client/_nuxt/scss.9u5wOjnF.js +90 -0
- package/dist/client/_nuxt/shaderlab.MYTNW71C.js +1 -0
- package/dist/client/_nuxt/shellscript.82BvnTib.js +4 -0
- package/dist/client/_nuxt/shellsession.e2TODbDv.js +1 -0
- package/dist/client/_nuxt/slack-dark.1ZggNzwg.js +1 -0
- package/dist/client/_nuxt/slack-ochin.IcMt0x71.js +1 -0
- package/dist/client/_nuxt/smalltalk.ymyryZ3T.js +1 -0
- package/dist/client/_nuxt/solarized-dark.3DcwRX9o.js +1 -0
- package/dist/client/_nuxt/solarized-light.iUVMuJ2F.js +1 -0
- package/dist/client/_nuxt/solidity.rGqtk2dD.js +1 -0
- package/dist/client/_nuxt/sparql.b6B4dWwT.js +1 -0
- package/dist/client/_nuxt/splunk.OYnOZZCZ.js +1 -0
- package/dist/client/_nuxt/sql.KWFjTZGI.js +21 -0
- package/dist/client/_nuxt/ssh-config.jdYjUr9x.js +1 -0
- package/dist/client/_nuxt/stata.cF_ucIcM.js +3 -0
- package/dist/client/_nuxt/stylus.sPHLw37c.js +15 -0
- package/dist/client/_nuxt/svelte.j-bqdsch.js +1 -0
- package/dist/client/_nuxt/swift.YwiPyWKn.js +544 -0
- package/dist/client/_nuxt/synthwave-84.QD7ZGwpp.js +1 -0
- package/dist/client/_nuxt/system-verilog.gwJe9XJI.js +9 -0
- package/dist/client/_nuxt/tasl.IM3fg-4x.js +1 -0
- package/dist/client/_nuxt/tcl.h_zrCUh3.js +1 -0
- package/dist/client/_nuxt/tex.uNByjuDB.js +1 -0
- package/dist/client/_nuxt/tokyo-night.3j08uV2M.js +1 -0
- package/dist/client/_nuxt/toml.p_xIKQcU.js +69 -0
- package/dist/client/_nuxt/tsx.7LxggtAE.js +699 -0
- package/dist/client/_nuxt/turtle.qvOLXpiq.js +1 -0
- package/dist/client/_nuxt/twig.p6WenPmw.js +40 -0
- package/dist/client/_nuxt/typescript.HpdcmTOD.js +666 -0
- package/dist/client/_nuxt/v.BcVLQyAr.js +1 -0
- package/dist/client/_nuxt/vanilla-picker.P0dws0ou.js +8 -0
- package/dist/client/_nuxt/vb.nfm3ZogP.js +1 -0
- package/dist/client/_nuxt/verilog.32GaFvLA.js +1 -0
- package/dist/client/_nuxt/vhdl.BgfvI7C9.js +515 -0
- package/dist/client/_nuxt/viml.Ob-szSvk.js +1 -0
- package/dist/client/_nuxt/vitesse-black.uLlG6AUB.js +1 -0
- package/dist/client/_nuxt/vitesse-dark.5VceXvs6.js +1 -0
- package/dist/client/_nuxt/vitesse-light.HOMMxGxw.js +1 -0
- package/dist/client/_nuxt/vue-html.TGyjH-sv.js +1 -0
- package/dist/client/_nuxt/vue.AKvPdve9.js +6 -0
- package/dist/client/_nuxt/vyper.0ItMHLZu.js +575 -0
- package/dist/client/_nuxt/wasm.5qeU6UJI.js +1 -0
- package/dist/client/_nuxt/wenyan.gl1zQYA8.js +1 -0
- package/dist/client/_nuxt/wgsl.KpVp-DWl.js +1 -0
- package/dist/client/_nuxt/wolfram.K_QzNdW-.js +1 -0
- package/dist/client/_nuxt/xml.GygmfNh9.js +1 -0
- package/dist/client/_nuxt/xsl.TptR0G-3.js +1 -0
- package/dist/client/_nuxt/yaml.zytfnWoA.js +200 -0
- package/dist/client/_nuxt/zenscript.htRIWiQY.js +2 -0
- package/dist/client/_nuxt/zig.VzlkOal1.js +1 -0
- package/dist/client/index.html +228 -15
- package/dist/module.d.mts +10 -3
- package/dist/module.d.ts +10 -3
- package/dist/module.json +2 -2
- package/dist/module.mjs +197 -121
- package/dist/runtime/nitro/og-image/bindings/chromium/chrome-launcher.mjs +9 -0
- package/dist/runtime/nitro/og-image/bindings/chromium/on-demand.d.ts +2 -0
- package/dist/runtime/nitro/og-image/bindings/chromium/on-demand.mjs +36 -0
- package/dist/runtime/nitro/og-image/bindings/chromium/playwright.d.ts +2 -0
- package/dist/runtime/nitro/og-image/bindings/chromium/playwright.mjs +6 -0
- package/dist/runtime/nitro/og-image/bindings/css-inline/node.d.ts +8 -0
- package/dist/runtime/nitro/og-image/bindings/css-inline/node.mjs +7 -0
- package/dist/runtime/nitro/og-image/bindings/css-inline/wasm-fs.d.ts +8 -0
- package/dist/runtime/nitro/og-image/bindings/css-inline/wasm-fs.mjs +8 -0
- package/dist/runtime/nitro/og-image/bindings/css-inline/wasm.d.ts +8 -0
- package/dist/runtime/nitro/og-image/bindings/css-inline/wasm.mjs +8 -0
- package/dist/runtime/{core → nitro/og-image}/bindings/resvg/wasm-fs.mjs +1 -1
- package/dist/runtime/{core → nitro/og-image}/bindings/resvg/wasm.mjs +1 -1
- package/dist/runtime/{core → nitro/og-image}/bindings/satori/wasm-fs.mjs +1 -1
- package/dist/runtime/{core → nitro/og-image}/bindings/satori/wasm.mjs +1 -1
- package/dist/runtime/nitro/og-image/cache.d.ts +7 -0
- package/dist/runtime/{core/cache/htmlPayload.mjs → nitro/og-image/cache.mjs} +3 -0
- package/dist/runtime/{core/renderers → nitro/og-image}/chromium/screenshot.mjs +1 -1
- package/dist/runtime/nitro/og-image/context.d.ts +5 -0
- package/dist/runtime/nitro/og-image/context.mjs +177 -0
- package/dist/runtime/nitro/og-image/instances.d.ts +2 -0
- package/dist/runtime/nitro/og-image/instances.mjs +10 -0
- package/dist/runtime/{core/font/fetch.d.ts → nitro/og-image/satori/font.d.ts} +1 -1
- package/dist/runtime/nitro/og-image/satori/font.mjs +32 -0
- package/dist/runtime/{core/renderers → nitro/og-image}/satori/instances.d.ts +0 -2
- package/dist/runtime/{core/renderers → nitro/og-image}/satori/instances.mjs +2 -11
- package/dist/runtime/nitro/og-image/satori/plugins/encoding.mjs +17 -0
- package/dist/runtime/nitro/og-image/satori/plugins/imageSrc.mjs +82 -0
- package/dist/runtime/{core/renderers/satori/index.mjs → nitro/og-image/satori/renderer.mjs} +28 -15
- package/dist/runtime/{core/html/applyEmojis.d.ts → nitro/og-image/satori/transforms/emojis.d.ts} +3 -1
- package/dist/runtime/{core/html/applyEmojis.mjs → nitro/og-image/satori/transforms/emojis.mjs} +6 -2
- package/dist/runtime/{core/html/applyInlineCss.d.ts → nitro/og-image/satori/transforms/inlineCss.d.ts} +1 -1
- package/dist/runtime/nitro/og-image/satori/transforms/inlineCss.mjs +39 -0
- package/dist/runtime/{core/renderers → nitro/og-image}/satori/vnodes.mjs +7 -5
- package/dist/runtime/nitro/og-image/templates/html.d.ts +2 -0
- package/dist/runtime/{core/html/devIframeTemplate.mjs → nitro/og-image/templates/html.mjs} +17 -9
- package/dist/runtime/nitro/plugins/nuxt-content.mjs +7 -4
- package/dist/runtime/nitro/plugins/prerender.d.ts +1 -1
- package/dist/runtime/nitro/plugins/prerender.mjs +8 -16
- package/dist/runtime/{server/routes/__og-image__ → nitro/routes}/debug.json.d.ts +1 -5
- package/dist/runtime/{server/routes/__og-image__ → nitro/routes}/debug.json.mjs +1 -7
- package/dist/runtime/{server/routes/__og-image__/font-[name]-[weight].[extension].mjs → nitro/routes/font.mjs} +22 -3
- package/dist/runtime/{server/routes/__og-image__ → nitro/routes}/image.mjs +9 -12
- package/dist/runtime/nitro/tsconfig.json +3 -0
- package/dist/runtime/{cache.d.ts → nitro/util/cache.d.ts} +1 -1
- package/dist/runtime/nitro/util/encoding.d.ts +3 -0
- package/dist/runtime/nitro/util/encoding.mjs +15 -0
- package/dist/runtime/nitro/util/kit.d.ts +6 -0
- package/dist/runtime/nitro/util/kit.mjs +32 -0
- package/dist/runtime/{components → nuxt/components}/OgImage/OgImage.d.ts +2 -2
- package/dist/runtime/{components → nuxt/components}/OgImage/OgImageScreenshot.d.ts +2 -2
- package/dist/runtime/{components → nuxt/components}/Templates/Community/NuxtSeo.vue +2 -2
- package/dist/runtime/{components → nuxt/components}/Templates/Community/UnJs.vue +2 -2
- package/dist/runtime/{composables → nuxt/composables}/defineOgImage.d.ts +1 -1
- package/dist/runtime/{composables → nuxt/composables}/defineOgImage.mjs +6 -11
- package/dist/runtime/{composables → nuxt/composables}/defineOgImageComponent.d.ts +1 -1
- package/dist/runtime/{composables → nuxt/composables}/defineOgImageScreenshot.d.ts +1 -1
- package/dist/runtime/nuxt/composables/mock.d.ts +0 -0
- package/dist/runtime/nuxt/composables/mock.mjs +6 -0
- package/dist/runtime/nuxt/plugins/og-image-canonical-urls.server.mjs +10 -3
- package/dist/runtime/nuxt/plugins/route-rule-og-image.server.mjs +1 -1
- package/dist/runtime/nuxt/utils.d.ts +2 -1
- package/dist/runtime/nuxt/utils.mjs +5 -3
- package/dist/runtime/{utils.pure.d.ts → pure.d.ts} +3 -0
- package/dist/runtime/{utils.pure.mjs → pure.mjs} +19 -1
- package/dist/runtime/{utils.d.ts → shared.d.ts} +1 -1
- package/dist/runtime/{utils.mjs → shared.mjs} +1 -1
- package/dist/runtime/types.d.ts +9 -3
- package/dist/types.d.mts +2 -2
- package/package.json +71 -46
- package/dist/client/_nuxt/IconCSS.a9e1bda0.js +0 -1
- package/dist/client/_nuxt/IconCSS.f0b56d3e.css +0 -1
- package/dist/client/_nuxt/builds/meta/f6f30fc8-72d3-4090-90f8-10aeee14e041.json +0 -1
- package/dist/client/_nuxt/entry.a30f63d0.css +0 -1
- package/dist/client/_nuxt/entry.dd086114.js +0 -108
- package/dist/client/_nuxt/error-404.b751fa02.css +0 -1
- package/dist/client/_nuxt/vanilla-picker-NKbIFE8h.23409a58.js +0 -8
- package/dist/runtime/core/bindings/chromium/node.mjs +0 -33
- package/dist/runtime/core/bindings/css-inline/node.d.ts +0 -2
- package/dist/runtime/core/bindings/css-inline/node.mjs +0 -2
- package/dist/runtime/core/cache/emojis.d.ts +0 -1
- package/dist/runtime/core/cache/emojis.mjs +0 -5
- package/dist/runtime/core/cache/fonts.d.ts +0 -3
- package/dist/runtime/core/cache/fonts.mjs +0 -6
- package/dist/runtime/core/cache/htmlPayload.d.ts +0 -5
- package/dist/runtime/core/cache/prerender.d.ts +0 -2
- package/dist/runtime/core/cache/prerender.mjs +0 -5
- package/dist/runtime/core/env/assets.d.ts +0 -1
- package/dist/runtime/core/env/assets.mjs +0 -11
- package/dist/runtime/core/font/fetch.mjs +0 -36
- package/dist/runtime/core/html/applyInlineCss.mjs +0 -32
- package/dist/runtime/core/html/devIframeTemplate.d.ts +0 -2
- package/dist/runtime/core/html/fetchIsland.d.ts +0 -3
- package/dist/runtime/core/html/fetchIsland.mjs +0 -17
- package/dist/runtime/core/options/extract.d.ts +0 -3
- package/dist/runtime/core/options/extract.mjs +0 -49
- package/dist/runtime/core/options/fetch.d.ts +0 -3
- package/dist/runtime/core/options/fetch.mjs +0 -32
- package/dist/runtime/core/renderers/satori/plugins/encoding.mjs +0 -8
- package/dist/runtime/core/renderers/satori/plugins/imageSrc.mjs +0 -75
- package/dist/runtime/core/utils/resolveRendererContext.d.ts +0 -3
- package/dist/runtime/core/utils/resolveRendererContext.mjs +0 -96
- package/dist/runtime/nitro/utils.d.ts +0 -2
- package/dist/runtime/nitro/utils.mjs +0 -17
- package/dist/runtime/server/assets/inter-latin-ext-400-normal.woff +0 -0
- package/dist/runtime/server/assets/inter-latin-ext-700-normal.woff +0 -0
- /package/dist/client/_nuxt/{error-500.69009e70.css → error-500.SLhS9LVu.css} +0 -0
- /package/dist/runtime/{core/bindings/chromium/node.d.ts → nitro/og-image/bindings/chromium/chrome-launcher.d.ts} +0 -0
- /package/dist/runtime/{core → nitro/og-image}/bindings/resvg/node.d.ts +0 -0
- /package/dist/runtime/{core → nitro/og-image}/bindings/resvg/node.mjs +0 -0
- /package/dist/runtime/{core → nitro/og-image}/bindings/resvg/wasm-fs.d.ts +0 -0
- /package/dist/runtime/{core → nitro/og-image}/bindings/resvg/wasm.d.ts +0 -0
- /package/dist/runtime/{core → nitro/og-image}/bindings/satori/node.d.ts +0 -0
- /package/dist/runtime/{core → nitro/og-image}/bindings/satori/node.mjs +0 -0
- /package/dist/runtime/{core → nitro/og-image}/bindings/satori/wasm-fs.d.ts +0 -0
- /package/dist/runtime/{core → nitro/og-image}/bindings/satori/wasm.d.ts +0 -0
- /package/dist/runtime/{core → nitro/og-image}/bindings/sharp/node.d.ts +0 -0
- /package/dist/runtime/{core → nitro/og-image}/bindings/sharp/node.mjs +0 -0
- /package/dist/runtime/{core/renderers/chromium/index.d.ts → nitro/og-image/chromium/renderer.d.ts} +0 -0
- /package/dist/runtime/{core/renderers/chromium/index.mjs → nitro/og-image/chromium/renderer.mjs} +0 -0
- /package/dist/runtime/{core/renderers → nitro/og-image}/chromium/screenshot.d.ts +0 -0
- /package/dist/runtime/{core/renderers → nitro/og-image}/satori/plugins/emojis.d.ts +0 -0
- /package/dist/runtime/{core/renderers → nitro/og-image}/satori/plugins/emojis.mjs +0 -0
- /package/dist/runtime/{core/renderers → nitro/og-image}/satori/plugins/encoding.d.ts +0 -0
- /package/dist/runtime/{core/renderers → nitro/og-image}/satori/plugins/flex.d.ts +0 -0
- /package/dist/runtime/{core/renderers → nitro/og-image}/satori/plugins/flex.mjs +0 -0
- /package/dist/runtime/{core/renderers → nitro/og-image}/satori/plugins/imageSrc.d.ts +0 -0
- /package/dist/runtime/{core/renderers → nitro/og-image}/satori/plugins/twClasses.d.ts +0 -0
- /package/dist/runtime/{core/renderers → nitro/og-image}/satori/plugins/twClasses.mjs +0 -0
- /package/dist/runtime/{core/renderers → nitro/og-image}/satori/plugins/unocss.d.ts +0 -0
- /package/dist/runtime/{core/renderers → nitro/og-image}/satori/plugins/unocss.mjs +0 -0
- /package/dist/runtime/{core/renderers/satori/index.d.ts → nitro/og-image/satori/renderer.d.ts} +0 -0
- /package/dist/runtime/{core/renderers → nitro/og-image}/satori/utils.d.ts +0 -0
- /package/dist/runtime/{core/renderers → nitro/og-image}/satori/utils.mjs +0 -0
- /package/dist/runtime/{core/renderers → nitro/og-image}/satori/vnodes.d.ts +0 -0
- /package/dist/runtime/{server/routes/__og-image__/font-[name]-[weight].[extension].d.ts → nitro/routes/font.d.ts} +0 -0
- /package/dist/runtime/{server/routes/__og-image__ → nitro/routes}/image.d.ts +0 -0
- /package/dist/runtime/{cache.mjs → nitro/util/cache.mjs} +0 -0
- /package/dist/runtime/{core/utils → nitro/util}/wasm.d.ts +0 -0
- /package/dist/runtime/{core/utils → nitro/util}/wasm.mjs +0 -0
- /package/dist/runtime/{components → nuxt/components}/OgImage/OgImage.mjs +0 -0
- /package/dist/runtime/{components → nuxt/components}/OgImage/OgImageScreenshot.mjs +0 -0
- /package/dist/runtime/{components → nuxt/components}/Templates/Community/BrandedLogo.vue +0 -0
- /package/dist/runtime/{components → nuxt/components}/Templates/Community/Nuxt.vue +0 -0
- /package/dist/runtime/{components → nuxt/components}/Templates/Community/Pergel.vue +0 -0
- /package/dist/runtime/{components → nuxt/components}/Templates/Community/SimpleBlog.vue +0 -0
- /package/dist/runtime/{components → nuxt/components}/Templates/Community/Wave.vue +0 -0
- /package/dist/runtime/{components → nuxt/components}/Templates/Community/WithEmoji.vue +0 -0
- /package/dist/runtime/{composables → nuxt/composables}/defineOgImageComponent.mjs +0 -0
- /package/dist/runtime/{composables → nuxt/composables}/defineOgImageScreenshot.mjs +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Resvg as _Resvg, initWasm } from "@resvg/resvg-wasm";
|
|
2
|
-
import { readWasmFile } from "
|
|
2
|
+
import { readWasmFile } from "../../../util/wasm.mjs";
|
|
3
3
|
export default {
|
|
4
4
|
initWasmPromise: initWasm(readWasmFile("@resvg/resvg-wasm/index_bg.wasm")),
|
|
5
5
|
Resvg: _Resvg
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Resvg as _Resvg, initWasm } from "@resvg/resvg-wasm";
|
|
2
|
-
import { importWasm } from "
|
|
2
|
+
import { importWasm } from "../../../util/wasm.mjs";
|
|
3
3
|
export default {
|
|
4
4
|
initWasmPromise: initWasm(importWasm(import("@resvg/resvg-wasm/index_bg.wasm"))),
|
|
5
5
|
Resvg: _Resvg
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import _satori, { init } from "satori/wasm";
|
|
2
2
|
import initYoga from "yoga-wasm-web";
|
|
3
|
-
import { readWasmFile } from "
|
|
3
|
+
import { readWasmFile } from "../../../util/wasm.mjs";
|
|
4
4
|
const wasm = readWasmFile("yoga-wasm-web/dist/yoga.wasm").then(async (yoga) => await initYoga(yoga));
|
|
5
5
|
export default {
|
|
6
6
|
initWasmPromise: new Promise((resolve) => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import _satori from "satori/wasm";
|
|
2
2
|
import initYoga from "yoga-wasm-web";
|
|
3
3
|
import { init } from "satori";
|
|
4
|
-
import { importWasm } from "
|
|
4
|
+
import { importWasm } from "../../../util/wasm.mjs";
|
|
5
5
|
const wasm = importWasm(import("yoga-wasm-web/dist/yoga.wasm")).then(async (yoga) => await initYoga(yoga));
|
|
6
6
|
export default {
|
|
7
7
|
initWasmPromise: new Promise((resolve) => {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Storage } from 'unstorage';
|
|
2
|
+
import type { OgImageOptions } from '../../types';
|
|
3
|
+
export declare const htmlPayloadCache: Storage<{
|
|
4
|
+
expiresAt: number;
|
|
5
|
+
value: OgImageOptions;
|
|
6
|
+
}>;
|
|
7
|
+
export declare const prerenderOptionsCache: Storage<OgImageOptions> | undefined;
|
|
@@ -4,3 +4,6 @@ export const htmlPayloadCache = createStorage({
|
|
|
4
4
|
// short cache time so we don't need many entries at runtime
|
|
5
5
|
driver: lruCacheDriver({ max: import.meta.prerender ? 1e3 : 50 })
|
|
6
6
|
});
|
|
7
|
+
export const prerenderOptionsCache = import.meta.prerender ? createStorage({
|
|
8
|
+
driver: lruCacheDriver({ max: 1e3 })
|
|
9
|
+
}) : void 0;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { joinURL, withQuery } from "ufo";
|
|
2
|
-
import { useOgImageRuntimeConfig } from "../../../
|
|
2
|
+
import { useOgImageRuntimeConfig } from "../../../shared.mjs";
|
|
3
3
|
import { useNitroOrigin } from "#imports";
|
|
4
4
|
export async function createScreenshot({ basePath, e, options, extension }, browser) {
|
|
5
5
|
const { colorPreference } = useOgImageRuntimeConfig();
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { H3Error, H3Event } from 'h3';
|
|
2
|
+
import type { OgImageOptions, OgImageRenderEventContext } from '../../types';
|
|
3
|
+
export declare function resolvePathCacheKey(e: H3Event, path?: string): string;
|
|
4
|
+
export declare function resolveContext(e: H3Event): Promise<H3Error | OgImageRenderEventContext>;
|
|
5
|
+
export declare function extractAndNormaliseOgImageOptions(html: string): OgImageOptions | false;
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { parseURL, withQuery, withoutLeadingSlash, withoutTrailingSlash } from "ufo";
|
|
2
|
+
import { createError, getQuery } from "h3";
|
|
3
|
+
import { defu } from "defu";
|
|
4
|
+
import { normalizeKey } from "unstorage";
|
|
5
|
+
import { hash } from "ohash";
|
|
6
|
+
import { separateProps, useOgImageRuntimeConfig } from "../../shared.mjs";
|
|
7
|
+
import { createNitroRouteRuleMatcher } from "../util/kit.mjs";
|
|
8
|
+
import { decodeObjectHtmlEntities } from "../util/encoding.mjs";
|
|
9
|
+
import { htmlPayloadCache, prerenderOptionsCache } from "./cache.mjs";
|
|
10
|
+
import { useChromiumRenderer, useSatoriRenderer } from "./instances.mjs";
|
|
11
|
+
import { useNitroApp } from "#internal/nitro";
|
|
12
|
+
export function resolvePathCacheKey(e, path) {
|
|
13
|
+
const siteConfig = e.context.siteConfig.get();
|
|
14
|
+
const basePath = withoutTrailingSlash(withoutLeadingSlash(normalizeKey(path || e.path)));
|
|
15
|
+
return [
|
|
16
|
+
!basePath || basePath === "/" ? "index" : basePath,
|
|
17
|
+
hash([
|
|
18
|
+
basePath,
|
|
19
|
+
siteConfig.url,
|
|
20
|
+
hash(getQuery(e))
|
|
21
|
+
])
|
|
22
|
+
].join(":");
|
|
23
|
+
}
|
|
24
|
+
export async function resolveContext(e) {
|
|
25
|
+
const runtimeConfig = useOgImageRuntimeConfig();
|
|
26
|
+
const path = parseURL(e.path).pathname;
|
|
27
|
+
const extension = path.split(".").pop();
|
|
28
|
+
if (!extension) {
|
|
29
|
+
return createError({
|
|
30
|
+
statusCode: 400,
|
|
31
|
+
statusMessage: `[Nuxt OG Image] Missing OG Image type.`
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
if (!["png", "jpeg", "jpg", "svg", "html", "json"].includes(extension)) {
|
|
35
|
+
return createError({
|
|
36
|
+
statusCode: 400,
|
|
37
|
+
statusMessage: `[Nuxt OG Image] Unknown OG Image type ${extension}.`
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
let queryParams = { ...getQuery(e) };
|
|
41
|
+
queryParams.props = JSON.parse(queryParams.props || "{}");
|
|
42
|
+
queryParams = separateProps(queryParams);
|
|
43
|
+
let basePath = withoutTrailingSlash(
|
|
44
|
+
path.replace(`/__og-image__/image`, "").replace(`/og.${extension}`, "")
|
|
45
|
+
);
|
|
46
|
+
if (queryParams._query)
|
|
47
|
+
basePath = withQuery(basePath, JSON.parse(queryParams._query));
|
|
48
|
+
const isDebugJsonPayload = extension === "json" && runtimeConfig.debug;
|
|
49
|
+
const key = resolvePathCacheKey(e, basePath);
|
|
50
|
+
let options = queryParams.options;
|
|
51
|
+
if (!options) {
|
|
52
|
+
if (import.meta.prerender)
|
|
53
|
+
options = await prerenderOptionsCache?.getItem(key);
|
|
54
|
+
if (!options) {
|
|
55
|
+
const payload = await fetchPathHtmlAndExtractOptions(e, basePath, key);
|
|
56
|
+
if (payload instanceof Error)
|
|
57
|
+
return payload;
|
|
58
|
+
options = payload;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
delete queryParams.options;
|
|
62
|
+
const routeRuleMatcher = createNitroRouteRuleMatcher();
|
|
63
|
+
const routeRules = routeRuleMatcher(basePath);
|
|
64
|
+
if (typeof routeRules.ogImage === "undefined" && !options) {
|
|
65
|
+
return createError({
|
|
66
|
+
statusCode: 400,
|
|
67
|
+
statusMessage: "The route is missing the Nuxt OG Image payload or route rules."
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
const ogImageRouteRules = separateProps(routeRules.ogImage);
|
|
71
|
+
options = defu(queryParams, ogImageRouteRules, options, runtimeConfig.defaults);
|
|
72
|
+
if (!options) {
|
|
73
|
+
return createError({
|
|
74
|
+
statusCode: 404,
|
|
75
|
+
statusMessage: "[Nuxt OG Image] OG Image not found."
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
let renderer;
|
|
79
|
+
switch (options.renderer) {
|
|
80
|
+
case "satori":
|
|
81
|
+
renderer = await useSatoriRenderer();
|
|
82
|
+
break;
|
|
83
|
+
case "chromium":
|
|
84
|
+
renderer = await useChromiumRenderer();
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
if (!renderer || renderer.__unenv__) {
|
|
88
|
+
throw createError({
|
|
89
|
+
statusCode: 400,
|
|
90
|
+
statusMessage: `[Nuxt OG Image] Renderer ${options.renderer} is missing.`
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
const ctx = {
|
|
94
|
+
e,
|
|
95
|
+
key,
|
|
96
|
+
renderer,
|
|
97
|
+
isDebugJsonPayload,
|
|
98
|
+
extension,
|
|
99
|
+
basePath,
|
|
100
|
+
options,
|
|
101
|
+
_nitro: useNitroApp()
|
|
102
|
+
};
|
|
103
|
+
await ctx._nitro.hooks.callHook("nuxt-og-image:context", ctx);
|
|
104
|
+
return ctx;
|
|
105
|
+
}
|
|
106
|
+
export function extractAndNormaliseOgImageOptions(html) {
|
|
107
|
+
const htmlPayload = html.match(/<script.+id="nuxt-og-image-options"[^>]*>(.+?)<\/script>/)?.[1];
|
|
108
|
+
if (!htmlPayload)
|
|
109
|
+
return false;
|
|
110
|
+
let options;
|
|
111
|
+
try {
|
|
112
|
+
const payload2 = JSON.parse(htmlPayload);
|
|
113
|
+
Object.entries(payload2).forEach(([key, value]) => {
|
|
114
|
+
if (!value)
|
|
115
|
+
delete payload2[key];
|
|
116
|
+
});
|
|
117
|
+
options = payload2;
|
|
118
|
+
} catch (e) {
|
|
119
|
+
if (import.meta.dev)
|
|
120
|
+
console.warn("Failed to parse #nuxt-og-image-options", e, options);
|
|
121
|
+
}
|
|
122
|
+
if (!options)
|
|
123
|
+
return false;
|
|
124
|
+
const description = html.match(/<meta[^>]+name="description"[^>]*>/)?.[0];
|
|
125
|
+
if (description) {
|
|
126
|
+
const [, content] = description.match(/content="([^"]+)"/) || [];
|
|
127
|
+
if (content && !options.props.description)
|
|
128
|
+
options.props.description = content;
|
|
129
|
+
}
|
|
130
|
+
const payload = decodeObjectHtmlEntities(options);
|
|
131
|
+
if (import.meta.dev) {
|
|
132
|
+
const socialPreview = {};
|
|
133
|
+
const socialMetaTags = html.match(/<meta[^>]+(property|name)="(twitter|og):([^"]+)"[^>]*>/g);
|
|
134
|
+
if (socialMetaTags) {
|
|
135
|
+
socialMetaTags.forEach((tag) => {
|
|
136
|
+
const [, , type, key] = tag.match(/(property|name)="(twitter|og):([^"]+)"/);
|
|
137
|
+
const value = tag.match(/content="([^"]+)"/)?.[1];
|
|
138
|
+
if (!value)
|
|
139
|
+
return;
|
|
140
|
+
if (!socialPreview[type])
|
|
141
|
+
socialPreview[type] = {};
|
|
142
|
+
socialPreview[type][key] = value;
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
payload.socialPreview = socialPreview;
|
|
146
|
+
}
|
|
147
|
+
return payload;
|
|
148
|
+
}
|
|
149
|
+
async function fetchPathHtmlAndExtractOptions(e, path, key) {
|
|
150
|
+
const cachedHtmlPayload = await htmlPayloadCache.getItem(key);
|
|
151
|
+
if (cachedHtmlPayload && cachedHtmlPayload.expiresAt < Date.now())
|
|
152
|
+
return cachedHtmlPayload.value;
|
|
153
|
+
let html;
|
|
154
|
+
try {
|
|
155
|
+
html = await e.$fetch(path);
|
|
156
|
+
} catch (err) {
|
|
157
|
+
return createError({
|
|
158
|
+
statusCode: 500,
|
|
159
|
+
statusMessage: `[Nuxt OG Image] Failed to read the path ${path} for og-image extraction. ${err.message}.`
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
if (typeof html !== "string") {
|
|
163
|
+
return createError({
|
|
164
|
+
statusCode: 500,
|
|
165
|
+
statusMessage: `[Nuxt OG Image] Got invalid response from ${path} for og-image extraction.`
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
const payload = extractAndNormaliseOgImageOptions(html);
|
|
169
|
+
if (payload) {
|
|
170
|
+
await htmlPayloadCache.setItem(key, {
|
|
171
|
+
// 60 minutes for prerender, 10 seconds for runtime
|
|
172
|
+
expiresAt: Date.now() + 1e3 * (import.meta.prerender ? 60 * 60 : 10),
|
|
173
|
+
value: payload
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
return payload;
|
|
177
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
const satoriRendererInstance = { instance: void 0 };
|
|
2
|
+
const chromiumRendererInstance = { instance: void 0 };
|
|
3
|
+
export async function useSatoriRenderer() {
|
|
4
|
+
satoriRendererInstance.instance = satoriRendererInstance.instance || await import("#nuxt-og-image/renderers/satori").then((m) => m.default);
|
|
5
|
+
return satoriRendererInstance.instance;
|
|
6
|
+
}
|
|
7
|
+
export async function useChromiumRenderer() {
|
|
8
|
+
chromiumRendererInstance.instance = chromiumRendererInstance.instance || await import("#nuxt-og-image/renderers/chromium").then((m) => m.default);
|
|
9
|
+
return chromiumRendererInstance.instance;
|
|
10
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { OgImageRenderEventContext, ResolvedFontConfig } from '
|
|
1
|
+
import type { OgImageRenderEventContext, ResolvedFontConfig } from '../../../types';
|
|
2
2
|
export declare function loadFont({ e }: OgImageRenderEventContext, font: ResolvedFontConfig): Promise<ResolvedFontConfig>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { setHeader } from "h3";
|
|
2
|
+
import { prefixStorage } from "unstorage";
|
|
3
|
+
import { getExtension } from "../../../pure.mjs";
|
|
4
|
+
import { useNitroOrigin, useStorage } from "#imports";
|
|
5
|
+
const assets = prefixStorage(useStorage(), "/assets");
|
|
6
|
+
export async function loadFont({ e }, font) {
|
|
7
|
+
const { name, weight } = font;
|
|
8
|
+
if (font.data)
|
|
9
|
+
return font;
|
|
10
|
+
if (font.key && await assets.hasItem(font.key)) {
|
|
11
|
+
setHeader(e, "Content-Type", `font/${getExtension(font.path)}`);
|
|
12
|
+
const fontData = await assets.getItemRaw(font.key);
|
|
13
|
+
font.data = Buffer.from(fontData, "base64");
|
|
14
|
+
return font;
|
|
15
|
+
}
|
|
16
|
+
let data;
|
|
17
|
+
if (font.path) {
|
|
18
|
+
data = await e.$fetch(font.path, {
|
|
19
|
+
baseURL: useNitroOrigin(e),
|
|
20
|
+
responseType: "arrayBuffer"
|
|
21
|
+
});
|
|
22
|
+
} else {
|
|
23
|
+
data = await e.$fetch(`/__og-image__/font/${name}/${weight}.ttf`, {
|
|
24
|
+
responseType: "arrayBuffer",
|
|
25
|
+
query: {
|
|
26
|
+
font
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
font.data = data;
|
|
31
|
+
return font;
|
|
32
|
+
}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import type _satori from 'satori';
|
|
2
|
-
export declare function useSatoriRenderer(): Promise<import("../../../types").Renderer>;
|
|
3
|
-
export declare function useChromiumRenderer(): Promise<import("../../../types").Renderer>;
|
|
4
2
|
export declare function useResvg(): Promise<new (svg: string | Uint8Array, options?: import("@resvg/resvg-wasm").ResvgRenderOptions | undefined) => {
|
|
5
3
|
free(): void;
|
|
6
4
|
render(): {
|
|
@@ -2,16 +2,6 @@ const cssInlineInstance = { instance: void 0 };
|
|
|
2
2
|
const sharpInstance = { instance: void 0 };
|
|
3
3
|
const resvgInstance = { instance: void 0 };
|
|
4
4
|
const satoriInstance = { instance: void 0 };
|
|
5
|
-
const satoriRendererInstance = { instance: void 0 };
|
|
6
|
-
const chromiumRendererInstance = { instance: void 0 };
|
|
7
|
-
export async function useSatoriRenderer() {
|
|
8
|
-
satoriRendererInstance.instance = satoriRendererInstance.instance || await import("#nuxt-og-image/renderers/satori").then((m) => m.default);
|
|
9
|
-
return satoriRendererInstance.instance;
|
|
10
|
-
}
|
|
11
|
-
export async function useChromiumRenderer() {
|
|
12
|
-
chromiumRendererInstance.instance = chromiumRendererInstance.instance || await import("#nuxt-og-image/renderers/chromium").then((m) => m.default);
|
|
13
|
-
return chromiumRendererInstance.instance;
|
|
14
|
-
}
|
|
15
5
|
export async function useResvg() {
|
|
16
6
|
resvgInstance.instance = resvgInstance.instance || await import("#nuxt-og-image/bindings/resvg").then((m) => m.default);
|
|
17
7
|
await resvgInstance.instance.initWasmPromise;
|
|
@@ -28,5 +18,6 @@ export async function useSharp() {
|
|
|
28
18
|
}
|
|
29
19
|
export async function useCssInline() {
|
|
30
20
|
cssInlineInstance.instance = cssInlineInstance.instance || await import("#nuxt-og-image/bindings/css-inline").then((m) => m.default);
|
|
31
|
-
|
|
21
|
+
await cssInlineInstance.instance.initWasmPromise;
|
|
22
|
+
return cssInlineInstance.instance.cssInline;
|
|
32
23
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { defineSatoriTransformer } from "../utils.mjs";
|
|
2
|
+
import { decodeHtml } from "../../../util/encoding.mjs";
|
|
3
|
+
export default defineSatoriTransformer([
|
|
4
|
+
// clean up
|
|
5
|
+
{
|
|
6
|
+
filter: (node) => node.props?.["data-v-inspector"],
|
|
7
|
+
transform: async (node) => {
|
|
8
|
+
delete node.props["data-v-inspector"];
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
filter: (node) => typeof node.props?.children === "string",
|
|
13
|
+
transform: async (node) => {
|
|
14
|
+
node.props.children = decodeHtml(node.props.children);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
]);
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { withBase } from "ufo";
|
|
2
|
+
import sizeOf from "image-size";
|
|
3
|
+
import { defineSatoriTransformer } from "../utils.mjs";
|
|
4
|
+
import { toBase64Image } from "../../../../pure.mjs";
|
|
5
|
+
import { useNitroOrigin, useStorage } from "#imports";
|
|
6
|
+
export default defineSatoriTransformer([
|
|
7
|
+
// fix <img src="">
|
|
8
|
+
{
|
|
9
|
+
filter: (node) => node.type === "img" && node.props?.src,
|
|
10
|
+
transform: async (node, { e }) => {
|
|
11
|
+
const src = node.props.src;
|
|
12
|
+
const isRelative = src.startsWith("/");
|
|
13
|
+
let dimensions;
|
|
14
|
+
let imageBuffer;
|
|
15
|
+
if (isRelative) {
|
|
16
|
+
if (import.meta.prerender || import.meta.dev) {
|
|
17
|
+
const key = `root:public${src.replace("./", ":").replace("/", ":")}`;
|
|
18
|
+
if (await useStorage().hasItem(key))
|
|
19
|
+
imageBuffer = await useStorage().getItemRaw(key);
|
|
20
|
+
} else {
|
|
21
|
+
imageBuffer = await e.$fetch(src, {
|
|
22
|
+
baseURL: useNitroOrigin(e),
|
|
23
|
+
responseType: "arrayBuffer"
|
|
24
|
+
}).catch(() => {
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
} else {
|
|
28
|
+
imageBuffer = await $fetch(src, {
|
|
29
|
+
responseType: "arrayBuffer"
|
|
30
|
+
}).catch(() => {
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
if (imageBuffer)
|
|
34
|
+
imageBuffer = Buffer.from(imageBuffer);
|
|
35
|
+
if (imageBuffer) {
|
|
36
|
+
node.props.src = toBase64Image(src, imageBuffer);
|
|
37
|
+
try {
|
|
38
|
+
const imageSize = sizeOf(imageBuffer);
|
|
39
|
+
dimensions = { width: imageSize.width, height: imageSize.height };
|
|
40
|
+
} catch (e2) {
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (dimensions?.width && dimensions?.height) {
|
|
44
|
+
const naturalAspectRatio = dimensions.width / dimensions.height;
|
|
45
|
+
if (node.props.width && !node.props.height) {
|
|
46
|
+
node.props.height = Math.round(node.props.width / naturalAspectRatio);
|
|
47
|
+
} else if (node.props.height && !node.props.width) {
|
|
48
|
+
node.props.width = Math.round(node.props.height * naturalAspectRatio);
|
|
49
|
+
} else if (!node.props.width && !node.props.height) {
|
|
50
|
+
node.props.width = dimensions.width;
|
|
51
|
+
node.props.height = dimensions.height;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (node.props.src.startsWith("/")) {
|
|
55
|
+
node.props.src = `${withBase(src, `${useNitroOrigin(e)}`)}?${Date.now()}`;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
// fix style="background-image: url('')"
|
|
60
|
+
{
|
|
61
|
+
filter: (node) => node.props?.style?.backgroundImage?.includes("url("),
|
|
62
|
+
transform: async (node, { e }) => {
|
|
63
|
+
const backgroundImage = node.props.style.backgroundImage;
|
|
64
|
+
const src = backgroundImage.replace(/^url\(['"]?/, "").replace(/['"]?\)$/, "");
|
|
65
|
+
const isRelative = src?.startsWith("/");
|
|
66
|
+
if (isRelative) {
|
|
67
|
+
if (import.meta.prerender || import.meta.dev) {
|
|
68
|
+
const key = `root:public${src.replace("./", ":").replace("/", ":")}`;
|
|
69
|
+
if (await useStorage().hasItem(key)) {
|
|
70
|
+
const imageBuffer = await useStorage().getItemRaw(key);
|
|
71
|
+
if (imageBuffer) {
|
|
72
|
+
const base64 = toBase64Image(src, Buffer.from(imageBuffer));
|
|
73
|
+
node.props.style.backgroundImage = `url(${base64})`;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
} else {
|
|
77
|
+
node.props.style.backgroundImage = `url(${withBase(src, `${useNitroOrigin(e)}`)}?${Date.now()})`;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
]);
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { defu } from "defu";
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
2
|
+
import { createStorage } from "unstorage";
|
|
3
|
+
import lruCacheDriver from "unstorage/drivers/lru-cache";
|
|
4
|
+
import { normaliseFontInput, useOgImageRuntimeConfig } from "../../../shared.mjs";
|
|
5
|
+
import { loadFont } from "./font.mjs";
|
|
5
6
|
import { createVNodes } from "./vnodes.mjs";
|
|
6
7
|
import { useResvg, useSatori, useSharp } from "./instances.mjs";
|
|
7
8
|
import { theme } from "#nuxt-og-image/unocss-config.mjs";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const
|
|
9
|
+
const fontPromises = {};
|
|
10
|
+
const fontCache = createStorage({
|
|
11
|
+
driver: lruCacheDriver({ max: 10 })
|
|
12
|
+
});
|
|
13
|
+
async function resolveFonts(event) {
|
|
14
|
+
const { fonts } = useOgImageRuntimeConfig();
|
|
15
|
+
const normalisedFonts = normaliseFontInput([...event.options.fonts || [], ...fonts]);
|
|
14
16
|
const localFontPromises = [];
|
|
15
17
|
const preloadedFonts = [];
|
|
16
18
|
for (const font of normalisedFonts) {
|
|
@@ -29,16 +31,27 @@ export async function createSvg(event) {
|
|
|
29
31
|
}
|
|
30
32
|
}
|
|
31
33
|
const awaitedFonts = await Promise.all(localFontPromises);
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
return [...preloadedFonts, ...awaitedFonts].map((_f) => {
|
|
35
|
+
return { name: _f.name, data: _f.data, style: _f.style, weight: Number(_f.weight) };
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
export async function createSvg(event) {
|
|
39
|
+
const { options } = event;
|
|
40
|
+
const { satoriOptions: _satoriOptions } = useOgImageRuntimeConfig();
|
|
41
|
+
const [satori, vnodes, fonts] = await Promise.all([
|
|
42
|
+
useSatori(),
|
|
43
|
+
createVNodes(event),
|
|
44
|
+
resolveFonts(event)
|
|
45
|
+
]);
|
|
46
|
+
await event._nitro.hooks.callHook("nuxt-og-image:satori:vnodes", vnodes, event);
|
|
47
|
+
const satoriOptions = defu(options.satori, _satoriOptions, {
|
|
48
|
+
fonts,
|
|
37
49
|
tailwindConfig: { theme },
|
|
38
50
|
embedFont: true,
|
|
39
51
|
width: options.width,
|
|
40
52
|
height: options.height
|
|
41
|
-
})
|
|
53
|
+
});
|
|
54
|
+
return satori(vnodes, satoriOptions);
|
|
42
55
|
}
|
|
43
56
|
async function createPng(event) {
|
|
44
57
|
const { resvgOptions } = useOgImageRuntimeConfig();
|
package/dist/runtime/{core/html/applyEmojis.d.ts → nitro/og-image/satori/transforms/emojis.d.ts}
RENAMED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
import type { NuxtIslandResponse } from 'nuxt/dist/core/runtime/nitro/renderer';
|
|
2
|
-
import type {
|
|
2
|
+
import type { Storage } from 'unstorage';
|
|
3
|
+
import type { OgImageRenderEventContext } from '../../../../types';
|
|
4
|
+
export declare const emojiCache: Storage<string>;
|
|
3
5
|
export declare function applyEmojis(ctx: OgImageRenderEventContext, island: NuxtIslandResponse): Promise<string | boolean>;
|
package/dist/runtime/{core/html/applyEmojis.mjs → nitro/og-image/satori/transforms/emojis.mjs}
RENAMED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import defaultCharMap from "@iconify-json/noto/chars.json";
|
|
2
|
-
import {
|
|
2
|
+
import { createStorage } from "unstorage";
|
|
3
|
+
import lruCacheDriver from "unstorage/drivers/lru-cache";
|
|
4
|
+
export const emojiCache = createStorage({
|
|
5
|
+
driver: lruCacheDriver({ max: 1e3 })
|
|
6
|
+
});
|
|
3
7
|
const RE_MATCH_EMOJIS = /[#*0-9]\uFE0F?\u20E3|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]\uFE0F?|[\u261D\u270C\u270D](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?|[\u270A\u270B](?:\uD83C[\uDFFB-\uDFFF])?|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2795-\u2797\u27B0\u27BF\u2B50]|\u26D3\uFE0F?(?:\u200D\uD83D\uDCA5)?|\u26F9(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|\u2764\uFE0F?(?:\u200D(?:\uD83D\uDD25|\uD83E\uDE79))?|\uD83C(?:[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]\uFE0F?|[\uDF85\uDFC2\uDFC7](?:\uD83C[\uDFFB-\uDFFF])?|[\uDFC4\uDFCA](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDFCB\uDFCC](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF43\uDF45-\uDF4A\uDF4C-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF]|\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uDDFC\uD83C[\uDDEB\uDDF8]|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C[\uDDEA\uDDF9]|\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uDF44(?:\u200D\uD83D\uDFEB)?|\uDF4B(?:\u200D\uD83D\uDFE9)?|\uDFC3(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDFF3\uFE0F?(?:\u200D(?:\u26A7\uFE0F?|\uD83C\uDF08))?|\uDFF4(?:\u200D\u2620\uFE0F?|\uDB40\uDC67\uDB40\uDC62\uDB40(?:\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDC73\uDB40\uDC63\uDB40\uDC74|\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F)?)|\uD83D(?:[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]\uFE0F?|[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC](?:\uD83C[\uDFFB-\uDFFF])?|[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4\uDEB5](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD74\uDD90](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?|[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC25\uDC27-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE41\uDE43\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEDC-\uDEDF\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB\uDFF0]|\uDC08(?:\u200D\u2B1B)?|\uDC15(?:\u200D\uD83E\uDDBA)?|\uDC26(?:\u200D(?:\u2B1B|\uD83D\uDD25))?|\uDC3B(?:\u200D\u2744\uFE0F?)?|\uDC41\uFE0F?(?:\u200D\uD83D\uDDE8\uFE0F?)?|\uDC68(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE])))?))?|\uDC69(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?[\uDC68\uDC69]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFE])))?))?|\uDC6F(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDD75(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDE2E(?:\u200D\uD83D\uDCA8)?|\uDE35(?:\u200D\uD83D\uDCAB)?|\uDE36(?:\u200D\uD83C\uDF2B\uFE0F?)?|\uDE42(?:\u200D[\u2194\u2195]\uFE0F?)?|\uDEB6(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?)|\uD83E(?:[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF8](?:\uD83C[\uDFFB-\uDFFF])?|[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD\uDDCF\uDDD4\uDDD6-\uDDDD](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDDDE\uDDDF](?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD0D\uDD0E\uDD10-\uDD17\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCC\uDDD0\uDDE0-\uDDFF\uDE70-\uDE7C\uDE80-\uDE88\uDE90-\uDEBD\uDEBF-\uDEC2\uDECE-\uDEDB\uDEE0-\uDEE8]|\uDD3C(?:\u200D[\u2640\u2642]\uFE0F?|\uD83C[\uDFFB-\uDFFF])?|\uDDCE(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDDD1(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1|\uDDD1\u200D\uD83E\uDDD2(?:\u200D\uD83E\uDDD2)?|\uDDD2(?:\u200D\uD83E\uDDD2)?))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?))?|\uDEF1(?:\uD83C(?:\uDFFB(?:\u200D\uD83E\uDEF2\uD83C[\uDFFC-\uDFFF])?|\uDFFC(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFD-\uDFFF])?|\uDFFD(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])?|\uDFFE(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFD\uDFFF])?|\uDFFF(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFE])?))?)/g;
|
|
4
8
|
export async function applyEmojis(ctx, island) {
|
|
5
9
|
const html = island.html;
|
|
@@ -15,7 +19,7 @@ export async function applyEmojis(ctx, island) {
|
|
|
15
19
|
if (await emojiCache.hasItem(key))
|
|
16
20
|
svg = await emojiCache.getItem(key);
|
|
17
21
|
if (!svg) {
|
|
18
|
-
svg = await
|
|
22
|
+
svg = await $fetch(`https://api.iconify.design/${ctx.options.emojis}/${emoji}.svg`, {
|
|
19
23
|
responseType: "text"
|
|
20
24
|
});
|
|
21
25
|
if (svg === "404")
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { NuxtIslandResponse } from 'nuxt/dist/core/runtime/nitro/renderer';
|
|
2
|
-
import type { OgImageRenderEventContext } from '
|
|
2
|
+
import type { OgImageRenderEventContext } from '../../../../types';
|
|
3
3
|
export declare function applyInlineCss({ e }: OgImageRenderEventContext, island: NuxtIslandResponse): Promise<boolean>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { useCssInline } from "../instances.mjs";
|
|
2
|
+
import { useNitroOrigin } from "#imports";
|
|
3
|
+
import cssInline from "#nuxt-og-image/bindings/css-inline";
|
|
4
|
+
export async function applyInlineCss({ e }, island) {
|
|
5
|
+
let html = island.html;
|
|
6
|
+
if (!cssInline.__unenv__) {
|
|
7
|
+
let css = island.head.style.map((s) => s.innerHTML).join("\n");
|
|
8
|
+
const componentInlineStyles = island.head.link.filter((l) => l.href.startsWith("/_nuxt/components"));
|
|
9
|
+
if (process.dev) {
|
|
10
|
+
const linksToCss = componentInlineStyles.length ? (await Promise.all(
|
|
11
|
+
componentInlineStyles.map((l) => {
|
|
12
|
+
const url = l.href.endsWith("lang.css") ? `${l.href}&hmr=false` : l.href;
|
|
13
|
+
return e.$fetch(url, {
|
|
14
|
+
responseType: "text",
|
|
15
|
+
baseURL: useNitroOrigin(e)
|
|
16
|
+
}).then((res) => {
|
|
17
|
+
if (res.includes("__vite__css"))
|
|
18
|
+
return res.match(/__vite__css = "([^"]+)"/)?.[1];
|
|
19
|
+
return res.trim().split("\n").filter((l2) => !l2.startsWith("//")).join("\n").trim();
|
|
20
|
+
});
|
|
21
|
+
})
|
|
22
|
+
)).join("\n") : "";
|
|
23
|
+
css = `${linksToCss}${css}`;
|
|
24
|
+
}
|
|
25
|
+
if (!css.trim().length)
|
|
26
|
+
return false;
|
|
27
|
+
const cssInline2 = await useCssInline();
|
|
28
|
+
html = cssInline2.inline(island.html, {
|
|
29
|
+
loadRemoteStylesheets: false,
|
|
30
|
+
extraCss: css
|
|
31
|
+
});
|
|
32
|
+
const classes = css.match(/\.([a-zA-Z0-9-_]+)/g)?.map((c) => c.replace(".", ""));
|
|
33
|
+
if (classes)
|
|
34
|
+
html = html.replace(new RegExp(`class="(${classes.join("|")})"`, "g"), "");
|
|
35
|
+
island.html = html;
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
return false;
|
|
39
|
+
}
|