next-api-og-image-sparticuz
Version:
Easy way to generate open-graph images dynamically using Next.js API Routes.
3 lines (2 loc) • 3.86 kB
JavaScript
import{renderToStaticMarkup as e}from"react-dom/server";import t from"is-lambda";import r from"os";import o from"deepmerge";import n from"twemoji";import a from"@sparticuz/chromium";import s from"puppeteer-core";function i(){return i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},i.apply(this,arguments)}const c=["body","query"];function l(r){r=o({strategy:"query",cacheControl:"max-age 3600, must-revalidate",width:1200,height:630,type:"png",quality:90,hook:null,chrome:{args:null,executable:null},dev:{inspectHtml:!0,errorsInResponse:!0}},r);const{template:{html:l,react:h},cacheControl:d,strategy:g,type:y,width:f,hook:w,height:b,quality:v,chrome:{args:x,executable:C},dev:{inspectHtml:q,errorsInResponse:E}}=r;if(l&&h)throw new Error("Ambigious template provided. You must provide either `html` or `react` template.");if(!l&&!h)throw new Error("No template was provided.");const O=process.env.NODE_ENV,P=function(...e){return async function(){return await e.reduce(async(e,t)=>await t(await e),Promise.resolve({envMode:process.env.NODE_ENV}))}}(m,(j={width:f,height:b},N={args:x,executable:C},async function(e){const{page:r,envMode:o,executable:n}=e;if(r)return i({},e,{page:r});const c=await async function(e,r,o){var n,s,i;return u(e)?t?{args:a.args,executablePath:p,headless:a.headless}:{args:null!=(i=null==o?void 0:o.args)?i:[],executablePath:p,headless:!0}:{args:null!=(n=null==o?void 0:o.args)?n:[],executablePath:null!=(s=null==o?void 0:o.executable)?s:r,headless:!0}}(o,n,N),l=await s.launch(c),m=await l.newPage();return await m.setViewport(j),i({},e,{page:m})}),function({inspectHtml:e,type:t,quality:r}){return function(o){const{page:n,envMode:a}=o;return i({},o,{createImage:async function(o){return await n.setContent(o),!u(a)&&e?await n.content():await n.screenshot(i({type:t,encoding:"binary"},"jpeg"===t?{quality:r}:null))}})}}({inspectHtml:q,type:y,quality:v}));var j,N;return async function(t,r){!function(e,t,r,o){const n={body:()=>{const{method:e,headers:{"content-type":n}}=r;if("POST"!==e&&"application/json"!==n){const r=`Strategy is set to \`body\` so parameters must be passed by POST request and JSON payload. Current method: ${e} and current content type: ${n}`;throw t&&o.json({message:r}),new Error(r)}},query:()=>{const{method:e}=r;if("GET"!==e){const r=`Strategy is set to \`query\` so parameters must be passed by GET request and query params. Current method: ${e}`;throw t&&o.json({message:r}),new Error(r)}}}[e];if(!n)throw new Error(`Unknown strategy provided. Possible values: ${c}`);n()}(g,!u(O)&&E,t,r);const o=JSON.parse(JSON.stringify("query"===g?t.query:t.body,(e,t)=>t&&"object"==typeof t?t:`${t}`)),a=await P(),s=l&&!h?await l(i({},o)):e(await h(i({},o))),m=await a.createImage(function(e){return`<style>\n .emoji {\n height: 1em;\n width: 1em;\n margin: 0 .05em 0 .1em;\n vertical-align: -0.1em;\n }\n </style>${n.parse(e,{folder:"svg",ext:".svg"})}`}(s));if(w){const e=i({},t,{image:m}),o=await w(e);if(o)for(const[e,t]of o.entries())r.setHeader(e,t)}r.setHeader("Content-Type",!u(O)&&q?"text/html":y?`image/${y}`:"image/png"),r.setHeader("Cache-Control",d),r.write(m),r.end()}}function u(e){return"production"===e||"staging"===e}function m(e){let t=null;return t="win32"===process.platform?["arm64","ppc64","x64","s390x"].includes(r.arch())?"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe":"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe":"linux"===process.platform?"/usr/bin/google-chrome":"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",i({},e,{executable:t})}const p="/opt/nodejs/node_modules/@sparticuz/chromium/bin/chromium.br";export{l as withOGImage};
//# sourceMappingURL=next-api-og-image-sparticuz.modern.js.map