@smart-cloud/publisher-exporter 1.1.30 → 1.1.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/crawl.js CHANGED
@@ -1,9 +1,9 @@
1
- import {request,chromium}from'playwright';import b from'fs/promises';import h from'path';import {gunzipSync}from'zlib';import Dt from'http';import Et from'https';import zt from'crypto';import Vt from'fast-glob';import {availableParallelism}from'os';import {Worker}from'worker_threads';var At=".deploy-plan.json",Mt="deploy-plan.json";function Lt(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?h.resolve(e):""}function Fe(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim();return !t||t==="."||t.startsWith("../")||t===".."?null:t}function ge(e){return [...new Set(e.map(Fe).filter(t=>t!==null))]}function It(e,t){return {schemaVersion:1,generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:h.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:ge(t.changedFiles||[]),deletedFiles:ge(t.deletedFiles||[]),rewriteTargets:ge(t.rewriteTargets||[])}}function $t(e){let t=h.join(h.resolve(e.outputDir),At),r=Lt();return r?[h.join(r,Mt),t]:[t]}function ie(e,t){let r=h.resolve(e),s=h.resolve(t),n=h.relative(r,s).replace(/\\/g,"/");return Fe(n)}async function je(e,t){let r=It(e,t);for(let s of $t(e))await b.mkdir(h.dirname(s),{recursive:true}),await b.writeFile(s,JSON.stringify(r,null,2),"utf8");}function qe(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function Ft(e){let t=String(e??"").trim();if(!t)return "";let r=t;if(/^https?:\/\//i.test(r))try{r=new URL(r).pathname;}catch{return ""}if(r=r.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!r)return "";let s=r.endsWith("/"),n=r.replace(/^\/+/,"").split("/").map(u=>u.replace(/[^A-Za-z0-9._-]/g,"")).filter(u=>u.length>0&&u!=="."&&u!=="..");if(n.length===0)return "";let i=`/${n.join("/")}`;return s&&h.extname(i)===""&&(i+="/"),i==="/"?"":i}function he(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function jt(e){if(!e||typeof e!="object")return {};let t={};for(let[r,s]of Object.entries(e)){let n=r.trim();if(!n||!s||typeof s!="object")continue;let i=s,u={};if(typeof i.targetOrigin=="string"){let a=qe(i.targetOrigin);a&&(u.targetOrigin=a);}let l=he(i.extraReplacements);if(Object.keys(l).length>0&&(u.extraReplacements=l),i.s3&&typeof i.s3=="object"){let a={},o=i.s3;typeof o.bucket=="string"&&(a.bucket=o.bucket.trim()),typeof o.prefix=="string"&&(a.prefix=o.prefix.trim()),typeof o.region=="string"&&(a.region=o.region.trim()),typeof o.htmlCacheControl=="string"&&(a.htmlCacheControl=o.htmlCacheControl.trim()),typeof o.assetCacheControl=="string"&&(a.assetCacheControl=o.assetCacheControl.trim()),Object.keys(a).length>0&&(u.s3=a);}if(i.cloudFront&&typeof i.cloudFront=="object"){let a={},o=i.cloudFront;typeof o.distributionId=="string"&&(a.distributionId=o.distributionId.trim()),Array.isArray(o.invalidationPaths)&&(a.invalidationPaths=o.invalidationPaths.map(d=>String(d??"").trim()).filter(d=>d.length>0)),Object.keys(a).length>0&&(u.cloudFront=a);}t[n]=u;}return t}function Qe(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function Ut(e,t){if(!e||typeof e!="object")return null;let r=e,s=r.command;if(s!=="publish"&&s!=="crawl"&&s!=="deploy"&&s!=="invalidate"&&s!=="retry-timeouts"&&s!=="url")return null;let n=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(n)||n<1)return null;let i=String(r.id??`${s}-${t+1}`).trim();if(!i)return null;let u=String(r.deploymentProfile??"").trim(),l=String(r.url??"").trim();return {id:i,enabled:r.enabled!==false,command:s,intervalMinutes:n,...s==="publish"||s==="crawl"?{crawlMode:r.crawlMode==="incremental"?"incremental":"full"}:{},...(s==="publish"||s==="deploy"||s==="invalidate")&&u?{deploymentProfile:u}:{},...l?{url:l}:{}}}function Ne(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((s,n)=>Ut(s,n)).filter(s=>!!s):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:r}}function qt(e){if(!e||typeof e!="object")return;let t=e,r={};for(let n of ["accountId","siteId"]){let i=t[n];typeof i=="string"&&i.trim()!==""&&(r[n]=i.trim());}let s=Number(t.lastUpdate??0);return Number.isFinite(s)&&s>0&&(r.lastUpdate=Math.floor(s)),t.subscriber===true&&(r.subscriber=true),Object.keys(r).length>0?r:void 0}function me(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),s=String(t.siteId??"").trim(),n=t.subscriber===true,i=qt(t.siteSettings),u={...i??{},...r?{accountId:i?.accountId??r}:{},...s?{siteId:i?.siteId??s}:{},...i?.subscriber===true||n?{subscriber:true}:{}},l={},a=String(t.apiBase??"").trim();a&&(l.apiBase=a);let o=String(t.runtimeToken??t.nonce??"").trim();o&&(l.runtimeToken=o);let d=String(t.uploadUrl??"").trim();d&&(l.uploadUrl=d),Object.keys(u).length>0&&(l.siteSettings=u);let p=Qe(t.subscriptionType);return p&&(l.subscriptionType=p),l}function Qt(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function We(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function Nt(e,t){let r=new Headers(e instanceof Request?e.headers:void 0);if(t?.headers)for(let[s,n]of new Headers(t.headers).entries())r.set(s,n);return r}async function _e(e,t,r=5){let s=new URL(We(e)),n=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),i=s.protocol==="http:"?Dt:Et,u=Nt(e,t);return await new Promise((l,a)=>{let o=i.request(s,{method:n,headers:Object.fromEntries(u.entries()),...s.protocol==="https:"?{rejectUnauthorized:false}:{}},d=>{let p=[];d.on("data",c=>{p.push(Buffer.isBuffer(c)?c:Buffer.from(c));}),d.on("error",a),d.on("end",()=>{let c=d.statusCode??0,g=d.headers.location;if(r>0&&g&&[301,302,303,307,308].includes(c)){l(_e(new URL(g,s),{method:c===303?"GET":n},r-1));return}let m=new Headers;for(let[f,w]of Object.entries(d.headers))Array.isArray(w)?m.set(f,w.join(", ")):typeof w=="string"&&m.set(f,w);l(new Response(Buffer.concat(p),{status:c,statusText:d.statusMessage??"",headers:m}));});});o.on("error",a),o.end();})}function Wt(e){let t=me(e.wpsuite),r={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},s=String(r.accountId??"").trim(),n=String(r.siteId??"").trim(),i=String(t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...i?{uploadUrl:i}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!s||!n||!i)return false;Qt(e.sourceOrigin);let u=globalThis,a={...u.WpSuite??{},siteSettings:r,uploadUrl:i};return t.apiBase&&(a.apiBase=t.apiBase),u.WpSuite=a,true}async function _t(e){if(!Wt(e))return null;let t=String(e.wpsuite?.uploadUrl??"").trim(),r=globalThis.fetch;try{e.ignoreHttpsErrors&&typeof r=="function"&&t.startsWith("https://")&&(globalThis.fetch=(async(i,u)=>We(i).startsWith(t)?_e(i,u):r(i,u)));let{getConfig:s}=await import('@smart-cloud/wpsuite-core'),n=await s("publisher");return n&&typeof n=="object"?n:null}catch{return null}finally{typeof r=="function"&&(globalThis.fetch=r);}}function Bt(e,t){let r=jt(t?.deploymentProfiles),s=String(t?.defaultDeploymentProfile??"").trim(),n=r[s]?s:"",i=Qe(t?.subscriptionType),u=me(e.wpsuite);return {...e,scheduler:Ne(t?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:n,...i?{subscriptionType:i}:{},wpsuite:{...u,...u.siteSettings||i?{siteSettings:{...u.siteSettings??{},...u.siteSettings?.subscriber===true||i==="PROFESSIONAL"||i==="AGENCY"?{subscriber:true}:{}}}:{},...i?{subscriptionType:i}:{}}}}function fe(e,t){let s=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!s)return t;let n=s.split("/").map(i=>i.trim()).filter(i=>i.length>0&&i!=="."&&i!=="..");return n.length>0?n.join("/"):t}function Ht(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?h.resolve(e):""}function Ue(e,t,r){let s=String(t||"").trim();return s&&h.isAbsolute(s)?h.resolve(s):h.resolve(e,fe(s,r))}async function we(e){let t=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",r=await b.readFile(t,"utf8"),s=JSON.parse(r);s.sourceOrigin=s.sourceOrigin.replace(/\/$/,""),s.targetOrigin=qe(s.targetOrigin),s.ignoreHttpsErrors??=false,s.outputDir=String(s.outputDir||"export").trim()||"export",s.urlRewriteMode||=s.targetOrigin==="."?"relative":"absolute",s.noJavaScriptRenderPathPrefixes||=[],s.seedPaths||=[],s.generated404RequestPath=Ft(s.generated404RequestPath),s.sitemapPaths||=["/sitemap_index.xml","/sitemap.xml"],s.allowedAssetHosts||=[],s.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],s.blockedPathPrefixes||=[],s.blockedSearchFragments||=[],s.concurrency||=1,s.maxPages||=0,s.extraReplacements=he(s.extraReplacements),s.postCrawlCopyMap=he(s.postCrawlCopyMap),s.logDir=String(s.logDir||"logs").trim()||"logs",s.verbose??=false,s.logLevel||=s.verbose?"debug":"info",s.s3SyncMode||="sdk-upload-delete",s.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},s.readiness.timeoutMs??=1500,s.readiness.fallbackWaitMs??=1500,s.viewport||={width:1440,height:1200},s.navigationTimeoutMs||=3e4,s.assetDownloadConcurrency=Number(s.assetDownloadConcurrency)>0?Number(s.assetDownloadConcurrency):s.concurrency,s.rewriteConcurrency=Number(s.rewriteConcurrency)>0?Number(s.rewriteConcurrency):s.assetDownloadConcurrency,s.wpsuite=me(s.wpsuite),s.scheduler=Ne(void 0),s.deploymentProfiles={},s.defaultDeploymentProfile="",s.deploymentTargetOverride=String(s.deploymentTargetOverride??"").trim();let n=Bt(s,await _t(s)),i=Ht(),u=i?h.resolve(i,".."):"";return u?(n.outputDir=Ue(u,n.outputDir,"export"),n.logDir=Ue(u,n.logDir,"logs")):(h.isAbsolute(n.outputDir)||(n.outputDir=fe(n.outputDir,"export")),h.isAbsolute(n.logDir)||(n.logDir=fe(n.logDir,"logs"))),n}function Y(e,t=10){return zt.createHash("sha1").update(e).digest("hex").slice(0,t)}async function Pe(e){await b.mkdir(h.dirname(e),{recursive:true});}function _(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(h.extname(e).toLowerCase())}function j(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 z(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function oe(e){return e.replace(/\//g,"\\/")}function Be(e){return e.replace(/\//g,"\\\\/")}function Gt(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 s=oe(t),n=oe(r);e[s]=n;let i=Be(t),u=Be(r);e[i]=u;let l=z(t),a=z(r);e[l]=a;let o=z(s),d=z(n);e[o]=d;let p=z(i),c=z(u);e[p]=c;}function ae(e,t,r){He(e,t,r);let s=Gt(t);s&&s!==t&&He(e,s,r);}function be(e,t){let r=t.startsWith("/")?t:`/${t}`,s=(e||"").replace(/\/$/,"");return !s||s==="."||s==="/"?r:`${s}${r}`}function ze(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function Je(e,t,r){if(!t)return r;let s=h.dirname(h.resolve(t)),n=h.resolve(e,r.replace(/^\/+/,"")),i=h.relative(s,n).replace(/\\/g,"/");return i?(i.startsWith(".")||(i=`./${i}`),i):"."}var Zt=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],Xt=new Set([".html",".htm"]),Ve="WPSuite.io Static Publisher",er=Ve.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function tr(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function rr(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function sr(e,t,r){return rr(t)?e.replace(new RegExp(`(?<!:)${tr(t)}`,"g"),r):e.split(t).join(r)}function nr(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let n=h.extname(r).toLowerCase();return Xt.has(n)?/<head\b|<html\b|<!doctype html/i.test(t):false}function ir(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${er}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${Ve}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let s=e.includes(`\r
1
+ import {request,chromium}from'playwright';import S from'fs/promises';import f from'path';import {gunzipSync}from'zlib';import Wt from'http';import _t from'https';import Xe from'crypto';import rr from'fast-glob';import {availableParallelism}from'os';import {Worker}from'worker_threads';var jt=".deploy-plan.json",Et="deploy-plan.json";function Ut(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.resolve(e):""}function _e(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim();return !t||t==="."||t.startsWith("../")||t===".."?null:t}function Se(e){return [...new Set(e.map(_e).filter(t=>t!==null))]}function qt(e,t){return {schemaVersion:1,generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:f.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:Se(t.changedFiles||[]),deletedFiles:Se(t.deletedFiles||[]),rewriteTargets:Se(t.rewriteTargets||[])}}function Qt(e){let t=f.join(f.resolve(e.outputDir),jt),r=Ut();return r?[f.join(r,Et),t]:[t]}function ee(e,t){let r=f.resolve(e),s=f.resolve(t),n=f.relative(r,s).replace(/\\/g,"/");return _e(n)}async function Be(e,t){let r=qt(e,t);for(let s of Qt(e))await S.mkdir(f.dirname(s),{recursive:true}),await S.writeFile(s,JSON.stringify(r,null,2),"utf8");}function ze(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function Bt(e){let t=String(e??"").trim();if(!t)return "";let r=t;if(/^https?:\/\//i.test(r))try{r=new URL(r).pathname;}catch{return ""}if(r=r.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!r)return "";let s=r.endsWith("/"),n=r.replace(/^\/+/,"").split("/").map(u=>u.replace(/[^A-Za-z0-9._-]/g,"")).filter(u=>u.length>0&&u!=="."&&u!=="..");if(n.length===0)return "";let i=`/${n.join("/")}`;return s&&f.extname(i)===""&&(i+="/"),i==="/"?"":i}function be(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function Ht(e){if(!e||typeof e!="object")return {};let t={};for(let[r,s]of Object.entries(e)){let n=r.trim();if(!n||!s||typeof s!="object")continue;let i=s,u={};if(typeof i.targetOrigin=="string"){let a=ze(i.targetOrigin);a&&(u.targetOrigin=a);}let l=be(i.extraReplacements);if(Object.keys(l).length>0&&(u.extraReplacements=l),i.s3&&typeof i.s3=="object"){let a={},o=i.s3;typeof o.bucket=="string"&&(a.bucket=o.bucket.trim()),typeof o.prefix=="string"&&(a.prefix=o.prefix.trim()),typeof o.region=="string"&&(a.region=o.region.trim()),typeof o.htmlCacheControl=="string"&&(a.htmlCacheControl=o.htmlCacheControl.trim()),typeof o.assetCacheControl=="string"&&(a.assetCacheControl=o.assetCacheControl.trim()),Object.keys(a).length>0&&(u.s3=a);}if(i.cloudFront&&typeof i.cloudFront=="object"){let a={},o=i.cloudFront;typeof o.distributionId=="string"&&(a.distributionId=o.distributionId.trim()),Array.isArray(o.invalidationPaths)&&(a.invalidationPaths=o.invalidationPaths.map(d=>String(d??"").trim()).filter(d=>d.length>0)),Object.keys(a).length>0&&(u.cloudFront=a);}t[n]=u;}return t}function Je(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function zt(e,t){if(!e||typeof e!="object")return null;let r=e,s=r.command;if(s!=="publish"&&s!=="crawl"&&s!=="deploy"&&s!=="invalidate"&&s!=="retry-timeouts"&&s!=="url")return null;let n=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(n)||n<1)return null;let i=String(r.id??`${s}-${t+1}`).trim();if(!i)return null;let u=String(r.deploymentProfile??"").trim(),l=String(r.url??"").trim();return {id:i,enabled:r.enabled!==false,command:s,intervalMinutes:n,...s==="publish"||s==="crawl"?{crawlMode:r.crawlMode==="incremental"?"incremental":"full"}:{},...(s==="publish"||s==="deploy"||s==="invalidate")&&u?{deploymentProfile:u}:{},...l?{url:l}:{}}}function Ge(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((s,n)=>zt(s,n)).filter(s=>!!s):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:r}}function Jt(e){if(!e||typeof e!="object")return;let t=e,r={};for(let n of ["accountId","siteId"]){let i=t[n];typeof i=="string"&&i.trim()!==""&&(r[n]=i.trim());}let s=Number(t.lastUpdate??0);return Number.isFinite(s)&&s>0&&(r.lastUpdate=Math.floor(s)),t.subscriber===true&&(r.subscriber=true),Object.keys(r).length>0?r:void 0}function ve(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),s=String(t.siteId??"").trim(),n=t.subscriber===true,i=Jt(t.siteSettings),u={...i??{},...r?{accountId:i?.accountId??r}:{},...s?{siteId:i?.siteId??s}:{},...i?.subscriber===true||n?{subscriber:true}:{}},l={},a=String(t.apiBase??"").trim();a&&(l.apiBase=a);let o=String(t.runtimeToken??t.nonce??"").trim();o&&(l.runtimeToken=o);let d=String(t.uploadUrl??"").trim();d&&(l.uploadUrl=d),Object.keys(u).length>0&&(l.siteSettings=u);let p=Je(t.subscriptionType);return p&&(l.subscriptionType=p),l}function Gt(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function Ve(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function Vt(e,t){let r=new Headers(e instanceof Request?e.headers:void 0);if(t?.headers)for(let[s,n]of new Headers(t.headers).entries())r.set(s,n);return r}async function Ke(e,t,r=5){let s=new URL(Ve(e)),n=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),i=s.protocol==="http:"?Wt:_t,u=Vt(e,t);return await new Promise((l,a)=>{let o=i.request(s,{method:n,headers:Object.fromEntries(u.entries()),...s.protocol==="https:"?{rejectUnauthorized:false}:{}},d=>{let p=[];d.on("data",c=>{p.push(Buffer.isBuffer(c)?c:Buffer.from(c));}),d.on("error",a),d.on("end",()=>{let c=d.statusCode??0,g=d.headers.location;if(r>0&&g&&[301,302,303,307,308].includes(c)){l(Ke(new URL(g,s),{method:c===303?"GET":n},r-1));return}let m=new Headers;for(let[w,h]of Object.entries(d.headers))Array.isArray(h)?m.set(w,h.join(", ")):typeof h=="string"&&m.set(w,h);l(new Response(Buffer.concat(p),{status:c,statusText:d.statusMessage??"",headers:m}));});});o.on("error",a),o.end();})}function Kt(e){let t=ve(e.wpsuite),r={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},s=String(r.accountId??"").trim(),n=String(r.siteId??"").trim(),i=String(t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...i?{uploadUrl:i}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!s||!n||!i)return false;Gt(e.sourceOrigin);let u=globalThis,a={...u.WpSuite??{},siteSettings:r,uploadUrl:i};return t.apiBase&&(a.apiBase=t.apiBase),u.WpSuite=a,true}async function Yt(e){if(!Kt(e))return null;let t=String(e.wpsuite?.uploadUrl??"").trim(),r=globalThis.fetch;try{e.ignoreHttpsErrors&&typeof r=="function"&&t.startsWith("https://")&&(globalThis.fetch=(async(i,u)=>Ve(i).startsWith(t)?Ke(i,u):r(i,u)));let{getConfig:s}=await import('@smart-cloud/wpsuite-core'),n=await s("publisher");return n&&typeof n=="object"?n:null}catch{return null}finally{typeof r=="function"&&(globalThis.fetch=r);}}function Zt(e,t){let r=Ht(t?.deploymentProfiles),s=String(t?.defaultDeploymentProfile??"").trim(),n=r[s]?s:"",i=Je(t?.subscriptionType),u=ve(e.wpsuite);return {...e,scheduler:Ge(t?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:n,...i?{subscriptionType:i}:{},wpsuite:{...u,...u.siteSettings||i?{siteSettings:{...u.siteSettings??{},...u.siteSettings?.subscriber===true||i==="PROFESSIONAL"||i==="AGENCY"?{subscriber:true}:{}}}:{},...i?{subscriptionType:i}:{}}}}function ye(e,t){let s=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!s)return t;let n=s.split("/").map(i=>i.trim()).filter(i=>i.length>0&&i!=="."&&i!=="..");return n.length>0?n.join("/"):t}function Xt(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.resolve(e):""}function He(e,t,r){let s=String(t||"").trim();return s&&f.isAbsolute(s)?f.resolve(s):f.resolve(e,ye(s,r))}async function Re(e){let t=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",r=await S.readFile(t,"utf8"),s=JSON.parse(r);s.sourceOrigin=s.sourceOrigin.replace(/\/$/,""),s.targetOrigin=ze(s.targetOrigin),s.ignoreHttpsErrors??=false,s.outputDir=String(s.outputDir||"export").trim()||"export",s.urlRewriteMode||=s.targetOrigin==="."?"relative":"absolute",s.noJavaScriptRenderPathPrefixes||=[],s.seedPaths||=[],s.generated404RequestPath=Bt(s.generated404RequestPath),s.sitemapPaths||=["/sitemap_index.xml","/sitemap.xml"],s.allowedAssetHosts||=[],s.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],s.blockedPathPrefixes||=[],s.blockedSearchFragments||=[],s.concurrency||=1,s.maxPages||=0,s.extraReplacements=be(s.extraReplacements),s.postCrawlCopyMap=be(s.postCrawlCopyMap),s.logDir=String(s.logDir||"logs").trim()||"logs",s.verbose??=false,s.logLevel||=s.verbose?"debug":"info",s.s3SyncMode||="sdk-upload-delete",s.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},s.readiness.timeoutMs??=1500,s.readiness.fallbackWaitMs??=1500,s.viewport||={width:1440,height:1200},s.navigationTimeoutMs||=3e4,s.assetDownloadConcurrency=Number(s.assetDownloadConcurrency)>0?Number(s.assetDownloadConcurrency):s.concurrency,s.rewriteConcurrency=Number(s.rewriteConcurrency)>0?Number(s.rewriteConcurrency):s.assetDownloadConcurrency,s.wpsuite=ve(s.wpsuite),s.scheduler=Ge(void 0),s.deploymentProfiles={},s.defaultDeploymentProfile="",s.deploymentTargetOverride=String(s.deploymentTargetOverride??"").trim();let n=Zt(s,await Yt(s)),i=Xt(),u=i?f.resolve(i,".."):"";return u?(n.outputDir=He(u,n.outputDir,"export"),n.logDir=He(u,n.logDir,"logs")):(f.isAbsolute(n.outputDir)||(n.outputDir=ye(n.outputDir,"export")),f.isAbsolute(n.logDir)||(n.logDir=ye(n.logDir,"logs"))),n}function re(e,t=10){return Xe.createHash("sha1").update(e).digest("hex").slice(0,t)}async function er(e){await S.mkdir(f.dirname(e),{recursive:true});}async function se(e,t,r){await er(e);let s=f.join(f.dirname(e),`.${f.basename(e)}.${process.pid}.${Date.now()}.${Xe.randomBytes(6).toString("hex")}.tmp`);try{typeof t=="string"?await S.writeFile(s,t,r??"utf8"):await S.writeFile(s,t),await S.rename(s,e);}catch(n){throw await S.unlink(s).catch(()=>{}),n}}function z(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(f.extname(e).toLowerCase())}function E(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 pe(e){return e.replace(/\//g,"\\/")}function Ye(e){return e.replace(/\//g,"\\\\/")}function tr(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 Ze(e,t,r){if(!t)return;e[t]=r;let s=pe(t),n=pe(r);e[s]=n;let i=Ye(t),u=Ye(r);e[i]=u;let l=V(t),a=V(r);e[l]=a;let o=V(s),d=V(n);e[o]=d;let p=V(i),c=V(u);e[p]=c;}function ge(e,t,r){Ze(e,t,r);let s=tr(t);s&&s!==t&&Ze(e,s,r);}function Ce(e,t){let r=t.startsWith("/")?t:`/${t}`,s=(e||"").replace(/\/$/,"");return !s||s==="."||s==="/"?r:`${s}${r}`}function et(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function tt(e,t,r){if(!t)return r;let s=f.dirname(f.resolve(t)),n=f.resolve(e,r.replace(/^\/+/,"")),i=f.relative(s,n).replace(/\\/g,"/");return i?(i.startsWith(".")||(i=`./${i}`),i):"."}var or=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],ar=new Set([".html",".htm"]),rt="WPSuite.io Static Publisher",ur=rt.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function lr(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function cr(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function dr(e,t,r){return cr(t)?e.replace(new RegExp(`(?<!:)${lr(t)}`,"g"),r):e.split(t).join(r)}function pr(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let n=f.extname(r).toLowerCase();return ar.has(n)?/<head\b|<html\b|<!doctype html/i.test(t):false}function gr(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${ur}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${rt}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let s=e.includes(`\r
2
2
  `)?`\r
3
3
  `:`
4
- `;return e.replace(/<head\b[^>]*>/i,n=>`${n}${s} ${t}`)}function or(e){let t=j(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function ar(e,t){let r=[...new Set(t)].filter(i=>i.includes("/")&&!/\\+\//.test(i)).map(i=>[i,oe(i)]).filter(([i,u])=>i!==u).sort((i,u)=>u[0].length-i[0].length);if(!r.length)return e;let s=i=>{let u=i;for(let[l,a]of r)u=u.split(l).join(a);return u},n=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(i,u,l,a)=>`${u}${s(l)}${a}`);return n=n.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(i,u,l,a,o)=>or(a)?`${u}${s(a)}${o}`:i),n}function ur(e,t){if(!t)return null;let r=h.dirname(h.resolve(t)),s=h.resolve(e.outputDir),n=h.relative(r,s).replace(/\\/g,"/");return n?(n.startsWith(".")||(n=`./${n}`),n.endsWith("/")?n:`${n}/`):"./"}function lr(e,t,r){let s=ur(t,r);if(!s)return e;let n=e;for(let i of Zt){let u=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),l=new RegExp(`(?:\\.{1,}/)+${u}`,"g"),a=new RegExp(`(?<!\\.)/${u}`,"g");n=n.replace(l,`${s}${i}`).replace(a,`${s}${i}`);let o=i.replace(/\//g,"\\/"),d=s.replace(/\//g,"\\/"),p=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=new RegExp(`(?:\\.{1,}\\\\/)+${p}`,"g"),g=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${p}`,"g"),m=new RegExp(`(?<![\\.\\\\])\\/${p}`,"g");n=n.replace(c,`${d}${o}`).replace(g,`${d}${o}`).replace(m,`${d}${o}`);}return n}function ye(e,t,r){if(e.urlRewriteMode==="absolute")return t;let s=(()=>{try{return new URL(t,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin)}catch{return null}})(),n=s?s.pathname:ze(t,e.targetOrigin),i=s?`${s.search}${s.hash}`:"";return e.urlRewriteMode==="root-relative"?`${n}${i}`:`${Je(e.outputDir,r,n)}${i}`}function Se(e,t,r,s,n){ae(e,r,ye(t,s,n));}function cr(e,t,r,s,n){if(!r||r===s)return;ae(e,r,s);let i=ye(t,r,n),u=ye(t,s,n);ae(e,i,u);}function ve(e,t,r,s,n={}){let i=e,u={};Se(u,t,t.sourceOrigin,t.targetOrigin,s);for(let[a,o]of Object.entries(t.extraReplacements))Se(u,t,a,o,s);for(let[a,o]of Object.entries(r))Se(u,t,a,o,s);for(let[a,o]of Object.entries(n)){let d=r[a];!d||d===o||cr(u,t,o,d,s);}let l=Object.entries(u).sort((a,o)=>o[0].length-a[0].length);for(let[a,o]of l)i=sr(i,a,o);return t.urlRewriteMode!=="absolute"&&(i=lr(i,t,s)),i=ar(i,l.map(([,a])=>a)),nr(t,i,s)&&(i=ir(i)),i}async function dr(e,t,r,s){let n=h.join(e.outputDir,s),i=h.extname(n).toLowerCase(),u;try{u=await b.readFile(n,"utf8");}catch(o){if(o.code!=="ENOENT")throw o;return {changed:false}}let a=ve(u,e,t,i===".js"||i===".mjs"?void 0:n,r);return a!==u?(await b.writeFile(n,a,"utf8"),{changed:true}):{changed:false}}async function pr(e,t){return await new Promise((r,s)=>{let n=a=>{if(l(),a?.error){s(new Error(a.error));return}r({changed:!!a?.changed});},i=a=>{l(),s(a);},u=a=>{l(),a!==0&&s(new Error(`Rewrite worker exited with code ${a}.`));},l=()=>{e.off("message",n),e.off("error",i),e.off("exit",u);};e.on("message",n),e.on("error",i),e.on("exit",u),e.postMessage({file:t});})}async function Ke(e,t,r={}){let n=(r.files?[...new Set(r.files)].map(c=>h.resolve(c)).filter(c=>c.startsWith(h.resolve(e.outputDir))).map(c=>h.relative(e.outputDir,c).replace(/\\/g,"/")).filter(c=>c.length>0):await Vt(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(c=>c!=="asset-map.json"&&_(c)),i=0;if(n.length===0)return 0;let u=Math.max(1,Number(e.rewriteConcurrency||e.assetDownloadConcurrency||1)),l=Math.max(1,Math.min(u,n.length,availableParallelism()));await r.onStart?.({totalFiles:n.length,workerCount:l});let a=0,o=0,d=null;if(l===1){for(let c of n){let g=await dr(e,t,r.previousAssetMap??{},c);g.changed&&(i+=1),o+=1,await r.onProgress?.({index:o,totalFiles:n.length,changedTextFiles:i,file:c,changed:g.changed});}return i}let p=Array.from({length:l},async()=>{let c=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:e,assetMap:t,previousAssetMap:r.previousAssetMap??{}}});try{for(;!d;){let g=a;if(g>=n.length)return;a+=1;let m=n[g],f=await pr(c,m);f.changed&&(i+=1),o+=1,await r.onProgress?.({index:o,totalFiles:n.length,changedTextFiles:i,file:m,changed:f.changed});}}catch(g){throw d=g instanceof Error?g:new Error(String(g)),d}finally{await c.terminate().catch(()=>{});}});return await Promise.all(p),i}var N={error:0,warn:1,info:2,debug:3},Ye=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",ue=Ye?h.join(Ye,"current-progress.json"):"",Ze=Promise.resolve();function Xe(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function gr(e,t){let r={...e},s=new Set(["pagesQueued","pagesRendered","assetsQueued","sitemapsQueued","pagesDiscovered","assetsDiscovered","sitemapsDiscovered","pagesSaved","assetsSaved","donePages","doneAssets","doneSitemaps","changedTextFiles","uploaded","failed","index","totalFiles","pageQueue","assetQueue","sitemapQueue"]);for(let[n,i]of Object.entries(t)){let u=r[n];if(typeof u=="number"&&typeof i=="number"&&s.has(n)){r[n]=Math.max(u,i);continue}r[n]=i;}return r}function hr(e,t,r){ue&&(Ze=Ze.then(async()=>{let s=new Date,n=s.toISOString();await b.mkdir(h.dirname(ue),{recursive:true});let i=await b.readFile(ue,"utf8").then(f=>JSON.parse(f)).catch(()=>null),u=i&&typeof i.details=="object"&&i.details?i.details:{},l=Xe(e),a=i?.currentStep||Xe(i?.source||""),o=i?.startedAt||n,d={...i?.stepDurationsSec??{}},p=i?.stepStartedAt||n;if(a&&a!==l&&i?.stepStartedAt){let f=Math.max(0,Math.round((s.getTime()-new Date(i.stepStartedAt).getTime())/1e3));d[a]=(d[a]??0)+f,p=n;}let c=Math.max(0,Math.round((s.getTime()-new Date(p).getTime())/1e3)),g=Math.max(0,Math.round((s.getTime()-new Date(o).getTime())/1e3)),m={checkedAt:n,source:e,message:t,details:gr(u,r??{}),startedAt:o,currentStep:l,stepStartedAt:p,stepElapsedSec:c,totalElapsedSec:g,stepDurationsSec:d};await b.writeFile(ue,JSON.stringify(m,null,2),"utf8");}).catch(()=>{}));}async function fr(e,t){await b.mkdir(h.dirname(e),{recursive:true}),await b.appendFile(e,`${JSON.stringify(t)}
5
- `,"utf8");}function mr(e,t){let r=typeof t?.phase=="string"?t.phase.trim():"";return r||(e==="page"?"render-pages":e==="asset"?"download-assets":e==="sitemap"?"discovery":e==="timing"&&typeof t?.name=="string"&&t.name.trim()||"crawl")}function wr(e,t,r){return {checkedAt:new Date().toISOString(),currentStep:mr(e,r),level:e,message:t,details:r??{}}}var Z=class{constructor(t,r="info"){this.logDir=t;this.level=typeof r=="boolean"?r?"debug":"info":r,this.ensureLogFileReady();}logDir;startedAt=Date.now();marks=new Map;initPromise=null;writeQueue=Promise.resolve();writeError=null;level;get logPath(){return h.join(this.logDir,"crawl.log.jsonl")}get currentEventPath(){return h.join(this.logDir,"current-crawl-event.json")}get rejectedPath(){return h.join(this.logDir,"rejected.jsonl")}get ignoredPath(){return h.join(this.logDir,"ignored.jsonl")}get skippedPath(){return h.join(this.logDir,"skipped-http.jsonl")}get errorsPath(){return h.join(this.logDir,"errors.jsonl")}get timingsPath(){return h.join(this.logDir,"timings.jsonl")}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await b.mkdir(this.logDir,{recursive:true}),await b.writeFile(this.logPath,"","utf8");})()),this.initPromise}enqueueTask(t){this.writeQueue=this.writeQueue.then(t).catch(r=>{this.writeError=r instanceof Error?r:new Error(String(r));});}enqueueLine(t){this.enqueueTask(async()=>{await this.ensureLogFileReady(),await b.appendFile(this.logPath,`${t}
6
- `,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>fr(t,r));}updateCurrentEvent(t,r,s){let n=wr(t,r,s);this.enqueueTask(async()=>{await b.mkdir(this.logDir,{recursive:true}),await b.writeFile(this.currentEventPath,JSON.stringify(n,null,2),"utf8");});}push(t,r,s){let n=JSON.stringify({time:new Date().toISOString(),level:t,message:r,...s||{}});this.enqueueLine(n),this.updateCurrentEvent(t,r,s),t==="error"?console.error(r,s||""):t==="warn"?console.warn(r,s||""):(N[this.level]>=N.debug||["summary","page","sitemap","asset","timing"].includes(t))&&console.log(r);}info(t,r){this.push("info",t,r);}debug(t,r){N[this.level]<N.debug||this.push("debug",t,r);}progress(t,r){hr("crawl.log.jsonl",t,r),this.updateCurrentEvent("progress",t,r);}checkpoint(t,r){this.updateCurrentEvent("checkpoint",t,r);}page(t,r){this.push("page",t,r);}sitemap(t,r){this.push("sitemap",t,r);}asset(t,r){this.push("asset",t,r);}warn(t,r){this.push("warn",t,r);}error(t,r){this.enqueueJsonLine(this.errorsPath,{message:t,...r||{}}),this.push("error",t,r);}summary(t,r){this.push("summary",t,r);}mark(t){this.marks.set(t,Date.now());}endMark(t,r){let s=this.marks.get(t);if(!s)return;let n=Date.now()-s,i={name:t,ms:n,seconds:Number((n/1e3).toFixed(2)),...r||{}};this.enqueueJsonLine(this.timingsPath,i),this.push("timing",`Timing ${t}: ${i.seconds}s`,i);}reject(t,r,s,n){let i={kind:t,url:r,reason:s,source:n};this.enqueueJsonLine(this.rejectedPath,i),N[this.level]>=N.debug&&this.push("reject",`Rejected ${t} ${r}: ${s}`,i);}ignore(t,r,s,n){let i={kind:t,url:r,reason:s,source:n};this.enqueueJsonLine(this.ignoredPath,i),N[this.level]>=N.debug&&this.push("ignore",`Ignored ${t} ${r}: ${s}`,i);}skip(t,r,s,n){let i={kind:t,url:r,status:s,source:n};this.enqueueJsonLine(this.skippedPath,i),this.push("warn",`Skipped ${t} ${r}: HTTP ${s}`,i);}async flush(){let t=Date.now()-this.startedAt,r={name:"total",ms:t,seconds:Number((t/1e3).toFixed(2))};if(this.enqueueJsonLine(this.timingsPath,r),await this.writeQueue,this.writeError)throw this.writeError}};var yr=["text/css","javascript","image/","font/","application/font","application/json","application/xml","text/xml","application/rss+xml","application/atom+xml","application/xslt+xml","text/xsl","image/svg+xml","application/octet-stream"],pt=new Set([".css",".js",".mjs",".json",".map",".xml",".xsl",".rss",".atom",".txt",".enc",".jws",".png",".jpg",".jpeg",".gif",".webp",".avif",".svg",".ico",".woff",".woff2",".ttf",".otf",".eot",".pdf",".mp4",".webm"]),gt=new Set(["",".html",".htm"]),vr=new Set([".css",".xml",".xsl",".svg",".json",".html",".htm",".txt",".enc",".jws"]),Rr=["/wp-content/","/wp-includes/","/wp-admin/","/static/","/assets/","/build/","/_next/"];function Cr(e){let t=[],r="full",s="full",n=false,i=false;for(let u=0;u<e.length;u++){let l=e[u];if(l==="--retry-timeouts")r="retry-timeouts",n=true;else if(l==="--resume")n=true;else if(l==="--resume-rewrite")n=true,i=true;else if(l==="--crawl-mode"){let a=e[++u];if(!a)throw new Error("--crawl-mode requires a value");s=a==="incremental"?"incremental":"full",n||=s==="incremental";}else if(l.startsWith("--crawl-mode="))s=l.slice(13)==="incremental"?"incremental":"full",n||=s==="incremental";else if(l==="--incremental")s="incremental",n=true;else if(l==="--url"){let a=e[++u];if(!a)throw new Error("--url requires a value");r="single-url",n=true,t.push(a);}else if(l.startsWith("--url="))r="single-url",n=true,t.push(l.slice(6));else if(l==="--urls"){let a=e[++u];if(!a)throw new Error("--urls requires a file path");r="single-url",n=true,t.push(`@${a}`);}}return {mode:r,crawlMode:s,urls:t,preserveOutput:n,resumeRewrite:i}}function Me(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?h.resolve(e):""}function kr(){let e=Me();return e?h.resolve(e,".."):""}function xr(){let e=process.env.STATIC_PUBLISHER_WP_ROOT||process.env.WPSUITE_STATIC_PUBLISHER_WP_ROOT||"";return e.trim()?h.resolve(e):""}function Tr(e){let t=e.trim(),r=[{alias:"@storage-root",root:kr(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@runtime",root:Me(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@wp-root",root:xr(),requiredEnv:"STATIC_PUBLISHER_WP_ROOT or WPSUITE_STATIC_PUBLISHER_WP_ROOT"}];for(let s of r){if(t!==s.alias&&!t.startsWith(`${s.alias}/`))continue;if(!s.root)return {resolvedPath:null,alias:s.alias,requiredEnv:s.requiredEnv};let n=t.slice(s.alias.length).replace(/^\/+/,"");return {resolvedPath:n?h.resolve(s.root,n):s.root,alias:s.alias}}return {resolvedPath:h.resolve(t)}}function ht(e){let t=Me();return t?h.join(t,"crawl-manifest.json"):h.join(e.outputDir,".crawl-manifest.json")}function ft(){return {schemaVersion:3,updatedAt:"",pages:{},assets:{}}}function et(e){return {url:String(e.url||""),outputPath:String(e.outputPath||""),contentType:typeof e.contentType=="string"&&e.contentType?e.contentType:null,changeToken:typeof e.changeToken=="string"?e.changeToken:null,tokenSource:typeof e.tokenSource=="string"?e.tokenSource:null,sitemapLastmod:typeof e.sitemapLastmod=="string"?e.sitemapLastmod:null,discoveredPages:Array.isArray(e.discoveredPages)?e.discoveredPages.map(t=>String(t)):[],discoveredAssets:Array.isArray(e.discoveredAssets)?e.discoveredAssets.map(t=>String(t)):[],lastCrawledAt:String(e.lastCrawledAt||""),lastSeenRunId:String(e.lastSeenRunId||""),rewriteComplete:e.rewriteComplete===true}}function Ar(e){let t=e.isText===true;return {url:String(e.url||""),outputPath:String(e.outputPath||""),isText:t,contentType:typeof e.contentType=="string"&&e.contentType?e.contentType:null,discoveredAssets:Array.isArray(e.discoveredAssets)?e.discoveredAssets.map(r=>String(r)):[],lastCrawledAt:String(e.lastCrawledAt||""),lastSeenRunId:String(e.lastSeenRunId||""),rewriteComplete:e.rewriteComplete===true||!t}}function xe(e){let t=e?.["content-type"]?.trim();return t||null}function Mr(){return {rewriteTargets:new Set,changedFiles:new Set,deletedFiles:new Set}}function U(e,t,r){let s=ie(t.outputDir,r);s&&(e.changedFiles.add(s),e.deletedFiles.delete(s));}function tt(e,t,r){let s=ie(t.outputDir,r);s&&(e.deletedFiles.add(s),e.changedFiles.delete(s));}function ee(e,t){e.rewriteTargets.add(h.resolve(t));}async function Lr(e){try{let t=await b.readFile(ht(e),"utf8"),r=JSON.parse(t);if(r&&typeof r=="object"&&r.pages&&typeof r.pages=="object"){if((r.schemaVersion===2||r.schemaVersion===3)&&r.assets&&typeof r.assets=="object")return {schemaVersion:3,updatedAt:String(r.updatedAt||""),pages:Object.fromEntries(Object.entries(r.pages).map(([s,n])=>[s,et(n)])),assets:Object.fromEntries(Object.entries(r.assets).map(([s,n])=>[s,Ar(n)]))};if(r.schemaVersion===1)return {schemaVersion:3,updatedAt:String(r.updatedAt||""),pages:Object.fromEntries(Object.entries(r.pages).map(([s,n])=>[s,et(n)])),assets:{}}}}catch{}return ft()}function Te(e){return JSON.parse(JSON.stringify(e))}async function Ir(e,t){let r=ht(e);await b.mkdir(h.dirname(r),{recursive:true}),await b.writeFile(r,JSON.stringify(t,null,2),"utf8");}async function G(e,t){if(!t.trackManifest)return;let r=async()=>{let s=Te(t.manifest);s.updatedAt=new Date().toISOString(),t.manifest.updatedAt=s.updatedAt,await Ir(e,s);};t.manifestSaveChain=t.manifestSaveChain.then(r,r),await t.manifestSaveChain;}function X(e){if(!e)return null;let t=e.trim();return t||null}function $r(e,t){let r=new Set,s=new Set([...Object.keys(e),...Object.keys(t)]);for(let n of s){let i=e[n],u=t[n];!i||!u||i===u||r.add(n);}return r}async function Or(e,t,r,s){let n=[...new Set(r.map(l=>l.trim()).filter(Boolean))],i=String(e.wpsuite?.runtimeToken||"").trim();if(n.length===0||!i)return new Map;let u=new URL("/wp-json/smartcloud-static-publisher/v1/change-tokens",e.sourceOrigin).toString();try{let l=await t.post(u,{timeout:3e4,failOnStatusCode:!1,headers:{"content-type":"application/json","x-static-publisher-token":i},data:JSON.stringify({urls:n})});if(!l.ok())return s.warn(`Change token lookup failed with HTTP ${l.status()}`,{endpoint:u,status:l.status()}),new Map;let a=await l.json().catch(()=>null);if(!a||!Array.isArray(a.items))return new Map;let o=new Map;for(let d of a.items)!d||typeof d.url!="string"||o.set(d.url,d);return o}catch(l){return s.warn("Change token lookup failed; falling back to sitemap metadata",{endpoint:u,error:String(l)}),new Map}}async function Re(e,t,r,s,n){if(!r.enabled&&!r.trackManifest)return null;if(r.changeTokenCache.has(s))return r.changeTokenCache.get(s)??null;let u=(await Or(e,t,[s],n)).get(s)??null;return Ie(e,s)&&(!u||u.supported!==true||!u.token)&&(u=await Fr(e,t,s,n)),u=Er(e,u),r.changeTokenCache.set(s,u),u}function Dr(e){return `subscriber=${e.wpsuite?.siteSettings?.subscriber===true?"1":"0"}`}function Er(e,t){if(!t?.supported||!t.token)return t;let r=Dr(e);return {...t,token:Y(`${t.token}
7
- ${r}`,40),tokenSource:t.tokenSource?`${t.tokenSource}+site-subscriber`:"site-subscriber"}}async function Fr(e,t,r,s){try{let n=await t.get(r,{timeout:Math.min(e.navigationTimeoutMs,15e3),failOnStatusCode:!1});if(n.status()!==404)return s.warn(`Generated 404 fallback token skipped for ${r}`,{url:r,status:n.status(),requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),null;let i=await n.text().catch(()=>""),u=Y(`${r}
4
+ `;return e.replace(/<head\b[^>]*>/i,n=>`${n}${s} ${t}`)}function fr(e){let t=E(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function hr(e,t){let r=[...new Set(t)].filter(i=>i.includes("/")&&!/\\+\//.test(i)).map(i=>[i,pe(i)]).filter(([i,u])=>i!==u).sort((i,u)=>u[0].length-i[0].length);if(!r.length)return e;let s=i=>{let u=i;for(let[l,a]of r)u=u.split(l).join(a);return u},n=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(i,u,l,a)=>`${u}${s(l)}${a}`);return n=n.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(i,u,l,a,o)=>fr(a)?`${u}${s(a)}${o}`:i),n}function mr(e,t){if(!t)return null;let r=f.dirname(f.resolve(t)),s=f.resolve(e.outputDir),n=f.relative(r,s).replace(/\\/g,"/");return n?(n.startsWith(".")||(n=`./${n}`),n.endsWith("/")?n:`${n}/`):"./"}function wr(e,t,r){let s=mr(t,r);if(!s)return e;let n=e;for(let i of or){let u=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),l=new RegExp(`(?:\\.{1,}/)+${u}`,"g"),a=new RegExp(`(?<!\\.)/${u}`,"g");n=n.replace(l,`${s}${i}`).replace(a,`${s}${i}`);let o=i.replace(/\//g,"\\/"),d=s.replace(/\//g,"\\/"),p=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=new RegExp(`(?:\\.{1,}\\\\/)+${p}`,"g"),g=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${p}`,"g"),m=new RegExp(`(?<![\\.\\\\])\\/${p}`,"g");n=n.replace(c,`${d}${o}`).replace(g,`${d}${o}`).replace(m,`${d}${o}`);}return n}function xe(e,t,r){if(e.urlRewriteMode==="absolute")return t;let s=(()=>{try{return new URL(t,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin)}catch{return null}})(),n=s?s.pathname:et(t,e.targetOrigin),i=s?`${s.search}${s.hash}`:"";return e.urlRewriteMode==="root-relative"?`${n}${i}`:`${tt(e.outputDir,r,n)}${i}`}function ke(e,t,r,s,n){ge(e,r,xe(t,s,n));}function Pr(e,t,r,s,n){if(!r||r===s)return;ge(e,r,s);let i=xe(t,r,n),u=xe(t,s,n);ge(e,i,u);}function Te(e,t,r,s,n={}){let i=e,u={};ke(u,t,t.sourceOrigin,t.targetOrigin,s);for(let[a,o]of Object.entries(t.extraReplacements))ke(u,t,a,o,s);for(let[a,o]of Object.entries(r))ke(u,t,a,o,s);for(let[a,o]of Object.entries(n)){let d=r[a];!d||d===o||Pr(u,t,o,d,s);}let l=Object.entries(u).sort((a,o)=>o[0].length-a[0].length);for(let[a,o]of l)i=dr(i,a,o);return t.urlRewriteMode!=="absolute"&&(i=wr(i,t,s)),i=hr(i,l.map(([,a])=>a)),pr(t,i,s)&&(i=gr(i)),i}async function Sr(e,t,r,s){let n=f.join(e.outputDir,s),i=f.extname(n).toLowerCase(),u;try{u=await S.readFile(n,"utf8");}catch(o){if(o.code!=="ENOENT")throw o;return {changed:false}}let a=Te(u,e,t,i===".js"||i===".mjs"?void 0:n,r);return a!==u?(await se(n,a,"utf8"),{changed:true}):{changed:false}}async function br(e,t){return await new Promise((r,s)=>{let n=a=>{if(l(),a?.error){s(new Error(a.error));return}r({changed:!!a?.changed});},i=a=>{l(),s(a);},u=a=>{l(),a!==0&&s(new Error(`Rewrite worker exited with code ${a}.`));},l=()=>{e.off("message",n),e.off("error",i),e.off("exit",u);};e.on("message",n),e.on("error",i),e.on("exit",u),e.postMessage({file:t});})}async function st(e,t,r={}){let n=(r.files?[...new Set(r.files)].map(c=>f.resolve(c)).filter(c=>c.startsWith(f.resolve(e.outputDir))).map(c=>f.relative(e.outputDir,c).replace(/\\/g,"/")).filter(c=>c.length>0):await rr(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(c=>c!=="asset-map.json"&&z(c)),i=0;if(n.length===0)return 0;let u=Math.max(1,Number(e.rewriteConcurrency||e.assetDownloadConcurrency||1)),l=Math.max(1,Math.min(u,n.length,availableParallelism()));await r.onStart?.({totalFiles:n.length,workerCount:l});let a=0,o=0,d=null;if(l===1){for(let c of n){let g=await Sr(e,t,r.previousAssetMap??{},c);g.changed&&(i+=1),o+=1,await r.onProgress?.({index:o,totalFiles:n.length,changedTextFiles:i,file:c,changed:g.changed});}return i}let p=Array.from({length:l},async()=>{let c=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:e,assetMap:t,previousAssetMap:r.previousAssetMap??{}}});try{for(;!d;){let g=a;if(g>=n.length)return;a+=1;let m=n[g],w=await br(c,m);w.changed&&(i+=1),o+=1,await r.onProgress?.({index:o,totalFiles:n.length,changedTextFiles:i,file:m,changed:w.changed});}}catch(g){throw d=g instanceof Error?g:new Error(String(g)),d}finally{await c.terminate().catch(()=>{});}});return await Promise.all(p),i}var _={error:0,warn:1,info:2,debug:3},nt=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",fe=nt?f.join(nt,"current-progress.json"):"",it=Promise.resolve();function ot(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function yr(e,t){let r={...e},s=new Set(["pagesQueued","pagesRendered","assetsQueued","sitemapsQueued","pagesDiscovered","assetsDiscovered","sitemapsDiscovered","pagesSaved","assetsSaved","donePages","doneAssets","doneSitemaps","changedTextFiles","uploaded","failed","index","totalFiles","pageQueue","assetQueue","sitemapQueue"]);for(let[n,i]of Object.entries(t)){let u=r[n];if(typeof u=="number"&&typeof i=="number"&&s.has(n)){r[n]=Math.max(u,i);continue}r[n]=i;}return r}function vr(e,t,r){fe&&(it=it.then(async()=>{let s=new Date,n=s.toISOString();await S.mkdir(f.dirname(fe),{recursive:true});let i=await S.readFile(fe,"utf8").then(w=>JSON.parse(w)).catch(()=>null),u=i&&typeof i.details=="object"&&i.details?i.details:{},l=ot(e),a=i?.currentStep||ot(i?.source||""),o=i?.startedAt||n,d={...i?.stepDurationsSec??{}},p=i?.stepStartedAt||n;if(a&&a!==l&&i?.stepStartedAt){let w=Math.max(0,Math.round((s.getTime()-new Date(i.stepStartedAt).getTime())/1e3));d[a]=(d[a]??0)+w,p=n;}let c=Math.max(0,Math.round((s.getTime()-new Date(p).getTime())/1e3)),g=Math.max(0,Math.round((s.getTime()-new Date(o).getTime())/1e3)),m={checkedAt:n,source:e,message:t,details:yr(u,r??{}),startedAt:o,currentStep:l,stepStartedAt:p,stepElapsedSec:c,totalElapsedSec:g,stepDurationsSec:d};await S.writeFile(fe,JSON.stringify(m,null,2),"utf8");}).catch(()=>{}));}async function Rr(e,t){await S.mkdir(f.dirname(e),{recursive:true}),await S.appendFile(e,`${JSON.stringify(t)}
5
+ `,"utf8");}function Cr(e,t){let r=typeof t?.phase=="string"?t.phase.trim():"";return r||(e==="page"?"render-pages":e==="asset"?"download-assets":e==="sitemap"?"discovery":e==="timing"&&typeof t?.name=="string"&&t.name.trim()||"crawl")}function kr(e,t,r){return {checkedAt:new Date().toISOString(),currentStep:Cr(e,r),level:e,message:t,details:r??{}}}var ne=class{constructor(t,r="info"){this.logDir=t;this.level=typeof r=="boolean"?r?"debug":"info":r,this.ensureLogFileReady();}logDir;startedAt=Date.now();marks=new Map;initPromise=null;writeQueue=Promise.resolve();writeError=null;level;get logPath(){return f.join(this.logDir,"crawl.log.jsonl")}get currentEventPath(){return f.join(this.logDir,"current-crawl-event.json")}get rejectedPath(){return f.join(this.logDir,"rejected.jsonl")}get ignoredPath(){return f.join(this.logDir,"ignored.jsonl")}get skippedPath(){return f.join(this.logDir,"skipped-http.jsonl")}get errorsPath(){return f.join(this.logDir,"errors.jsonl")}get timingsPath(){return f.join(this.logDir,"timings.jsonl")}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await S.mkdir(this.logDir,{recursive:true}),await S.writeFile(this.logPath,"","utf8");})()),this.initPromise}enqueueTask(t){this.writeQueue=this.writeQueue.then(t).catch(r=>{this.writeError=r instanceof Error?r:new Error(String(r));});}enqueueLine(t){this.enqueueTask(async()=>{await this.ensureLogFileReady(),await S.appendFile(this.logPath,`${t}
6
+ `,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>Rr(t,r));}updateCurrentEvent(t,r,s){let n=kr(t,r,s);this.enqueueTask(async()=>{await S.mkdir(this.logDir,{recursive:true}),await S.writeFile(this.currentEventPath,JSON.stringify(n,null,2),"utf8");});}push(t,r,s){let n=JSON.stringify({time:new Date().toISOString(),level:t,message:r,...s||{}});this.enqueueLine(n),this.updateCurrentEvent(t,r,s),t==="error"?console.error(r,s||""):t==="warn"?console.warn(r,s||""):(_[this.level]>=_.debug||["summary","page","sitemap","asset","timing"].includes(t))&&console.log(r);}info(t,r){this.push("info",t,r);}debug(t,r){_[this.level]<_.debug||this.push("debug",t,r);}progress(t,r){vr("crawl.log.jsonl",t,r),this.updateCurrentEvent("progress",t,r);}checkpoint(t,r){this.updateCurrentEvent("checkpoint",t,r);}page(t,r){this.push("page",t,r);}sitemap(t,r){this.push("sitemap",t,r);}asset(t,r){this.push("asset",t,r);}warn(t,r){this.push("warn",t,r);}error(t,r){this.enqueueJsonLine(this.errorsPath,{message:t,...r||{}}),this.push("error",t,r);}summary(t,r){this.push("summary",t,r);}mark(t){this.marks.set(t,Date.now());}endMark(t,r){let s=this.marks.get(t);if(!s)return;let n=Date.now()-s,i={name:t,ms:n,seconds:Number((n/1e3).toFixed(2)),...r||{}};this.enqueueJsonLine(this.timingsPath,i),this.push("timing",`Timing ${t}: ${i.seconds}s`,i);}reject(t,r,s,n){let i={kind:t,url:r,reason:s,source:n};this.enqueueJsonLine(this.rejectedPath,i),_[this.level]>=_.debug&&this.push("reject",`Rejected ${t} ${r}: ${s}`,i);}ignore(t,r,s,n){let i={kind:t,url:r,reason:s,source:n};this.enqueueJsonLine(this.ignoredPath,i),_[this.level]>=_.debug&&this.push("ignore",`Ignored ${t} ${r}: ${s}`,i);}skip(t,r,s,n){let i={kind:t,url:r,status:s,source:n};this.enqueueJsonLine(this.skippedPath,i),this.push("warn",`Skipped ${t} ${r}: HTTP ${s}`,i);}async flush(){let t=Date.now()-this.startedAt,r={name:"total",ms:t,seconds:Number((t/1e3).toFixed(2))};if(this.enqueueJsonLine(this.timingsPath,r),await this.writeQueue,this.writeError)throw this.writeError}};var Mr=["text/css","javascript","image/","font/","application/font","application/json","application/xml","text/xml","application/rss+xml","application/atom+xml","application/xslt+xml","text/xsl","image/svg+xml","application/octet-stream"],St=new Set([".css",".js",".mjs",".json",".map",".xml",".xsl",".rss",".atom",".txt",".enc",".jws",".png",".jpg",".jpeg",".gif",".webp",".avif",".svg",".ico",".woff",".woff2",".ttf",".otf",".eot",".pdf",".mp4",".webm"]),bt=new Set(["",".html",".htm"]),Lr=new Set([".css",".xml",".xsl",".svg",".json",".html",".htm",".txt",".enc",".jws"]),Ir=["/wp-content/","/wp-includes/","/wp-admin/","/static/","/assets/","/build/","/_next/"];function $r(e){let t=[],r="full",s="full",n=false,i=false;for(let u=0;u<e.length;u++){let l=e[u];if(l==="--retry-timeouts")r="retry-timeouts",n=true;else if(l==="--resume")n=true;else if(l==="--resume-rewrite")n=true,i=true;else if(l==="--crawl-mode"){let a=e[++u];if(!a)throw new Error("--crawl-mode requires a value");s=a==="incremental"?"incremental":"full",n||=s==="incremental";}else if(l.startsWith("--crawl-mode="))s=l.slice(13)==="incremental"?"incremental":"full",n||=s==="incremental";else if(l==="--incremental")s="incremental",n=true;else if(l==="--url"){let a=e[++u];if(!a)throw new Error("--url requires a value");r="single-url",n=true,t.push(a);}else if(l.startsWith("--url="))r="single-url",n=true,t.push(l.slice(6));else if(l==="--urls"){let a=e[++u];if(!a)throw new Error("--urls requires a file path");r="single-url",n=true,t.push(`@${a}`);}}return {mode:r,crawlMode:s,urls:t,preserveOutput:n,resumeRewrite:i}}function Oe(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.resolve(e):""}function Dr(){let e=Oe();return e?f.resolve(e,".."):""}function Or(){let e=process.env.STATIC_PUBLISHER_WP_ROOT||process.env.WPSUITE_STATIC_PUBLISHER_WP_ROOT||"";return e.trim()?f.resolve(e):""}function Fr(e){let t=e.trim(),r=[{alias:"@storage-root",root:Dr(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@runtime",root:Oe(),requiredEnv:"STATIC_PUBLISHER_RUNTIME_DIR or WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR"},{alias:"@wp-root",root:Or(),requiredEnv:"STATIC_PUBLISHER_WP_ROOT or WPSUITE_STATIC_PUBLISHER_WP_ROOT"}];for(let s of r){if(t!==s.alias&&!t.startsWith(`${s.alias}/`))continue;if(!s.root)return {resolvedPath:null,alias:s.alias,requiredEnv:s.requiredEnv};let n=t.slice(s.alias.length).replace(/^\/+/,"");return {resolvedPath:n?f.resolve(s.root,n):s.root,alias:s.alias}}return {resolvedPath:f.resolve(t)}}function yt(e){let t=Oe();return t?f.join(t,"crawl-manifest.json"):f.join(e.outputDir,".crawl-manifest.json")}function vt(){return {schemaVersion:3,updatedAt:"",pages:{},assets:{}}}function at(e){return {url:String(e.url||""),outputPath:String(e.outputPath||""),contentType:typeof e.contentType=="string"&&e.contentType?e.contentType:null,changeToken:typeof e.changeToken=="string"?e.changeToken:null,tokenSource:typeof e.tokenSource=="string"?e.tokenSource:null,sitemapLastmod:typeof e.sitemapLastmod=="string"?e.sitemapLastmod:null,discoveredPages:Array.isArray(e.discoveredPages)?e.discoveredPages.map(t=>String(t)):[],discoveredAssets:Array.isArray(e.discoveredAssets)?e.discoveredAssets.map(t=>String(t)):[],lastCrawledAt:String(e.lastCrawledAt||""),lastSeenRunId:String(e.lastSeenRunId||""),rewriteComplete:e.rewriteComplete===true}}function jr(e){let t=e.isText===true;return {url:String(e.url||""),outputPath:String(e.outputPath||""),isText:t,contentType:typeof e.contentType=="string"&&e.contentType?e.contentType:null,discoveredAssets:Array.isArray(e.discoveredAssets)?e.discoveredAssets.map(r=>String(r)):[],lastCrawledAt:String(e.lastCrawledAt||""),lastSeenRunId:String(e.lastSeenRunId||""),rewriteComplete:e.rewriteComplete===true||!t}}function Ie(e){let t=e?.["content-type"]?.trim();return t||null}function Er(){return {rewriteTargets:new Set,changedFiles:new Set,deletedFiles:new Set}}function q(e,t,r){let s=ee(t.outputDir,r);s&&(e.changedFiles.add(s),e.deletedFiles.delete(s));}function ut(e,t,r){let s=ee(t.outputDir,r);s&&(e.deletedFiles.add(s),e.changedFiles.delete(s));}function oe(e,t){e.rewriteTargets.add(f.resolve(t));}async function Ur(e){try{let t=await S.readFile(yt(e),"utf8"),r=JSON.parse(t);if(r&&typeof r=="object"&&r.pages&&typeof r.pages=="object"){if((r.schemaVersion===2||r.schemaVersion===3)&&r.assets&&typeof r.assets=="object")return {schemaVersion:3,updatedAt:String(r.updatedAt||""),pages:Object.fromEntries(Object.entries(r.pages).map(([s,n])=>[s,at(n)])),assets:Object.fromEntries(Object.entries(r.assets).map(([s,n])=>[s,jr(n)]))};if(r.schemaVersion===1)return {schemaVersion:3,updatedAt:String(r.updatedAt||""),pages:Object.fromEntries(Object.entries(r.pages).map(([s,n])=>[s,at(n)])),assets:{}}}}catch{}return vt()}function $e(e){return JSON.parse(JSON.stringify(e))}async function qr(e,t){let r=yt(e);await S.mkdir(f.dirname(r),{recursive:true}),await S.writeFile(r,JSON.stringify(t,null,2),"utf8");}async function K(e,t){if(!t.trackManifest)return;let r=async()=>{let s=$e(t.manifest);s.updatedAt=new Date().toISOString(),t.manifest.updatedAt=s.updatedAt,await qr(e,s);};t.manifestSaveChain=t.manifestSaveChain.then(r,r),await t.manifestSaveChain;}function ie(e){if(!e)return null;let t=e.trim();return t||null}function Qr(e,t){let r=new Set,s=new Set([...Object.keys(e),...Object.keys(t)]);for(let n of s){let i=e[n],u=t[n];!i||!u||i===u||r.add(n);}return r}async function Nr(e,t,r,s){let n=[...new Set(r.map(l=>l.trim()).filter(Boolean))],i=String(e.wpsuite?.runtimeToken||"").trim();if(n.length===0||!i)return new Map;let u=new URL("/wp-json/smartcloud-static-publisher/v1/change-tokens",e.sourceOrigin).toString();try{let l=await t.post(u,{timeout:3e4,failOnStatusCode:!1,headers:{"content-type":"application/json","x-static-publisher-token":i},data:JSON.stringify({urls:n})});if(!l.ok())return s.warn(`Change token lookup failed with HTTP ${l.status()}`,{endpoint:u,status:l.status()}),new Map;let a=await l.json().catch(()=>null);if(!a||!Array.isArray(a.items))return new Map;let o=new Map;for(let d of a.items)!d||typeof d.url!="string"||o.set(d.url,d);return o}catch(l){return s.warn("Change token lookup failed; falling back to sitemap metadata",{endpoint:u,error:String(l)}),new Map}}async function Ae(e,t,r,s,n){if(!r.enabled&&!r.trackManifest)return null;if(r.changeTokenCache.has(s))return r.changeTokenCache.get(s)??null;let u=(await Nr(e,t,[s],n)).get(s)??null;return Ee(e,s)&&(!u||u.supported!==true||!u.token)&&(u=await Br(e,t,s,n)),u=_r(e,u),r.changeTokenCache.set(s,u),u}function Wr(e){return `subscriber=${e.wpsuite?.siteSettings?.subscriber===true?"1":"0"}`}function _r(e,t){if(!t?.supported||!t.token)return t;let r=Wr(e);return {...t,token:re(`${t.token}
7
+ ${r}`,40),tokenSource:t.tokenSource?`${t.tokenSource}+site-subscriber`:"site-subscriber"}}async function Br(e,t,r,s){try{let n=await t.get(r,{timeout:Math.min(e.navigationTimeoutMs,15e3),failOnStatusCode:!1});if(n.status()!==404)return s.warn(`Generated 404 fallback token skipped for ${r}`,{url:r,status:n.status(),requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),null;let i=await n.text().catch(()=>""),u=re(`${r}
8
8
  404
9
- ${i}`,40);return s.info(`Using generated 404 fallback change token for ${r}`,{url:r,requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),{url:r,supported:!0,token:u,tokenSource:"generated-404-response-hash",postId:null,dependencyPostIds:[],reason:null}}catch(n){return s.warn(`Generated 404 fallback token lookup failed for ${r}`,{url:r,error:String(n),requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),null}}async function jr(e,t,r,s,n,i){let u=Ie(e,n);if(!s.enabled)return {action:"render",changeToken:s.trackManifest?await Re(e,t,s,n,i):null};let l=s.manifest.pages[n];if(!l)return {action:"render",changeToken:await Re(e,t,s,n,i)};let a=await Re(e,t,s,n,i);if(a?.supported&&a.token)return l.changeToken===a.token?u&&!await Ur(e,t,n,i)?{action:"render",changeToken:a}:{action:"reuse",changeToken:a}:{action:"render",changeToken:a};let o=X(r.sitemapLastmodByPage[n]);return o&&l.sitemapLastmod&&l.sitemapLastmod===o?{action:"reuse",changeToken:a}:{action:"render",changeToken:a}}async function Ur(e,t,r,s){try{let i=(await t.get(r,{timeout:Math.min(e.navigationTimeoutMs,15e3),failOnStatusCode:!1})).status();return i===404?!0:(s.warn(`Generated 404 request path no longer returns 404 for ${r}`,{url:r,status:i,requestPath:e.generated404RequestPath,source:"generated-404-status-probe"}),!1)}catch(n){return s.warn(`Generated 404 status probe failed for ${r}`,{url:r,error:String(n),requestPath:e.generated404RequestPath,source:"generated-404-status-probe"}),false}}async function qr(e,t,r,s,n){let i=rt(r.previousManifest),u=0;for(let[c,g]of Object.entries(r.manifest.pages))if(!r.seenPages.has(c)){tt(n,e,g.outputPath);try{await b.unlink(g.outputPath);}catch(m){(m.code||"")!=="ENOENT"&&s.warn(`Failed to remove stale incremental page output for ${c}`,{url:c,outputPath:g.outputPath,error:String(m)});}delete r.manifest.pages[c],u++;}let l=rt(r.manifest,r.runId),a=new Set,o=new Set;for(let c of l){for(let f of te(e,c))a.add(f);let g=r.manifest.assets[c]?.outputPath;g&&o.add(g);let m=de(e,t.assetMap,c);m&&o.add(m);}for(let c of Object.keys(r.manifest.assets))l.has(c)||delete r.manifest.assets[c];let d=0,p=0;for(let c of i){let g=new Set,m=r.previousManifest.assets[c]?.outputPath;m&&g.add(m);let f=de(e,t.assetMap,c);if(!l.has(c)&&f)g.add(f);else if(!l.has(c)){let w=$e(e,c);g.add(w.originalFilePath),w.hashedFilePath&&g.add(w.hashedFilePath);}for(let w of g)if(!o.has(w)){tt(n,e,w);try{await b.unlink(w),d++;}catch(P){(P.code||"")!=="ENOENT"&&s.warn(`Failed to remove stale incremental asset output for ${c}`,{url:c,outputPath:w,error:String(P)});}}for(let w of te(e,c))a.has(w)||Object.prototype.hasOwnProperty.call(t.assetMap,w)&&(delete t.assetMap[w],p++);}(u>0||d>0||p>0)&&s.info(`Incremental cleanup removed ${u} stale pages, ${d} stale assets, ${p} stale asset mappings`,{removedPages:u,removedAssets:d,removedAssetMappings:p,phase:"incremental-cleanup"});}function rt(e,t){let r=new Set;for(let s of Object.values(e.pages))for(let n of s.discoveredAssets||[]){let i=n.trim();i&&r.add(i);}for(let[s,n]of Object.entries(e.assets||{})){if(t&&n.lastSeenRunId!==t)continue;let i=s.trim();i&&r.add(i);}return r}function st(e,t,r){for(let s of t)for(let n of te(e,s))if(r.has(n))return true;return false}function Qr(e,t,r,s,n){let i=new Set(r.rewriteTargets);for(let l of Object.values(t.manifest.pages))l.rewriteComplete||i.add(h.resolve(l.outputPath));for(let l of Object.values(t.manifest.assets))l.isText&&!l.rewriteComplete&&i.add(h.resolve(l.outputPath));let u=$r(s,n);if(u.size===0)return [...i];for(let l of Object.values(t.manifest.pages))st(e,l.discoveredAssets,u)&&i.add(h.resolve(l.outputPath));for(let[l,a]of Object.entries(t.manifest.assets)){a.isText&&st(e,a.discoveredAssets,u)&&i.add(h.resolve(a.outputPath));for(let o of te(e,l))if(u.has(o)){U(r,e,a.outputPath),a.isText&&i.add(h.resolve(a.outputPath));break}}return [...i]}function Nr(e,t){let r=t?new Set(Array.from(t,n=>h.resolve(n))):null,s=n=>r===null||r.has(h.resolve(n));for(let n of Object.values(e.manifest.pages))s(n.outputPath)&&(n.rewriteComplete=true);for(let n of Object.values(e.manifest.assets)){if(!n.isText){n.rewriteComplete=true;continue}s(n.outputPath)&&(n.rewriteComplete=true);}}function te(e,t){let r=new Set([t]);try{let s=new URL(t),i=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{i.push(new URL(e.targetOrigin).origin);}catch{}for(let u of i)try{r.add(new URL(u).origin+s.pathname+s.search);}catch{}r.add(s.pathname+s.search),r.add(s.pathname);}catch{}return [...r]}function Wr(e,t){let r=new Set([t]);try{let s=new URL(t),i=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{i.push(new URL(e.targetOrigin).origin);}catch{}for(let u of i)try{r.add(new URL(u).origin+s.pathname+s.search);}catch{}r.add(s.pathname+s.search);}catch{}return [...r]}function mt(e,t){let r=e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/"?e.targetOrigin:"https://relative.invalid/";try{let s=new URL(t,r);return h.join(e.outputDir,decodeURIComponent(s.pathname))}catch{return null}}function _r(e,t,r){for(let s of Wr(e,r)){let n=t[s];if(!n)continue;let i=mt(e,n);if(i)return {outputPath:i,publicUrl:n}}return null}function Br(e,t,r){for(let s of te(e,r)){let n=t[s];if(!n)continue;let i=mt(e,n);if(i)return i}return null}function de(e,t,r){let s=Br(e,t,r);return s||$e(e,r).originalFilePath}function Hr(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?h.join(h.resolve(e),"queue-runner-heartbeat.json"):""}async function nt(e){let t=Hr();if(t)try{let r=await b.readFile(t,"utf8"),s=JSON.parse(r);if(!s||typeof s!="object")return;await b.writeFile(t,JSON.stringify({...s,checkedAt:new Date().toISOString(),status:"running",currentStep:"rewrite",message:e},null,2),"utf8");}catch{}}function zr(e,t){let r=new Set;for(let s of t.donePages)r.add(h.resolve(B(e,s)));for(let s of t.doneAssets){let n=de(e,t.assetMap,s);!n||!_(n)||r.add(h.resolve(n));}return [...r]}var pe="re:",le=new Map;function Jr(e){if(!e.startsWith(pe))return null;let t=le.get(e);if(t!==void 0)return t||null;let r=e.slice(pe.length).trim();if(!r)return le.set(e,false),null;try{let s=new RegExp(r);return le.set(e,s),s}catch{return console.warn(`[crawl] Ignoring invalid path matcher regex: ${e}`),le.set(e,false),null}}function Le(e,t){let r=Jr(t);return r?r.test(e):t.startsWith(pe)?false:e.startsWith(t)}function Gr(e,t){return t.find(r=>Le(e,r))}function wt(e,t){let r=Gr(t.pathname,e.blockedPathPrefixes);if(r)return r.startsWith(pe)?`blocked path regex: ${r}`:`blocked path prefix: ${r}`;let s=e.blockedSearchFragments.find(n=>t.search.includes(n));return s?`blocked search fragment: ${s}`:null}function Vr(e){let t=new URL(e.sourceOrigin),r=new Set([t.hostname,...e.allowedAssetHosts]);if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{r.add(new URL(e.targetOrigin).hostname);}catch{}for(let s of Object.keys(e.extraReplacements||{}))try{r.add(new URL(s).hostname);}catch{}return r}function Kr(e,t){return Vr(e).has(t.hostname)}function Yr(e){let t=j(e.trim()).replace(/\\\//g,"/").replace(/^['"]|['"]$/g,"").trim();return t=t.replace(/[)]+$/g,"").trim(),t=t.replace(/;.*$/g,"").trim(),t}function Pt(e){let t=j(e).replace(/\\\//g,"/");return /[{}]|\bwindow\.|\blocation\.|\bincludes\(|\?\?null|\+|%7B|%7D|%22|<|>|\s/.test(t)||/[()[\]'"]/.test(t)}function Zr(e){let t=j(e).replace(/\\\//g,"/").trim(),r=h.extname(t).toLowerCase();return pt.has(r)||gt.has(r)?false:/^(?:this|[A-Za-z_$][\w$]*)\.[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(t)}function V(e){return Rr.some(t=>e.pathname.startsWith(t))}function T(e,t,r=e.sourceOrigin,s,n="url"){let i=Yr(t);if(!i||i.startsWith("data:")||i.startsWith("blob:")||i.startsWith("mailto:")||i.startsWith("tel:")||i.startsWith("#"))return s?.ignore(n,t,"empty or unsupported scheme",r),null;if(Pt(i))return s?.ignore(n,t,"looks like JavaScript/code fragment",r),null;if(Zr(i))return s?.ignore(n,t,"looks like JavaScript property access",r),null;try{let u=new URL(i,r);if(!["http:","https:"].includes(u.protocol))return s?.ignore(n,t,"unsupported protocol: ",r),null;if(!Kr(e,u))return s?.ignore(n,u.toString(),"host not allowed",r),null;let l=wt(e,u);if(l)return s?.reject(n,u.toString(),l,r),null;let a=new URL(e.sourceOrigin);return u.protocol=a.protocol,u.host=a.host,u.hash="",u}catch{return s?.reject(n,t,"invalid URL",r),null}}function bt(e){return pt.has(h.extname(e.pathname).toLowerCase())}function H(e){return V(e)?false:gt.has(h.extname(e.pathname).toLowerCase())}function ne(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function C(e,t){return !!(ne(t)||t.pathname==="/robots.txt"||t.pathname==="/llms.txt"||t.pathname.toLowerCase().endsWith(".xsl")||e.assetPathPrefixes.length>0&&e.assetPathPrefixes.some(r=>Le(t.pathname,r))||bt(t)||!H(t)&&!V(t))}function B(e,t){let r=new URL(t),s=decodeURIComponent(r.pathname);return s.endsWith("/")?s+="index.html":h.extname(s)||(s+="/index.html"),h.join(e.outputDir,s)}function Xr(e){if(!e.generated404RequestPath)return null;try{let t=new URL(e.generated404RequestPath,e.sourceOrigin);return !t.pathname.endsWith("/")&&h.extname(t.pathname)===""&&(t.pathname+="/"),t.hash="",t.toString()}catch{return null}}function Ie(e,t){let r=Xr(e);if(!r)return false;try{return new URL(t,e.sourceOrigin).toString()===r}catch{return false}}function $e(e,t){let r=new URL(t),s=decodeURIComponent(r.pathname);s.endsWith("/")&&(s+="index.html");let n=!!r.search,i=s,u=h.join(e.outputDir,i),l=be(e.targetOrigin,i),a=`${l}${r.search}`;if(!n)return {originalPathname:i,originalFilePath:u,originalPublicUrl:l,originalPublicUrlWithSearch:a,preferQueryHashed:n};let o=h.extname(s),p=`${o?s.slice(0,-o.length):s}.${Y(r.search)}${o||".bin"}`;return {originalPathname:i,originalFilePath:u,originalPublicUrl:l,originalPublicUrlWithSearch:a,preferQueryHashed:n,hashedPathname:p,hashedFilePath:h.join(e.outputDir,p),hashedPublicUrl:be(e.targetOrigin,p)}}function es(e,t,r,s,n){t[r]=s;try{let i=new URL(r),l=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{l.push(new URL(e.targetOrigin).origin);}catch{}for(let a of l)try{let o=new URL(a);t[o.origin+i.pathname+i.search]=s;}catch{}try{let a=(()=>{let o=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin);return `${o.pathname}${o.search}`})();t[i.pathname+i.search]=a;}catch{}try{let a=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=a;}catch{}try{let a=new URL(n,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=a;}catch{}}catch{}}async function St(e){try{return await b.readFile(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function yt(e){try{return await b.stat(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}function ts(e){let t=String(e["content-length"]||"").trim();if(!t)return null;let r=Number.parseInt(t,10);return Number.isFinite(r)&&r>=0?r:null}function vt(e){let t=String(e["last-modified"]||"").trim();if(!t)return null;let r=Date.parse(t);return Number.isFinite(r)?r:null}function rs(e,t){let r=vt(t),s=ts(t),n=e?.mtime.getTime();return r!==null&&Math.abs((n??0)-r)>=1e3||s!==null&&e?.size!==s?false:r!==null||s!==null}async function ss(e,t){if(!t)return;let r=vt(t);if(r===null)return;let s=await yt(e);if(!s)return;let n=new Date(r);await b.utimes(e,s.atime,n).catch(()=>{});}function it(e,t){let r=h.extname(e.pathname).toLowerCase(),s=t["content-type"]||"";return vr.has(r)||yr.some(n=>s.includes(n))&&!s.startsWith("image/")&&!s.includes("font")}function Ce(e,t){(e.doneAssets.size%25===0||e.doneAssets.size===1||e.doneAssets.size===e.stats.assetsQueued)&&t.progress(`Asset download progress: downloaded ${e.doneAssets.size}, discovered ${e.stats.assetsQueued}.`,{doneAssets:e.doneAssets.size,assetsQueued:e.stats.assetsQueued,phase:"download-assets"});}function ns(e){return Y(e.toString("base64"),40)}function is(e,t,r){let s=e.assetVariantDigestsByOriginalPath.get(t);if(!s||s.size===0)return false;for(let n of s)if(n!==r)return true;return false}function os(e,t,r){let s=e.assetVariantDigestsByOriginalPath.get(t);s||(s=new Set,e.assetVariantDigestsByOriginalPath.set(t,s)),s.add(r);}async function Ae(e,t,r,s,n,i,u){let l=$e(e,r),a=ns(s),o=l.originalFilePath,d=l.originalPublicUrlWithSearch;if(l.preferQueryHashed&&l.hashedFilePath&&l.hashedPublicUrl&&is(n,l.originalFilePath,a)){let m=_r(e,t,r);m?(o=m.outputPath,d=m.publicUrl):(o=l.hashedFilePath,d=l.hashedPublicUrl);}es(e,t,r,d,l.originalPublicUrl);let p=_(o)?Buffer.from(ve(s.toString("utf8"),e,t,o),"utf8"):s,c=await St(o),g=false;return (c===null||!c.equals(p))&&(await Pe(o),await b.writeFile(o,p),g=true),os(n,l.originalFilePath,a),await ss(o,u),n.stats.assetsSaved++,i&&(n.stats.assetsSaved%50===0||n.stats.assetsSaved===1)&&i.progress(`Asset progress: saved ${n.stats.assetsSaved}, discovered ${n.stats.assetsQueued}, pending ${n.assetQueue.length}.`,{assetsSaved:n.stats.assetsSaved,assetsQueued:n.stats.assetsQueued,assetQueue:n.assetQueue.length,phase:"download-assets"}),{outputPath:o,publicUrl:d,wroteFile:g}}function re(e,t,r,s,n){let i=()=>{let p=String(n??"").trim();if(!p)return {discoveredFrom:"",discoveredFromType:"unknown"};if(p==="seed-path"||p==="cli"||p==="generated-404-request-path")return {discoveredFrom:p,discoveredFromType:p};if(/^https?:\/\//i.test(p))try{let c=new URL(p);return ne(c)?{discoveredFrom:p,discoveredFromType:"sitemap"}:C(e,c)?{discoveredFrom:p,discoveredFromType:"asset"}:H(c)&&!V(c)?{discoveredFrom:p,discoveredFromType:"page"}:{discoveredFrom:p,discoveredFromType:"url"}}catch{return {discoveredFrom:p,discoveredFromType:"url"}}return {discoveredFrom:p,discoveredFromType:"url"}},u=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,l=T(e,r,u,s,"page");if(!l)return;if(!H(l)||bt(l)){if(C(e,l)){s.info(`Seeded/non-page URL queued as asset: ${l.toString()}`,{url:l.toString(),source:n}),L(e,t,l.toString(),s,n);return}s.reject("page",l.toString(),V(l)?"asset/internal path cannot be page":"not page-like",n);return}let a=l.toString(),{discoveredFrom:o,discoveredFromType:d}=i();o&&!t.pageDiscoverySources.has(a)&&t.pageDiscoverySources.set(a,o),!t.donePages.has(a)&&!t.queuedPages.has(a)&&(t.queuedPages.add(a),t.pageQueue.push(a),t.stats.pagesQueued++,s.debug(`Queued discovered page ${a}`,{phase:"discovery",url:a,discoveredFrom:o,discoveredFromType:d,outputPath:B(e,a)}),(t.stats.pagesQueued%25===0||t.stats.pagesQueued===1)&&s.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,pageQueue:t.pageQueue.length,phase:"discovery"}));}function L(e,t,r,s,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,u=T(e,r,i,s,"asset");if(!u)return;if(!C(e,u)){s.reject("asset",u.toString(),"not a safe asset path/prefix",n);return}let l=u.toString();!t.doneAssets.has(l)&&!t.queuedAssets.has(l)&&(t.queuedAssets.add(l),t.assetQueue.push(l),t.stats.assetsQueued++,(t.stats.assetsQueued%100===0||t.stats.assetsQueued===1)&&s.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,assetQueue:t.assetQueue.length,phase:"discovery"}));}function Oe(e,t,r,s,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,u=T(e,r,i,s,"sitemap");if(!u)return;if(!ne(u)){s.reject("sitemap",u.toString(),"not sitemap-like",n);return}let l=u.toString();!t.doneSitemaps.has(l)&&!t.queuedSitemaps.has(l)&&(t.queuedSitemaps.add(l),t.sitemapQueue.push(l),t.stats.sitemapsQueued++,(t.stats.sitemapsQueued%10===0||t.stats.sitemapsQueued===1)&&s.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,sitemapQueue:t.sitemapQueue.length,phase:"discovery"}));}function as(e){let t=j(e),r=[...t.matchAll(/<url>\s*([\s\S]*?)\s*<\/url>/gi)].map(s=>s[1]);return r.length>0?r.map(s=>{let n=s.match(/<loc>\s*([^<]+?)\s*<\/loc>/i);if(!n?.[1])return null;let i=s.match(/<lastmod>\s*([^<]+?)\s*<\/lastmod>/i);return {loc:n[1].trim(),lastmod:X(i?.[1]??null)}}).filter(s=>!!s):[...t.matchAll(/<loc>\s*([^<]+?)\s*<\/loc>/gi)].map(s=>({loc:s[1].trim(),lastmod:null})).filter(s=>s.loc)}function us(e){return e.split(",").map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function ls(e){let t=[],r=/url\(\s*(?:"([^"]+)"|'([^']+)'|([^)]*?))\s*\)/gi;for(let s of e.matchAll(r)){let n=e.slice(Math.max(0,s.index-8),s.index);if(/\bnew\s+$/i.test(n))continue;let i=(s[1]||s[2]||s[3]||"").trim();i&&t.push(i);}return t}function cs(e){return e.replace(/<script\b[^>]*>[\s\S]*?<\/script\s*>/gi,"")}function ds(e,t){if(t==="dom-style")return true;let r=(()=>{try{return h.extname(new URL(e).pathname).toLowerCase()}catch{return ""}})();return !(r===".js"||r===".mjs"||r===".map"||t.includes("javascript"))}function ke(e){return e.trim().replace(/\\/g,"/").replace(/^https?:\/\/[^/]+/i,"").replace(/^\/+/,"")}async function Rt(e,t,r,s){let n=[];await b.mkdir(t,{recursive:true});let i=await b.readdir(e,{withFileTypes:true});for(let u of i){let l=h.join(e,u.name),a=h.join(t,u.name);if(u.isDirectory()){n.push(...await Rt(l,a,r,s));continue}await Ct(l,a,r,s)&&n.push(a);}return n}async function ps(e,t){try{let[r,s]=await Promise.all([b.stat(e),b.stat(t)]);if(r.size!==s.size)return !1;let[n,i]=await Promise.all([b.readFile(e),b.readFile(t)]);return n.equals(i)}catch{return false}}async function Ct(e,t,r,s){let n=h.resolve(t);return r.has(n)?(s.debug("Skipped post-crawl copy over crawled page output",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):await ps(e,t)?(s.debug("Skipped unchanged post-crawl copy target",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):(await b.mkdir(h.dirname(t),{recursive:true}),await b.copyFile(e,t),true)}async function gs(e,t,r){let s=Object.entries(e.postCrawlCopyMap||{}).map(([l,a])=>({sourcePath:l.trim(),prefix:String(a||"").trim()}));if(s.length===0)return [];let n=0,i=[],u=new Set([...t.donePages].map(l=>h.resolve(B(e,l))));r.mark("copy-extra-paths");for(let l of s){let a=l.sourcePath,o=l.prefix;if(!a||!o){r.warn("Skipped post-crawl copy mapping with empty key/value",{sourcePath:a,prefixPath:o});continue}let d=Tr(a);if(!d.resolvedPath){r.warn("Skipped post-crawl copy source because alias root is not configured",{sourcePath:a,alias:d.alias||"",requiredEnv:d.requiredEnv||"",prefixPath:o});continue}let p=d.resolvedPath,c=ke(o);if(!c){r.warn("Skipped post-crawl copy mapping with invalid export prefix",{sourcePath:a,prefixPath:o});continue}let g;try{g=await b.stat(p);}catch{r.warn("Skipped post-crawl copy source because it does not exist",{sourcePath:a,sourceAbs:p,prefixPath:o});continue}let m=h.resolve(e.outputDir,c);if(g.isDirectory()){let S=await Rt(p,m,u,r);i.push(...S),n+=S.length,S.length>0&&r.progress(`Copied static directory to export: ${p} -> /${c}`,{phase:"copy-extra-paths",sourcePath:p,targetPath:`/${c}`,copiedItems:n,changedFiles:S.length});continue}let f=h.basename(p),w=o.endsWith("/")?h.join(m,f):m;await Ct(p,w,u,r)&&(i.push(w),n++,r.progress(`Copied static file to export: ${p} -> /${ke(o.endsWith("/")?`${o}${f}`:o)}`,{phase:"copy-extra-paths",sourcePath:p,targetPath:`/${ke(o.endsWith("/")?`${o}${f}`:o)}`,copiedItems:n}));}return r.endMark("copy-extra-paths",{mappedSources:s.length,copiedItems:n}),i}function se(e,t,r,s,n){let i=new Set,u=j(r).replace(/\\\//g,"/"),l=n==="page-html"?cs(u):u,a=ds(t,n);if(a){for(let p of ls(l)){let c=T(e,p,t,s,`${n}:css-url`);c&&C(e,c)&&i.add(c.toString());}for(let p of l.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;]+)['"]?\s*\)?/gi)){let c=T(e,p[1],t,s,`${n}:css-import`);c&&C(e,c)&&i.add(c.toString());}}if(a||n==="page-html")for(let p of l.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi)){let c=T(e,p[1],t,s,`${n}:xml-stylesheet`);c&&C(e,c)&&i.add(c.toString());}let o="(?:css|js|mjs|json|map|xml|xsl|rss|atom|txt|enc|jws|png|jpe?g|gif|webp|avif|svg|ico|woff2?|ttf|otf|eot|pdf|mp4|webm)",d=new RegExp(`(?:https?:)?//[^\\s'"<>\\);]+\\.${o}(?:\\?[^\\s'"<>\\);]*)?|(?<!\\.)/[^\\s'"<>\\);]+\\.${o}(?:\\?[^\\s'"<>\\);]*)?`,"gi");for(let p of u.matchAll(d)){let c=p[0].startsWith("//")?`${new URL(e.sourceOrigin).protocol}${p[0]}`:p[0];if(Pt(c)){s.ignore(`${n}:serialized-url`,c,"looks like JavaScript/code fragment",t);continue}let g=T(e,c,t,s,`${n}:serialized-url`);g&&C(e,g)?i.add(g.toString()):g&&s.ignore("asset",g.toString(),"serialized URL did not pass safe asset path filter",t);}return [...i]}function hs(e,t,r,s){let n=new Set,i=j(r);for(let u of i.matchAll(/href=["']([^"'#\s][^"']*?)["']/gi)){let l=u[1],a=T(e,l,t,s,"page-link");a&&(wt(e,a)||H(a)&&!V(a)&&!C(e,a)&&n.add(a.toString()));}return [...n]}async function ot(e,t,r,s,n){for(;r.sitemapQueue.length>0;){let i=r.sitemapQueue.shift();if(r.queuedSitemaps.delete(i),!r.doneSitemaps.has(i)){r.doneSitemaps.add(i),s.sitemap(`Fetching sitemap ${i}`,{url:i});try{let u=await t.get(i,{timeout:6e4});if(!u.ok()){s.skip("sitemap",i,u.status());continue}let l=await u.body(),a=u.url()||i,o=await Ae(e,r.assetMap,a,l,r,s);U(n,e,o.outputPath),ee(n,o.outputPath);let d=l.toString("utf8");for(let p of se(e,a,d,s,"sitemap"))L(e,r,p,s,a);for(let p of as(d)){let c=T(e,p.loc,a,s,"sitemap-loc");c&&(ne(c)?Oe(e,r,c.toString(),s,a):C(e,c)?L(e,r,c.toString(),s,a):H(c)?(p.lastmod&&(r.sitemapLastmodByPage[c.toString()]=p.lastmod),re(e,r,c.toString(),s,a)):s.reject("sitemap-loc",c.toString(),"not page/sitemap/asset-like",a));}}catch(u){s.error(`Failed sitemap ${i}`,{url:i,error:String(u)});}}}}async function fs(e,t,r,s,n,i,u){let l=T(e,s,e.sourceOrigin,n,"asset-fetch");if(!l||!C(e,l))return;let a=l.toString();if(r.doneAssets.has(a))return;let o=i.enabled?i.previousManifest.assets[a]:void 0,d=(p,c={})=>{if(!o)return false;i.manifest.assets[a]={...o,discoveredAssets:[...o.discoveredAssets||[]],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId},delete i.manifest.pages[a],r.doneAssets.add(a);for(let g of o.discoveredAssets||[])L(e,r,g,n,a);return n.warn(`Keeping previous incremental asset ${a} after fetch issue.`,{url:a,reason:p,preservedFromPreviousManifest:true,...c,phase:"download-assets"}),Ce(r,n),true};n.asset(`Fetching asset ${a}`,{url:a});try{let p=de(e,r.assetMap,a),c=p?await yt(p):null;if(p&&c)try{let k=await t.head(a,{timeout:6e4}),A=k.headers();if(k.ok()&&rs(c,A)){let E=await St(p);if(E!==null){let W=k.url()||a,M=await Ae(e,r.assetMap,W,E,r,n,A);M.wroteFile&&(U(u,e,M.outputPath),_(M.outputPath)&&ee(u,M.outputPath)),r.doneAssets.add(a),n.info(`Reused existing asset ${a} based on response headers.`,{url:a,filePath:p,lastModified:A["last-modified"]||"",contentLength:A["content-length"]||"",phase:"download-assets"}),Ce(r,n);let y=it(l,A),R=o?.discoveredAssets?[...o.discoveredAssets]:[];if(y||o?.isText){let q=E.toString("utf8"),K=se(e,W,q,n,"asset:cached");(K.length>0||!o)&&(R=K);for(let Tt of R)L(e,r,Tt,n,W);}if(i.trackManifest){let q=y||!!o?.isText;i.manifest.assets[a]={url:a,outputPath:M.outputPath,isText:q,contentType:xe(A)||o?.contentType||null,discoveredAssets:R,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!q},delete i.manifest.pages[a],i.enabled&&q&&await G(e,i);}return}}}catch{}let g=await t.get(a,{timeout:6e4});if(!g.ok()){if(d(`http-${g.status()}`,{status:g.status()}))return;n.skip("asset",a,g.status());return}let m=await g.body(),f=g.url()||a,w=g.headers(),P=await Ae(e,r.assetMap,f,m,r,n,w);P.wroteFile&&(U(u,e,P.outputPath),_(P.outputPath)&&ee(u,P.outputPath)),r.doneAssets.add(a),Ce(r,n);let S=it(l,w),v=[];if(S){let k=m.toString("utf8");v=se(e,f,k,n,`asset:${h.extname(l.pathname).toLowerCase()||w["content-type"]||"unknown"}`);for(let A of v)L(e,r,A,n,f);}i.trackManifest&&(i.manifest.assets[a]={url:a,outputPath:P.outputPath,isText:S,contentType:xe(w),discoveredAssets:v,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!S},delete i.manifest.pages[a],i.enabled&&S&&await G(e,i));}catch(p){if(d("fetch-error",{error:String(p)}))return;n.error(`Failed asset ${a}`,{url:a,error:String(p)});}}async function ms(e,t,r,s,n,i){let u=Math.max(1,Number(e.assetDownloadConcurrency||e.concurrency||1)),l=Array.from({length:u},async()=>{for(;r.assetQueue.length>0;){let a=r.assetQueue.shift();a&&(r.queuedAssets.delete(a),await fs(e,t,r,a,s,n,i));}});await Promise.all(l);}function ws(e){let t=Math.ceil(e/1e3);return `${t} second${t===1?"":"s"}`}function D(e){return Math.max(6e4,e.navigationTimeoutMs*2,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+15e3)}function ce(e){return Math.max(15e3,Math.min(6e4,D(e)))}function Ps(e){return Math.max(15e3,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+1e4)}function De(e){return e.stats.pagesCompleted}function kt(e){let r=e.options?.browserProcess;return {pid:typeof r?.process?.pid=="number"?r.process.pid:null,kill:typeof r?.kill=="function"?r.kill.bind(r):null}}async function bs(e,t,r){let s=kt(e);try{if(s.kill){await s.kill(),t.warn(`Force-killed crawl worker browser after ${r}`,{browserPid:s.pid,reason:r});return}if(s.pid!==null){process.kill(s.pid,"SIGKILL"),t.warn(`Sent SIGKILL to crawl worker browser after ${r}`,{browserPid:s.pid,reason:r});return}t.warn(`Could not resolve crawl worker browser PID after ${r}`,{reason:r});}catch(n){t.error(`Failed to force-kill crawl worker browser after ${r}`,{browserPid:s.pid,reason:r,error:String(n)});}}async function x(e,t,r){let s;try{return await Promise.race([r(),new Promise((n,i)=>{s=globalThis.setTimeout(()=>{i(new Error(`${e} timed out after ${ws(t)}.`));},t);})])}finally{s!==void 0&&globalThis.clearTimeout(s);}}async function Ss(e,t){let r=Ps(e);await t.evaluate(async s=>{await new Promise(n=>{let i=0,u=700,l=Date.now(),a=()=>{window.clearInterval(o),window.scrollTo(0,0),n();},o=window.setInterval(()=>{if(Date.now()-l>=s.maxDurationMs){a();return}window.scrollBy(0,u),i+=u;let d=document.body?.scrollHeight||0,p=document.documentElement?.scrollHeight||0,c=Math.max(d,p);i>=c+window.innerHeight&&a();},120);});},{maxDurationMs:r});}async function ys(e,t){await t.waitForLoadState("domcontentloaded",{timeout:e.readiness.timeoutMs}).catch(()=>{}),e.readiness.waitForSelector&&await t.waitForSelector(e.readiness.waitForSelector,{timeout:e.readiness.timeoutMs}).catch(()=>{}),e.readiness.waitForFunction&&await t.waitForFunction(e.readiness.waitForFunction,void 0,{timeout:e.readiness.timeoutMs}).catch(()=>{}),await Ss(e,t),await t.waitForTimeout(e.readiness.fallbackWaitMs);}async function vs(e,t){await t.waitForLoadState("domcontentloaded",{timeout:e.readiness.timeoutMs}).catch(()=>{}),await t.waitForLoadState("load",{timeout:e.readiness.timeoutMs}).catch(()=>{}),e.readiness.waitForSelector&&await t.waitForSelector(e.readiness.waitForSelector,{timeout:e.readiness.timeoutMs}).catch(()=>{}),await t.waitForTimeout(e.readiness.fallbackWaitMs);}function Rs(e,t){return e.noJavaScriptRenderPathPrefixes.some(r=>Le(t,r))}async function Cs(e,t,r,s,n=true){let i=new Set;if(n){let l=await t.evaluate(()=>{let a=new Set,o=["href","src","poster","data-src","data-lazy-src","data-original","data-bg","data-background","data-href"],d=new Set,p=["srcset","data-srcset","data-lazy-srcset"];return document.querySelectorAll("*").forEach(c=>{for(let m of o){let f=c.getAttribute(m);f&&a.add(f);}for(let m of p){let f=c.getAttribute(m);f&&f.split(",").forEach(w=>{let P=w.trim().split(/\s+/)[0];P&&a.add(P);});}let g=c.getAttribute("style");g&&d.add(g);}),{attrs:[...a],styles:[...d]}});for(let a of l.attrs)for(let o of us(a)){let d=T(e,o,r,s,"dom-attr");d&&C(e,d)&&i.add(d.toString());}for(let a of l.styles)for(let o of se(e,r,a,s,"dom-style"))i.add(o);}let u=await t.content();for(let l of se(e,r,u,s,"page-html"))i.add(l);return [...i]}async function at(e,t,r,s,n){let i=B(e,t);await x(`save page ${t}`,D(e),async()=>{await Pe(i),await b.writeFile(i,r,"utf8");}),s.stats.pagesSaved++;let u=Math.min(s.stats.pagesQueued,De(s)+1);n&&(s.stats.pagesSaved%10===0||s.stats.pagesSaved===1)&&n.progress(`Page progress: processed ${u}, rendered ${s.stats.pagesRendered}, saved ${s.stats.pagesSaved}, discovered ${s.stats.pagesQueued}.`,{donePages:u,claimedPages:s.donePages.size,pagesRendered:s.stats.pagesRendered,pagesSaved:s.stats.pagesSaved,pagesQueued:s.stats.pagesQueued,pageQueue:s.pageQueue.length,phase:"save-pages"});}function ks(e){let t=De(e);return t%5===0||t===1||t===e.stats.pagesQueued}function xs(e,t){let r=De(e);t.progress(`Render progress: processed ${r}, rendered ${e.stats.pagesRendered}, saved ${e.stats.pagesSaved}, discovered ${e.stats.pagesQueued}.`,{donePages:r,claimedPages:e.donePages.size,pagesRendered:e.stats.pagesRendered,pagesSaved:e.stats.pagesSaved,pagesQueued:e.stats.pagesQueued,phase:"render-pages"});}async function Ts(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 s=new URL(String(r),window.location.href),n=new URL(window.location.href);return s.hash="",n.hash="",s.href===n.href}catch{return false}};try{let r=window.location.assign.bind(window.location),s=window.location.replace.bind(window.location),n=window.location.reload.bind(window.location);Object.defineProperty(window.location,"assign",{configurable:!0,value:i=>{if(t(i)){console.warn("[smartcloud-static-publisher] blocked same-page location.assign",i??"");return}return r(i)}}),Object.defineProperty(window.location,"replace",{configurable:!0,value:i=>{if(t(i)){console.warn("[smartcloud-static-publisher] blocked same-page location.replace",i??"");return}return s(i)}}),Object.defineProperty(window.location,"reload",{configurable:!0,value:()=>{console.warn("[smartcloud-static-publisher] blocked location.reload");}});}catch{}});}async function As(e,t,r){let s=await e.newContext({viewport:t.viewport,userAgent:"WPSuiteStaticPublisher/0.8 Playwright SitemapOnly",ignoreHTTPSErrors:t.ignoreHttpsErrors,...r?{javaScriptEnabled:false}:{}});return r||await Ts(s),s}async function Ms(e,t,r,s,n,i,u){let l=await chromium.launch({headless:true}),a=kt(l);a.pid!==null&&r.debug(`Launched crawl worker browser PID ${a.pid}`,{browserPid:a.pid});try{for(;t.pageQueue.length>0&&!(e.maxPages>0&&t.donePages.size>=e.maxPages);){let o=t.pageQueue.shift();if(!o)break;if(t.queuedPages.delete(o),t.donePages.has(o))continue;t.donePages.add(o),i.enabled&&i.seenPages.add(o);let d=null,p=null;try{let c=new URL(o),g=Ie(e,o),m=Rs(e,c.pathname);if(!H(c)||C(e,c)||V(c)){if(C(e,c)){r.info(`Worker redirected non-page URL to asset queue: ${o}`,{url:o,source:"worker-guard"}),L(e,t,o,r,"worker-guard");continue}r.reject("page",o,"guard rejected non-page URL before rendering","worker");continue}let f=await jr(e,n,t,i,o,r);if(i.enabled&&s!=="single-url"){let y=i.manifest.pages[o];if(f.action==="reuse"&&y){for(let R of y.discoveredAssets)L(e,t,R,r,o);for(let R of y.discoveredPages)re(e,t,R,r,o);y.lastSeenRunId=i.runId,y.sitemapLastmod=X(t.sitemapLastmodByPage[o])??y.sitemapLastmod,f.changeToken?.supported&&(y.changeToken=f.changeToken.token,y.tokenSource=f.changeToken.tokenSource??y.tokenSource),r.info(`Incremental reuse skipped unchanged page ${o}`,{url:o,mode:"incremental",reason:f.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"});continue}}d=await x(`create page context ${o}`,D(e),()=>As(l,e,m)),p=await x(`create page ${o}`,D(e),()=>d.newPage());let w=!1,P=new Set;await p.route("**/*",async y=>{let R=y.request();if(R.isNavigationRequest()&&R.frame()===p.mainFrame())try{let q=new URL(R.url()),K=new URL(o);if(q.hash="",K.hash="",q.href===K.href){if(w){r.warn(`Blocked same-page navigation/reload for ${o}`,{url:o,requestUrl:R.url()}),await y.abort("aborted");return}w=!0;}}catch{}await y.continue();}),p.on("response",y=>{try{let R=T(e,y.url(),e.sourceOrigin,void 0,"network-response");R&&C(e,R)&&(P.add(R.toString()),L(e,t,R.toString(),r,o));}catch{}}),r.page(`Rendering ${o}`,{url:o});let S=null,v=null;try{if(S=await p.goto(o,{waitUntil:"domcontentloaded",timeout:e.navigationTimeoutMs}),S&&S.ok())try{v=await x(`read response body ${o}`,D(e),()=>S.text());}catch{v=null;}}catch(y){r.warn(`Navigation issue for ${o}; saving current DOM if available`,{url:o,error:String(y)});}if(g){let y=S?.status()??null;if(y!==404){r.error(`Generated 404 request path returned unexpected status for ${o}`,{url:o,expectedStatus:404,status:y,requestPath:e.generated404RequestPath});continue}r.info(`Capturing rendered 404 page for ${o}`,{url:o,status:y,outputPath:B(e,o)});}else if(S&&!S.ok()){r.skip("page",o,S.status(),t.pageDiscoverySources.get(o)),await p.close();continue}m?(r.info(`Rendering without JS execution for ${o}`,{url:o,mode:"no-js"}),await x(`wait for rendered page ${o}`,D(e),()=>vs(e,p))):await x(`wait for rendered page ${o}`,D(e),()=>ys(e,p)),t.stats.pagesRendered++;let k=await x(`extract rendered assets ${o}`,D(e),()=>Cs(e,p,o,r,!m));for(let y of k)L(e,t,y,r,o);let A=[...new Set([...k,...P])],E=v??await x(`capture rendered html ${o}`,D(e),()=>p.content()),W=s!=="single-url"&&!g?hs(e,o,E,r):[];if(s!=="single-url"&&!g)for(let y of W)re(e,t,y,r,o);await at(e,o,E,t,r);let M=B(e,o);if(U(u,e,M),ee(u,M),i.trackManifest){let y=S?.headers();i.manifest.pages[o]={url:o,outputPath:M,contentType:xe(y),changeToken:f.changeToken?.supported?f.changeToken.token:null,tokenSource:f.changeToken?.supported?f.changeToken.tokenSource??null:null,sitemapLastmod:X(t.sitemapLastmodByPage[o])??null,discoveredPages:W,discoveredAssets:A,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},i.enabled&&await G(e,i);}}catch(c){try{let g=p?await x(`capture partial html ${o}`,D(e),()=>p.content()):"";if(g&&g.trim()){await at(e,o,g,t,r);let m=B(e,o);if(U(u,e,m),ee(u,m),i.trackManifest){let f=i.manifest.pages[o]??i.previousManifest.pages[o];i.manifest.pages[o]={url:o,outputPath:m,contentType:f?.contentType??null,changeToken:null,tokenSource:null,sitemapLastmod:X(t.sitemapLastmodByPage[o])??f?.sitemapLastmod??null,discoveredPages:f?.discoveredPages?[...f.discoveredPages]:[],discoveredAssets:f?.discoveredAssets?[...f.discoveredAssets]:[],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},i.enabled&&await G(e,i);}r.warn(`Saved partial DOM for ${o}`,{url:o,error:String(c)});}}catch(g){r.error(`Could not save partial DOM for ${o}`,{url:o,error:String(g)});}r.error(`Failed page ${o}`,{url:o,error:String(c)});}finally{t.stats.pagesCompleted++,ks(t)&&xs(t,r),p&&await x(`close page ${o}`,ce(e),()=>p.close()).catch(c=>{r.warn(`Timed out while closing page ${o}`,{url:o,browserPid:a.pid,error:String(c)});}),d&&await x(`close page context ${o}`,ce(e),()=>d.close()).catch(c=>{r.warn(`Timed out while closing page context for ${o}`,{url:o,browserPid:a.pid,error:String(c)});});}}}finally{await x("close worker browser",ce(e),()=>l.close()).catch(o=>(r.warn("Timed out while closing crawl worker browser",{browserPid:a.pid,error:String(o)}),bs(l,r,"browser.close timeout")));}}async function Ls(e){try{let t=await b.readFile(e),s=(e.endsWith(".gz")?gunzipSync(t):t).toString("utf8").trim();if(!s)return [];try{let n=JSON.parse(s);if(Array.isArray(n))return n;if(n&&typeof n=="object")return [n]}catch{return s.split(/\r?\n/).map(n=>n.trim()).filter(Boolean).map(n=>{try{let i=JSON.parse(n);return i&&typeof i=="object"?i:null}catch{return null}}).filter(n=>n!==null)}return []}catch{return []}}function ut(e){let t=String(e||"").toLowerCase();return t.includes("timeout")||t.includes("timed out")||t.includes("navigation timeout")}function Is(e){let t=String(e?.job?.command||"").trim(),r=String(e?.job?.crawlMode||"full").trim();return t!=="publish"&&t!=="crawl"?false:r!=="incremental"}function $s(e){let t=[e?.archivedAt,e?.job?.endedAt,e?.job?.startedAt];for(let r of t){let s=Date.parse(String(r||""));if(Number.isFinite(s))return s}return 0}async function xt(e){try{let t=await b.readFile(e,"utf8"),r=JSON.parse(t);return r&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}function lt(e){let t=String(e.originalFileName||"").toLowerCase();return t.endsWith("errors.jsonl")?0:t.endsWith("errors.json")?1:2}function Os(e,t){let r=Array.isArray(t?.artifacts)?t.artifacts.filter(s=>String(s?.role||"").trim()==="errors"&&String(s?.storedFileName||"").trim()!=="").sort((s,n)=>lt(s)-lt(n)).map(s=>h.join(e,String(s.storedFileName))):[];return [...new Set([...r,h.join(e,"errors.jsonl"),h.join(e,"errors.json"),h.join(e,"errors.jsonl.gz"),h.join(e,"errors.json.gz")])]}async function ct(e){let t=await xt(h.join(e,"job.json"));for(let r of Os(e,t)){let s=await Ls(r);if(s.length>0)return s}return []}async function Ds(e){let t=h.join(e.logDir,"archive"),r;try{r=await b.readdir(t);}catch{return ""}let s="",n=0;for(let i of r){let u=h.join(t,i);if(!(await b.stat(u).catch(()=>null))?.isDirectory())continue;let a=await xt(h.join(u,"job.json"));if(!Is(a))continue;let o=$s(a);o>=n&&(n=o,s=u);}return s}async function Es(e){let t=await Ds(e),r=t!==""?await ct(t):await ct(e.logDir),s=new Set;for(let n of r)if(ut(n.error)||ut(n.message)){let i=n.url;typeof i=="string"&&i&&s.add(i);}return [...s]}async function Fs(e){let t=[];for(let r of e)if(r.startsWith("@")){let s=r.slice(1),n=await b.readFile(s,"utf8");t.push(...n.split(/\r?\n/).map(i=>i.trim()).filter(i=>i&&!i.startsWith("#")));}else t.push(r);return t}async function js(e){try{let t=await b.readFile(h.join(e.outputDir,"asset-map.json"),"utf8");return JSON.parse(t)}catch{return {}}}async function Us(e){let t=["crawl.log.jsonl","current-crawl-event.json","rejected.jsonl","ignored.jsonl","skipped-http.jsonl","errors.jsonl","timings.jsonl","rejected.json","ignored.json","skipped-http.json","errors.json","timings.json"];await b.mkdir(e,{recursive:true}),await Promise.all(t.map(async r=>{try{await b.unlink(h.join(e,r));}catch(s){if(s.code!=="ENOENT")throw s}}));}function dt(e,t,r,s,n){let i=T(e,r,e.sourceOrigin,s,"manual-url");i&&(ne(i)?Oe(e,t,i.toString(),s,n):C(e,i)?L(e,t,i.toString(),s,n):H(i)?re(e,t,i.toString(),s,n):s.reject("manual-url",i.toString(),"not page/sitemap/asset-like",n));}async function qs(){let e=await we(),t=Cr(process.argv.slice(2));if(t.resumeRewrite&&t.mode!=="full")throw new Error("--resume-rewrite is only supported for full crawl/publish jobs.");let r=[];t.mode==="retry-timeouts"&&(r=await Es(e)),t.mode==="single-url"&&(r=await Fs(t.urls));let s=t.crawlMode==="incremental"&&t.mode==="full",n=s&&typeof e.subscriptionType=="string"&&e.subscriptionType.trim()!=="",i=(t.mode==="full"||t.mode==="single-url")&&!t.resumeRewrite,u=t.mode!=="full"||t.resumeRewrite||n,l=u?await js(e):{},a=n||t.mode==="single-url"?await Lr(e):ft(),o={enabled:n,trackManifest:i,manifest:Te(a),previousManifest:Te(a),runId:`${Date.now()}`,seenPages:new Set,changeTokenCache:new Map,manifestSaveChain:Promise.resolve()};await Us(e.logDir);let d={pageQueue:[],queuedPages:new Set,donePages:new Set,pageDiscoverySources:new Map,assetQueue:[],queuedAssets:new Set,doneAssets:new Set,sitemapQueue:[],queuedSitemaps:new Set,doneSitemaps:new Set,sitemapLastmodByPage:{},assetMap:{...l},assetVariantDigestsByOriginalPath:new Map,stats:{pagesQueued:0,pagesRendered:0,pagesCompleted:0,assetsQueued:0,sitemapsQueued:0,assetsSaved:0,pagesSaved:0}},p=Mr();u||await b.rm(e.outputDir,{recursive:true,force:true}),await b.mkdir(e.outputDir,{recursive:true});let c=new Z(e.logDir,e.logLevel);if(s&&!n&&c.warn("Incremental crawl requested without active remote publisher subscription. Falling back to full crawl.",{requestedMode:t.crawlMode,subscriptionType:e.subscriptionType??null}),t.resumeRewrite)c.info("Resuming final rewrite from existing output.",{phase:"rewrite-text",mode:t.mode,crawlMode:t.crawlMode});else {let P=await request.newContext({ignoreHTTPSErrors:e.ignoreHttpsErrors});try{if(c.mark("discovery"),t.mode==="full"?(e.sitemapPaths.forEach(v=>Oe(e,d,v,c)),await ot(e,P,d,c,p),e.seedPaths.forEach(v=>dt(e,d,v,c,"seed-path")),e.generated404RequestPath&&re(e,d,e.generated404RequestPath,c,"generated-404-request-path")):(r.forEach(v=>dt(e,d,v,c,"cli")),await ot(e,P,d,c,p)),c.endMark("discovery",{pages:d.pageQueue.length,assets:d.assetQueue.length,sitemaps:d.sitemapQueue.length}),c.summary(`Queued ${d.pageQueue.length} pages, ${d.assetQueue.length} assets, ${d.sitemapQueue.length} sitemaps.`,{mode:t.mode,crawlMode:t.crawlMode,queuedPages:d.pageQueue.length,queuedAssets:d.assetQueue.length,queuedSitemaps:d.sitemapQueue.length}),t.mode==="retry-timeouts"&&d.pageQueue.length===0&&d.assetQueue.length===0&&d.sitemapQueue.length===0){c.summary("No timed-out URLs were queued. Skipping retry crawl.",{mode:t.mode,crawlMode:t.crawlMode,queuedPages:0,queuedAssets:0,queuedSitemaps:0}),await c.flush();return}c.mark("render-pages");let S=Array.from({length:Math.max(1,e.concurrency)},()=>Ms(e,d,c,t.mode,P,o,p));if(await Promise.all(S),c.endMark("render-pages",{pages:d.stats.pagesCompleted}),c.mark("download-assets"),c.progress("Asset download phase started.",{phase:"download-assets",doneAssets:d.doneAssets.size,assetsQueued:d.stats.assetsQueued,assetQueue:d.assetQueue.length}),await ms(e,P,d,c,o,p),c.endMark("download-assets",{assets:d.doneAssets.size}),o.enabled&&e.maxPages===0&&await qr(e,d,o,c,p),t.mode==="full"){let v=await gs(e,d,c);for(let k of v)U(p,e,k);}}finally{await x("dispose crawl request context",ce(e),()=>P.dispose()).catch(S=>{c.warn("Timed out while disposing crawl request context",{error:String(S)});});}}o.trackManifest&&await G(e,o),await b.writeFile(h.join(e.outputDir,"asset-map.json"),JSON.stringify(d.assetMap,null,2),"utf8"),JSON.stringify(l,null,2)!==JSON.stringify(d.assetMap,null,2)&&U(p,e,h.join(e.outputDir,"asset-map.json"));let g=t.mode==="single-url"?zr(e,d):o.enabled&&!t.resumeRewrite?Qr(e,o,p,l,d.assetMap):void 0;c.mark("rewrite-text");let m=t.mode==="single-url"?`Rewriting text files touched by URL crawl: 0/${g?.length??0}`:"Rewriting text files...";c.progress(m,{phase:"rewrite-text",index:0,totalFiles:g?.length,changedTextFiles:0}),await nt(m);let f=Date.now(),w=await Ke(e,d.assetMap,{files:g,previousAssetMap:l,onProgress:async({index:P,totalFiles:S,changedTextFiles:v,file:k,changed:A})=>{A&&U(p,e,h.join(e.outputDir,k)),c.checkpoint(`Rewriting text file ${P}/${S}`,{phase:"rewrite-text",index:P,totalFiles:S,changedTextFiles:v,file:k});let E=Date.now();if(!(P===1||P===S||E-f>=5e3))return;f=E;let M=`Rewriting text files: ${P}/${S}`;c.progress(M,{phase:"rewrite-text",index:P,totalFiles:S,changedTextFiles:v,file:k}),await nt(M);}});o.trackManifest&&(Nr(o,g),await G(e,o)),c.endMark("rewrite-text",{changedTextFiles:w}),await je(e,{generatedAt:new Date().toISOString(),outputDir:h.resolve(e.outputDir),runMode:t.mode,crawlMode:t.crawlMode,fullSyncRequired:!(o.enabled&&!t.resumeRewrite),changedFiles:o.enabled&&!t.resumeRewrite?[...p.changedFiles].sort():[],deletedFiles:o.enabled&&!t.resumeRewrite?[...p.deletedFiles].sort():[],rewriteTargets:o.enabled&&!t.resumeRewrite?[...new Set((g||[]).map(P=>ie(e.outputDir,h.isAbsolute(P)?P:h.join(e.outputDir,P))).filter(P=>P!==null))].sort():[]}),c.summary(t.resumeRewrite?`Done. Resumed final rewrite over existing output and changed ${w} text files.`:`Done. Rendered ${d.stats.pagesRendered} pages, processed ${d.doneSitemaps.size} sitemaps, downloaded ${d.doneAssets.size} assets.`,{mode:t.mode,crawlMode:t.crawlMode,resumeRewrite:t.resumeRewrite,...d.stats,pagesRendered:d.stats.pagesRendered,donePages:d.stats.pagesCompleted,claimedPages:d.donePages.size,doneSitemaps:d.doneSitemaps.size,doneAssets:d.doneAssets.size,changedTextFiles:w}),await c.flush();}qs().catch(async e=>{console.error(e);try{let r=(await we().catch(()=>null))?.logDir??"logs",s=new Z(r,"debug");s.error(`Unhandled error: ${e instanceof Error?e.message:String(e)}`,e instanceof Error?{stack:e.stack}:void 0),await s.flush();}catch{}process.exit(1);});
9
+ ${i}`,40);return s.info(`Using generated 404 fallback change token for ${r}`,{url:r,requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),{url:r,supported:!0,token:u,tokenSource:"generated-404-response-hash",postId:null,dependencyPostIds:[],reason:null}}catch(n){return s.warn(`Generated 404 fallback token lookup failed for ${r}`,{url:r,error:String(n),requestPath:e.generated404RequestPath,source:"generated-404-change-token-fallback"}),null}}async function Hr(e,t,r,s,n,i){let u=Ee(e,n);if(!s.enabled)return {action:"render",changeToken:s.trackManifest?await Ae(e,t,s,n,i):null};let l=s.manifest.pages[n];if(!l)return {action:"render",changeToken:await Ae(e,t,s,n,i)};let a=await Ae(e,t,s,n,i);if(a?.supported&&a.token)return l.changeToken===a.token?u&&!await zr(e,t,n,i)?{action:"render",changeToken:a}:{action:"reuse",changeToken:a}:{action:"render",changeToken:a};let o=ie(r.sitemapLastmodByPage[n]);return o&&l.sitemapLastmod&&l.sitemapLastmod===o?{action:"reuse",changeToken:a}:{action:"render",changeToken:a}}async function zr(e,t,r,s){try{let i=(await t.get(r,{timeout:Math.min(e.navigationTimeoutMs,15e3),failOnStatusCode:!1})).status();return i===404?!0:(s.warn(`Generated 404 request path no longer returns 404 for ${r}`,{url:r,status:i,requestPath:e.generated404RequestPath,source:"generated-404-status-probe"}),!1)}catch(n){return s.warn(`Generated 404 status probe failed for ${r}`,{url:r,error:String(n),requestPath:e.generated404RequestPath,source:"generated-404-status-probe"}),false}}async function Jr(e,t,r,s,n){let i=lt(r.previousManifest,void 0,s,"previous-manifest"),u=0;for(let[c,g]of Object.entries(r.manifest.pages))if(!r.seenPages.has(c)){ut(n,e,g.outputPath);try{await S.unlink(g.outputPath);}catch(m){(m.code||"")!=="ENOENT"&&s.warn(`Failed to remove stale incremental page output for ${c}`,{url:c,outputPath:g.outputPath,error:String(m)});}delete r.manifest.pages[c],u++;}let l=lt(r.manifest,r.runId,s,"active-manifest"),a=new Set,o=new Set;for(let c of l){for(let w of ae(e,c))a.add(w);let g=r.manifest.assets[c]?.outputPath;g&&o.add(g);let m=ue(e,t.assetMap,c);m&&o.add(m);}for(let c of Object.keys(r.manifest.assets))l.has(c)||delete r.manifest.assets[c];let d=0,p=0;for(let c of i){let g=new Set,m=r.previousManifest.assets[c]?.outputPath;m&&g.add(m);let w=ue(e,t.assetMap,c);if(!l.has(c)&&w)g.add(w);else if(!l.has(c)){let h=cs(e,c,s,"incremental-cleanup");h&&(g.add(h.originalFilePath),h.hashedFilePath&&g.add(h.hashedFilePath));}for(let h of g)if(!o.has(h)){ut(n,e,h);try{await S.unlink(h),d++;}catch(C){(C.code||"")!=="ENOENT"&&s.warn(`Failed to remove stale incremental asset output for ${c}`,{url:c,outputPath:h,error:String(C)});}}for(let h of ae(e,c))a.has(h)||Object.prototype.hasOwnProperty.call(t.assetMap,h)&&(delete t.assetMap[h],p++);}(u>0||d>0||p>0)&&s.info(`Incremental cleanup removed ${u} stale pages, ${d} stale assets, ${p} stale asset mappings`,{removedPages:u,removedAssets:d,removedAssetMappings:p,phase:"incremental-cleanup"});}function lt(e,t,r,s){let n=new Set,i=u=>{let l=u.trim();if(l){if(r){let a=J(l,r,"asset",s??"manifest");if(!a)return;n.add(a.toString());return}n.add(l);}};for(let u of Object.values(e.pages))for(let l of u.discoveredAssets||[])i(l);for(let[u,l]of Object.entries(e.assets||{}))t&&l.lastSeenRunId!==t||i(u);return n}function ct(e,t,r){for(let s of t)for(let n of ae(e,s))if(r.has(n))return true;return false}function Gr(e,t,r,s,n){let i=new Set(r.rewriteTargets);for(let l of Object.values(t.manifest.pages))l.rewriteComplete||i.add(f.resolve(l.outputPath));for(let l of Object.values(t.manifest.assets))l.isText&&!l.rewriteComplete&&i.add(f.resolve(l.outputPath));let u=Qr(s,n);if(u.size===0)return [...i];for(let l of Object.values(t.manifest.pages))ct(e,l.discoveredAssets,u)&&i.add(f.resolve(l.outputPath));for(let[l,a]of Object.entries(t.manifest.assets)){a.isText&&ct(e,a.discoveredAssets,u)&&i.add(f.resolve(a.outputPath));for(let o of ae(e,l))if(u.has(o)){q(r,e,a.outputPath),a.isText&&i.add(f.resolve(a.outputPath));break}}return [...i]}function Vr(e,t){let r=t?new Set(Array.from(t,n=>f.resolve(n))):null,s=n=>r===null||r.has(f.resolve(n));for(let n of Object.values(e.manifest.pages))s(n.outputPath)&&(n.rewriteComplete=true);for(let n of Object.values(e.manifest.assets)){if(!n.isText){n.rewriteComplete=true;continue}s(n.outputPath)&&(n.rewriteComplete=true);}}function Kr(e,t,r){let s=new Set,n=i=>{if(!i)return;let u=ee(e.outputDir,i);u&&s.add(u);};for(let i of t.donePages)n(B(e,i));for(let i of Object.values(r.manifest.pages))i.lastSeenRunId===r.runId&&n(i.outputPath);for(let i of t.doneAssets)n(ue(e,t.assetMap,i));for(let i of Object.values(r.manifest.assets))i.lastSeenRunId===r.runId&&n(i.outputPath);return s}async function Yr(e,t,r,s,n){let i=[...s.deletedFiles].sort(),u=Kr(e,t,r),l=0;for(let d of [...u].sort()){try{if((await S.stat(f.join(e.outputDir,d))).isFile())continue}catch{}l++,n.warn(`Active output is missing after crawl: ${d}`,{phase:"deploy-plan",file:d,outputPath:f.join(e.outputDir,d)});}if(l>0&&n.warn(`Detected ${l} active output file(s) missing before deploy plan save.`,{phase:"deploy-plan",missingActiveOutputs:l}),i.length===0)return [];let a=[],o=0;for(let d of i){if(!u.has(d)){a.push(d);continue}o++;let p=f.join(e.outputDir,d),c;try{c=(await S.stat(p)).isFile();}catch{c=false;}n.warn(`Deploy plan protected active output from deletion: ${d}`,{phase:"deploy-plan",file:d,outputPath:p,exists:c});}return o>0&&n.info(`Deploy plan skipped ${o} active output deletion(s).`,{phase:"deploy-plan",protectedDeletes:o,deletedFiles:a.length}),a}function ae(e,t){let r=new Set([t]);try{let s=new URL(t),i=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{i.push(new URL(e.targetOrigin).origin);}catch{}for(let u of i)try{r.add(new URL(u).origin+s.pathname+s.search);}catch{}r.add(s.pathname+s.search),r.add(s.pathname);}catch{}return [...r]}function Zr(e,t){let r=new Set([t]);try{let s=new URL(t),i=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{i.push(new URL(e.targetOrigin).origin);}catch{}for(let u of i)try{r.add(new URL(u).origin+s.pathname+s.search);}catch{}r.add(s.pathname+s.search);}catch{}return [...r]}function Rt(e,t){let r=e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/"?e.targetOrigin:"https://relative.invalid/";try{let s=new URL(t,r);return f.join(e.outputDir,je(s.pathname))}catch{return null}}function Xr(e,t,r){for(let s of Zr(e,r)){let n=t[s];if(!n)continue;let i=Rt(e,n);if(i)return {outputPath:i,publicUrl:n}}return null}function es(e,t,r){for(let s of ae(e,r)){let n=t[s];if(!n)continue;let i=Rt(e,n);if(i)return i}return null}function ue(e,t,r){let s=es(e,t,r);if(s)return s;try{return Ue(e,r).originalFilePath}catch{return null}}function ts(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?f.join(f.resolve(e),"queue-runner-heartbeat.json"):""}async function dt(e){let t=ts();if(t)try{let r=await S.readFile(t,"utf8"),s=JSON.parse(r);if(!s||typeof s!="object")return;await S.writeFile(t,JSON.stringify({...s,checkedAt:new Date().toISOString(),status:"running",currentStep:"rewrite",message:e},null,2),"utf8");}catch{}}function rs(e,t){let r=new Set;for(let s of t.donePages)r.add(f.resolve(B(e,s)));for(let s of t.doneAssets){let n=ue(e,t.assetMap,s);!n||!z(n)||r.add(f.resolve(n));}return [...r]}var we="re:",he=new Map;function ss(e){if(!e.startsWith(we))return null;let t=he.get(e);if(t!==void 0)return t||null;let r=e.slice(we.length).trim();if(!r)return he.set(e,false),null;try{let s=new RegExp(r);return he.set(e,s),s}catch{return console.warn(`[crawl] Ignoring invalid path matcher regex: ${e}`),he.set(e,false),null}}function Fe(e,t){let r=ss(t);return r?r.test(e):t.startsWith(we)?false:e.startsWith(t)}function ns(e,t){return t.find(r=>Fe(e,r))}function Ct(e,t){let r=ns(t.pathname,e.blockedPathPrefixes);if(r)return r.startsWith(we)?`blocked path regex: ${r}`:`blocked path prefix: ${r}`;let s=e.blockedSearchFragments.find(n=>t.search.includes(n));return s?`blocked search fragment: ${s}`:null}function is(e){let t=new URL(e.sourceOrigin),r=new Set([t.hostname,...e.allowedAssetHosts]);if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{r.add(new URL(e.targetOrigin).hostname);}catch{}for(let s of Object.keys(e.extraReplacements||{}))try{r.add(new URL(s).hostname);}catch{}return r}function os(e,t){return is(e).has(t.hostname)}function as(e){let t=E(e.trim()).replace(/\\\//g,"/").replace(/^['"]|['"]$/g,"").trim();return t=t.replace(/[)]+$/g,"").trim(),t=t.replace(/;.*$/g,"").trim(),t}function kt(e){let t=E(e).replace(/\\\//g,"/");return /[{}]|\bwindow\.|\blocation\.|\bincludes\(|\?\?null|\+|%7B|%7D|%22|<|>|\s/.test(t)||/[()[\]'"]/.test(t)}function us(e){let t=E(e).replace(/\\\//g,"/").trim(),r=f.extname(t).toLowerCase();return St.has(r)||bt.has(r)?false:/^(?:this|[A-Za-z_$][\w$]*)\.[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(t)}function Y(e){return Ir.some(t=>e.pathname.startsWith(t))}function A(e,t,r=e.sourceOrigin,s,n="url"){let i=as(t);if(!i||i.startsWith("data:")||i.startsWith("blob:")||i.startsWith("mailto:")||i.startsWith("tel:")||i.startsWith("#"))return s?.ignore(n,t,"empty or unsupported scheme",r),null;if(kt(i))return s?.ignore(n,t,"looks like JavaScript/code fragment",r),null;if(us(i))return s?.ignore(n,t,"looks like JavaScript property access",r),null;try{let u=new URL(i,r);if(xt(u))return s?.reject(n,t,"malformed URL encoding",r),null;if(!["http:","https:"].includes(u.protocol))return s?.ignore(n,t,"unsupported protocol: ",r),null;if(!os(e,u))return s?.ignore(n,u.toString(),"host not allowed",r),null;let l=Ct(e,u);if(l)return s?.reject(n,u.toString(),l,r),null;let a=new URL(e.sourceOrigin);return u.protocol=a.protocol,u.host=a.host,u.hash="",u}catch{return s?.reject(n,t,"invalid URL",r),null}}function xt(e){try{return decodeURIComponent(e.pathname),decodeURIComponent(e.search),decodeURIComponent(e.hash),!1}catch{return true}}function J(e,t,r,s){try{let n=new URL(e);return xt(n)?(t.reject(r,e,"malformed URL encoding",s),null):n.protocol!=="http:"&&n.protocol!=="https:"?(t.reject(r,e,`unsupported protocol: ${n.protocol}`,s),null):n}catch{return t.reject(r,e,"invalid URL",s),null}}function Tt(e){return St.has(f.extname(e.pathname).toLowerCase())}function G(e){return Y(e)?false:bt.has(f.extname(e.pathname).toLowerCase())}function de(e){let t=e.pathname.toLowerCase();return t.endsWith(".xml")&&(t.includes("sitemap")||t.endsWith("/sitemap.xml"))}function k(e,t){return !!(de(t)||t.pathname==="/robots.txt"||t.pathname==="/llms.txt"||t.pathname.toLowerCase().endsWith(".xsl")||e.assetPathPrefixes.length>0&&e.assetPathPrefixes.some(r=>Fe(t.pathname,r))||Tt(t)||!G(t)&&!Y(t))}function B(e,t){let r=new URL(t),s=je(r.pathname);return s.endsWith("/")?s+="index.html":f.extname(s)||(s+="/index.html"),f.join(e.outputDir,s)}function je(e){try{return decodeURIComponent(e)}catch{return e}}function ls(e){if(!e.generated404RequestPath)return null;try{let t=new URL(e.generated404RequestPath,e.sourceOrigin);return !t.pathname.endsWith("/")&&f.extname(t.pathname)===""&&(t.pathname+="/"),t.hash="",t.toString()}catch{return null}}function Ee(e,t){let r=ls(e);if(!r)return false;try{return new URL(t,e.sourceOrigin).toString()===r}catch{return false}}function Ue(e,t){let r=new URL(t),s=je(r.pathname);s.endsWith("/")&&(s+="index.html");let n=!!r.search,i=s,u=f.join(e.outputDir,i),l=Ce(e.targetOrigin,i),a=`${l}${r.search}`;if(!n)return {originalPathname:i,originalFilePath:u,originalPublicUrl:l,originalPublicUrlWithSearch:a,preferQueryHashed:n};let o=f.extname(s),p=`${o?s.slice(0,-o.length):s}.${re(r.search)}${o||".bin"}`;return {originalPathname:i,originalFilePath:u,originalPublicUrl:l,originalPublicUrlWithSearch:a,preferQueryHashed:n,hashedPathname:p,hashedFilePath:f.join(e.outputDir,p),hashedPublicUrl:Ce(e.targetOrigin,p)}}function cs(e,t,r,s){let n=J(t,r,"asset",s);return n?Ue(e,n.toString()):null}function ds(e,t,r,s,n){t[r]=s;try{let i=new URL(r),l=[new URL(e.sourceOrigin).origin,...Object.keys(e.extraReplacements||{})];if(e.targetOrigin&&e.targetOrigin!=="."&&e.targetOrigin!=="/")try{l.push(new URL(e.targetOrigin).origin);}catch{}for(let a of l)try{let o=new URL(a);t[o.origin+i.pathname+i.search]=s;}catch{}try{let a=(()=>{let o=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin);return `${o.pathname}${o.search}`})();t[i.pathname+i.search]=a;}catch{}try{let a=new URL(s,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=a;}catch{}try{let a=new URL(n,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin).pathname;t[i.pathname]=a;}catch{}}catch{}}async function At(e){try{return await S.readFile(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function Mt(e){try{return await S.stat(e)}catch(t){if(t.code==="ENOENT")return null;throw t}}function ps(e){let t=String(e["content-length"]||"").trim();if(!t)return null;let r=Number.parseInt(t,10);return Number.isFinite(r)&&r>=0?r:null}function Lt(e){let t=String(e["last-modified"]||"").trim();if(!t)return null;let r=Date.parse(t);return Number.isFinite(r)?r:null}function gs(e,t){let r=Lt(t),s=ps(t),n=e?.mtime.getTime();return r!==null&&Math.abs((n??0)-r)>=1e3||s!==null&&e?.size!==s?false:r!==null||s!==null}async function fs(e,t){if(!t)return;let r=Lt(t);if(r===null)return;let s=await Mt(e);if(!s)return;let n=new Date(r);await S.utimes(e,s.atime,n).catch(()=>{});}function pt(e,t){let r=f.extname(e.pathname).toLowerCase(),s=t["content-type"]||"";return Lr.has(r)||Mr.some(n=>s.includes(n))&&!s.startsWith("image/")&&!s.includes("font")}function Me(e,t){(e.doneAssets.size%25===0||e.doneAssets.size===1||e.doneAssets.size===e.stats.assetsQueued)&&t.progress(`Asset download progress: downloaded ${e.doneAssets.size}, discovered ${e.stats.assetsQueued}.`,{doneAssets:e.doneAssets.size,assetsQueued:e.stats.assetsQueued,phase:"download-assets"});}function hs(e){return re(e.toString("base64"),40)}function ms(e,t,r){let s=e.assetVariantDigestsByOriginalPath.get(t);if(!s||s.size===0)return false;for(let n of s)if(n!==r)return true;return false}function ws(e,t,r){let s=e.assetVariantDigestsByOriginalPath.get(t);s||(s=new Set,e.assetVariantDigestsByOriginalPath.set(t,s)),s.add(r);}async function De(e,t,r,s,n,i,u){let l=Ue(e,r),a=hs(s),o=l.originalFilePath,d=l.originalPublicUrlWithSearch;if(l.preferQueryHashed&&l.hashedFilePath&&l.hashedPublicUrl&&ms(n,l.originalFilePath,a)){let m=Xr(e,t,r);m?(o=m.outputPath,d=m.publicUrl):(o=l.hashedFilePath,d=l.hashedPublicUrl);}ds(e,t,r,d,l.originalPublicUrl);let p=z(o)?Buffer.from(Te(s.toString("utf8"),e,t,o),"utf8"):s,c=await At(o),g=false;return (c===null||!c.equals(p))&&(await se(o,p),g=true),i?.debug(`${g?"Saved":"Skipped unchanged"} asset output ${r}`,{phase:"download-assets",url:r,outputPath:o,bytes:p.length,wroteFile:g}),ws(n,l.originalFilePath,a),await fs(o,u),n.stats.assetsSaved++,i&&(n.stats.assetsSaved%50===0||n.stats.assetsSaved===1)&&i.progress(`Asset progress: saved ${n.stats.assetsSaved}, discovered ${n.stats.assetsQueued}, pending ${n.assetQueue.length}.`,{assetsSaved:n.stats.assetsSaved,assetsQueued:n.stats.assetsQueued,assetQueue:n.assetQueue.length,phase:"download-assets"}),{outputPath:o,publicUrl:d,wroteFile:g}}function le(e,t,r,s,n){let i=()=>{let p=String(n??"").trim();if(!p)return {discoveredFrom:"",discoveredFromType:"unknown"};if(p==="seed-path"||p==="cli"||p==="generated-404-request-path")return {discoveredFrom:p,discoveredFromType:p};if(/^https?:\/\//i.test(p))try{let c=new URL(p);return de(c)?{discoveredFrom:p,discoveredFromType:"sitemap"}:k(e,c)?{discoveredFrom:p,discoveredFromType:"asset"}:G(c)&&!Y(c)?{discoveredFrom:p,discoveredFromType:"page"}:{discoveredFrom:p,discoveredFromType:"url"}}catch{return {discoveredFrom:p,discoveredFromType:"url"}}return {discoveredFrom:p,discoveredFromType:"url"}},u=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,l=A(e,r,u,s,"page");if(!l)return;if(!G(l)||Tt(l)){if(k(e,l)){s.info(`Seeded/non-page URL queued as asset: ${l.toString()}`,{url:l.toString(),source:n}),I(e,t,l.toString(),s,n);return}s.reject("page",l.toString(),Y(l)?"asset/internal path cannot be page":"not page-like",n);return}let a=l.toString(),{discoveredFrom:o,discoveredFromType:d}=i();o&&!t.pageDiscoverySources.has(a)&&t.pageDiscoverySources.set(a,o),!t.donePages.has(a)&&!t.queuedPages.has(a)&&(t.queuedPages.add(a),t.pageQueue.push(a),t.stats.pagesQueued++,s.debug(`Queued discovered page ${a}`,{phase:"discovery",url:a,discoveredFrom:o,discoveredFromType:d,outputPath:B(e,a)}),(t.stats.pagesQueued%25===0||t.stats.pagesQueued===1)&&s.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,pageQueue:t.pageQueue.length,phase:"discovery"}));}function I(e,t,r,s,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,u=A(e,r,i,s,"asset");if(!u)return;if(!k(e,u)){s.reject("asset",u.toString(),"not a safe asset path/prefix",n);return}let l=u.toString();!t.doneAssets.has(l)&&!t.queuedAssets.has(l)&&(t.queuedAssets.add(l),t.assetQueue.push(l),t.stats.assetsQueued++,(t.stats.assetsQueued%100===0||t.stats.assetsQueued===1)&&s.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,assetQueue:t.assetQueue.length,phase:"discovery"}));}function qe(e,t,r,s,n){let i=n&&/^https?:\/\//i.test(n)?n:e.sourceOrigin,u=A(e,r,i,s,"sitemap");if(!u)return;if(!de(u)){s.reject("sitemap",u.toString(),"not sitemap-like",n);return}let l=u.toString();!t.doneSitemaps.has(l)&&!t.queuedSitemaps.has(l)&&(t.queuedSitemaps.add(l),t.sitemapQueue.push(l),t.stats.sitemapsQueued++,(t.stats.sitemapsQueued%10===0||t.stats.sitemapsQueued===1)&&s.progress(`Discovery progress: pages ${t.stats.pagesQueued}, assets ${t.stats.assetsQueued}, sitemaps ${t.stats.sitemapsQueued}.`,{pagesQueued:t.stats.pagesQueued,assetsQueued:t.stats.assetsQueued,sitemapsQueued:t.stats.sitemapsQueued,sitemapQueue:t.sitemapQueue.length,phase:"discovery"}));}function Ps(e){let t=E(e),r=[...t.matchAll(/<url>\s*([\s\S]*?)\s*<\/url>/gi)].map(s=>s[1]);return r.length>0?r.map(s=>{let n=s.match(/<loc>\s*([^<]+?)\s*<\/loc>/i);if(!n?.[1])return null;let i=s.match(/<lastmod>\s*([^<]+?)\s*<\/lastmod>/i);return {loc:n[1].trim(),lastmod:ie(i?.[1]??null)}}).filter(s=>!!s):[...t.matchAll(/<loc>\s*([^<]+?)\s*<\/loc>/gi)].map(s=>({loc:s[1].trim(),lastmod:null})).filter(s=>s.loc)}function Ss(e){return e.split(",").map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function bs(e){let t=[],r=/url\(\s*(?:"([^"]+)"|'([^']+)'|([^)]*?))\s*\)/gi;for(let s of e.matchAll(r)){let n=e.slice(Math.max(0,s.index-8),s.index);if(/\bnew\s+$/i.test(n))continue;let i=(s[1]||s[2]||s[3]||"").trim();i&&t.push(i);}return t}function ys(e){return e.replace(/<script\b[^>]*>[\s\S]*?<\/script\s*>/gi,"")}function vs(e,t){if(t==="dom-style")return true;let r=(()=>{try{return f.extname(new URL(e).pathname).toLowerCase()}catch{return ""}})();return !(r===".js"||r===".mjs"||r===".map"||t.includes("javascript"))}function Le(e){return e.trim().replace(/\\/g,"/").replace(/^https?:\/\/[^/]+/i,"").replace(/^\/+/,"")}async function It(e,t,r,s){let n=[];await S.mkdir(t,{recursive:true});let i=await S.readdir(e,{withFileTypes:true});for(let u of i){let l=f.join(e,u.name),a=f.join(t,u.name);if(u.isDirectory()){n.push(...await It(l,a,r,s));continue}await $t(l,a,r,s)&&n.push(a);}return n}async function Rs(e,t){try{let[r,s]=await Promise.all([S.stat(e),S.stat(t)]);if(r.size!==s.size)return !1;let[n,i]=await Promise.all([S.readFile(e),S.readFile(t)]);return n.equals(i)}catch{return false}}async function $t(e,t,r,s){let n=f.resolve(t);return r.has(n)?(s.debug("Skipped post-crawl copy over crawled page output",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):await Rs(e,t)?(s.debug("Skipped unchanged post-crawl copy target",{phase:"copy-extra-paths",sourcePath:e,targetPath:t}),false):(await S.mkdir(f.dirname(t),{recursive:true}),await S.copyFile(e,t),true)}async function Cs(e,t,r){let s=Object.entries(e.postCrawlCopyMap||{}).map(([l,a])=>({sourcePath:l.trim(),prefix:String(a||"").trim()}));if(s.length===0)return [];let n=0,i=[],u=new Set([...t.donePages].map(l=>f.resolve(B(e,l))));r.mark("copy-extra-paths");for(let l of s){let a=l.sourcePath,o=l.prefix;if(!a||!o){r.warn("Skipped post-crawl copy mapping with empty key/value",{sourcePath:a,prefixPath:o});continue}let d=Fr(a);if(!d.resolvedPath){r.warn("Skipped post-crawl copy source because alias root is not configured",{sourcePath:a,alias:d.alias||"",requiredEnv:d.requiredEnv||"",prefixPath:o});continue}let p=d.resolvedPath,c=Le(o);if(!c){r.warn("Skipped post-crawl copy mapping with invalid export prefix",{sourcePath:a,prefixPath:o});continue}let g;try{g=await S.stat(p);}catch{r.warn("Skipped post-crawl copy source because it does not exist",{sourcePath:a,sourceAbs:p,prefixPath:o});continue}let m=f.resolve(e.outputDir,c);if(g.isDirectory()){let P=await It(p,m,u,r);i.push(...P),n+=P.length,P.length>0&&r.progress(`Copied static directory to export: ${p} -> /${c}`,{phase:"copy-extra-paths",sourcePath:p,targetPath:`/${c}`,copiedItems:n,changedFiles:P.length});continue}let w=f.basename(p),h=o.endsWith("/")?f.join(m,w):m;await $t(p,h,u,r)&&(i.push(h),n++,r.progress(`Copied static file to export: ${p} -> /${Le(o.endsWith("/")?`${o}${w}`:o)}`,{phase:"copy-extra-paths",sourcePath:p,targetPath:`/${Le(o.endsWith("/")?`${o}${w}`:o)}`,copiedItems:n}));}return r.endMark("copy-extra-paths",{mappedSources:s.length,copiedItems:n}),i}function ce(e,t,r,s,n){let i=new Set,u=E(r).replace(/\\\//g,"/"),l=n==="page-html"?ys(u):u,a=vs(t,n);if(a){for(let p of bs(l)){let c=A(e,p,t,s,`${n}:css-url`);c&&k(e,c)&&i.add(c.toString());}for(let p of l.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;]+)['"]?\s*\)?/gi)){let c=A(e,p[1],t,s,`${n}:css-import`);c&&k(e,c)&&i.add(c.toString());}}if(a||n==="page-html")for(let p of l.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi)){let c=A(e,p[1],t,s,`${n}:xml-stylesheet`);c&&k(e,c)&&i.add(c.toString());}let o="(?:css|js|mjs|json|map|xml|xsl|rss|atom|txt|enc|jws|png|jpe?g|gif|webp|avif|svg|ico|woff2?|ttf|otf|eot|pdf|mp4|webm)",d=new RegExp(`(?:https?:)?//[^\\s'"<>\\);]+\\.${o}(?:\\?[^\\s'"<>\\);]*)?|(?<!\\.)/[^\\s'"<>\\);]+\\.${o}(?:\\?[^\\s'"<>\\);]*)?`,"gi");for(let p of u.matchAll(d)){let c=p[0].startsWith("//")?`${new URL(e.sourceOrigin).protocol}${p[0]}`:p[0];if(kt(c)){s.ignore(`${n}:serialized-url`,c,"looks like JavaScript/code fragment",t);continue}let g=A(e,c,t,s,`${n}:serialized-url`);g&&k(e,g)?i.add(g.toString()):g&&s.ignore("asset",g.toString(),"serialized URL did not pass safe asset path filter",t);}return [...i]}function ks(e,t,r,s){let n=new Set,i=E(r);for(let u of i.matchAll(/href=["']([^"'#\s][^"']*?)["']/gi)){let l=u[1],a=A(e,l,t,s,"page-link");a&&(Ct(e,a)||G(a)&&!Y(a)&&!k(e,a)&&n.add(a.toString()));}return [...n]}async function gt(e,t,r,s,n){for(;r.sitemapQueue.length>0;){let i=r.sitemapQueue.shift();r.queuedSitemaps.delete(i);let u=J(i,s,"sitemap","sitemap-queue");if(!u)continue;let l=u.toString();if(!r.doneSitemaps.has(l)){r.doneSitemaps.add(l),s.sitemap(`Fetching sitemap ${l}`,{url:l});try{let a=await t.get(l,{timeout:6e4});if(!a.ok()){s.skip("sitemap",l,a.status());continue}let o=await a.body(),d=a.url()||l,p=J(d,s,"sitemap-response",l);if(!p)continue;let c=p.toString(),g=await De(e,r.assetMap,c,o,r,s);q(n,e,g.outputPath),oe(n,g.outputPath);let m=o.toString("utf8");for(let w of ce(e,c,m,s,"sitemap"))I(e,r,w,s,c);for(let w of Ps(m)){let h=A(e,w.loc,c,s,"sitemap-loc");h&&(de(h)?qe(e,r,h.toString(),s,c):k(e,h)?I(e,r,h.toString(),s,c):G(h)?(w.lastmod&&(r.sitemapLastmodByPage[h.toString()]=w.lastmod),le(e,r,h.toString(),s,c)):s.reject("sitemap-loc",h.toString(),"not page/sitemap/asset-like",c));}}catch(a){s.error(`Failed sitemap ${l}`,{url:l,error:String(a)});}}}}async function xs(e,t,r,s,n,i,u){let l=A(e,s,e.sourceOrigin,n,"asset-fetch");if(!l||!k(e,l))return;let a=l.toString();if(r.doneAssets.has(a))return;let o=i.enabled?i.previousManifest.assets[a]:void 0,d=(p,c={})=>{if(!o)return false;i.manifest.assets[a]={...o,discoveredAssets:[...o.discoveredAssets||[]],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId},delete i.manifest.pages[a],r.doneAssets.add(a);for(let g of o.discoveredAssets||[])I(e,r,g,n,a);return n.warn(`Keeping previous incremental asset ${a} after fetch issue.`,{url:a,reason:p,preservedFromPreviousManifest:true,...c,phase:"download-assets"}),Me(r,n),true};n.asset(`Fetching asset ${a}`,{url:a});try{let p=ue(e,r.assetMap,a),c=p?await Mt(p):null;if(p&&c)try{let L=await t.head(a,{timeout:6e4}),T=L.headers();if(L.ok()&&gs(c,T)){let H=await At(p);if(H!==null){let Q=L.url()||a,b=J(Q,n,"asset-response",a);if(!b)return;let R=b.toString(),N=await De(e,r.assetMap,R,H,r,n,T);N.wroteFile&&(q(u,e,N.outputPath),z(N.outputPath)&&oe(u,N.outputPath)),r.doneAssets.add(a),n.info(`Reused existing asset ${a} based on response headers.`,{url:a,filePath:p,lastModified:T["last-modified"]||"",contentLength:T["content-length"]||"",phase:"download-assets"}),Me(r,n);let Z=pt(l,T),Pe=o?.discoveredAssets?[...o.discoveredAssets]:[];if(Z||o?.isText){let X=H.toString("utf8"),Ne=ce(e,R,X,n,"asset:cached");(Ne.length>0||!o)&&(Pe=Ne);for(let Ft of Pe)I(e,r,Ft,n,R);}if(i.trackManifest){let X=Z||!!o?.isText;i.manifest.assets[a]={url:a,outputPath:N.outputPath,isText:X,contentType:Ie(T)||o?.contentType||null,discoveredAssets:Pe,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!X},delete i.manifest.pages[a],i.enabled&&X&&await K(e,i);}return}}}catch{}let g=await t.get(a,{timeout:6e4});if(!g.ok()){if(d(`http-${g.status()}`,{status:g.status()}))return;n.skip("asset",a,g.status());return}let m=await g.body(),w=g.url()||a,h=J(w,n,"asset-response",a);if(!h)return;let C=h.toString(),P=g.headers(),y=await De(e,r.assetMap,C,m,r,n,P);y.wroteFile&&(q(u,e,y.outputPath),z(y.outputPath)&&oe(u,y.outputPath)),r.doneAssets.add(a),Me(r,n);let v=pt(l,P),x=[];if(v){let L=m.toString("utf8");x=ce(e,C,L,n,`asset:${f.extname(l.pathname).toLowerCase()||P["content-type"]||"unknown"}`);for(let T of x)I(e,r,T,n,C);}i.trackManifest&&(i.manifest.assets[a]={url:a,outputPath:y.outputPath,isText:v,contentType:Ie(P),discoveredAssets:x,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!v},delete i.manifest.pages[a],i.enabled&&v&&await K(e,i));}catch(p){if(d("fetch-error",{error:String(p)}))return;n.error(`Failed asset ${a}`,{url:a,error:String(p)});}}async function Ts(e,t,r,s,n,i){let u=Math.max(1,Number(e.assetDownloadConcurrency||e.concurrency||1)),l=Array.from({length:u},async()=>{for(;r.assetQueue.length>0;){let a=r.assetQueue.shift();a&&(r.queuedAssets.delete(a),await xs(e,t,r,a,s,n,i));}});await Promise.all(l);}function As(e){let t=Math.ceil(e/1e3);return `${t} second${t===1?"":"s"}`}function U(e){return Math.max(6e4,e.navigationTimeoutMs*2,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+15e3)}function me(e){return Math.max(15e3,Math.min(6e4,U(e)))}function Ms(e){return Math.max(15e3,e.readiness.timeoutMs+e.readiness.fallbackWaitMs+1e4)}function Qe(e){return e.stats.pagesCompleted}function Dt(e){let r=e.options?.browserProcess;return {pid:typeof r?.process?.pid=="number"?r.process.pid:null,kill:typeof r?.kill=="function"?r.kill.bind(r):null}}async function Ls(e,t,r){let s=Dt(e);try{if(s.kill){await s.kill(),t.warn(`Force-killed crawl worker browser after ${r}`,{browserPid:s.pid,reason:r});return}if(s.pid!==null){process.kill(s.pid,"SIGKILL"),t.warn(`Sent SIGKILL to crawl worker browser after ${r}`,{browserPid:s.pid,reason:r});return}t.warn(`Could not resolve crawl worker browser PID after ${r}`,{reason:r});}catch(n){t.error(`Failed to force-kill crawl worker browser after ${r}`,{browserPid:s.pid,reason:r,error:String(n)});}}async function M(e,t,r){let s;try{return await Promise.race([r(),new Promise((n,i)=>{s=globalThis.setTimeout(()=>{i(new Error(`${e} timed out after ${As(t)}.`));},t);})])}finally{s!==void 0&&globalThis.clearTimeout(s);}}async function Is(e,t){let r=Ms(e);await t.evaluate(async s=>{await new Promise(n=>{let i=0,u=700,l=Date.now(),a=()=>{window.clearInterval(o),window.scrollTo(0,0),n();},o=window.setInterval(()=>{if(Date.now()-l>=s.maxDurationMs){a();return}window.scrollBy(0,u),i+=u;let d=document.body?.scrollHeight||0,p=document.documentElement?.scrollHeight||0,c=Math.max(d,p);i>=c+window.innerHeight&&a();},120);});},{maxDurationMs:r});}async function $s(e,t){await t.waitForLoadState("domcontentloaded",{timeout:e.readiness.timeoutMs}).catch(()=>{}),e.readiness.waitForSelector&&await t.waitForSelector(e.readiness.waitForSelector,{timeout:e.readiness.timeoutMs}).catch(()=>{}),e.readiness.waitForFunction&&await t.waitForFunction(e.readiness.waitForFunction,void 0,{timeout:e.readiness.timeoutMs}).catch(()=>{}),await Is(e,t),await t.waitForTimeout(e.readiness.fallbackWaitMs);}async function Ds(e,t){await t.waitForLoadState("domcontentloaded",{timeout:e.readiness.timeoutMs}).catch(()=>{}),await t.waitForLoadState("load",{timeout:e.readiness.timeoutMs}).catch(()=>{}),e.readiness.waitForSelector&&await t.waitForSelector(e.readiness.waitForSelector,{timeout:e.readiness.timeoutMs}).catch(()=>{}),await t.waitForTimeout(e.readiness.fallbackWaitMs);}function Os(e,t){return e.noJavaScriptRenderPathPrefixes.some(r=>Fe(t,r))}async function Fs(e,t,r,s,n=true){let i=new Set;if(n){let l=await t.evaluate(()=>{let a=new Set,o=["href","src","poster","data-src","data-lazy-src","data-original","data-bg","data-background","data-href"],d=new Set,p=["srcset","data-srcset","data-lazy-srcset"];return document.querySelectorAll("*").forEach(c=>{for(let m of o){let w=c.getAttribute(m);w&&a.add(w);}for(let m of p){let w=c.getAttribute(m);w&&w.split(",").forEach(h=>{let C=h.trim().split(/\s+/)[0];C&&a.add(C);});}let g=c.getAttribute("style");g&&d.add(g);}),{attrs:[...a],styles:[...d]}});for(let a of l.attrs)for(let o of Ss(a)){let d=A(e,o,r,s,"dom-attr");d&&k(e,d)&&i.add(d.toString());}for(let a of l.styles)for(let o of ce(e,r,a,s,"dom-style"))i.add(o);}let u=await t.content();for(let l of ce(e,r,u,s,"page-html"))i.add(l);return [...i]}async function ft(e,t,r,s,n){let i=B(e,t);await se(i,r,"utf8");let u=await S.stat(i);n?.debug(`Saved page output ${t}`,{phase:"save-pages",url:t,outputPath:i,bytes:u.size}),s.stats.pagesSaved++;let l=Math.min(s.stats.pagesQueued,Qe(s)+1);n&&(s.stats.pagesSaved%10===0||s.stats.pagesSaved===1)&&n.progress(`Page progress: processed ${l}, rendered ${s.stats.pagesRendered}, saved ${s.stats.pagesSaved}, discovered ${s.stats.pagesQueued}.`,{donePages:l,claimedPages:s.donePages.size,pagesRendered:s.stats.pagesRendered,pagesSaved:s.stats.pagesSaved,pagesQueued:s.stats.pagesQueued,pageQueue:s.pageQueue.length,phase:"save-pages"});}function js(e){let t=Qe(e);return t%5===0||t===1||t===e.stats.pagesQueued}function Es(e,t){let r=Qe(e);t.progress(`Render progress: processed ${r}, rendered ${e.stats.pagesRendered}, saved ${e.stats.pagesSaved}, discovered ${e.stats.pagesQueued}.`,{donePages:r,claimedPages:e.donePages.size,pagesRendered:e.stats.pagesRendered,pagesSaved:e.stats.pagesSaved,pagesQueued:e.stats.pagesQueued,phase:"render-pages"});}async function Us(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 s=new URL(String(r),window.location.href),n=new URL(window.location.href);return s.hash="",n.hash="",s.href===n.href}catch{return false}};try{let r=window.location.assign.bind(window.location),s=window.location.replace.bind(window.location),n=window.location.reload.bind(window.location);Object.defineProperty(window.location,"assign",{configurable:!0,value:i=>{if(t(i)){console.warn("[smartcloud-static-publisher] blocked same-page location.assign",i??"");return}return r(i)}}),Object.defineProperty(window.location,"replace",{configurable:!0,value:i=>{if(t(i)){console.warn("[smartcloud-static-publisher] blocked same-page location.replace",i??"");return}return s(i)}}),Object.defineProperty(window.location,"reload",{configurable:!0,value:()=>{console.warn("[smartcloud-static-publisher] blocked location.reload");}});}catch{}});}async function qs(e,t,r){let s=await e.newContext({viewport:t.viewport,userAgent:"WPSuiteStaticPublisher/0.8 Playwright SitemapOnly",ignoreHTTPSErrors:t.ignoreHttpsErrors,...r?{javaScriptEnabled:false}:{}});return r||await Us(s),s}async function Qs(e,t,r,s,n,i,u){let l=await chromium.launch({headless:true}),a=Dt(l);a.pid!==null&&r.debug(`Launched crawl worker browser PID ${a.pid}`,{browserPid:a.pid});try{for(;t.pageQueue.length>0&&!(e.maxPages>0&&t.donePages.size>=e.maxPages);){let o=t.pageQueue.shift();if(!o)break;t.queuedPages.delete(o);let d=null,p=null;try{let c=J(o,r,"page","page-queue");if(!c)continue;let g=c.toString();if(o=g,t.queuedPages.delete(o),t.donePages.has(o))continue;t.donePages.add(o),i.enabled&&i.seenPages.add(o);let m=Ee(e,o),w=Os(e,c.pathname);if(!G(c)||k(e,c)||Y(c)){if(k(e,c)){r.info(`Worker redirected non-page URL to asset queue: ${o}`,{url:o,source:"worker-guard"}),I(e,t,o,r,"worker-guard");continue}r.reject("page",o,"guard rejected non-page URL before rendering","worker");continue}let h=await Hr(e,n,t,i,o,r);if(i.enabled&&s!=="single-url"){let b=i.manifest.pages[o];if(h.action==="reuse"&&b){for(let R of b.discoveredAssets)I(e,t,R,r,o);for(let R of b.discoveredPages)le(e,t,R,r,o);b.lastSeenRunId=i.runId,b.sitemapLastmod=ie(t.sitemapLastmodByPage[o])??b.sitemapLastmod,h.changeToken?.supported&&(b.changeToken=h.changeToken.token,b.tokenSource=h.changeToken.tokenSource??b.tokenSource),r.info(`Incremental reuse skipped unchanged page ${o}`,{url:o,mode:"incremental",reason:h.changeToken?.supported===!0?"change-token-match":"sitemap-lastmod-match"});continue}}d=await M(`create page context ${o}`,U(e),()=>qs(l,e,w)),p=await M(`create page ${o}`,U(e),()=>d.newPage());let C=!1,P=new Set;await p.route("**/*",async b=>{let R=b.request();if(R.isNavigationRequest()&&R.frame()===p.mainFrame())try{let N=new URL(R.url()),Z=new URL(g);if(N.hash="",Z.hash="",N.href===Z.href){if(C){r.warn(`Blocked same-page navigation/reload for ${o}`,{url:o,requestUrl:R.url()}),await b.abort("aborted");return}C=!0;}}catch{}await b.continue();}),p.on("response",b=>{try{let R=A(e,b.url(),e.sourceOrigin,r,"network-response");R&&k(e,R)&&(P.add(R.toString()),I(e,t,R.toString(),r,o));}catch{}}),r.page(`Rendering ${o}`,{url:o});let y=null,v=null;try{if(y=await p.goto(o,{waitUntil:"domcontentloaded",timeout:e.navigationTimeoutMs}),y&&y.ok())try{v=await M(`read response body ${o}`,U(e),()=>y.text());}catch{v=null;}}catch(b){r.warn(`Navigation issue for ${o}; saving current DOM if available`,{url:o,error:String(b)});}if(m){let b=y?.status()??null;if(b!==404){r.error(`Generated 404 request path returned unexpected status for ${o}`,{url:o,expectedStatus:404,status:b,requestPath:e.generated404RequestPath});continue}r.info(`Capturing rendered 404 page for ${o}`,{url:o,status:b,outputPath:B(e,o)});}else if(y&&!y.ok()){r.skip("page",o,y.status(),t.pageDiscoverySources.get(o)),await p.close();continue}w?(r.info(`Rendering without JS execution for ${o}`,{url:o,mode:"no-js"}),await M(`wait for rendered page ${o}`,U(e),()=>Ds(e,p))):await M(`wait for rendered page ${o}`,U(e),()=>$s(e,p)),t.stats.pagesRendered++;let x=await M(`extract rendered assets ${o}`,U(e),()=>Fs(e,p,g,r,!w));for(let b of x)I(e,t,b,r,o);let L=[...new Set([...x,...P])],T=v??await M(`capture rendered html ${o}`,U(e),()=>p.content()),H=s!=="single-url"&&!m?ks(e,o,T,r):[];if(s!=="single-url"&&!m)for(let b of H)le(e,t,b,r,o);await ft(e,o,T,t,r);let Q=B(e,o);if(q(u,e,Q),oe(u,Q),i.trackManifest){let b=y?.headers();i.manifest.pages[o]={url:o,outputPath:Q,contentType:Ie(b),changeToken:h.changeToken?.supported?h.changeToken.token:null,tokenSource:h.changeToken?.supported?h.changeToken.tokenSource??null:null,sitemapLastmod:ie(t.sitemapLastmodByPage[o])??null,discoveredPages:H,discoveredAssets:L,lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},i.enabled&&await K(e,i);}}catch(c){try{let g=p?await M(`capture partial html ${o}`,U(e),()=>p.content()):"";if(g&&g.trim()){await ft(e,o,g,t,r);let m=B(e,o);if(q(u,e,m),oe(u,m),i.trackManifest){let w=i.manifest.pages[o]??i.previousManifest.pages[o];i.manifest.pages[o]={url:o,outputPath:m,contentType:w?.contentType??null,changeToken:null,tokenSource:null,sitemapLastmod:ie(t.sitemapLastmodByPage[o])??w?.sitemapLastmod??null,discoveredPages:w?.discoveredPages?[...w.discoveredPages]:[],discoveredAssets:w?.discoveredAssets?[...w.discoveredAssets]:[],lastCrawledAt:new Date().toISOString(),lastSeenRunId:i.runId,rewriteComplete:!1},i.enabled&&await K(e,i);}r.warn(`Saved partial DOM for ${o}`,{url:o,error:String(c)});}}catch(g){r.error(`Could not save partial DOM for ${o}`,{url:o,error:String(g)});}r.error(`Failed page ${o}`,{url:o,error:String(c)});}finally{t.stats.pagesCompleted++,js(t)&&Es(t,r),p&&await M(`close page ${o}`,me(e),()=>p.close()).catch(c=>{r.warn(`Timed out while closing page ${o}`,{url:o,browserPid:a.pid,error:String(c)});}),d&&await M(`close page context ${o}`,me(e),()=>d.close()).catch(c=>{r.warn(`Timed out while closing page context for ${o}`,{url:o,browserPid:a.pid,error:String(c)});});}}}finally{await M("close worker browser",me(e),()=>l.close()).catch(o=>(r.warn("Timed out while closing crawl worker browser",{browserPid:a.pid,error:String(o)}),Ls(l,r,"browser.close timeout")));}}async function Ns(e){try{let t=await S.readFile(e),s=(e.endsWith(".gz")?gunzipSync(t):t).toString("utf8").trim();if(!s)return [];try{let n=JSON.parse(s);if(Array.isArray(n))return n;if(n&&typeof n=="object")return [n]}catch{return s.split(/\r?\n/).map(n=>n.trim()).filter(Boolean).map(n=>{try{let i=JSON.parse(n);return i&&typeof i=="object"?i:null}catch{return null}}).filter(n=>n!==null)}return []}catch{return []}}function ht(e){let t=String(e||"").toLowerCase();return t.includes("timeout")||t.includes("timed out")||t.includes("navigation timeout")}function Ws(e){let t=String(e?.job?.command||"").trim(),r=String(e?.job?.crawlMode||"full").trim();return t!=="publish"&&t!=="crawl"?false:r!=="incremental"}function _s(e){let t=[e?.archivedAt,e?.job?.endedAt,e?.job?.startedAt];for(let r of t){let s=Date.parse(String(r||""));if(Number.isFinite(s))return s}return 0}async function Ot(e){try{let t=await S.readFile(e,"utf8"),r=JSON.parse(t);return r&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}function mt(e){let t=String(e.originalFileName||"").toLowerCase();return t.endsWith("errors.jsonl")?0:t.endsWith("errors.json")?1:2}function Bs(e,t){let r=Array.isArray(t?.artifacts)?t.artifacts.filter(s=>String(s?.role||"").trim()==="errors"&&String(s?.storedFileName||"").trim()!=="").sort((s,n)=>mt(s)-mt(n)).map(s=>f.join(e,String(s.storedFileName))):[];return [...new Set([...r,f.join(e,"errors.jsonl"),f.join(e,"errors.json"),f.join(e,"errors.jsonl.gz"),f.join(e,"errors.json.gz")])]}async function wt(e){let t=await Ot(f.join(e,"job.json"));for(let r of Bs(e,t)){let s=await Ns(r);if(s.length>0)return s}return []}async function Hs(e){let t=f.join(e.logDir,"archive"),r;try{r=await S.readdir(t);}catch{return ""}let s="",n=0;for(let i of r){let u=f.join(t,i);if(!(await S.stat(u).catch(()=>null))?.isDirectory())continue;let a=await Ot(f.join(u,"job.json"));if(!Ws(a))continue;let o=_s(a);o>=n&&(n=o,s=u);}return s}async function zs(e){let t=await Hs(e),r=t!==""?await wt(t):await wt(e.logDir),s=new Set;for(let n of r)if(ht(n.error)||ht(n.message)){let i=n.url;typeof i=="string"&&i&&s.add(i);}return [...s]}async function Js(e){let t=[];for(let r of e)if(r.startsWith("@")){let s=r.slice(1),n=await S.readFile(s,"utf8");t.push(...n.split(/\r?\n/).map(i=>i.trim()).filter(i=>i&&!i.startsWith("#")));}else t.push(r);return t}async function Gs(e){try{let t=await S.readFile(f.join(e.outputDir,"asset-map.json"),"utf8");return JSON.parse(t)}catch{return {}}}async function Vs(e){let t=["crawl.log.jsonl","current-crawl-event.json","rejected.jsonl","ignored.jsonl","skipped-http.jsonl","errors.jsonl","timings.jsonl","rejected.json","ignored.json","skipped-http.json","errors.json","timings.json"];await S.mkdir(e,{recursive:true}),await Promise.all(t.map(async r=>{try{await S.unlink(f.join(e,r));}catch(s){if(s.code!=="ENOENT")throw s}}));}function Pt(e,t,r,s,n){let i=A(e,r,e.sourceOrigin,s,"manual-url");i&&(de(i)?qe(e,t,i.toString(),s,n):k(e,i)?I(e,t,i.toString(),s,n):G(i)?le(e,t,i.toString(),s,n):s.reject("manual-url",i.toString(),"not page/sitemap/asset-like",n));}async function Ks(){let e=await Re(),t=$r(process.argv.slice(2));if(t.resumeRewrite&&t.mode!=="full")throw new Error("--resume-rewrite is only supported for full crawl/publish jobs.");let r=[];t.mode==="retry-timeouts"&&(r=await zs(e)),t.mode==="single-url"&&(r=await Js(t.urls));let s=t.crawlMode==="incremental"&&t.mode==="full",n=s&&typeof e.subscriptionType=="string"&&e.subscriptionType.trim()!=="",i=(t.mode==="full"||t.mode==="single-url")&&!t.resumeRewrite,u=t.mode!=="full"||t.resumeRewrite||n,l=u?await Gs(e):{},a=n||t.mode==="single-url"?await Ur(e):vt(),o={enabled:n,trackManifest:i,manifest:$e(a),previousManifest:$e(a),runId:`${Date.now()}`,seenPages:new Set,changeTokenCache:new Map,manifestSaveChain:Promise.resolve()};await Vs(e.logDir);let d={pageQueue:[],queuedPages:new Set,donePages:new Set,pageDiscoverySources:new Map,assetQueue:[],queuedAssets:new Set,doneAssets:new Set,sitemapQueue:[],queuedSitemaps:new Set,doneSitemaps:new Set,sitemapLastmodByPage:{},assetMap:{...l},assetVariantDigestsByOriginalPath:new Map,stats:{pagesQueued:0,pagesRendered:0,pagesCompleted:0,assetsQueued:0,sitemapsQueued:0,assetsSaved:0,pagesSaved:0}},p=Er();u||await S.rm(e.outputDir,{recursive:true,force:true}),await S.mkdir(e.outputDir,{recursive:true});let c=new ne(e.logDir,e.logLevel);if(s&&!n&&c.warn("Incremental crawl requested without active remote publisher subscription. Falling back to full crawl.",{requestedMode:t.crawlMode,subscriptionType:e.subscriptionType??null}),t.resumeRewrite)c.info("Resuming final rewrite from existing output.",{phase:"rewrite-text",mode:t.mode,crawlMode:t.crawlMode});else {let P=await request.newContext({ignoreHTTPSErrors:e.ignoreHttpsErrors});try{if(c.mark("discovery"),t.mode==="full"?(e.sitemapPaths.forEach(v=>qe(e,d,v,c)),await gt(e,P,d,c,p),e.seedPaths.forEach(v=>Pt(e,d,v,c,"seed-path")),e.generated404RequestPath&&le(e,d,e.generated404RequestPath,c,"generated-404-request-path")):(r.forEach(v=>Pt(e,d,v,c,"cli")),await gt(e,P,d,c,p)),c.endMark("discovery",{pages:d.pageQueue.length,assets:d.assetQueue.length,sitemaps:d.sitemapQueue.length}),c.summary(`Queued ${d.pageQueue.length} pages, ${d.assetQueue.length} assets, ${d.sitemapQueue.length} sitemaps.`,{mode:t.mode,crawlMode:t.crawlMode,queuedPages:d.pageQueue.length,queuedAssets:d.assetQueue.length,queuedSitemaps:d.sitemapQueue.length}),t.mode==="retry-timeouts"&&d.pageQueue.length===0&&d.assetQueue.length===0&&d.sitemapQueue.length===0){c.summary("No timed-out URLs were queued. Skipping retry crawl.",{mode:t.mode,crawlMode:t.crawlMode,queuedPages:0,queuedAssets:0,queuedSitemaps:0}),await c.flush();return}c.mark("render-pages");let y=Array.from({length:Math.max(1,e.concurrency)},()=>Qs(e,d,c,t.mode,P,o,p));if(await Promise.all(y),c.endMark("render-pages",{pages:d.stats.pagesCompleted}),c.mark("download-assets"),c.progress("Asset download phase started.",{phase:"download-assets",doneAssets:d.doneAssets.size,assetsQueued:d.stats.assetsQueued,assetQueue:d.assetQueue.length}),await Ts(e,P,d,c,o,p),c.endMark("download-assets",{assets:d.doneAssets.size}),o.enabled&&e.maxPages===0&&await Jr(e,d,o,c,p),t.mode==="full"){let v=await Cs(e,d,c);for(let x of v)q(p,e,x);}}finally{await M("dispose crawl request context",me(e),()=>P.dispose()).catch(y=>{c.warn("Timed out while disposing crawl request context",{error:String(y)});});}}o.trackManifest&&await K(e,o),await S.writeFile(f.join(e.outputDir,"asset-map.json"),JSON.stringify(d.assetMap,null,2),"utf8"),JSON.stringify(l,null,2)!==JSON.stringify(d.assetMap,null,2)&&q(p,e,f.join(e.outputDir,"asset-map.json"));let g=t.mode==="single-url"?rs(e,d):o.enabled&&!t.resumeRewrite?Gr(e,o,p,l,d.assetMap):void 0;c.mark("rewrite-text");let m=t.mode==="single-url"?`Rewriting text files touched by URL crawl: 0/${g?.length??0}`:"Rewriting text files...";c.progress(m,{phase:"rewrite-text",index:0,totalFiles:g?.length,changedTextFiles:0}),await dt(m);let w=Date.now(),h=await st(e,d.assetMap,{files:g,previousAssetMap:l,onStart:({totalFiles:P,workerCount:y})=>{c.info(`Rewrite phase scanning ${P} text files.`,{phase:"rewrite-text",totalFiles:P,workerCount:y});},onProgress:async({index:P,totalFiles:y,changedTextFiles:v,file:x,changed:L})=>{L&&q(p,e,f.join(e.outputDir,x)),c.checkpoint(`Rewriting text file ${P}/${y}`,{phase:"rewrite-text",index:P,totalFiles:y,changedTextFiles:v,file:x}),c.debug(`${L?"Rewrote":"Checked unchanged"} text file ${P}/${y}: ${x}`,{phase:"rewrite-text",index:P,totalFiles:y,changedTextFiles:v,file:x,changed:L});let T=Date.now();if(!(P===1||P===y||P%50===0||T-w>=5e3))return;w=T;let Q=`Rewriting text files: ${P}/${y}`;c.progress(Q,{phase:"rewrite-text",index:P,totalFiles:y,changedTextFiles:v,file:x}),await dt(Q);}});o.trackManifest&&(Vr(o,g),await K(e,o)),c.endMark("rewrite-text",{changedTextFiles:h});let C=o.enabled&&!t.resumeRewrite?await Yr(e,d,o,p,c):[];await Be(e,{generatedAt:new Date().toISOString(),outputDir:f.resolve(e.outputDir),runMode:t.mode,crawlMode:t.crawlMode,fullSyncRequired:!(o.enabled&&!t.resumeRewrite),changedFiles:o.enabled&&!t.resumeRewrite?[...p.changedFiles].sort():[],deletedFiles:o.enabled&&!t.resumeRewrite?C:[],rewriteTargets:o.enabled&&!t.resumeRewrite?[...new Set((g||[]).map(P=>ee(e.outputDir,f.isAbsolute(P)?P:f.join(e.outputDir,P))).filter(P=>P!==null))].sort():[]}),c.summary(t.resumeRewrite?`Done. Resumed final rewrite over existing output and changed ${h} text files.`:`Done. Rendered ${d.stats.pagesRendered} pages, processed ${d.doneSitemaps.size} sitemaps, downloaded ${d.doneAssets.size} assets.`,{mode:t.mode,crawlMode:t.crawlMode,resumeRewrite:t.resumeRewrite,...d.stats,pagesRendered:d.stats.pagesRendered,donePages:d.stats.pagesCompleted,claimedPages:d.donePages.size,doneSitemaps:d.doneSitemaps.size,doneAssets:d.doneAssets.size,changedTextFiles:h}),await c.flush();}Ks().catch(async e=>{console.error(e);try{let r=(await Re().catch(()=>null))?.logDir??"logs",s=new ne(r,"debug");s.error(`Unhandled error: ${e instanceof Error?e.message:String(e)}`,e instanceof Error?{stack:e.stack}:void 0),await s.flush();}catch{}process.exit(1);});
package/dist/deploy.js CHANGED
@@ -1,6 +1,6 @@
1
- import {S3Client,HeadObjectCommand,GetObjectCommand,DeleteObjectsCommand,ListObjectsV2Command}from'@aws-sdk/client-s3';import {Upload}from'@aws-sdk/lib-storage';import {createHash}from'crypto';import It from'fast-glob';import $ from'fs/promises';import b from'path';import sr from'mime-types';import at from'http';import lt from'https';import {availableParallelism}from'os';import {Worker}from'worker_threads';function Se(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function ut(e){let t=String(e??"").trim();if(!t)return "";let r=t;if(/^https?:\/\//i.test(r))try{r=new URL(r).pathname;}catch{return ""}if(r=r.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!r)return "";let n=r.endsWith("/"),i=r.replace(/^\/+/,"").split("/").map(o=>o.replace(/[^A-Za-z0-9._-]/g,"")).filter(o=>o.length>0&&o!=="."&&o!=="..");if(i.length===0)return "";let s=`/${i.join("/")}`;return n&&b.extname(s)===""&&(s+="/"),s==="/"?"":s}function oe(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function ct(e){if(!e||typeof e!="object")return {};let t={};for(let[r,n]of Object.entries(e)){let i=r.trim();if(!i||!n||typeof n!="object")continue;let s=n,o={};if(typeof s.targetOrigin=="string"){let a=Se(s.targetOrigin);a&&(o.targetOrigin=a);}let u=oe(s.extraReplacements);if(Object.keys(u).length>0&&(o.extraReplacements=u),s.s3&&typeof s.s3=="object"){let a={},c=s.s3;typeof c.bucket=="string"&&(a.bucket=c.bucket.trim()),typeof c.prefix=="string"&&(a.prefix=c.prefix.trim()),typeof c.region=="string"&&(a.region=c.region.trim()),typeof c.htmlCacheControl=="string"&&(a.htmlCacheControl=c.htmlCacheControl.trim()),typeof c.assetCacheControl=="string"&&(a.assetCacheControl=c.assetCacheControl.trim()),Object.keys(a).length>0&&(o.s3=a);}if(s.cloudFront&&typeof s.cloudFront=="object"){let a={},c=s.cloudFront;typeof c.distributionId=="string"&&(a.distributionId=c.distributionId.trim()),Array.isArray(c.invalidationPaths)&&(a.invalidationPaths=c.invalidationPaths.map(l=>String(l??"").trim()).filter(l=>l.length>0)),Object.keys(a).length>0&&(o.cloudFront=a);}t[i]=o;}return t}function ve(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function gt(e,t){if(!e||typeof e!="object")return null;let r=e,n=r.command;if(n!=="publish"&&n!=="crawl"&&n!=="deploy"&&n!=="invalidate"&&n!=="retry-timeouts"&&n!=="url")return null;let i=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(i)||i<1)return null;let s=String(r.id??`${n}-${t+1}`).trim();if(!s)return null;let o=String(r.deploymentProfile??"").trim(),u=String(r.url??"").trim();return {id:s,enabled:r.enabled!==false,command:n,intervalMinutes:i,...n==="publish"||n==="crawl"?{crawlMode:r.crawlMode==="incremental"?"incremental":"full"}:{},...(n==="publish"||n==="deploy"||n==="invalidate")&&o?{deploymentProfile:o}:{},...u?{url:u}:{}}}function Re(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((n,i)=>gt(n,i)).filter(n=>!!n):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:r}}function pt(e){if(!e||typeof e!="object")return;let t=e,r={};for(let i of ["accountId","siteId"]){let s=t[i];typeof s=="string"&&s.trim()!==""&&(r[i]=s.trim());}let n=Number(t.lastUpdate??0);return Number.isFinite(n)&&n>0&&(r.lastUpdate=Math.floor(n)),t.subscriber===true&&(r.subscriber=true),Object.keys(r).length>0?r:void 0}function le(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),n=String(t.siteId??"").trim(),i=t.subscriber===true,s=pt(t.siteSettings),o={...s??{},...r?{accountId:s?.accountId??r}:{},...n?{siteId:s?.siteId??n}:{},...s?.subscriber===true||i?{subscriber:true}:{}},u={},a=String(t.apiBase??"").trim();a&&(u.apiBase=a);let c=String(t.runtimeToken??t.nonce??"").trim();c&&(u.runtimeToken=c);let l=String(t.uploadUrl??"").trim();l&&(u.uploadUrl=l),Object.keys(o).length>0&&(u.siteSettings=o);let p=ve(t.subscriptionType);return p&&(u.subscriptionType=p),u}function dt(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function $e(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function ft(e,t){let r=new Headers(e instanceof Request?e.headers:void 0);if(t?.headers)for(let[n,i]of new Headers(t.headers).entries())r.set(n,i);return r}async function xe(e,t,r=5){let n=new URL($e(e)),i=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),s=n.protocol==="http:"?at:lt,o=ft(e,t);return await new Promise((u,a)=>{let c=s.request(n,{method:i,headers:Object.fromEntries(o.entries()),...n.protocol==="https:"?{rejectUnauthorized:false}:{}},l=>{let p=[];l.on("data",g=>{p.push(Buffer.isBuffer(g)?g:Buffer.from(g));}),l.on("error",a),l.on("end",()=>{let g=l.statusCode??0,d=l.headers.location;if(r>0&&d&&[301,302,303,307,308].includes(g)){u(xe(new URL(d,n),{method:g===303?"GET":i},r-1));return}let f=new Headers;for(let[y,P]of Object.entries(l.headers))Array.isArray(P)?f.set(y,P.join(", ")):typeof P=="string"&&f.set(y,P);u(new Response(Buffer.concat(p),{status:g,statusText:l.statusMessage??"",headers:f}));});});c.on("error",a),c.end();})}function ht(e){let t=le(e.wpsuite),r={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},n=String(r.accountId??"").trim(),i=String(r.siteId??"").trim(),s=String(t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...s?{uploadUrl:s}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!n||!i||!s)return false;dt(e.sourceOrigin);let o=globalThis,a={...o.WpSuite??{},siteSettings:r,uploadUrl:s};return t.apiBase&&(a.apiBase=t.apiBase),o.WpSuite=a,true}async function mt(e){if(!ht(e))return null;let t=String(e.wpsuite?.uploadUrl??"").trim(),r=globalThis.fetch;try{e.ignoreHttpsErrors&&typeof r=="function"&&t.startsWith("https://")&&(globalThis.fetch=(async(s,o)=>$e(s).startsWith(t)?xe(s,o):r(s,o)));let{getConfig:n}=await import('@smart-cloud/wpsuite-core'),i=await n("publisher");return i&&typeof i=="object"?i:null}catch{return null}finally{typeof r=="function"&&(globalThis.fetch=r);}}function wt(e,t){let r=ct(t?.deploymentProfiles),n=String(t?.defaultDeploymentProfile??"").trim(),i=r[n]?n:"",s=ve(t?.subscriptionType),o=le(e.wpsuite);return {...e,scheduler:Re(t?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:i,...s?{subscriptionType:s}:{},wpsuite:{...o,...o.siteSettings||s?{siteSettings:{...o.siteSettings??{},...o.siteSettings?.subscriber===true||s==="PROFESSIONAL"||s==="AGENCY"?{subscriber:true}:{}}}:{},...s?{subscriptionType:s}:{}}}}function ae(e,t){let n=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!n)return t;let i=n.split("/").map(s=>s.trim()).filter(s=>s.length>0&&s!=="."&&s!=="..");return i.length>0?i.join("/"):t}function yt(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?b.resolve(e):""}function Pe(e,t,r){let n=String(t||"").trim();return n&&b.isAbsolute(n)?b.resolve(n):b.resolve(e,ae(n,r))}async function ue(e){let t=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",r=await $.readFile(t,"utf8"),n=JSON.parse(r);n.sourceOrigin=n.sourceOrigin.replace(/\/$/,""),n.targetOrigin=Se(n.targetOrigin),n.ignoreHttpsErrors??=false,n.outputDir=String(n.outputDir||"export").trim()||"export",n.urlRewriteMode||=n.targetOrigin==="."?"relative":"absolute",n.noJavaScriptRenderPathPrefixes||=[],n.seedPaths||=[],n.generated404RequestPath=ut(n.generated404RequestPath),n.sitemapPaths||=["/sitemap_index.xml","/sitemap.xml"],n.allowedAssetHosts||=[],n.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],n.blockedPathPrefixes||=[],n.blockedSearchFragments||=[],n.concurrency||=1,n.maxPages||=0,n.extraReplacements=oe(n.extraReplacements),n.postCrawlCopyMap=oe(n.postCrawlCopyMap),n.logDir=String(n.logDir||"logs").trim()||"logs",n.verbose??=false,n.logLevel||=n.verbose?"debug":"info",n.s3SyncMode||="sdk-upload-delete",n.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},n.readiness.timeoutMs??=1500,n.readiness.fallbackWaitMs??=1500,n.viewport||={width:1440,height:1200},n.navigationTimeoutMs||=3e4,n.assetDownloadConcurrency=Number(n.assetDownloadConcurrency)>0?Number(n.assetDownloadConcurrency):n.concurrency,n.rewriteConcurrency=Number(n.rewriteConcurrency)>0?Number(n.rewriteConcurrency):n.assetDownloadConcurrency,n.wpsuite=le(n.wpsuite),n.scheduler=Re(void 0),n.deploymentProfiles={},n.defaultDeploymentProfile="",n.deploymentTargetOverride=String(n.deploymentTargetOverride??"").trim();let i=wt(n,await mt(n)),s=yt(),o=s?b.resolve(s,".."):"";return o?(i.outputDir=Pe(o,i.outputDir,"export"),i.logDir=Pe(o,i.logDir,"logs")):(b.isAbsolute(i.outputDir)||(i.outputDir=ae(i.outputDir,"export")),b.isAbsolute(i.logDir)||(i.logDir=ae(i.logDir,"logs"))),i}function bt(e){let t=e/6e4;if(Number.isInteger(t)&&t>=1)return `${t} minute${t===1?"":"s"}`;let r=Math.ceil(e/1e3);return `${r} second${r===1?"":"s"}`}async function E(e,t,r){let n=new AbortController,i=globalThis.setTimeout(()=>{n.abort(new Error(`${e} timed out after ${bt(t)}.`));},t);try{return await r({abortController:n,httpOptions:{abortSignal:n.signal,requestTimeout:t}})}finally{globalThis.clearTimeout(i);}}var Pt=".deploy-plan.json",St="deploy-plan.json";function vt(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?b.resolve(e):""}function Rt(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim();return !t||t==="."||t.startsWith("../")||t===".."?null:t}function ce(e){return [...new Set(e.map(Rt).filter(t=>t!==null))]}function $t(e,t){return {schemaVersion:1,generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:b.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:ce(t.changedFiles||[]),deletedFiles:ce(t.deletedFiles||[]),rewriteTargets:ce(t.rewriteTargets||[])}}function xt(e){if(!e||typeof e!="object")return false;let t=e;return t.schemaVersion===1&&typeof t.generatedAt=="string"&&typeof t.outputDir=="string"&&(t.runMode==="full"||t.runMode==="retry-timeouts"||t.runMode==="single-url")&&(t.crawlMode==="full"||t.crawlMode==="incremental")&&typeof t.fullSyncRequired=="boolean"&&Array.isArray(t.changedFiles)&&Array.isArray(t.deletedFiles)&&Array.isArray(t.rewriteTargets)}function Te(e){let t=b.join(b.resolve(e.outputDir),Pt),r=vt();return r?[b.join(r,St),t]:[t]}async function Ce(e){let t=b.resolve(e.outputDir);for(let r of Te(e))try{let n=await $.readFile(r,"utf8"),i=JSON.parse(n);if(!xt(i)||b.resolve(i.outputDir)!==t)continue;return $t(e,i)}catch{}return null}async function Ee(e){for(let t of Te(e))try{await $.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}function Dt(e){return typeof e.subscriptionType=="string"&&e.subscriptionType.trim()!==""}function Me(e){let t="";for(let n=0;n<e.length;n++){let i=e[n];if(i==="--profile"){let s=(e[n+1]||"").trim();if(!s)throw new Error("Missing value for --profile.");t=s,n+=1;}else if(i.startsWith("--profile=")){let s=i.slice(10).trim();if(!s)throw new Error("Missing value for --profile.");t=s;}}let r=String(process.env.PUBLISHER_DEPLOY_PROFILE||process.env.PUBLISHER_DEPLOYMENT_PROFILE||"").trim();return t||r||null}function Tt(e,t){return {...e,...t??{}}}function Ct(e,t){return {...e,...t??{},invalidationPaths:[...(t?.invalidationPaths??e.invalidationPaths)||[]]}}function ke(e,t){let r=String(t??e.deploymentTargetOverride??"").trim();if(!Dt(e)){if(r)throw new Error(`Deployment target "${r}" requires an active WPSuite subscription and remote publisher config.`);return {name:null,profile:null,config:e}}let n=String(r||e.defaultDeploymentProfile||"").trim();if(!n)return {name:null,profile:null,config:e};let i=e.deploymentProfiles?.[n];if(!i)throw new Error(`Unknown deployment profile "${n}". Check the linked WPSuite publisher configuration.`);return {name:n,profile:i,config:{...e,targetOrigin:i.targetOrigin??e.targetOrigin,s3:Tt(e.s3,i.s3),cloudFront:Ct(e.cloudFront,i.cloudFront)}}}var Le={error:0,warn:1,info:2,debug:3},Ie=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",V=Ie?b.join(Ie,"current-progress.json"):"",Oe=Promise.resolve();function je(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function Et(e,t){let r={...e},n=new Set(["pagesQueued","pagesRendered","assetsQueued","sitemapsQueued","pagesDiscovered","assetsDiscovered","sitemapsDiscovered","pagesSaved","assetsSaved","donePages","doneAssets","doneSitemaps","changedTextFiles","uploaded","failed","index","totalFiles","pageQueue","assetQueue","sitemapQueue"]);for(let[i,s]of Object.entries(t)){let o=r[i];if(typeof o=="number"&&typeof s=="number"&&n.has(i)){r[i]=Math.max(o,s);continue}r[i]=s;}return r}function Mt(e,t,r){V&&(Oe=Oe.then(async()=>{let n=new Date,i=n.toISOString();await $.mkdir(b.dirname(V),{recursive:true});let s=await $.readFile(V,"utf8").then(y=>JSON.parse(y)).catch(()=>null),o=s&&typeof s.details=="object"&&s.details?s.details:{},u=je(e),a=s?.currentStep||je(s?.source||""),c=s?.startedAt||i,l={...s?.stepDurationsSec??{}},p=s?.stepStartedAt||i;if(a&&a!==u&&s?.stepStartedAt){let y=Math.max(0,Math.round((n.getTime()-new Date(s.stepStartedAt).getTime())/1e3));l[a]=(l[a]??0)+y,p=i;}let g=Math.max(0,Math.round((n.getTime()-new Date(p).getTime())/1e3)),d=Math.max(0,Math.round((n.getTime()-new Date(c).getTime())/1e3)),f={checkedAt:i,source:e,message:t,details:Et(o,r??{}),startedAt:c,currentStep:u,stepStartedAt:p,stepElapsedSec:g,totalElapsedSec:d,stepDurationsSec:l};await $.writeFile(V,JSON.stringify(f,null,2),"utf8");}).catch(()=>{}));}async function kt(e,t){await $.mkdir(b.dirname(e),{recursive:true}),await $.appendFile(e,`${JSON.stringify(t)}
2
- `,"utf8");}var B=class{constructor(t,r,n="info"){this.logDir=t;this.logFile=r;this.level=n;this.ensureLogFileReady();}logDir;logFile;level;startedAt=Date.now();marks=new Map;initPromise=null;writeQueue=Promise.resolve();writeError=null;get logPath(){return b.join(this.logDir,this.logFile)}artifactPath(t){return this.logFile.endsWith(".log.jsonl")?b.join(this.logDir,this.logFile.replace(/\.log\.jsonl$/u,`${t}.jsonl`)):b.join(this.logDir,`${this.logFile}${t}.jsonl`)}get errorsPath(){return this.artifactPath(".errors")}get rejectedPath(){return this.artifactPath(".rejected")}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await $.mkdir(this.logDir,{recursive:true}),await $.writeFile(this.logPath,"","utf8");})()),this.initPromise}enqueueTask(t){this.writeQueue=this.writeQueue.then(t).catch(r=>{this.writeError=r instanceof Error?r:new Error(String(r));});}enqueueLine(t){this.enqueueTask(async()=>{await this.ensureLogFileReady(),await $.appendFile(this.logPath,`${t}
3
- `,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>kt(t,r));}accepts(t){return Le[t]<=Le[this.level]}push(t,r,n){if(!this.accepts(t))return;let i=JSON.stringify({time:new Date().toISOString(),level:t,message:r,...n||{}});this.enqueueLine(i),t==="error"?console.error(`[ERROR] ${r}`,n?JSON.stringify(n):""):t==="warn"?console.warn(`[WARN] ${r}`,n?JSON.stringify(n):""):console.log(`[${t.toUpperCase().padEnd(5)}] ${r}`);}info(t,r){this.push("info",t,r);}progress(t,r){Mt(this.logFile,t,r);}debug(t,r){this.push("debug",t,r);}warn(t,r){this.push("warn",t,r);}reject(t,r,n,i,s){let o={kind:t,url:r,reason:n,...i?{source:i}:{},...s||{}};this.enqueueJsonLine(this.rejectedPath,o),this.accepts("debug")&&this.push("debug",`Rejected ${t} ${r}: ${n}`,o);}error(t,r){this.enqueueJsonLine(this.errorsPath,{message:t,...r||{}}),this.push("error",t,r);}mark(t){this.marks.set(t,Date.now());}endMark(t,r){let n=this.marks.get(t);if(!n)return;let i=Date.now()-n,s=Number((i/1e3).toFixed(2));this.push("info",`Timing ${t}: ${s}s`,{name:t,ms:i,seconds:s,...r||{}});}async flush(){let t=Date.now()-this.startedAt,r=Number((t/1e3).toFixed(2));if(this.push("info",`Total time: ${r}s`,{name:"total",ms:t,seconds:r}),await this.writeQueue,this.writeError)throw this.writeError}};function _e(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(b.extname(e).toLowerCase())}function Ue(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 A(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Y(e){return e.replace(/\//g,"\\/")}function Fe(e){return e.replace(/\//g,"\\\\/")}function Lt(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 Ae(e,t,r){if(!t)return;e[t]=r;let n=Y(t),i=Y(r);e[n]=i;let s=Fe(t),o=Fe(r);e[s]=o;let u=A(t),a=A(r);e[u]=a;let c=A(n),l=A(i);e[c]=l;let p=A(s),g=A(o);e[p]=g;}function Z(e,t,r){Ae(e,t,r);let n=Lt(t);n&&n!==t&&Ae(e,n,r);}function Ne(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=b.dirname(b.resolve(t)),i=b.resolve(e,r.replace(/^\/+/,"")),s=b.relative(n,i).replace(/\\/g,"/");return s?(s.startsWith(".")||(s=`./${s}`),s):"."}var Ft=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],At=new Set([".html",".htm"]),qe="WPSuite.io Static Publisher",_t=qe.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Ut(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Nt(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function Wt(e,t,r){return Nt(t)?e.replace(new RegExp(`(?<!:)${Ut(t)}`,"g"),r):e.split(t).join(r)}function zt(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let i=b.extname(r).toLowerCase();return At.has(i)?/<head\b|<html\b|<!doctype html/i.test(t):false}function qt(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${_t}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${qe}" />`;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,GetObjectCommand,DeleteObjectsCommand,ListObjectsV2Command}from'@aws-sdk/client-s3';import {Upload}from'@aws-sdk/lib-storage';import It,{createHash}from'crypto';import Ft from'fast-glob';import $ from'fs/promises';import b from'path';import ur from'mime-types';import lt from'http';import ut from'https';import {availableParallelism}from'os';import {Worker}from'worker_threads';function ve(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function ct(e){let t=String(e??"").trim();if(!t)return "";let r=t;if(/^https?:\/\//i.test(r))try{r=new URL(r).pathname;}catch{return ""}if(r=r.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!r)return "";let n=r.endsWith("/"),i=r.replace(/^\/+/,"").split("/").map(o=>o.replace(/[^A-Za-z0-9._-]/g,"")).filter(o=>o.length>0&&o!=="."&&o!=="..");if(i.length===0)return "";let s=`/${i.join("/")}`;return n&&b.extname(s)===""&&(s+="/"),s==="/"?"":s}function ae(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function gt(e){if(!e||typeof e!="object")return {};let t={};for(let[r,n]of Object.entries(e)){let i=r.trim();if(!i||!n||typeof n!="object")continue;let s=n,o={};if(typeof s.targetOrigin=="string"){let a=ve(s.targetOrigin);a&&(o.targetOrigin=a);}let u=ae(s.extraReplacements);if(Object.keys(u).length>0&&(o.extraReplacements=u),s.s3&&typeof s.s3=="object"){let a={},c=s.s3;typeof c.bucket=="string"&&(a.bucket=c.bucket.trim()),typeof c.prefix=="string"&&(a.prefix=c.prefix.trim()),typeof c.region=="string"&&(a.region=c.region.trim()),typeof c.htmlCacheControl=="string"&&(a.htmlCacheControl=c.htmlCacheControl.trim()),typeof c.assetCacheControl=="string"&&(a.assetCacheControl=c.assetCacheControl.trim()),Object.keys(a).length>0&&(o.s3=a);}if(s.cloudFront&&typeof s.cloudFront=="object"){let a={},c=s.cloudFront;typeof c.distributionId=="string"&&(a.distributionId=c.distributionId.trim()),Array.isArray(c.invalidationPaths)&&(a.invalidationPaths=c.invalidationPaths.map(l=>String(l??"").trim()).filter(l=>l.length>0)),Object.keys(a).length>0&&(o.cloudFront=a);}t[i]=o;}return t}function Re(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function pt(e,t){if(!e||typeof e!="object")return null;let r=e,n=r.command;if(n!=="publish"&&n!=="crawl"&&n!=="deploy"&&n!=="invalidate"&&n!=="retry-timeouts"&&n!=="url")return null;let i=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(i)||i<1)return null;let s=String(r.id??`${n}-${t+1}`).trim();if(!s)return null;let o=String(r.deploymentProfile??"").trim(),u=String(r.url??"").trim();return {id:s,enabled:r.enabled!==false,command:n,intervalMinutes:i,...n==="publish"||n==="crawl"?{crawlMode:r.crawlMode==="incremental"?"incremental":"full"}:{},...(n==="publish"||n==="deploy"||n==="invalidate")&&o?{deploymentProfile:o}:{},...u?{url:u}:{}}}function $e(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((n,i)=>pt(n,i)).filter(n=>!!n):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:r}}function dt(e){if(!e||typeof e!="object")return;let t=e,r={};for(let i of ["accountId","siteId"]){let s=t[i];typeof s=="string"&&s.trim()!==""&&(r[i]=s.trim());}let n=Number(t.lastUpdate??0);return Number.isFinite(n)&&n>0&&(r.lastUpdate=Math.floor(n)),t.subscriber===true&&(r.subscriber=true),Object.keys(r).length>0?r:void 0}function ue(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),n=String(t.siteId??"").trim(),i=t.subscriber===true,s=dt(t.siteSettings),o={...s??{},...r?{accountId:s?.accountId??r}:{},...n?{siteId:s?.siteId??n}:{},...s?.subscriber===true||i?{subscriber:true}:{}},u={},a=String(t.apiBase??"").trim();a&&(u.apiBase=a);let c=String(t.runtimeToken??t.nonce??"").trim();c&&(u.runtimeToken=c);let l=String(t.uploadUrl??"").trim();l&&(u.uploadUrl=l),Object.keys(o).length>0&&(u.siteSettings=o);let p=Re(t.subscriptionType);return p&&(u.subscriptionType=p),u}function ft(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function xe(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function ht(e,t){let r=new Headers(e instanceof Request?e.headers:void 0);if(t?.headers)for(let[n,i]of new Headers(t.headers).entries())r.set(n,i);return r}async function De(e,t,r=5){let n=new URL(xe(e)),i=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),s=n.protocol==="http:"?lt:ut,o=ht(e,t);return await new Promise((u,a)=>{let c=s.request(n,{method:i,headers:Object.fromEntries(o.entries()),...n.protocol==="https:"?{rejectUnauthorized:false}:{}},l=>{let p=[];l.on("data",g=>{p.push(Buffer.isBuffer(g)?g:Buffer.from(g));}),l.on("error",a),l.on("end",()=>{let g=l.statusCode??0,d=l.headers.location;if(r>0&&d&&[301,302,303,307,308].includes(g)){u(De(new URL(d,n),{method:g===303?"GET":i},r-1));return}let f=new Headers;for(let[y,P]of Object.entries(l.headers))Array.isArray(P)?f.set(y,P.join(", ")):typeof P=="string"&&f.set(y,P);u(new Response(Buffer.concat(p),{status:g,statusText:l.statusMessage??"",headers:f}));});});c.on("error",a),c.end();})}function mt(e){let t=ue(e.wpsuite),r={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},n=String(r.accountId??"").trim(),i=String(r.siteId??"").trim(),s=String(t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...s?{uploadUrl:s}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!n||!i||!s)return false;ft(e.sourceOrigin);let o=globalThis,a={...o.WpSuite??{},siteSettings:r,uploadUrl:s};return t.apiBase&&(a.apiBase=t.apiBase),o.WpSuite=a,true}async function wt(e){if(!mt(e))return null;let t=String(e.wpsuite?.uploadUrl??"").trim(),r=globalThis.fetch;try{e.ignoreHttpsErrors&&typeof r=="function"&&t.startsWith("https://")&&(globalThis.fetch=(async(s,o)=>xe(s).startsWith(t)?De(s,o):r(s,o)));let{getConfig:n}=await import('@smart-cloud/wpsuite-core'),i=await n("publisher");return i&&typeof i=="object"?i:null}catch{return null}finally{typeof r=="function"&&(globalThis.fetch=r);}}function yt(e,t){let r=gt(t?.deploymentProfiles),n=String(t?.defaultDeploymentProfile??"").trim(),i=r[n]?n:"",s=Re(t?.subscriptionType),o=ue(e.wpsuite);return {...e,scheduler:$e(t?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:i,...s?{subscriptionType:s}:{},wpsuite:{...o,...o.siteSettings||s?{siteSettings:{...o.siteSettings??{},...o.siteSettings?.subscriber===true||s==="PROFESSIONAL"||s==="AGENCY"?{subscriber:true}:{}}}:{},...s?{subscriptionType:s}:{}}}}function le(e,t){let n=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!n)return t;let i=n.split("/").map(s=>s.trim()).filter(s=>s.length>0&&s!=="."&&s!=="..");return i.length>0?i.join("/"):t}function bt(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?b.resolve(e):""}function Se(e,t,r){let n=String(t||"").trim();return n&&b.isAbsolute(n)?b.resolve(n):b.resolve(e,le(n,r))}async function ce(e){let t=String("").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",r=await $.readFile(t,"utf8"),n=JSON.parse(r);n.sourceOrigin=n.sourceOrigin.replace(/\/$/,""),n.targetOrigin=ve(n.targetOrigin),n.ignoreHttpsErrors??=false,n.outputDir=String(n.outputDir||"export").trim()||"export",n.urlRewriteMode||=n.targetOrigin==="."?"relative":"absolute",n.noJavaScriptRenderPathPrefixes||=[],n.seedPaths||=[],n.generated404RequestPath=ct(n.generated404RequestPath),n.sitemapPaths||=["/sitemap_index.xml","/sitemap.xml"],n.allowedAssetHosts||=[],n.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],n.blockedPathPrefixes||=[],n.blockedSearchFragments||=[],n.concurrency||=1,n.maxPages||=0,n.extraReplacements=ae(n.extraReplacements),n.postCrawlCopyMap=ae(n.postCrawlCopyMap),n.logDir=String(n.logDir||"logs").trim()||"logs",n.verbose??=false,n.logLevel||=n.verbose?"debug":"info",n.s3SyncMode||="sdk-upload-delete",n.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},n.readiness.timeoutMs??=1500,n.readiness.fallbackWaitMs??=1500,n.viewport||={width:1440,height:1200},n.navigationTimeoutMs||=3e4,n.assetDownloadConcurrency=Number(n.assetDownloadConcurrency)>0?Number(n.assetDownloadConcurrency):n.concurrency,n.rewriteConcurrency=Number(n.rewriteConcurrency)>0?Number(n.rewriteConcurrency):n.assetDownloadConcurrency,n.wpsuite=ue(n.wpsuite),n.scheduler=$e(void 0),n.deploymentProfiles={},n.defaultDeploymentProfile="",n.deploymentTargetOverride=String(n.deploymentTargetOverride??"").trim();let i=yt(n,await wt(n)),s=bt(),o=s?b.resolve(s,".."):"";return o?(i.outputDir=Se(o,i.outputDir,"export"),i.logDir=Se(o,i.logDir,"logs")):(b.isAbsolute(i.outputDir)||(i.outputDir=le(i.outputDir,"export")),b.isAbsolute(i.logDir)||(i.logDir=le(i.logDir,"logs"))),i}function Pt(e){let t=e/6e4;if(Number.isInteger(t)&&t>=1)return `${t} minute${t===1?"":"s"}`;let r=Math.ceil(e/1e3);return `${r} second${r===1?"":"s"}`}async function M(e,t,r){let n=new AbortController,i=globalThis.setTimeout(()=>{n.abort(new Error(`${e} timed out after ${Pt(t)}.`));},t);try{return await r({abortController:n,httpOptions:{abortSignal:n.signal,requestTimeout:t}})}finally{globalThis.clearTimeout(i);}}var St=".deploy-plan.json",vt="deploy-plan.json";function Rt(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?b.resolve(e):""}function $t(e){let t=String(e||"").replace(/\\/g,"/").replace(/^\/+/,"").trim();return !t||t==="."||t.startsWith("../")||t===".."?null:t}function ge(e){return [...new Set(e.map($t).filter(t=>t!==null))]}function xt(e,t){return {schemaVersion:1,generatedAt:String(t.generatedAt||new Date().toISOString()),outputDir:b.resolve(e.outputDir),runMode:t.runMode,crawlMode:t.crawlMode,fullSyncRequired:!!t.fullSyncRequired,changedFiles:ge(t.changedFiles||[]),deletedFiles:ge(t.deletedFiles||[]),rewriteTargets:ge(t.rewriteTargets||[])}}function Dt(e){if(!e||typeof e!="object")return false;let t=e;return t.schemaVersion===1&&typeof t.generatedAt=="string"&&typeof t.outputDir=="string"&&(t.runMode==="full"||t.runMode==="retry-timeouts"||t.runMode==="single-url")&&(t.crawlMode==="full"||t.crawlMode==="incremental")&&typeof t.fullSyncRequired=="boolean"&&Array.isArray(t.changedFiles)&&Array.isArray(t.deletedFiles)&&Array.isArray(t.rewriteTargets)}function Ce(e){let t=b.join(b.resolve(e.outputDir),St),r=Rt();return r?[b.join(r,vt),t]:[t]}async function Ee(e){let t=b.resolve(e.outputDir);for(let r of Ce(e))try{let n=await $.readFile(r,"utf8"),i=JSON.parse(n);if(!Dt(i)||b.resolve(i.outputDir)!==t)continue;return xt(e,i)}catch{}return null}async function Me(e){for(let t of Ce(e))try{await $.unlink(t);}catch(r){if(r.code!=="ENOENT")throw r}}function Tt(e){return typeof e.subscriptionType=="string"&&e.subscriptionType.trim()!==""}function ke(e){let t="";for(let n=0;n<e.length;n++){let i=e[n];if(i==="--profile"){let s=(e[n+1]||"").trim();if(!s)throw new Error("Missing value for --profile.");t=s,n+=1;}else if(i.startsWith("--profile=")){let s=i.slice(10).trim();if(!s)throw new Error("Missing value for --profile.");t=s;}}let r=String(process.env.PUBLISHER_DEPLOY_PROFILE||process.env.PUBLISHER_DEPLOYMENT_PROFILE||"").trim();return t||r||null}function Ct(e,t){return {...e,...t??{}}}function Et(e,t){return {...e,...t??{},invalidationPaths:[...(t?.invalidationPaths??e.invalidationPaths)||[]]}}function Le(e,t){let r=String(t??e.deploymentTargetOverride??"").trim();if(!Tt(e)){if(r)throw new Error(`Deployment target "${r}" requires an active WPSuite subscription and remote publisher config.`);return {name:null,profile:null,config:e}}let n=String(r||e.defaultDeploymentProfile||"").trim();if(!n)return {name:null,profile:null,config:e};let i=e.deploymentProfiles?.[n];if(!i)throw new Error(`Unknown deployment profile "${n}". Check the linked WPSuite publisher configuration.`);return {name:n,profile:i,config:{...e,targetOrigin:i.targetOrigin??e.targetOrigin,s3:Ct(e.s3,i.s3),cloudFront:Et(e.cloudFront,i.cloudFront)}}}var Ie={error:0,warn:1,info:2,debug:3},Oe=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",Y=Oe?b.join(Oe,"current-progress.json"):"",je=Promise.resolve();function Fe(e){return e.includes("crawl")?"crawl":e.includes("deploy")?"deploy":e.includes("invalidate")?"invalidate":e}function Mt(e,t){let r={...e},n=new Set(["pagesQueued","pagesRendered","assetsQueued","sitemapsQueued","pagesDiscovered","assetsDiscovered","sitemapsDiscovered","pagesSaved","assetsSaved","donePages","doneAssets","doneSitemaps","changedTextFiles","uploaded","failed","index","totalFiles","pageQueue","assetQueue","sitemapQueue"]);for(let[i,s]of Object.entries(t)){let o=r[i];if(typeof o=="number"&&typeof s=="number"&&n.has(i)){r[i]=Math.max(o,s);continue}r[i]=s;}return r}function kt(e,t,r){Y&&(je=je.then(async()=>{let n=new Date,i=n.toISOString();await $.mkdir(b.dirname(Y),{recursive:true});let s=await $.readFile(Y,"utf8").then(y=>JSON.parse(y)).catch(()=>null),o=s&&typeof s.details=="object"&&s.details?s.details:{},u=Fe(e),a=s?.currentStep||Fe(s?.source||""),c=s?.startedAt||i,l={...s?.stepDurationsSec??{}},p=s?.stepStartedAt||i;if(a&&a!==u&&s?.stepStartedAt){let y=Math.max(0,Math.round((n.getTime()-new Date(s.stepStartedAt).getTime())/1e3));l[a]=(l[a]??0)+y,p=i;}let g=Math.max(0,Math.round((n.getTime()-new Date(p).getTime())/1e3)),d=Math.max(0,Math.round((n.getTime()-new Date(c).getTime())/1e3)),f={checkedAt:i,source:e,message:t,details:Mt(o,r??{}),startedAt:c,currentStep:u,stepStartedAt:p,stepElapsedSec:g,totalElapsedSec:d,stepDurationsSec:l};await $.writeFile(Y,JSON.stringify(f,null,2),"utf8");}).catch(()=>{}));}async function Lt(e,t){await $.mkdir(b.dirname(e),{recursive:true}),await $.appendFile(e,`${JSON.stringify(t)}
2
+ `,"utf8");}var H=class{constructor(t,r,n="info"){this.logDir=t;this.logFile=r;this.level=n;this.ensureLogFileReady();}logDir;logFile;level;startedAt=Date.now();marks=new Map;initPromise=null;writeQueue=Promise.resolve();writeError=null;get logPath(){return b.join(this.logDir,this.logFile)}artifactPath(t){return this.logFile.endsWith(".log.jsonl")?b.join(this.logDir,this.logFile.replace(/\.log\.jsonl$/u,`${t}.jsonl`)):b.join(this.logDir,`${this.logFile}${t}.jsonl`)}get errorsPath(){return this.artifactPath(".errors")}get rejectedPath(){return this.artifactPath(".rejected")}ensureLogFileReady(){return this.initPromise||(this.initPromise=(async()=>{await $.mkdir(this.logDir,{recursive:true}),await $.writeFile(this.logPath,"","utf8");})()),this.initPromise}enqueueTask(t){this.writeQueue=this.writeQueue.then(t).catch(r=>{this.writeError=r instanceof Error?r:new Error(String(r));});}enqueueLine(t){this.enqueueTask(async()=>{await this.ensureLogFileReady(),await $.appendFile(this.logPath,`${t}
3
+ `,"utf8");});}enqueueJsonLine(t,r){this.enqueueTask(()=>Lt(t,r));}accepts(t){return Ie[t]<=Ie[this.level]}push(t,r,n){if(!this.accepts(t))return;let i=JSON.stringify({time:new Date().toISOString(),level:t,message:r,...n||{}});this.enqueueLine(i),t==="error"?console.error(`[ERROR] ${r}`,n?JSON.stringify(n):""):t==="warn"?console.warn(`[WARN] ${r}`,n?JSON.stringify(n):""):console.log(`[${t.toUpperCase().padEnd(5)}] ${r}`);}info(t,r){this.push("info",t,r);}progress(t,r){kt(this.logFile,t,r);}debug(t,r){this.push("debug",t,r);}warn(t,r){this.push("warn",t,r);}reject(t,r,n,i,s){let o={kind:t,url:r,reason:n,...i?{source:i}:{},...s||{}};this.enqueueJsonLine(this.rejectedPath,o),this.accepts("debug")&&this.push("debug",`Rejected ${t} ${r}: ${n}`,o);}error(t,r){this.enqueueJsonLine(this.errorsPath,{message:t,...r||{}}),this.push("error",t,r);}mark(t){this.marks.set(t,Date.now());}endMark(t,r){let n=this.marks.get(t);if(!n)return;let i=Date.now()-n,s=Number((i/1e3).toFixed(2));this.push("info",`Timing ${t}: ${s}s`,{name:t,ms:i,seconds:s,...r||{}});}async flush(){let t=Date.now()-this.startedAt,r=Number((t/1e3).toFixed(2));if(this.push("info",`Total time: ${r}s`,{name:"total",ms:t,seconds:r}),await this.writeQueue,this.writeError)throw this.writeError}};async function Ot(e){await $.mkdir(b.dirname(e),{recursive:true});}async function Ue(e,t,r){await Ot(e);let n=b.join(b.dirname(e),`.${b.basename(e)}.${process.pid}.${Date.now()}.${It.randomBytes(6).toString("hex")}.tmp`);try{typeof t=="string"?await $.writeFile(n,t,r??"utf8"):await $.writeFile(n,t),await $.rename(n,e);}catch(i){throw await $.unlink(n).catch(()=>{}),i}}function Ne(e){return [".html",".htm",".css",".js",".mjs",".json",".xml",".xsl",".txt",".svg",".map",".enc",".jws"].includes(b.extname(e).toLowerCase())}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 _(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Z(e){return e.replace(/\//g,"\\/")}function Ae(e){return e.replace(/\//g,"\\\\/")}function jt(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 _e(e,t,r){if(!t)return;e[t]=r;let n=Z(t),i=Z(r);e[n]=i;let s=Ae(t),o=Ae(r);e[s]=o;let u=_(t),a=_(r);e[u]=a;let c=_(n),l=_(i);e[c]=l;let p=_(s),g=_(o);e[p]=g;}function X(e,t,r){_e(e,t,r);let n=jt(t);n&&n!==t&&_e(e,n,r);}function ze(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function Be(e,t,r){if(!t)return r;let n=b.dirname(b.resolve(t)),i=b.resolve(e,r.replace(/^\/+/,"")),s=b.relative(n,i).replace(/\\/g,"/");return s?(s.startsWith(".")||(s=`./${s}`),s):"."}var Nt=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],Wt=new Set([".html",".htm"]),qe="WPSuite.io Static Publisher",zt=qe.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Bt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function qt(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function Ht(e,t,r){return qt(t)?e.replace(new RegExp(`(?<!:)${Bt(t)}`,"g"),r):e.split(t).join(r)}function Jt(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let i=b.extname(r).toLowerCase();return Wt.has(i)?/<head\b|<html\b|<!doctype html/i.test(t):false}function Kt(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${zt}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${qe}" />`;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
4
4
  `)?`\r
5
5
  `:`
6
- `;return e.replace(/<head\b[^>]*>/i,i=>`${i}${n} ${t}`)}function Bt(e){let t=Ue(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function Ht(e,t){let r=[...new Set(t)].filter(s=>s.includes("/")&&!/\\+\//.test(s)).map(s=>[s,Y(s)]).filter(([s,o])=>s!==o).sort((s,o)=>o[0].length-s[0].length);if(!r.length)return e;let n=s=>{let o=s;for(let[u,a]of r)o=o.split(u).join(a);return o},i=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(s,o,u,a)=>`${o}${n(u)}${a}`);return i=i.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(s,o,u,a,c)=>Bt(a)?`${o}${n(a)}${c}`:s),i}function Jt(e,t){if(!t)return null;let r=b.dirname(b.resolve(t)),n=b.resolve(e.outputDir),i=b.relative(r,n).replace(/\\/g,"/");return i?(i.startsWith(".")||(i=`./${i}`),i.endsWith("/")?i:`${i}/`):"./"}function Kt(e,t,r){let n=Jt(t,r);if(!n)return e;let i=e;for(let s of Ft){let o=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),u=new RegExp(`(?:\\.{1,}/)+${o}`,"g"),a=new RegExp(`(?<!\\.)/${o}`,"g");i=i.replace(u,`${n}${s}`).replace(a,`${n}${s}`);let c=s.replace(/\//g,"\\/"),l=n.replace(/\//g,"\\/"),p=c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),g=new RegExp(`(?:\\.{1,}\\\\/)+${p}`,"g"),d=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${p}`,"g"),f=new RegExp(`(?<![\\.\\\\])\\/${p}`,"g");i=i.replace(g,`${l}${c}`).replace(d,`${l}${c}`).replace(f,`${l}${c}`);}return i}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}})(),i=n?n.pathname:Ne(t,e.targetOrigin),s=n?`${n.search}${n.hash}`:"";return e.urlRewriteMode==="root-relative"?`${i}${s}`:`${We(e.outputDir,r,i)}${s}`}function ge(e,t,r,n,i){Z(e,r,pe(t,n,i));}function Gt(e,t,r,n,i){if(!r||r===n)return;Z(e,r,n);let s=pe(t,r,i),o=pe(t,n,i);Z(e,s,o);}function Qt(e,t,r,n,i={}){let s=e,o={};ge(o,t,t.sourceOrigin,t.targetOrigin,n);for(let[a,c]of Object.entries(t.extraReplacements))ge(o,t,a,c,n);for(let[a,c]of Object.entries(r))ge(o,t,a,c,n);for(let[a,c]of Object.entries(i)){let l=r[a];!l||l===c||Gt(o,t,c,l,n);}let u=Object.entries(o).sort((a,c)=>c[0].length-a[0].length);for(let[a,c]of u)s=Wt(s,a,c);return t.urlRewriteMode!=="absolute"&&(s=Kt(s,t,n)),s=Ht(s,u.map(([,a])=>a)),zt(t,s,n)&&(s=qt(s)),s}async function Vt(e,t,r,n){let i=b.join(e.outputDir,n),s=b.extname(i).toLowerCase(),o;try{o=await $.readFile(i,"utf8");}catch(c){if(c.code!=="ENOENT")throw c;return {changed:false}}let a=Qt(o,e,t,s===".js"||s===".mjs"?void 0:i,r);return a!==o?(await $.writeFile(i,a,"utf8"),{changed:true}):{changed:false}}async function Yt(e,t){return await new Promise((r,n)=>{let i=a=>{if(u(),a?.error){n(new Error(a.error));return}r({changed:!!a?.changed});},s=a=>{u(),n(a);},o=a=>{u(),a!==0&&n(new Error(`Rewrite worker exited with code ${a}.`));},u=()=>{e.off("message",i),e.off("error",s),e.off("exit",o);};e.on("message",i),e.on("error",s),e.on("exit",o),e.postMessage({file:t});})}async function Be(e,t,r={}){let i=(r.files?[...new Set(r.files)].map(g=>b.resolve(g)).filter(g=>g.startsWith(b.resolve(e.outputDir))).map(g=>b.relative(e.outputDir,g).replace(/\\/g,"/")).filter(g=>g.length>0):await It(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(g=>g!=="asset-map.json"&&_e(g)),s=0;if(i.length===0)return 0;let o=Math.max(1,Number(e.rewriteConcurrency||e.assetDownloadConcurrency||1)),u=Math.max(1,Math.min(o,i.length,availableParallelism()));await r.onStart?.({totalFiles:i.length,workerCount:u});let a=0,c=0,l=null;if(u===1){for(let g of i){let d=await Vt(e,t,r.previousAssetMap??{},g);d.changed&&(s+=1),c+=1,await r.onProgress?.({index:c,totalFiles:i.length,changedTextFiles:s,file:g,changed:d.changed});}return s}let p=Array.from({length:u},async()=>{let g=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:e,assetMap:t,previousAssetMap:r.previousAssetMap??{}}});try{for(;!l;){let d=a;if(d>=i.length)return;a+=1;let f=i[d],y=await Yt(g,f);y.changed&&(s+=1),c+=1,await r.onProgress?.({index:c,totalFiles:i.length,changedTextFiles:s,file:f,changed:y.changed});}}catch(d){throw l=d instanceof Error?d:new Error(String(d)),l}finally{await g.terminate().catch(()=>{});}});return await Promise.all(p),s}var Ge="wpsuite-sha256",Qe="wpsuite-normalized-sha256",or=/(?:^|[-_:.])(id|uid|nonce|token|hash|instance)(?:$|[-_:.])/i,ye=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,ar=["SIGINT","SIGTERM"],te=new Set,X=new Map,He=null;function lr(e){te.add(e);let t=false;return ()=>{t||(t=true,te.delete(e));}}async function ur(){let e=[...te];e.length!==0&&await Promise.allSettled(e.map(async t=>{te.delete(t),await $.rm(t,{recursive:true,force:true});}));}function cr(){if(!(X.size>0))for(let e of ar){let t=()=>{He||(He=ur().finally(()=>{for(let[r,n]of X)process.off(r,n);X.clear(),process.exit(1);}));};X.set(e,t),process.on(e,t);}}cr();function gr(e,t){let r=t.trim();return r?b.join(b.resolve(r),"crawl-manifest.json"):b.join(b.resolve(e),".crawl-manifest.json")}function Ve(e){return b.normalize(e).split(b.sep).join("/")}function Je(e,t){let r=b.relative(b.resolve(e),b.resolve(t));return !r||r.startsWith("..")||b.isAbsolute(r)?null:Ve(r)}async function pr(e,t,r){let n=gr(e.outputDir,t),i;try{i=await $.readFile(n,"utf8");}catch(l){return l.code==="ENOENT"?(r.warn("Deploy rewrite guard disabled because the crawl manifest is missing.",{manifestPath:n,source:"deploy-guard"}),null):(r.warn("Deploy rewrite guard disabled because the crawl manifest could not be read.",{manifestPath:n,error:l instanceof Error?l.message:String(l),source:"deploy-guard"}),null)}let s;try{s=JSON.parse(i);}catch(l){return r.warn("Deploy rewrite guard disabled because the crawl manifest is invalid JSON.",{manifestPath:n,error:l instanceof Error?l.message:String(l),source:"deploy-guard"}),null}let o=new Map,u=new Map,a=0,c=0;for(let[l,p]of Object.entries(s.pages||{})){let g=String(p?.outputPath||"").trim(),d=g?Je(e.outputDir,g):null;if(d){let f=typeof p?.contentType=="string"&&p.contentType?p.contentType:null;f&&u.set(d,f);}!g||p?.rewriteComplete===true||d&&(a++,o.has(d)||o.set(d,{kind:"page",sourceUrl:l,outputPath:b.resolve(g),relativePath:d}));}for(let[l,p]of Object.entries(s.assets||{})){let g=String(p?.outputPath||"").trim(),d=p?.isText===true,f=g?Je(e.outputDir,g):null;if(f){let y=typeof p?.contentType=="string"&&p.contentType?p.contentType:null;y&&u.set(f,y);}!g||!d||p?.rewriteComplete===true||f&&(c++,o.has(f)||o.set(f,{kind:"asset",sourceUrl:l,outputPath:b.resolve(g),relativePath:f}));}return {manifestPath:n,byRelativePath:o,contentTypeByRelativePath:u,pendingPages:a,pendingTextAssets:c}}function dr(e){return e&&(ye.test(e)?"__uuid__":/^[0-9a-f]{6,}$/i.test(e)?"__hex__":/^[0-9]{8,}$/.test(e)?"__num__":/^(?=.*[a-z])(?=.*\d)[a-z0-9]{8,}$/i.test(e)?"__alnum__":e)}function fe(e){return e.split(/([_:.\-/=?&#]+)/g).map((t,r)=>r%2===1?t:dr(t)).join("")}function fr(e){return e.split(/([_:.\-/=?&#]+)/g).map((t,r)=>r%2===1?t:ye.test(t)?"__uuid__":/^[0-9a-f]{6,}$/i.test(t)?"__hex__":/^[0-9]{6,}$/.test(t)?"__num__":/^[a-z0-9_-]{6,}$/i.test(t)?"__id__":t).join("")}function re(e,t){return Array.isArray(e)?e.map(r=>re(r,t)):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([r,n])=>[r,re(n,r)])):typeof e!="string"?e:t&&or.test(t)?fr(e):ye.test(e)?"__uuid__":/^[0-9a-f]{6,}$/i.test(e)||/^[0-9]{8,}$/.test(e)?fe(e):e}function hr(e){return e.replace(/((?:https?:\/\/[^"'\s>]+|\/)(?:wp-content|wp-includes)\/[^"'\s>?]+)\?ver=[A-Za-z0-9._-]+(?=$|[#"'])/gi,"$1")}function mr(e,t){let r=t.trim();if((r.startsWith("{")||r.startsWith("[")||r.startsWith('"'))&&e.startsWith("data-"))try{let i=JSON.parse(r);return JSON.stringify(re(i))}catch{}if(e.startsWith("data-")&&/^[A-Za-z0-9+/=]+$/.test(r))try{let i=Buffer.from(r,"base64").toString("utf8"),s=JSON.parse(i),o=JSON.stringify(re(s));return Buffer.from(o,"utf8").toString("base64")}catch{}return t}function wr(e,t){let r=e.toLowerCase();return r==="class"?t.split(/(\s+)/).map((n,i)=>i%2===1?n:fe(n)).join(""):r==="id"||r==="for"||r==="aria-controls"||r==="aria-labelledby"||r==="aria-describedby"||r==="aria-owns"||r==="aria-activedescendant"||r==="name"?fe(t):r==="href"||r==="src"?hr(t):mr(r,t)}function yr(e){return e.replace(/<([a-z][^\s/>]*)([^<>]*?)>/gi,(t,r,n)=>{if(r.startsWith("/"))return t;let i=n.replace(/\s([:@a-zA-Z_][-:.a-zA-Z0-9_]*?)=(['"])([\s\S]*?)\2/g,(s,o,u,a)=>{let c=wr(o,a);return ` ${o}=${u}${c}${u}`});return `<${r}${i}>`})}function de(e){let t=b.extname(e).toLowerCase();return [".html",".htm",".xml",".xsl",".txt"].includes(t)||["robots.txt","sitemap.xml"].includes(b.basename(e))}function ee(e,t){return [e.replace(/^\/+|\/+$/g,""),t.replace(/^\/+/,"")].filter(Boolean).join("/")}async function br(e,t,r,n){let i=new Map,s,o=0;do{o++;let u=await E(`S3 list objects page ${o} for s3://${t}/${r||""}`,3e5,({httpOptions:a})=>e.send(new ListObjectsV2Command({Bucket:t,Prefix:r||void 0,ContinuationToken:s}),a));for(let a of u.Contents||[]){if(!a.Key)continue;let c=(a.ETag||"").replace(/^"|"$/g,"").toLowerCase(),l=Number(a.Size??0);i.set(a.Key,{etag:c,size:l});}s=u.NextContinuationToken,n.debug(`Listed S3 keys page ${o}: ${i.size} keys so far`);}while(s);return i}async function Pr(e,t,r,n){if(n.has(r))return n.get(r)??null;try{let i=await E(`S3 head object ${r}`,3e5,({httpOptions:o})=>e.send(new HeadObjectCommand({Bucket:t,Key:r}),o)),s={etag:(i.ETag||"").replace(/^"|"$/g,"").toLowerCase(),size:Number(i.ContentLength??0)};return n.set(r,s),s}catch{return n.set(r,null),null}}async function Ye(e,t,r,n){let i=[...new Set(Array.from(r).filter(Boolean))];if(i.length===0)return n.info("No stale S3 objects to delete."),[];n.info(`Deleting ${i.length} stale S3 object(s)\u2026`);for(let s=0;s<i.length;s+=1e3){let o=i.slice(s,s+1e3);if(o.length!==0){await E(`S3 delete objects batch ${Math.floor(s/1e3)+1}`,3e5,({httpOptions:u})=>e.send(new DeleteObjectsCommand({Bucket:t,Delete:{Objects:o.map(a=>({Key:a}))}}),u)),n.info(`Deleted batch of ${o.length} object(s).`);for(let u of o)n.debug(` deleted: ${u}`);}}return i}async function Sr(e,t,r,n,i){return Ye(e,t,Array.from(r).filter(s=>!n.has(s)),i)}function vr(e){return createHash("md5").update(e).digest("hex")}function Ke(e){return createHash("sha256").update(e).digest("hex")}function he(e){return createHash("sha256").update(yr(e.toString("utf8"))).digest("hex")}async function Rr(e,t,r,n){if(n.has(r))return n.get(r)??null;try{let o=((await E(`S3 head object metadata ${r}`,3e5,({httpOptions:u})=>e.send(new HeadObjectCommand({Bucket:t,Key:r}),u))).Metadata?.[Ge]||"").trim().toLowerCase()||null;return n.set(r,o),o}catch{return n.set(r,null),null}}async function $r(e,t,r,n,i){if(n.has(r))return n.get(r)??null;try{let o=((await E(`S3 head object normalized metadata ${r}`,3e5,({httpOptions:u})=>e.send(new HeadObjectCommand({Bucket:t,Key:r}),u))).Metadata?.[Qe]||"").trim().toLowerCase();if(o)return n.set(r,o),o}catch{return n.set(r,null),null}if(i.has(r)){let s=i.get(r)??null;return n.set(r,s),s}try{let o=await(await E(`S3 get object ${r}`,3e5,({httpOptions:a})=>e.send(new GetObjectCommand({Bucket:t,Key:r}),a))).Body?.transformToByteArray(),u=o?he(Buffer.from(o)):null;return i.set(r,u),n.set(r,u),u}catch{return i.set(r,null),n.set(r,null),null}}function xr(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")||"profile"}function Dr(e,t){let r=e,n=Object.entries(t).sort((i,s)=>s[0].length-i[0].length);for(let[i,s]of n)i&&(r=r.split(i).join(s));return r}async function Tr(e,t,r,n){let i=b.join(e,"asset-map.json"),s;try{s=await $.readFile(i,"utf8");}catch(a){if(a.code==="ENOENT")return;throw a}let o=JSON.parse(s);if(!o||typeof o!="object")return;let u=Object.fromEntries(Object.entries(o).map(([a,c])=>{let l=String(c??"");return t.urlRewriteMode==="absolute"&&t.targetOrigin&&r.targetOrigin&&t.targetOrigin!==r.targetOrigin&&(l=l.split(t.targetOrigin).join(r.targetOrigin)),l=Dr(l,n),[a,l]}));await $.writeFile(i,JSON.stringify(u,null,2),"utf8");}async function Cr(e,t,r,n,i){let s=e.targetOrigin!==t.targetOrigin,o=Object.keys(n).length>0;if(!r||!s&&!o)return {outputDir:e.outputDir,cleanup:async()=>{}};if(s&&e.urlRewriteMode!=="absolute")throw new Error(`Deployment profile "${r}" changes targetOrigin, but the base crawl output must use urlRewriteMode "absolute" for multi-target redeploys.`);let u=b.join(b.dirname(e.outputDir),`.deploy-profile-${xr(r)}-${Date.now()}`),a=lr(u);i.info(`Preparing deployment profile "${r}" from existing crawl output to ${u}...`);try{await $.rm(u,{recursive:!0,force:!0}),await $.cp(e.outputDir,u,{recursive:!0});let c={...e,sourceOrigin:e.targetOrigin,targetOrigin:t.targetOrigin,extraReplacements:n,outputDir:u},l=1;i.info(`Rewriting text files for deployment profile "${r}"...`);let p=await Be(c,{},{onStart:({totalFiles:g,workerCount:d})=>{l=d,i.info(`Rewriting ${g} text file(s) for deployment profile "${r}" with ${d} worker(s).`);},onProgress:({index:g,totalFiles:d,changedTextFiles:f,file:y,changed:P})=>{let R=`Rewriting [${g}/${d}] ${y} (${P?"rewrote":"checked"}; ${f} changed so far)`;d<=200||g<=5||g%10===0||g===d?(i.progress(R,{file:y,index:g,totalFiles:d,changed:P,changedTextFiles:f,workerCount:l}),i.info(R)):i.debug(R);}});return await Tr(u,e,t,n),i.info(`Prepared deployment profile "${r}" in ${u} (${p} rewritten text file(s)).`),{outputDir:u,cleanup:async()=>{a(),await $.rm(u,{recursive:!0,force:!0});}}}catch(c){throw i.error(`Failed to prepare deployment profile "${r}" temporary output.`,{tempDir:u,outputDir:e.outputDir,error:c instanceof Error?c.message:String(c),...c instanceof Error&&c.stack?{stack:c.stack}:{}}),await $.rm(u,{recursive:true,force:true}).catch(()=>{}),a(),await i.flush().catch(()=>{}),c}}async function Er(){let e=await ue(),t=Me(process.argv.slice(2)),r=ke(e,t),n=b.resolve(r.config.logDir||"logs"),i=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",s=i?b.join(b.resolve(i),"deploy-diff.json"):"",o=new B(n,"deploy.log.jsonl",r.config.logLevel??"info"),u=r.profile?.extraReplacements??{},a=async()=>{};try{let c=await Cr(e,r.config,r.name,u,o);a=c.cleanup;let l={...r.config,outputDir:c.outputDir},p=l.s3SyncMode??"sdk-upload-delete",g=await Ce(e),d=c.outputDir!==e.outputDir&&(e.targetOrigin!==r.config.targetOrigin||Object.keys(u).length>0),f=!!g&&!g.fullSyncRequired&&!d;r.name&&o.info(`Using deployment profile: ${r.name}`),o.info(`Starting deploy \u2014 s3://${l.s3.bucket}/${l.s3.prefix||""} (region: ${l.s3.region})`),o.info(`S3 sync mode: ${p}`),g&&g.fullSyncRequired?o.info("Deploy plan requests a full sync; scanning the whole output tree."):g&&d?o.info("Ignoring incremental deploy plan because deployment-profile rewrites require a full sync."):f&&o.info(`Using incremental deploy plan: ${g.changedFiles.length} changed file(s), ${g.deletedFiles.length} deleted file(s).`),o.mark("deploy");let y=new S3Client({region:l.s3.region}),P=c.outputDir===e.outputDir?await pr(e,i,o):null,O=f?(await Promise.all(g.changedFiles.map(async w=>{try{return (await $.stat(b.join(l.outputDir,w))).isFile()?w:null}catch{return null}}))).filter(w=>w!==null):await It(["**/*"],{cwd:l.outputDir,onlyFiles:!0,dot:!0}),R=[],J=[],m=O.filter(w=>{let L=P?.byRelativePath.get(Ve(w));if(!L)return !0;let h=ee(l.s3.prefix,w);return R.push(w),J.push(h),o.reject(L.kind,L.sourceUrl||w,"rewrite not completed; deploy upload blocked","deploy-guard",{file:w,key:h,outputPath:L.outputPath,manifestPath:P?.manifestPath}),!1}),Ze=f?new Set:new Set(O.map(w=>ee(l.s3.prefix,w)));P&&(P.pendingPages>0||P.pendingTextAssets>0)&&o.info(`Deploy rewrite guard loaded ${P.pendingPages} pending page(s) and ${P.pendingTextAssets} pending text asset(s) from crawl manifest.`,{manifestPath:P.manifestPath,pendingPages:P.pendingPages,pendingTextAssets:P.pendingTextAssets,source:"deploy-guard"}),R.length>0&&o.warn(`Deploy rewrite guard blocked ${R.length} file(s) from upload because final crawl rewrite is incomplete.`,{rejected:R.length,manifestPath:P?.manifestPath,source:"deploy-guard"}),f?o.info(`Using ${m.length} eligible planned changed file(s) from deploy plan for upload${R.length>0?` (${R.length} blocked by deploy rewrite guard)`:""}.`):o.info(`Found ${O.length} file(s) in output directory "${l.outputDir}"${R.length>0?`; ${m.length} remain eligible for upload after deploy rewrite guard filtering`:""}.`),o.progress("Deploy preflight: comparing local output with remote S3 state.",{phase:"deploy",mode:p,totalFiles:m.length,scannedFiles:O.length,rejected:R.length,deploymentProfile:r.name||"",s3Bucket:l.s3.bucket,s3Prefix:l.s3.prefix||"",targetedPlan:f,deployGuardEnabled:c.outputDir===e.outputDir});let x=0,v=0,k=0,ne=[],U=[],ie=[],K=[],N=new Map,Xe=new Map,et=new Map,tt=new Map,rt=new Map;f||(o.info("Listing existing S3 objects to detect unchanged files..."),N=await br(y,l.s3.bucket,l.s3.prefix,o),o.info(`Found ${N.size} existing key(s) in S3.`));let nt=async w=>N.has(w)?N.get(w)??null:f?Pr(y,l.s3.bucket,w,Xe):null;for(let w of m){let L=b.join(l.outputDir,w),h=ee(l.s3.prefix,w),G=P?.contentTypeByRelativePath.get(w),W=G&&G!=="application/octet-stream"?G:sr.lookup(w)||G||"application/octet-stream",it=de(w)?l.s3.htmlCacheControl:l.s3.assetCacheControl,S=x+v+k+1;m.length<=200||S<=5||S%10===0||S===m.length?(o.progress(`Uploading [${S}/${m.length}] ${h} (${W})`,{file:w,key:h,index:S,totalFiles:m.length,contentType:W,mode:p}),o.info(`Uploading [${S}/${m.length}] ${h} (${W})`)):o.debug(`Uploading [${S}/${m.length}] ${h} (${W})`);try{let D=await $.readFile(L),z=await nt(h),q=null,j=null;if(z){let se=D.byteLength;if(z.size===se){let Q=z.etag.includes("-");if(z.etag!==""&&!Q){let st=vr(D);if(z.etag===st){v++,m.length<=200||v<=5||v%25===0?(o.progress(`Skipped unchanged [${S}/${m.length}] ${h}`,{file:w,key:h,index:S,totalFiles:m.length,uploaded:x,skipped:v,failed:k,mode:p,reason:"etag-md5-match"}),o.info(`Skipped unchanged [${S}/${m.length}] ${h}`)):o.debug(`Skipped unchanged [${S}/${m.length}] ${h}`),U.push(h);continue}}q=Ke(D);let be=await Rr(y,l.s3.bucket,h,et);if(be&&be===q){v++,m.length<=200||v<=5||v%25===0?(o.progress(`Skipped unchanged [${S}/${m.length}] ${h}`,{file:w,key:h,index:S,totalFiles:m.length,uploaded:x,skipped:v,failed:k,mode:p,reason:"metadata-sha256-match"}),o.info(`Skipped unchanged [${S}/${m.length}] ${h}`)):o.debug(`Skipped unchanged [${S}/${m.length}] ${h}`),U.push(h);continue}}if(de(w)){j=he(D);let Q=await $r(y,l.s3.bucket,h,tt,rt);if(Q&&Q===j){v++,m.length<=200||v<=5||v%25===0?(o.progress(`Skipped semantically unchanged [${S}/${m.length}] ${h}`,{file:w,key:h,index:S,totalFiles:m.length,uploaded:x,skipped:v,failed:k,mode:p,reason:"normalized-html-match"}),o.info(`Skipped semantically unchanged [${S}/${m.length}] ${h}`)):o.debug(`Skipped semantically unchanged [${S}/${m.length}] ${h}`),U.push(h);continue}}}q=q??Ke(D),j=j??(de(w)?he(D):null),await E(`S3 upload ${h}`,9e5,({abortController:se})=>new Upload({client:y,abortController:se,params:{Bucket:l.s3.bucket,Key:h,Body:D,ContentType:W,CacheControl:it,Metadata:{[Ge]:q,...j?{[Qe]:j}:{}}}}).done()),x++,ne.push(h),(x%25===0||x===m.length)&&(o.progress(`Uploaded ${x}/${m.length} file(s)\u2026`,{uploaded:x,skipped:v,failed:k,totalFiles:m.length,mode:p}),o.info(`Uploaded ${x}/${m.length} file(s)\u2026`));}catch(D){k++,ie.push(h),o.error(`Failed to upload ${h}: ${D.message}`,{key:h,error:String(D)});}}o.info(`Upload complete: ${x} uploaded, ${v} skipped unchanged, ${J.length} rejected by guard, ${k} failed.`),p==="sdk-upload-delete"?f?K=await Ye(y,l.s3.bucket,g.deletedFiles.map(w=>ee(l.s3.prefix,w)),o):K=await Sr(y,l.s3.bucket,N.keys(),Ze,o):o.info("Sync mode is sdk-upload-only \u2014 skipping stale object deletion."),s&&(await $.mkdir(b.dirname(s),{recursive:!0}),await $.writeFile(s,JSON.stringify({generatedAt:new Date().toISOString(),mode:p,summary:{totalFiles:O.length,eligibleFiles:m.length,uploaded:ne.length,skipped:U.length,rejected:J.length,failed:ie.length,deleted:K.length,...r.name?{profile:r.name}:{}},uploadedKeys:ne,skippedKeys:U,rejectedKeys:J,failedKeys:ie,deletedKeys:K},null,2),"utf8")),await Ee(e),o.endMark("deploy"),await o.flush();}finally{await a().catch(()=>{});}}Er().catch(async e=>{console.error(e);try{let r=(await ue().catch(()=>null))?.logDir??"logs",n=new B(r,"deploy.log.jsonl","debug");n.error(`Unhandled error: ${e instanceof Error?e.message:String(e)}`,e instanceof Error?{stack:e.stack}:void 0),await n.flush();}catch{}process.exit(1);});
6
+ `;return e.replace(/<head\b[^>]*>/i,i=>`${i}${n} ${t}`)}function Gt(e){let t=We(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function Qt(e,t){let r=[...new Set(t)].filter(s=>s.includes("/")&&!/\\+\//.test(s)).map(s=>[s,Z(s)]).filter(([s,o])=>s!==o).sort((s,o)=>o[0].length-s[0].length);if(!r.length)return e;let n=s=>{let o=s;for(let[u,a]of r)o=o.split(u).join(a);return o},i=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(s,o,u,a)=>`${o}${n(u)}${a}`);return i=i.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(s,o,u,a,c)=>Gt(a)?`${o}${n(a)}${c}`:s),i}function Vt(e,t){if(!t)return null;let r=b.dirname(b.resolve(t)),n=b.resolve(e.outputDir),i=b.relative(r,n).replace(/\\/g,"/");return i?(i.startsWith(".")||(i=`./${i}`),i.endsWith("/")?i:`${i}/`):"./"}function Yt(e,t,r){let n=Vt(t,r);if(!n)return e;let i=e;for(let s of Nt){let o=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),u=new RegExp(`(?:\\.{1,}/)+${o}`,"g"),a=new RegExp(`(?<!\\.)/${o}`,"g");i=i.replace(u,`${n}${s}`).replace(a,`${n}${s}`);let c=s.replace(/\//g,"\\/"),l=n.replace(/\//g,"\\/"),p=c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),g=new RegExp(`(?:\\.{1,}\\\\/)+${p}`,"g"),d=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${p}`,"g"),f=new RegExp(`(?<![\\.\\\\])\\/${p}`,"g");i=i.replace(g,`${l}${c}`).replace(d,`${l}${c}`).replace(f,`${l}${c}`);}return i}function de(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}})(),i=n?n.pathname:ze(t,e.targetOrigin),s=n?`${n.search}${n.hash}`:"";return e.urlRewriteMode==="root-relative"?`${i}${s}`:`${Be(e.outputDir,r,i)}${s}`}function pe(e,t,r,n,i){X(e,r,de(t,n,i));}function Zt(e,t,r,n,i){if(!r||r===n)return;X(e,r,n);let s=de(t,r,i),o=de(t,n,i);X(e,s,o);}function Xt(e,t,r,n,i={}){let s=e,o={};pe(o,t,t.sourceOrigin,t.targetOrigin,n);for(let[a,c]of Object.entries(t.extraReplacements))pe(o,t,a,c,n);for(let[a,c]of Object.entries(r))pe(o,t,a,c,n);for(let[a,c]of Object.entries(i)){let l=r[a];!l||l===c||Zt(o,t,c,l,n);}let u=Object.entries(o).sort((a,c)=>c[0].length-a[0].length);for(let[a,c]of u)s=Ht(s,a,c);return t.urlRewriteMode!=="absolute"&&(s=Yt(s,t,n)),s=Qt(s,u.map(([,a])=>a)),Jt(t,s,n)&&(s=Kt(s)),s}async function er(e,t,r,n){let i=b.join(e.outputDir,n),s=b.extname(i).toLowerCase(),o;try{o=await $.readFile(i,"utf8");}catch(c){if(c.code!=="ENOENT")throw c;return {changed:false}}let a=Xt(o,e,t,s===".js"||s===".mjs"?void 0:i,r);return a!==o?(await Ue(i,a,"utf8"),{changed:true}):{changed:false}}async function tr(e,t){return await new Promise((r,n)=>{let i=a=>{if(u(),a?.error){n(new Error(a.error));return}r({changed:!!a?.changed});},s=a=>{u(),n(a);},o=a=>{u(),a!==0&&n(new Error(`Rewrite worker exited with code ${a}.`));},u=()=>{e.off("message",i),e.off("error",s),e.off("exit",o);};e.on("message",i),e.on("error",s),e.on("exit",o),e.postMessage({file:t});})}async function He(e,t,r={}){let i=(r.files?[...new Set(r.files)].map(g=>b.resolve(g)).filter(g=>g.startsWith(b.resolve(e.outputDir))).map(g=>b.relative(e.outputDir,g).replace(/\\/g,"/")).filter(g=>g.length>0):await Ft(["**/*"],{cwd:e.outputDir,onlyFiles:true,dot:true})).filter(g=>g!=="asset-map.json"&&Ne(g)),s=0;if(i.length===0)return 0;let o=Math.max(1,Number(e.rewriteConcurrency||e.assetDownloadConcurrency||1)),u=Math.max(1,Math.min(o,i.length,availableParallelism()));await r.onStart?.({totalFiles:i.length,workerCount:u});let a=0,c=0,l=null;if(u===1){for(let g of i){let d=await er(e,t,r.previousAssetMap??{},g);d.changed&&(s+=1),c+=1,await r.onProgress?.({index:c,totalFiles:i.length,changedTextFiles:s,file:g,changed:d.changed});}return s}let p=Array.from({length:u},async()=>{let g=new Worker(new URL("./rewrite-worker.js",import.meta.url),{workerData:{config:e,assetMap:t,previousAssetMap:r.previousAssetMap??{}}});try{for(;!l;){let d=a;if(d>=i.length)return;a+=1;let f=i[d],y=await tr(g,f);y.changed&&(s+=1),c+=1,await r.onProgress?.({index:c,totalFiles:i.length,changedTextFiles:s,file:f,changed:y.changed});}}catch(d){throw l=d instanceof Error?d:new Error(String(d)),l}finally{await g.terminate().catch(()=>{});}});return await Promise.all(p),s}var Qe="wpsuite-sha256",Ve="wpsuite-normalized-sha256",cr=/(?:^|[-_:.])(id|uid|nonce|token|hash|instance)(?:$|[-_:.])/i,be=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,gr=["SIGINT","SIGTERM"],re=new Set,ee=new Map,Je=null;function pr(e){re.add(e);let t=false;return ()=>{t||(t=true,re.delete(e));}}async function dr(){let e=[...re];e.length!==0&&await Promise.allSettled(e.map(async t=>{re.delete(t),await $.rm(t,{recursive:true,force:true});}));}function fr(){if(!(ee.size>0))for(let e of gr){let t=()=>{Je||(Je=dr().finally(()=>{for(let[r,n]of ee)process.off(r,n);ee.clear(),process.exit(1);}));};ee.set(e,t),process.on(e,t);}}fr();function hr(e,t){let r=t.trim();return r?b.join(b.resolve(r),"crawl-manifest.json"):b.join(b.resolve(e),".crawl-manifest.json")}function Ye(e){return b.normalize(e).split(b.sep).join("/")}function Ke(e,t){let r=b.relative(b.resolve(e),b.resolve(t));return !r||r.startsWith("..")||b.isAbsolute(r)?null:Ye(r)}async function mr(e,t,r){let n=hr(e.outputDir,t),i;try{i=await $.readFile(n,"utf8");}catch(l){return l.code==="ENOENT"?(r.warn("Deploy rewrite guard disabled because the crawl manifest is missing.",{manifestPath:n,source:"deploy-guard"}),null):(r.warn("Deploy rewrite guard disabled because the crawl manifest could not be read.",{manifestPath:n,error:l instanceof Error?l.message:String(l),source:"deploy-guard"}),null)}let s;try{s=JSON.parse(i);}catch(l){return r.warn("Deploy rewrite guard disabled because the crawl manifest is invalid JSON.",{manifestPath:n,error:l instanceof Error?l.message:String(l),source:"deploy-guard"}),null}let o=new Map,u=new Map,a=0,c=0;for(let[l,p]of Object.entries(s.pages||{})){let g=String(p?.outputPath||"").trim(),d=g?Ke(e.outputDir,g):null;if(d){let f=typeof p?.contentType=="string"&&p.contentType?p.contentType:null;f&&u.set(d,f);}!g||p?.rewriteComplete===true||d&&(a++,o.has(d)||o.set(d,{kind:"page",sourceUrl:l,outputPath:b.resolve(g),relativePath:d}));}for(let[l,p]of Object.entries(s.assets||{})){let g=String(p?.outputPath||"").trim(),d=p?.isText===true,f=g?Ke(e.outputDir,g):null;if(f){let y=typeof p?.contentType=="string"&&p.contentType?p.contentType:null;y&&u.set(f,y);}!g||!d||p?.rewriteComplete===true||f&&(c++,o.has(f)||o.set(f,{kind:"asset",sourceUrl:l,outputPath:b.resolve(g),relativePath:f}));}return {manifestPath:n,byRelativePath:o,contentTypeByRelativePath:u,pendingPages:a,pendingTextAssets:c}}function wr(e){return e&&(be.test(e)?"__uuid__":/^[0-9a-f]{6,}$/i.test(e)?"__hex__":/^[0-9]{8,}$/.test(e)?"__num__":/^(?=.*[a-z])(?=.*\d)[a-z0-9]{8,}$/i.test(e)?"__alnum__":e)}function he(e){return e.split(/([_:.\-/=?&#]+)/g).map((t,r)=>r%2===1?t:wr(t)).join("")}function yr(e){return e.split(/([_:.\-/=?&#]+)/g).map((t,r)=>r%2===1?t:be.test(t)?"__uuid__":/^[0-9a-f]{6,}$/i.test(t)?"__hex__":/^[0-9]{6,}$/.test(t)?"__num__":/^[a-z0-9_-]{6,}$/i.test(t)?"__id__":t).join("")}function ne(e,t){return Array.isArray(e)?e.map(r=>ne(r,t)):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([r,n])=>[r,ne(n,r)])):typeof e!="string"?e:t&&cr.test(t)?yr(e):be.test(e)?"__uuid__":/^[0-9a-f]{6,}$/i.test(e)||/^[0-9]{8,}$/.test(e)?he(e):e}function br(e){return e.replace(/((?:https?:\/\/[^"'\s>]+|\/)(?:wp-content|wp-includes)\/[^"'\s>?]+)\?ver=[A-Za-z0-9._-]+(?=$|[#"'])/gi,"$1")}function Pr(e,t){let r=t.trim();if((r.startsWith("{")||r.startsWith("[")||r.startsWith('"'))&&e.startsWith("data-"))try{let i=JSON.parse(r);return JSON.stringify(ne(i))}catch{}if(e.startsWith("data-")&&/^[A-Za-z0-9+/=]+$/.test(r))try{let i=Buffer.from(r,"base64").toString("utf8"),s=JSON.parse(i),o=JSON.stringify(ne(s));return Buffer.from(o,"utf8").toString("base64")}catch{}return t}function Sr(e,t){let r=e.toLowerCase();return r==="class"?t.split(/(\s+)/).map((n,i)=>i%2===1?n:he(n)).join(""):r==="id"||r==="for"||r==="aria-controls"||r==="aria-labelledby"||r==="aria-describedby"||r==="aria-owns"||r==="aria-activedescendant"||r==="name"?he(t):r==="href"||r==="src"?br(t):Pr(r,t)}function vr(e){return e.replace(/<([a-z][^\s/>]*)([^<>]*?)>/gi,(t,r,n)=>{if(r.startsWith("/"))return t;let i=n.replace(/\s([:@a-zA-Z_][-:.a-zA-Z0-9_]*?)=(['"])([\s\S]*?)\2/g,(s,o,u,a)=>{let c=Sr(o,a);return ` ${o}=${u}${c}${u}`});return `<${r}${i}>`})}function fe(e){let t=b.extname(e).toLowerCase();return [".html",".htm",".xml",".xsl",".txt"].includes(t)||["robots.txt","sitemap.xml"].includes(b.basename(e))}function te(e,t){return [e.replace(/^\/+|\/+$/g,""),t.replace(/^\/+/,"")].filter(Boolean).join("/")}async function Rr(e,t,r,n){let i=new Map,s,o=0;do{o++;let u=await M(`S3 list objects page ${o} for s3://${t}/${r||""}`,3e5,({httpOptions:a})=>e.send(new ListObjectsV2Command({Bucket:t,Prefix:r||void 0,ContinuationToken:s}),a));for(let a of u.Contents||[]){if(!a.Key)continue;let c=(a.ETag||"").replace(/^"|"$/g,"").toLowerCase(),l=Number(a.Size??0);i.set(a.Key,{etag:c,size:l});}s=u.NextContinuationToken,n.debug(`Listed S3 keys page ${o}: ${i.size} keys so far`);}while(s);return i}async function $r(e,t,r,n){if(n.has(r))return n.get(r)??null;try{let i=await M(`S3 head object ${r}`,3e5,({httpOptions:o})=>e.send(new HeadObjectCommand({Bucket:t,Key:r}),o)),s={etag:(i.ETag||"").replace(/^"|"$/g,"").toLowerCase(),size:Number(i.ContentLength??0)};return n.set(r,s),s}catch{return n.set(r,null),null}}async function Ze(e,t,r,n){let i=[...new Set(Array.from(r).filter(Boolean))];if(i.length===0)return n.info("No stale S3 objects to delete."),[];n.info(`Deleting ${i.length} stale S3 object(s)\u2026`);for(let s=0;s<i.length;s+=1e3){let o=i.slice(s,s+1e3);if(o.length!==0){await M(`S3 delete objects batch ${Math.floor(s/1e3)+1}`,3e5,({httpOptions:u})=>e.send(new DeleteObjectsCommand({Bucket:t,Delete:{Objects:o.map(a=>({Key:a}))}}),u)),n.info(`Deleted batch of ${o.length} object(s).`);for(let u of o)n.debug(` deleted: ${u}`);}}return i}async function xr(e,t,r,n,i){return Ze(e,t,Array.from(r).filter(s=>!n.has(s)),i)}function Dr(e){return createHash("md5").update(e).digest("hex")}function Ge(e){return createHash("sha256").update(e).digest("hex")}function me(e){return createHash("sha256").update(vr(e.toString("utf8"))).digest("hex")}async function Tr(e,t,r,n){if(n.has(r))return n.get(r)??null;try{let o=((await M(`S3 head object metadata ${r}`,3e5,({httpOptions:u})=>e.send(new HeadObjectCommand({Bucket:t,Key:r}),u))).Metadata?.[Qe]||"").trim().toLowerCase()||null;return n.set(r,o),o}catch{return n.set(r,null),null}}async function Cr(e,t,r,n,i){if(n.has(r))return n.get(r)??null;try{let o=((await M(`S3 head object normalized metadata ${r}`,3e5,({httpOptions:u})=>e.send(new HeadObjectCommand({Bucket:t,Key:r}),u))).Metadata?.[Ve]||"").trim().toLowerCase();if(o)return n.set(r,o),o}catch{return n.set(r,null),null}if(i.has(r)){let s=i.get(r)??null;return n.set(r,s),s}try{let o=await(await M(`S3 get object ${r}`,3e5,({httpOptions:a})=>e.send(new GetObjectCommand({Bucket:t,Key:r}),a))).Body?.transformToByteArray(),u=o?me(Buffer.from(o)):null;return i.set(r,u),n.set(r,u),u}catch{return i.set(r,null),n.set(r,null),null}}function Er(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")||"profile"}function Mr(e,t){let r=e,n=Object.entries(t).sort((i,s)=>s[0].length-i[0].length);for(let[i,s]of n)i&&(r=r.split(i).join(s));return r}async function kr(e,t,r,n){let i=b.join(e,"asset-map.json"),s;try{s=await $.readFile(i,"utf8");}catch(a){if(a.code==="ENOENT")return;throw a}let o=JSON.parse(s);if(!o||typeof o!="object")return;let u=Object.fromEntries(Object.entries(o).map(([a,c])=>{let l=String(c??"");return t.urlRewriteMode==="absolute"&&t.targetOrigin&&r.targetOrigin&&t.targetOrigin!==r.targetOrigin&&(l=l.split(t.targetOrigin).join(r.targetOrigin)),l=Mr(l,n),[a,l]}));await $.writeFile(i,JSON.stringify(u,null,2),"utf8");}async function Lr(e,t,r,n,i){let s=e.targetOrigin!==t.targetOrigin,o=Object.keys(n).length>0;if(!r||!s&&!o)return {outputDir:e.outputDir,cleanup:async()=>{}};if(s&&e.urlRewriteMode!=="absolute")throw new Error(`Deployment profile "${r}" changes targetOrigin, but the base crawl output must use urlRewriteMode "absolute" for multi-target redeploys.`);let u=b.join(b.dirname(e.outputDir),`.deploy-profile-${Er(r)}-${Date.now()}`),a=pr(u);i.info(`Preparing deployment profile "${r}" from existing crawl output to ${u}...`);try{await $.rm(u,{recursive:!0,force:!0}),await $.cp(e.outputDir,u,{recursive:!0});let c={...e,sourceOrigin:e.targetOrigin,targetOrigin:t.targetOrigin,extraReplacements:n,outputDir:u},l=1;i.info(`Rewriting text files for deployment profile "${r}"...`);let p=await He(c,{},{onStart:({totalFiles:g,workerCount:d})=>{l=d,i.info(`Rewriting ${g} text file(s) for deployment profile "${r}" with ${d} worker(s).`);},onProgress:({index:g,totalFiles:d,changedTextFiles:f,file:y,changed:P})=>{let R=`Rewriting [${g}/${d}] ${y} (${P?"rewrote":"checked"}; ${f} changed so far)`;d<=200||g<=5||g%10===0||g===d?(i.progress(R,{file:y,index:g,totalFiles:d,changed:P,changedTextFiles:f,workerCount:l}),i.info(R)):i.debug(R);}});return await kr(u,e,t,n),i.info(`Prepared deployment profile "${r}" in ${u} (${p} rewritten text file(s)).`),{outputDir:u,cleanup:async()=>{a(),await $.rm(u,{recursive:!0,force:!0});}}}catch(c){throw i.error(`Failed to prepare deployment profile "${r}" temporary output.`,{tempDir:u,outputDir:e.outputDir,error:c instanceof Error?c.message:String(c),...c instanceof Error&&c.stack?{stack:c.stack}:{}}),await $.rm(u,{recursive:true,force:true}).catch(()=>{}),a(),await i.flush().catch(()=>{}),c}}async function Ir(){let e=await ce(),t=ke(process.argv.slice(2)),r=Le(e,t),n=b.resolve(r.config.logDir||"logs"),i=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",s=i?b.join(b.resolve(i),"deploy-diff.json"):"",o=new H(n,"deploy.log.jsonl",r.config.logLevel??"info"),u=r.profile?.extraReplacements??{},a=async()=>{};try{let c=await Lr(e,r.config,r.name,u,o);a=c.cleanup;let l={...r.config,outputDir:c.outputDir},p=l.s3SyncMode??"sdk-upload-delete",g=await Ee(e),d=c.outputDir!==e.outputDir&&(e.targetOrigin!==r.config.targetOrigin||Object.keys(u).length>0),f=!!g&&!g.fullSyncRequired&&!d;r.name&&o.info(`Using deployment profile: ${r.name}`),o.info(`Starting deploy \u2014 s3://${l.s3.bucket}/${l.s3.prefix||""} (region: ${l.s3.region})`),o.info(`S3 sync mode: ${p}`),g&&g.fullSyncRequired?o.info("Deploy plan requests a full sync; scanning the whole output tree."):g&&d?o.info("Ignoring incremental deploy plan because deployment-profile rewrites require a full sync."):f&&o.info(`Using incremental deploy plan: ${g.changedFiles.length} changed file(s), ${g.deletedFiles.length} deleted file(s).`),o.mark("deploy");let y=new S3Client({region:l.s3.region}),P=c.outputDir===e.outputDir?await mr(e,i,o):null,j=f?(await Promise.all(g.changedFiles.map(async w=>{try{return (await $.stat(b.join(l.outputDir,w))).isFile()?w:null}catch{return null}}))).filter(w=>w!==null):await Ft(["**/*"],{cwd:l.outputDir,onlyFiles:!0,dot:!0}),R=[],K=[],m=j.filter(w=>{let I=P?.byRelativePath.get(Ye(w));if(!I)return !0;let h=te(l.s3.prefix,w);return R.push(w),K.push(h),o.reject(I.kind,I.sourceUrl||w,"rewrite not completed; deploy upload blocked","deploy-guard",{file:w,key:h,outputPath:I.outputPath,manifestPath:P?.manifestPath}),!1}),Xe=f?new Set:new Set(j.map(w=>te(l.s3.prefix,w)));P&&(P.pendingPages>0||P.pendingTextAssets>0)&&o.info(`Deploy rewrite guard loaded ${P.pendingPages} pending page(s) and ${P.pendingTextAssets} pending text asset(s) from crawl manifest.`,{manifestPath:P.manifestPath,pendingPages:P.pendingPages,pendingTextAssets:P.pendingTextAssets,source:"deploy-guard"}),R.length>0&&o.warn(`Deploy rewrite guard blocked ${R.length} file(s) from upload because final crawl rewrite is incomplete.`,{rejected:R.length,manifestPath:P?.manifestPath,source:"deploy-guard"}),f?o.info(`Using ${m.length} eligible planned changed file(s) from deploy plan for upload${R.length>0?` (${R.length} blocked by deploy rewrite guard)`:""}.`):o.info(`Found ${j.length} file(s) in output directory "${l.outputDir}"${R.length>0?`; ${m.length} remain eligible for upload after deploy rewrite guard filtering`:""}.`),o.progress("Deploy preflight: comparing local output with remote S3 state.",{phase:"deploy",mode:p,totalFiles:m.length,scannedFiles:j.length,rejected:R.length,deploymentProfile:r.name||"",s3Bucket:l.s3.bucket,s3Prefix:l.s3.prefix||"",targetedPlan:f,deployGuardEnabled:c.outputDir===e.outputDir});let x=0,v=0,L=0,ie=[],N=[],se=[],G=[],W=new Map,et=new Map,tt=new Map,rt=new Map,nt=new Map;f||(o.info("Listing existing S3 objects to detect unchanged files..."),W=await Rr(y,l.s3.bucket,l.s3.prefix,o),o.info(`Found ${W.size} existing key(s) in S3.`));let it=async w=>W.has(w)?W.get(w)??null:f?$r(y,l.s3.bucket,w,et):null;for(let w of m){let I=b.join(l.outputDir,w),h=te(l.s3.prefix,w),Q=P?.contentTypeByRelativePath.get(w),z=Q&&Q!=="application/octet-stream"?Q:ur.lookup(w)||Q||"application/octet-stream",st=fe(w)?l.s3.htmlCacheControl:l.s3.assetCacheControl,S=x+v+L+1;m.length<=200||S<=5||S%10===0||S===m.length?(o.progress(`Uploading [${S}/${m.length}] ${h} (${z})`,{file:w,key:h,index:S,totalFiles:m.length,contentType:z,mode:p}),o.info(`Uploading [${S}/${m.length}] ${h} (${z})`)):o.debug(`Uploading [${S}/${m.length}] ${h} (${z})`);try{let D=await $.readFile(I),B=await it(h),q=null,F=null;if(B){let oe=D.byteLength;if(B.size===oe){let V=B.etag.includes("-");if(B.etag!==""&&!V){let ot=Dr(D);if(B.etag===ot){v++,m.length<=200||v<=5||v%25===0?(o.progress(`Skipped unchanged [${S}/${m.length}] ${h}`,{file:w,key:h,index:S,totalFiles:m.length,uploaded:x,skipped:v,failed:L,mode:p,reason:"etag-md5-match"}),o.info(`Skipped unchanged [${S}/${m.length}] ${h}`)):o.debug(`Skipped unchanged [${S}/${m.length}] ${h}`),N.push(h);continue}}q=Ge(D);let Pe=await Tr(y,l.s3.bucket,h,tt);if(Pe&&Pe===q){v++,m.length<=200||v<=5||v%25===0?(o.progress(`Skipped unchanged [${S}/${m.length}] ${h}`,{file:w,key:h,index:S,totalFiles:m.length,uploaded:x,skipped:v,failed:L,mode:p,reason:"metadata-sha256-match"}),o.info(`Skipped unchanged [${S}/${m.length}] ${h}`)):o.debug(`Skipped unchanged [${S}/${m.length}] ${h}`),N.push(h);continue}}if(fe(w)){F=me(D);let V=await Cr(y,l.s3.bucket,h,rt,nt);if(V&&V===F){v++,m.length<=200||v<=5||v%25===0?(o.progress(`Skipped semantically unchanged [${S}/${m.length}] ${h}`,{file:w,key:h,index:S,totalFiles:m.length,uploaded:x,skipped:v,failed:L,mode:p,reason:"normalized-html-match"}),o.info(`Skipped semantically unchanged [${S}/${m.length}] ${h}`)):o.debug(`Skipped semantically unchanged [${S}/${m.length}] ${h}`),N.push(h);continue}}}q=q??Ge(D),F=F??(fe(w)?me(D):null),await M(`S3 upload ${h}`,9e5,({abortController:oe})=>new Upload({client:y,abortController:oe,params:{Bucket:l.s3.bucket,Key:h,Body:D,ContentType:z,CacheControl:st,Metadata:{[Qe]:q,...F?{[Ve]:F}:{}}}}).done()),x++,ie.push(h),(x%25===0||x===m.length)&&(o.progress(`Uploaded ${x}/${m.length} file(s)\u2026`,{uploaded:x,skipped:v,failed:L,totalFiles:m.length,mode:p}),o.info(`Uploaded ${x}/${m.length} file(s)\u2026`));}catch(D){L++,se.push(h),o.error(`Failed to upload ${h}: ${D.message}`,{key:h,error:String(D)});}}o.info(`Upload complete: ${x} uploaded, ${v} skipped unchanged, ${K.length} rejected by guard, ${L} failed.`),p==="sdk-upload-delete"?f?G=await Ze(y,l.s3.bucket,g.deletedFiles.map(w=>te(l.s3.prefix,w)),o):G=await xr(y,l.s3.bucket,W.keys(),Xe,o):o.info("Sync mode is sdk-upload-only \u2014 skipping stale object deletion."),s&&(await $.mkdir(b.dirname(s),{recursive:!0}),await $.writeFile(s,JSON.stringify({generatedAt:new Date().toISOString(),mode:p,summary:{totalFiles:j.length,eligibleFiles:m.length,uploaded:ie.length,skipped:N.length,rejected:K.length,failed:se.length,deleted:G.length,...r.name?{profile:r.name}:{}},uploadedKeys:ie,skippedKeys:N,rejectedKeys:K,failedKeys:se,deletedKeys:G},null,2),"utf8")),await Me(e),o.endMark("deploy"),await o.flush();}finally{await a().catch(()=>{});}}Ir().catch(async e=>{console.error(e);try{let r=(await ce().catch(()=>null))?.logDir??"logs",n=new H(r,"deploy.log.jsonl","debug");n.error(`Unhandled error: ${e instanceof Error?e.message:String(e)}`,e instanceof Error?{stack:e.stack}:void 0),await n.flush();}catch{}process.exit(1);});
@@ -1,4 +1,4 @@
1
- import F from'fs/promises';import h from'path';import {workerData,parentPort}from'worker_threads';import'fast-glob';import'os';import'crypto';function E(t){return t.replace(/&quot;/g,'"').replace(/&#34;/g,'"').replace(/&apos;/g,"'").replace(/&#39;/g,"'").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">")}function p(t){return t.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function d(t){return t.replace(/\//g,"\\/")}function $(t){return t.replace(/\//g,"\\\\/")}function A(t){try{let e=new URL(t);if(e.protocol!=="http:"&&e.protocol!=="https:")return null;let s=e.pathname==="/"&&!e.search&&!e.hash?"":`${e.pathname}${e.search}${e.hash}`;return `//${e.host}${s}`}catch{return null}}function P(t,e,s){if(!e)return;t[e]=s;let n=d(e),i=d(s);t[n]=i;let r=$(e),o=$(s);t[r]=o;let c=p(e),a=p(s);t[c]=a;let l=p(n),u=p(i);t[l]=u;let g=p(r),x=p(o);t[g]=x;}function m(t,e,s){P(t,e,s);let n=A(e);n&&n!==e&&P(t,n,s);}function y(t,e){try{return new URL(t,e==="."?"https://relative.invalid":e).pathname}catch{return t.startsWith("/")?t:`/${t.replace(/^\.\//,"")}`}}function S(t,e,s){if(!e)return s;let n=h.dirname(h.resolve(e)),i=h.resolve(t,s.replace(/^\/+/,"")),r=h.relative(n,i).replace(/\\/g,"/");return r?(r.startsWith(".")||(r=`./${r}`),r):"."}var D=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],k=new Set([".html",".htm"]),v="WPSuite.io Static Publisher",O=v.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function H(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function L(t){return t.startsWith("//")||t.startsWith("\\/\\/")||t.startsWith("\\\\/\\\\/")}function U(t,e,s){return L(e)?t.replace(new RegExp(`(?<!:)${H(e)}`,"g"),s):t.split(e).join(s)}function N(t,e,s){if(t.wpsuite?.siteSettings?.subscriber===true||t.wpsuite?.subscriptionType==="PROFESSIONAL"||t.wpsuite?.subscriptionType==="AGENCY"||!s)return false;let i=h.extname(s).toLowerCase();return k.has(i)?/<head\b|<html\b|<!doctype html/i.test(e):false}function I(t){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${O}\\2)[^>]*\\/?>`,"i").test(t))return t;let e=`<meta name="generator" content="${v}" />`;if(t.match(/(\r?\n)([ \t]*)<\/head>/i))return t.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${e}$1$2</head>`);let n=t.includes(`\r
1
+ import h from'fs/promises';import p from'path';import {workerData,parentPort}from'worker_threads';import'fast-glob';import'os';import A from'crypto';async function k(e){await h.mkdir(p.dirname(e),{recursive:true});}async function R(e,t,s){await k(e);let r=p.join(p.dirname(e),`.${p.basename(e)}.${process.pid}.${Date.now()}.${A.randomBytes(6).toString("hex")}.tmp`);try{typeof t=="string"?await h.writeFile(r,t,s??"utf8"):await h.writeFile(r,t),await h.rename(r,e);}catch(i){throw await h.unlink(r).catch(()=>{}),i}}function S(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 g(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function d(e){return e.replace(/\//g,"\\/")}function y(e){return e.replace(/\//g,"\\\\/")}function O(e){try{let t=new URL(e);if(t.protocol!=="http:"&&t.protocol!=="https:")return null;let s=t.pathname==="/"&&!t.search&&!t.hash?"":`${t.pathname}${t.search}${t.hash}`;return `//${t.host}${s}`}catch{return null}}function E(e,t,s){if(!t)return;e[t]=s;let r=d(t),i=d(s);e[r]=i;let n=y(t),o=y(s);e[n]=o;let c=g(t),a=g(s);e[c]=a;let l=g(r),u=g(i);e[l]=u;let f=g(n),b=g(o);e[f]=b;}function w(e,t,s){E(e,t,s);let r=O(t);r&&r!==t&&E(e,r,s);}function v(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function F(e,t,s){if(!t)return s;let r=p.dirname(p.resolve(t)),i=p.resolve(e,s.replace(/^\/+/,"")),n=p.relative(r,i).replace(/\\/g,"/");return n?(n.startsWith(".")||(n=`./${n}`),n):"."}var H=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],L=new Set([".html",".htm"]),M="WPSuite.io Static Publisher",U=M.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function N(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function I(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function q(e,t,s){return I(t)?e.replace(new RegExp(`(?<!:)${N(t)}`,"g"),s):e.split(t).join(s)}function B(e,t,s){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!s)return false;let i=p.extname(s).toLowerCase();return L.has(i)?/<head\b|<html\b|<!doctype html/i.test(t):false}function V(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${U}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${M}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let r=e.includes(`\r
2
2
  `)?`\r
3
3
  `:`
4
- `;return t.replace(/<head\b[^>]*>/i,i=>`${i}${n} ${e}`)}function q(t){let e=E(t).trim();return e.startsWith("{")||e.startsWith("[")||e.includes("\\/")||/"@context"|"@type"/.test(e)}function V(t,e){let s=[...new Set(e)].filter(r=>r.includes("/")&&!/\\+\//.test(r)).map(r=>[r,d(r)]).filter(([r,o])=>r!==o).sort((r,o)=>o[0].length-r[0].length);if(!s.length)return t;let n=r=>{let o=r;for(let[c,a]of s)o=o.split(c).join(a);return o},i=t.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(r,o,c,a)=>`${o}${n(c)}${a}`);return i=i.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(r,o,c,a,l)=>q(a)?`${o}${n(a)}${l}`:r),i}function G(t,e){if(!e)return null;let s=h.dirname(h.resolve(e)),n=h.resolve(t.outputDir),i=h.relative(s,n).replace(/\\/g,"/");return i?(i.startsWith(".")||(i=`./${i}`),i.endsWith("/")?i:`${i}/`):"./"}function J(t,e,s){let n=G(e,s);if(!n)return t;let i=t;for(let r of D){let o=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=new RegExp(`(?:\\.{1,}/)+${o}`,"g"),a=new RegExp(`(?<!\\.)/${o}`,"g");i=i.replace(c,`${n}${r}`).replace(a,`${n}${r}`);let l=r.replace(/\//g,"\\/"),u=n.replace(/\//g,"\\/"),g=l.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),x=new RegExp(`(?:\\.{1,}\\\\/)+${g}`,"g"),T=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${g}`,"g"),j=new RegExp(`(?<![\\.\\\\])\\/${g}`,"g");i=i.replace(x,`${u}${l}`).replace(T,`${u}${l}`).replace(j,`${u}${l}`);}return i}function b(t,e,s){if(t.urlRewriteMode==="absolute")return e;let n=(()=>{try{return new URL(e,t.targetOrigin==="."?"https://relative.invalid":t.targetOrigin)}catch{return null}})(),i=n?n.pathname:y(e,t.targetOrigin),r=n?`${n.search}${n.hash}`:"";return t.urlRewriteMode==="root-relative"?`${i}${r}`:`${S(t.outputDir,s,i)}${r}`}function R(t,e,s,n,i){m(t,s,b(e,n,i));}function B(t,e,s,n,i){if(!s||s===n)return;m(t,s,n);let r=b(e,s,i),o=b(e,n,i);m(t,r,o);}function M(t,e,s,n,i={}){let r=t,o={};R(o,e,e.sourceOrigin,e.targetOrigin,n);for(let[a,l]of Object.entries(e.extraReplacements))R(o,e,a,l,n);for(let[a,l]of Object.entries(s))R(o,e,a,l,n);for(let[a,l]of Object.entries(i)){let u=s[a];!u||u===l||B(o,e,l,u,n);}let c=Object.entries(o).sort((a,l)=>l[0].length-a[0].length);for(let[a,l]of c)r=U(r,a,l);return e.urlRewriteMode!=="absolute"&&(r=J(r,e,n)),r=V(r,c.map(([,a])=>a)),N(e,r,n)&&(r=I(r)),r}var{config:W,assetMap:_,previousAssetMap:K}=workerData;async function Y(t){let e=h.join(W.outputDir,t),s=h.extname(e).toLowerCase(),n;try{n=await F.readFile(e,"utf8");}catch(o){if(o.code==="ENOENT")return false;throw o}let r=M(n,W,_,s===".js"||s===".mjs"?void 0:e,K);return r===n?false:(await F.writeFile(e,r,"utf8"),true)}if(!parentPort)throw new Error("rewrite worker requires a parent port");parentPort.on("message",async t=>{try{let e=await Y(t.file);parentPort?.postMessage({changed:e});}catch(e){parentPort?.postMessage({changed:false,error:e instanceof Error?e.message:String(e)});}});
4
+ `;return e.replace(/<head\b[^>]*>/i,i=>`${i}${r} ${t}`)}function G(e){let t=S(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function J(e,t){let s=[...new Set(t)].filter(n=>n.includes("/")&&!/\\+\//.test(n)).map(n=>[n,d(n)]).filter(([n,o])=>n!==o).sort((n,o)=>o[0].length-n[0].length);if(!s.length)return e;let r=n=>{let o=n;for(let[c,a]of s)o=o.split(c).join(a);return o},i=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(n,o,c,a)=>`${o}${r(c)}${a}`);return i=i.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(n,o,c,a,l)=>G(a)?`${o}${r(a)}${l}`:n),i}function z(e,t){if(!t)return null;let s=p.dirname(p.resolve(t)),r=p.resolve(e.outputDir),i=p.relative(s,r).replace(/\\/g,"/");return i?(i.startsWith(".")||(i=`./${i}`),i.endsWith("/")?i:`${i}/`):"./"}function _(e,t,s){let r=z(t,s);if(!r)return e;let i=e;for(let n of H){let o=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=new RegExp(`(?:\\.{1,}/)+${o}`,"g"),a=new RegExp(`(?<!\\.)/${o}`,"g");i=i.replace(c,`${r}${n}`).replace(a,`${r}${n}`);let l=n.replace(/\//g,"\\/"),u=r.replace(/\//g,"\\/"),f=l.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),b=new RegExp(`(?:\\.{1,}\\\\/)+${f}`,"g"),j=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${f}`,"g"),D=new RegExp(`(?<![\\.\\\\])\\/${f}`,"g");i=i.replace(b,`${u}${l}`).replace(j,`${u}${l}`).replace(D,`${u}${l}`);}return i}function P(e,t,s){if(e.urlRewriteMode==="absolute")return t;let r=(()=>{try{return new URL(t,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin)}catch{return null}})(),i=r?r.pathname:v(t,e.targetOrigin),n=r?`${r.search}${r.hash}`:"";return e.urlRewriteMode==="root-relative"?`${i}${n}`:`${F(e.outputDir,s,i)}${n}`}function $(e,t,s,r,i){w(e,s,P(t,r,i));}function K(e,t,s,r,i){if(!s||s===r)return;w(e,s,r);let n=P(t,s,i),o=P(t,r,i);w(e,n,o);}function C(e,t,s,r,i={}){let n=e,o={};$(o,t,t.sourceOrigin,t.targetOrigin,r);for(let[a,l]of Object.entries(t.extraReplacements))$(o,t,a,l,r);for(let[a,l]of Object.entries(s))$(o,t,a,l,r);for(let[a,l]of Object.entries(i)){let u=s[a];!u||u===l||K(o,t,l,u,r);}let c=Object.entries(o).sort((a,l)=>l[0].length-a[0].length);for(let[a,l]of c)n=q(n,a,l);return t.urlRewriteMode!=="absolute"&&(n=_(n,t,r)),n=J(n,c.map(([,a])=>a)),B(t,n,r)&&(n=V(n)),n}var{config:T,assetMap:X,previousAssetMap:Z}=workerData;async function ee(e){let t=p.join(T.outputDir,e),s=p.extname(t).toLowerCase(),r;try{r=await h.readFile(t,"utf8");}catch(o){if(o.code==="ENOENT")return false;throw o}let n=C(r,T,X,s===".js"||s===".mjs"?void 0:t,Z);return n===r?false:(await R(t,n,"utf8"),true)}if(!parentPort)throw new Error("rewrite worker requires a parent port");parentPort.on("message",async e=>{try{let t=await ee(e.file);parentPort?.postMessage({changed:t});}catch(t){parentPort?.postMessage({changed:false,error:t instanceof Error?t.message:String(t)});}});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smart-cloud/publisher-exporter",
3
- "version": "1.1.30",
3
+ "version": "1.1.32",
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.",