@smart-cloud/publisher-exporter 1.1.66 → 1.1.67

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.
@@ -1,5 +1,5 @@
1
- import {S3Client,HeadObjectCommand,CopyObjectCommand,DeleteObjectsCommand,PutObjectCommand,GetObjectCommand}from'@aws-sdk/client-s3';import {request,chromium}from'playwright';import {createHash}from'crypto';import {lookup}from'dns/promises';import {isIP}from'net';import M from'path';import'fast-glob';import'fs/promises';import'os';import'worker_threads';import {DynamoDBClient,UpdateItemCommand}from'@aws-sdk/client-dynamodb';var k=1,le=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function T(e,t){let r=String(e??"").trim();if(!le.test(r))throw new Error(`${t} must match ${le.source} and be at most 128 characters.`);return r}function j(e){let t=String(e??"").trim().replace(/^\/+|\/+$/g,"");if(!t)return "";let r=t.split("/").filter(Boolean);if(r.some(o=>o==="."||o===".."))throw new Error("S3 prefix contains an unsafe dot path segment.");return `${r.join("/")}/`}function x(e,...t){let r=j(e),o=t.map((n,s)=>{let a=String(n??"").replace(/^\/+|\/+$/g,"");if(!a||a.split("/").some(i=>i==="."||i===".."))throw new Error(`Unsafe S3 key segment at index ${s}.`);return a});return `${r}${o.join("/")}`}function _(e,t,r){return `${x(e,"jobs",T(t,"jobId"),"tasks",T(r,"taskId"))}/`}function V(e){return createHash("sha256").update(e).digest("hex")}function I(e,t){let r=String(e??"").replace(/^\/+/,""),o=j(t);if(!r||r.includes("\0"))throw new Error("S3 object key is empty or invalid.");if(o&&!r.startsWith(o))throw new Error(`S3 object key is outside the configured workspace prefix: ${r}`);if(r.split("/").some(n=>n===".."))throw new Error("S3 object key contains an unsafe parent segment.");return r}function P(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`${t} must be a JSON object.`);return e}function h(e,t){if(typeof e!="string"||!e.trim())throw new Error(`${t} must be a non-empty string.`);return e.trim()}function E(e,t,r,o){if(!Number.isInteger(e)||Number(e)<r||Number(e)>o)throw new Error(`${t} must be an integer between ${r} and ${o}.`);return Number(e)}function Ae(e){return e.hostname.replace(/^\[|\]$/g,"").replace(/\.$/,"").toLowerCase()}function q(e){let t=e.split(".");if(t.length!==4)return null;let r=t.map(o=>Number(o));return r.every((o,n)=>Number.isInteger(o)&&o>=0&&o<=255&&String(o)===t[n])?r:null}function Z(e){let t=e.toLowerCase();if(t.includes("%")||t.split("::").length>2)return null;let r=t,o=r.lastIndexOf(":");if(r.includes(".")&&o>=0){let l=q(r.slice(o+1));if(!l)return null;r=`${r.slice(0,o)}:${((l[0]??0)*256+(l[1]??0)).toString(16)}:${((l[2]??0)*256+(l[3]??0)).toString(16)}`;}let[n,s]=r.split("::"),a=n?n.split(":"):[],i=s?s.split(":"):[],c=r.includes("::"),d=8-a.length-i.length;return c&&d<1||!c&&d!==0||[...a,...i].some(l=>!/^[0-9a-f]{1,4}$/.test(l))?null:[...a.map(l=>Number.parseInt(l,16)),...Array.from({length:d},()=>0),...i.map(l=>Number.parseInt(l,16))]}function ce(e){let t=q(e);if(!t)return "an invalid IPv4 address";let[r=0,o=0,n=0,s=0]=t;return r===0?"the unspecified/current-network IPv4 range":r===10||r===172&&o>=16&&o<=31||r===192&&o===168?"an RFC1918 private IPv4 range":r===127?"the IPv4 loopback range":r===169&&o===254?"the IPv4 link-local/metadata range":r===100&&o===100&&n===100&&s===200?"a cloud instance metadata endpoint":r===100&&o>=64&&o<=127?"the shared carrier-grade NAT IPv4 range":r===198&&(o===18||o===19)?"the IPv4 benchmarking range":r>=224&&r<=239?"the IPv4 multicast range":r>=240?"the reserved IPv4 range":null}function We(e){let t=Z(e);if(!t||t.length!==8)return "an invalid IPv6 address";if(t.every(n=>n===0))return "the unspecified IPv6 address";if(t.slice(0,7).every(n=>n===0)&&t[7]===1)return "the IPv6 loopback address";let r=t[0]??0;if((r&65024)===64512)return "an IPv6 unique-local range";if((r&65472)===65152)return "the IPv6 link-local range";if((r&65280)===65280)return "the IPv6 multicast range";if(t.slice(0,5).every(n=>n===0)&&t[5]===65535){let n=t[6]??0,s=t[7]??0;return ce(`${n>>8}.${n&255}.${s>>8}.${s&255}`)}return null}function Q(e){return q(e)?ce(e):Z(e)?We(e):"an invalid IP address"}function C(e,t){let r=h(e,t),o;try{o=new URL(r);}catch{throw new Error(`${t} must be a valid URL.`)}if(o.protocol!=="http:"&&o.protocol!=="https:")throw new Error(`${t} must use HTTP or HTTPS.`);if(o.username||o.password)throw new Error(`${t} must not contain URL credentials.`);let n=Ae(o);if(!n)throw new Error(`${t} must contain a hostname.`);if(n==="localhost"||n.endsWith(".localhost"))throw new Error(`${t} must not target localhost.`);if(n==="metadata.google.internal")throw new Error(`${t} must not target a cloud instance metadata endpoint.`);if(q(n)||Z(n)){let s=Q(n);if(s)throw new Error(`${t} must not target ${s}.`)}return o}function Te(e){let t=C(e.sourceOrigin,"sourceOrigin").origin;if(!Array.isArray(e.urls)||e.urls.length<1||e.urls.length>20)throw new Error("Render tasks require between 1 and 20 URLs.");for(let[s,a]of e.urls.entries())if(C(a,`urls[${s}]`).origin!==t)throw new Error(`urls[${s}] is outside sourceOrigin.`);let r=P(e.options,"options");if(typeof r.ignoreHttpsErrors!="boolean")throw new Error("options.ignoreHttpsErrors must be a boolean.");if(typeof r.javaScriptEnabled!="boolean")throw new Error("options.javaScriptEnabled must be a boolean.");let o=P(r.viewport,"options.viewport");E(o.width,"options.viewport.width",320,7680),E(o.height,"options.viewport.height",240,7680),E(r.navigationTimeoutMs,"options.navigationTimeoutMs",1e3,6e5),E(r.autoScrollTimeoutMs,"options.autoScrollTimeoutMs",0,12e4);let n=P(r.readiness,"options.readiness");for(let s of ["waitForSelector","waitForFunction"])if(n[s]!==null&&typeof n[s]!="string")throw new Error(`options.readiness.${s} must be a string or null.`);E(n.timeoutMs,"options.readiness.timeoutMs",0,12e4),E(n.fallbackWaitMs,"options.readiness.fallbackWaitMs",0,12e4);}function Ce(e){if(!Array.isArray(e.urls)||e.urls.length<1||e.urls.length>20)throw new Error("Asset tasks require between 1 and 20 URLs.");for(let[r,o]of e.urls.entries())C(o,`urls[${r}]`);let t=P(e.options,"options");if(typeof t.ignoreHttpsErrors!="boolean")throw new Error("options.ignoreHttpsErrors must be a boolean.");E(t.timeoutMs,"options.timeoutMs",1e3,12e4);}function je(e){if(h(e.configKey,"configKey"),h(e.assetMapKey,"assetMapKey"),e.previousAssetMapKey!==void 0&&h(e.previousAssetMapKey,"previousAssetMapKey"),!Array.isArray(e.items)||e.items.length<1||e.items.length>500)throw new Error("Rewrite tasks require between 1 and 500 objects.");for(let[t,r]of e.items.entries()){let o=P(r,`items[${t}]`);h(o.inputKey,`items[${t}].inputKey`),h(o.outputKey,`items[${t}].outputKey`),h(o.relativePath,`items[${t}].relativePath`),h(o.contentType,`items[${t}].contentType`);}}function Ve(e){if(T(h(e.targetId,"targetId"),"targetId"),!Array.isArray(e.items)||e.items.length>1e3)throw new Error("Deploy copy tasks accept at most 1000 objects.");for(let[r,o]of e.items.entries()){let n=P(o,`items[${r}]`);h(n.sourceKey,`items[${r}].sourceKey`),h(n.targetRelativeKey,`items[${r}].targetRelativeKey`),h(n.sha256,`items[${r}].sha256`),n.normalizedSha256!==void 0&&h(n.normalizedSha256,`items[${r}].normalizedSha256`),E(n.bytes,`items[${r}].bytes`,0,Number.MAX_SAFE_INTEGER),h(n.contentType,`items[${r}].contentType`),h(n.cacheControl,`items[${r}].cacheControl`);}let t=e.deleteRelativeKeys??[];if(!Array.isArray(t)||t.length>1e3)throw new Error("Deploy copy tasks accept at most 1000 deletion keys.");for(let[r,o]of t.entries())h(o,`deleteRelativeKeys[${r}]`);if(e.items.length===0&&t.length===0)throw new Error("Deploy copy tasks require copy or deletion work.")}function ue(e){if(!e||typeof e!="object")throw new Error("Worker event must be a JSON object.");let t=e;if(t.schemaVersion!==k)throw new Error(`Unsupported worker protocol version: ${String(t.schemaVersion)}.`);let r=t.operation;if(r!=="render"&&r!=="asset"&&r!=="rewrite"&&r!=="deploy-copy"&&r!=="health")throw new Error(`Unsupported worker operation: ${String(r)}.`);return T(String(t.jobId??""),"jobId"),T(String(t.taskId??""),"taskId"),r==="render"&&Te(t),r==="asset"&&Ce(t),r==="rewrite"&&je(t),r==="deploy-copy"&&Ve(t),e}function Ke(e){return e.hostname.replace(/^\[|\]$/g,"").replace(/\.$/,"").toLowerCase()}async function Le(e){return (await lookup(e,{all:true,verbatim:true})).map(t=>t.address)}async function ee(e,t,r=Le){let o=C(e,t),n=Ke(o);if(isIP(n))return o;let s;try{s=await r(n);}catch{throw new Error(`${t} hostname could not be resolved safely.`)}if(s.length===0)throw new Error(`${t} hostname resolved to no addresses.`);for(let a of s){let i=Q(a);if(i)throw new Error(`${t} hostname resolves to ${i}.`)}return o}async function de(e,t=ee){let r=null;return await e.route("**/*",async o=>{try{await t(o.request().url(),"render request");}catch(n){r??=n instanceof Error?n:new Error(String(n)),await o.abort("blockedbyclient").catch(()=>{});return}await o.continue();}),await e.routeWebSocket("**/*",async o=>{try{await t(o.url(),"render WebSocket request");}catch(n){r??=n instanceof Error?n:new Error(String(n)),await o.close({code:1008,reason:"Blocked by network policy"});return}await o.close({code:1008,reason:"Only HTTP(S) requests are allowed"}),r??=new Error("render WebSocket request must use HTTP or HTTPS.");}),{getViolation:()=>r}}function qe(e){return e.replace(/&amp;/gi,"&").replace(/&quot;/gi,'"').replace(/&#39;|&apos;/gi,"'").replace(/&lt;/gi,"<").replace(/&gt;/gi,">")}function Ne(e,t){let r=e.trim();if(!r||r.startsWith("data:")||r.startsWith("blob:")||r.startsWith("javascript:")||r.startsWith("#"))return null;try{let o=new URL(r,t);return o.protocol!=="http:"&&o.protocol!=="https:"||o.username||o.password?null:(o.hash="",o.toString())}catch{return null}}function $(e,t,r){let o=Ne(t,r);o&&e.add(o);}function Fe(e,t,r){for(let o of t.split(",")){let n=o.trim().split(/\s+/,1)[0];n&&$(e,n,r);}}function te(e,t,r=""){let o=new Set,n=qe(t).replace(/\\\//g,"/");for(let i of n.matchAll(/\b(?:src|href|poster|data-src|data-href|data-resource-url)\s*=\s*["']([^"']+)["']/gi))$(o,i[1]??"",e);for(let i of n.matchAll(/\b(?:srcset|data-srcset)\s*=\s*["']([^"']+)["']/gi))Fe(o,i[1]??"",e);for(let i of n.matchAll(/url\(\s*(?:"([^"]+)"|'([^']+)'|([^)]*?))\s*\)/gi))$(o,i[1]??i[2]??i[3]??"",e);for(let i of n.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;)]+)['"]?\s*\)?/gi))$(o,i[1]??"",e);for(let i of n.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi))$(o,i[1]??"",e);let s=(()=>{try{return M.extname(new URL(e).pathname).toLowerCase()}catch{return ""}})();if(s===".js"||s===".mjs"||/(?:java|ecma)script/i.test(r))for(let i of n.matchAll(/["']((?:\.\.?\/|\/)?[^"'\s]+\.(?:js|mjs)(?:[?#][^"']*)?)["']/gi))$(o,i[1]??"",e);return [...o].sort()}function me(e){return e.replace(/&quot;/g,'"').replace(/&#34;/g,'"').replace(/&apos;/g,"'").replace(/&#39;/g,"'").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">")}function v(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function F(e){return e.replace(/\//g,"\\/")}function pe(e){return e.replace(/\//g,"\\\\/")}function He(e){try{let t=new URL(e);if(t.protocol!=="http:"&&t.protocol!=="https:")return null;let r=t.pathname==="/"&&!t.search&&!t.hash?"":`${t.pathname}${t.search}${t.hash}`;return `//${t.host}${r}`}catch{return null}}function ge(e,t,r){if(!t)return;e[t]=r;let o=F(t),n=F(r);e[o]=n;let s=pe(t),a=pe(r);e[s]=a;let i=v(t),c=v(r);e[i]=c;let d=v(o),l=v(n);e[d]=l;let u=v(s),p=v(a);e[u]=p;}function H(e,t,r){ge(e,t,r);let o=He(t);o&&o!==t&&ge(e,o,r);}function fe(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function he(e,t,r){if(!t)return r;let o=M.dirname(M.resolve(t)),n=M.resolve(e,r.replace(/^\/+/,"")),s=M.relative(o,n).replace(/\\/g,"/");return s?(s.startsWith(".")||(s=`./${s}`),s):"."}var Be=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],De=new Set([".html",".htm"]),we="WPSuite.io Static Publisher",ze=we.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Je(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ge(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function Xe(e,t,r){return Ge(t)?e.replace(new RegExp(`(?<!:)${Je(t)}`,"g"),r):e.split(t).join(r)}function Ye(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let n=M.extname(r).toLowerCase();return De.has(n)?/<head\b|<html\b|<!doctype html/i.test(t):false}function Ze(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${ze}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${we}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let o=e.includes(`\r
1
+ import {S3Client,HeadObjectCommand,CopyObjectCommand,DeleteObjectsCommand,PutObjectCommand,GetObjectCommand}from'@aws-sdk/client-s3';import {request,chromium}from'playwright';import {createHash}from'crypto';import {lookup}from'dns/promises';import {isIP}from'net';import M from'path';import'fast-glob';import'fs/promises';import'os';import'worker_threads';import {DynamoDBClient,UpdateItemCommand}from'@aws-sdk/client-dynamodb';import xe from'mime-types';var k=1,de=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function W(e,t){let r=String(e??"").trim();if(!de.test(r))throw new Error(`${t} must match ${de.source} and be at most 128 characters.`);return r}function j(e){let t=String(e??"").trim().replace(/^\/+|\/+$/g,"");if(!t)return "";let r=t.split("/").filter(Boolean);if(r.some(o=>o==="."||o===".."))throw new Error("S3 prefix contains an unsafe dot path segment.");return `${r.join("/")}/`}function x(e,...t){let r=j(e),o=t.map((n,s)=>{let a=String(n??"").replace(/^\/+|\/+$/g,"");if(!a||a.split("/").some(i=>i==="."||i===".."))throw new Error(`Unsafe S3 key segment at index ${s}.`);return a});return `${r}${o.join("/")}`}function _(e,t,r){return `${x(e,"jobs",W(t,"jobId"),"tasks",W(r,"taskId"))}/`}function V(e){return createHash("sha256").update(e).digest("hex")}function T(e,t){let r=String(e??"").replace(/^\/+/,""),o=j(t);if(!r||r.includes("\0"))throw new Error("S3 object key is empty or invalid.");if(o&&!r.startsWith(o))throw new Error(`S3 object key is outside the configured workspace prefix: ${r}`);if(r.split("/").some(n=>n===".."))throw new Error("S3 object key contains an unsafe parent segment.");return r}function I(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`${t} must be a JSON object.`);return e}function h(e,t){if(typeof e!="string"||!e.trim())throw new Error(`${t} must be a non-empty string.`);return e.trim()}function E(e,t,r,o){if(!Number.isInteger(e)||Number(e)<r||Number(e)>o)throw new Error(`${t} must be an integer between ${r} and ${o}.`);return Number(e)}function je(e){return e.hostname.replace(/^\[|\]$/g,"").replace(/\.$/,"").toLowerCase()}function q(e){let t=e.split(".");if(t.length!==4)return null;let r=t.map(o=>Number(o));return r.every((o,n)=>Number.isInteger(o)&&o>=0&&o<=255&&String(o)===t[n])?r:null}function ee(e){let t=e.toLowerCase();if(t.includes("%")||t.split("::").length>2)return null;let r=t,o=r.lastIndexOf(":");if(r.includes(".")&&o>=0){let l=q(r.slice(o+1));if(!l)return null;r=`${r.slice(0,o)}:${((l[0]??0)*256+(l[1]??0)).toString(16)}:${((l[2]??0)*256+(l[3]??0)).toString(16)}`;}let[n,s]=r.split("::"),a=n?n.split(":"):[],i=s?s.split(":"):[],c=r.includes("::"),d=8-a.length-i.length;return c&&d<1||!c&&d!==0||[...a,...i].some(l=>!/^[0-9a-f]{1,4}$/.test(l))?null:[...a.map(l=>Number.parseInt(l,16)),...Array.from({length:d},()=>0),...i.map(l=>Number.parseInt(l,16))]}function pe(e){let t=q(e);if(!t)return "an invalid IPv4 address";let[r=0,o=0,n=0,s=0]=t;return r===0?"the unspecified/current-network IPv4 range":r===10||r===172&&o>=16&&o<=31||r===192&&o===168?"an RFC1918 private IPv4 range":r===127?"the IPv4 loopback range":r===169&&o===254?"the IPv4 link-local/metadata range":r===100&&o===100&&n===100&&s===200?"a cloud instance metadata endpoint":r===100&&o>=64&&o<=127?"the shared carrier-grade NAT IPv4 range":r===198&&(o===18||o===19)?"the IPv4 benchmarking range":r>=224&&r<=239?"the IPv4 multicast range":r>=240?"the reserved IPv4 range":null}function Ve(e){let t=ee(e);if(!t||t.length!==8)return "an invalid IPv6 address";if(t.every(n=>n===0))return "the unspecified IPv6 address";if(t.slice(0,7).every(n=>n===0)&&t[7]===1)return "the IPv6 loopback address";let r=t[0]??0;if((r&65024)===64512)return "an IPv6 unique-local range";if((r&65472)===65152)return "the IPv6 link-local range";if((r&65280)===65280)return "the IPv6 multicast range";if(t.slice(0,5).every(n=>n===0)&&t[5]===65535){let n=t[6]??0,s=t[7]??0;return pe(`${n>>8}.${n&255}.${s>>8}.${s&255}`)}return null}function te(e){return q(e)?pe(e):ee(e)?Ve(e):"an invalid IP address"}function C(e,t){let r=h(e,t),o;try{o=new URL(r);}catch{throw new Error(`${t} must be a valid URL.`)}if(o.protocol!=="http:"&&o.protocol!=="https:")throw new Error(`${t} must use HTTP or HTTPS.`);if(o.username||o.password)throw new Error(`${t} must not contain URL credentials.`);let n=je(o);if(!n)throw new Error(`${t} must contain a hostname.`);if(n==="localhost"||n.endsWith(".localhost"))throw new Error(`${t} must not target localhost.`);if(n==="metadata.google.internal")throw new Error(`${t} must not target a cloud instance metadata endpoint.`);if(q(n)||ee(n)){let s=te(n);if(s)throw new Error(`${t} must not target ${s}.`)}return o}function Me(e){let t=C(e.sourceOrigin,"sourceOrigin").origin;if(!Array.isArray(e.urls)||e.urls.length<1||e.urls.length>20)throw new Error("Render tasks require between 1 and 20 URLs.");for(let[s,a]of e.urls.entries())if(C(a,`urls[${s}]`).origin!==t)throw new Error(`urls[${s}] is outside sourceOrigin.`);let r=I(e.options,"options");if(typeof r.ignoreHttpsErrors!="boolean")throw new Error("options.ignoreHttpsErrors must be a boolean.");if(typeof r.javaScriptEnabled!="boolean")throw new Error("options.javaScriptEnabled must be a boolean.");let o=I(r.viewport,"options.viewport");E(o.width,"options.viewport.width",320,7680),E(o.height,"options.viewport.height",240,7680),E(r.navigationTimeoutMs,"options.navigationTimeoutMs",1e3,6e5),E(r.autoScrollTimeoutMs,"options.autoScrollTimeoutMs",0,12e4);let n=I(r.readiness,"options.readiness");for(let s of ["waitForSelector","waitForFunction"])if(n[s]!==null&&typeof n[s]!="string")throw new Error(`options.readiness.${s} must be a string or null.`);E(n.timeoutMs,"options.readiness.timeoutMs",0,12e4),E(n.fallbackWaitMs,"options.readiness.fallbackWaitMs",0,12e4);}function Ue(e){if(!Array.isArray(e.urls)||e.urls.length<1||e.urls.length>20)throw new Error("Asset tasks require between 1 and 20 URLs.");for(let[r,o]of e.urls.entries())C(o,`urls[${r}]`);let t=I(e.options,"options");if(typeof t.ignoreHttpsErrors!="boolean")throw new Error("options.ignoreHttpsErrors must be a boolean.");E(t.timeoutMs,"options.timeoutMs",1e3,12e4);}function Le(e){if(h(e.configKey,"configKey"),h(e.assetMapKey,"assetMapKey"),e.previousAssetMapKey!==void 0&&h(e.previousAssetMapKey,"previousAssetMapKey"),!Array.isArray(e.items)||e.items.length<1||e.items.length>500)throw new Error("Rewrite tasks require between 1 and 500 objects.");for(let[t,r]of e.items.entries()){let o=I(r,`items[${t}]`);h(o.inputKey,`items[${t}].inputKey`),h(o.outputKey,`items[${t}].outputKey`),h(o.relativePath,`items[${t}].relativePath`),o.contentType!==void 0&&o.contentType!==null&&h(o.contentType,`items[${t}].contentType`);}}function Ke(e){if(W(h(e.targetId,"targetId"),"targetId"),!Array.isArray(e.items)||e.items.length>1e3)throw new Error("Deploy copy tasks accept at most 1000 objects.");for(let[r,o]of e.items.entries()){let n=I(o,`items[${r}]`);h(n.sourceKey,`items[${r}].sourceKey`),h(n.targetRelativeKey,`items[${r}].targetRelativeKey`),h(n.sha256,`items[${r}].sha256`),n.normalizedSha256!==void 0&&h(n.normalizedSha256,`items[${r}].normalizedSha256`),E(n.bytes,`items[${r}].bytes`,0,Number.MAX_SAFE_INTEGER),h(n.contentType,`items[${r}].contentType`),h(n.cacheControl,`items[${r}].cacheControl`);}let t=e.deleteRelativeKeys??[];if(!Array.isArray(t)||t.length>1e3)throw new Error("Deploy copy tasks accept at most 1000 deletion keys.");for(let[r,o]of t.entries())h(o,`deleteRelativeKeys[${r}]`);if(e.items.length===0&&t.length===0)throw new Error("Deploy copy tasks require copy or deletion work.")}function me(e){if(!e||typeof e!="object")throw new Error("Worker event must be a JSON object.");let t=e;if(t.schemaVersion!==k)throw new Error(`Unsupported worker protocol version: ${String(t.schemaVersion)}.`);let r=t.operation;if(r!=="render"&&r!=="asset"&&r!=="rewrite"&&r!=="deploy-copy"&&r!=="health")throw new Error(`Unsupported worker operation: ${String(r)}.`);return W(String(t.jobId??""),"jobId"),W(String(t.taskId??""),"taskId"),r==="render"&&Me(t),r==="asset"&&Ue(t),r==="rewrite"&&Le(t),r==="deploy-copy"&&Ke(t),e}function Ne(e){return e.hostname.replace(/^\[|\]$/g,"").replace(/\.$/,"").toLowerCase()}async function Fe(e){return (await lookup(e,{all:true,verbatim:true})).map(t=>t.address)}async function re(e,t,r=Fe){let o=C(e,t),n=Ne(o);if(isIP(n))return o;let s;try{s=await r(n);}catch{throw new Error(`${t} hostname could not be resolved safely.`)}if(s.length===0)throw new Error(`${t} hostname resolved to no addresses.`);for(let a of s){let i=te(a);if(i)throw new Error(`${t} hostname resolves to ${i}.`)}return o}async function ge(e,t=re){let r=null;return await e.route("**/*",async o=>{try{await t(o.request().url(),"render request");}catch(n){r??=n instanceof Error?n:new Error(String(n)),await o.abort("blockedbyclient").catch(()=>{});return}await o.continue();}),await e.routeWebSocket("**/*",async o=>{try{await t(o.url(),"render WebSocket request");}catch(n){r??=n instanceof Error?n:new Error(String(n)),await o.close({code:1008,reason:"Blocked by network policy"});return}await o.close({code:1008,reason:"Only HTTP(S) requests are allowed"}),r??=new Error("render WebSocket request must use HTTP or HTTPS.");}),{getViolation:()=>r}}function Be(e){return e.replace(/&amp;/gi,"&").replace(/&quot;/gi,'"').replace(/&#39;|&apos;/gi,"'").replace(/&lt;/gi,"<").replace(/&gt;/gi,">")}function De(e,t){let r=e.trim();if(!r||r.startsWith("data:")||r.startsWith("blob:")||r.startsWith("javascript:")||r.startsWith("#"))return null;try{let o=new URL(r,t);return o.protocol!=="http:"&&o.protocol!=="https:"||o.username||o.password?null:(o.hash="",o.toString())}catch{return null}}function $(e,t,r){let o=De(t,r);o&&e.add(o);}function ze(e,t,r){for(let o of t.split(",")){let n=o.trim().split(/\s+/,1)[0];n&&$(e,n,r);}}function ne(e,t,r=""){let o=new Set,n=Be(t).replace(/\\\//g,"/");for(let i of n.matchAll(/\b(?:src|href|poster|data-src|data-href|data-resource-url)\s*=\s*["']([^"']+)["']/gi))$(o,i[1]??"",e);for(let i of n.matchAll(/\b(?:srcset|data-srcset)\s*=\s*["']([^"']+)["']/gi))ze(o,i[1]??"",e);for(let i of n.matchAll(/url\(\s*(?:"([^"]+)"|'([^']+)'|([^)]*?))\s*\)/gi))$(o,i[1]??i[2]??i[3]??"",e);for(let i of n.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;)]+)['"]?\s*\)?/gi))$(o,i[1]??"",e);for(let i of n.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi))$(o,i[1]??"",e);let s=(()=>{try{return M.extname(new URL(e).pathname).toLowerCase()}catch{return ""}})();if(s===".js"||s===".mjs"||/(?:java|ecma)script/i.test(r))for(let i of n.matchAll(/["']((?:\.\.?\/|\/)?[^"'\s]+\.(?:js|mjs)(?:[?#][^"']*)?)["']/gi))$(o,i[1]??"",e);return [...o].sort()}function we(e){return e.replace(/&quot;/g,'"').replace(/&#34;/g,'"').replace(/&apos;/g,"'").replace(/&#39;/g,"'").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">")}function v(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function F(e){return e.replace(/\//g,"\\/")}function fe(e){return e.replace(/\//g,"\\\\/")}function Je(e){try{let t=new URL(e);if(t.protocol!=="http:"&&t.protocol!=="https:")return null;let r=t.pathname==="/"&&!t.search&&!t.hash?"":`${t.pathname}${t.search}${t.hash}`;return `//${t.host}${r}`}catch{return null}}function he(e,t,r){if(!t)return;e[t]=r;let o=F(t),n=F(r);e[o]=n;let s=fe(t),a=fe(r);e[s]=a;let i=v(t),c=v(r);e[i]=c;let d=v(o),l=v(n);e[d]=l;let u=v(s),p=v(a);e[u]=p;}function H(e,t,r){he(e,t,r);let o=Je(t);o&&o!==t&&he(e,o,r);}function ye(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function Re(e,t,r){if(!t)return r;let o=M.dirname(M.resolve(t)),n=M.resolve(e,r.replace(/^\/+/,"")),s=M.relative(o,n).replace(/\\/g,"/");return s?(s.startsWith(".")||(s=`./${s}`),s):"."}var Ge=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],Xe=new Set([".html",".htm"]),be="WPSuite.io Static Publisher",Ze=be.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Ye(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Qe(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function et(e,t,r){return Qe(t)?e.replace(new RegExp(`(?<!:)${Ye(t)}`,"g"),r):e.split(t).join(r)}function tt(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let n=M.extname(r).toLowerCase();return Xe.has(n)?/<head\b|<html\b|<!doctype html/i.test(t):false}function rt(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${Ze}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${be}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let o=e.includes(`\r
2
2
  `)?`\r
3
3
  `:`
4
- `;return e.replace(/<head\b[^>]*>/i,n=>`${n}${o} ${t}`)}function Qe(e){let t=me(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function et(e,t){let r=[...new Set(t)].filter(s=>s.includes("/")&&!/\\+\//.test(s)).map(s=>[s,F(s)]).filter(([s,a])=>s!==a).sort((s,a)=>a[0].length-s[0].length);if(!r.length)return e;let o=s=>{let a=s;for(let[i,c]of r)a=a.split(i).join(c);return a},n=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(s,a,i,c)=>`${a}${o(i)}${c}`);return n=n.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(s,a,i,c,d)=>Qe(c)?`${a}${o(c)}${d}`:s),n}function tt(e,t){if(!t)return null;let r=M.dirname(M.resolve(t)),o=M.resolve(e.outputDir),n=M.relative(r,o).replace(/\\/g,"/");return n?(n.startsWith(".")||(n=`./${n}`),n.endsWith("/")?n:`${n}/`):"./"}function rt(e,t,r){let o=tt(t,r);if(!o)return e;let n=e;for(let s of Be){let a=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`(?:\\.{1,}/)+${a}`,"g"),c=new RegExp(`(?<!\\.)/${a}`,"g");n=n.replace(i,`${o}${s}`).replace(c,`${o}${s}`);let d=s.replace(/\//g,"\\/"),l=o.replace(/\//g,"\\/"),u=d.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),p=new RegExp(`(?:\\.{1,}\\\\/)+${u}`,"g"),g=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${u}`,"g"),w=new RegExp(`(?<![\\.\\\\])\\/${u}`,"g");n=n.replace(p,`${l}${d}`).replace(g,`${l}${d}`).replace(w,`${l}${d}`);}return n}function ne(e,t,r){if(e.urlRewriteMode==="absolute")return t;let o=(()=>{try{return new URL(t,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin)}catch{return null}})(),n=o?o.pathname:fe(t,e.targetOrigin),s=o?`${o.search}${o.hash}`:"";return e.urlRewriteMode==="root-relative"?`${n}${s}`:`${he(e.outputDir,r,n)}${s}`}function re(e,t,r,o,n){H(e,r,ne(t,o,n));}function nt(e,t,r,o,n){if(!r||r===o)return;H(e,r,o);let s=ne(t,r,n),a=ne(t,o,n);H(e,s,a);}function ye(e,t,r,o,n={}){let s=e,a={};re(a,t,t.sourceOrigin,t.targetOrigin,o);for(let[c,d]of Object.entries(t.extraReplacements))re(a,t,c,d,o);for(let[c,d]of Object.entries(r))re(a,t,c,d,o);for(let[c,d]of Object.entries(n)){let l=r[c];!l||l===d||nt(a,t,d,l,o);}let i=Object.entries(a).sort((c,d)=>d[0].length-c[0].length);for(let[c,d]of i)s=Xe(s,c,d);return t.urlRewriteMode!=="absolute"&&(s=rt(s,t,o)),s=et(s,i.map(([,c])=>c)),Ye(t,s,o)&&(s=Ze(s)),s}var oe=String(process.env.PUBLISHER_PROGRESS_TABLE??"").trim(),Re=Number(process.env.PUBLISHER_PROGRESS_RETENTION_SECONDS??604800),it=Number.isFinite(Re)?Math.max(86400,Re):604800,be=oe?new DynamoDBClient({}):null;function at(e){return e.operation==="render"||e.operation==="asset"?e.urls.length:e.operation==="rewrite"?e.items.length:e.items.length+(e.deleteRelativeKeys?.length??0)}async function lt(e){if(!(!be||!oe))try{let t=Math.floor(Date.now()/1e3)+it;await be.send(new UpdateItemCommand({TableName:oe,Key:{jobId:{S:e.jobId},taskId:{S:e.taskId}},UpdateExpression:"SET #operation = :operation, #status = :status, completedItems = :completedItems, failedItems = :failedItems, totalItems = :totalItems, #sequence = :sequence, updatedAt = :updatedAt, expiresAt = :expiresAt"+(e.requestId?", requestId = :requestId":""),ConditionExpression:"attribute_not_exists(#sequence) OR #sequence < :sequence",ExpressionAttributeNames:{"#operation":"operation","#status":"status","#sequence":"sequence"},ExpressionAttributeValues:{":operation":{S:e.operation},":status":{S:e.status},":completedItems":{N:String(e.completedItems)},":failedItems":{N:String(e.failedItems)},":totalItems":{N:String(e.totalItems)},":sequence":{N:String(e.sequence)},":updatedAt":{S:e.updatedAt},":expiresAt":{N:String(t)},...e.requestId?{":requestId":{S:e.requestId}}:{}}}));}catch(t){if(t.name==="ConditionalCheckFailedException")return;console.warn(JSON.stringify({message:"Remote worker progress status could not be written.",jobId:e.jobId,taskId:e.taskId,error:t instanceof Error?t.message:String(t)}));}}var B=class{#t;#o;#e;#s;#i;#a=-1;#l=0;#n=0;#c=0;constructor(t,r,o=lt){this.#t=t,this.#o=r??null,this.#e=at(t),this.#s=Math.max(1,Math.ceil(this.#e/20)),this.#i=o;}async started(){await this.#r("running",0,0,0);}async updated(t,r){this.#n=t,this.#c=r;let o=t+r,n=Date.now();o<this.#e&&o-this.#a<this.#s&&n-this.#l<5e3||await this.#r("running",t,r,o+1);}async completed(t){await this.#r(t.status,t.completedItems,t.failedItems,this.#e+2);}async failed(){let t=Math.min(this.#e-this.#n,Math.max(1,this.#c));await this.#r("failed",this.#n,t,this.#e+3);}async#r(t,r,o,n){this.#a=r+o,this.#l=Date.now(),await this.#i({jobId:this.#t.jobId,taskId:this.#t.taskId,operation:this.#t.operation,status:t,completedItems:r,failedItems:o,totalItems:this.#e,sequence:n,updatedAt:new Date().toISOString(),requestId:this.#o});}};var O=String(process.env.PUBLISHER_WORKSPACE_BUCKET??"").trim(),R=j(process.env.PUBLISHER_WORKSPACE_PREFIX??""),D=String(process.env.PUBLISHER_ALLOWED_OPERATION??"").trim(),K=String(process.env.PUBLISHER_EXPORTER_VERSION??"unknown").trim(),U=String(process.env.PUBLISHER_PROXY_URL??"").trim(),ht=wt(process.env.PUBLISHER_ALLOWED_TARGETS??"[]"),xe=new S3Client({}),Ee=new Map,y=null;function wt(e){try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(r=>{if(!r||typeof r!="object")return !1;let o=r;return ["id","bucketName","prefix","region"].every(n=>typeof o[n]=="string")}).map(r=>({...r,prefix:j(r.prefix)})):[]}catch{return []}}function se(){if(!O)throw new Error("PUBLISHER_WORKSPACE_BUCKET is required.")}async function yt(){if(y){let t=await y.catch(()=>null);if(t?.isConnected())return t}let e=chromium.launch({headless:true,args:["--no-sandbox","--disable-setuid-sandbox","--disable-dev-shm-usage","--no-zygote","--single-process","--disable-gpu"],...U?{proxy:{server:U}}:{}});y=e;try{let t=await e;return t.once("disconnected",()=>{y===e&&(y=null);}),t}catch(t){throw y===e&&(y=null),t}}async function Rt(){let e=y;if(y=null,!e)return;let t=await e.catch(()=>null);t&&await t.close().catch(()=>{});}async function bt(e){let t;for(let r=1;r<=2;r+=1){let o=await yt(),n=null;try{n=await o.newContext({viewport:e.options.viewport,ignoreHTTPSErrors:e.options.ignoreHttpsErrors,javaScriptEnabled:e.options.javaScriptEnabled,serviceWorkers:"block",userAgent:"WPSuiteStaticPublisher/remote-worker-v1"}),e.options.javaScriptEnabled&&await Et(n);let s=await de(n);return {context:n,page:await n.newPage(),networkPolicyViolation:s.getViolation}}catch(s){t=s,await n?.close().catch(()=>{}),y=null,await o.close().catch(()=>{});}}throw t instanceof Error?t:new Error(`Unable to create a Chromium page: ${String(t)}`)}async function Et(e){await e.addInitScript(()=>{Object.defineProperty(window,"__WPSUITE_STATIC_EXPORT__",{value:true,writable:false,configurable:true});let t=r=>{if(r==null||String(r)==="")return true;try{let o=new URL(String(r),window.location.href),n=new URL(window.location.href);return o.hash="",n.hash="",o.href===n.href}catch{return false}};try{let r=window.location.assign.bind(window.location),o=window.location.replace.bind(window.location);Object.defineProperty(window.location,"assign",{configurable:!0,value:n=>{if(!t(n))return r(n)}}),Object.defineProperty(window.location,"replace",{configurable:!0,value:n=>{if(!t(n))return o(n)}}),Object.defineProperty(window.location,"reload",{configurable:!0,value:()=>{}});}catch{}});}async function kt(e,t){await e.evaluate(async r=>{await new Promise(o=>{let n=0,s=700,a=Date.now(),i=()=>{window.clearInterval(c),window.scrollTo(0,0),o();},c=window.setInterval(()=>{if(Date.now()-a>=r){i();return}window.scrollBy(0,s),n+=s;let d=Math.max(document.body?.scrollHeight||0,document.documentElement?.scrollHeight||0);n>=d+window.innerHeight&&i();},120);});},t);}async function Pe(e){se();let t=I(e,R),r=await xe.send(new GetObjectCommand({Bucket:O,Key:t}));if(!r.Body)throw new Error(`S3 object has no body: ${t}`);return await r.Body.transformToString("utf8")}async function J(e){return JSON.parse(await Pe(e))}async function G(e,t,r){se();let o=I(e,R),n=typeof t=="string"?Buffer.from(t,"utf8"):t,s=await xe.send(new PutObjectCommand({Bucket:O,Key:o,Body:n,ContentType:r,Metadata:{sha256:V(n)}}));return {bucket:O,key:o,sha256:V(n),bytes:n.byteLength,contentType:r,...s.ETag?{etag:s.ETag}:{},...s.VersionId?{versionId:s.VersionId}:{}}}async function St(e,t){return await G(e,`${JSON.stringify(t,null,2)}
5
- `,"application/json; charset=utf-8")}async function xt(e){try{let t=await J(e);return t.response??t}catch(t){if(t.name==="NoSuchKey"||t.$metadata?.httpStatusCode===404)return null;throw t}}function z(e){return [...new Set(e)].filter(t=>{try{let r=new URL(t);return (r.protocol==="http:"||r.protocol==="https:")&&!r.username&&!r.password}catch{return false}}).sort()}async function Pt(e,t,r){let o=null,n=null,s,a=new Set;try{let i=await bt(e);o=i.context,n=i.page,s=i.networkPolicyViolation,n.on("request",f=>a.add(f.url()));let c=await n.goto(t,{waitUntil:"domcontentloaded",timeout:e.options.navigationTimeoutMs});e.options.readiness.waitForSelector&&await n.waitForSelector(e.options.readiness.waitForSelector,{timeout:e.options.readiness.timeoutMs}).catch(()=>{}),e.options.javaScriptEnabled&&e.options.readiness.waitForFunction&&await n.waitForFunction(e.options.readiness.waitForFunction,void 0,{timeout:e.options.readiness.timeoutMs}).catch(()=>{}),e.options.javaScriptEnabled?await kt(n,e.options.autoScrollTimeoutMs):await n.waitForLoadState("load",{timeout:e.options.readiness.timeoutMs}).catch(()=>{}),e.options.readiness.fallbackWaitMs>0&&await n.waitForTimeout(e.options.readiness.fallbackWaitMs);let d=s?.();if(d)throw d;let l=await n.evaluate(()=>{let f=(S,Ie)=>{let X=[];for(let $e of document.querySelectorAll(S))for(let ie of Ie){let Y=$e.getAttribute(ie);if(Y)if(ie.includes("srcset"))for(let ve of Y.split(",")){let ae=ve.trim().split(/\s+/,1)[0];ae&&X.push(ae);}else X.push(Y);}return X},W=S=>{try{return new URL(S,document.baseURI).href}catch{return null}};return {links:f("a[href]",["href"]).map(W).filter(S=>S!==null),assets:f("img,script,link,source,video,audio,iframe,[data-src],[data-href],[data-resource-url]",["src","href","srcset","data-src","data-srcset","data-href","data-resource-url","poster"]).map(W).filter(S=>S!==null)}});await n.evaluate(()=>{document.querySelectorAll("#wpsuite-consent-root").forEach(f=>f.remove()),document.documentElement.classList.remove("wpsuite-consent-scroll-locked"),document.body.classList.remove("wpsuite-consent-scroll-locked");});let u=await n.content(),p=s();if(p)throw p;let g=new URL(t),w=z(l.links).filter(f=>{let W=new URL(f);return W.hash="",W.origin===g.origin}),b=x(_(R,e.jobId,e.taskId),"pages",`${String(r).padStart(4,"0")}-${V(t).slice(0,24)}.html`),A=await G(b,u,"text/html; charset=utf-8"),L=(await o.cookies()).map(f=>({name:f.name,domain:f.domain,path:f.path,expires:f.expires,httpOnly:f.httpOnly,secure:f.secure,sameSite:f.sameSite,..."partitionKey"in f?{partitioned:!0}:{}})),m=c?.status()??null;return {requestedUrl:t,finalUrl:n?.url()||null,outcome:m!==null&&m>=400?"http-error":"rendered",httpStatus:m,contentType:c?.headers()["content-type"]??null,html:A,discoveredPages:w,discoveredAssets:z([...l.assets,...te(n.url()||t,u,c?.headers()["content-type"]??"text/html")]),networkUrls:z([...a]),cookies:L}}catch(i){return {requestedUrl:t,finalUrl:n?.url()||null,outcome:"failed",httpStatus:null,contentType:null,html:null,discoveredPages:[],discoveredAssets:[],networkUrls:z([...a]),cookies:[],error:i instanceof Error?i.message:String(i)}}finally{await o?.close().catch(()=>{});}}function It(e,t){let r=t.toLowerCase();if(r.startsWith("text/")||r.includes("javascript")||r.includes("json")||r.includes("xml")||r.includes("svg"))return true;try{return /\.(?:css|js|mjs|json|xml|xsl|svg|txt|map|html?)$/i.test(new URL(e).pathname)}catch{return false}}async function $t(e,t,r){let o=t;for(let n=0;n<=5;n+=1){await ee(o,"asset request");let s=await e.get(o,{timeout:r,failOnStatusCode:false,maxRedirects:0}),a=s.status();if(a<300||a>=400)return s;let i=s.headers().location;if(!i)return s;if(n===5)throw await s.dispose(),new Error("Asset request exceeded five redirects.");o=new URL(i,o).toString(),await s.dispose();}throw new Error("Asset redirect handling failed.")}async function vt(e,t,r){if(!Array.isArray(e.urls)||e.urls.length<1||e.urls.length>20)throw new Error("Asset tasks require between 1 and 20 URLs.");let o=await request.newContext({ignoreHTTPSErrors:e.options.ignoreHttpsErrors,userAgent:"WPSuiteStaticPublisher/remote-asset-worker-v1",...U?{proxy:{server:U}}:{}}),n=[],s=async i=>{n.push(i);let c=n.filter(d=>d.outcome==="failed"||d.outcome==="deferred").length;await r.updated(n.length-c,c);};try{for(let i=0;i<e.urls.length;i+=1){let c=e.urls[i],d=t.getRemainingTimeInMillis?.();if(d!==void 0&&d<3e4){await s({requestedUrl:c,finalUrl:null,outcome:"deferred",httpStatus:null,contentType:null,cacheControl:null,lastModified:null,object:null,discoveredAssets:[],error:"Worker stopped accepting assets because less than 30 seconds remained."});continue}let l=null;try{l=await $t(o,c,e.options.timeoutMs);let u=l.status(),p=l.headers(),g=l.url()||c;if(u<200||u>=300){await s({requestedUrl:c,finalUrl:g,outcome:"http-error",httpStatus:u,contentType:p["content-type"]??null,cacheControl:p["cache-control"]??null,lastModified:p["last-modified"]??null,object:null,discoveredAssets:[],error:`Asset returned HTTP ${u}.`});continue}let w=await l.body(),b=p["content-type"]??"application/octet-stream",A=await G(x(_(R,e.jobId,e.taskId),"assets",`${String(i).padStart(4,"0")}-${V(c).slice(0,24)}.bin`),w,b);await s({requestedUrl:c,finalUrl:g,outcome:"fetched",httpStatus:u,contentType:b,cacheControl:p["cache-control"]??null,lastModified:p["last-modified"]??null,object:A,discoveredAssets:It(g,b)?te(g,new TextDecoder("utf8").decode(w),b):[]});}catch(u){await s({requestedUrl:c,finalUrl:l?.url()??null,outcome:"failed",httpStatus:l?.status()??null,contentType:l?.headers()["content-type"]??null,cacheControl:l?.headers()["cache-control"]??null,lastModified:l?.headers()["last-modified"]??null,object:null,discoveredAssets:[],error:u instanceof Error?u.message:String(u)});}finally{await l?.dispose().catch(()=>{});}}}finally{await o.dispose();}let a=n.filter(i=>i.outcome==="failed"||i.outcome==="deferred").length;return {response:{schemaVersion:k,operation:"asset",jobId:e.jobId,taskId:e.taskId,status:a>0?"partial":"succeeded",completedItems:n.length-a,failedItems:a,exporterVersion:K},detail:{assets:n}}}async function Ot(e,t,r){if(!Array.isArray(e.urls)||e.urls.length<1||e.urls.length>20)throw new Error("Render tasks require between 1 and 20 URLs.");let o=new URL(e.sourceOrigin).origin,n=[];for(let a=0;a<e.urls.length;a+=1){let i=e.urls[a];if(!i)continue;let c=t.getRemainingTimeInMillis?.();if(c!==void 0&&c<6e4){n.push({requestedUrl:i,finalUrl:null,outcome:"deferred",httpStatus:null,contentType:null,html:null,discoveredPages:[],discoveredAssets:[],networkUrls:[],cookies:[],error:"Worker stopped accepting URLs because less than 60 seconds remained."}),await r.updated(n.filter(u=>u.outcome!=="failed"&&u.outcome!=="deferred").length,n.filter(u=>u.outcome==="failed"||u.outcome==="deferred").length);continue}let d=new URL(i);if(d.origin!==o)throw new Error(`Primary render URL is outside sourceOrigin: ${i}`);n.push(await Pt(e,d.toString(),a));let l=n.filter(u=>u.outcome==="failed"||u.outcome==="deferred").length;await r.updated(n.length-l,l);}let s=n.filter(a=>a.outcome==="failed"||a.outcome==="deferred").length;return {response:{schemaVersion:k,operation:"render",jobId:e.jobId,taskId:e.taskId,status:s>0?"partial":"succeeded",completedItems:n.length-s,failedItems:s,exporterVersion:K},detail:{pages:n}}}async function At(e,t){if(!Array.isArray(e.items)||e.items.length<1||e.items.length>500)throw new Error("Rewrite tasks require between 1 and 500 objects.");let o={...await J(e.configKey),outputDir:"/workspace"},n=await J(e.assetMapKey),s=e.previousAssetMapKey?await J(e.previousAssetMapKey):{},a=[];for(let i of e.items){let c=I(i.inputKey,R),d=I(i.outputKey,R),l=await Pe(c),u=`/workspace/${i.relativePath.replace(/^\/+/,"")}`,p=ye(l,o,n,u,s),g=await G(d,p,i.contentType);a.push({inputKey:c,outputKey:d,changed:p!==l,output:g}),await t.updated(a.length,0);}return {response:{schemaVersion:k,operation:"rewrite",jobId:e.jobId,taskId:e.taskId,status:"succeeded",completedItems:a.length,failedItems:0,exporterVersion:K},detail:{objects:a}}}function Wt(e,t){return `${e}/${t.split("/").map(r=>encodeURIComponent(r)).join("/")}`}async function Tt(e,t){if(!Array.isArray(e.items)||e.items.length>1e3)throw new Error("Deploy copy tasks accept at most 1000 objects.");let r=ht.find(l=>l.id===e.targetId);if(!r)throw new Error(`Unknown deployment target: ${e.targetId}`);let o=Ee.get(r.region);o||(o=new S3Client({region:r.region}),Ee.set(r.region,o));let n=[];for(let l of e.items){let u=I(l.sourceKey,R),p=x(r.prefix,l.targetRelativeKey);try{let g=await o.send(new HeadObjectCommand({Bucket:r.bucketName,Key:p})).catch(m=>{if((m&&typeof m=="object"&&"$metadata"in m?Number(m.$metadata?.httpStatusCode):0)===404||m?.name==="NotFound")return null;throw m}),w=String(g?.CacheControl??"").replace(/\s+/g,"")===l.cacheControl.replace(/\s+/g,""),b=g?.Metadata?.["wpsuite-sha256"]===l.sha256,A=!!l.normalizedSha256&&g?.Metadata?.["wpsuite-normalized-sha256"]===l.normalizedSha256;if(w&&(b||A)){n.push({sourceKey:u,targetKey:p,status:"skipped"}),await t.updated(n.filter(m=>m.status!=="failed").length,n.filter(m=>m.status==="failed").length);continue}let L=await o.send(new CopyObjectCommand({Bucket:r.bucketName,Key:p,CopySource:Wt(O,u),MetadataDirective:"REPLACE",ContentType:l.contentType,CacheControl:l.cacheControl,Metadata:{"wpsuite-sha256":l.sha256,...l.normalizedSha256?{"wpsuite-normalized-sha256":l.normalizedSha256}:{}}}));n.push({sourceKey:u,targetKey:p,status:"copied",...L.CopyObjectResult?.ETag?{etag:L.CopyObjectResult.ETag}:{}}),await t.updated(n.filter(m=>m.status!=="failed").length,n.filter(m=>m.status==="failed").length);}catch(g){n.push({sourceKey:u,targetKey:p,status:"failed",error:g instanceof Error?g.message:String(g)}),await t.updated(n.filter(w=>w.status!=="failed").length,n.filter(w=>w.status==="failed").length);}}let a=(e.deleteRelativeKeys??[]).map(l=>x(r.prefix,l)),i=[],c=[];if(a.length>0){let l=await o.send(new DeleteObjectsCommand({Bucket:r.bucketName,Delete:{Objects:a.map(u=>({Key:u})),Quiet:false}}));i.push(...(l.Deleted??[]).flatMap(u=>u.Key?[u.Key]:[])),c.push(...(l.Errors??[]).map(u=>({key:u.Key??"",error:u.Message??u.Code??"S3 deletion failed"}))),await t.updated(n.filter(u=>u.status!=="failed").length+i.length,n.filter(u=>u.status==="failed").length+c.length);}let d=n.filter(l=>l.status==="failed").length+c.length;return {response:{schemaVersion:k,operation:"deploy-copy",jobId:e.jobId,taskId:e.taskId,status:d>0?"partial":"succeeded",completedItems:n.filter(l=>l.status!=="failed").length+i.length,failedItems:d,exporterVersion:K},detail:{objects:n,deletedKeys:i,deleteErrors:c,targetId:r.id}}}async function ke(e,t,r){if(e.operation==="health")return {response:{schemaVersion:k,operation:"health",jobId:e.jobId,taskId:e.taskId,status:"succeeded",completedItems:1,failedItems:0,exporterVersion:K},detail:{allowedOperation:D,workspaceBucket:O,workspacePrefix:R,proxyConfigured:!!U}};if(D&&D!==e.operation)throw new Error(`Function is configured for ${D}, not ${e.operation}.`);if(!r)throw new Error("Remote worker progress reporter is required.");return e.operation==="render"?await Ot(e,t,r):e.operation==="asset"?await vt(e,t,r):e.operation==="rewrite"?await At(e,r):await Tt(e,r)}async function hr(e,t={}){let r=ue(e);try{if(r.operation==="health")return (await ke(r,t)).response;se();let o=x(_(R,r.jobId,r.taskId),"result.json"),n=await xt(o),s=new B(r,t.awsRequestId);if(n)return await s.completed(n),n;await s.started();try{let a=await ke(r,t,s),i={...a.response,resultKey:o};return await St(o,{schemaVersion:k,response:i,detail:a.detail,completedAt:new Date().toISOString(),requestId:t.awsRequestId??null}),await s.completed(i),i}catch(a){throw await s.failed(),a}}finally{r.operation==="render"&&await Rt();}}export{hr as handler};
4
+ `;return e.replace(/<head\b[^>]*>/i,n=>`${n}${o} ${t}`)}function nt(e){let t=we(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function ot(e,t){let r=[...new Set(t)].filter(s=>s.includes("/")&&!/\\+\//.test(s)).map(s=>[s,F(s)]).filter(([s,a])=>s!==a).sort((s,a)=>a[0].length-s[0].length);if(!r.length)return e;let o=s=>{let a=s;for(let[i,c]of r)a=a.split(i).join(c);return a},n=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(s,a,i,c)=>`${a}${o(i)}${c}`);return n=n.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(s,a,i,c,d)=>nt(c)?`${a}${o(c)}${d}`:s),n}function st(e,t){if(!t)return null;let r=M.dirname(M.resolve(t)),o=M.resolve(e.outputDir),n=M.relative(r,o).replace(/\\/g,"/");return n?(n.startsWith(".")||(n=`./${n}`),n.endsWith("/")?n:`${n}/`):"./"}function it(e,t,r){let o=st(t,r);if(!o)return e;let n=e;for(let s of Ge){let a=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`(?:\\.{1,}/)+${a}`,"g"),c=new RegExp(`(?<!\\.)/${a}`,"g");n=n.replace(i,`${o}${s}`).replace(c,`${o}${s}`);let d=s.replace(/\//g,"\\/"),l=o.replace(/\//g,"\\/"),u=d.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),p=new RegExp(`(?:\\.{1,}\\\\/)+${u}`,"g"),m=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${u}`,"g"),w=new RegExp(`(?<![\\.\\\\])\\/${u}`,"g");n=n.replace(p,`${l}${d}`).replace(m,`${l}${d}`).replace(w,`${l}${d}`);}return n}function se(e,t,r){if(e.urlRewriteMode==="absolute")return t;let o=(()=>{try{return new URL(t,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin)}catch{return null}})(),n=o?o.pathname:ye(t,e.targetOrigin),s=o?`${o.search}${o.hash}`:"";return e.urlRewriteMode==="root-relative"?`${n}${s}`:`${Re(e.outputDir,r,n)}${s}`}function oe(e,t,r,o,n){H(e,r,se(t,o,n));}function at(e,t,r,o,n){if(!r||r===o)return;H(e,r,o);let s=se(t,r,n),a=se(t,o,n);H(e,s,a);}function Ee(e,t,r,o,n={}){let s=e,a={};oe(a,t,t.sourceOrigin,t.targetOrigin,o);for(let[c,d]of Object.entries(t.extraReplacements))oe(a,t,c,d,o);for(let[c,d]of Object.entries(r))oe(a,t,c,d,o);for(let[c,d]of Object.entries(n)){let l=r[c];!l||l===d||at(a,t,d,l,o);}let i=Object.entries(a).sort((c,d)=>d[0].length-c[0].length);for(let[c,d]of i)s=et(s,c,d);return t.urlRewriteMode!=="absolute"&&(s=it(s,t,o)),s=ot(s,i.map(([,c])=>c)),tt(t,s,o)&&(s=rt(s)),s}var ie=String(process.env.PUBLISHER_PROGRESS_TABLE??"").trim(),ke=Number(process.env.PUBLISHER_PROGRESS_RETENTION_SECONDS??604800),ut=Number.isFinite(ke)?Math.max(86400,ke):604800,Se=ie?new DynamoDBClient({}):null;function dt(e){return e.operation==="render"||e.operation==="asset"?e.urls.length:e.operation==="rewrite"?e.items.length:e.items.length+(e.deleteRelativeKeys?.length??0)}async function pt(e){if(!(!Se||!ie))try{let t=Math.floor(Date.now()/1e3)+ut;await Se.send(new UpdateItemCommand({TableName:ie,Key:{jobId:{S:e.jobId},taskId:{S:e.taskId}},UpdateExpression:"SET #operation = :operation, #status = :status, completedItems = :completedItems, failedItems = :failedItems, totalItems = :totalItems, #sequence = :sequence, updatedAt = :updatedAt, expiresAt = :expiresAt"+(e.requestId?", requestId = :requestId":""),ConditionExpression:"attribute_not_exists(#sequence) OR #sequence < :sequence",ExpressionAttributeNames:{"#operation":"operation","#status":"status","#sequence":"sequence"},ExpressionAttributeValues:{":operation":{S:e.operation},":status":{S:e.status},":completedItems":{N:String(e.completedItems)},":failedItems":{N:String(e.failedItems)},":totalItems":{N:String(e.totalItems)},":sequence":{N:String(e.sequence)},":updatedAt":{S:e.updatedAt},":expiresAt":{N:String(t)},...e.requestId?{":requestId":{S:e.requestId}}:{}}}));}catch(t){if(t.name==="ConditionalCheckFailedException")return;console.warn(JSON.stringify({message:"Remote worker progress status could not be written.",jobId:e.jobId,taskId:e.taskId,error:t instanceof Error?t.message:String(t)}));}}var B=class{#t;#o;#e;#s;#i;#a=-1;#l=0;#n=0;#c=0;constructor(t,r,o=pt){this.#t=t,this.#o=r??null,this.#e=dt(t),this.#s=Math.max(1,Math.ceil(this.#e/20)),this.#i=o;}async started(){await this.#r("running",0,0,0);}async updated(t,r){this.#n=t,this.#c=r;let o=t+r,n=Date.now();o<this.#e&&o-this.#a<this.#s&&n-this.#l<5e3||await this.#r("running",t,r,o+1);}async completed(t){await this.#r(t.status,t.completedItems,t.failedItems,this.#e+2);}async failed(){let t=Math.min(this.#e-this.#n,Math.max(1,this.#c));await this.#r("failed",this.#n,t,this.#e+3);}async#r(t,r,o,n){this.#a=r+o,this.#l=Date.now(),await this.#i({jobId:this.#t.jobId,taskId:this.#t.taskId,operation:this.#t.operation,status:t,completedItems:r,failedItems:o,totalItems:this.#e,sequence:n,updatedAt:new Date().toISOString(),requestId:this.#o});}};var mt=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+\/[!#$%&'*+.^_`|~0-9A-Za-z-]+(?:\s*;.*)?$/u;function gt(e){try{return new URL(e).pathname}catch{return e}}function D(e,t,r){let o=String(e??"").trim();if(mt.test(o))return o;let n=xe.lookup(gt(t));return n?xe.contentType(n)||n:r}function ae(e){return String(e??"").split(";").map(t=>t.trim().toLowerCase()).filter(Boolean).join(";")}var O=String(process.env.PUBLISHER_WORKSPACE_BUCKET??"").trim(),b=j(process.env.PUBLISHER_WORKSPACE_PREFIX??""),z=String(process.env.PUBLISHER_ALLOWED_OPERATION??"").trim(),L=String(process.env.PUBLISHER_EXPORTER_VERSION??"unknown").trim(),U=String(process.env.PUBLISHER_PROXY_URL??"").trim(),kt=St(process.env.PUBLISHER_ALLOWED_TARGETS??"[]"),$e=new S3Client({}),Pe=new Map,R=null;function St(e){try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(r=>{if(!r||typeof r!="object")return !1;let o=r;return ["id","bucketName","prefix","region"].every(n=>typeof o[n]=="string")}).map(r=>({...r,prefix:j(r.prefix)})):[]}catch{return []}}function le(){if(!O)throw new Error("PUBLISHER_WORKSPACE_BUCKET is required.")}async function xt(){if(R){let t=await R.catch(()=>null);if(t?.isConnected())return t}let e=chromium.launch({headless:true,args:["--no-sandbox","--disable-setuid-sandbox","--disable-dev-shm-usage","--no-zygote","--single-process","--disable-gpu"],...U?{proxy:{server:U}}:{}});R=e;try{let t=await e;return t.once("disconnected",()=>{R===e&&(R=null);}),t}catch(t){throw R===e&&(R=null),t}}async function Pt(){let e=R;if(R=null,!e)return;let t=await e.catch(()=>null);t&&await t.close().catch(()=>{});}async function It(e){let t;for(let r=1;r<=2;r+=1){let o=await xt(),n=null;try{n=await o.newContext({viewport:e.options.viewport,ignoreHTTPSErrors:e.options.ignoreHttpsErrors,javaScriptEnabled:e.options.javaScriptEnabled,serviceWorkers:"block",userAgent:"WPSuiteStaticPublisher/remote-worker-v1"}),e.options.javaScriptEnabled&&await Tt(n);let s=await ge(n);return {context:n,page:await n.newPage(),networkPolicyViolation:s.getViolation}}catch(s){t=s,await n?.close().catch(()=>{}),R=null,await o.close().catch(()=>{});}}throw t instanceof Error?t:new Error(`Unable to create a Chromium page: ${String(t)}`)}async function Tt(e){await e.addInitScript(()=>{Object.defineProperty(window,"__WPSUITE_STATIC_EXPORT__",{value:true,writable:false,configurable:true});let t=r=>{if(r==null||String(r)==="")return true;try{let o=new URL(String(r),window.location.href),n=new URL(window.location.href);return o.hash="",n.hash="",o.href===n.href}catch{return false}};try{let r=window.location.assign.bind(window.location),o=window.location.replace.bind(window.location);Object.defineProperty(window.location,"assign",{configurable:!0,value:n=>{if(!t(n))return r(n)}}),Object.defineProperty(window.location,"replace",{configurable:!0,value:n=>{if(!t(n))return o(n)}}),Object.defineProperty(window.location,"reload",{configurable:!0,value:()=>{}});}catch{}});}async function $t(e,t){await e.evaluate(async r=>{await new Promise(o=>{let n=0,s=700,a=Date.now(),i=()=>{window.clearInterval(c),window.scrollTo(0,0),o();},c=window.setInterval(()=>{if(Date.now()-a>=r){i();return}window.scrollBy(0,s),n+=s;let d=Math.max(document.body?.scrollHeight||0,document.documentElement?.scrollHeight||0);n>=d+window.innerHeight&&i();},120);});},t);}async function ve(e){le();let t=T(e,b),r=await $e.send(new GetObjectCommand({Bucket:O,Key:t}));if(!r.Body)throw new Error(`S3 object has no body: ${t}`);return {body:await r.Body.transformToString("utf8"),contentType:r.ContentType?.trim()||null}}async function vt(e){return (await ve(e)).body}async function G(e){return JSON.parse(await vt(e))}async function X(e,t,r){le();let o=T(e,b),n=typeof t=="string"?Buffer.from(t,"utf8"):t,s=await $e.send(new PutObjectCommand({Bucket:O,Key:o,Body:n,ContentType:r,Metadata:{sha256:V(n)}}));return {bucket:O,key:o,sha256:V(n),bytes:n.byteLength,contentType:r,...s.ETag?{etag:s.ETag}:{},...s.VersionId?{versionId:s.VersionId}:{}}}async function Ot(e,t){return await X(e,`${JSON.stringify(t,null,2)}
5
+ `,"application/json; charset=utf-8")}async function At(e){try{let t=await G(e);return t.response??t}catch(t){if(t.name==="NoSuchKey"||t.$metadata?.httpStatusCode===404)return null;throw t}}function J(e){return [...new Set(e)].filter(t=>{try{let r=new URL(t);return (r.protocol==="http:"||r.protocol==="https:")&&!r.username&&!r.password}catch{return false}}).sort()}async function Wt(e,t,r){let o=null,n=null,s,a=new Set;try{let i=await It(e);o=i.context,n=i.page,s=i.networkPolicyViolation,n.on("request",f=>a.add(f.url()));let c=await n.goto(t,{waitUntil:"domcontentloaded",timeout:e.options.navigationTimeoutMs});e.options.readiness.waitForSelector&&await n.waitForSelector(e.options.readiness.waitForSelector,{timeout:e.options.readiness.timeoutMs}).catch(()=>{}),e.options.javaScriptEnabled&&e.options.readiness.waitForFunction&&await n.waitForFunction(e.options.readiness.waitForFunction,void 0,{timeout:e.options.readiness.timeoutMs}).catch(()=>{}),e.options.javaScriptEnabled?await $t(n,e.options.autoScrollTimeoutMs):await n.waitForLoadState("load",{timeout:e.options.readiness.timeoutMs}).catch(()=>{}),e.options.readiness.fallbackWaitMs>0&&await n.waitForTimeout(e.options.readiness.fallbackWaitMs);let d=s?.();if(d)throw d;let l=await n.evaluate(()=>{let f=(S,Oe)=>{let Y=[];for(let Ae of document.querySelectorAll(S))for(let ce of Oe){let Q=Ae.getAttribute(ce);if(Q)if(ce.includes("srcset"))for(let We of Q.split(",")){let ue=We.trim().split(/\s+/,1)[0];ue&&Y.push(ue);}else Y.push(Q);}return Y},A=S=>{try{return new URL(S,document.baseURI).href}catch{return null}};return {links:f("a[href]",["href"]).map(A).filter(S=>S!==null),assets:f("img,script,link,source,video,audio,iframe,[data-src],[data-href],[data-resource-url]",["src","href","srcset","data-src","data-srcset","data-href","data-resource-url","poster"]).map(A).filter(S=>S!==null)}});await n.evaluate(()=>{document.querySelectorAll("#wpsuite-consent-root").forEach(f=>f.remove()),document.documentElement.classList.remove("wpsuite-consent-scroll-locked"),document.body.classList.remove("wpsuite-consent-scroll-locked");});let u=await n.content(),p=s();if(p)throw p;let m=new URL(t),w=J(l.links).filter(f=>{let A=new URL(f);return A.hash="",A.origin===m.origin}),y=x(_(b,e.jobId,e.taskId),"pages",`${String(r).padStart(4,"0")}-${V(t).slice(0,24)}.html`),P=D(c?.headers()["content-type"],n.url()||t,"text/html; charset=utf-8"),Z=await X(y,u,P),K=(await o.cookies()).map(f=>({name:f.name,domain:f.domain,path:f.path,expires:f.expires,httpOnly:f.httpOnly,secure:f.secure,sameSite:f.sameSite,..."partitionKey"in f?{partitioned:!0}:{}})),g=c?.status()??null;return {requestedUrl:t,finalUrl:n?.url()||null,outcome:g!==null&&g>=400?"http-error":"rendered",httpStatus:g,contentType:P,html:Z,discoveredPages:w,discoveredAssets:J([...l.assets,...ne(n.url()||t,u,c?.headers()["content-type"]??"text/html")]),networkUrls:J([...a]),cookies:K}}catch(i){return {requestedUrl:t,finalUrl:n?.url()||null,outcome:"failed",httpStatus:null,contentType:null,html:null,discoveredPages:[],discoveredAssets:[],networkUrls:J([...a]),cookies:[],error:i instanceof Error?i.message:String(i)}}finally{await o?.close().catch(()=>{});}}function Ct(e,t){let r=t.toLowerCase();if(r.startsWith("text/")||r.includes("javascript")||r.includes("json")||r.includes("xml")||r.includes("svg"))return true;try{return /\.(?:css|js|mjs|json|xml|xsl|svg|txt|map|html?)$/i.test(new URL(e).pathname)}catch{return false}}async function jt(e,t,r){let o=t;for(let n=0;n<=5;n+=1){await re(o,"asset request");let s=await e.get(o,{timeout:r,failOnStatusCode:false,maxRedirects:0}),a=s.status();if(a<300||a>=400)return s;let i=s.headers().location;if(!i)return s;if(n===5)throw await s.dispose(),new Error("Asset request exceeded five redirects.");o=new URL(i,o).toString(),await s.dispose();}throw new Error("Asset redirect handling failed.")}async function Vt(e,t,r){if(!Array.isArray(e.urls)||e.urls.length<1||e.urls.length>20)throw new Error("Asset tasks require between 1 and 20 URLs.");let o=await request.newContext({ignoreHTTPSErrors:e.options.ignoreHttpsErrors,userAgent:"WPSuiteStaticPublisher/remote-asset-worker-v1",...U?{proxy:{server:U}}:{}}),n=[],s=async i=>{n.push(i);let c=n.filter(d=>d.outcome==="failed"||d.outcome==="deferred").length;await r.updated(n.length-c,c);};try{for(let i=0;i<e.urls.length;i+=1){let c=e.urls[i],d=t.getRemainingTimeInMillis?.();if(d!==void 0&&d<3e4){await s({requestedUrl:c,finalUrl:null,outcome:"deferred",httpStatus:null,contentType:null,cacheControl:null,lastModified:null,object:null,discoveredAssets:[],error:"Worker stopped accepting assets because less than 30 seconds remained."});continue}let l=null;try{l=await jt(o,c,e.options.timeoutMs);let u=l.status(),p=l.headers(),m=l.url()||c;if(u<200||u>=300){await s({requestedUrl:c,finalUrl:m,outcome:"http-error",httpStatus:u,contentType:p["content-type"]??null,cacheControl:p["cache-control"]??null,lastModified:p["last-modified"]??null,object:null,discoveredAssets:[],error:`Asset returned HTTP ${u}.`});continue}let w=await l.body(),y=D(p["content-type"],m,"application/octet-stream"),P=await X(x(_(b,e.jobId,e.taskId),"assets",`${String(i).padStart(4,"0")}-${V(c).slice(0,24)}.bin`),w,y);await s({requestedUrl:c,finalUrl:m,outcome:"fetched",httpStatus:u,contentType:y,cacheControl:p["cache-control"]??null,lastModified:p["last-modified"]??null,object:P,discoveredAssets:Ct(m,y)?ne(m,new TextDecoder("utf8").decode(w),y):[]});}catch(u){await s({requestedUrl:c,finalUrl:l?.url()??null,outcome:"failed",httpStatus:l?.status()??null,contentType:l?.headers()["content-type"]??null,cacheControl:l?.headers()["cache-control"]??null,lastModified:l?.headers()["last-modified"]??null,object:null,discoveredAssets:[],error:u instanceof Error?u.message:String(u)});}finally{await l?.dispose().catch(()=>{});}}}finally{await o.dispose();}let a=n.filter(i=>i.outcome==="failed"||i.outcome==="deferred").length;return {response:{schemaVersion:k,operation:"asset",jobId:e.jobId,taskId:e.taskId,status:a>0?"partial":"succeeded",completedItems:n.length-a,failedItems:a,exporterVersion:L},detail:{assets:n}}}async function Mt(e,t,r){if(!Array.isArray(e.urls)||e.urls.length<1||e.urls.length>20)throw new Error("Render tasks require between 1 and 20 URLs.");let o=new URL(e.sourceOrigin).origin,n=[];for(let a=0;a<e.urls.length;a+=1){let i=e.urls[a];if(!i)continue;let c=t.getRemainingTimeInMillis?.();if(c!==void 0&&c<6e4){n.push({requestedUrl:i,finalUrl:null,outcome:"deferred",httpStatus:null,contentType:null,html:null,discoveredPages:[],discoveredAssets:[],networkUrls:[],cookies:[],error:"Worker stopped accepting URLs because less than 60 seconds remained."}),await r.updated(n.filter(u=>u.outcome!=="failed"&&u.outcome!=="deferred").length,n.filter(u=>u.outcome==="failed"||u.outcome==="deferred").length);continue}let d=new URL(i);if(d.origin!==o)throw new Error(`Primary render URL is outside sourceOrigin: ${i}`);n.push(await Wt(e,d.toString(),a));let l=n.filter(u=>u.outcome==="failed"||u.outcome==="deferred").length;await r.updated(n.length-l,l);}let s=n.filter(a=>a.outcome==="failed"||a.outcome==="deferred").length;return {response:{schemaVersion:k,operation:"render",jobId:e.jobId,taskId:e.taskId,status:s>0?"partial":"succeeded",completedItems:n.length-s,failedItems:s,exporterVersion:L},detail:{pages:n}}}async function Ut(e,t){if(!Array.isArray(e.items)||e.items.length<1||e.items.length>500)throw new Error("Rewrite tasks require between 1 and 500 objects.");let o={...await G(e.configKey),outputDir:"/workspace"},n=await G(e.assetMapKey),s=e.previousAssetMapKey?await G(e.previousAssetMapKey):{},a=[];for(let i of e.items){let c=T(i.inputKey,b),d=T(i.outputKey,b),l=await ve(c),u=l.body,p=`/workspace/${i.relativePath.replace(/^\/+/,"")}`,m=Ee(u,o,n,p,s),w=D(i.contentType||l.contentType,i.relativePath,"text/plain; charset=utf-8"),y=await X(d,m,w);a.push({inputKey:c,outputKey:d,changed:m!==u,output:y}),await t.updated(a.length,0);}return {response:{schemaVersion:k,operation:"rewrite",jobId:e.jobId,taskId:e.taskId,status:"succeeded",completedItems:a.length,failedItems:0,exporterVersion:L},detail:{objects:a}}}function Lt(e,t){return `${e}/${t.split("/").map(r=>encodeURIComponent(r)).join("/")}`}async function Kt(e,t){if(!Array.isArray(e.items)||e.items.length>1e3)throw new Error("Deploy copy tasks accept at most 1000 objects.");let r=kt.find(l=>l.id===e.targetId);if(!r)throw new Error(`Unknown deployment target: ${e.targetId}`);let o=Pe.get(r.region);o||(o=new S3Client({region:r.region}),Pe.set(r.region,o));let n=[];for(let l of e.items){let u=T(l.sourceKey,b),p=x(r.prefix,l.targetRelativeKey);try{let m=await o.send(new HeadObjectCommand({Bucket:r.bucketName,Key:p})).catch(g=>{if((g&&typeof g=="object"&&"$metadata"in g?Number(g.$metadata?.httpStatusCode):0)===404||g?.name==="NotFound")return null;throw g}),w=String(m?.CacheControl??"").replace(/\s+/g,"")===l.cacheControl.replace(/\s+/g,""),y=ae(m?.ContentType)===ae(l.contentType),P=m?.Metadata?.["wpsuite-sha256"]===l.sha256,Z=!!l.normalizedSha256&&m?.Metadata?.["wpsuite-normalized-sha256"]===l.normalizedSha256;if(w&&y&&(P||Z)){n.push({sourceKey:u,targetKey:p,status:"skipped"}),await t.updated(n.filter(g=>g.status!=="failed").length,n.filter(g=>g.status==="failed").length);continue}let K=await o.send(new CopyObjectCommand({Bucket:r.bucketName,Key:p,CopySource:Lt(O,u),MetadataDirective:"REPLACE",ContentType:l.contentType,CacheControl:l.cacheControl,Metadata:{"wpsuite-sha256":l.sha256,...l.normalizedSha256?{"wpsuite-normalized-sha256":l.normalizedSha256}:{}}}));n.push({sourceKey:u,targetKey:p,status:"copied",...K.CopyObjectResult?.ETag?{etag:K.CopyObjectResult.ETag}:{}}),await t.updated(n.filter(g=>g.status!=="failed").length,n.filter(g=>g.status==="failed").length);}catch(m){n.push({sourceKey:u,targetKey:p,status:"failed",error:m instanceof Error?m.message:String(m)}),await t.updated(n.filter(w=>w.status!=="failed").length,n.filter(w=>w.status==="failed").length);}}let a=(e.deleteRelativeKeys??[]).map(l=>x(r.prefix,l)),i=[],c=[];if(a.length>0){let l=await o.send(new DeleteObjectsCommand({Bucket:r.bucketName,Delete:{Objects:a.map(u=>({Key:u})),Quiet:false}}));i.push(...(l.Deleted??[]).flatMap(u=>u.Key?[u.Key]:[])),c.push(...(l.Errors??[]).map(u=>({key:u.Key??"",error:u.Message??u.Code??"S3 deletion failed"}))),await t.updated(n.filter(u=>u.status!=="failed").length+i.length,n.filter(u=>u.status==="failed").length+c.length);}let d=n.filter(l=>l.status==="failed").length+c.length;return {response:{schemaVersion:k,operation:"deploy-copy",jobId:e.jobId,taskId:e.taskId,status:d>0?"partial":"succeeded",completedItems:n.filter(l=>l.status!=="failed").length+i.length,failedItems:d,exporterVersion:L},detail:{objects:n,deletedKeys:i,deleteErrors:c,targetId:r.id}}}async function Ie(e,t,r){if(e.operation==="health")return {response:{schemaVersion:k,operation:"health",jobId:e.jobId,taskId:e.taskId,status:"succeeded",completedItems:1,failedItems:0,exporterVersion:L},detail:{allowedOperation:z,workspaceBucket:O,workspacePrefix:b,proxyConfigured:!!U}};if(z&&z!==e.operation)throw new Error(`Function is configured for ${z}, not ${e.operation}.`);if(!r)throw new Error("Remote worker progress reporter is required.");return e.operation==="render"?await Mt(e,t,r):e.operation==="asset"?await Vt(e,t,r):e.operation==="rewrite"?await Ut(e,r):await Kt(e,r)}async function Ir(e,t={}){let r=me(e);try{if(r.operation==="health")return (await Ie(r,t)).response;le();let o=x(_(b,r.jobId,r.taskId),"result.json"),n=await At(o),s=new B(r,t.awsRequestId);if(n)return await s.completed(n),n;await s.started();try{let a=await Ie(r,t,s),i={...a.response,resultKey:o};return await Ot(o,{schemaVersion:k,response:i,detail:a.detail,completedAt:new Date().toISOString(),requestId:t.awsRequestId??null}),await s.completed(i),i}catch(a){throw await s.failed(),a}}finally{r.operation==="render"&&await Pt();}}export{Ir as handler};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smart-cloud/publisher-exporter",
3
- "version": "1.1.66",
3
+ "version": "1.1.67",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "description": "Headless Playwright static publisher for WordPress/Elementor sites with sitemap-only page discovery, strict asset capture, escaped URL rewrite, structured logs, and targeted retry modes.",