@smart-cloud/publisher-exporter 1.1.75 → 1.1.77

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,7 +1,7 @@
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 E from'path';import'fast-glob';import {statfs,readdir,readFile,rm,mkdir}from'fs/promises';import'os';import'worker_threads';import {DynamoDBClient,UpdateItemCommand}from'@aws-sdk/client-dynamodb';import je from'mime-types';import {setTimeout}from'timers/promises';import {writeSync}from'fs';var P=1,ke=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function V(e,t){let r=String(e??"").trim();if(!ke.test(r))throw new Error(`${t} must match ${ke.source} and be at most 128 characters.`);return r}function L(e){let t=String(e??"").trim().replace(/^\/+|\/+$/g,"");if(!t)return "";let r=t.split("/").filter(Boolean);if(r.some(n=>n==="."||n===".."))throw new Error("S3 prefix contains an unsafe dot path segment.");return `${r.join("/")}/`}function T(e,...t){let r=L(e),n=t.map((o,s)=>{let a=String(o??"").replace(/^\/+|\/+$/g,"");if(!a||a.split("/").some(i=>i==="."||i===".."))throw new Error(`Unsafe S3 key segment at index ${s}.`);return a});return `${r}${n.join("/")}`}function z(e,t,r){return `${T(e,"jobs",V(t,"jobId"),"tasks",V(r,"taskId"))}/`}function _(e){return createHash("sha256").update(e).digest("hex")}function W(e,t){let r=String(e??"").replace(/^\/+/,""),n=L(t);if(!r||r.includes("\0"))throw new Error("S3 object key is empty or invalid.");if(n&&!r.startsWith(n))throw new Error(`S3 object key is outside the configured workspace prefix: ${r}`);if(r.split("/").some(o=>o===".."))throw new Error("S3 object key contains an unsafe parent segment.");return r}function v(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`${t} must be a JSON object.`);return e}function w(e,t){if(typeof e!="string"||!e.trim())throw new Error(`${t} must be a non-empty string.`);return e.trim()}function S(e,t,r,n){if(!Number.isInteger(e)||Number(e)<r||Number(e)>n)throw new Error(`${t} must be an integer between ${r} and ${n}.`);return Number(e)}function st(e){return e.hostname.replace(/^\[|\]$/g,"").replace(/\.$/,"").toLowerCase()}function G(e){let t=e.split(".");if(t.length!==4)return null;let r=t.map(n=>Number(n));return r.every((n,o)=>Number.isInteger(n)&&n>=0&&n<=255&&String(n)===t[o])?r:null}function ae(e){let t=e.toLowerCase();if(t.includes("%")||t.split("::").length>2)return null;let r=t,n=r.lastIndexOf(":");if(r.includes(".")&&n>=0){let l=G(r.slice(n+1));if(!l)return null;r=`${r.slice(0,n)}:${((l[0]??0)*256+(l[1]??0)).toString(16)}:${((l[2]??0)*256+(l[3]??0)).toString(16)}`;}let[o,s]=r.split("::"),a=o?o.split(":"):[],i=s?s.split(":"):[],c=r.includes("::"),u=8-a.length-i.length;return c&&u<1||!c&&u!==0||[...a,...i].some(l=>!/^[0-9a-f]{1,4}$/.test(l))?null:[...a.map(l=>Number.parseInt(l,16)),...Array.from({length:u},()=>0),...i.map(l=>Number.parseInt(l,16))]}function Se(e){let t=G(e);if(!t)return "an invalid IPv4 address";let[r=0,n=0,o=0,s=0]=t;return r===0?"the unspecified/current-network IPv4 range":r===10||r===172&&n>=16&&n<=31||r===192&&n===168?"an RFC1918 private IPv4 range":r===127?"the IPv4 loopback range":r===169&&n===254?"the IPv4 link-local/metadata range":r===100&&n===100&&o===100&&s===200?"a cloud instance metadata endpoint":r===100&&n>=64&&n<=127?"the shared carrier-grade NAT IPv4 range":r===198&&(n===18||n===19)?"the IPv4 benchmarking range":r>=224&&r<=239?"the IPv4 multicast range":r>=240?"the reserved IPv4 range":null}function it(e){let t=ae(e);if(!t||t.length!==8)return "an invalid IPv6 address";if(t.every(o=>o===0))return "the unspecified IPv6 address";if(t.slice(0,7).every(o=>o===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(o=>o===0)&&t[5]===65535){let o=t[6]??0,s=t[7]??0;return Se(`${o>>8}.${o&255}.${s>>8}.${s&255}`)}return null}function ce(e){return G(e)?Se(e):ae(e)?it(e):"an invalid IP address"}function U(e,t){let r=w(e,t),n;try{n=new URL(r);}catch{throw new Error(`${t} must be a valid URL.`)}if(n.protocol!=="http:"&&n.protocol!=="https:")throw new Error(`${t} must use HTTP or HTTPS.`);if(n.username||n.password)throw new Error(`${t} must not contain URL credentials.`);let o=st(n);if(!o)throw new Error(`${t} must contain a hostname.`);if(o==="localhost"||o.endsWith(".localhost"))throw new Error(`${t} must not target localhost.`);if(o==="metadata.google.internal")throw new Error(`${t} must not target a cloud instance metadata endpoint.`);if(G(o)||ae(o)){let s=ce(o);if(s)throw new Error(`${t} must not target ${s}.`)}return n}function at(e){let t=U(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(U(a,`urls[${s}]`).origin!==t)throw new Error(`urls[${s}] is outside sourceOrigin.`);let r=v(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 n=v(r.viewport,"options.viewport");S(n.width,"options.viewport.width",320,7680),S(n.height,"options.viewport.height",240,7680),S(r.navigationTimeoutMs,"options.navigationTimeoutMs",1e3,6e5),S(r.autoScrollTimeoutMs,"options.autoScrollTimeoutMs",0,12e4);let o=v(r.readiness,"options.readiness");for(let s of ["waitForSelector","waitForFunction"])if(o[s]!==null&&typeof o[s]!="string")throw new Error(`options.readiness.${s} must be a string or null.`);S(o.timeoutMs,"options.readiness.timeoutMs",0,12e4),S(o.fallbackWaitMs,"options.readiness.fallbackWaitMs",0,12e4);}function ct(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,n]of e.urls.entries())U(n,`urls[${r}]`);let t=v(e.options,"options");if(typeof t.ignoreHttpsErrors!="boolean")throw new Error("options.ignoreHttpsErrors must be a boolean.");S(t.timeoutMs,"options.timeoutMs",1e3,12e4);}function lt(e){if(w(e.configKey,"configKey"),w(e.assetMapKey,"assetMapKey"),e.previousAssetMapKey!==void 0&&w(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 n=v(r,`items[${t}]`);w(n.inputKey,`items[${t}].inputKey`),w(n.outputKey,`items[${t}].outputKey`),w(n.relativePath,`items[${t}].relativePath`),n.contentType!==void 0&&n.contentType!==null&&w(n.contentType,`items[${t}].contentType`);}}function ut(e){if(V(w(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,n]of e.items.entries()){let o=v(n,`items[${r}]`);w(o.sourceKey,`items[${r}].sourceKey`),w(o.targetRelativeKey,`items[${r}].targetRelativeKey`),w(o.sha256,`items[${r}].sha256`),o.normalizedSha256!==void 0&&w(o.normalizedSha256,`items[${r}].normalizedSha256`),S(o.bytes,`items[${r}].bytes`,0,Number.MAX_SAFE_INTEGER),w(o.contentType,`items[${r}].contentType`),w(o.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,n]of t.entries())w(n,`deleteRelativeKeys[${r}]`);if(e.items.length===0&&t.length===0)throw new Error("Deploy copy tasks require copy or deletion work.")}function Pe(e){if(!e||typeof e!="object")throw new Error("Worker event must be a JSON object.");let t=e;if(t.schemaVersion!==P)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 V(String(t.jobId??""),"jobId"),V(String(t.taskId??""),"taskId"),r==="render"&&at(t),r==="asset"&&ct(t),r==="rewrite"&&lt(t),r==="deploy-copy"&&ut(t),e}function mt(e){return e.hostname.replace(/^\[|\]$/g,"").replace(/\.$/,"").toLowerCase()}async function gt(e){return (await lookup(e,{all:true,verbatim:true})).map(t=>t.address)}async function le(e,t,r=gt){let n=U(e,t),o=mt(n);if(isIP(o))return n;let s;try{s=await r(o);}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=ce(a);if(i)throw new Error(`${t} hostname resolves to ${i}.`)}return n}async function xe(e,t=le){let r=null;return await e.route("**/*",async n=>{try{await t(n.request().url(),"render request");}catch(o){r??=o instanceof Error?o:new Error(String(o)),await n.abort("blockedbyclient").catch(()=>{});return}await n.continue();}),await e.routeWebSocket("**/*",async n=>{try{await t(n.url(),"render WebSocket request");}catch(o){r??=o instanceof Error?o:new Error(String(o)),await n.close({code:1008,reason:"Blocked by network policy"});return}await n.close({code:1008,reason:"Only HTTP(S) requests are allowed"}),r??=new Error("render WebSocket request must use HTTP or HTTPS.");}),{getViolation:()=>r}}function ht(e){return e.replace(/&amp;/gi,"&").replace(/&quot;/gi,'"').replace(/&#39;|&apos;/gi,"'").replace(/&lt;/gi,"<").replace(/&gt;/gi,">")}function wt(e,t){let r=e.trim();if(!r||r.startsWith("data:")||r.startsWith("blob:")||r.startsWith("javascript:")||r.startsWith("#"))return null;try{let n=new URL(r,t);return n.protocol!=="http:"&&n.protocol!=="https:"||n.username||n.password?null:(n.hash="",n.toString())}catch{return null}}function C(e,t,r){let n=wt(t,r);n&&e.add(n);}function yt(e,t,r){for(let n of t.split(",")){let o=n.trim().split(/\s+/,1)[0];o&&C(e,o,r);}}function ue(e,t,r=""){let n=new Set,o=ht(t).replace(/\\\//g,"/");for(let i of o.matchAll(/\b(?:src|href|poster|data-src|data-href|data-resource-url)\s*=\s*["']([^"']+)["']/gi))C(n,i[1]??"",e);for(let i of o.matchAll(/\b(?:srcset|data-srcset)\s*=\s*["']([^"']+)["']/gi))yt(n,i[1]??"",e);for(let i of o.matchAll(/url\(\s*(?:"([^"]+)"|'([^']+)'|([^)]*?))\s*\)/gi))C(n,i[1]??i[2]??i[3]??"",e);for(let i of o.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;)]+)['"]?\s*\)?/gi))C(n,i[1]??"",e);for(let i of o.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi))C(n,i[1]??"",e);let s=(()=>{try{return E.extname(new URL(e).pathname).toLowerCase()}catch{return ""}})();if(s===".js"||s===".mjs"||/(?:java|ecma)script/i.test(r))for(let i of o.matchAll(/["']((?:\.\.?\/|\/)?[^"'\s]+\.(?:js|mjs)(?:[?#][^"']*)?)["']/gi))C(n,i[1]??"",e);return [...n].sort()}function ve(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 O(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function X(e){return e.replace(/\//g,"\\/")}function Ie(e){return e.replace(/\//g,"\\\\/")}function Rt(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 Te(e,t,r){if(!t)return;e[t]=r;let n=X(t),o=X(r);e[n]=o;let s=Ie(t),a=Ie(r);e[s]=a;let i=O(t),c=O(r);e[i]=c;let u=O(n),l=O(o);e[u]=l;let d=O(s),m=O(a);e[d]=m;}function Z(e,t,r){Te(e,t,r);let n=Rt(t);n&&n!==t&&Te(e,n,r);}function We(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function Ce(e,t,r){if(!t)return r;let n=E.dirname(E.resolve(t)),o=E.resolve(e,r.replace(/^\/+/,"")),s=E.relative(n,o).replace(/\\/g,"/");return s?(s.startsWith(".")||(s=`./${s}`),s):"."}var bt=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],Et=new Set([".html",".htm"]),Oe="WPSuite.io Static Publisher",kt=Oe.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function St(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Pt(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function xt(e,t,r){return Pt(t)?e.replace(new RegExp(`(?<!:)${St(t)}`,"g"),r):e.split(t).join(r)}function It(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let o=E.extname(r).toLowerCase();return Et.has(o)?/<head\b|<html\b|<!doctype html/i.test(t):false}function Tt(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${kt}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${Oe}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let n=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 E from'path';import'fast-glob';import {statfs,readdir,readFile,rm,mkdir}from'fs/promises';import'os';import'worker_threads';import {DynamoDBClient,UpdateItemCommand}from'@aws-sdk/client-dynamodb';import je from'mime-types';import {setTimeout}from'timers/promises';import {writeSync}from'fs';var P=1,Se=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function _(e,t){let r=String(e??"").trim();if(!Se.test(r))throw new Error(`${t} must match ${Se.source} and be at most 128 characters.`);return r}function U(e){let t=String(e??"").trim().replace(/^\/+|\/+$/g,"");if(!t)return "";let r=t.split("/").filter(Boolean);if(r.some(n=>n==="."||n===".."))throw new Error("S3 prefix contains an unsafe dot path segment.");return `${r.join("/")}/`}function v(e,...t){let r=U(e),n=t.map((o,s)=>{let a=String(o??"").replace(/^\/+|\/+$/g,"");if(!a||a.split("/").some(i=>i==="."||i===".."))throw new Error(`Unsafe S3 key segment at index ${s}.`);return a});return `${r}${n.join("/")}`}function z(e,t,r){return `${v(e,"jobs",_(t,"jobId"),"tasks",_(r,"taskId"))}/`}function L(e){return createHash("sha256").update(e).digest("hex")}function W(e,t){let r=String(e??"").replace(/^\/+/,""),n=U(t);if(!r||r.includes("\0"))throw new Error("S3 object key is empty or invalid.");if(n&&!r.startsWith(n))throw new Error(`S3 object key is outside the configured workspace prefix: ${r}`);if(r.split("/").some(o=>o===".."))throw new Error("S3 object key contains an unsafe parent segment.");return r}function O(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`${t} must be a JSON object.`);return e}function w(e,t){if(typeof e!="string"||!e.trim())throw new Error(`${t} must be a non-empty string.`);return e.trim()}function k(e,t,r,n){if(!Number.isInteger(e)||Number(e)<r||Number(e)>n)throw new Error(`${t} must be an integer between ${r} and ${n}.`);return Number(e)}function at(e){return e.hostname.replace(/^\[|\]$/g,"").replace(/\.$/,"").toLowerCase()}function G(e){let t=e.split(".");if(t.length!==4)return null;let r=t.map(n=>Number(n));return r.every((n,o)=>Number.isInteger(n)&&n>=0&&n<=255&&String(n)===t[o])?r:null}function ae(e){let t=e.toLowerCase();if(t.includes("%")||t.split("::").length>2)return null;let r=t,n=r.lastIndexOf(":");if(r.includes(".")&&n>=0){let u=G(r.slice(n+1));if(!u)return null;r=`${r.slice(0,n)}:${((u[0]??0)*256+(u[1]??0)).toString(16)}:${((u[2]??0)*256+(u[3]??0)).toString(16)}`;}let[o,s]=r.split("::"),a=o?o.split(":"):[],i=s?s.split(":"):[],c=r.includes("::"),d=8-a.length-i.length;return c&&d<1||!c&&d!==0||[...a,...i].some(u=>!/^[0-9a-f]{1,4}$/.test(u))?null:[...a.map(u=>Number.parseInt(u,16)),...Array.from({length:d},()=>0),...i.map(u=>Number.parseInt(u,16))]}function ke(e){let t=G(e);if(!t)return "an invalid IPv4 address";let[r=0,n=0,o=0,s=0]=t;return r===0?"the unspecified/current-network IPv4 range":r===10||r===172&&n>=16&&n<=31||r===192&&n===168?"an RFC1918 private IPv4 range":r===127?"the IPv4 loopback range":r===169&&n===254?"the IPv4 link-local/metadata range":r===100&&n===100&&o===100&&s===200?"a cloud instance metadata endpoint":r===100&&n>=64&&n<=127?"the shared carrier-grade NAT IPv4 range":r===198&&(n===18||n===19)?"the IPv4 benchmarking range":r>=224&&r<=239?"the IPv4 multicast range":r>=240?"the reserved IPv4 range":null}function ct(e){let t=ae(e);if(!t||t.length!==8)return "an invalid IPv6 address";if(t.every(o=>o===0))return "the unspecified IPv6 address";if(t.slice(0,7).every(o=>o===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(o=>o===0)&&t[5]===65535){let o=t[6]??0,s=t[7]??0;return ke(`${o>>8}.${o&255}.${s>>8}.${s&255}`)}return null}function ce(e){return G(e)?ke(e):ae(e)?ct(e):"an invalid IP address"}function V(e,t){let r=w(e,t),n;try{n=new URL(r);}catch{throw new Error(`${t} must be a valid URL.`)}if(n.protocol!=="http:"&&n.protocol!=="https:")throw new Error(`${t} must use HTTP or HTTPS.`);if(n.username||n.password)throw new Error(`${t} must not contain URL credentials.`);let o=at(n);if(!o)throw new Error(`${t} must contain a hostname.`);if(o==="localhost"||o.endsWith(".localhost"))throw new Error(`${t} must not target localhost.`);if(o==="metadata.google.internal")throw new Error(`${t} must not target a cloud instance metadata endpoint.`);if(G(o)||ae(o)){let s=ce(o);if(s)throw new Error(`${t} must not target ${s}.`)}return n}function lt(e){let t=V(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(V(a,`urls[${s}]`).origin!==t)throw new Error(`urls[${s}] is outside sourceOrigin.`);let r=O(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 n=O(r.viewport,"options.viewport");k(n.width,"options.viewport.width",320,7680),k(n.height,"options.viewport.height",240,7680),k(r.navigationTimeoutMs,"options.navigationTimeoutMs",1e3,6e5),k(r.autoScrollTimeoutMs,"options.autoScrollTimeoutMs",0,12e4);let o=O(r.readiness,"options.readiness");for(let s of ["waitForSelector","waitForFunction"])if(o[s]!==null&&typeof o[s]!="string")throw new Error(`options.readiness.${s} must be a string or null.`);k(o.timeoutMs,"options.readiness.timeoutMs",0,12e4),k(o.fallbackWaitMs,"options.readiness.fallbackWaitMs",0,12e4);}function ut(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,n]of e.urls.entries())V(n,`urls[${r}]`);let t=O(e.options,"options");if(typeof t.ignoreHttpsErrors!="boolean")throw new Error("options.ignoreHttpsErrors must be a boolean.");k(t.timeoutMs,"options.timeoutMs",1e3,12e4);}function dt(e){if(w(e.configKey,"configKey"),w(e.assetMapKey,"assetMapKey"),e.previousAssetMapKey!==void 0&&w(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 n=O(r,`items[${t}]`);w(n.inputKey,`items[${t}].inputKey`),w(n.outputKey,`items[${t}].outputKey`),w(n.relativePath,`items[${t}].relativePath`),n.contentType!==void 0&&n.contentType!==null&&w(n.contentType,`items[${t}].contentType`);}}function pt(e){if(_(w(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,n]of e.items.entries()){let o=O(n,`items[${r}]`);w(o.sourceKey,`items[${r}].sourceKey`),w(o.targetRelativeKey,`items[${r}].targetRelativeKey`),w(o.sha256,`items[${r}].sha256`),o.normalizedSha256!==void 0&&w(o.normalizedSha256,`items[${r}].normalizedSha256`),k(o.bytes,`items[${r}].bytes`,0,Number.MAX_SAFE_INTEGER),w(o.contentType,`items[${r}].contentType`),w(o.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,n]of t.entries())w(n,`deleteRelativeKeys[${r}]`);if(e.items.length===0&&t.length===0)throw new Error("Deploy copy tasks require copy or deletion work.")}function Pe(e){if(!e||typeof e!="object")throw new Error("Worker event must be a JSON object.");let t=e;if(t.schemaVersion!==P)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 _(String(t.jobId??""),"jobId"),_(String(t.taskId??""),"taskId"),r==="render"&&lt(t),r==="asset"&&ut(t),r==="rewrite"&&dt(t),r==="deploy-copy"&&pt(t),e}function ft(e){return e.hostname.replace(/^\[|\]$/g,"").replace(/\.$/,"").toLowerCase()}async function ht(e){return (await lookup(e,{all:true,verbatim:true})).map(t=>t.address)}async function le(e,t,r=ht){let n=V(e,t),o=ft(n);if(isIP(o))return n;let s;try{s=await r(o);}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=ce(a);if(i)throw new Error(`${t} hostname resolves to ${i}.`)}return n}async function Ie(e,t=le){let r=null;return await e.route("**/*",async n=>{try{await t(n.request().url(),"render request");}catch(o){r??=o instanceof Error?o:new Error(String(o)),await n.abort("blockedbyclient").catch(()=>{});return}await n.continue();}),await e.routeWebSocket("**/*",async n=>{try{await t(n.url(),"render WebSocket request");}catch(o){r??=o instanceof Error?o:new Error(String(o)),await n.close({code:1008,reason:"Blocked by network policy"});return}await n.close({code:1008,reason:"Only HTTP(S) requests are allowed"}),r??=new Error("render WebSocket request must use HTTP or HTTPS.");}),{getViolation:()=>r}}function yt(e){return e.replace(/&amp;/gi,"&").replace(/&quot;/gi,'"').replace(/&#39;|&apos;/gi,"'").replace(/&lt;/gi,"<").replace(/&gt;/gi,">")}function Rt(e,t){let r=e.trim();if(!r||r.startsWith("data:")||r.startsWith("blob:")||r.startsWith("javascript:")||r.startsWith("#"))return null;try{let n=new URL(r,t);return n.protocol!=="http:"&&n.protocol!=="https:"||n.username||n.password?null:(n.hash="",n.toString())}catch{return null}}function C(e,t,r){let n=Rt(t,r);n&&e.add(n);}function bt(e,t,r){for(let n of t.split(",")){let o=n.trim().split(/\s+/,1)[0];o&&C(e,o,r);}}function ue(e,t,r=""){let n=new Set,o=yt(t).replace(/\\\//g,"/");for(let i of o.matchAll(/\b(?:src|href|poster|data-src|data-href|data-resource-url)\s*=\s*["']([^"']+)["']/gi))C(n,i[1]??"",e);for(let i of o.matchAll(/\b(?:srcset|data-srcset)\s*=\s*["']([^"']+)["']/gi))bt(n,i[1]??"",e);for(let i of o.matchAll(/url\(\s*(?:"([^"]+)"|'([^']+)'|([^)]*?))\s*\)/gi))C(n,i[1]??i[2]??i[3]??"",e);for(let i of o.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;)]+)['"]?\s*\)?/gi))C(n,i[1]??"",e);for(let i of o.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi))C(n,i[1]??"",e);let s=(()=>{try{return E.extname(new URL(e).pathname).toLowerCase()}catch{return ""}})();if(s===".js"||s===".mjs"||/(?:java|ecma)script/i.test(r))for(let i of o.matchAll(/["']((?:\.\.?\/|\/)?[^"'\s]+\.(?:js|mjs)(?:[?#][^"']*)?)["']/gi))C(n,i[1]??"",e);return [...n].sort()}function ve(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 M(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function X(e){return e.replace(/\//g,"\\/")}function xe(e){return e.replace(/\//g,"\\\\/")}function Et(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 Te(e,t,r){if(!t)return;e[t]=r;let n=X(t),o=X(r);e[n]=o;let s=xe(t),a=xe(r);e[s]=a;let i=M(t),c=M(r);e[i]=c;let d=M(n),u=M(o);e[d]=u;let l=M(s),p=M(a);e[l]=p;}function Z(e,t,r){Te(e,t,r);let n=Et(t);n&&n!==t&&Te(e,n,r);}function Oe(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function We(e,t,r){if(!t)return r;let n=E.dirname(E.resolve(t)),o=E.resolve(e,r.replace(/^\/+/,"")),s=E.relative(n,o).replace(/\\/g,"/");return s?(s.startsWith(".")||(s=`./${s}`),s):"."}var St=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],kt=new Set([".html",".htm"]),Ce="WPSuite.io Static Publisher",Pt=Ce.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function It(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function xt(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function Tt(e,t,r){return xt(t)?e.replace(new RegExp(`(?<!:)${It(t)}`,"g"),r):e.split(t).join(r)}function vt(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let o=E.extname(r).toLowerCase();return kt.has(o)?/<head\b|<html\b|<!doctype html/i.test(t):false}function Ot(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${Pt}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${Ce}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let n=e.includes(`\r
2
2
  `)?`\r
3
3
  `:`
4
- `;return e.replace(/<head\b[^>]*>/i,o=>`${o}${n} ${t}`)}function vt(e){let t=ve(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function Wt(e,t){let r=[...new Set(t)].filter(s=>s.includes("/")&&!/\\+\//.test(s)).map(s=>[s,X(s)]).filter(([s,a])=>s!==a).sort((s,a)=>a[0].length-s[0].length);if(!r.length)return e;let n=s=>{let a=s;for(let[i,c]of r)a=a.split(i).join(c);return a},o=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(s,a,i,c)=>`${a}${n(i)}${c}`);return o=o.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(s,a,i,c,u)=>vt(c)?`${a}${n(c)}${u}`:s),o}function Ct(e,t){if(!t)return null;let r=E.dirname(E.resolve(t)),n=E.resolve(e.outputDir),o=E.relative(r,n).replace(/\\/g,"/");return o?(o.startsWith(".")||(o=`./${o}`),o.endsWith("/")?o:`${o}/`):"./"}function Ot(e,t,r){let n=Ct(t,r);if(!n)return e;let o=e;for(let s of bt){let a=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`(?:\\.{1,}/)+${a}`,"g"),c=new RegExp(`(?<!\\.)/${a}`,"g");o=o.replace(i,`${n}${s}`).replace(c,`${n}${s}`);let u=s.replace(/\//g,"\\/"),l=n.replace(/\//g,"\\/"),d=u.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),m=new RegExp(`(?:\\.{1,}\\\\/)+${d}`,"g"),p=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${d}`,"g"),y=new RegExp(`(?<![\\.\\\\])\\/${d}`,"g");o=o.replace(m,`${l}${u}`).replace(p,`${l}${u}`).replace(y,`${l}${u}`);}return o}function pe(e,t,r){if(e.urlRewriteMode==="absolute")return t;let n=(()=>{try{return new URL(t,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin)}catch{return null}})(),o=n?n.pathname:We(t,e.targetOrigin),s=n?`${n.search}${n.hash}`:"";return e.urlRewriteMode==="root-relative"?`${o}${s}`:`${Ce(e.outputDir,r,o)}${s}`}function de(e,t,r,n,o){Z(e,r,pe(t,n,o));}function $t(e,t,r,n,o){if(!r||r===n)return;Z(e,r,n);let s=pe(t,r,o),a=pe(t,n,o);Z(e,s,a);}function $e(e,t,r,n,o={}){let s=e,a={};de(a,t,t.sourceOrigin,t.targetOrigin,n);for(let[c,u]of Object.entries(t.extraReplacements))de(a,t,c,u,n);for(let[c,u]of Object.entries(r))de(a,t,c,u,n);for(let[c,u]of Object.entries(o)){let l=r[c];!l||l===u||$t(a,t,u,l,n);}let i=Object.entries(a).sort((c,u)=>u[0].length-c[0].length);for(let[c,u]of i)s=xt(s,c,u);return t.urlRewriteMode!=="absolute"&&(s=Ot(s,t,n)),s=Wt(s,i.map(([,c])=>c)),It(t,s,n)&&(s=Tt(s)),s}var me=String(process.env.PUBLISHER_PROGRESS_TABLE??"").trim(),Me=Number(process.env.PUBLISHER_PROGRESS_RETENTION_SECONDS??604800),jt=Number.isFinite(Me)?Math.max(86400,Me):604800,Ae=me?new DynamoDBClient({}):null;function Vt(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 Ut(e){if(!(!Ae||!me))try{let t=Math.floor(Date.now()/1e3)+jt;await Ae.send(new UpdateItemCommand({TableName:me,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 Y=class{#t;#o;#e;#s;#i;#a=-1;#c=0;#n=0;#l=0;constructor(t,r,n=Ut){this.#t=t,this.#o=r??null,this.#e=Vt(t),this.#s=Math.max(1,Math.ceil(this.#e/20)),this.#i=n;}async started(){await this.#r("running",0,0,0);}async updated(t,r){this.#n=t,this.#l=r;let n=t+r,o=Date.now();n<this.#e&&n-this.#a<this.#s&&o-this.#c<5e3||await this.#r("running",t,r,n+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.#l));await this.#r("failed",this.#n,t,this.#e+3);}async#r(t,r,n,o){this.#a=r+n,this.#c=Date.now(),await this.#i({jobId:this.#t.jobId,taskId:this.#t.taskId,operation:this.#t.operation,status:t,completedItems:r,failedItems:n,totalItems:this.#e,sequence:o,updatedAt:new Date().toISOString(),requestId:this.#o});}};var Lt=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+\/[!#$%&'*+.^_`|~0-9A-Za-z-]+(?:\s*;.*)?$/u;function _t(e){try{return new URL(e).pathname}catch{return e}}function Q(e,t,r){let n=String(e??"").trim();if(Lt.test(n))return n;let o=je.lookup(_t(t));return o?je.contentType(o)||o:r}function ge(e){return String(e??"").split(";").map(t=>t.trim().toLowerCase()).filter(Boolean).join(";")}var Le="playwright_chromiumdev_profile-",Ft="/tmp/wpsuite-publisher-browser";function x(e){return Math.round(e/1024/1024*100)/100}async function Ve(e){try{let t=await statfs(e),r=t.blocks*t.bsize,n=t.bavail*t.bsize;return {path:e,totalMiB:x(r),availableMiB:x(n),usedMiB:x(r-n)}}catch(t){return {path:e,totalMiB:null,availableMiB:null,usedMiB:null,error:t instanceof Error?t.message:String(t)}}}async function Ht(e){return (await fe(e)).filter(t=>t.startsWith(Le))}async function fe(e){try{return (await readdir(e,{withFileTypes:!0})).map(t=>t.name).sort()}catch(t){if(t.code==="ENOENT")return [];throw t}}function he(){return E.resolve(process.env.PUBLISHER_BROWSER_TEMP_ROOT?.trim()||Ft)}async function _e(e=he()){let t=Be(e),r=E.join(t,"home"),n=E.join(t,"cache"),o=E.join(t,"config");await Promise.all([t,r,n,o].map(s=>mkdir(s,{recursive:true}))),process.env.TMPDIR=t,process.env.HOME=r,process.env.XDG_CACHE_HOME=n,process.env.XDG_CONFIG_HOME=o;}async function Ke(e=he()){let t=process.memoryUsage(),[r,n,o,s]=await Promise.all([Ve(e),Ve("/dev/shm"),Ht(e),fe(e)]);return {processMemoryMiB:{rss:x(t.rss),heapUsed:x(t.heapUsed),heapTotal:x(t.heapTotal),external:x(t.external),arrayBuffers:x(t.arrayBuffers)},tempStorage:r,sharedMemory:n,playwrightProfiles:{count:o.length,names:o.slice(0,20)},tempEntries:{count:s.length,names:s.slice(0,20)}}}function Be(e){let t=E.resolve(e);if(t===E.parse(t).root)throw new Error(`Refusing to clean filesystem root: ${t}`);if(t==="/tmp"||t==="/var/tmp")throw new Error(`Refusing to clean shared temp root: ${t}`);return t}async function Ne(e=he()){let t=Be(e),r=await fe(t);for(let n of r)await rm(E.join(t,n),{recursive:true,force:true,maxRetries:3,retryDelay:50});return r}function zt(e){let t=e.split("\0",1)[0]??"",r=E.basename(t).toLowerCase();return r.includes("chrome-headless-shell")||r==="chrome_crashpad_handler"||r==="chromium"||r==="chromium-browser"||e.includes(Le)&&/(?:chrome|chromium)/i.test(e)}async function De(e="/proc",t=r=>process.kill(r,"SIGKILL")){let r;try{r=await readdir(e,{withFileTypes:!0});}catch(o){if(o.code==="ENOENT")return [];throw o}let n=[];for(let o of r){if(!o.isDirectory()||!/^\d+$/.test(o.name))continue;let s=Number(o.name);if(!Number.isSafeInteger(s)||s<1||s===process.pid)continue;let a;try{a=await readFile(E.join(e,o.name,"cmdline"),"utf8");}catch(i){if(["ENOENT","EACCES","EPERM","ESRCH"].includes(String(i.code)))continue;throw i}if(zt(a))try{t(s),n.push(s);}catch(i){if(["ESRCH","EPERM"].includes(String(i.code)))continue;throw i}}return n.length>0&&await setTimeout(100),n.sort((o,s)=>o-s)}var B={},qe=false;function Jt(e){if(e)try{let t=new URL(e);return t.username="",t.password="",t.search="",t.hash="",t.toString()}catch{return}}function Fe(e){return {...e,...e.url?{url:Jt(e.url)}:{}}}function He(e){return e instanceof Error?{errorName:e.name,errorMessage:e.message,...e.stack?{errorStack:e.stack}:{}}:{error:String(e)}}function we(e,t={}){try{writeSync(2,`${JSON.stringify({level:"ERROR",message:"Remote worker runtime diagnostic.",event:e,...B,...t,timestamp:new Date().toISOString()})}
5
- `);}catch{}}function ze(){qe||(qe=true,process.on("uncaughtExceptionMonitor",(e,t)=>{we("runtime.uncaught-exception",{origin:t,...He(e)});}),process.on("exit",e=>{we("runtime.process-exit",{exitCode:e});}));}async function g(e,t,r={},n="info"){try{B=Fe(t);let o=null;try{o=await Ke();}catch(a){r={...r,resourceSnapshotError:a instanceof Error?a.message:String(a)};}let s=JSON.stringify({message:"Remote worker checkpoint.",event:e,...B,...r,...o?{resources:o}:{}});console[n](s);}catch(o){we("checkpoint.write-failed",{checkpointEvent:e,...He(o)});}}function ee(e){B=Fe(e);}function Ge(){B={};}var $=String(process.env.PUBLISHER_WORKSPACE_BUCKET??"").trim(),k=L(process.env.PUBLISHER_WORKSPACE_PREFIX??""),te=String(process.env.PUBLISHER_ALLOWED_OPERATION??"").trim(),M=String(process.env.PUBLISHER_EXPORTER_VERSION??"unknown").trim(),N=String(process.env.PUBLISHER_PROXY_URL??"").trim(),nr=or(process.env.PUBLISHER_ALLOWED_TARGETS??"[]"),Ye=new S3Client({}),Je=new Map,b=null,D=false;ze();function or(e){try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(r=>{if(!r||typeof r!="object")return !1;let n=r;return ["id","bucketName","prefix","region"].every(o=>typeof n[o]=="string")}).map(r=>({...r,prefix:L(r.prefix)})):[]}catch{return []}}function ye(){if(!$)throw new Error("PUBLISHER_WORKSPACE_BUCKET is required.")}async function Re(e,t){try{let r=await De();r.length>0&&await g(`browser.stale-processes-killed.${t}`,e,{killedProcesses:r.length,killedProcessIds:r},"warn");let n=await Ne();n.length>0&&await g(`browser.temp-entries-removed.${t}`,e,{removedEntries:n.length,removedEntryNames:n.slice(0,20)}),await _e();}catch(r){if(await g(`browser.profile-cleanup-failed.${t}`,e,{error:r instanceof Error?r.message:String(r)},"error"),t==="before-launch")throw r}}async function sr(e){if(b){let r=await b.catch(()=>null);if(r?.isConnected())return r}await g("browser.launch-preparing",e),await Re(e,"before-launch"),await g("browser.launch-started",e);let t=chromium.launch({headless:true,args:["--no-sandbox","--disable-setuid-sandbox","--no-zygote","--disable-gpu"],...N?{proxy:{server:N}}:{}});b=t;try{let r=await t;return r.once("disconnected",()=>{b===t&&(b=null);let n=D;ee(e),g("browser.disconnected",e,{expected:n},n?"info":"error");}),await g("browser.launch-succeeded",e),r}catch(r){throw b===t&&(b=null),await g("browser.launch-failed",e,{error:r instanceof Error?r.message:String(r)},"error"),r}}async function Qe(e){let t=b;if(b=null,t){let r=await t.catch(()=>null);r&&(D=true,await r.close().catch(async n=>{await g("browser.close-failed",e,{error:n instanceof Error?n.message:String(n)},"warn");}),D=false);}await Re(e,"after-close");}async function ir(e,t){let r;for(let n=1;n<=2;n+=1){let o=await sr({...t,attempt:n}),s=null;try{s=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 ar(s);let a=await xe(s);return {context:s,page:await s.newPage(),networkPolicyViolation:a.getViolation}}catch(a){r=a,await s?.close().catch(()=>{}),b=null,D=true,await o.close().catch(()=>{}),D=false,await Re({...t,attempt:n},"after-close");}}throw r instanceof Error?r:new Error(`Unable to create a Chromium page: ${String(r)}`)}async function ar(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 n=new URL(String(r),window.location.href),o=new URL(window.location.href);return n.hash="",o.hash="",n.href===o.href}catch{return false}};try{let r=window.location.assign.bind(window.location),n=window.location.replace.bind(window.location);Object.defineProperty(window.location,"assign",{configurable:!0,value:o=>{if(!t(o))return r(o)}}),Object.defineProperty(window.location,"replace",{configurable:!0,value:o=>{if(!t(o))return n(o)}}),Object.defineProperty(window.location,"reload",{configurable:!0,value:()=>{}});}catch{}});}async function cr(e,t){await e.evaluate(async r=>{await new Promise(n=>{let o=0,s=700,a=Date.now(),i=()=>{window.clearInterval(c),window.scrollTo(0,0),n();},c=window.setInterval(()=>{if(Date.now()-a>=r){i();return}window.scrollBy(0,s),o+=s;let u=Math.max(document.body?.scrollHeight||0,document.documentElement?.scrollHeight||0);o>=u+window.innerHeight&&i();},120);});},t);}async function et(e){ye();let t=W(e,k),r=await Ye.send(new GetObjectCommand({Bucket:$,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 lr(e){return (await et(e)).body}async function ne(e){return JSON.parse(await lr(e))}async function oe(e,t,r){ye();let n=W(e,k),o=typeof t=="string"?Buffer.from(t,"utf8"):t,s=await Ye.send(new PutObjectCommand({Bucket:$,Key:n,Body:o,ContentType:r,Metadata:{sha256:_(o)}}));return {bucket:$,key:n,sha256:_(o),bytes:o.byteLength,contentType:r,...s.ETag?{etag:s.ETag}:{},...s.VersionId?{versionId:s.VersionId}:{}}}async function ur(e,t){return await oe(e,`${JSON.stringify(t,null,2)}
6
- `,"application/json; charset=utf-8")}async function dr(e){try{let t=await ne(e);return t.response??t}catch(t){if(t.name==="NoSuchKey"||t.$metadata?.httpStatusCode===404)return null;throw t}}function re(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 pr(e,t,r,n){let o=null,s=null,a,i=new Set;try{let c=await ir(e,n);o=c.context,s=c.page,a=c.networkPolicyViolation,s.on("request",f=>i.add(f.url()));let u=await s.goto(t,{waitUntil:"domcontentloaded",timeout:e.options.navigationTimeoutMs});e.options.readiness.waitForSelector&&await s.waitForSelector(e.options.readiness.waitForSelector,{timeout:e.options.readiness.timeoutMs}).catch(()=>{}),e.options.javaScriptEnabled&&e.options.readiness.waitForFunction&&await s.waitForFunction(e.options.readiness.waitForFunction,void 0,{timeout:e.options.readiness.timeoutMs}).catch(()=>{}),e.options.javaScriptEnabled?await cr(s,e.options.autoScrollTimeoutMs):await s.waitForLoadState("load",{timeout:e.options.readiness.timeoutMs}).catch(()=>{}),e.options.readiness.fallbackWaitMs>0&&await s.waitForTimeout(e.options.readiness.fallbackWaitMs);let l=a?.();if(l)throw l;let d=await s.evaluate(()=>{let f=(I,tt)=>{let se=[];for(let rt of document.querySelectorAll(I))for(let be of tt){let ie=rt.getAttribute(be);if(ie)if(be.includes("srcset"))for(let nt of ie.split(",")){let Ee=nt.trim().split(/\s+/,1)[0];Ee&&se.push(Ee);}else se.push(ie);}return se},j=I=>{try{return new URL(I,document.baseURI).href}catch{return null}};return {links:f("a[href]",["href"]).map(j).filter(I=>I!==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(j).filter(I=>I!==null)}});await s.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 m=await s.content(),p=a();if(p)throw p;let y=new URL(t),R=re(d.links).filter(f=>{let j=new URL(f);return j.hash="",j.origin===y.origin}),A=T(z(k,e.jobId,e.taskId),"pages",`${String(r).padStart(4,"0")}-${_(t).slice(0,24)}.html`),q=Q(u?.headers()["content-type"],s.url()||t,"text/html; charset=utf-8"),F=await oe(A,m,q),h=(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}:{}})),H=u?.status()??null;return {requestedUrl:t,finalUrl:s?.url()||null,outcome:H!==null&&H>=400?"http-error":"rendered",httpStatus:H,contentType:q,html:F,discoveredPages:R,discoveredAssets:re([...d.assets,...ue(s.url()||t,m,u?.headers()["content-type"]??"text/html")]),networkUrls:re([...i]),cookies:h}}catch(c){return {requestedUrl:t,finalUrl:s?.url()||null,outcome:"failed",httpStatus:null,contentType:null,html:null,discoveredPages:[],discoveredAssets:[],networkUrls:re([...i]),cookies:[],error:c instanceof Error?c.message:String(c)}}finally{await o?.close().catch(()=>{});}}function mr(e){return e.outcome==="failed"&&typeof e.error=="string"&&/(?:target page, context or browser has been closed|browser closed|connection closed)/i.test(e.error)}async function gr(e,t,r,n){let o=null;for(let s=1;s<=2;s+=1){let a={requestId:t.awsRequestId,jobId:e.jobId,taskId:e.taskId,operation:e.operation,pageIndex:n,url:r,attempt:s,remainingTimeMs:t.getRemainingTimeInMillis?.()};ee(a),await g("render.page-started",a);let i=await pr(e,r,n,a);o=i;let c=mr(i);if(c&&await Qe(a),await g(c?"render.page-browser-closed":"render.page-finished",{...a,remainingTimeMs:t.getRemainingTimeInMillis?.()},{outcome:i.outcome,httpStatus:i.httpStatus,...i.error?{error:i.error.split(`
7
- `,1)[0]}:{}},i.outcome==="failed"?"warn":"info"),!c||s===2)return i;await g("render.page-retry-with-fresh-browser",a,{nextAttempt:s+1},"warn");}if(o)return o;throw new Error(`Remote render did not produce a result for ${r}.`)}function fr(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 hr(e,t,r){let n=t;for(let o=0;o<=5;o+=1){await le(n,"asset request");let s=await e.get(n,{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(o===5)throw await s.dispose(),new Error("Asset request exceeded five redirects.");n=new URL(i,n).toString(),await s.dispose();}throw new Error("Asset redirect handling failed.")}async function wr(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 n=await request.newContext({ignoreHTTPSErrors:e.options.ignoreHttpsErrors,userAgent:"WPSuiteStaticPublisher/remote-asset-worker-v1",...N?{proxy:{server:N}}:{}}),o=[],s=async i=>{o.push(i);let c=o.filter(u=>u.outcome==="failed"||u.outcome==="deferred").length;await r.updated(o.length-c,c);};try{for(let i=0;i<e.urls.length;i+=1){let c=e.urls[i],u=t.getRemainingTimeInMillis?.();if(u!==void 0&&u<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 hr(n,c,e.options.timeoutMs);let d=l.status(),m=l.headers(),p=l.url()||c;if(d<200||d>=300){await s({requestedUrl:c,finalUrl:p,outcome:"http-error",httpStatus:d,contentType:m["content-type"]??null,cacheControl:m["cache-control"]??null,lastModified:m["last-modified"]??null,object:null,discoveredAssets:[],error:`Asset returned HTTP ${d}.`});continue}let y=await l.body(),R=Q(m["content-type"],p,"application/octet-stream"),A=await oe(T(z(k,e.jobId,e.taskId),"assets",`${String(i).padStart(4,"0")}-${_(c).slice(0,24)}.bin`),y,R);await s({requestedUrl:c,finalUrl:p,outcome:"fetched",httpStatus:d,contentType:R,cacheControl:m["cache-control"]??null,lastModified:m["last-modified"]??null,object:A,discoveredAssets:fr(p,R)?ue(p,new TextDecoder("utf8").decode(y),R):[]});}catch(d){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:d instanceof Error?d.message:String(d)});}finally{await l?.dispose().catch(()=>{});}}}finally{await n.dispose();}let a=o.filter(i=>i.outcome==="failed"||i.outcome==="deferred").length;return {response:{schemaVersion:P,operation:"asset",jobId:e.jobId,taskId:e.taskId,status:a>0?"partial":"succeeded",completedItems:o.length-a,failedItems:a,exporterVersion:M},detail:{assets:o}}}async function yr(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 n=new URL(e.sourceOrigin).origin,o=[];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){o.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(o.filter(d=>d.outcome!=="failed"&&d.outcome!=="deferred").length,o.filter(d=>d.outcome==="failed"||d.outcome==="deferred").length);continue}let u=new URL(i);if(u.origin!==n)throw new Error(`Primary render URL is outside sourceOrigin: ${i}`);o.push(await gr(e,t,u.toString(),a));let l=o.filter(d=>d.outcome==="failed"||d.outcome==="deferred").length;await r.updated(o.length-l,l);}let s=o.filter(a=>a.outcome==="failed"||a.outcome==="deferred").length;return {response:{schemaVersion:P,operation:"render",jobId:e.jobId,taskId:e.taskId,status:s>0?"partial":"succeeded",completedItems:o.length-s,failedItems:s,exporterVersion:M},detail:{pages:o}}}async function Rr(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 n={...await ne(e.configKey),outputDir:"/workspace"},o=await ne(e.assetMapKey),s=e.previousAssetMapKey?await ne(e.previousAssetMapKey):{},a=[];for(let i of e.items){let c=W(i.inputKey,k),u=W(i.outputKey,k),l=await et(c),d=l.body,m=`/workspace/${i.relativePath.replace(/^\/+/,"")}`,p=$e(d,n,o,m,s),y=Q(i.contentType||l.contentType,i.relativePath,"text/plain; charset=utf-8"),R=await oe(u,p,y);a.push({inputKey:c,outputKey:u,changed:p!==d,output:R}),await t.updated(a.length,0);}return {response:{schemaVersion:P,operation:"rewrite",jobId:e.jobId,taskId:e.taskId,status:"succeeded",completedItems:a.length,failedItems:0,exporterVersion:M},detail:{objects:a}}}function br(e,t){return `${e}/${t.split("/").map(r=>encodeURIComponent(r)).join("/")}`}async function Er(e,t){if(!Array.isArray(e.items)||e.items.length>1e3)throw new Error("Deploy copy tasks accept at most 1000 objects.");let r=nr.find(l=>l.id===e.targetId);if(!r)throw new Error(`Unknown deployment target: ${e.targetId}`);let n=Je.get(r.region);n||(n=new S3Client({region:r.region}),Je.set(r.region,n));let o=[];for(let l of e.items){let d=W(l.sourceKey,k),m=T(r.prefix,l.targetRelativeKey);try{let p=await n.send(new HeadObjectCommand({Bucket:r.bucketName,Key:m})).catch(h=>{if((h&&typeof h=="object"&&"$metadata"in h?Number(h.$metadata?.httpStatusCode):0)===404||h?.name==="NotFound")return null;throw h}),y=String(p?.CacheControl??"").replace(/\s+/g,"")===l.cacheControl.replace(/\s+/g,""),R=ge(p?.ContentType)===ge(l.contentType),A=p?.Metadata?.["wpsuite-sha256"]===l.sha256,q=!!l.normalizedSha256&&p?.Metadata?.["wpsuite-normalized-sha256"]===l.normalizedSha256;if(y&&R&&(A||q)){o.push({sourceKey:d,targetKey:m,status:"skipped"}),await t.updated(o.filter(h=>h.status!=="failed").length,o.filter(h=>h.status==="failed").length);continue}let F=await n.send(new CopyObjectCommand({Bucket:r.bucketName,Key:m,CopySource:br($,d),MetadataDirective:"REPLACE",ContentType:l.contentType,CacheControl:l.cacheControl,Metadata:{"wpsuite-sha256":l.sha256,...l.normalizedSha256?{"wpsuite-normalized-sha256":l.normalizedSha256}:{}}}));o.push({sourceKey:d,targetKey:m,status:"copied",...F.CopyObjectResult?.ETag?{etag:F.CopyObjectResult.ETag}:{}}),await t.updated(o.filter(h=>h.status!=="failed").length,o.filter(h=>h.status==="failed").length);}catch(p){o.push({sourceKey:d,targetKey:m,status:"failed",error:p instanceof Error?p.message:String(p)}),await t.updated(o.filter(y=>y.status!=="failed").length,o.filter(y=>y.status==="failed").length);}}let a=(e.deleteRelativeKeys??[]).map(l=>T(r.prefix,l)),i=[],c=[];if(a.length>0){let l=await n.send(new DeleteObjectsCommand({Bucket:r.bucketName,Delete:{Objects:a.map(d=>({Key:d})),Quiet:false}}));i.push(...(l.Deleted??[]).flatMap(d=>d.Key?[d.Key]:[])),c.push(...(l.Errors??[]).map(d=>({key:d.Key??"",error:d.Message??d.Code??"S3 deletion failed"}))),await t.updated(o.filter(d=>d.status!=="failed").length+i.length,o.filter(d=>d.status==="failed").length+c.length);}let u=o.filter(l=>l.status==="failed").length+c.length;return {response:{schemaVersion:P,operation:"deploy-copy",jobId:e.jobId,taskId:e.taskId,status:u>0?"partial":"succeeded",completedItems:o.filter(l=>l.status!=="failed").length+i.length,failedItems:u,exporterVersion:M},detail:{objects:o,deletedKeys:i,deleteErrors:c,targetId:r.id}}}async function Xe(e,t,r){if(e.operation==="health")return {response:{schemaVersion:P,operation:"health",jobId:e.jobId,taskId:e.taskId,status:"succeeded",completedItems:1,failedItems:0,exporterVersion:M},detail:{allowedOperation:te,workspaceBucket:$,workspacePrefix:k,proxyConfigured:!!N}};if(te&&te!==e.operation)throw new Error(`Function is configured for ${te}, not ${e.operation}.`);if(!r)throw new Error("Remote worker progress reporter is required.");return e.operation==="render"?await yr(e,t,r):e.operation==="asset"?await wr(e,t,r):e.operation==="rewrite"?await Rr(e,r):await Er(e,r)}async function yn(e,t={}){let r=Pe(e),n=setInterval(()=>{},1e3),o={requestId:t.awsRequestId,jobId:r.jobId,taskId:r.taskId,operation:r.operation,remainingTimeMs:t.getRemainingTimeInMillis?.()};ee(o),await g("invocation.started",o,{exporterVersion:M});try{if(r.operation==="health"){let c=(await Xe(r,t)).response;return await g("invocation.completed",{...o,remainingTimeMs:t.getRemainingTimeInMillis?.()},{status:c.status}),c}ye();let s=T(z(k,r.jobId,r.taskId),"result.json"),a=await dr(s),i=new Y(r,t.awsRequestId);if(a)return await i.completed(a),await g("invocation.completed-from-existing-result",{...o,remainingTimeMs:t.getRemainingTimeInMillis?.()},{status:a.status}),a;await i.started();try{let c=await Xe(r,t,i),u={...c.response,resultKey:s};return await ur(s,{schemaVersion:P,response:u,detail:c.detail,completedAt:new Date().toISOString(),requestId:t.awsRequestId??null}),await i.completed(u),await g("invocation.completed",{...o,remainingTimeMs:t.getRemainingTimeInMillis?.()},{status:u.status,completedItems:u.completedItems,failedItems:u.failedItems}),u}catch(c){throw await i.failed(),c}}catch(s){throw await g("invocation.failed",{...o,remainingTimeMs:t.getRemainingTimeInMillis?.()},{errorName:s instanceof Error?s.name:"UnknownError",error:s instanceof Error?s.message:String(s)},"error"),s}finally{await g("invocation.cleanup-started",{...o,remainingTimeMs:t.getRemainingTimeInMillis?.()}),r.operation==="render"&&await Qe({...o,remainingTimeMs:t.getRemainingTimeInMillis?.()}),await g("invocation.cleanup-finished",{...o,remainingTimeMs:t.getRemainingTimeInMillis?.()}),clearInterval(n),Ge();}}export{yn as handler};
4
+ `;return e.replace(/<head\b[^>]*>/i,o=>`${o}${n} ${t}`)}function Wt(e){let t=ve(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function Ct(e,t){let r=[...new Set(t)].filter(s=>s.includes("/")&&!/\\+\//.test(s)).map(s=>[s,X(s)]).filter(([s,a])=>s!==a).sort((s,a)=>a[0].length-s[0].length);if(!r.length)return e;let n=s=>{let a=s;for(let[i,c]of r)a=a.split(i).join(c);return a},o=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(s,a,i,c)=>`${a}${n(i)}${c}`);return o=o.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(s,a,i,c,d)=>Wt(c)?`${a}${n(c)}${d}`:s),o}function Mt(e,t){if(!t)return null;let r=E.dirname(E.resolve(t)),n=E.resolve(e.outputDir),o=E.relative(r,n).replace(/\\/g,"/");return o?(o.startsWith(".")||(o=`./${o}`),o.endsWith("/")?o:`${o}/`):"./"}function At(e,t,r){let n=Mt(t,r);if(!n)return e;let o=e;for(let s of St){let a=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`(?:\\.{1,}/)+${a}`,"g"),c=new RegExp(`(?<!\\.)/${a}`,"g");o=o.replace(i,`${n}${s}`).replace(c,`${n}${s}`);let d=s.replace(/\//g,"\\/"),u=n.replace(/\//g,"\\/"),l=d.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),p=new RegExp(`(?:\\.{1,}\\\\/)+${l}`,"g"),m=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${l}`,"g"),f=new RegExp(`(?<![\\.\\\\])\\/${l}`,"g");o=o.replace(p,`${u}${d}`).replace(m,`${u}${d}`).replace(f,`${u}${d}`);}return o}function pe(e,t,r){if(e.urlRewriteMode==="absolute")return t;let n=(()=>{try{return new URL(t,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin)}catch{return null}})(),o=n?n.pathname:Oe(t,e.targetOrigin),s=n?`${n.search}${n.hash}`:"";return e.urlRewriteMode==="root-relative"?`${o}${s}`:`${We(e.outputDir,r,o)}${s}`}function de(e,t,r,n,o){Z(e,r,pe(t,n,o));}function $t(e,t,r,n,o){if(!r||r===n)return;Z(e,r,n);let s=pe(t,r,o),a=pe(t,n,o);Z(e,s,a);}function Me(e,t,r,n,o={}){let s=e,a={};de(a,t,t.sourceOrigin,t.targetOrigin,n);for(let[c,d]of Object.entries(t.extraReplacements))de(a,t,c,d,n);for(let[c,d]of Object.entries(r))de(a,t,c,d,n);for(let[c,d]of Object.entries(o)){let u=r[c];!u||u===d||$t(a,t,d,u,n);}let i=Object.entries(a).sort((c,d)=>d[0].length-c[0].length);for(let[c,d]of i)s=Tt(s,c,d);return t.urlRewriteMode!=="absolute"&&(s=At(s,t,n)),s=Ct(s,i.map(([,c])=>c)),vt(t,s,n)&&(s=Ot(s)),s}var me=String(process.env.PUBLISHER_PROGRESS_TABLE??"").trim(),Ae=Number(process.env.PUBLISHER_PROGRESS_RETENTION_SECONDS??604800),Vt=Number.isFinite(Ae)?Math.max(86400,Ae):604800,$e=me?new DynamoDBClient({}):null;function Ut(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(!(!$e||!me))try{let t=Math.floor(Date.now()/1e3)+Vt;await $e.send(new UpdateItemCommand({TableName:me,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 Y=class{#t;#o;#e;#s;#i;#a=-1;#c=0;#n=0;#l=0;constructor(t,r,n=Lt){this.#t=t,this.#o=r??null,this.#e=Ut(t),this.#s=Math.max(1,Math.ceil(this.#e/20)),this.#i=n;}async started(){await this.#r("running",0,0,0);}async updated(t,r){this.#n=t,this.#l=r;let n=t+r,o=Date.now();n<this.#e&&n-this.#a<this.#s&&o-this.#c<5e3||await this.#r("running",t,r,n+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.#l));await this.#r("failed",this.#n,t,this.#e+3);}async#r(t,r,n,o){this.#a=r+n,this.#c=Date.now(),await this.#i({jobId:this.#t.jobId,taskId:this.#t.taskId,operation:this.#t.operation,status:t,completedItems:r,failedItems:n,totalItems:this.#e,sequence:o,updatedAt:new Date().toISOString(),requestId:this.#o});}};var Dt=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+\/[!#$%&'*+.^_`|~0-9A-Za-z-]+(?:\s*;.*)?$/u;function Kt(e){try{return new URL(e).pathname}catch{return e}}function Q(e,t,r){let n=String(e??"").trim();if(Dt.test(n))return n;let o=je.lookup(Kt(t));return o?je.contentType(o)||o:r}function ge(e){return String(e??"").split(";").map(t=>t.trim().toLowerCase()).filter(Boolean).join(";")}var Ue="playwright_chromiumdev_profile-",zt="/tmp/wpsuite-publisher-browser";function I(e){return Math.round(e/1024/1024*100)/100}async function _e(e){try{let t=await statfs(e),r=t.blocks*t.bsize,n=t.bavail*t.bsize;return {path:e,totalMiB:I(r),availableMiB:I(n),usedMiB:I(r-n)}}catch(t){return {path:e,totalMiB:null,availableMiB:null,usedMiB:null,error:t instanceof Error?t.message:String(t)}}}async function Gt(e){return (await fe(e)).filter(t=>t.startsWith(Ue))}async function fe(e){try{return (await readdir(e,{withFileTypes:!0})).map(t=>t.name).sort()}catch(t){if(t.code==="ENOENT")return [];throw t}}function he(){return E.resolve(process.env.PUBLISHER_BROWSER_TEMP_ROOT?.trim()||zt)}async function Le(e=he()){let t=Ke(e),r=E.join(t,"home"),n=E.join(t,"cache"),o=E.join(t,"config");await Promise.all([t,r,n,o].map(s=>mkdir(s,{recursive:true}))),process.env.TMPDIR=t,process.env.HOME=r,process.env.XDG_CACHE_HOME=n,process.env.XDG_CONFIG_HOME=o;}async function De(e=he()){let t=process.memoryUsage(),[r,n,o,s]=await Promise.all([_e(e),_e("/dev/shm"),Gt(e),fe(e)]);return {processMemoryMiB:{rss:I(t.rss),heapUsed:I(t.heapUsed),heapTotal:I(t.heapTotal),external:I(t.external),arrayBuffers:I(t.arrayBuffers)},tempStorage:r,sharedMemory:n,playwrightProfiles:{count:o.length,names:o.slice(0,20)},tempEntries:{count:s.length,names:s.slice(0,20)}}}function Ke(e){let t=E.resolve(e);if(t===E.parse(t).root)throw new Error(`Refusing to clean filesystem root: ${t}`);if(t==="/tmp"||t==="/var/tmp")throw new Error(`Refusing to clean shared temp root: ${t}`);return t}async function Be(e=he()){let t=Ke(e),r=await fe(t);for(let n of r)await rm(E.join(t,n),{recursive:true,force:true,maxRetries:3,retryDelay:50});return r}function Jt(e){let t=e.split("\0",1)[0]??"",r=E.basename(t).toLowerCase();return r.includes("chrome-headless-shell")||r==="chrome_crashpad_handler"||r==="chromium"||r==="chromium-browser"||e.includes(Ue)&&/(?:chrome|chromium)/i.test(e)}async function Ne(e="/proc",t=r=>process.kill(r,"SIGKILL")){let r;try{r=await readdir(e,{withFileTypes:!0});}catch(o){if(o.code==="ENOENT")return [];throw o}let n=[];for(let o of r){if(!o.isDirectory()||!/^\d+$/.test(o.name))continue;let s=Number(o.name);if(!Number.isSafeInteger(s)||s<1||s===process.pid)continue;let a;try{a=await readFile(E.join(e,o.name,"cmdline"),"utf8");}catch(i){if(["ENOENT","EACCES","EPERM","ESRCH"].includes(String(i.code)))continue;throw i}if(Jt(a))try{t(s),n.push(s);}catch(i){if(["ESRCH","EPERM"].includes(String(i.code)))continue;throw i}}return n.length>0&&await setTimeout(100),n.sort((o,s)=>o-s)}var K={},qe=false;function Zt(e){if(e)try{let t=new URL(e);return t.username="",t.password="",t.search="",t.hash="",t.toString()}catch{return}}function Fe(e){return {...e,...e.url?{url:Zt(e.url)}:{}}}function He(e){return e instanceof Error?{errorName:e.name,errorMessage:e.message,...e.stack?{errorStack:e.stack}:{}}:{error:String(e)}}function we(e,t={}){try{writeSync(2,`${JSON.stringify({level:"ERROR",message:"Remote worker runtime diagnostic.",event:e,...K,...t,timestamp:new Date().toISOString()})}
5
+ `);}catch{}}function ze(){qe||(qe=true,process.on("uncaughtExceptionMonitor",(e,t)=>{we("runtime.uncaught-exception",{origin:t,...He(e)});}),process.on("exit",e=>{we("runtime.process-exit",{exitCode:e});}));}async function g(e,t,r={},n="info"){try{K=Fe(t);let o=null;try{o=await De();}catch(a){r={...r,resourceSnapshotError:a instanceof Error?a.message:String(a)};}let s=JSON.stringify({message:"Remote worker checkpoint.",event:e,...K,...r,...o?{resources:o}:{}});console[n](s);}catch(o){we("checkpoint.write-failed",{checkpointEvent:e,...He(o)});}}function ee(e){K=Fe(e);}function Ge(){K={};}async function Je(e){await e.addInitScript(()=>{let t=window,r=[],n=new WeakSet,o=new WeakSet;Object.defineProperty(t,"__WPSUITE_STATIC_SERIALIZATION_STATE__",{value:{snapshots:r,runtimeCreatedElements:o},configurable:true});let s=Document.prototype.createElement;Document.prototype.createElement=function(p,m){let f=s.call(this,p,m);return o.add(f),f};let a=l=>{!(l instanceof Element)||n.has(l)||(n.add(l),r.push({host:l,pristine:l.cloneNode(true),sourceOwned:!o.has(l)}));},i=Element.prototype.attachShadow;Element.prototype.attachShadow=function(p){return a(this),i.call(this,p)};let c=new WeakSet,d=l=>{if(typeof l!="object"&&typeof l!="function"||l===null||c.has(l))return l;let p=l;if(typeof p.createRoot!="function")return l;let m=p.createRoot,f=function(R,...x){return a(R),Reflect.apply(m,this,[R,...x])};try{Object.defineProperty(p,"createRoot",{...Object.getOwnPropertyDescriptor(p,"createRoot"),value:f}),c.add(l);}catch{}return l},u=l=>{let p=d(t[l]);try{Object.defineProperty(t,l,{configurable:!0,enumerable:!0,get:()=>p,set:m=>{p=d(m);}});}catch{d(t[l]);}};u("ReactDOM"),u("ReactDOMClient");});}async function Xe(e){return e.evaluate(()=>{let t=window.__WPSUITE_STATIC_SERIALIZATION_STATE__;document.querySelectorAll("script, style, link, iframe").forEach(n=>{t?.runtimeCreatedElements.has(n)&&n.remove();});for(let n of t?.snapshots??[])n.host.isConnected&&(n.sourceOwned?n.host.replaceWith(n.pristine.cloneNode(true)):n.host.remove());return document.querySelectorAll("#wpsuite-consent-root, .grecaptcha-badge, iframe[src*='/recaptcha/']").forEach(n=>n.remove()),document.documentElement.classList.remove("wpsuite-consent-scroll-locked"),document.body.classList.remove("wpsuite-consent-scroll-locked"),`${document.doctype?new XMLSerializer().serializeToString(document.doctype):""}${document.documentElement.outerHTML}`})}var A=String(process.env.PUBLISHER_WORKSPACE_BUCKET??"").trim(),S=U(process.env.PUBLISHER_WORKSPACE_PREFIX??""),te=String(process.env.PUBLISHER_ALLOWED_OPERATION??"").trim(),$=String(process.env.PUBLISHER_EXPORTER_VERSION??"unknown").trim(),B=String(process.env.PUBLISHER_PROXY_URL??"").trim(),sr=ir(process.env.PUBLISHER_ALLOWED_TARGETS??"[]"),et=new S3Client({}),Ze=new Map,b=null,N=false;ze();function ir(e){try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(r=>{if(!r||typeof r!="object")return !1;let n=r;return ["id","bucketName","prefix","region"].every(o=>typeof n[o]=="string")}).map(r=>({...r,prefix:U(r.prefix)})):[]}catch{return []}}function ye(){if(!A)throw new Error("PUBLISHER_WORKSPACE_BUCKET is required.")}async function Re(e,t){try{let r=await Ne();r.length>0&&await g(`browser.stale-processes-killed.${t}`,e,{killedProcesses:r.length,killedProcessIds:r},"warn");let n=await Be();n.length>0&&await g(`browser.temp-entries-removed.${t}`,e,{removedEntries:n.length,removedEntryNames:n.slice(0,20)}),await Le();}catch(r){if(await g(`browser.profile-cleanup-failed.${t}`,e,{error:r instanceof Error?r.message:String(r)},"error"),t==="before-launch")throw r}}async function ar(e){if(b){let r=await b.catch(()=>null);if(r?.isConnected())return r}await g("browser.launch-preparing",e),await Re(e,"before-launch"),await g("browser.launch-started",e);let t=chromium.launch({headless:true,args:["--no-sandbox","--disable-setuid-sandbox","--no-zygote","--disable-gpu"],...B?{proxy:{server:B}}:{}});b=t;try{let r=await t;return r.once("disconnected",()=>{b===t&&(b=null);let n=N;ee(e),g("browser.disconnected",e,{expected:n},n?"info":"error");}),await g("browser.launch-succeeded",e),r}catch(r){throw b===t&&(b=null),await g("browser.launch-failed",e,{error:r instanceof Error?r.message:String(r)},"error"),r}}async function tt(e){let t=b;if(b=null,t){let r=await t.catch(()=>null);r&&(N=true,await r.close().catch(async n=>{await g("browser.close-failed",e,{error:n instanceof Error?n.message:String(n)},"warn");}),N=false);}await Re(e,"after-close");}async function cr(e,t){let r;for(let n=1;n<=2;n+=1){let o=await ar({...t,attempt:n}),s=null;try{s=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 lr(s);let a=await Ie(s);return {context:s,page:await s.newPage(),networkPolicyViolation:a.getViolation}}catch(a){r=a,await s?.close().catch(()=>{}),b=null,N=true,await o.close().catch(()=>{}),N=false,await Re({...t,attempt:n},"after-close");}}throw r instanceof Error?r:new Error(`Unable to create a Chromium page: ${String(r)}`)}async function lr(e){await Je(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 n=new URL(String(r),window.location.href),o=new URL(window.location.href);return n.hash="",o.hash="",n.href===o.href}catch{return false}};try{let r=window.location.assign.bind(window.location),n=window.location.replace.bind(window.location);Object.defineProperty(window.location,"assign",{configurable:!0,value:o=>{if(!t(o))return r(o)}}),Object.defineProperty(window.location,"replace",{configurable:!0,value:o=>{if(!t(o))return n(o)}}),Object.defineProperty(window.location,"reload",{configurable:!0,value:()=>{}});}catch{}});}async function ur(e,t){await e.evaluate(async r=>{await new Promise(n=>{let o=0,s=700,a=Date.now(),i=()=>{window.clearInterval(c),window.scrollTo(0,0),n();},c=window.setInterval(()=>{if(Date.now()-a>=r){i();return}window.scrollBy(0,s),o+=s;let d=Math.max(document.body?.scrollHeight||0,document.documentElement?.scrollHeight||0);o>=d+window.innerHeight&&i();},120);});},t);}async function rt(e){ye();let t=W(e,S),r=await et.send(new GetObjectCommand({Bucket:A,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 dr(e){return (await rt(e)).body}async function ne(e){return JSON.parse(await dr(e))}async function oe(e,t,r){ye();let n=W(e,S),o=typeof t=="string"?Buffer.from(t,"utf8"):t,s=await et.send(new PutObjectCommand({Bucket:A,Key:n,Body:o,ContentType:r,Metadata:{sha256:L(o)}}));return {bucket:A,key:n,sha256:L(o),bytes:o.byteLength,contentType:r,...s.ETag?{etag:s.ETag}:{},...s.VersionId?{versionId:s.VersionId}:{}}}async function pr(e,t){return await oe(e,`${JSON.stringify(t,null,2)}
6
+ `,"application/json; charset=utf-8")}async function mr(e){try{let t=await ne(e);return t.response??t}catch(t){if(t.name==="NoSuchKey"||t.$metadata?.httpStatusCode===404)return null;throw t}}function re(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 gr(e,t,r,n){let o=null,s=null,a,i=new Set;try{let c=await cr(e,n);o=c.context,s=c.page,a=c.networkPolicyViolation,s.on("request",y=>i.add(y.url()));let d=await s.goto(t,{waitUntil:"domcontentloaded",timeout:e.options.navigationTimeoutMs});e.options.readiness.waitForSelector&&await s.waitForSelector(e.options.readiness.waitForSelector,{timeout:e.options.readiness.timeoutMs}).catch(()=>{}),e.options.javaScriptEnabled&&e.options.readiness.waitForFunction&&await s.waitForFunction(e.options.readiness.waitForFunction,void 0,{timeout:e.options.readiness.timeoutMs}).catch(()=>{}),e.options.javaScriptEnabled?await ur(s,e.options.autoScrollTimeoutMs):await s.waitForLoadState("load",{timeout:e.options.readiness.timeoutMs}).catch(()=>{}),e.options.readiness.fallbackWaitMs>0&&await s.waitForTimeout(e.options.readiness.fallbackWaitMs);let u=a?.();if(u)throw u;let l=await s.evaluate(()=>{let y=(T,nt)=>{let se=[];for(let ot of document.querySelectorAll(T))for(let be of nt){let ie=ot.getAttribute(be);if(ie)if(be.includes("srcset"))for(let st of ie.split(",")){let Ee=st.trim().split(/\s+/,1)[0];Ee&&se.push(Ee);}else se.push(ie);}return se},j=T=>{try{return new URL(T,document.baseURI).href}catch{return null}};return {links:y("a[href]",["href"]).map(j).filter(T=>T!==null),assets:y("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(j).filter(T=>T!==null)}}),p=await Xe(s),m=a();if(m)throw m;let f=new URL(t),R=re(l.links).filter(y=>{let j=new URL(y);return j.hash="",j.origin===f.origin}),x=v(z(S,e.jobId,e.taskId),"pages",`${String(r).padStart(4,"0")}-${L(t).slice(0,24)}.html`),q=Q(d?.headers()["content-type"],s.url()||t,"text/html; charset=utf-8"),F=await oe(x,p,q),h=(await o.cookies()).map(y=>({name:y.name,domain:y.domain,path:y.path,expires:y.expires,httpOnly:y.httpOnly,secure:y.secure,sameSite:y.sameSite,..."partitionKey"in y?{partitioned:!0}:{}})),H=d?.status()??null;return {requestedUrl:t,finalUrl:s?.url()||null,outcome:H!==null&&H>=400?"http-error":"rendered",httpStatus:H,contentType:q,html:F,discoveredPages:R,discoveredAssets:re([...l.assets,...ue(s.url()||t,p,d?.headers()["content-type"]??"text/html")]),networkUrls:re([...i]),cookies:h}}catch(c){return {requestedUrl:t,finalUrl:s?.url()||null,outcome:"failed",httpStatus:null,contentType:null,html:null,discoveredPages:[],discoveredAssets:[],networkUrls:re([...i]),cookies:[],error:c instanceof Error?c.message:String(c)}}finally{await o?.close().catch(()=>{});}}function fr(e){return e.outcome==="failed"&&typeof e.error=="string"&&/(?:target page, context or browser has been closed|browser closed|connection closed)/i.test(e.error)}async function hr(e,t,r,n){let o=null;for(let s=1;s<=2;s+=1){let a={requestId:t.awsRequestId,jobId:e.jobId,taskId:e.taskId,operation:e.operation,pageIndex:n,url:r,attempt:s,remainingTimeMs:t.getRemainingTimeInMillis?.()};ee(a),await g("render.page-started",a);let i=await gr(e,r,n,a);o=i;let c=fr(i);if(c&&await tt(a),await g(c?"render.page-browser-closed":"render.page-finished",{...a,remainingTimeMs:t.getRemainingTimeInMillis?.()},{outcome:i.outcome,httpStatus:i.httpStatus,...i.error?{error:i.error.split(`
7
+ `,1)[0]}:{}},i.outcome==="failed"?"warn":"info"),!c||s===2)return i;await g("render.page-retry-with-fresh-browser",a,{nextAttempt:s+1},"warn");}if(o)return o;throw new Error(`Remote render did not produce a result for ${r}.`)}function wr(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 yr(e,t,r){let n=t;for(let o=0;o<=5;o+=1){await le(n,"asset request");let s=await e.get(n,{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(o===5)throw await s.dispose(),new Error("Asset request exceeded five redirects.");n=new URL(i,n).toString(),await s.dispose();}throw new Error("Asset redirect handling failed.")}async function Rr(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 n=await request.newContext({ignoreHTTPSErrors:e.options.ignoreHttpsErrors,userAgent:"WPSuiteStaticPublisher/remote-asset-worker-v1",...B?{proxy:{server:B}}:{}}),o=[],s=async i=>{o.push(i);let c=o.filter(d=>d.outcome==="failed"||d.outcome==="deferred").length;await r.updated(o.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 u=null;try{u=await yr(n,c,e.options.timeoutMs);let l=u.status(),p=u.headers(),m=u.url()||c;if(l<200||l>=300){await s({requestedUrl:c,finalUrl:m,outcome:"http-error",httpStatus:l,contentType:p["content-type"]??null,cacheControl:p["cache-control"]??null,lastModified:p["last-modified"]??null,object:null,discoveredAssets:[],error:`Asset returned HTTP ${l}.`});continue}let f=await u.body(),R=Q(p["content-type"],m,"application/octet-stream"),x=await oe(v(z(S,e.jobId,e.taskId),"assets",`${String(i).padStart(4,"0")}-${L(c).slice(0,24)}.bin`),f,R);await s({requestedUrl:c,finalUrl:m,outcome:"fetched",httpStatus:l,contentType:R,cacheControl:p["cache-control"]??null,lastModified:p["last-modified"]??null,object:x,discoveredAssets:wr(m,R)?ue(m,new TextDecoder("utf8").decode(f),R):[]});}catch(l){await s({requestedUrl:c,finalUrl:u?.url()??null,outcome:"failed",httpStatus:u?.status()??null,contentType:u?.headers()["content-type"]??null,cacheControl:u?.headers()["cache-control"]??null,lastModified:u?.headers()["last-modified"]??null,object:null,discoveredAssets:[],error:l instanceof Error?l.message:String(l)});}finally{await u?.dispose().catch(()=>{});}}}finally{await n.dispose();}let a=o.filter(i=>i.outcome==="failed"||i.outcome==="deferred").length;return {response:{schemaVersion:P,operation:"asset",jobId:e.jobId,taskId:e.taskId,status:a>0?"partial":"succeeded",completedItems:o.length-a,failedItems:a,exporterVersion:$},detail:{assets:o}}}async function br(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 n=new URL(e.sourceOrigin).origin,o=[];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){o.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(o.filter(l=>l.outcome!=="failed"&&l.outcome!=="deferred").length,o.filter(l=>l.outcome==="failed"||l.outcome==="deferred").length);continue}let d=new URL(i);if(d.origin!==n)throw new Error(`Primary render URL is outside sourceOrigin: ${i}`);o.push(await hr(e,t,d.toString(),a));let u=o.filter(l=>l.outcome==="failed"||l.outcome==="deferred").length;await r.updated(o.length-u,u);}let s=o.filter(a=>a.outcome==="failed"||a.outcome==="deferred").length;return {response:{schemaVersion:P,operation:"render",jobId:e.jobId,taskId:e.taskId,status:s>0?"partial":"succeeded",completedItems:o.length-s,failedItems:s,exporterVersion:$},detail:{pages:o}}}async function Er(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 n={...await ne(e.configKey),outputDir:"/workspace"},o=await ne(e.assetMapKey),s=e.previousAssetMapKey?await ne(e.previousAssetMapKey):{},a=[];for(let i of e.items){let c=W(i.inputKey,S),d=W(i.outputKey,S),u=await rt(c),l=u.body,p=`/workspace/${i.relativePath.replace(/^\/+/,"")}`,m=Me(l,n,o,p,s),f=Q(i.contentType||u.contentType,i.relativePath,"text/plain; charset=utf-8"),R=await oe(d,m,f);a.push({inputKey:c,outputKey:d,changed:m!==l,output:R}),await t.updated(a.length,0);}return {response:{schemaVersion:P,operation:"rewrite",jobId:e.jobId,taskId:e.taskId,status:"succeeded",completedItems:a.length,failedItems:0,exporterVersion:$},detail:{objects:a}}}function Sr(e,t){return `${e}/${t.split("/").map(r=>encodeURIComponent(r)).join("/")}`}async function kr(e,t){if(!Array.isArray(e.items)||e.items.length>1e3)throw new Error("Deploy copy tasks accept at most 1000 objects.");let r=sr.find(u=>u.id===e.targetId);if(!r)throw new Error(`Unknown deployment target: ${e.targetId}`);let n=Ze.get(r.region);n||(n=new S3Client({region:r.region}),Ze.set(r.region,n));let o=[];for(let u of e.items){let l=W(u.sourceKey,S),p=v(r.prefix,u.targetRelativeKey);try{let m=await n.send(new HeadObjectCommand({Bucket:r.bucketName,Key:p})).catch(h=>{if((h&&typeof h=="object"&&"$metadata"in h?Number(h.$metadata?.httpStatusCode):0)===404||h?.name==="NotFound")return null;throw h}),f=String(m?.CacheControl??"").replace(/\s+/g,"")===u.cacheControl.replace(/\s+/g,""),R=ge(m?.ContentType)===ge(u.contentType),x=m?.Metadata?.["wpsuite-sha256"]===u.sha256,q=!!u.normalizedSha256&&m?.Metadata?.["wpsuite-normalized-sha256"]===u.normalizedSha256;if(f&&R&&(x||q)){o.push({sourceKey:l,targetKey:p,status:"skipped"}),await t.updated(o.filter(h=>h.status!=="failed").length,o.filter(h=>h.status==="failed").length);continue}let F=await n.send(new CopyObjectCommand({Bucket:r.bucketName,Key:p,CopySource:Sr(A,l),MetadataDirective:"REPLACE",ContentType:u.contentType,CacheControl:u.cacheControl,Metadata:{"wpsuite-sha256":u.sha256,...u.normalizedSha256?{"wpsuite-normalized-sha256":u.normalizedSha256}:{}}}));o.push({sourceKey:l,targetKey:p,status:"copied",...F.CopyObjectResult?.ETag?{etag:F.CopyObjectResult.ETag}:{}}),await t.updated(o.filter(h=>h.status!=="failed").length,o.filter(h=>h.status==="failed").length);}catch(m){o.push({sourceKey:l,targetKey:p,status:"failed",error:m instanceof Error?m.message:String(m)}),await t.updated(o.filter(f=>f.status!=="failed").length,o.filter(f=>f.status==="failed").length);}}let a=(e.deleteRelativeKeys??[]).map(u=>v(r.prefix,u)),i=[],c=[];if(a.length>0){let u=await n.send(new DeleteObjectsCommand({Bucket:r.bucketName,Delete:{Objects:a.map(l=>({Key:l})),Quiet:false}}));i.push(...(u.Deleted??[]).flatMap(l=>l.Key?[l.Key]:[])),c.push(...(u.Errors??[]).map(l=>({key:l.Key??"",error:l.Message??l.Code??"S3 deletion failed"}))),await t.updated(o.filter(l=>l.status!=="failed").length+i.length,o.filter(l=>l.status==="failed").length+c.length);}let d=o.filter(u=>u.status==="failed").length+c.length;return {response:{schemaVersion:P,operation:"deploy-copy",jobId:e.jobId,taskId:e.taskId,status:d>0?"partial":"succeeded",completedItems:o.filter(u=>u.status!=="failed").length+i.length,failedItems:d,exporterVersion:$},detail:{objects:o,deletedKeys:i,deleteErrors:c,targetId:r.id}}}async function Ye(e,t,r){if(e.operation==="health")return {response:{schemaVersion:P,operation:"health",jobId:e.jobId,taskId:e.taskId,status:"succeeded",completedItems:1,failedItems:0,exporterVersion:$},detail:{allowedOperation:te,workspaceBucket:A,workspacePrefix:S,proxyConfigured:!!B}};if(te&&te!==e.operation)throw new Error(`Function is configured for ${te}, not ${e.operation}.`);if(!r)throw new Error("Remote worker progress reporter is required.");return e.operation==="render"?await br(e,t,r):e.operation==="asset"?await Rr(e,t,r):e.operation==="rewrite"?await Er(e,r):await kr(e,r)}async function Sn(e,t={}){let r=Pe(e),n=setInterval(()=>{},1e3),o={requestId:t.awsRequestId,jobId:r.jobId,taskId:r.taskId,operation:r.operation,remainingTimeMs:t.getRemainingTimeInMillis?.()};ee(o),await g("invocation.started",o,{exporterVersion:$});try{if(r.operation==="health"){let c=(await Ye(r,t)).response;return await g("invocation.completed",{...o,remainingTimeMs:t.getRemainingTimeInMillis?.()},{status:c.status}),c}ye();let s=v(z(S,r.jobId,r.taskId),"result.json"),a=await mr(s),i=new Y(r,t.awsRequestId);if(a)return await i.completed(a),await g("invocation.completed-from-existing-result",{...o,remainingTimeMs:t.getRemainingTimeInMillis?.()},{status:a.status}),a;await i.started();try{let c=await Ye(r,t,i),d={...c.response,resultKey:s};return await pr(s,{schemaVersion:P,response:d,detail:c.detail,completedAt:new Date().toISOString(),requestId:t.awsRequestId??null}),await i.completed(d),await g("invocation.completed",{...o,remainingTimeMs:t.getRemainingTimeInMillis?.()},{status:d.status,completedItems:d.completedItems,failedItems:d.failedItems}),d}catch(c){throw await i.failed(),c}}catch(s){throw await g("invocation.failed",{...o,remainingTimeMs:t.getRemainingTimeInMillis?.()},{errorName:s instanceof Error?s.name:"UnknownError",error:s instanceof Error?s.message:String(s)},"error"),s}finally{await g("invocation.cleanup-started",{...o,remainingTimeMs:t.getRemainingTimeInMillis?.()}),r.operation==="render"&&await tt({...o,remainingTimeMs:t.getRemainingTimeInMillis?.()}),await g("invocation.cleanup-finished",{...o,remainingTimeMs:t.getRemainingTimeInMillis?.()}),clearInterval(n),Ge();}}export{Sn as handler};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smart-cloud/publisher-exporter",
3
- "version": "1.1.75",
3
+ "version": "1.1.77",
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.",